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">
+