diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNode.java
index 5003a61f03b..3ea372273d8 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNode.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNode.java
@@ -108,14 +108,4 @@ public interface IASTNode {
*/
public String getRawSignature();
- /**
- * Internal interface.
- *
- * Get the scope for this node. Different children may get different nodes.
- *
- * @param childProperty
- * @return
- */
- public IScope2 getScope(IASTNode child, ASTNodeProperty childProperty);
-
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IScope2.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IScope2.java
deleted file mode 100644
index f43048be1d3..00000000000
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IScope2.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 QNX Software Systems 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:
- * QNX - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.cdt.core.dom.ast;
-
-/**
- * @author Doug Schaefer
- *
- */
-public interface IScope2 {
-
- public IBinding getBinding(IASTName name);
-
-}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java
index d9ebd031b5b..5b06431a85c 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTNode.java
@@ -16,7 +16,6 @@ import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
-import org.eclipse.cdt.core.dom.ast.IScope2;
/**
* @author jcamelon
@@ -103,10 +102,6 @@ public abstract class ASTNode implements IASTNode {
return fileLocation;
}
- public IScope2 getScope(IASTNode child, ASTNodeProperty childProperty) {
- return parent != null ? parent.getScope(this, property) : null;
- }
-
public IASTTranslationUnit getTranslationUnit() {
return parent != null ? parent.getTranslationUnit() : null;
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java
index d57e65aacf3..ed4e0f5c809 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java
@@ -39,20 +39,9 @@ public class CASTName extends CASTNode implements IASTName {
name = EMPTY_CHAR_ARRAY;
}
- private static boolean inited = false;
- private static boolean useScope2 = false;
-
public IBinding resolveBinding() {
if (binding == null) {
- if (!inited) {
- useScope2 = System.getProperty("doug.useScope2") != null ? true : false;
- inited = true;
- }
-
- if (useScope2)
- binding = getScope(this, getPropertyInParent()).getBinding(this);
- else
- CVisitor.createBinding(this);
+ CVisitor.createBinding(this);
}
return binding;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java
index 0538d1c8c63..ec7f64128de 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java
@@ -24,6 +24,7 @@ import org.eclipse.cdt.core.dom.IPDOMVisitor;
import org.eclipse.cdt.core.dom.IPDOMWriter;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.model.ICProject;
@@ -164,50 +165,20 @@ public class PDOM extends PlatformObject
return fileIndex;
}
- /**
- * @deprecated
- */
- public void addSymbols(ITranslationUnit tu) throws CoreException {
- final ILanguage language = tu.getLanguage();
- if (language == null)
- return;
-
- final PDOMLinkage linkage = getLinkage(language);
- if (linkage == null)
- return;
-
- IASTTranslationUnit ast = language.getASTTranslationUnit(tu,
- ILanguage.AST_USE_INDEX |
- ILanguage.AST_SKIP_INDEXED_HEADERS |
- ILanguage.AST_SKIP_IF_NO_BUILD_INFO);
- if (ast == null)
- return;
-
- ast.accept(new ASTVisitor() {
- {
- shouldVisitNames = true;
- shouldVisitDeclarations = true;
- }
-
- public int visit(IASTName name) {
- try {
- linkage.addName(name);
- return PROCESS_CONTINUE;
- } catch (CoreException e) {
- CCorePlugin.log(e);
- return PROCESS_ABORT;
- }
- };
- });;
-
- fireChange();
- }
-
public void addSymbols(ILanguage language, IASTTranslationUnit ast) throws CoreException {
final PDOMLinkage linkage = getLinkage(language);
if (linkage == null)
return;
+ IASTPreprocessorIncludeStatement[] includes = ast.getIncludeDirectives();
+ for (int i = 0; i < includes.length; ++i) {
+ IASTPreprocessorIncludeStatement include = includes[i];
+
+ String sourcePath = include.getFileLocation().getFileName();
+ String destPath = include.getPath();
+ //System.out.println(sourcePath + " -> " + destPath);
+ }
+
ast.accept(new ASTVisitor() {
{
shouldVisitNames = true;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMCodeReaderFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMCodeReaderFactory.java
index 85e804844a1..c328abda0ea 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMCodeReaderFactory.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMCodeReaderFactory.java
@@ -59,6 +59,13 @@ public class PDOMCodeReaderFactory implements ICodeReaderFactory {
return new CodeReader(tu.getResource().getLocation().toOSString(), tu.getContents());
}
+ private static class SkippedInclusion extends CodeReader {
+ private static char[] buffer = "".toCharArray();
+ public SkippedInclusion(String filename) {
+ super(filename, buffer);
+ }
+ }
+
public CodeReader createCodeReaderForInclusion(String path) {
// Don't parse inclusion if it is already captured
try {
@@ -70,7 +77,7 @@ public class PDOMCodeReaderFactory implements ICodeReaderFactory {
PDOMFile file = PDOMFile.find(pdom, path);
if (file != null && file.getFirstName() != null)
// Already got things from here
- return null;
+ return new SkippedInclusion(path);
} catch (CoreException e) {
CCorePlugin.log(new CoreException(new Status(IStatus.ERROR,
CCorePlugin.PLUGIN_ID, 0, "PDOM Exception", e)));
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java
index 727254dac08..f442eb37691 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java
@@ -27,10 +27,12 @@ import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.core.runtime.preferences.InstanceScope;
@@ -143,17 +145,47 @@ public class PDOMManager implements IPDOMManager, IElementChangedListener {
if (ref != null && ref.length > 0) {
indexerId = ref[0].getID();
}
+ if (indexerId != null) {
+ // Make sure it is a valid indexer
+ IExtension indexerExt = Platform.getExtensionRegistry()
+ .getExtension(CCorePlugin.INDEXER_UNIQ_ID, indexerId);
+ if (indexerExt == null) {
+ // It is not, forget about it.
+ indexerId = null;
+ }
+ }
} catch (CoreException e) {
}
if (indexerId == null)
// make it the default
indexerId = getDefaultIndexerId();
+
+ // Start a job to set the id.
+ new SetId(project, indexerId).schedule();
}
return indexerId;
}
- public void setIndexerId(ICProject project, String indexerId) throws CoreException {
+ private static class SetId extends Job {
+ private final ICProject project;
+ private final String indexerId;
+ public SetId(ICProject project, String indexerId) {
+ super("Set Indexer Id");
+ this.project = project;
+ this.indexerId = indexerId;
+ }
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ setId(project, indexerId);
+ return Status.OK_STATUS;
+ } catch (CoreException e) {
+ return e.getStatus();
+ }
+ }
+ }
+
+ private static void setId(ICProject project, String indexerId) throws CoreException {
IEclipsePreferences prefs = new ProjectScope(project.getProject()).getNode(CCorePlugin.PLUGIN_ID);
if (prefs == null)
return; // TODO why would this be null?
@@ -163,7 +195,10 @@ public class PDOMManager implements IPDOMManager, IElementChangedListener {
prefs.flush();
} catch (BackingStoreException e) {
}
-
+ }
+
+ public void setIndexerId(ICProject project, String indexerId) throws CoreException {
+ setId(project, indexerId);
IPDOM pdom = getPDOM(project);
pdom.setIndexer(createIndexer(indexerId));
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java
index 0b60995c73f..dd5d80dc75f 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java
@@ -19,7 +19,6 @@ import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
-import org.eclipse.cdt.core.dom.ast.IScope2;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.core.runtime.CoreException;
@@ -321,11 +320,6 @@ public class PDOMName implements IASTName, IASTFileLocation {
}
}
- public IScope2 getScope(IASTNode child, ASTNodeProperty childProperty) {
- // TODO Auto-generated method stub
- return null;
- }
-
public void delete() throws CoreException {
// Delete from the binding chain
PDOMName prevName = getPrevInBinding();
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMTranslationUnit.java
index b64e651f627..04ce58439b2 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMTranslationUnit.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMTranslationUnit.java
@@ -25,7 +25,6 @@ import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
-import org.eclipse.cdt.core.dom.ast.IScope2;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.parser.ParserLanguage;
@@ -158,10 +157,6 @@ public class PDOMTranslationUnit implements IASTTranslationUnit {
throw new PDOMNotImplementedError();
}
- public IScope2 getScope(IASTNode child, ASTNodeProperty childProperty) {
- throw new PDOMNotImplementedError();
- }
-
public ILanguage getLanguage() {
throw new PDOMNotImplementedError();
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ctags/CtagsIndexer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ctags/CtagsIndexer.java
new file mode 100644
index 00000000000..acefb484019
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ctags/CtagsIndexer.java
@@ -0,0 +1,293 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.core.pdom.indexer.ctags;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.dom.IPDOM;
+import org.eclipse.cdt.core.dom.IPDOMIndexer;
+import org.eclipse.cdt.core.model.ICElementDelta;
+import org.eclipse.cdt.internal.core.pdom.PDOM;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IPreferencesService;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.osgi.service.prefs.BackingStoreException;
+
+/**
+ * @author Doug Schaefer
+ */
+public class CtagsIndexer implements IPDOMIndexer {
+
+ private PDOM pdom;
+
+ private boolean useCtagsOnPath = true;
+ private String ctagsCommand = ""; //$NON-NLS-1$
+ private boolean useInternalCtagsFile = true;
+ private String ctagsFileName = ""; //$NON-NLS-1$
+
+ public void handleDelta(ICElementDelta delta) {
+ // TODO Auto-generated method stub
+ }
+
+ public void reindex() throws CoreException {
+ new CtagsReindex(this).schedule();
+ }
+
+ public void setPDOM(IPDOM pdom) {
+ this.pdom = (PDOM)pdom;
+ loadPreferences();
+ }
+
+ public IPDOM getPDOM() {
+ return pdom;
+ }
+
+ // Indexing functions
+ void runCtags(IPath sourcePath) {
+ String ctagsFileName = getResolvedCtagsFileName();
+ String[] cmd = new String[] {
+ getResolvedCtagsCommand(),
+ "--excmd=number", //$NON-NLS-1$
+ "--format=2", //$NON-NLS-1$
+ "--sort=no", //$NON-NLS-1$
+ "--fields=aiKlmnsSz", //$NON-NLS-1$
+ "--c-types=cdefgmnpstuvx", //$NON-NLS-1$
+ "--c++-types=cdefgmnpstuvx", //$NON-NLS-1$
+ "--languages=c,c++", //$NON-NLS-1$
+ "-a", //$NON-NLS-1$ // All locations are collected in one file
+ "-f", //$NON-NLS-1$
+ ctagsFileName,
+ "-R", //$NON-NLS-2$
+ sourcePath.toOSString() // Give absolute path so that tag file entries will be absolute
+ };
+
+ try {
+ // Run ctags
+ Process p = Runtime.getRuntime().exec(cmd);
+ p.waitFor();
+
+ // Parse the ctags file
+ processCtagsFile(ctagsFileName);
+ } catch (InterruptedException e) {
+ return;
+ } catch (IOException e) {
+ CCorePlugin.log(e);
+ return;
+ } catch (CoreException e) {
+ CCorePlugin.log(e);
+ return;
+ }
+ }
+
+ private void processCtagsFile(String ctagsFileName) throws IOException, CoreException {
+ BufferedReader reader = new BufferedReader(new FileReader(ctagsFileName));
+ for (String line = reader.readLine(); line != null; line = reader.readLine()) {
+ if (line.charAt(0) == '!')
+ // skip over header
+ continue;
+
+ String elementName = null;
+ String fileName = null;
+ int lineNum = -1;
+ Map fields = new HashMap();
+
+ StringTokenizer tokenizer = new StringTokenizer(line, "\t"); //$NON-NLS-1$
+ for (int state = 0; tokenizer.hasMoreTokens(); ++state) {
+ String token = tokenizer.nextToken();
+ switch (state) {
+ case 0:
+ // element name
+ elementName = token;
+ break;
+ case 1:
+ // file name
+ fileName = token;
+ break;
+ case 2:
+ // line number
+ try {
+ token = token.trim();
+ int i = token.indexOf(';');
+ lineNum = Integer.parseInt(token.substring(0, i));
+ } catch (NumberFormatException e) {
+ // Not sure what the line number is.
+ lineNum = -1;
+ }
+ break;
+
+ default:
+ // extension field
+ int i = token.indexOf(':');
+ if (i != -1) {
+ String key = token.substring(0, i);
+ String value = token.substring(i + 1);
+ fields.put(key, value);
+ }
+ }
+ }
+
+ if (elementName != null && fileName != null)
+ new CtagsName(pdom, fileName, lineNum, elementName, fields).addToPDOM();
+ }
+ }
+
+ // Preference Management
+ private static final String useCtagsOnPathId = "useCtagsOnPath"; //$NON-NLS-1$
+ private static final String ctagsCommandId = "ctagsCommand"; //$NON-NLS-1$
+ private static final String useInternalCtagsFileId = "useInternalCtagsFile"; //$NON-NLS-$
+ private static final String ctagsFileNameId = "ctagsFileName"; //$NON-NLS-1$
+
+ // project preferences
+ private void loadPreferences() {
+ IProject project = pdom.getProject().getProject();
+ IEclipsePreferences prefs = new ProjectScope(project.getProject()).getNode(CCorePlugin.PLUGIN_ID);
+ if (prefs == null)
+ return;
+
+ useCtagsOnPath = prefs.getBoolean(useCtagsOnPathId, getDefaultUseCtagsOnPath());
+ ctagsCommand = prefs.get(ctagsCommandId, getDefaultCtagsCommand());
+ useInternalCtagsFile = prefs.getBoolean(useInternalCtagsFileId, getDefaultUseInternalCtagsFile());
+ ctagsFileName = prefs.get(ctagsFileNameId, getDefaultCtagsFileName());
+ }
+
+ public void setPreferences(
+ boolean useCtagsOnPath,
+ String ctagsCommand,
+ boolean useInternalCtagsFile,
+ String ctagsFileName) {
+
+ IProject project = pdom.getProject().getProject();
+ IEclipsePreferences prefs = new ProjectScope(project.getProject()).getNode(CCorePlugin.PLUGIN_ID);
+ if (prefs == null)
+ return;
+
+ boolean changed = false;
+ if (this.useCtagsOnPath != useCtagsOnPath) {
+ this.useCtagsOnPath = useCtagsOnPath;
+ prefs.putBoolean(useCtagsOnPathId, useCtagsOnPath);
+ changed = true;
+ }
+
+ if (! this.ctagsCommand.equals(ctagsCommand)) {
+ this.ctagsCommand = ctagsCommand;
+ prefs.put(ctagsCommandId, ctagsCommand);
+ changed = true;
+ }
+
+ if (this.useInternalCtagsFile != useInternalCtagsFile) {
+ this.useInternalCtagsFile = useInternalCtagsFile;
+ prefs.putBoolean(useInternalCtagsFileId, useInternalCtagsFile);
+ changed = true;
+ }
+
+ if (! this.ctagsFileName.equals(ctagsFileName)) {
+ this.ctagsFileName = ctagsFileName;
+ prefs.put(ctagsFileNameId, ctagsFileName);
+ changed = true;
+ }
+
+ if (changed) {
+ try {
+ prefs.flush();
+ } catch (BackingStoreException e) {
+ CCorePlugin.log(e);
+ }
+ }
+
+ }
+
+ public boolean useCtagsOnPath() {
+ return useCtagsOnPath;
+ }
+
+ public String getCtagsCommand() {
+ return ctagsCommand;
+ }
+
+ public String getResolvedCtagsCommand() {
+ return useCtagsOnPath ? "ctags" : ctagsCommand; //$NON-NLS-1
+ }
+
+ public boolean useInternalCtagsFile() {
+ return useInternalCtagsFile;
+ }
+
+ public String getCtagsFileName() {
+ return ctagsFileName;
+ }
+
+ public String getResolvedCtagsFileName() {
+ if (useInternalCtagsFile)
+ return CCorePlugin.getDefault().getStateLocation().append(pdom.getProject().getElementName() + ".ctags").toOSString(); //$NON-NLS-1$
+ else
+ return ctagsFileName;
+ }
+
+ // Defaults stored in metadata
+ public static boolean getDefaultUseCtagsOnPath() {
+ IPreferencesService prefService = Platform.getPreferencesService();
+ return prefService.getBoolean(CCorePlugin.PLUGIN_ID, useCtagsOnPathId,
+ true, null);
+ }
+
+ public static String getDefaultCtagsCommand() {
+ IPreferencesService prefService = Platform.getPreferencesService();
+ return prefService.getString(CCorePlugin.PLUGIN_ID, ctagsCommandId,
+ "", null); //$NON-NLS-1$
+ }
+
+ public static boolean getDefaultUseInternalCtagsFile() {
+ IPreferencesService prefService = Platform.getPreferencesService();
+ return prefService.getBoolean(CCorePlugin.PLUGIN_ID, useInternalCtagsFileId,
+ true, null);
+ }
+
+ public static String getDefaultCtagsFileName() {
+ IPreferencesService prefService = Platform.getPreferencesService();
+ return prefService.getString(CCorePlugin.PLUGIN_ID, ctagsFileNameId,
+ "", null); //$NON-NLS-1$
+ }
+
+ public static void setDefaultPreferences(
+ boolean useCtagsOnPath,
+ String ctagsCommand,
+ boolean useInternalCtagsFile,
+ String ctagsFileName) {
+
+ IEclipsePreferences prefs = new InstanceScope().getNode(CCorePlugin.PLUGIN_ID);
+ if (prefs == null)
+ return;
+
+ prefs.putBoolean(useCtagsOnPathId, useCtagsOnPath);
+ prefs.put(ctagsCommandId, ctagsCommand);
+ prefs.putBoolean(useInternalCtagsFileId, useInternalCtagsFile);
+ prefs.put(ctagsFileNameId, ctagsFileName);
+
+ try {
+ prefs.flush();
+ } catch (BackingStoreException e) {
+ CCorePlugin.log(e);
+ }
+ }
+
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ctags/CtagsName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ctags/CtagsName.java
new file mode 100644
index 00000000000..22795b5d402
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ctags/CtagsName.java
@@ -0,0 +1,212 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.core.pdom.indexer.ctags;
+
+import java.util.Map;
+
+import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
+import org.eclipse.cdt.core.dom.ast.ASTVisitor;
+import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
+import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IASTNode;
+import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage;
+import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
+import org.eclipse.cdt.core.model.ILanguage;
+import org.eclipse.cdt.internal.core.pdom.PDOM;
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * A fake AST Name derived from a ctags entry.
+ *
+ * @author Doug Schaefer
+ */
+public class CtagsName implements IASTName, IASTFileLocation {
+
+ private final PDOM pdom;
+ private final PDOMLinkage linkage;
+ private final String fileName;
+ private final int lineNum;
+ private final String elementName;
+ private final Map fields;
+ private int kind; // Enum from below
+
+ private final static int K_UNKNOWN = 0;
+ private final static int K_CLASS = 1;
+ private final static int K_MACRO = 2;
+ private final static int K_ENUMERATOR = 3;
+ private final static int K_FUNCTION = 4;
+ private final static int K_ENUM = 5;
+ private final static int K_MEMBER = 6;
+ private final static int K_NAMESPACE = 7;
+ private final static int K_PROTOTYPE = 8;
+ private final static int K_STRUCT = 9;
+ private final static int K_TYPEDEF = 10;
+ private final static int K_UNION = 11;
+ private final static int K_VARIABLE = 12;
+ private final static int K_EXTERNALVAR = 13;
+
+ private final static String[] kinds = { // Order must match value of enum above
+ null, // unknown kinds
+ "class", //$NON-NLS-1$
+ "macro", //$NON-NLS-1$
+ "enumerator", //$NON-NLS-1$
+ "function", //$NON-NLS-1$
+ "enum", //$NON-NLS-1$
+ "member", //$NON-NLS-1$
+ "namespace", //$NON-NLS-1$
+ "prototype", //$NON-NLS-1$
+ "struct", //$NON-NLS-1$
+ "typedef", //$NON-NLS-1$
+ "union", //$NON-NLS-1$
+ "variable", //$NON-NLS-1$
+ "externvar", //$NON-NLS-1$
+ };
+
+ public CtagsName(PDOM pdom, String fileName, int lineNum, String elementName, Map fields) throws CoreException {
+ this.pdom = pdom;
+ this.fileName = fileName;
+ this.lineNum = lineNum;
+ this.elementName = elementName;
+ this.fields = fields;
+
+ kind = K_UNKNOWN;
+ String kindField = (String)fields.get("kind"); //$NON-NLS-1$
+ if (kindField != null) {
+ for (int i = 1; i < kinds.length; ++i) {
+ if (kindField.equals(kinds[i])) {
+ kind = i;
+ break;
+ }
+ }
+ }
+
+ String languageName = (String)fields.get("language");
+ ILanguage language
+ = (languageName != null && languageName.equals("C++"))
+ ? (ILanguage)new GPPLanguage()
+ : (ILanguage)new GCCLanguage();
+
+ linkage = pdom.getLinkage(language);
+ }
+
+ public void addToPDOM() throws CoreException {
+ linkage.addName(this);
+ }
+
+ public IBinding getBinding() {
+ throw new PDOMNotImplementedError();
+ }
+
+ public boolean isDeclaration() {
+ throw new PDOMNotImplementedError();
+ }
+
+ public boolean isDefinition() {
+ throw new PDOMNotImplementedError();
+ }
+
+ public boolean isReference() {
+ // We're never a reference
+ return false;
+ }
+
+ public IBinding resolveBinding() {
+ switch (kind) {
+ default:
+ return null;
+ }
+ }
+
+ public IBinding[] resolvePrefix() {
+ throw new PDOMNotImplementedError();
+ }
+
+ public void setBinding(IBinding binding) {
+ throw new PDOMNotImplementedError();
+ }
+
+ public char[] toCharArray() {
+ return elementName.toCharArray();
+ }
+
+ public boolean accept(ASTVisitor visitor) {
+ throw new PDOMNotImplementedError();
+ }
+
+ public String getContainingFilename() {
+ return fileName;
+ }
+
+ public IASTFileLocation getFileLocation() {
+ return this;
+ }
+
+ public IASTNodeLocation[] getNodeLocations() {
+ throw new PDOMNotImplementedError();
+ }
+
+ public IASTNode getParent() {
+ throw new PDOMNotImplementedError();
+ }
+
+ public ASTNodeProperty getPropertyInParent() {
+ throw new PDOMNotImplementedError();
+ }
+
+ public String getRawSignature() {
+ throw new PDOMNotImplementedError();
+ }
+
+ public IASTTranslationUnit getTranslationUnit() {
+ throw new PDOMNotImplementedError();
+ }
+
+ public void setParent(IASTNode node) {
+ throw new PDOMNotImplementedError();
+ }
+
+ public void setPropertyInParent(ASTNodeProperty property) {
+ throw new PDOMNotImplementedError();
+ }
+
+ public int getEndingLineNumber() {
+ throw new PDOMNotImplementedError();
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ public int getStartingLineNumber() {
+ return lineNum;
+ }
+
+ public IASTFileLocation asFileLocation() {
+ throw new PDOMNotImplementedError();
+ }
+
+ public int getNodeLength() {
+ // -1 means we have a line num as the offset
+ return -1;
+ }
+
+ public int getNodeOffset() {
+ // since node length is -1, we can return the line number here
+ return lineNum;
+ }
+
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ctags/CtagsReindex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ctags/CtagsReindex.java
new file mode 100644
index 00000000000..4f063bbea9c
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ctags/CtagsReindex.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.core.pdom.indexer.ctags;
+
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.model.IIncludeReference;
+import org.eclipse.cdt.core.model.ISourceRoot;
+import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.pdom.PDOM;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+/**
+ * @author Doug Schaefer
+ *
+ */
+public class CtagsReindex extends Job {
+
+ private final CtagsIndexer indexer;
+ private final PDOM pdom;
+
+ public CtagsReindex(CtagsIndexer indexer) {
+ super("Ctags Indexer");
+ this.indexer = indexer;
+ this.pdom = (PDOM)indexer.getPDOM();
+ }
+
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ // Index the include path
+ indexIncludes();
+
+ // Index the source roots
+ final ICProject project = pdom.getProject();
+ ISourceRoot[] sourceRoots = project.getAllSourceRoots();
+
+ for (int i = 0; i < sourceRoots.length; ++i) {
+ ISourceRoot sourceRoot = sourceRoots[i];
+ IPath sourcePath = sourceRoot.getResource().getLocation();
+ if (sourcePath != null)
+ indexer.runCtags(sourcePath);
+ }
+ return Status.OK_STATUS;
+ } catch (CoreException e) {
+ return e.getStatus();
+ }
+ }
+
+ protected void indexIncludes() throws CoreException {
+ ICProject project = pdom.getProject();
+ IIncludeReference[] includes = project.getIncludeReferences();
+
+ // This project has no references, don't bother processing any further
+ if (includes.length == 0)
+ return;
+
+ // Find common prefix paths
+ for (int i = 0; i < includes.length; ++i) {
+ if (includes[i] == null)
+ continue;
+ IPath pathi = includes[i].getPath();
+ for (int j = i + 1; j < includes.length; ++j) {
+ if (includes[j] == null)
+ continue;
+ IPath pathj = includes[j].getPath();
+ if (pathi.isPrefixOf(pathj)) {
+ includes[j] = null;
+ } else if (pathj.isPrefixOf(pathi)) {
+ includes[i] = null;
+ break;
+ }
+ }
+ }
+
+ includes = (IIncludeReference[])ArrayUtil.removeNulls(IIncludeReference.class, includes);
+ for (int i = 0; i < includes.length; ++i) {
+ indexer.runCtags(includes[i].getPath());
+ }
+ }
+
+
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastHandleDelta.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastHandleDelta.java
index 01dcfa6a7ea..565431af32c 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastHandleDelta.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastHandleDelta.java
@@ -27,11 +27,8 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-class PDOMFastHandleDelta extends Job {
-
- private final PDOM pdom;
+class PDOMFastHandleDelta extends PDOMFastIndexerJob {
private final ICElementDelta delta;
@@ -42,8 +39,7 @@ class PDOMFastHandleDelta extends Job {
private List removedTUs;
public PDOMFastHandleDelta(PDOM pdom, ICElementDelta delta) {
- super("Delta Handler");
- this.pdom = pdom;
+ super("Delta Handler", pdom);
this.delta = delta;
}
@@ -152,27 +148,6 @@ class PDOMFastHandleDelta extends Job {
}
}
- protected void addTU(ITranslationUnit tu) throws InterruptedException, CoreException {
- ILanguage language = tu.getLanguage();
- if (language == null)
- return;
-
- // get the AST in a "Fast" way
- IASTTranslationUnit ast = language.getASTTranslationUnit(tu,
- ILanguage.AST_USE_INDEX
- | ILanguage.AST_SKIP_INDEXED_HEADERS
- | ILanguage.AST_SKIP_IF_NO_BUILD_INFO);
- if (ast == null)
- return;
-
- pdom.acquireWriteLock();
- try {
- pdom.addSymbols(language, ast);
- } finally {
- pdom.releaseWriteLock();
- }
- }
-
protected void changeTU(ITranslationUnit tu) throws InterruptedException, CoreException {
ILanguage language = tu.getLanguage();
if (language == null)
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexer.java
index d42c3c97a3e..c2fe9721058 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexer.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexer.java
@@ -17,8 +17,6 @@ import org.eclipse.cdt.core.dom.IPDOMIndexer;
import org.eclipse.cdt.core.model.ICElementDelta;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
/**
* @author Doug Schaefer
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerJob.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerJob.java
new file mode 100644
index 00000000000..6a55a550237
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerJob.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2006 QNX Software Systems 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:
+ * QNX - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.core.pdom.indexer.fast;
+
+import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.model.ILanguage;
+import org.eclipse.cdt.core.model.ITranslationUnit;
+import org.eclipse.cdt.internal.core.pdom.PDOM;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.jobs.Job;
+
+/**
+ * @author Doug Schaefer
+ *
+ */
+public abstract class PDOMFastIndexerJob extends Job {
+
+ protected final PDOM pdom;
+
+ public PDOMFastIndexerJob(String name, PDOM pdom) {
+ super(name);
+ this.pdom = pdom;
+ }
+
+ protected void addTU(ITranslationUnit tu) throws InterruptedException, CoreException {
+ ILanguage language = tu.getLanguage();
+ if (language == null)
+ return;
+
+ // get the AST in a "Fast" way
+ IASTTranslationUnit ast = language.getASTTranslationUnit(tu,
+ ILanguage.AST_USE_INDEX
+ | ILanguage.AST_SKIP_INDEXED_HEADERS
+ | ILanguage.AST_SKIP_IF_NO_BUILD_INFO);
+ if (ast == null)
+ return;
+
+ pdom.acquireWriteLock();
+ try {
+ pdom.addSymbols(language, ast);
+ } finally {
+ pdom.releaseWriteLock();
+ }
+ }
+
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastReindex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastReindex.java
index f05d0cb10bf..86de06ca3bb 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastReindex.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastReindex.java
@@ -16,9 +16,7 @@ import java.util.Iterator;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.core.resources.IFile;
@@ -31,19 +29,15 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.jobs.Job;
/**
* @author Doug Schaefer
*
*/
-public class PDOMFastReindex extends Job {
+public class PDOMFastReindex extends PDOMFastIndexerJob {
- private final PDOM pdom;
-
public PDOMFastReindex(PDOM pdom) {
- super("Reindex");
- this.pdom = pdom;
+ super("Reindex", pdom);
}
protected IStatus run(IProgressMonitor monitor) {
@@ -93,25 +87,4 @@ public class PDOMFastReindex extends Job {
}
}
- protected void addTU(ITranslationUnit tu) throws InterruptedException, CoreException {
- ILanguage language = tu.getLanguage();
- if (language == null)
- return;
-
- // get the AST in a "Fast" way
- IASTTranslationUnit ast = language.getASTTranslationUnit(tu,
- ILanguage.AST_USE_INDEX
- | ILanguage.AST_SKIP_INDEXED_HEADERS
- | ILanguage.AST_SKIP_IF_NO_BUILD_INFO);
- if (ast == null)
- return;
-
- pdom.acquireWriteLock();
- try {
- pdom.addSymbols(language, ast);
- } finally {
- pdom.releaseWriteLock();
- }
- }
-
}
diff --git a/core/org.eclipse.cdt.core/plugin.xml b/core/org.eclipse.cdt.core/plugin.xml
index eb30e7f85ef..62d2882b0ac 100644
--- a/core/org.eclipse.cdt.core/plugin.xml
+++ b/core/org.eclipse.cdt.core/plugin.xml
@@ -551,7 +551,7 @@
class="org.eclipse.cdt.internal.core.index.ctagsindexer.CTagsIndexer">
-
+