summaryrefslogtreecommitdiff
path: root/pkgtools/pkglint/files/vargroups.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkgtools/pkglint/files/vargroups.go')
-rw-r--r--pkgtools/pkglint/files/vargroups.go175
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
}