Skip to content

Commit

Permalink
fix: fix duplicate imports in sniper mode (#3388)
Browse files Browse the repository at this point in the history
  • Loading branch information
monperrus authored Jun 3, 2020
1 parent f0ba5ae commit e980d36
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@
import spoon.reflect.reference.CtWildcardReference;
import spoon.reflect.visitor.PrintingContext.Writable;
import spoon.reflect.visitor.printer.CommentOffset;
import spoon.support.util.ModelList;

import java.lang.annotation.Annotation;
import java.util.ArrayList;
Expand Down Expand Up @@ -1083,7 +1084,7 @@ public void visitCtCompilationUnit(CtCompilationUnit compilationUnit) {
break;
case TYPE_DECLARATION:
scan(compilationUnit.getPackageDeclaration());
for (CtImport imprt : compilationUnit.getImports()) {
for (CtImport imprt : getImports(compilationUnit)) {
scan(imprt);
printer.writeln();
}
Expand All @@ -1100,6 +1101,10 @@ public void visitCtCompilationUnit(CtCompilationUnit compilationUnit) {
}
}

protected ModelList<CtImport> getImports(CtCompilationUnit compilationUnit) {
return compilationUnit.getImports();
}

@Override
public void visitCtPackageDeclaration(CtPackageDeclaration packageDeclaration) {
CtPackageReference ctPackage = packageDeclaration.getReference();
Expand Down Expand Up @@ -1615,7 +1620,7 @@ public void visitCtPackage(CtPackage ctPackage) {
if (!ctPackage.isUnnamedPackage()) {
elementPrinterHelper.writePackageLine(ctPackage.getQualifiedName());
}
elementPrinterHelper.writeImports(ctPackage.getPosition().getCompilationUnit().getImports());
elementPrinterHelper.writeImports(getImports(ctPackage.getPosition().getCompilationUnit()));
}

@Override
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/spoon/support/sniper/SniperJavaPrettyPrinter.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,14 @@
import spoon.reflect.cu.position.NoSourcePosition;
import spoon.reflect.declaration.CtCompilationUnit;
import spoon.reflect.declaration.CtElement;
import spoon.reflect.declaration.CtImport;
import spoon.reflect.declaration.CtType;
import spoon.reflect.path.CtRole;
import spoon.reflect.visitor.DefaultJavaPrettyPrinter;
import spoon.reflect.visitor.PrettyPrinter;
import spoon.reflect.visitor.TokenWriter;
import spoon.support.Experimental;
import spoon.support.comparator.CtLineElementComparator;
import spoon.support.modelobs.ChangeCollector;
import spoon.support.sniper.internal.ChangeResolver;
import spoon.support.sniper.internal.CollectionSourceFragment;
Expand All @@ -42,6 +44,7 @@
import spoon.support.sniper.internal.TokenPrinterEvent;
import spoon.support.sniper.internal.TokenType;
import spoon.support.sniper.internal.TokenWriterProxy;
import spoon.support.util.ModelList;

/**
* {@link PrettyPrinter} implementation, which copies as much as possible from the origin sources
Expand Down Expand Up @@ -442,4 +445,14 @@ private SourceFragmentPrinter popSourceFragmentContext() {
c.onFinished();
return c;
}

// fix #3267
// in sniper mode, we must visit the order in the same order
// as the source code
protected ModelList<CtImport> getImports(CtCompilationUnit compilationUnit) {
ModelList<CtImport> imports = super.getImports(compilationUnit);
imports.sort(new CtLineElementComparator());
return imports;
}

}

0 comments on commit e980d36

Please sign in to comment.