[454028] fix sourcelookup for Java-only clients

generalized approach found in JavaHotCodeReplaceManager

Change-Id: I8df6d27aef615d98b9b25eaf6bfdcf2389b9a1a7
Signed-off-by: Stefan Oehme <st.oehme@gmail.com>
diff --git a/org.eclipse.jdt.debug.tests/testresources/xtend-source/HelloWorld.java b/org.eclipse.jdt.debug.tests/testresources/xtend-source/HelloWorld.java
new file mode 100644
index 0000000..90b9e03
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/testresources/xtend-source/HelloWorld.java
@@ -0,0 +1,6 @@
+@SuppressWarnings("all")
+public class HelloWorld {
+  public static void main(final String[] args) {
+    System.out.println("Hello World!");
+  }
+}
diff --git a/org.eclipse.jdt.debug.tests/testresources/xtend-source/HelloWorld.xtend b/org.eclipse.jdt.debug.tests/testresources/xtend-source/HelloWorld.xtend
new file mode 100644
index 0000000..f642417
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/testresources/xtend-source/HelloWorld.xtend
@@ -0,0 +1,5 @@
+class HelloWorld {
+	def static void main(String[] args) {
+		System.out.println('Hello World!')
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.debug.tests/testresources/xtend/HelloWorld.class b/org.eclipse.jdt.debug.tests/testresources/xtend/HelloWorld.class
new file mode 100644
index 0000000..5b19852
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/testresources/xtend/HelloWorld.class
Binary files differ
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
index 4cb0bc0..c804c7b 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/AutomatedSuite.java
@@ -46,6 +46,7 @@
 import org.eclipse.jdt.debug.tests.console.ConsoleTerminateAllActionTests;
 import org.eclipse.jdt.debug.tests.console.IOConsoleTests;
 import org.eclipse.jdt.debug.tests.console.JavaStackTraceConsoleTest;
+import org.eclipse.jdt.debug.tests.core.AlternateStratumTests;
 import org.eclipse.jdt.debug.tests.core.ArgumentTests;
 import org.eclipse.jdt.debug.tests.core.ArrayTests;
 import org.eclipse.jdt.debug.tests.core.BootpathTests;
@@ -198,6 +199,7 @@
 			addTest(new TestSuite(ConditionalBreakpointsWithGenerics.class));
 			addTest(new TestSuite(GenericsEvalTests.class));
 			addTest(new TestSuite(DetailFormatterTests.class));
+			addTest(new TestSuite(AlternateStratumTests.class));
 		}
 		
 	//Sourcelookup tests
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/AlternateStratumTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/AlternateStratumTests.java
new file mode 100644
index 0000000..af118f9
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/core/AlternateStratumTests.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.debug.tests.core;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.debug.core.IJavaReferenceType;
+import org.eclipse.jdt.debug.core.IJavaStackFrame;
+import org.eclipse.jdt.debug.core.IJavaThread;
+import org.eclipse.jdt.debug.core.JDIDebugModel;
+import org.eclipse.jdt.debug.testplugin.JavaProjectHelper;
+import org.eclipse.jdt.debug.testplugin.JavaTestPlugin;
+import org.eclipse.jdt.debug.tests.AbstractDebugTest;
+import org.eclipse.jdt.internal.debug.core.JavaDebugUtils;
+
+/**
+ * Tests strata.
+ */
+public class AlternateStratumTests extends AbstractDebugTest {
+
+	public AlternateStratumTests(String name) {
+		super(name);
+	}
+
+	/**
+	 * Test available strata on a type with alternate strata
+	 * 
+	 * @throws Exception
+	 */
+	public void testAvailableStrata() throws Exception {
+		String typeName = "HelloWorld";
+		prepareXtendBreakpoint(typeName, 3);
+
+		IJavaThread thread = null;
+		try {
+			thread = launchToBreakpoint(typeName);
+			assertNotNull("Breakpoint not hit within timeout period", thread);
+			IJavaReferenceType type = ((IJavaStackFrame) thread.getTopStackFrame()).getReferenceType();
+			String[] strata = type.getAvailableStrata();
+			assertEquals("Wrong number of available strata", 2, strata.length);
+			assertEquals("Wrong strata", "Xtend", strata[0]);
+			assertEquals("Wrong strata", "Java", strata[1]);
+		}
+		finally {
+			terminateAndRemove(thread);
+			removeAllBreakpoints();
+		}
+	}
+
+	/**
+	 * Test default stratum on a type with alternate strata.
+	 * 
+	 * @throws Exception
+	 */
+	public void testDefaultStratum() throws Exception {
+		String typeName = "HelloWorld";
+		prepareXtendBreakpoint(typeName, 3);
+
+		IJavaThread thread = null;
+		try {
+			thread = launchToBreakpoint(typeName);
+			assertNotNull("Breakpoint not hit within timeout period", thread);
+			IJavaReferenceType type = ((IJavaStackFrame) thread.getTopStackFrame()).getReferenceType();
+			String stratum = type.getDefaultStratum();
+			assertEquals("Wrong strata", "Xtend", stratum);
+		}
+		finally {
+			terminateAndRemove(thread);
+			removeAllBreakpoints();
+		}
+	}
+
+	public void testGetSourceNameInStratum2() throws Exception {
+		String typeName = "HelloWorld";
+		prepareXtendBreakpoint(typeName, 3);
+
+		IJavaThread thread = null;
+		try {
+			thread = launchToBreakpoint(typeName);
+			assertNotNull("Breakpoint not hit within timeout period", thread);
+			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
+			String sourceName = stackFrame.getSourceName("Xtend");
+			assertEquals("Wrong source name", "HelloWorld.xtend", sourceName);
+		}
+		finally {
+			terminateAndRemove(thread);
+			removeAllBreakpoints();
+		}
+	}
+
+	public void testResolveJavaElement() throws Exception {
+		String typeName = "HelloWorld";
+		prepareXtendBreakpoint(typeName, 3);
+
+		IJavaThread thread = null;
+		try {
+			thread = launchToBreakpoint(typeName);
+			assertNotNull("Breakpoint not hit within timeout period", thread);
+			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
+			IJavaElement javaElement = JavaDebugUtils.resolveJavaElement(stackFrame, stackFrame.getLaunch());
+			assertEquals("Wrong java element", "HelloWorld.java", javaElement.getElementName());
+		}
+		finally {
+			terminateAndRemove(thread);
+			removeAllBreakpoints();
+		}
+	}
+
+	public void testResolveJavaProject() throws Exception {
+		String typeName = "HelloWorld";
+		prepareXtendBreakpoint(typeName, 3);
+
+		IJavaThread thread = null;
+		try {
+			thread = launchToBreakpoint(typeName);
+			assertNotNull("Breakpoint not hit within timeout period", thread);
+			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
+			IJavaProject project = JavaDebugUtils.resolveJavaProject(stackFrame);
+			assertEquals("Wrong java project", getProjectContext(), project);
+		}
+		finally {
+			terminateAndRemove(thread);
+			removeAllBreakpoints();
+		}
+	}
+
+	public void testResolveType() throws Exception {
+		String typeName = "HelloWorld";
+		prepareXtendBreakpoint(typeName, 3);
+
+		IJavaThread thread = null;
+		try {
+			thread = launchToBreakpoint(typeName);
+			assertNotNull("Breakpoint not hit within timeout period", thread);
+			IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame();
+			IJavaReferenceType refType = stackFrame.getReferenceType();
+			IType type = JavaDebugUtils.resolveType(refType);
+			assertEquals("Wrong type", "HelloWorld", type.getElementName());
+		}
+		finally {
+			terminateAndRemove(thread);
+			removeAllBreakpoints();
+		}
+	}
+
+	@Override
+	protected IJavaProject getProjectContext() {
+		return get15Project();
+	}
+
+	private void prepareXtendBreakpoint(String typeName, int lineNumber) throws JavaModelException, Exception, CoreException {
+		addXtendClass(typeName);
+		JDIDebugModel.createStratumBreakpoint(getProjectContext().getProject(), "Xtend", null, null, typeName, lineNumber, -1, -1, 0, true, null);
+	}
+
+	private void addXtendClass(String typeName) throws Exception {
+		IPath src = getProjectContext().getPath().append(JavaProjectHelper.SRC_DIR).makeAbsolute();
+		File xtendSources = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/xtend-source"));
+		JavaProjectHelper.importFile(new File(xtendSources, typeName + ".java"), src, null);
+		JavaProjectHelper.importFile(new File(xtendSources, typeName + ".xtend"), src, null);
+		createLaunchConfiguration(typeName);
+		waitForBuild();
+		IPath bin = getProjectContext().getPath().append(JavaProjectHelper.BIN_DIR).makeAbsolute();
+		File xtendClasses = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/xtend"));
+		JavaProjectHelper.importFile(new File(xtendClasses, typeName + ".class"), bin, null);
+	}
+}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EvaluateAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EvaluateAction.java
index 34908a7..b9aa040 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EvaluateAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/EvaluateAction.java
@@ -15,7 +15,6 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Iterator;
 
-import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
@@ -24,7 +23,6 @@
 import org.eclipse.debug.core.DebugEvent;
 import org.eclipse.debug.core.DebugException;
 import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.ISourceLocator;
 import org.eclipse.debug.core.model.IStackFrame;
 import org.eclipse.debug.core.model.IValue;
 import org.eclipse.debug.ui.DebugUITools;
@@ -33,7 +31,6 @@
 import org.eclipse.debug.ui.IDebugView;
 import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.debug.core.IJavaDebugTarget;
 import org.eclipse.jdt.debug.core.IJavaObject;
 import org.eclipse.jdt.debug.core.IJavaStackFrame;
@@ -46,6 +43,7 @@
 import org.eclipse.jdt.debug.eval.IEvaluationResult;
 import org.eclipse.jdt.debug.ui.IJavaDebugUIConstants;
 import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin;
+import org.eclipse.jdt.internal.debug.core.JavaDebugUtils;
 import org.eclipse.jdt.internal.debug.ui.EvaluationContextManager;
 import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
 import org.eclipse.jdt.internal.debug.ui.JavaWordFinder;
@@ -299,21 +297,12 @@
 		if (launch == null) {
 			return null;
 		}
-		ISourceLocator locator= launch.getSourceLocator();
-		if (locator == null) {
+		try {
+			return JavaDebugUtils.resolveJavaElement(stackFrame, launch);
+		}
+		catch (CoreException e) {
 			return null;
 		}
-		
-		Object sourceElement = locator.getSourceElement(stackFrame);
-		if (sourceElement instanceof IJavaElement) {
-			return (IJavaElement) sourceElement;
-		} else if (sourceElement instanceof IResource) {
-			IJavaProject project = JavaCore.create(((IResource)sourceElement).getProject());
-			if (project.exists()) {
-				return project;
-			}
-		}			
-		return null;
 	}
 	
 	/**
@@ -413,11 +402,13 @@
 		if (launch == null) {
 			return false;
 		}
-		ISourceLocator locator= launch.getSourceLocator();
-		if (locator == null) {
+		Object sourceElement;
+		try {
+			sourceElement = JavaDebugUtils.resolveSourceElement(stackFrame, launch);
+		}
+		catch (CoreException e) {
 			return false;
 		}
-		Object sourceElement = locator.getSourceElement(stackFrame);
 		if (sourceElement == null) {
 			return false;
 		}
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaObjectValueEditor.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaObjectValueEditor.java
index 67ecdee..8794cf5 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaObjectValueEditor.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/JavaObjectValueEditor.java
@@ -17,14 +17,11 @@
 import org.eclipse.core.runtime.Status;
 import org.eclipse.debug.core.DebugEvent;
 import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.ISourceLocator;
 import org.eclipse.debug.core.model.IValue;
 import org.eclipse.debug.core.model.IVariable;
 import org.eclipse.debug.ui.DebugUITools;
 import org.eclipse.debug.ui.IDebugUIConstants;
 import org.eclipse.debug.ui.actions.IVariableValueEditor;
-import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.debug.core.IJavaDebugTarget;
 import org.eclipse.jdt.debug.core.IJavaStackFrame;
@@ -34,6 +31,7 @@
 import org.eclipse.jdt.debug.eval.IEvaluationListener;
 import org.eclipse.jdt.debug.eval.IEvaluationResult;
 import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin;
+import org.eclipse.jdt.internal.debug.core.JavaDebugUtils;
 import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
 import org.eclipse.jface.window.Window;
 import org.eclipse.osgi.util.NLS;
@@ -234,22 +232,6 @@
 	 * (copied from JavaWatchExpressionDelegate)
 	 */
 	private IJavaProject getProject(IJavaStackFrame javaStackFrame) {
-		ILaunch launch = javaStackFrame.getLaunch();
-		if (launch == null) {
-			return null;
-		}
-		ISourceLocator locator= launch.getSourceLocator();
-		if (locator == null) {
-			return null;
-		}
-
-		Object sourceElement = locator.getSourceElement(javaStackFrame);
-		if (!(sourceElement instanceof IJavaElement) && sourceElement instanceof IAdaptable) {
-			sourceElement = ((IAdaptable)sourceElement).getAdapter(IJavaElement.class);
-		}
-		if (sourceElement instanceof IJavaElement) {
-			return ((IJavaElement) sourceElement).getJavaProject();
-		}
-		return null;
+		return JavaDebugUtils.resolveJavaProject(javaStackFrame);
 	}
 }
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java
index 2ce03ba..9a6154f 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/JavaDebugUtils.java
@@ -21,6 +21,8 @@
 import org.eclipse.core.runtime.Path;
 import org.eclipse.debug.core.DebugException;
 import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.model.IDebugElement;
