1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package com.puppycrawl.tools.checkstyle.checks.imports;
21
22 import java.util.HashSet;
23 import java.util.Set;
24
25 import com.puppycrawl.tools.checkstyle.FileStatefulCheck;
26 import com.puppycrawl.tools.checkstyle.api.AbstractCheck;
27 import com.puppycrawl.tools.checkstyle.api.DetailAST;
28 import com.puppycrawl.tools.checkstyle.api.FullIdent;
29 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 @FileStatefulCheck
48 public class RedundantImportCheck
49 extends AbstractCheck {
50
51
52
53
54
55 public static final String MSG_LANG = "import.lang";
56
57
58
59
60
61 public static final String MSG_SAME = "import.same";
62
63
64
65
66
67 public static final String MSG_DUPLICATE = "import.duplicate";
68
69
70 private final Set<FullIdent> imports = new HashSet<>();
71
72 private final Set<FullIdent> staticImports = new HashSet<>();
73
74
75 private String pkgName;
76
77 @Override
78 public void beginTree(DetailAST aRootAST) {
79 pkgName = null;
80 imports.clear();
81 staticImports.clear();
82 }
83
84 @Override
85 public int[] getDefaultTokens() {
86 return getRequiredTokens();
87 }
88
89 @Override
90 public int[] getAcceptableTokens() {
91 return getRequiredTokens();
92 }
93
94 @Override
95 public int[] getRequiredTokens() {
96 return new int[] {
97 TokenTypes.IMPORT, TokenTypes.STATIC_IMPORT, TokenTypes.PACKAGE_DEF,
98 };
99 }
100
101 @Override
102 public void visitToken(DetailAST ast) {
103 if (ast.getType() == TokenTypes.PACKAGE_DEF) {
104 pkgName = FullIdent.createFullIdent(
105 ast.getLastChild().getPreviousSibling()).getText();
106 }
107 else if (ast.getType() == TokenTypes.IMPORT) {
108 final FullIdent imp = FullIdent.createFullIdentBelow(ast);
109 final String importText = imp.getText();
110 if (isFromPackage(importText, "java.lang")) {
111 log(ast, MSG_LANG, importText);
112 }
113
114
115 else if (pkgName != null && isFromPackage(importText, pkgName)) {
116 log(ast, MSG_SAME, importText);
117 }
118
119 imports.stream().filter(full -> importText.equals(full.getText()))
120 .forEach(full -> log(ast, MSG_DUPLICATE, full.getLineNo(), importText));
121
122 imports.add(imp);
123 }
124 else {
125
126 final FullIdent imp =
127 FullIdent.createFullIdent(
128 ast.getLastChild().getPreviousSibling());
129 staticImports.stream().filter(full -> imp.getText().equals(full.getText()))
130 .forEach(full -> log(ast, MSG_DUPLICATE, full.getLineNo(), imp.getText()));
131
132 staticImports.add(imp);
133 }
134 }
135
136
137
138
139
140
141
142
143 private static boolean isFromPackage(String importName, String pkg) {
144
145
146
147 final int index = importName.lastIndexOf('.');
148 final String front = importName.substring(0, index);
149 return pkg.equals(front);
150 }
151
152 }