summaryrefslogtreecommitdiff
path: root/pkgtools/pkglint/files/mkline.go
diff options
context:
space:
mode:
authorrillig <rillig@pkgsrc.org>2016-01-31 17:18:54 +0000
committerrillig <rillig@pkgsrc.org>2016-01-31 17:18:54 +0000
commit1a4a9a096ed8227b9019fd8484d76a90e297bc36 (patch)
tree2cea5cda3a43d1e9538d94a1ad05b89d113cb290 /pkgtools/pkglint/files/mkline.go
parent72f7889e530a4709b7bac8c88dcf635ff9f781a0 (diff)
downloadpkgsrc-1a4a9a096ed8227b9019fd8484d76a90e297bc36.tar.gz
Updated pkglint to 5.3.5
Changes since 5.3.4: * Added parser for Makefile conditionals * Variables that are matched using the :M modifier are checked whether the matched value is sensible * Reworded and explained warning for variable ordering in packages * Fixed bug in Tree.String * Fixed a few variable types
Diffstat (limited to 'pkgtools/pkglint/files/mkline.go')
-rw-r--r--pkgtools/pkglint/files/mkline.go72
1 files changed, 23 insertions, 49 deletions
diff --git a/pkgtools/pkglint/files/mkline.go b/pkgtools/pkglint/files/mkline.go
index 599fbb0d539..aa51d9d4fe2 100644
--- a/pkgtools/pkglint/files/mkline.go
+++ b/pkgtools/pkglint/files/mkline.go
@@ -811,32 +811,37 @@ func (mkline *MkLine) CheckText(text string) {
}
}
-func (mkline *MkLine) CheckIf() {
+func (mkline *MkLine) CheckCond() {
if G.opts.DebugTrace {
defer tracecall0()()
}
- tree := mkline.parseMkCond(mkline.Args())
+ p := NewParser(mkline.Args())
+ cond := p.MkCond()
+ if !p.EOF() {
+ mkline.Warn1("Invalid conditional %q.", mkline.Args())
+ return
+ }
- {
- var pvarname, ppattern *string
- if tree.Match(NewTree("not", NewTree("empty", NewTree("match", &pvarname, &ppattern)))) {
- vartype := mkline.getVariableType(*pvarname)
- if vartype != nil && vartype.checker.IsEnum() {
- if !matches(*ppattern, `[\$\[*]`) && !vartype.checker.HasEnum(*ppattern) {
- mkline.Warn2("Invalid :M value %q. Only { %s } are allowed.", *ppattern, vartype.checker.AllowedEnums())
- }
+ cond.Visit("empty", func(node *Tree) {
+ varuse := node.args[0].(MkVarUse)
+ varname := varuse.varname
+ for _, modifier := range varuse.modifiers {
+ if modifier[0] == 'M' || modifier[0] == 'N' {
+ mkline.CheckVartype(varname, opUseMatch, modifier[1:], "")
}
- return
}
- }
-
- {
- var pop, pvarname, pvalue *string
- if tree.Match(NewTree("compareVarStr", &pvarname, &pop, &pvalue)) {
- mkline.CheckVartype(*pvarname, opUse, *pvalue, "")
+ })
+
+ cond.Visit("compareVarStr", func(node *Tree) {
+ varuse := node.args[0].(MkVarUse)
+ varname := varuse.varname
+ varmods := varuse.modifiers
+ value := node.args[2].(string)
+ if len(varmods) == 0 || len(varmods) == 1 && matches(varmods[0], `^[MN]`) && value != "" {
+ mkline.CheckVartype(varname, opUseMatch, value, "")
}
- }
+ })
}
func (mkline *MkLine) CheckValidCharactersInValue(reValid string) {
@@ -950,37 +955,6 @@ func matchMkCond(text string) (m bool, indent, directive, args string) {
return
}
-func (mkline *MkLine) parseMkCond(cond string) *Tree {
- if G.opts.DebugTrace {
- defer tracecall1(cond)()
- }
-
- const (
- repartVarname = `[A-Z_][A-Z0-9_]*(?:\.[\w_+\-]+)?`
- reDefined = `^defined\((` + repartVarname + `)\)`
- reEmpty = `^empty\((` + repartVarname + `)\)`
- reEmptyMatch = `^empty\((` + repartVarname + `):M([^\$:{})]+)\)`
- reCompare = `^\$\{(` + repartVarname + `)\}\s+(==|!=)\s+"([^"\$\\]*)"`
- )
-
- if m, rest := replaceFirst(cond, `^!`, ""); m != nil {
- return NewTree("not", mkline.parseMkCond(rest))
- }
- if m, rest := replaceFirst(cond, reDefined, ""); m != nil {
- return NewTree("defined", mkline.parseMkCond(rest))
- }
- if m, _ := replaceFirst(cond, reEmpty, ""); m != nil {
- return NewTree("empty", m[1])
- }
- if m, _ := replaceFirst(cond, reEmptyMatch, ""); m != nil {
- return NewTree("empty", NewTree("match", m[1], m[2]))
- }
- if m, _ := replaceFirst(cond, reCompare, ""); m != nil {
- return NewTree("compareVarStr", m[1], m[2], m[3])
- }
- return NewTree("unknown", cond)
-}
-
type NeedsQuoting uint8
const (