diff --git a/src/main/java/spoon/reflect/cu/position/NoSourcePosition.java b/src/main/java/spoon/reflect/cu/position/NoSourcePosition.java index 9cd4a6e3efc..60226d65692 100644 --- a/src/main/java/spoon/reflect/cu/position/NoSourcePosition.java +++ b/src/main/java/spoon/reflect/cu/position/NoSourcePosition.java @@ -7,6 +7,7 @@ import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.SourcePosition; +import spoon.support.reflect.cu.CompilationUnitImpl; import java.io.File; import java.io.Serializable; @@ -23,9 +24,15 @@ public File getFile() { return null; } + // avoid null pointer exceptions later + public static class NullCompilationUnit extends CompilationUnitImpl { + private NullCompilationUnit() { } + } + private static final CompilationUnit instanceNullCompilationUnit = new NullCompilationUnit(); + @Override public CompilationUnit getCompilationUnit() { - return null; + return instanceNullCompilationUnit; } @Override diff --git a/src/main/java/spoon/reflect/factory/CompilationUnitFactory.java b/src/main/java/spoon/reflect/factory/CompilationUnitFactory.java index 5f03c490897..0e3c83e073f 100644 --- a/src/main/java/spoon/reflect/factory/CompilationUnitFactory.java +++ b/src/main/java/spoon/reflect/factory/CompilationUnitFactory.java @@ -7,6 +7,7 @@ import spoon.SpoonException; import spoon.reflect.cu.CompilationUnit; +import spoon.reflect.cu.position.NoSourcePosition; import spoon.reflect.declaration.CtModule; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtType; @@ -49,7 +50,7 @@ public CompilationUnit create() { } public CompilationUnit getOrCreate(CtPackage ctPackage) { - if (ctPackage.getPosition().getCompilationUnit() != null) { + if (!(ctPackage.getPosition().getCompilationUnit() instanceof NoSourcePosition.NullCompilationUnit)) { return ctPackage.getPosition().getCompilationUnit(); } else { @@ -76,7 +77,7 @@ public CompilationUnit getOrCreate(CtType type) { if (type == null) { return null; } - if (type.getPosition().getCompilationUnit() != null) { + if (!(type.getPosition().getCompilationUnit() instanceof NoSourcePosition.NullCompilationUnit)) { return type.getPosition().getCompilationUnit(); } @@ -103,7 +104,7 @@ public CompilationUnit getOrCreate(CtType type) { } public CompilationUnit getOrCreate(CtModule module) { - if (module.getPosition().getCompilationUnit() != null) { + if (!(module.getPosition().getCompilationUnit() instanceof NoSourcePosition.NullCompilationUnit)) { return module.getPosition().getCompilationUnit(); } else { File file = this.factory.getEnvironment().getOutputDestinationHandler().getOutputPath(module, null, null).toFile(); diff --git a/src/main/java/spoon/support/modelobs/SourceFragmentCreator.java b/src/main/java/spoon/support/modelobs/SourceFragmentCreator.java index 2c9bbcfb872..4b0145e0719 100644 --- a/src/main/java/spoon/support/modelobs/SourceFragmentCreator.java +++ b/src/main/java/spoon/support/modelobs/SourceFragmentCreator.java @@ -6,6 +6,7 @@ package spoon.support.modelobs; import spoon.reflect.cu.CompilationUnit; +import spoon.reflect.cu.position.NoSourcePosition; import spoon.reflect.declaration.CtElement; import spoon.reflect.path.CtRole; import spoon.support.sniper.internal.ElementSourceFragment; @@ -23,7 +24,7 @@ protected void onChange(CtElement currentElement, CtRole role) { return; } CompilationUnit cu = currentElement.getPosition().getCompilationUnit(); - if (cu != null) { + if (!(cu instanceof NoSourcePosition.NullCompilationUnit)) { //getOriginalSourceFragment is not only a getter, it actually //builds a tree of SourceFragments of compilation unit of the modified element cu.getOriginalSourceFragment(); diff --git a/src/main/java/spoon/support/sniper/internal/ElementSourceFragment.java b/src/main/java/spoon/support/sniper/internal/ElementSourceFragment.java index 5e650c61ea8..4f65e08acbb 100644 --- a/src/main/java/spoon/support/sniper/internal/ElementSourceFragment.java +++ b/src/main/java/spoon/support/sniper/internal/ElementSourceFragment.java @@ -11,6 +11,7 @@ import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.SourcePosition; import spoon.reflect.cu.SourcePositionHolder; +import spoon.reflect.cu.position.NoSourcePosition; import spoon.reflect.declaration.CtCompilationUnit; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtModifiable; @@ -176,7 +177,7 @@ protected void exit(CtElement e) { */ private ElementSourceFragment addChild(ElementSourceFragment parentFragment, CtRole roleInParent, SourcePositionHolder otherElement) { SourcePosition otherSourcePosition = otherElement.getPosition(); - if (otherSourcePosition instanceof SourcePositionImpl && otherSourcePosition.getCompilationUnit() != null) { + if (otherSourcePosition instanceof SourcePositionImpl && !(otherSourcePosition.getCompilationUnit() instanceof NoSourcePosition.NullCompilationUnit)) { if (parentFragment.isFromSameSource(otherSourcePosition)) { ElementSourceFragment otherFragment = new ElementSourceFragment(otherElement, parentFragment.getRoleHandler(roleInParent, otherElement)); //parent and child are from the same file. So we can connect their positions into one tree