gumtree-spoon-ast-diff
gumtree-spoon-ast-diff copied to clipboard
[bug] error occurred when invoking the method getOriginalSourceFragment() of class CtClassImpl
I made a simple program to demonstrate the error as the follows.
import java.io.File;
import gumtree.spoon.AstComparator;
import spoon.reflect.declaration.CtType;
import spoon.support.sniper.internal.ElementSourceFragment;
public class TestClass {
public static void main(String[] args) throws Exception {
File file = new File("H:\\temp\\StrBuilder.java");
AstComparator comparator = new AstComparator();
CtType<?> ctBug = comparator.getCtType(file);
ElementSourceFragment orgCodeFrag = ctBug.getOriginalSourceFragment(); //error occurred
System.out.println(orgCodeFrag.getSourceCode());
}
}
The content of the input file (i.e., file StrBuilder.java) is as follows:
package org.apache.commons.lang.text;
import java.util.List;
public class StrBuilder implements Cloneable {
class StrBuilderTokenizer extends StrTokenizer {
protected List tokenize(char[] chars, int offset, int count) {
if (chars == null) {
return super.tokenize(StrBuilder.this.buffer, 0, StrBuilder.this.size());
} else {
return super.tokenize(chars, offset, count);
}
}
}
}
The error message and stack trace is as follows:
Exception in thread "main" spoon.SpoonException: Cannot compare this: [289, 346] with other: ["331", "353"]
at spoon.support.sniper.internal.ElementSourceFragment.compare(ElementSourceFragment.java:359)
at spoon.support.sniper.internal.ElementSourceFragment.add(ElementSourceFragment.java:273)
at spoon.support.sniper.internal.ElementSourceFragment.addChild(ElementSourceFragment.java:305)
at spoon.support.sniper.internal.ElementSourceFragment.addChild(ElementSourceFragment.java:241)
at spoon.support.sniper.internal.ElementSourceFragment.access$000(ElementSourceFragment.java:51)
at spoon.support.sniper.internal.ElementSourceFragment$1.enter(ElementSourceFragment.java:200)
at spoon.reflect.visitor.CtScanner.visitCtInvocation(CtScanner.java:499)
at spoon.support.reflect.code.CtInvocationImpl.accept(CtInvocationImpl.java:46)
at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:145)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:121)
at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:169)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:106)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:83)
at spoon.reflect.visitor.CtScanner.visitCtInvocation(CtScanner.java:504)
at spoon.support.reflect.code.CtInvocationImpl.accept(CtInvocationImpl.java:46)
at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:145)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:121)
at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:169)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:106)
at spoon.reflect.visitor.CtScanner.visitCtReturn(CtScanner.java:675)
at spoon.support.reflect.code.CtReturnImpl.accept(CtReturnImpl.java:27)
at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:145)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:121)
at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:169)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:106)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:83)
at spoon.reflect.visitor.CtScanner.visitCtBlock(CtScanner.java:299)
at spoon.support.reflect.code.CtBlockImpl.accept(CtBlockImpl.java:57)
at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:145)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:121)
at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:169)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:106)
at spoon.reflect.visitor.CtScanner.visitCtIf(CtScanner.java:482)
at spoon.support.reflect.code.CtIfImpl.accept(CtIfImpl.java:36)
at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:145)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:121)
at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:169)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:106)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:83)
at spoon.reflect.visitor.CtScanner.visitCtBlock(CtScanner.java:299)
at spoon.support.reflect.code.CtBlockImpl.accept(CtBlockImpl.java:57)
at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:145)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:121)
at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:169)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:106)
at spoon.reflect.visitor.CtScanner.visitCtMethod(CtScanner.java:556)
at spoon.support.reflect.declaration.CtMethodImpl.accept(CtMethodImpl.java:58)
at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:145)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:121)
at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:169)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:106)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:83)
at spoon.reflect.visitor.CtScanner.visitCtClass(CtScanner.java:335)
at spoon.support.reflect.declaration.CtClassImpl.accept(CtClassImpl.java:58)
at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:145)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:121)
at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:169)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:106)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:83)
at spoon.reflect.visitor.CtScanner.visitCtClass(CtScanner.java:335)
at spoon.support.reflect.declaration.CtClassImpl.accept(CtClassImpl.java:58)
at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:145)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:121)
at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:169)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:106)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:83)
at spoon.reflect.visitor.EarlyTerminatingScanner.visitCtCompilationUnit(EarlyTerminatingScanner.java:160)
at spoon.support.reflect.declaration.CtCompilationUnitImpl.accept(CtCompilationUnitImpl.java:407)
at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:145)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:121)
at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:169)
at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:106)
at spoon.support.sniper.internal.ElementSourceFragment.createSourceFragmentsFrom(ElementSourceFragment.java:228)
at spoon.support.reflect.declaration.CtCompilationUnitImpl.getOriginalSourceFragment(CtCompilationUnitImpl.java:359)
at spoon.support.reflect.declaration.CtElementImpl.getOriginalSourceFragment(CtElementImpl.java:596)
at TestClass.main(TestClass.java:14)
I guest that the error is caused by the following statement in the input code file (i.e., the statement at line 7 in file StrBuilder.java).
return super.tokenize(StrBuilder.this.buffer, 0, StrBuilder.this.size());
Hope you can locate and fix this bug soon. Thank you