@@ -23,6 +23,7 @@ public class SearchImportsVisitor extends AbstractJavaSyntaxVisitor {
2323 protected String internalPackagePrefix ;
2424 protected ImportsFragment importsFragment = JavaFragmentFactory .newImportsFragment ();
2525 protected int maxLineNumber = 0 ;
26+ protected HashSet <String > mainTypeNames = new HashSet <>();
2627 protected HashSet <String > internalTypeNames = new HashSet <>();
2728
2829 public SearchImportsVisitor (String mainInternalName ) {
@@ -44,12 +45,27 @@ public void visit(AnnotationElementValue reference) {
4445
4546 @ Override
4647 public void visit (BodyDeclaration declaration ) {
48+ if (mainTypeNames .isEmpty ()) {
49+ mainTypeNames .add (getTypeName (declaration .getInternalTypeName ()));
50+ declaration .accept (new MainTypeVisitor (mainTypeNames ));
51+ }
4752 if (!internalTypeNames .contains (declaration .getInternalTypeName ())) {
48- internalTypeNames .add (declaration .getInternalTypeName ());
4953 safeAccept (declaration .getMemberDeclarations ());
5054 }
5155 }
5256
57+ protected static String getTypeName (String internalTypeName ) {
58+ int index = internalTypeName .lastIndexOf ('$' );
59+ if (index != -1 ) {
60+ return internalTypeName .substring (index + 1 );
61+ }
62+ index = internalTypeName .lastIndexOf ('/' );
63+ if (index != -1 ) {
64+ return internalTypeName .substring (index + 1 );
65+ }
66+ return internalTypeName ;
67+ }
68+
5369 public ImportsFragment getImportsFragment () {
5470 importsFragment .initLineCounts ();
5571 return importsFragment ;
@@ -67,8 +83,9 @@ public void visit(ObjectType type) {
6783
6884 @ Override
6985 public void visit (ArrayExpression expression ) {
70- if (maxLineNumber < expression .getLineNumber ())
86+ if (maxLineNumber < expression .getLineNumber ()) {
7187 maxLineNumber = expression .getLineNumber ();
88+ }
7289 expression .getExpression ().accept (this );
7390 expression .getIndex ().accept (this );
7491 }
@@ -288,9 +305,45 @@ protected void add(ObjectType type) {
288305 if (internalName .indexOf ('/' , internalPackagePrefix .length ()) != -1 ) {
289306 importsFragment .addImport (internalName , qualifiedName );
290307 }
291- } else {
308+ } else if (! mainTypeNames . contains ( getTypeName ( internalName ))) {
292309 importsFragment .addImport (internalName , qualifiedName );
293310 }
294311 }
295312 }
313+
314+ protected static class MainTypeVisitor extends AbstractJavaSyntaxVisitor {
315+ HashSet <String > mainTypeNames ;
316+
317+ public MainTypeVisitor (HashSet <String > mainTypeNames ) {
318+ this .mainTypeNames = mainTypeNames ;
319+ }
320+
321+ @ Override
322+ public void visit (AnnotationDeclaration declaration ) {
323+ mainTypeNames .add (getTypeName (declaration .getInternalTypeName ()));
324+ safeAccept (declaration .getBodyDeclaration ());
325+ }
326+
327+ @ Override
328+ public void visit (ClassDeclaration declaration ) {
329+ mainTypeNames .add (getTypeName (declaration .getInternalTypeName ()));
330+ safeAccept (declaration .getBodyDeclaration ());
331+ }
332+
333+ @ Override
334+ public void visit (EnumDeclaration declaration ) {
335+ mainTypeNames .add (getTypeName (declaration .getInternalTypeName ()));
336+ safeAccept (declaration .getBodyDeclaration ());
337+ }
338+
339+ @ Override
340+ public void visit (InterfaceDeclaration declaration ) {
341+ mainTypeNames .add (getTypeName (declaration .getInternalTypeName ()));
342+ safeAccept (declaration .getBodyDeclaration ());
343+ }
344+
345+ @ Override public void visit (FieldDeclaration declaration ) {}
346+ @ Override public void visit (ConstructorDeclaration declaration ) {}
347+ @ Override public void visit (MethodDeclaration declaration ) {}
348+ }
296349}
0 commit comments