diff options
Diffstat (limited to 'pkgtools/pkglint/files/vargroups.go')
-rw-r--r-- | pkgtools/pkglint/files/vargroups.go | 175 |
1 files changed, 86 insertions, 89 deletions
diff --git a/pkgtools/pkglint/files/vargroups.go b/pkgtools/pkglint/files/vargroups.go index d385df6764f..b28479d395c 100644 --- a/pkgtools/pkglint/files/vargroups.go +++ b/pkgtools/pkglint/files/vargroups.go @@ -15,7 +15,7 @@ import ( // See mk/misc/show.mk, keyword _VARGROUPS. type VargroupsChecker struct { mklines *MkLines - skip bool + group string registered map[string]*MkLine userVars map[string]*MkLine @@ -27,21 +27,25 @@ type VargroupsChecker struct { sortedVars map[string]*MkLine listedVars map[string]*MkLine + userPrivate string + pkgPrivate string + sysPrivate string + defPrivate string + usePrivate string + undefinedVars map[string]*MkLine unusedVars map[string]*MkLine } func NewVargroupsChecker(mklines *MkLines) *VargroupsChecker { ck := VargroupsChecker{mklines: mklines} - ck.init() + ck.group = trimHspace(mklines.allVars.LastValue("_VARGROUPS")) + ck.collect() return &ck } -func (ck *VargroupsChecker) init() { - mklines := ck.mklines - scope := mklines.allVars - if !scope.IsDefined("_VARGROUPS") { - ck.skip = true +func (ck *VargroupsChecker) collect() { + if ck.group == "" { return } @@ -54,94 +58,87 @@ func (ck *VargroupsChecker) init() { ck.ignVars = make(map[string]*MkLine) ck.sortedVars = make(map[string]*MkLine) ck.listedVars = make(map[string]*MkLine) - userPrivate := "" - pkgPrivate := "" - sysPrivate := "" - defPrivate := "" - usePrivate := "" - - group := "" - - checkGroupName := func(mkline *MkLine) { - varname := mkline.Varname() - if varnameParam(varname) != group { - mkline.Warnf("Expected %s.%s, but found %q.", - varnameBase(varname), group, varnameParam(varname)) + + ck.mklines.ForEach(func(mkline *MkLine) { + if mkline.IsVarassign() { + ck.collectVarassign(mkline) } + }) + + ck.undefinedVars = copyStringMkLine(ck.defVars) + ck.unusedVars = copyStringMkLine(ck.useVars) +} + +func (ck *VargroupsChecker) collectVarassign(mkline *MkLine) { + switch varnameCanon(mkline.Varname()) { + case "_USER_VARS.*": + ck.appendTo(ck.userVars, mkline, true, &ck.userPrivate) + case "_PKG_VARS.*": + ck.appendTo(ck.pkgVars, mkline, true, &ck.pkgPrivate) + case "_SYS_VARS.*": + ck.appendTo(ck.sysVars, mkline, true, &ck.sysPrivate) + case "_DEF_VARS.*": + ck.appendTo(ck.defVars, mkline, false, &ck.defPrivate) + case "_USE_VARS.*": + ck.appendTo(ck.useVars, mkline, false, &ck.usePrivate) + case "_IGN_VARS.*": + ck.appendTo(ck.ignVars, mkline, false, nil) + case "_SORTED_VARS.*": + ck.appendToStyle(ck.sortedVars, mkline) + case "_LISTED_VARS.*": + ck.appendToStyle(ck.listedVars, mkline) } +} - appendTo := func(vars map[string]*MkLine, mkline *MkLine, publicGroup bool, firstPrivate *string) { - checkGroupName(mkline) - - for _, varname := range mkline.ValueFields(mkline.Value()) { - if containsVarRef(varname) { - continue - } - - private := hasPrefix(varname, "_") - if publicGroup && private { - mkline.Warnf("%s should list only variables that start with a letter, not %q.", - mkline.Varname(), varname) - } - - if firstPrivate != nil { - if *firstPrivate != "" && !private { - mkline.Warnf("The public variable %s should be listed before the private variable %s.", - varname, *firstPrivate) - } - if private && *firstPrivate == "" { - *firstPrivate = varname - } - } - - if ck.registered[varname] != nil { - mkline.Warnf("Duplicate variable name %s, already appeared in %s.", - varname, mkline.RelMkLine(ck.registered[varname])) - } else { - ck.registered[varname] = mkline - } - - vars[varname] = mkline - } +func (ck *VargroupsChecker) appendToStyle(vars map[string]*MkLine, mkline *MkLine) { + ck.checkGroupName(mkline) + + for _, varname := range mkline.ValueFieldsLiteral() { + vars[varname] = mkline } +} - appendToStyle := func(vars map[string]*MkLine, mkline *MkLine) { - checkGroupName(mkline) +func (ck *VargroupsChecker) appendTo(vars map[string]*MkLine, mkline *MkLine, publicGroup bool, firstPrivate *string) { + ck.checkGroupName(mkline) - for _, varname := range mkline.ValueFields(mkline.Value()) { - if !containsVarRef(varname) { - vars[varname] = mkline - } - } + for _, varname := range mkline.ValueFieldsLiteral() { + ck.appendToVar(varname, mkline, publicGroup, vars, firstPrivate) } +} - mklines.ForEach(func(mkline *MkLine) { - if mkline.IsVarassign() { - switch varnameCanon(mkline.Varname()) { - case "_VARGROUPS": - group = mkline.Value() - case "_USER_VARS.*": - appendTo(ck.userVars, mkline, true, &userPrivate) - case "_PKG_VARS.*": - appendTo(ck.pkgVars, mkline, true, &pkgPrivate) - case "_SYS_VARS.*": - appendTo(ck.sysVars, mkline, true, &sysPrivate) - case "_DEF_VARS.*": - appendTo(ck.defVars, mkline, false, &defPrivate) - case "_USE_VARS.*": - appendTo(ck.useVars, mkline, false, &usePrivate) - case "_IGN_VARS.*": - appendTo(ck.ignVars, mkline, false, nil) - case "_SORTED_VARS.*": - appendToStyle(ck.sortedVars, mkline) - case "_LISTED_VARS.*": - appendToStyle(ck.listedVars, mkline) - } +func (ck *VargroupsChecker) appendToVar(varname string, mkline *MkLine, publicGroup bool, vars map[string]*MkLine, firstPrivate *string) { + private := hasPrefix(varname, "_") + if publicGroup && private { + mkline.Warnf("%s should list only variables that start with a letter, not %q.", + mkline.Varname(), varname) + } + + if firstPrivate != nil { + if *firstPrivate != "" && !private { + mkline.Warnf("The public variable %s should be listed before the private variable %s.", + varname, *firstPrivate) } - }) + if private && *firstPrivate == "" { + *firstPrivate = varname + } + } - ck.undefinedVars = copyStringMkLine(ck.defVars) - ck.unusedVars = copyStringMkLine(ck.useVars) + if ck.registered[varname] != nil { + mkline.Warnf("Duplicate variable name %s, already appeared in %s.", + varname, mkline.RelMkLine(ck.registered[varname])) + } else { + ck.registered[varname] = mkline + } + + vars[varname] = mkline +} + +func (ck *VargroupsChecker) checkGroupName(mkline *MkLine) { + varname := mkline.Varname() + if varnameParam(varname) != ck.group { + mkline.Warnf("Expected %s.%s, but found %q.", + varnameBase(varname), ck.group, varnameParam(varname)) + } } // CheckVargroups checks that each variable that is used or defined @@ -151,7 +148,7 @@ func (ck *VargroupsChecker) init() { // This check is intended mainly for infrastructure files and similar // support files, such as lang/*/module.mk. func (ck *VargroupsChecker) Check(mkline *MkLine) { - if ck.skip { + if ck.group == "" { return } @@ -194,7 +191,7 @@ func (ck *VargroupsChecker) checkUseVar(mkline *MkLine, varUse *MkVarUse) { func (ck *VargroupsChecker) ignore(varname string) bool { switch { - case containsVarRef(varname), + case containsVarUse(varname), hasSuffix(varname, "_MK"), ck.registered[varname] != nil, G.Pkgsrc.Tools.ExistsVar(varname), @@ -244,8 +241,8 @@ func (ck *VargroupsChecker) isVargroups(varname string) bool { return false } -func (ck *VargroupsChecker) Finish(mkline *MkLine) { - if ck.skip { +func (ck *VargroupsChecker) Finish() { + if ck.group == "" { return } |