Fixed bug 467421: [1.8][occurrence] Mark Exception Occurrences doesn't
highlight thrower inside lambda expression
Change-Id: I4ca57568bcb8cb1adae2bb1f64787e3d41c0b6c3
diff --git a/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/JdtTextTestSuite.java b/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/JdtTextTestSuite.java
index 568f03a..ccd24bb 100644
--- a/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/JdtTextTestSuite.java
+++ b/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/JdtTextTestSuite.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2014 IBM Corporation and others.
+ * Copyright (c) 2000, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -45,6 +45,7 @@
// suite.addTest(PartitionTokenScannerTest.suite());
suite.addTest(MarkOccurrenceTest.suite());
suite.addTest(MarkOccurrenceTest17.suite());
+ suite.addTest(MarkOccurrenceTest18.suite());
suite.addTest(PluginsNotLoadedTest.suite());
PluginsNotLoadedTest.addLoadedPlugIns(
new String[] {
diff --git a/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/MarkOccurrenceTest18.java b/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/MarkOccurrenceTest18.java
index f84c3f9..70d60a4 100644
--- a/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/MarkOccurrenceTest18.java
+++ b/org.eclipse.jdt.text.tests/src/org/eclipse/jdt/text/tests/MarkOccurrenceTest18.java
@@ -235,4 +235,27 @@
checkSelection(buf, offset, length, ranges);
}
+ public void testTryCatchInLambda() throws Exception {
+ StringBuffer buf= new StringBuffer();
+ buf.append("package test1;\n");
+ buf.append("\n");
+ buf.append("import java.io.FileInputStream;\n");
+ buf.append("import java.io.FileNotFoundException;\n");
+ buf.append("\n");
+ buf.append("public class E {\n");
+ buf.append(" Runnable lambda = () -> {\n");
+ buf.append(" try {\n");
+ buf.append(" new FileInputStream(\"dummy\");\n");
+ buf.append(" } catch (FileNotFoundException e) {\n");
+ buf.append(" }\n");
+ buf.append(" };\n");
+ buf.append("}\n");
+
+ fFinder= new ExceptionOccurrencesFinder();
+ int offset= buf.indexOf("FileNotFoundException e");
+ int length= 0;
+ OccurrenceLocation[] ranges= { find(buf, "FileInputStream", 2), find(buf, "FileNotFoundException", 2) };
+ checkSelection(buf, offset, length, ranges);
+ }
+
}
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/ExceptionOccurrencesFinder.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/ExceptionOccurrencesFinder.java
index f9754a5..b0ce394 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/ExceptionOccurrencesFinder.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/ExceptionOccurrencesFinder.java
@@ -80,19 +80,17 @@
if (node == null)
return SearchMessages.ExceptionOccurrencesFinder_no_exception;
- MethodDeclaration method= ASTResolving.findParentMethodDeclaration(node);
- if (method == null)
- return SearchMessages.ExceptionOccurrencesFinder_no_exception;
-
// The ExceptionOccurrencesFinder selects the whole type, no matter what part of it was selected. MethodExitsFinder behaves similar.
if (node instanceof Name) {
node= ASTNodes.getTopMostName((Name) node);
}
- ASTNode parent= node.getParent();
if (node.getLocationInParent() == TagElement.FRAGMENTS_PROPERTY) {
+ MethodDeclaration method= ASTResolving.findParentMethodDeclaration(node);
+ if (method == null)
+ return SearchMessages.ExceptionOccurrencesFinder_no_exception;
// in Javadoc tag:
- TagElement tagElement= (TagElement) parent;
+ TagElement tagElement= (TagElement) node.getParent();
String tagName= tagElement.getTagName();
if (node instanceof Name
&& node == tagElement.fragments().get(0)
@@ -110,6 +108,9 @@
// in method's "throws" list:
if (type.getLocationInParent() == MethodDeclaration.THROWN_EXCEPTION_TYPES_PROPERTY) {
+ MethodDeclaration method= ASTResolving.findParentMethodDeclaration(node);
+ if (method == null)
+ return SearchMessages.ExceptionOccurrencesFinder_no_exception;
fSelectedNode= type;
fException= type.resolveBinding();
fStart= method;