INRIA / INRIA/spoon

m.getOriginalSourceFragment().getSourceCode() -> CtMethodImpl does not have CtRole.STATEMENT when add a clone statement to a new method body

Open
#3,659 1 comment 0 reactions 0 assignees View on GitHub
bug
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.