Skip to content

Commit

Permalink
Fixes #1711.
Browse files Browse the repository at this point in the history
  • Loading branch information
malteskoruppa committed Jul 25, 2018
1 parent 4dcb5a2 commit e7ca7c4
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 11 deletions.
Expand Up @@ -16,27 +16,21 @@

package com.github.javaparser.symbolsolver.javaparsermodel.contexts;

import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.FieldAccessExpr;
import com.github.javaparser.ast.expr.ObjectCreationExpr;
import com.github.javaparser.ast.expr.ThisExpr;
import com.github.javaparser.resolution.UnsolvedSymbolException;
import com.github.javaparser.resolution.declarations.*;
import com.github.javaparser.resolution.types.ResolvedPrimitiveType;
import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
import com.github.javaparser.resolution.types.ResolvedReferenceType;
import com.github.javaparser.resolution.types.ResolvedType;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory;
import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserClassDeclaration;
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.resolution.Value;
import com.github.javaparser.symbolsolver.resolution.MethodResolutionLogic;
import com.github.javaparser.symbolsolver.resolution.SymbolSolver;

import java.util.Collection;
import java.util.List;
import java.util.Optional;

import static com.github.javaparser.symbolsolver.javaparser.Navigator.requireParentNode;

Expand Down Expand Up @@ -64,7 +58,12 @@ public SymbolReference<ResolvedTypeDeclaration> solveType(String name, TypeSolve
}
throw new UnsolvedSymbolException("Unable to solve qualified object creation expression in the context of expression of type " + scopeType.describe());
}
return JavaParserFactory.getContext(requireParentNode(wrappedNode), typeSolver).solveType(name, typeSolver);
// find first parent node that is not an object creation expression to avoid stack overflow errors, see #1711
Node parentNode = requireParentNode(wrappedNode);
while (parentNode instanceof ObjectCreationExpr) {
parentNode = requireParentNode(parentNode);
}
return JavaParserFactory.getContext(parentNode, typeSolver).solveType(name, typeSolver);
}

@Override
Expand Down
Expand Up @@ -55,4 +55,41 @@ public void solveInnerClassConstructor() {
assertEquals(expectedConstructor, actualConstructor);
}

@Test
public void solveInnerClassConstructorWithNewScope() {
CompilationUnit cu = parseSample("ConstructorCalls");
ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "ConstructorCalls");
MethodDeclaration method = Navigator.demandMethod(clazz, "testInnerClassConstructorWithNewScope");
ObjectCreationExpr objectCreationExpr = method.getBody().get().getStatements().get(0)
.asExpressionStmt().getExpression().asObjectCreationExpr();

SymbolReference<ResolvedConstructorDeclaration> ref =
JavaParserFacade.get(new ReflectionTypeSolver()).solve(objectCreationExpr);
ConstructorDeclaration actualConstructor =
((JavaParserConstructorDeclaration) ref.getCorrespondingDeclaration()).getWrappedNode();

ClassOrInterfaceDeclaration innerClazz = Navigator.demandClass(cu, "OtherClass.InnerClass");
ConstructorDeclaration expectedConstructor = Navigator.demandConstructor(innerClazz, 0);

assertEquals(expectedConstructor, actualConstructor);
}

@Test
public void solveInnerInnerClassConstructor() {
CompilationUnit cu = parseSample("ConstructorCalls");
ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "ConstructorCalls");
MethodDeclaration method = Navigator.demandMethod(clazz, "testInnerInnerClassConstructor");
ObjectCreationExpr objectCreationExpr = method.getBody().get().getStatements().get(0)
.asExpressionStmt().getExpression().asObjectCreationExpr();

SymbolReference<ResolvedConstructorDeclaration> ref =
JavaParserFacade.get(new ReflectionTypeSolver()).solve(objectCreationExpr);
ConstructorDeclaration actualConstructor =
((JavaParserConstructorDeclaration) ref.getCorrespondingDeclaration()).getWrappedNode();

ClassOrInterfaceDeclaration innerClazz = Navigator.demandClass(cu, "OtherClass.InnerClass.InnerInnerClass");
ConstructorDeclaration expectedConstructor = Navigator.demandConstructor(innerClazz, 0);

assertEquals(expectedConstructor, actualConstructor);
}
}
Expand Up @@ -8,6 +8,14 @@ class ConstructorCalls {
OtherClass oc = new OtherClass();
oc.new InnerClass();
}

void testInnerClassConstructorWithNewScope() {
new OtherClass().new InnerClass();
}

void testInnerInnerClassConstructor() {
new OtherClass().new InnerClass().new InnerInnerClass();
}
}

class OtherClass {
Expand All @@ -17,5 +25,10 @@ class OtherClass {
class InnerClass {

InnerClass() {}

class InnerInnerClass {

InnerInnerClass() {}
}
}
}

0 comments on commit e7ca7c4

Please sign in to comment.