1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

Implementation of source locator.

This commit is contained in:
Mikhail Khodjaiants 2002-09-23 20:46:53 +00:00
parent d6563a382b
commit 0c9fd43286
11 changed files with 455 additions and 162 deletions

View file

@ -3,8 +3,9 @@
<classpathentry kind="src" path="src/"/>
<classpathentry kind="src" path="/org.eclipse.core.resources"/>
<classpathentry kind="src" path="/org.eclipse.debug.core"/>
<classpathentry kind="src" path="/org.eclipse.cdt.core"/>
<classpathentry kind="src" path="/org.eclipse.core.runtime"/>
<classpathentry kind="src" path="/org.eclipse.core.boot"/>
<classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT/" sourcepath="JRE_SRC"/>
<classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View file

@ -3,6 +3,7 @@
<name>org.eclipse.cdt.debug.core</name>
<comment></comment>
<projects>
<project>org.eclipse.cdt.core</project>
<project>org.eclipse.core.boot</project>
<project>org.eclipse.core.resources</project>
<project>org.eclipse.core.runtime</project>

View file

@ -14,6 +14,7 @@
<requires>
<import plugin="org.eclipse.core.resources"/>
<import plugin="org.eclipse.debug.core"/>
<import plugin="org.eclipse.cdt.core"/>
</requires>

View file

@ -15,6 +15,7 @@ import org.eclipse.cdt.debug.core.cdi.ICDISourceManager;
import org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpoint;
import org.eclipse.cdt.debug.core.cdi.model.ICDIExpression;
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
import org.eclipse.cdt.debug.internal.core.CSourceLocator;
import org.eclipse.cdt.debug.internal.core.breakpoints.CLineBreakpoint;
import org.eclipse.cdt.debug.internal.core.breakpoints.CWatchpoint;
import org.eclipse.cdt.debug.internal.core.model.CDebugElement;

View file

