Bug 368212 - JavaLineBreakpoint.computeJavaProject does not let
ISourceLocator evaluate the stackFrame - use JavaDebugUtils
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java
index 6e4b847..4909d54 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java
@@ -14,7 +14,6 @@
import java.util.HashMap;
import java.util.Iterator;
-import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -25,15 +24,12 @@
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchesListener;
import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.IValueDetailListener;
-import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.debug.core.IEvaluationRunnable;
import org.eclipse.jdt.debug.core.IJavaArray;
@@ -195,10 +191,10 @@
if (type != null) {
return type.getJavaProject();
}
- IStackFrame stackFrame= null;
+ IJavaStackFrame stackFrame= null;
IJavaDebugTarget target = (IJavaDebugTarget)javaValue.getDebugTarget().getAdapter(IJavaDebugTarget.class);
if (target != null) {
- stackFrame= thread.getTopStackFrame();
+ stackFrame= (IJavaStackFrame) thread.getTopStackFrame();
if (stackFrame != null && !stackFrame.getDebugTarget().equals(target)) {
stackFrame= null;
}
@@ -206,20 +202,7 @@
if (stackFrame == null) {
return null;
}
- Object sourceElement = JavaDebugUtils.resolveSourceElement(stackFrame, stackFrame.getLaunch());
- 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;
- }
- }
- return project;
+ return JavaDebugUtils.resolveJavaProject(stackFrame);
}
/**
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWatchExpressionDelegate.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWatchExpressionDelegate.java
index 2316e3b..e960ff3 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWatchExpressionDelegate.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaWatchExpressionDelegate.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * Copyright (c) 2000, 2012 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
@@ -13,16 +13,13 @@
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.DebugEvent;
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.ISourceLocator;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IThread;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.model.IWatchExpressionDelegate;
import org.eclipse.debug.core.model.IWatchExpressionListener;
import org.eclipse.debug.core.model.IWatchExpressionResult;
-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;
@@ -31,6 +28,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.JDIThread;
import org.eclipse.jdt.internal.debug.ui.display.JavaInspectExpression;
@@ -111,7 +109,7 @@
}
public void run() {
- IJavaProject project = getProject(fStackFrame);
+ IJavaProject project = JavaDebugUtils.resolveJavaProject(fStackFrame);
if (project == null) {
fListener.watchEvaluationFinished(null);
return;
@@ -148,27 +146,4 @@
}
}
}
-
- /**
- * Return the project associated with the given stack frame.
- */
- 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;
- }
}
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 df9a294..6482c7f 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
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2005, 2011 IBM Corporation and others.
+ * Copyright (c) 2005, 2012 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
@@ -302,8 +302,7 @@
* @return corresponding Java element or <code>null</code>
* @throws CoreException if an exception occurs
*/
- public static IJavaElement resolveJavaElement(Object object, ILaunch launch)
- throws CoreException {
+ public static IJavaElement resolveJavaElement(Object object, ILaunch launch) throws CoreException {
Object sourceElement = resolveSourceElement(object, launch);
return getJavaElement(sourceElement);
}
@@ -323,8 +322,7 @@
if (sourceElement instanceof IJavaElement) {
javaElement = (IJavaElement) sourceElement;
} else if (sourceElement instanceof IAdaptable) {
- javaElement = (IJavaElement) ((IAdaptable) sourceElement)
- .getAdapter(IJavaElement.class);
+ javaElement = (IJavaElement) ((IAdaptable) sourceElement).getAdapter(IJavaElement.class);
}
if (javaElement == null && sourceElement instanceof IResource) {
javaElement = JavaCore.create((IResource) sourceElement);
@@ -349,8 +347,7 @@
* @return corresponding source element or <code>null</code>
* @throws CoreException if an exception occurs
*/
- public static Object resolveSourceElement(Object object, ILaunch launch)
- throws CoreException {
+ public static Object resolveSourceElement(Object object, ILaunch launch) throws CoreException {
ISourceLocator sourceLocator = launch.getSourceLocator();
if (sourceLocator instanceof ISourceLookupDirector) {
ISourceLookupDirector director = (ISourceLookupDirector) sourceLocator;
@@ -363,6 +360,29 @@
}
/**
+ * Resolves the {@link IJavaProject} within the context of the given {@link IJavaStackFrame}
+ *
+ * @param frame
+ * @return the {@link IJavaProject} or <code>null</code>
+ * @since 3.8.0
+ */
+ public static IJavaProject resolveJavaProject(IJavaStackFrame frame) {
+ ILaunch launch = frame.getLaunch();
+ if(launch != null) {
+ try {
+ IJavaElement element = resolveJavaElement(frame, launch);
+ if(element != null) {
+ return element.getJavaProject();
+ }
+ }
+ catch(CoreException ce) {
+ //do nothing, return null
+ }
+ }
+ return null;
+ }
+
+ /**
* Returns an array of simple type names that are part of the given type's
* qualified name. For example, if the given name is <code>x.y.A$B</code>,
* an array with <code>["A", "B"]</code> is returned.
diff --git a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaLineBreakpoint.java b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaLineBreakpoint.java
index cd5c4c2..41c56fb 100644
--- a/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaLineBreakpoint.java
+++ b/org.eclipse.jdt.debug/model/org/eclipse/jdt/internal/debug/core/breakpoints/JavaLineBreakpoint.java
@@ -22,30 +22,23 @@
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.IStatusHandler;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.ISourceLocator;
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.IJavaLineBreakpoint;
-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.IJavaType;
import org.eclipse.jdt.debug.core.JDIDebugModel;
import org.eclipse.jdt.debug.eval.ICompiledExpression;
import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin;
+import org.eclipse.jdt.internal.debug.core.JavaDebugUtils;
import org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget;
import org.eclipse.jdt.internal.debug.core.model.JDIStackFrame;
import org.eclipse.jdt.internal.debug.core.model.JDIThread;
@@ -450,10 +443,9 @@
protected IJavaProject getJavaProject(IJavaStackFrame stackFrame) {
synchronized (fProjectsByFrame) {
- IJavaProject project = fProjectsByFrame
- .get(stackFrame);
+ IJavaProject project = fProjectsByFrame.get(stackFrame);
if (project == null) {
- project = computeJavaProject(stackFrame);
+ project = JavaDebugUtils.resolveJavaProject(stackFrame);
if (project != null) {
fProjectsByFrame.put(stackFrame, project);
}
@@ -462,54 +454,6 @@
}
}
- private IJavaProject computeJavaProject(IJavaStackFrame stackFrame) {
- ILaunch launch = stackFrame.getLaunch();
- if (launch == null) {
- return null;
- }
- ISourceLocator locator = launch.getSourceLocator();
- if (locator == null)
- return null;
-
- Object sourceElement = locator.getSourceElement(stackFrame);
- if (sourceElement == null) {
- try {
- if (locator instanceof ISourceLookupDirector
- && !stackFrame.isStatic()) {
- IJavaType thisType = stackFrame.getThis().getJavaType();
- if (thisType instanceof IJavaReferenceType) {
- String[] sourcePaths = ((IJavaReferenceType) thisType)
- .getSourcePaths(null);
- if (sourcePaths != null && sourcePaths.length > 0) {
- sourceElement = ((ISourceLookupDirector) locator)
- .getSourceElement(sourcePaths[0]);
- }
- }
- }
- } catch (DebugException e) {
- DebugPlugin.log(e);
- }
- }
- if (!(sourceElement instanceof IJavaElement)
- && sourceElement instanceof IAdaptable) {
- Object element = ((IAdaptable) sourceElement)
- .getAdapter(IJavaElement.class);
- if (element != null) {
- sourceElement = element;
- }
- }
- if (sourceElement instanceof IJavaElement) {
- return ((IJavaElement) sourceElement).getJavaProject();
- } else if (sourceElement instanceof IResource) {
- IJavaProject project = JavaCore.create(((IResource) sourceElement)
- .getProject());
- if (project.exists()) {
- return project;
- }
- }
- return null;
- }
-
/*
* (non-Javadoc)
*