/******************************************************************************* * Copyright (c) 2000, 2011 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.sourcelookup; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.debug.core.model.ISourceLocator; import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.internal.core.IInternalDebugCoreConstants; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.debug.core.IJavaThread; import org.eclipse.jdt.debug.tests.AbstractDebugTest; import org.eclipse.jdt.launching.sourcelookup.IJavaSourceLocation; import org.eclipse.jdt.launching.sourcelookup.PackageFragmentRootSourceLocation; /** * Tests source lookup in source folders */ @SuppressWarnings("deprecation") public class SourceLookupTests extends AbstractDebugTest { public SourceLookupTests(String name) { super(name); } /** * See Bug 53646 */ public void testPackageFragmentRoots() throws Exception { IJavaProject javaProject = get14Project(); IPackageFragmentRoot[] roots = javaProject.getPackageFragmentRoots(); IResource resource = javaProject.getProject().getFile("src/A.jar"); IPackageFragmentRoot packageFragmentRoot = javaProject.getPackageFragmentRoot(resource); assertTrue("package fragment root should exist", packageFragmentRoot.exists()); for (int i = 0; i < roots.length; i++) { IPackageFragmentRoot root = roots[i]; if (packageFragmentRoot.equals(root)) { return; } } assertTrue("Failed to locate package fragment root", false); } /** * see Bug 37545 */ public void testStackFrameReuse() throws Exception { String typeName = "org.eclipse.debug.tests.targets.CallStack"; createLineBreakpoint(28, "org.eclipse.debug.tests.targets.ClassOne"); createLineBreakpoint(28, "org.eclipse.debug.tests.targets.ClassTwo"); IJavaThread thread= null; try { thread= launchToBreakpoint(typeName); assertNotNull("Breakpoint not hit within timeout period", thread); // get source element for first breakpoint IStackFrame[] frames = thread.getStackFrames(); IStackFrame frame = frames[2]; ISourceLocator sourceLocator = thread.getLaunch().getSourceLocator(); Object source1 = sourceLocator.getSourceElement(frame); source1 = ((IAdaptable)source1).getAdapter(IJavaElement.class); IPackageFragment[] fragments = get14Project().getPackageFragments(); IPackageFragment fragment = null; for (int i = 0; i < fragments.length; i++) { if (fragments[i].getElementName().equals("org.eclipse.debug.tests.targets")) { fragment = fragments[i]; break; } } assertNotNull("Did not locate package framgment 'org.eclipse.debug.tests.targets'", fragment); ICompilationUnit unit1 = fragment.getCompilationUnit("ClassOne.java"); assertEquals("Source lookup failed for frame1", unit1, source1); // resume to second breakpoint thread = resume(thread); assertNotNull("Breakpoint not hit within timeout period", thread); IStackFrame frame2 = thread.getStackFrames()[2]; Object source2 = sourceLocator.getSourceElement(frame2); source2 = ((IAdaptable)source2).getAdapter(IJavaElement.class); ICompilationUnit unit2 = fragment.getCompilationUnit("ClassTwo.java"); assertEquals("Source lookup failed for frame2", unit2, source2); // the source elements should not be equal } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } /** * Tests source lookup in a top level type, in the default package. */ public void testDefTopLevelType() throws Exception { IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src"); IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root); ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", IInternalDebugCoreConstants.EMPTY_STRING, "Breakpoints.java"); assertTrue("did not find compilation unit for Breakpoints.java", expectedSource.exists()); assertEquals("Source lookup failed", expectedSource, location.findSourceElement("Breakpoints")); } /** * Tests source lookup in an inner type, the default package. */ public void testDefInnerType() throws Exception { IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src"); IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root); ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", IInternalDebugCoreConstants.EMPTY_STRING, "Breakpoints.java"); assertTrue("did not find compilation unit for Breakpoints.java", expectedSource.exists()); assertEquals("Source lookup failed", expectedSource, location.findSourceElement("Breakpoints$InnerRunnable")); } /** * Tests source lookup in an anonymous inner type, in the default package. * Must debug since we do not know name of type. */ public void testDefAnonInnerType() throws Exception { String typeName = "Breakpoints"; createLineBreakpoint(43, typeName); ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", IInternalDebugCoreConstants.EMPTY_STRING, "Breakpoints.java"); assertTrue("did not find compilation unit for Breakpoints.java", expectedSource.exists()); IJavaThread thread= null; try { thread= launchToBreakpoint(typeName); assertNotNull("Breakpoint not hit within timeout period", thread); // get source element for top frame IStackFrame frame = thread.getTopStackFrame(); ISourceLocator sourceLocator = thread.getLaunch().getSourceLocator(); Object source = sourceLocator.getSourceElement(frame); assertEquals("Source lookup failed", expectedSource.getResource(), source); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } /** * Tests source lookup in a named local type, in the default package. * Must debug to test this, since we do no know name of local type. */ public void testDefLocalType() throws Exception { String typeName = "Breakpoints"; createLineBreakpoint(30, typeName); ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", IInternalDebugCoreConstants.EMPTY_STRING, "Breakpoints.java"); assertTrue("did not find compilation unit for Breakpoints.java", expectedSource.exists()); IJavaThread thread= null; try { thread= launchToBreakpoint(typeName); assertNotNull("Breakpoint not hit within timeout period", thread); // get source element for top frame IStackFrame frame = thread.getTopStackFrame(); ISourceLocator sourceLocator = thread.getLaunch().getSourceLocator(); Object source = sourceLocator.getSourceElement(frame); assertEquals("Source lookup failed", expectedSource.getResource(), source); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } /** * Tests source lookup in a top level type. */ public void testTopLevelType() throws Exception { IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src"); IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root); ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "SourceLookup.java"); assertTrue("did not find compilation unit for SourceLookup.java", expectedSource.exists()); assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup")); } /** * Tests source lookup in an inner type. */ public void testInnerType() throws Exception { IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src"); IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root); ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "SourceLookup.java"); assertTrue("did not find compilation unit for SourceLookup.java", expectedSource.exists()); assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup$Inner")); } /** * Tests source lookup in an inner inner type. */ public void testInnerNestedType() throws Exception { IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src"); IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root); ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "SourceLookup.java"); assertTrue("did not find compilation unit for SourceLookup.java", expectedSource.exists()); assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup$Inner$Nested")); } /** * Tests source lookup in a top level type, with a $ named class */ public void testTopLevel$Type() throws Exception { IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src"); IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root); ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "Source_$_Lookup.java"); assertTrue("did not find compilation unit for Source_$_Lookup.java", expectedSource.exists()); assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup")); } /** * Tests source lookup in an inner type in a $ named class. */ public void testInner$Type() throws Exception { IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src"); IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root); ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "Source_$_Lookup.java"); assertTrue("did not find compilation unit for Source_$_Lookup.java", expectedSource.exists()); assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup$Inner")); } /** * Tests source lookup in an inner inner type in a $ named class. */ public void testInnerNested$Type() throws Exception { IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src"); IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root); ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "Source_$_Lookup.java"); assertTrue("did not find compilation unit for Source_$_Lookup.java", expectedSource.exists()); assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup$Inner$Nested")); } }