@ -0,0 +1,140 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.core.sourcelookup;
import java.io.File;
import org.eclipse.cdt.core.resources.FileStorage;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
/**
*
* Locates source elements in a directory in the local
* file system. Returns instances of <code>FileStorage</code>.
*
* @since Sep 23, 2002
*/
public class CDirectorySourceLocation implements ICSourceLocation
{
/**
* The directory associated with this source location
*/
private IPath fDirectory;
/**
* Constructor for CDirectorySourceLocation.
*/
public CDirectorySourceLocation( IPath directory )
{
setDirectory( directory );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation#findSourceElement(String)
*/
public Object findSourceElement( String name ) throws CoreException
{
if ( getDirectory() != null )
{
File file = new File( name );
if ( file.isAbsolute() )
return findFileByAbsolutePath( name );
else
return findFileByRelativePath( name );
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
*/
public Object getAdapter( Class adapter )
{
if ( adapter.equals( ICSourceLocation.class ) )
return this;
if ( adapter.equals( CDirectorySourceLocation.class ) )
return this;
return null;
}
/**
* Sets the directory in which source elements will
* be searched for.
*
* @param directory a directory
*/
private void setDirectory( IPath directory )
{
fDirectory = directory;
}
/**
* Returns the directory associated with this source
* location.
*
* @return directory
*/
public IPath getDirectory()
{
return fDirectory;
}
private Object findFileByAbsolutePath( String fileName )
{
IPath filePath = new Path( fileName );
String name = filePath.lastSegment();
filePath = filePath.removeLastSegments( 1 );
IPath path = getDirectory();
if ( path.equals( filePath ) )
{
path = path.append( name );
// Try for a file in another workspace project
IFile f = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation( path );
if ( f != null )
{
return f;
}
File file = path.toFile();
if ( file.exists() )
{
return createExternalFileStorage( path );
}
}
return null;
}
private Object findFileByRelativePath( String fileName )
{
IPath path = getDirectory();
path.append( fileName );
// Try for a file in another workspace project
IFile f = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation( path );
if ( f != null )
{
return f;
}
File file = path.toFile();
if ( file.exists() )
{
return createExternalFileStorage( path );
}
return null;
}
private IStorage createExternalFileStorage( IPath path )
{
return new FileStorage( path );
}
}

View file

@ -0,0 +1,115 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.core.sourcelookup;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
/**
*
* Locates source elements in a Java project. Returns instances of <code>IFile</code>.
*
* @since Sep 23, 2002
*/
public class CProjectSourceLocation implements ICSourceLocation
{
/**
* The project associated with this source location
*/
private IProject fProject;
/**
* Constructor for CProjectSourceLocation.
*/
public CProjectSourceLocation( IProject project )
{
setProject( project );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation#findSourceElement(String)
*/
public Object findSourceElement( String name ) throws CoreException
{
if ( getProject() != null )
{
IPath path = new Path( name );
String fileName = path.toOSString();
String pPath = new String( getProject().getLocation().toOSString() );
int i = 0;
if ( (i = fileName.indexOf( pPath )) >= 0 )
{
i += pPath.length() + 1;
if ( fileName.length() > i )
return getProject().getFile( fileName.substring( i ) );
}
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
*/
public Object getAdapter( Class adapter )
{
if ( adapter.equals( ICSourceLocation.class ) )
return this;
if ( adapter.equals( CProjectSourceLocation.class ) )
return this;
return null;
}
/**
* Sets the project in which source elements will be searched for.
*
* @param project the project
*/
private void setProject( IProject project )
{
fProject = project;
}
/**
* Returns the project associated with this source location.
*
* @return project
*/
public IProject getProject()
{
return fProject;
}
private IFile findFile( IContainer parent, IPath name ) throws CoreException
{
if ( name.isAbsolute() )
{
if ( name.toOSString().startsWith( parent.getLocation().toOSString() ) )
{
name = new Path( name.toOSString().substring( parent.getLocation().toOSString().length() + 1 ) );
}
}
IResource found = parent.findMember( name );
if ( found != null && found.getType() == IResource.FILE )
{
return (IFile)found;
}
IResource[] children= parent.members();
for ( int i= 0; i < children.length; i++ )
{
if ( children[i] instanceof IContainer )
{
return findFile( (IContainer)children[i], name );
}
}
return null;
}
}

View file

@ -0,0 +1,38 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.core.sourcelookup;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
/**
*
* A source location defines the location of a repository
* of source code. A source location is capable of retrieving
* source elements.
* <p>
* For example, a source location could be a project, zip/archive
* file, or a directory in the file system.
* </p>
*
* @since Sep 23, 2002
*/
public interface ICSourceLocation extends IAdaptable
{
/**
* Returns an object representing the source code
* for a type with the specified name, or <code>null</code>
* if none could be found. The source element
* returned is implementation specific - for example, a
* resource, a local file, a zip file entry, etc.
*
* @param name the name of the object for which source is being searched for
*
* @return source element
* @exception CoreException if an exception occurs while searching for the specified source element
*/
Object findSourceElement( String name ) throws CoreException;
}

View file

@ -3,11 +3,13 @@
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.core;
package org.eclipse.cdt.debug.core.sourcelookup;
import org.eclipse.cdt.debug.core.IStackFrameInfo;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.ISourceLocator;
@ -77,10 +79,16 @@ public interface ICSourceLocator extends ISourceLocator
Object getSourceElementForAddress( long address );
/**
* Returns whether the given resource is contained in this source locator.
* Returns the source locations of this locator.
*
* @param resource the resource
* @return whether the given resource is contained in this source locator
* @return the source locations of this locator
*/
boolean contains( IResource resource );
ICSourceLocation[] getSourceLocations();
/**
* Sets the source locations of this locator.
*
* @param location - an array of source locations
*/
void setSourceLocations( ICSourceLocation[] locations );
}

View file

@ -6,9 +6,13 @@
package org.eclipse.cdt.debug.internal.core;
import java.util.ArrayList;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.ICSourceLocator;
import org.eclipse.cdt.debug.core.IStackFrameInfo;
import org.eclipse.cdt.debug.core.sourcelookup.CProjectSourceLocation;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
import org.eclipse.cdt.debug.internal.core.model.*;
import org.eclipse.core.internal.resources.File;
import org.eclipse.core.resources.IContainer;
@ -30,14 +34,9 @@ import org.eclipse.debug.core.model.IStackFrame;
public class CSourceLocator implements ICSourceLocator
{
/**
* The project in which to look for source.
* The array of source locations associated with this locator.
*/
private IProject fProject;
/**
* The debug target this source locator is associated with.
*/
private CDebugTarget fTarget;
private ICSourceLocation[] fSourceLocations;
/**
* The source presentation mode.
@ -49,10 +48,17 @@ public class CSourceLocator implements ICSourceLocator
/**
* Constructor for CSourceLocator.
*/
public CSourceLocator( CDebugTarget target, IProject project )
public CSourceLocator( IProject project )
{
fProject = project;
fTarget = target;
fSourceLocations = getDefaultSourceLocations( project );
}
/**
* Constructor for CSourceLocator.
*/
public CSourceLocator( ICSourceLocation[] locations )
{
fSourceLocations = locations;
}
/* (non-Javadoc)
@ -129,12 +135,27 @@ public class CSourceLocator implements ICSourceLocator
private Object getSourceInput( IStackFrameInfo info )
{
Object result = null;
if ( info != null && fProject != null )
if ( info != null )
{
setInternalMode( ICSourceLocator.MODE_SOURCE );
String fileName = info.getFile();
if ( fileName != null && fileName.length() > 0 )
result = findFile( fProject, fileName );
{
ICSourceLocation[] locations = getSourceLocations();
for ( int i = 0; i < locations.length; ++i )
{
try
{
result = locations[i].findSourceElement( fileName );
}
catch( CoreException e )
{
// do nothing
}
if ( result != null )
break;
}
}
}
// switch to assembly mode if source file not found
/*
@ -144,84 +165,30 @@ public class CSourceLocator implements ICSourceLocator
return result;
}
private Object findFile( IProject project, String fileName )
{
IPath path = new Path( fileName );
fileName = path.toOSString();
/*
* We have a few possible cases: either we get a source file name with no path,
* or we get a fully-qualified filename from the debugger.
*/
String pPath = new String( project.getLocation().toOSString() );
int i;
if ( (i = fileName.indexOf( pPath )) >= 0 )
{
i += pPath.length() + 1;
if ( fileName.length() > i )
return project.getFile( fileName.substring( i ) );
}
// Then just do a search on our project, and if that fails, any dependent projects
IFile f = null;
try
{
f = findFile( (IContainer)project, path );
if ( f != null )
return f;
if ( f == null )
{
IProject[] p = project.getReferencedProjects();
for ( int j= 0; j < p.length; j++ )
{
if ( (f = findFile( (IContainer)p[j], new Path( fileName ) )) != null )
{
return f;
}
}
}
}
catch( CoreException e )
{
}
if ( f != null )
return f;
// Search for an external file
// return findExternalFile( fileName );
return null;
}
private IFile findFile( IContainer parent, IPath name ) throws CoreException
{
if ( name.isAbsolute() )
{
if ( name.toOSString().startsWith( parent.getLocation().toOSString() ) )
{
name = new Path( name.toOSString().substring( parent.getLocation().toOSString().length() + 1 ) );
}
}
IResource found = parent.findMember( name );
if ( found != null && found.getType() == IResource.FILE )
{
return (IFile)found;
}
IResource[] children= parent.members();
for ( int i= 0; i < children.length; i++ )
{
if ( children[i] instanceof IContainer )
{
return findFile( (IContainer)children[i], name );
}
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.ICSourceLocator#getSourceElement(String)
*/
public Object getSourceElement( String fileName )
{
return findFile( fProject, fileName );
Object result = null;
if ( fileName != null && fileName.length() > 0 )
{
ICSourceLocation[] locations = getSourceLocations();
for ( int i = 0; i < locations.length; ++i )
{
try
{
result = locations[i].findSourceElement( fileName );
}
catch( CoreException e )
{
// do nothing
}
if ( result != null )
break;
}
}
return result;
}
/* (non-Javadoc)
@ -245,59 +212,77 @@ public class CSourceLocator implements ICSourceLocator
*/
public boolean contains( IResource resource )
{
if ( resource instanceof IProject )
ICSourceLocation[] locations = getSourceLocations();
for ( int i = 0; i < locations.length; ++i )
{
if ( fProject.equals( resource ) )
if ( resource instanceof IProject )
{
return true;
}
IProject[] projects = getReferencedProjects();
for ( int i = 0; i < projects.length; ++i )
{
if ( projects[i].equals( resource ) )
if ( locations[i] instanceof CProjectSourceLocation &&
((CProjectSourceLocation)locations[i]).equals( resource ) )
{
return true;
}
}
return false;
}
if ( resource instanceof IFile )
{
return containsFile( resource.getLocation() );
}
return false;
}
protected IProject[] getReferencedProjects()
{
IProject[] projects = new IProject[0];
try
{
projects = fProject.getReferencedProjects();
}
catch( CoreException e )
{
CDebugCorePlugin.log( e );
}
return projects;
}
protected boolean containsFile( IPath path )
{
try
{
if ( findFile( (IContainer)fProject, path ) != null )
return true;
IProject[] p = fProject.getReferencedProjects();
for ( int j= 0; j < p.length; j++ )
if ( resource instanceof IFile )
{
if ( findFile( (IContainer)p[j], path ) != null )
return true;
try
{
if ( locations[i].findSourceElement( resource.getLocation().toOSString() ) != null )
return true;
}
catch( CoreException e )
{
}
}
}
catch( CoreException e )
{
}
return false;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator#getSourceLocations()
*/
public ICSourceLocation[] getSourceLocations()
{
return fSourceLocations;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator#setSourceLocations(ICSourceLocation[])
*/
public void setSourceLocations( ICSourceLocation[] locations )
{
fSourceLocations = locations;
}
/**
* Returns a default collection of source locations for
* the given project. Default source locations consist
* of the given project and all of its referenced projects .
*
* @param project a project
* @return a collection of source locations for all required
* projects
* @exception CoreException
*/
public static ICSourceLocation[] getDefaultSourceLocations( IProject project )
{
ArrayList list = new ArrayList();
if ( project != null )
{
try
{
IProject[] projects = project.getReferencedProjects();
list.add( new CProjectSourceLocation( project ) );
for ( int i = 0; i < projects.length; i++ )
{
list.add( new CProjectSourceLocation( projects[i] ) );
}
}
catch( CoreException e )
{
// do nothing
}
}
return (ICSourceLocation[])list.toArray( new ICSourceLocation[list.size()] );
}
}

View file

@ -7,6 +7,7 @@ package org.eclipse.cdt.debug.internal.core.model;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@ -16,7 +17,6 @@ import org.eclipse.cdt.debug.core.CDebugModel;
import org.eclipse.cdt.debug.core.ICBreakpoint;
import org.eclipse.cdt.debug.core.ICExpressionEvaluator;
import org.eclipse.cdt.debug.core.ICLineBreakpoint;
import org.eclipse.cdt.debug.core.ICSourceLocator;
import org.eclipse.cdt.debug.core.ICWatchpoint;
import org.eclipse.cdt.debug.core.IFormattedMemoryBlock;
import org.eclipse.cdt.debug.core.IFormattedMemoryRetrieval;
@ -53,12 +53,16 @@ import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
import org.eclipse.cdt.debug.core.cdi.model.ICDIThread;
import org.eclipse.cdt.debug.core.cdi.model.ICDIWatchpoint;
import org.eclipse.cdt.debug.core.sourcelookup.CDirectorySourceLocation;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
import org.eclipse.cdt.debug.internal.core.CSourceLocator;
import org.eclipse.cdt.debug.internal.core.breakpoints.CBreakpoint;
import org.eclipse.core.resources.IMarkerDelta;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
@ -176,11 +180,6 @@ public class CDebugTarget extends CDebugElement
*/
private int fSuspendCount = 0;
/**
* The source locator for this target.
*/
private ICSourceLocator fSourceLocator = null;
/**
* Collection of breakpoints added to this target. Values are of type <code>ICBreakpoint</code>.
*/
@ -216,11 +215,12 @@ public class CDebugTarget extends CDebugElement
setCDITarget( cdiTarget );
setBreakpoints( new HashMap( 5 ) );
setTemporaryBreakpoints( new ArrayList() );
// Temporary
getLaunch().setSourceLocator( createSourceLocator( project ) );
setConfiguration( cdiTarget.getSession().getConfiguration() );
fSupportsTerminate = allowsTerminate & getConfiguration().supportsTerminate();
fSupportsDisconnect = allowsDisconnect & getConfiguration().supportsDisconnect();
fSourceLocator = createSourceLocator( project );
launch.setSourceLocator( fSourceLocator );
setThreadList( new ArrayList( 5 ) );
initialize();
DebugPlugin.getDefault().getLaunchManager().addLaunchListener( this );
@ -355,9 +355,9 @@ public class CDebugTarget extends CDebugElement
if ( breakpoint instanceof ICBreakpoint )
{
ISourceLocator sl = getSourceLocator();
if ( sl != null && sl instanceof ICSourceLocator )
if ( sl != null && sl instanceof CSourceLocator )
{
return ((ICSourceLocator)sl).contains( breakpoint.getMarker().getResource() );
return ((CSourceLocator)sl).contains( breakpoint.getMarker().getResource() );
}
return true;
}
@ -1513,21 +1513,6 @@ public class CDebugTarget extends CDebugElement
super.fireSuspendEvent( detail );
}
/**
* Creates the source locator for this target.
*
* @return the source locator for this target
*/
private ICSourceLocator createSourceLocator( IProject project )
{
return new CSourceLocator( this, project );
}
protected ICSourceLocator getSourceLocator()
{
return fSourceLocator;
}
protected void setCurrentThread()
{
ICDIThread currentCDIThread = null;
@ -1851,4 +1836,18 @@ public class CDebugTarget extends CDebugElement
targetRequestFailed( e.getMessage(), null );
}
}
protected ISourceLocator getSourceLocator()
{
return getLaunch().getSourceLocator();
}
protected ISourceLocator createSourceLocator( IProject project )
{
CSourceLocator locator = new CSourceLocator( project );
List list = Arrays.asList( locator.getSourceLocations() );
list.add( new CDirectorySourceLocation( new Path( project.getLocation().toOSString() ) ) );
locator.setSourceLocations( (ICSourceLocation[])list.toArray( new ICSourceLocation[list.size()] ) );
return locator;
}
}

View file

@ -22,8 +22,10 @@ import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener;
import org.eclipse.cdt.debug.core.cdi.model.ICDIArgument;
import org.eclipse.cdt.debug.core.cdi.model.ICDIStackFrame;
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IRegisterGroup;
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.IVariable;
@ -177,7 +179,9 @@ public class CStackFrame extends CDebugElement
{
if ( isSuspended() )
{
return ((CDebugTarget)getDebugTarget()).getSourceLocator().getLineNumber( this );
ISourceLocator locator = ((CDebugTarget)getDebugTarget()).getSourceLocator();
if ( locator != null && locator instanceof ICSourceLocator )
return ((ICSourceLocator)locator).getLineNumber( this );
}
return -1;
}