+import org.eclipse.debug.core.model.IDebugTarget;
 import org.eclipse.debug.core.model.ISourceLocator;
 import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
 import org.eclipse.jdt.core.IClassFile;
@@ -36,6 +38,7 @@
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jdt.core.dom.TypeDeclaration;
+import org.eclipse.jdt.debug.core.IJavaDebugTarget;
 import org.eclipse.jdt.debug.core.IJavaReferenceType;
 import org.eclipse.jdt.debug.core.IJavaStackFrame;
 import org.eclipse.jdt.debug.core.IJavaThread;
@@ -152,7 +155,8 @@
 				}
 				if (object instanceof IJavaReferenceType) {
 					IJavaReferenceType refType = (IJavaReferenceType) object;
-					String[] sourcePaths = refType.getSourcePaths(null);
+					IJavaDebugTarget target = ((IJavaDebugTarget) refType.getDebugTarget());
+					String[] sourcePaths = refType.getSourcePaths(target.getDefaultStratum());
 					if (sourcePaths != null && sourcePaths.length > 0) {
 						return sourcePaths[0];
 					}
@@ -299,7 +303,7 @@
 	 * @throws CoreException if an exception occurs
 	 */
 	public static IJavaElement resolveJavaElement(Object object, ILaunch launch) throws CoreException {
-		Object sourceElement = resolveSourceElement(object, launch);
+		Object sourceElement = resolveSourceElement(object, JAVA_STRATUM, launch);
 		return getJavaElement(sourceElement);
 	}
 
@@ -333,18 +337,54 @@
 	}
 
 	/**
-	 * Returns the source element corresponding to the given object or
-	 * <code>null</code> if none, in the context of the given launch.
+	 * Returns the source element corresponding to the given object or <code>null</code> if none, in the context of the given launch.
 	 * 
 	 * @param launch
 	 *            provides source locator
 	 * @param object
 	 *            object to resolve source element for
 	 * @return corresponding source element or <code>null</code>
-	 * @throws CoreException if an exception occurs
+	 * @throws CoreException
+	 *             if an exception occurs
 	 */
 	public static Object resolveSourceElement(Object object, ILaunch launch) throws CoreException {
+		return resolveSourceElement(object, null, launch);
+	}
+
+	/**
+	 * Returns the source element corresponding to the given object in the given stratum or <code>null</code> if none, in the context of the given
+	 * launch.
+	 * 
+	 * @param launch
+	 *            provides source locator
+	 * @param object
+	 *            object to resolve source element for
+	 * @param stratum
+	 *            the stratum to use
+	 * @return corresponding source element or <code>null</code>
+	 * @throws CoreException
+	 *             if an exception occurs
+	 */
+	public static Object resolveSourceElement(Object object, String stratum, ILaunch launch) throws CoreException {
 		ISourceLocator sourceLocator = launch.getSourceLocator();
+		if (stratum != null && object instanceof IDebugElement) {
+			IDebugTarget debugTarget = ((IDebugElement) object).getDebugTarget();
+			if (debugTarget instanceof IJavaDebugTarget) {
+				IJavaDebugTarget javaDebugTarget = (IJavaDebugTarget) debugTarget;
+				String def = javaDebugTarget.getDefaultStratum();
+				try {
+					javaDebugTarget.setDefaultStratum(stratum);
+					return doSourceLookup(object, sourceLocator);
+				}
+				finally {
+					javaDebugTarget.setDefaultStratum(def);
+				}
+			}
+		}
+		return doSourceLookup(object, sourceLocator);
+	}
+
+	private static Object doSourceLookup(Object object, ISourceLocator sourceLocator) {
 		if (sourceLocator instanceof ISourceLookupDirector) {
 			ISourceLookupDirector director = (ISourceLookupDirector) sourceLocator;
 			return director.getSourceElement(object);
@@ -363,7 +403,7 @@
 		ILaunch launch = frame.getLaunch();
 		if(launch != null) {
 			try {
-				Object sourceElement = resolveSourceElement(frame, launch);
+				Object sourceElement = resolveSourceElement(frame, JAVA_STRATUM, launch);
 				IJavaElement element = getJavaElement(sourceElement);
 				if(element != null) {
 					return element.getJavaProject();
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/JavaHotCodeReplaceManager.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/JavaHotCodeReplaceManager.java
index e9a1dd1..ea86242 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/JavaHotCodeReplaceManager.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/hcr/JavaHotCodeReplaceManager.java
@@ -48,7 +48,6 @@
 import org.eclipse.debug.core.ILaunchListener;
 import org.eclipse.debug.core.ILaunchManager;
 import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.ISourceLocator;
 import org.eclipse.debug.core.model.IThread;
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.IJavaElement;
@@ -1037,27 +1036,19 @@
 		if (launch == null) {
 			return null;
 		}
-		ISourceLocator locator = launch.getSourceLocator();
-		if (locator == null) {
+		try {
+			IJavaElement sourceElement = JavaDebugUtils.resolveJavaElement(frame, launch);
+			if (sourceElement instanceof IType) {
+				return ((IType) sourceElement).getCompilationUnit();
+			}
+			if (sourceElement instanceof ICompilationUnit) {
+				return (ICompilationUnit) sourceElement;
+			}
 			return null;
 		}
-		IJavaDebugTarget target = (IJavaDebugTarget) frame.getDebugTarget();
-		String def = target.getDefaultStratum();
-		target.setDefaultStratum("Java"); //$NON-NLS-1$
-		Object sourceElement = locator.getSourceElement(frame);
-		target.setDefaultStratum(def);
-		if (!(sourceElement instanceof IJavaElement)
-				&& sourceElement instanceof IAdaptable) {
-			sourceElement = ((IAdaptable) sourceElement)
-					.getAdapter(IJavaElement.class);
+		catch (CoreException e) {
+			return null;
 		}
-		if (sourceElement instanceof IType) {
-			return ((IType) sourceElement).getCompilationUnit();
-		}
-		if (sourceElement instanceof ICompilationUnit) {
-			return (ICompilationUnit) sourceElement;
-		}
-		return null;
 	}
 
 	/**
@@ -1175,8 +1166,9 @@
 			if (resource != null) {
 				switch (resource.getType()) {
 				case IResource.FILE:
-					if (0 == (delta.getFlags() & IResourceDelta.CONTENT))
+					if (0 == (delta.getFlags() & IResourceDelta.CONTENT)) {
 						return false;
+					}
 					if (CLASS_FILE_EXTENSION.equals(resource.getFullPath()
 							.getFileExtension())) {
 						IPath localLocation = resource.getLocation();
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaLogicalStructure.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaLogicalStructure.java
index 36f7613..e70de3b 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaLogicalStructure.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/logicalstructures/JavaLogicalStructure.java
@@ -11,9 +11,7 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.debug.core.logicalstructures;
 
-import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
@@ -23,13 +21,9 @@
 import org.eclipse.debug.core.ILogicalStructureType;
 import org.eclipse.debug.core.IStatusHandler;
 import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.ISourceLocator;
 import org.eclipse.debug.core.model.IThread;
 import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
-import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.debug.core.IJavaClassType;
 import org.eclipse.jdt.debug.core.IJavaDebugTarget;
 import org.eclipse.jdt.debug.core.IJavaInterfaceType;
@@ -45,6 +39,7 @@
 import org.eclipse.jdt.debug.eval.IEvaluationListener;
 import org.eclipse.jdt.debug.eval.IEvaluationResult;
 import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin;
+import org.eclipse.jdt.internal.debug.core.JavaDebugUtils;
 import org.eclipse.jdt.internal.debug.core.model.JDIValue;
 
 import com.ibm.icu.text.MessageFormat;
@@ -288,34 +283,7 @@
 			if (stackFrame == null) {
 				return value;
 			}
-
-			// find the project the snippets will be compiled in.
-			ISourceLocator locator = javaValue.getLaunch().getSourceLocator();
-			Object sourceElement = locator.getSourceElement(stackFrame);
-			if (sourceElement == null && locator instanceof ISourceLookupDirector) {
-				String[] sourcePaths = type.getSourcePaths(null);
-				if (sourcePaths != null && sourcePaths.length > 0) {
-					sourceElement = ((ISourceLookupDirector) locator)
-							.getSourceElement(sourcePaths[0]);
-				}
-			}
-			if (sourceElement != null) {
-				if (!(sourceElement instanceof IJavaElement)
-						&& sourceElement instanceof IAdaptable) {
-					sourceElement = ((IAdaptable) sourceElement)
-							.getAdapter(IJavaElement.class);
-				}
-			}
-			IJavaProject project = null;
-			if (sourceElement instanceof IJavaElement) {
-				project = ((IJavaElement) sourceElement).getJavaProject();
-			} else if (sourceElement instanceof IResource) {
-				IJavaProject resourceProject = JavaCore
-						.create(((IResource) sourceElement).getProject());
-				if (resourceProject.exists()) {
-					project = resourceProject;
-				}
-			}
+			IJavaProject project = JavaDebugUtils.resolveJavaProject(stackFrame);
 			if (project == null) {
 				return value;
 			}