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;