diff options
author | rillig <rillig@pkgsrc.org> | 2016-01-31 17:18:54 +0000 |
---|---|---|
committer | rillig <rillig@pkgsrc.org> | 2016-01-31 17:18:54 +0000 |
commit | 1a4a9a096ed8227b9019fd8484d76a90e297bc36 (patch) | |
tree | 2cea5cda3a43d1e9538d94a1ad05b89d113cb290 /pkgtools/pkglint/files/mkline.go | |
parent | 72f7889e530a4709b7bac8c88dcf635ff9f781a0 (diff) | |
download | pkgsrc-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.go | 72 |
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 ( |