Comments (5)
When class C is not in the current project, stack overflow will occur in the following test example
@Test()
void foo(){
Launcher launcher = new Launcher();
launcher.getEnvironment().setComplianceLevel(11);
launcher.getEnvironment().setAutoImports(true);
launcher.addInputResource(new VirtualFile("" +
"import com.C;\n" +
"import java.util.List;\n" +
"import java.util.function.BiFunction;\n" +
"\n" +
"public class A {\n" +
" public void test( List<? extends C> list, BiFunction<C, B, Boolean> func) {\n" +
" list.stream().forEach(c -> {\n" +
" func.apply(c, null);\n" +
" });\n" +
" }\n" +
"}\n" +
"class B{ }" +
""));
CtModel ctModel = launcher.buildModel();
List<CtExecutableReference> elements = ctModel.getElements(new TypeFilter<>(CtExecutableReference.class));
for (CtExecutableReference element : elements) {
try{
element.getExecutableDeclaration();
}catch(StackOverflowError e){
e.printStackTrace();
}
}
}
from spoon.
When class C is in the current project, the following test cases are normal
@Test()
void foo(){
Launcher launcher = new Launcher();
launcher.getEnvironment().setComplianceLevel(11);
launcher.getEnvironment().setAutoImports(true);
launcher.addInputResource(new VirtualFile("" +
"import java.util.List;\n" +
"import java.util.function.BiFunction;\n" +
"\n" +
"public class A {\n" +
" public void test( List<? extends C> list, BiFunction<C, B, Boolean> func) {\n" +
" list.stream().forEach(c -> {\n" +
" func.apply(c, null);\n" +
" });\n" +
" }\n" +
"}\n" +
"class B{ }class C{}" +
""));
CtModel ctModel = launcher.buildModel();
List<CtExecutableReference> elements = ctModel.getElements(new TypeFilter<>(CtExecutableReference.class));
for (CtExecutableReference element : elements) {
try{
element.getExecutableDeclaration();
}catch(StackOverflowError e){
e.printStackTrace();
}
}
}
from spoon.
Can anyone answer me if it's actually a bug
@alcides
from spoon.
I mean, it is kind of a bug but not really. It only happens in noclasspath mode, because in there JDT's type inference gives up:
As JDT is not able to resolve this to the apply(Object, Object)
method in the class, Spoon would need to make that translation on a best-effort basis. Sadly, during erasure computation for the parameter spoon enters an infinite loop. I am sure spoon could be more clever here, but it still won't really be able to answer that query correctly with the types provided by JDT.
The question is whether we want to try and make Spoon a bit smarter here and let it return from the call -- possibly returning garbage information. We could also make it return null
, I guess, but I am not sure how straightforward the required changes in spoon would be (if at all possible to detect).
from spoon.
thanks, i suggest you can return null
or throw SpoonException
instead of StackOverflowError
, because it will cause my program to crash.
from spoon.
Related Issues (20)
- Delete old unused javadoc package HOT 2
- [Bug]: Under multithreading, using the isOverriding method will lead to incorrect results of the getElements method
- [Bug]: How to correctly recognize the signature of invoked methods in lambda expression?
- Java Compatibility with Older Versions of Spoon HOT 1
- [Bug]: CtReferenceImpl.isSpecialType throws an exception
- [Bug]: Bug adding comment in AST of lambda HOT 2
- Update a method calls reference
- java 22 HOT 1
- [Bug]: Control Flow graph missing edge for implicit default case in switch
- [Bug]: Control Flow Graph doesn't handle cases with multiple expressions
- Spotless for imports HOT 2
- [Bug]: Spoon inserts incorrect break in enhanced switch block
- [Feature Request]: Minimize Parens in `DefaultJavaPrettyPrinter` should use operator precedence (`(a == b) || (b == c)` could be `a == b || b == c`) HOT 2
- [Bug]: Javadoc of class missing HOT 1
- improve reproducible build architecture for Spoon HOT 2
- Unable to start JavaFX UI
- How to Implement Angelic Value with Spoon for APR
- Processing import Statements HOT 2
- links to some of the transformation examples are broken
- [Bug]: Not allowed javaletter or keyword in identifier found. See JLS for correct identifier. Identifier: E' HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from spoon.