Fixed a bug that caused resolution of declarations within switch entry statements to not work properly.
diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/SwitchEntryContext.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/SwitchEntryContext.java
index 1d83e0a..e4a223c 100644
--- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/SwitchEntryContext.java
+++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/contexts/SwitchEntryContext.java
@@ -16,9 +16,11 @@
package com.github.javaparser.symbolsolver.javaparsermodel.contexts;
+import com.github.javaparser.ast.nodeTypes.NodeWithStatements;
import com.github.javaparser.ast.stmt.Statement;
import com.github.javaparser.ast.stmt.SwitchEntryStmt;
import com.github.javaparser.ast.stmt.SwitchStmt;
+import com.github.javaparser.resolution.UnsolvedSymbolException;
import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
import com.github.javaparser.resolution.declarations.ResolvedValueDeclaration;
import com.github.javaparser.resolution.types.ResolvedType;
@@ -60,17 +62,19 @@
}
}
- // look for declaration in other switch statements
+ // look for declaration in this and previous switch entry statements
for (SwitchEntryStmt seStmt : switchStmt.getEntries()) {
- if (!seStmt.equals(wrappedNode)) {
- for (Statement stmt : seStmt.getStatements()) {
- SymbolDeclarator symbolDeclarator = JavaParserFactory.getSymbolDeclarator(stmt, typeSolver);
- SymbolReference<? extends ResolvedValueDeclaration> symbolReference = solveWith(symbolDeclarator, name);
- if (symbolReference.isSolved()) {
- return symbolReference;
- }
+ for (Statement stmt : seStmt.getStatements()) {
+ SymbolDeclarator symbolDeclarator = JavaParserFactory.getSymbolDeclarator(stmt, typeSolver);
+ SymbolReference<? extends ResolvedValueDeclaration> symbolReference = solveWith(symbolDeclarator, name);
+ if (symbolReference.isSolved()) {
+ return symbolReference;
}
}
+ // once we reach this switch entry statement, stop: we do not want to look in later switch entry statements
+ if (seStmt == wrappedNode) {
+ break;
+ }
}
return getParent().solveSymbol(name, typeSolver);
diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/MethodsResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/MethodsResolutionTest.java
index 2e6dc94..04a69b9 100644
--- a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/MethodsResolutionTest.java
+++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/MethodsResolutionTest.java
@@ -35,6 +35,7 @@
import org.junit.Test;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
public class MethodsResolutionTest extends AbstractResolutionTest {
@@ -358,4 +359,23 @@
assertEquals(true, type.isReferenceType());
assertEquals(true, type.asReferenceType().getTypeDeclaration() instanceof JavaParserAnonymousClassDeclaration);
}
+
+ @Test
+ public void resolveMethodCallWithScopeDeclarationInSwitchEntryStmt() {
+ CompilationUnit cu = parseSample("TryInSwitch");
+ ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "TryInSwitch");
+
+ MethodDeclaration method = Navigator.demandMethod(clazz, "foo");
+
+ MethodCallExpr callExpr = method.getBody().get().getStatement(1)
+ .asSwitchStmt().getEntry(0).getStatement(1)
+ .asTryStmt().getTryBlock().getStatement(1)
+ .asExpressionStmt().getExpression()
+ .asMethodCallExpr();
+
+ SymbolReference<ResolvedMethodDeclaration> reference = JavaParserFacade.get(new ReflectionTypeSolver()).solve(callExpr);
+
+ assertTrue(reference.isSolved());
+ assertEquals("java.io.File.delete()", reference.getCorrespondingDeclaration().getQualifiedSignature());
+ }
}
diff --git a/javaparser-symbol-solver-testing/src/test/resources/TryInSwitch.java.txt b/javaparser-symbol-solver-testing/src/test/resources/TryInSwitch.java.txt
new file mode 100644
index 0000000..aee824f
--- /dev/null
+++ b/javaparser-symbol-solver-testing/src/test/resources/TryInSwitch.java.txt
@@ -0,0 +1,20 @@
+import java.io.File;
+
+class TryInSwitch {
+
+ public void foo() {
+ int i = 42;
+
+ switch (i) {
+ default:
+ File file;
+ try {
+ file = new File("...");
+ file.delete();
+ } catch (Exception e) {
+ // ...
+ }
+ break;
+ }
+ }
+}