Skip to content

Commit 27e0a5d

Browse files
authored
Add -no-extra-aliases flag (#6)
Add new flag -no-extra-aliases which if set will trigger an error if an alias is not defined within the alias config.
1 parent 841f0c0 commit 27e0a5d

File tree

7 files changed

+73
-9
lines changed

7 files changed

+73
-9
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,18 @@ importas -no-unaliased \
3131
./...
3232
~~~~
3333

34+
### `-no-extra-aliases` option
35+
36+
By default, importas allows aliases which are not specified by `-alias` flags.
37+
With `-no-extra-aliases` option, importas does not allow any unspecified aliases.
38+
39+
~~~~
40+
importas -no-extra-aliases \
41+
-alias knative.dev/serving/pkg/apis/autoscaling/v1alpha1:autoscalingv1alpha1 \
42+
-alias knative.dev/serving/pkg/apis/serving/v1:servingv1 \
43+
./...
44+
~~~~
45+
3446
### Use regular expression
3547

3648
You can specify the package path by regular expression, and alias by regular expression replacement syntax like following snippet.

analyzer.go

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,42 @@ func visitImportSpecNode(config *Config, node *ast.ImportSpec, pass *analysis.Pa
8181
TextEdits: findEdits(node, pass.TypesInfo.Uses, path, alias, required),
8282
}},
8383
})
84+
} else if !exists && config.DisallowExtraAliases {
85+
pass.Report(analysis.Diagnostic{
86+
Pos: node.Pos(),
87+
End: node.End(),
88+
Message: fmt.Sprintf("import %q has alias %q which is not part of config", path, alias),
89+
SuggestedFixes: []analysis.SuggestedFix{{
90+
Message: "remove alias",
91+
TextEdits: findEdits(node, pass.TypesInfo.Uses, path, alias, ""),
92+
}},
93+
})
8494
}
8595
}
8696

8797
func findEdits(node ast.Node, uses map[*ast.Ident]types.Object, importPath, original, required string) []analysis.TextEdit {
8898
// Edit the actual import line.
99+
importLine := strconv.Quote(importPath)
100+
if required != "" {
101+
importLine = required + " " + importLine
102+
}
89103
result := []analysis.TextEdit{{
90104
Pos: node.Pos(),
91105
End: node.End(),
92-
NewText: []byte(required + " " + strconv.Quote(importPath)),
106+
NewText: []byte(importLine),
93107
}}
94108

109+
packageReplacement := required
110+
if required == "" {
111+
packageParts := strings.Split(importPath, "/")
112+
if len(packageParts) != 0 {
113+
packageReplacement = packageParts[len(packageParts)-1]
114+
} else {
115+
// fall back to original
116+
packageReplacement = original
117+
}
118+
}
119+
95120
// Edit all the uses of the alias in the code.
96121
for use, pkg := range uses {
97122
pkgName, ok := pkg.(*types.PkgName)
@@ -108,7 +133,7 @@ func findEdits(node ast.Node, uses map[*ast.Ident]types.Object, importPath, orig
108133
result = append(result, analysis.TextEdit{
109134
Pos: use.Pos(),
110135
End: use.End(),
111-
NewText: []byte(required),
136+
NewText: []byte(packageReplacement),
112137
})
113138
}
114139

analyzer_test.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ func TestAnalyzer(t *testing.T) {
1717
testdata := analysistest.TestData()
1818

1919
testCases := []struct {
20-
desc string
21-
pkg string
22-
aliases stringMap
23-
disallowUnaliased bool
20+
desc string
21+
pkg string
22+
aliases stringMap
23+
disallowUnaliased bool
24+
disallowExtraAliases bool
2425
}{
2526
{
2627
desc: "Invalid imports",
@@ -64,6 +65,11 @@ func TestAnalyzer(t *testing.T) {
6465
},
6566
disallowUnaliased: true,
6667
},
68+
{
69+
desc: "disallow extra alias mode",
70+
pkg: "f",
71+
disallowExtraAliases: true,
72+
},
6773
}
6874

6975
for _, test := range testCases {
@@ -111,6 +117,11 @@ func TestAnalyzer(t *testing.T) {
111117
t.Fatal(err)
112118
}
113119

120+
noExtraAlisesFlg := a.Flags.Lookup("no-extra-aliases")
121+
if err := noExtraAlisesFlg.Value.Set(strconv.FormatBool(test.disallowExtraAliases)); err != nil {
122+
t.Fatal(err)
123+
}
124+
114125
analysistest.RunWithSuggestedFixes(t, testdata, a, test.pkg)
115126
})
116127
}

config.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ import (
77
)
88

99
type Config struct {
10-
RequiredAlias map[string]string
11-
Rules []*Rule
12-
DisallowUnaliased bool
10+
RequiredAlias map[string]string
11+
Rules []*Rule
12+
DisallowUnaliased bool
13+
DisallowExtraAliases bool
1314
}
1415

1516
func (c *Config) CompileRegexp() error {

flags.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ func flags(config *Config) flag.FlagSet {
1111
fs := flag.FlagSet{}
1212
fs.Var(stringMap(config.RequiredAlias), "alias", "required import alias in form path:alias")
1313
fs.BoolVar(&config.DisallowUnaliased, "no-unaliased", false, "do not allow unaliased imports of aliased packages")
14+
fs.BoolVar(&config.DisallowExtraAliases, "no-extra-aliases", false, "do not allow non-required aliases")
1415
return fs
1516
}
1617

testdata/src/f/f.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package main
2+
3+
import no_alias_in_config "fmt" // want `import "fmt" has alias "no_alias_in_config" which is not part of config`
4+
5+
func main() {
6+
no_alias_in_config.Println("test")
7+
}

testdata/src/f/f.go.golden

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package main
2+
3+
import "fmt" // want `import "fmt" has alias "no_alias_in_config" which is not part of config`
4+
5+
func main() {
6+
fmt.Println("test")
7+
}

0 commit comments

Comments
 (0)