Giter Site home page Giter Site logo

Comments (5)

sretake avatar sretake commented on June 11, 2024

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.

sretake avatar sretake commented on June 11, 2024

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.

sretake avatar sretake commented on June 11, 2024

Can anyone answer me if it's actually a bug
@alcides

from spoon.

I-Al-Istannen avatar I-Al-Istannen commented on June 11, 2024

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:
grafik
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.

sretake avatar sretake commented on June 11, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.