diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/ctagsindexer/CTagsFileReader.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/ctagsindexer/CTagsFileReader.java index 520370e7e42..094f7a82a14 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/ctagsindexer/CTagsFileReader.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/ctagsindexer/CTagsFileReader.java @@ -24,6 +24,8 @@ import org.eclipse.cdt.internal.core.index.IIndexerOutput; import org.eclipse.cdt.internal.core.index.cindexstorage.IndexedFileEntry; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; public class CTagsFileReader { @@ -78,15 +80,28 @@ public class CTagsFileReader { (!currentFileName.equals(fileName))){ currentFileName = fileName; currentFile = (IFile) project.findMember(fileName); - indexer = new MiniIndexer(currentFile); - index.add(currentFile,indexer); + + if (currentFile == null){ + //Didn't find file in project + IPath tempPath = new Path(filename); + tempPath = tempPath.removeLastSegments(1); + tempPath = tempPath.append(fileName); + currentFile = (IFile) project.findMember(tempPath); + + } + + if (currentFile != null){ + indexer = new MiniIndexer(currentFile); + index.add(currentFile,indexer); + //encode new tag in current file + char[][] fullName = parser.getQualifiedName(tagEntry); + //encode name + String lineNumber = (String) tagEntry.tagExtensionField.get(CTagsConsoleParser.LINE); + indexer.addToOutput(fullName,(String)tagEntry.tagExtensionField.get(CTagsConsoleParser.KIND), Integer.parseInt(lineNumber)); + } } - //encode new tag in current file - char[][] fullName = parser.getQualifiedName(tagEntry); - //encode name - String lineNumber = (String) tagEntry.tagExtensionField.get(CTagsConsoleParser.LINE); - indexer.addToOutput(fullName,(String)tagEntry.tagExtensionField.get(CTagsConsoleParser.KIND), Integer.parseInt(lineNumber)); + } } catch (IOException e){} } diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/ctagsindexer/CTagsIndexAll.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/ctagsindexer/CTagsIndexAll.java index 175175f7938..d07e1ed46e8 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/ctagsindexer/CTagsIndexAll.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/ctagsindexer/CTagsIndexAll.java @@ -15,6 +15,8 @@ import java.io.IOException; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CommandLauncher; +import org.eclipse.cdt.core.ICDescriptor; +import org.eclipse.cdt.core.ICExtensionReference; import org.eclipse.cdt.core.model.ICModelMarker; import org.eclipse.cdt.internal.core.index.IIndex; import org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer; @@ -35,6 +37,7 @@ import org.eclipse.core.runtime.Path; class CTagsIndexAll extends CTagsIndexRequest { IProject project; static String ctagsFile = CCorePlugin.getDefault().getStateLocation().append("tempctags").toOSString(); //$NON-NLS-1$ + private String ctagsFileToUse; public CTagsIndexAll(IProject project, CTagsIndexer indexer) { super(project.getFullPath(), indexer); @@ -75,21 +78,30 @@ class CTagsIndexAll extends CTagsIndexRequest { project.deleteMarkers(ICModelMarker.INDEXER_MARKER, true,IResource.DEPTH_ZERO); } catch (CoreException e) {} - if (AbstractIndexer.TIMING) - startTime = System.currentTimeMillis(); - //run CTags over project - boolean success = runCTags(); + boolean success=false; - if (AbstractIndexer.TIMING){ - cTagsEndTime = System.currentTimeMillis(); - System.out.println("CTags Run: " + (cTagsEndTime - startTime)); //$NON-NLS-1$ - System.out.flush(); - } + if (useInternalCTagsFile()){ + if (AbstractIndexer.TIMING) + startTime = System.currentTimeMillis(); + + + //run CTags over project + success = runCTags(); + ctagsFileToUse=ctagsFile; + + if (AbstractIndexer.TIMING){ + cTagsEndTime = System.currentTimeMillis(); + System.out.println("CTags Run: " + (cTagsEndTime - startTime)); //$NON-NLS-1$ + System.out.flush(); + } + } else { + success=getCTagsFileLocation(); + } if (success) { //Parse the CTag File - CTagsFileReader reader = new CTagsFileReader(project,ctagsFile,indexer); + CTagsFileReader reader = new CTagsFileReader(project,ctagsFileToUse,indexer); reader.setIndex(index); reader.parse(); @@ -170,4 +182,50 @@ class CTagsIndexAll extends CTagsIndexRequest { return "indexing project " + this.project.getFullPath(); //$NON-NLS-1$ } + private boolean useInternalCTagsFile(){ + try { + ICDescriptor cdesc = CCorePlugin.getDefault().getCProjectDescription(project, false); + if (cdesc == null) + return true; + + ICExtensionReference[] cext = cdesc.get(CCorePlugin.INDEXER_UNIQ_ID); + if (cext.length > 0) { + for (int i = 0; i < cext.length; i++) { + String id = cext[i].getID(); + String orig = cext[i].getExtensionData("ctagfiletype"); //$NON-NLS-1$ + if (orig != null){ + if (orig.equals(CTagsIndexer.CTAGS_INTERNAL)) + return true; + else if (orig.equals(CTagsIndexer.CTAGS_EXTERNAL)) + return false; + } + } + } + } catch (CoreException e) {} + + return false; + } + + private boolean getCTagsFileLocation() { + try { + ICDescriptor cdesc = CCorePlugin.getDefault().getCProjectDescription(project, false); + if (cdesc == null) + return false; + + ICExtensionReference[] cext = cdesc.get(CCorePlugin.INDEXER_UNIQ_ID); + if (cext.length > 0) { + for (int i = 0; i < cext.length; i++) { + String id = cext[i].getID(); + String orig = cext[i].getExtensionData("ctagfilelocation"); //$NON-NLS-1$ + if (orig != null){ + ctagsFileToUse=orig; + return true; + } + } + } + } catch (CoreException e) {} + + return false; + } + } diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/ctagsindexer/CTagsIndexer.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/ctagsindexer/CTagsIndexer.java index 56b2e588fb6..d963f38ba3c 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/ctagsindexer/CTagsIndexer.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/ctagsindexer/CTagsIndexer.java @@ -38,6 +38,10 @@ import org.eclipse.core.runtime.IPath; */ public class CTagsIndexer extends AbstractCExtension implements ICDTIndexer { + public final static String CTAGS_INTERNAL = "ctags_internal"; //$NON-NLS-1$ + public final static String CTAGS_EXTERNAL = "ctags_external"; //$NON-NLS-1$ + public final static String CTAGS_LOCATION = "ctags_location"; //$NON-NLS-1$ + private CIndexStorage indexStorage = null; public ReadWriteMonitor storageMonitor = null; private IndexManager indexManager = null; diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/nullindexer/NullIndexer.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/nullindexer/NullIndexer.java new file mode 100644 index 00000000000..2d35505c312 --- /dev/null +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/nullindexer/NullIndexer.java @@ -0,0 +1,84 @@ +package org.eclipse.cdt.internal.core.index.nullindexer; + +import java.io.IOException; + +import org.eclipse.cdt.core.AbstractCExtension; +import org.eclipse.cdt.core.index.ICDTIndexer; +import org.eclipse.cdt.core.index.IIndexStorage; +import org.eclipse.cdt.internal.core.index.IIndex; +import org.eclipse.cdt.internal.core.index.IIndexerOutput; +import org.eclipse.cdt.internal.core.search.processing.IIndexJob; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.runtime.IPath; + +public class NullIndexer extends AbstractCExtension implements ICDTIndexer { + + public int getIndexerFeatures() { + // TODO Auto-generated method stub + return 0; + } + + public void addRequest(IProject project, IResourceDelta delta, int kind) { + // TODO Auto-generated method stub + + } + + public void removeRequest(IProject project, IResourceDelta delta, int kind) { + // TODO Auto-generated method stub + + } + + public void indexJobFinishedNotification(IIndexJob job) { + // TODO Auto-generated method stub + + } + + public void shutdown() { + // TODO Auto-generated method stub + + } + + public void notifyIdle(long idlingTime) { + // TODO Auto-generated method stub + + } + + public void notifyIndexerChange(IProject project) { + // TODO Auto-generated method stub + + } + + public boolean isIndexEnabled(IProject project) { + // TODO Auto-generated method stub + return false; + } + + public IIndexStorage getIndexStorage() { + // TODO Auto-generated method stub + return null; + } + + public IIndex getIndex(IPath path, boolean reuseExistingFile, + boolean createIfMissing) { + // TODO Auto-generated method stub + return null; + } + + public void indexerRemoved(IProject project) { + // TODO Auto-generated method stub + + } + + public void index(IFile document, IIndexerOutput output) throws IOException { + // TODO Auto-generated method stub + + } + + public boolean shouldIndex(IFile file) { + // TODO Auto-generated method stub + return false; + } + +} diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexer.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexer.java index f1aec11f4c5..a7f5e405ac8 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexer.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexer.java @@ -218,7 +218,8 @@ public class SourceIndexer extends AbstractCExtension implements ICDTIndexer { if( project == null || !project.exists() || !project.isOpen() ) return false; - Boolean indexValue = null; + return true; + /*Boolean indexValue = null; try { indexValue = (Boolean) project.getSessionProperty(activationKey); @@ -248,7 +249,7 @@ public class SourceIndexer extends AbstractCExtension implements ICDTIndexer { } catch (CoreException e) {} - return indexEnabled; + return indexEnabled;*/ } diff --git a/core/org.eclipse.cdt.core/plugin.properties b/core/org.eclipse.cdt.core/plugin.properties index b9c32f4fbfa..cedf9712349 100644 --- a/core/org.eclipse.cdt.core/plugin.properties +++ b/core/org.eclipse.cdt.core/plugin.properties @@ -68,4 +68,9 @@ cxxSourceName=C++ Source File cxxHeaderName=C++ Header File asmSourceName=Assembly Source File -cdt_pathentry_var.description=CDT PathEntry Variable \ No newline at end of file +cdt_pathentry_var.description=CDT PathEntry Variable + +CDTIndexer.originalsourceindexer=Original C/C++ Indexer +CDTIndexer.domsourceindexer=DOM AST C/C++ Indexer +CDTIndexer.ctagsindexer=CTags Indexer +CDTIndexer.nullindexer=No Indexer \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/plugin.xml b/core/org.eclipse.cdt.core/plugin.xml index 4fcbe24065d..a78e1221a9e 100644 --- a/core/org.eclipse.cdt.core/plugin.xml +++ b/core/org.eclipse.cdt.core/plugin.xml @@ -529,7 +529,7 @@ @@ -539,7 +539,7 @@ @@ -562,11 +562,21 @@ + class="org.eclipse.cdt.internal.core.index.ctagsindexer.CTagsIndexer"> + + + + + + diff --git a/core/org.eclipse.cdt.ui/plugin.properties b/core/org.eclipse.cdt.ui/plugin.properties index 3e32ddd02ef..17fd690f8cb 100644 --- a/core/org.eclipse.cdt.ui/plugin.properties +++ b/core/org.eclipse.cdt.ui/plugin.properties @@ -309,3 +309,12 @@ c.contextType.name = C # completion completionContributors=Code Assist Completion Contributor + +# Indexer Preference Name +indexerPrefName=Indexer + +# indexer names +CDTIndexer.originalsourceindexer=Original C/C++ Indexer +CDTIndexer.domsourceindexer=DOM AST C/C++ Indexer +CDTIndexer.ctagsindexer=CTags Indexer +CDTIndexer.nullindexer=No Indexer diff --git a/core/org.eclipse.cdt.ui/plugin.xml b/core/org.eclipse.cdt.ui/plugin.xml index c8570c06466..c0ed54c2a4c 100644 --- a/core/org.eclipse.cdt.ui/plugin.xml +++ b/core/org.eclipse.cdt.ui/plugin.xml @@ -637,6 +637,11 @@ class="org.eclipse.cdt.internal.ui.preferences.PathEntryVariablePreferencePage" id="org.eclipse.cdt.ui.preferences.PathEntryVariablePreferencePage"> +