m.getOriginalSourceFragment().getSourceCode() -> CtMethodImpl does not have CtRole.STATEMENT when add a clone statement to a new method body
- Dominant language
- Java
- Stars
- 2k
- Forks
- 392
- Avg merge
- 11h 24m
- Merged PRs (30d)
- 36
Description
Here is a snipped to reproduce the issue
```
Launcher launcher = new Launcher();
launcher.addInputResource("/home/user/TestClass2.java");
launcher.buildModel();
CtModel model = launcher.getModel();
List methods = model.getElements(new TypeFilter(CtMethod.class));
CtMethod m = methods.get(0);
CtStatement stmt = m.getBody().getStatement(0);
CtBlock b = launcher.getFactory().Core().createBlock();
//If you comment the next line - everything will work.
b.addStatement(stmt.clone()); //if you replace 'stmt.clone()' to 'launcher.getFactory().Core().....something created by you' - it will work.
m.setBody(b);
System.out.println(m); //It works OK!
System.out.println(m.getOriginalSourceFragment().getSourceCode()); //The error is here , Tester.java:32
```
TestClass2.java
```
public class TestClass {
int a = 0;
void f() {
a++;
}
}
```
```
Exception in thread "main" spoon.SpoonException: The element of class class spoon.support.reflect.declaration.CtMethodImpl does not have CtRole.STATEMENT
at spoon.reflect.meta.impl.RoleHandlerHelper.getRoleHandler(RoleHandlerHelper.java:57)
at spoon.support.sniper.internal.ElementSourceFragment.getRoleHandler(ElementSourceFragment.java:257)
at spoon.support.sniper.internal.ElementSourceFragment.addChild(ElementSourceFragment.java:240)
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.visitCtUnaryOperator(CtScanner.java:798)
at spoon.support.reflect.code.CtUnaryOperatorImpl.accept(CtUnaryOperatorImpl.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: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.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.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:601)
at com.licel.testspoon.Tester.main(Tester.java:32)
```
Contributor guide
Assessment
This issue has not been assessed yet.