diff --git a/debug/org.eclipse.cdt.debug.core/ChangeLog b/debug/org.eclipse.cdt.debug.core/ChangeLog index 14f0f581f86..1ecc1a62d15 100644 --- a/debug/org.eclipse.cdt.debug.core/ChangeLog +++ b/debug/org.eclipse.cdt.debug.core/ChangeLog @@ -1,3 +1,9 @@ +2003-10-15 Mikhail Khodjaiants + Improving the source search algorithms. + * CDirectorySourceLocation.java + * CProjectSourceLocation.java + * CSourceLocator.java + 2003-10-14 Mikhail Khodjaiants Improved the source search algorithm. * CProjectSourceLocation.java diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CDirectorySourceLocation.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CDirectorySourceLocation.java index 86e280423c4..55239f311d9 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CDirectorySourceLocation.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CDirectorySourceLocation.java @@ -9,6 +9,7 @@ import java.io.File; import java.io.IOException; import java.io.StringReader; import java.text.MessageFormat; +import java.util.LinkedList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -177,11 +178,16 @@ public class CDirectorySourceLocation implements IDirectorySourceLocation } // Try for a file in another workspace project - IFile f = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation( filePath ); - if ( f != null && f.exists() ) - { - return f; - } + IFile[] wsFiles = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation( filePath ); + LinkedList list = new LinkedList(); + for ( int j = 0; j < wsFiles.length; ++j ) + if ( wsFiles[j].exists() ) + if ( !searchForDuplicateFileNames() ) + return wsFiles[j]; + else + list.add( wsFiles[j] ); + if ( list.size() > 0 ) + return list; file = filePath.toFile(); if ( file.exists() ) @@ -201,12 +207,18 @@ public class CDirectorySourceLocation implements IDirectorySourceLocation if ( file.exists() ) { path = new Path( file.getAbsolutePath() ); // can't use getCanonicalPath because of links - IFile f = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation( path ); - if ( f != null && f.exists() ) - { - return f; - } - return createExternalFileStorage( path ); + IFile[] wsFiles = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation( path ); + LinkedList list = new LinkedList(); + for ( int j = 0; j < wsFiles.length; ++j ) + if ( wsFiles[j].exists() ) + if ( !searchForDuplicateFileNames() ) + return wsFiles[j]; + else + list.add( wsFiles[j] ); + if ( list.size() > 0 ) + return list; + else + return createExternalFileStorage( path ); } } return null; @@ -355,4 +367,10 @@ public class CDirectorySourceLocation implements IDirectorySourceLocation String pathString = path.removeLastSegments( path.segmentCount() - segCount ).toOSString(); return prefixString.equalsIgnoreCase( pathString ); } + + protected boolean searchForDuplicateFileNames() + { + // for now + return false; + } } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CProjectSourceLocation.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CProjectSourceLocation.java index 8a587f56139..5c97e01e0e0 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CProjectSourceLocation.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CProjectSourceLocation.java @@ -22,6 +22,7 @@ import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.CDebugUtils; import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocation; import org.eclipse.cdt.debug.core.sourcelookup.IProjectSourceLocation; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceProxy; @@ -76,7 +77,6 @@ public class CProjectSourceLocation implements IProjectSourceLocation { setProject( project ); fGenerated = true; -// initializeFolders(); } /** @@ -86,7 +86,6 @@ public class CProjectSourceLocation implements IProjectSourceLocation { setProject( project ); fGenerated = generated; -// initializeFolders(); } /* (non-Javadoc) @@ -151,24 +150,22 @@ public class CProjectSourceLocation implements IProjectSourceLocation private Object doFindSourceElement( String name ) { File file = new File( name ); - return ( file.isAbsolute() ) ? findFileByAbsolutePath( name ) : - findFileByRelativePath( name ); + return ( file.isAbsolute() ) ? findFileByAbsolutePath( file ) : findFileByRelativePath( name ); } - private Object findFileByAbsolutePath( String name ) + private Object findFileByAbsolutePath( File file ) { - File file = new File( name ); LinkedList list = new LinkedList(); - if ( file.isAbsolute() && file.exists() ) + if ( file.exists() ) { - IResource[] folders = getFolders(); - for ( int i = 0; i < folders.length; ++i ) - { - Object result = findFile( folders[i], file ); - if ( !searchForDuplicateFileNames() ) - return result; - list.add( result ); - } + IPath path = new Path( file.getAbsolutePath() ); + IFile[] wsFiles = CDebugCorePlugin.getWorkspace().getRoot().findFilesForLocation( path ); + for ( int i = 0; i < wsFiles.length; ++i ) + if ( wsFiles[i].getProject().equals( getProject() ) && wsFiles[i].exists() ) + if ( !searchForDuplicateFileNames() ) + return wsFiles[i]; + else + list.add( wsFiles[i] ); } return ( list.size() > 0 ) ? list : null; } @@ -182,110 +179,21 @@ public class CProjectSourceLocation implements IProjectSourceLocation if ( list.size() > 0 && !searchForDuplicateFileNames() ) break; IPath path = folders[i].getLocation().append( fileName ); - Object result = findFile( folders[i], new File( path.toOSString() ) ); - if ( result != null ) + File file = new File( path.toOSString() ); + if ( file.exists() ) { - if ( !searchForDuplicateFileNames() ) - return result; - list.add( result ); + IFile[] wsFiles = CDebugCorePlugin.getWorkspace().getRoot().findFilesForLocation( path ); + for ( int j = 0; j < wsFiles.length; ++j ) + if ( wsFiles[j].exists() ) + if ( !searchForDuplicateFileNames() ) + return wsFiles[j]; + else + list.add( wsFiles[j] ); } } return ( list.size() > 0 ) ? list : null; } -// private Object findFile( final File file ) -// { -// if ( file != null ) -// { -// final String name = file.getName(); -// IResource[] folders = getFolders(); -// final LinkedList list = new LinkedList(); -// for ( int i = 0; i < folders.length; ++i ) -// { -// if ( list.size() > 0 && !searchForDuplicateFileNames() ) -// break; -// try -// { -// folders[i].accept( -// new IResourceProxyVisitor() -// { -// public boolean visit( IResourceProxy proxy ) throws CoreException -// { -// // use equalsIgnoreCase to make it work for Wondows -// if ( proxy.getType() == IResource.FILE && proxy.getName().equalsIgnoreCase( name ) ) -// { -// IResource resource = proxy.requestResource(); -// File file1 = new File( resource.getLocation().toOSString() ); -// if ( file1.exists() && file1.equals( file ) ) -// list.addLast( resource ); -// return false; -// } -// else if ( proxy.getType() == IResource.FOLDER ) -// return false; -// return true; -// } -// }, -// IResource.NONE ); -// } -// catch( CoreException e ) -// { -// } -// } -// if ( list.size() == 1 || (list.size() > 0 && !searchForDuplicateFileNames()) ) -// return list.getFirst(); -// if ( list.size() > 0 ) -// return list; -// } -// return null; -// } - - private Object findFile( IResource folder, final File file ) - { - // The workspace resources are case-sensitive, so we can not just - // append the file name to the folder name and check if the result exists. - - final Object[] result = new Object[] { null }; - if ( file != null && folder != null ) - { - final String name = file.getName(); - IPath dirPath = new Path( file.getAbsolutePath() ); - dirPath = dirPath.removeLastSegments( 1 ); - final File dir = new File( dirPath.toOSString() ); - if ( dir.equals( folder.getLocation().toFile() ) ) - { - try - { - folder.accept( - new IResourceProxyVisitor() - { - public boolean visit( IResourceProxy proxy ) throws CoreException - { - if ( result[0] != null ) - return false; - // use equalsIgnoreCase to make it work for Wondows - if ( proxy.getType() == IResource.FILE && proxy.getName().equalsIgnoreCase( name ) ) - { - IResource resource = proxy.requestResource(); - File file1 = new File( resource.getLocation().toOSString() ); - if ( file1.exists() && file1.equals( file ) ) - result[0] = resource; - return false; - } - else if ( proxy.getType() == IResource.FOLDER ) - return false; - return true; - } - }, - IResource.NONE ); - } - catch( CoreException e ) - { - } - } - } - return result[0]; - } - private Object cacheLookup( String name ) { return fCache.get( name ); @@ -362,7 +270,6 @@ public class CProjectSourceLocation implements IProjectSourceLocation if ( isGeneric == null || isGeneric.trim().length() == 0 ) isGeneric = Boolean.FALSE.toString(); setGenerated( isGeneric.equals( Boolean.TRUE.toString() ) ); -// initializeFolders(); return; } catch( ParserConfigurationException e ) diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourceLocator.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourceLocator.java index 7f9e30dde75..eee18af8aa0 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourceLocator.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/CSourceLocator.java @@ -6,7 +6,6 @@ package org.eclipse.cdt.debug.internal.core.sourcelookup; -import java.io.File; import java.io.IOException; import java.io.StringReader; import java.text.MessageFormat; @@ -21,7 +20,6 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.xerces.dom.DocumentImpl; -import org.eclipse.cdt.core.resources.FileStorage; import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.CDebugUtils; import org.eclipse.cdt.debug.core.model.IStackFrameInfo; @@ -36,10 +34,8 @@ import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IWorkspace; -import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.model.IPersistableSourceLocator; @@ -122,23 +118,19 @@ public class CSourceLocator implements ICSourceLocator, IPersistableSourceLocato String fileName = info.getFile(); if ( fileName != null && fileName.length() > 0 ) { - result = findFileByAbsolutePath( fileName ); - if ( result == null ) + ICSourceLocation[] locations = getSourceLocations(); + for ( int i = 0; i < locations.length; ++i ) { - ICSourceLocation[] locations = getSourceLocations(); - for ( int i = 0; i < locations.length; ++i ) + try { - try - { - result = locations[i].findSourceElement( fileName ); - } - catch( CoreException e ) - { - // do nothing - } - if ( result != null ) - break; + result = locations[i].findSourceElement( fileName ); } + catch( CoreException e ) + { + // do nothing + } + if ( result != null ) + break; } } } @@ -165,7 +157,10 @@ public class CSourceLocator implements ICSourceLocator, IPersistableSourceLocato { try { - if ( locations[i].findSourceElement( resource.getLocation().toOSString() ) != null ) + Object result = locations[i].findSourceElement( resource.getLocation().toOSString() ); + if ( result instanceof IFile && ((IFile)result).equals( resource ) ) + return true; + if ( result instanceof List && ((List)result).contains( resource ) ) return true; } catch( CoreException e ) @@ -248,29 +243,6 @@ public class CSourceLocator implements ICSourceLocator, IPersistableSourceLocato return false; } - private Object findFileByAbsolutePath( String fileName ) - { - File file = new File( fileName ); - if ( file.isAbsolute() && file.exists() ) - { - try - { - Path path = new Path( file.getCanonicalPath() ); - // Try for a file in another workspace project - IFile f = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation( path ); - if ( f != null && f.exists() ) - { - return f; - } - return new FileStorage( path ); - } - catch( IOException e ) - { - } - } - return null; - } - /* (non-Javadoc) * @see org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator#findSourceElement(String) */ @@ -279,23 +251,19 @@ public class CSourceLocator implements ICSourceLocator, IPersistableSourceLocato Object result = null; if ( fileName != null && fileName.length() > 0 ) { - result = findFileByAbsolutePath( fileName ); - if ( result == null ) + ICSourceLocation[] locations = getSourceLocations(); + for ( int i = 0; i < locations.length; ++i ) { - ICSourceLocation[] locations = getSourceLocations(); - for ( int i = 0; i < locations.length; ++i ) + try { - try - { - result = locations[i].findSourceElement( fileName ); - } - catch( CoreException e ) - { - // do nothing - } - if ( result != null ) - break; + result = locations[i].findSourceElement( fileName ); } + catch( CoreException e ) + { + // do nothing + } + if ( result != null ) + break; } } return result;