diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CallHierarchyUI.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CallHierarchyUI.java index f21d1cd4a55..88a488dde8e 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CallHierarchyUI.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CallHierarchyUI.java @@ -23,14 +23,14 @@ import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.dom.IPDOM; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.index.IIndexManager; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; -import org.eclipse.cdt.core.model.ILanguage; +import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.IWorkingCopy; import org.eclipse.cdt.ui.CUIPlugin; @@ -132,55 +132,53 @@ public class CallHierarchyUI { } private static ICElement[] findDefinitions(ICProject project, IEditorInput editorInput, ITextSelection sel) throws CoreException { - CIndexQueries index= CIndexQueries.getInstance(); - IPDOM pdom= CCorePlugin.getPDOMManager().getPDOM(project); - if (pdom != null) { - try { - pdom.acquireReadLock(); - } catch (InterruptedException e) { - return null; - } - } try { - IASTName name= getSelectedName(editorInput, sel); - if (name != null) { - IBinding binding= name.resolveBinding(); - if (CIndexQueries.isRelevantForCallHierarchy(binding)) { - if (name.isDefinition()) { - ICElement elem= index.findDefinition(project, name); - if (elem != null) { - return new ICElement[]{elem}; - } - } - else { - ICElement[] elems= index.findAllDefinitions(project, name); - if (elems.length == 0) { - ICProject[] allProjects= CoreModel.getDefault().getCModel().getCProjects(); - elems= index.findAllDefinitions(allProjects, name); - if (elems.length == 0) { - ICElement elem= index.findAnyDeclaration(project, name); - if (elem == null) { - elem= index.findAnyDeclaration(allProjects, name); - } - if (elem != null) { - elems= new ICElement[] {elem}; - } + CIndexQueries indexq= CIndexQueries.getInstance(); + IIndex index= CCorePlugin.getIndexManager().getIndex(project, IIndexManager.ADD_DEPENDENCIES | IIndexManager.ADD_DEPENDENT); + + index.acquireReadLock(); + try { + IASTName name= getSelectedName(index, editorInput, sel); + if (name != null) { + IBinding binding= name.resolveBinding(); + if (CIndexQueries.isRelevantForCallHierarchy(binding)) { + if (name.isDefinition()) { + ICElement elem= indexq.getCElementForName(project, name); + if (elem != null) { + return new ICElement[]{elem}; } } - return elems; + else { + ICElement[] elems= indexq.findAllDefinitions(index, name); + if (elems.length == 0) { + elems= indexq.findAllDefinitions(index, name); + if (elems.length == 0) { + ICElement elem= indexq.findAnyDeclaration(index, project, name); + if (elems != null) { + elems= new ICElement[]{elem}; + } + } + } + return elems; + } } } } - } - finally { - if (pdom != null) { - pdom.releaseReadLock(); + finally { + if (index != null) { + index.releaseReadLock(); + } } } + catch (CoreException e) { + CUIPlugin.getDefault().log(e); + } + catch (InterruptedException e) { + } return null; } - private static IASTName getSelectedName(IEditorInput editorInput, ITextSelection selection) throws CoreException { + private static IASTName getSelectedName(IIndex index, IEditorInput editorInput, ITextSelection selection) throws CoreException { int selectionStart = selection.getOffset(); int selectionLength = selection.getLength(); @@ -188,8 +186,8 @@ public class CallHierarchyUI { if (workingCopy == null) return null; - int options= ILanguage.AST_SKIP_INDEXED_HEADERS | ILanguage.AST_USE_INDEX; - IASTTranslationUnit ast = workingCopy.getLanguage().getASTTranslationUnit(workingCopy, options); + int options= ITranslationUnit.AST_SKIP_INDEXED_HEADERS; + IASTTranslationUnit ast = workingCopy.getAST(index, options); FindNameForSelectionVisitor finder= new FindNameForSelectionVisitor(ast.getFilePath(), selectionStart, selectionLength); ast.accept(finder); return finder.getSelectedName(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ASTProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ASTProvider.java index 5094f08c59e..a85d93df7d0 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ASTProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ASTProvider.java @@ -8,6 +8,7 @@ * Contributors: * IBM Corporation - initial API and implementation * Anton Leherbauer (Wind River Systems) - Adapted for CDT + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.ui.editor; @@ -28,11 +29,12 @@ import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.IPositionConverter; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; +import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.model.ICElement; -import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.model.ISourceReference; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.ui.CUIPlugin; @@ -47,6 +49,10 @@ import org.eclipse.cdt.ui.CUIPlugin; */ public final class ASTProvider { + public static interface ASTRunnable { + IStatus runOnAST(IASTTranslationUnit tu); + } + /** * Wait flag. */ @@ -97,7 +103,7 @@ public final class ASTProvider { /** Full parse mode (no PDOM) */ public static int PARSE_MODE_FULL= 0; /** Fast parse mode (use PDOM) */ - public static int PARSE_MODE_FAST= ILanguage.AST_SKIP_INDEXED_HEADERS | ILanguage.AST_USE_INDEX; + public static int PARSE_MODE_FAST= ITranslationUnit.AST_SKIP_INDEXED_HEADERS; /** * Tells whether this class is in debug mode. @@ -241,6 +247,8 @@ public final class ASTProvider { protected int fParseMode= PARSE_MODE_FAST; + private long fLastWriteOnIndex= -1; + /** * Returns the C plug-in's AST provider. * @@ -409,6 +417,7 @@ public final class ASTProvider { disposeAST(); fAST= ast; + fLastWriteOnIndex= fAST == null ? 0 : fAST.getIndex().getLastWriteAccess(); fActivePositionConverter= converter; // Signal AST change @@ -426,11 +435,12 @@ public final class ASTProvider { *
* * @param cElement the C element + * @param index the index used to create the AST, needs to be read-locked. * @param waitFlag {@link #WAIT_YES}, {@link #WAIT_NO} or {@link #WAIT_ACTIVE_ONLY} * @param progressMonitor the progress monitor ornull
* @return the AST or null
if the AST is not available
*/
- public IASTTranslationUnit getAST(ICElement cElement, WAIT_FLAG waitFlag, IProgressMonitor progressMonitor) {
+ public IASTTranslationUnit getAST(ICElement cElement, IIndex index, WAIT_FLAG waitFlag, IProgressMonitor progressMonitor) {
if (cElement == null)
return null;
@@ -444,10 +454,15 @@ public final class ASTProvider {
isActiveElement= cElement.equals(fActiveCElement);
if (isActiveElement) {
if (fAST != null) {
- if (DEBUG)
- System.out.println(getThreadName() + " - " + DEBUG_PREFIX + "returning cached AST:" + toString(fAST) + " for: " + cElement.getElementName()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ if (fLastWriteOnIndex < index.getLastWriteAccess()) {
+ disposeAST();
+ }
+ else {
+ if (DEBUG)
+ System.out.println(getThreadName() + " - " + DEBUG_PREFIX + "returning cached AST:" + toString(fAST) + " for: " + cElement.getElementName()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- return fAST;
+ return fAST;
+ }
}
if (waitFlag == WAIT_NO) {
if (DEBUG)
@@ -479,7 +494,7 @@ public final class ASTProvider {
return fAST;
}
}
- return getAST(cElement, waitFlag, progressMonitor);
+ return getAST(cElement, index, waitFlag, progressMonitor);
} catch (InterruptedException e) {
return null; // thread has been interrupted don't compute AST
}
@@ -494,7 +509,7 @@ public final class ASTProvider {
IASTTranslationUnit ast= null;
try {
- ast= createAST(cElement, progressMonitor);
+ ast= createAST(cElement, index, progressMonitor);
if (progressMonitor != null && progressMonitor.isCanceled())
ast= null;
else if (DEBUG && ast != null)
@@ -509,7 +524,6 @@ public final class ASTProvider {
reconciled(ast, null, cElement, null);
}
}
-
return ast;
}
@@ -530,10 +544,11 @@ public final class ASTProvider {
* Creates a new translation unit AST.
*
* @param cElement the C element for which to create the AST
+ * @param index for AST generation, needs to be read-locked.
* @param progressMonitor the progress monitor
* @return AST
*/
- IASTTranslationUnit createAST(ICElement cElement, final IProgressMonitor progressMonitor) {
+ IASTTranslationUnit createAST(ICElement cElement, final IIndex index, final IProgressMonitor progressMonitor) {
if (!hasSource(cElement))
return null;
@@ -552,7 +567,7 @@ public final class ASTProvider {
if (progressMonitor != null && progressMonitor.isCanceled()) {
root[0]= null;
} else {
- root[0]= tu.getLanguage().getASTTranslationUnit(tu, fParseMode);
+ root[0]= tu.getAST(index, fParseMode);
}
} catch (OperationCanceledException ex) {
root[0]= null;
@@ -648,6 +663,26 @@ public final class ASTProvider {
}
return null;
}
-
+
+ public IStatus runOnAST(ICElement cElement, WAIT_FLAG waitFlag, IProgressMonitor monitor,
+ ASTRunnable astRunnable) {
+ IIndex index;
+ try {
+ index = CCorePlugin.getIndexManager().getIndex(cElement.getCProject());
+ index.acquireReadLock();
+ } catch (CoreException e) {
+ return e.getStatus();
+ } catch (InterruptedException e) {
+ return Status.CANCEL_STATUS;
+ }
+
+ try {
+ IASTTranslationUnit ast= getAST(cElement, index, waitFlag, monitor);
+ return astRunnable.runOnAST(ast);
+ }
+ finally {
+ index.releaseReadLock();
+ }
+ }
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AddIncludeOnSelectionAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AddIncludeOnSelectionAction.java
index 549bc9816d3..52ff7d61b0e 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AddIncludeOnSelectionAction.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AddIncludeOnSelectionAction.java
@@ -19,7 +19,6 @@ import java.util.List;
import java.util.regex.Pattern;
import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -45,17 +44,16 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.browser.IQualifiedTypeName;
import org.eclipse.cdt.core.browser.PathUtil;
import org.eclipse.cdt.core.browser.QualifiedTypeName;
-import org.eclipse.cdt.core.dom.IName;
-import org.eclipse.cdt.core.dom.IPDOMManager;
-import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexBinding;
+import org.eclipse.cdt.core.index.IIndexManager;
import org.eclipse.cdt.core.index.IIndexName;
-import org.eclipse.cdt.core.model.CModelException;
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
@@ -65,11 +63,6 @@ import org.eclipse.cdt.ui.IRequiredInclude;
import org.eclipse.cdt.ui.browser.typeinfo.TypeInfoLabelProvider;
import org.eclipse.cdt.ui.text.ICHelpInvocationContext;
-import org.eclipse.cdt.internal.core.pdom.PDOM;
-import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
-
import org.eclipse.cdt.internal.ui.CHelpProviderManager;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.internal.ui.actions.WorkbenchRunnableAdapter;
@@ -152,9 +145,24 @@ public class AddIncludeOnSelectionAction extends Action implements IUpdate {
public void run() {
ITranslationUnit tu= getTranslationUnit();
- if (tu != null) {
- extractIncludes(fEditor);
- addInclude(tu);
+ IIndex index;
+ try {
+ index = CCorePlugin.getIndexManager().getIndex(tu.getCProject(), IIndexManager.ADD_DEPENDENCIES);
+ index.acquireReadLock();
+ } catch (CoreException e) {
+ CUIPlugin.getDefault().log(e);
+ return;
+ } catch (InterruptedException e) {
+ return;
+ }
+ try {
+ if (tu != null) {
+ extractIncludes(fEditor, index);
+ addInclude(tu);
+ }
+ }
+ finally {
+ index.releaseReadLock();
}
fUsings = null;
fRequiredIncludes = null;
@@ -164,18 +172,19 @@ public class AddIncludeOnSelectionAction extends Action implements IUpdate {
* To be used by ElementListSelectionDialog for user to choose which declarations/
* definitions for "add include" when there are more than one to choose from.
*/
- private class DisplayName extends Object
+ private static class DisplayName extends Object
{
private IIndexName name;
+ private IIndexBinding binding;
- public DisplayName(IIndexName name) {
+ public DisplayName(IIndexName name, IIndexBinding binding) {
this.name = name;
+ this.binding= binding;
}
public String toString()
{
try {
- PDOMBinding binding = (PDOMBinding) name.resolveBinding();
if (binding != null)
{
return getBindingQualifiedName(binding) + " - " + name.getFileName(); //$NON-NLS-1$
@@ -188,11 +197,14 @@ public class AddIncludeOnSelectionAction extends Action implements IUpdate {
}
}
- public IIndexName getPDOMName()
- {
+ public IIndexName getName() {
return name;
}
+ public IIndexBinding getBinding() {
+ return binding;
+ }
+
}
@@ -200,8 +212,9 @@ public class AddIncludeOnSelectionAction extends Action implements IUpdate {
* Extract the includes for the given selection. This can be both used to perform
* the work as well as being invoked when there is a change. The actual results
* can and should be cached as the lookup process could be potentially costly.
+ * @param index
*/
- private void extractIncludes(ITextEditor editor) {
+ private void extractIncludes(ITextEditor editor, IIndex index) {
if (editor == null) {
return;
}
@@ -234,127 +247,81 @@ public class AddIncludeOnSelectionAction extends Action implements IUpdate {
}
}
- IPDOMManager pdomManager = CCorePlugin.getPDOMManager();
try {
- ITranslationUnit unit = getTranslationUnit();
- //get all referenced projects
- if (unit != null)
- {
- ICProject cProj = unit.getCProject();
- if (cProj != null)
- {
- IProject proj = cProj.getProject();
- if (proj != null)
- {
- IProjectDescription projectDescription = proj.getDescription();
- if (projectDescription != null)
- {
- IProject[] projects = projectDescription.getReferencedProjects();
- List cProjectsToSearch = new ArrayList();
- //get all the ICProjects for the referenced projects
- for(int i = 0; i < projects.length; i++)
- {
- IProject project = projects[i];
- try {
- ICProject[] cProjects = CoreModel.getDefault().getCModel().getCProjects();
- if (cProjects != null) {
- for (int j = 0; j < cProjects.length; j++) {
- ICProject cProject = cProjects[j];
- if (project.equals(cProjects[j].getProject()))
- cProjectsToSearch.add(cProject);
- }
- }
- } catch (CModelException e) {
- }
- }
-
- cProjectsToSearch.add(cProj); //current project
- Pattern pattern = Pattern.compile(name);
- List pdomNames = new ArrayList();
- //search the projects and get name matching bindings
- for (int n = 0; n < cProjectsToSearch.size(); n++)
- {
- PDOM pdom = (PDOM)pdomManager.getPDOM((ICProject) cProjectsToSearch.get(n));
- IBinding[] bindings = pdom.findBindings(pattern, new NullProgressMonitor());
-
- for (int i = 0; i < bindings.length; ++i) {
- PDOMBinding binding = (PDOMBinding)bindings[i];
- PDOMBinding pdomBinding = pdom.getLinkage(getTranslationUnit().getLanguage()).adaptBinding(binding);
-
- IName[] defs= null;
- if (pdomBinding instanceof IPDOMMemberOwner //class or struct
- || pdomBinding instanceof IEnumeration)
- {
- defs= pdom.getDefinitions(pdomBinding);
- }
- else if (pdomBinding instanceof ITypedef || pdomBinding instanceof IFunction)
- {
- defs= pdom.getDeclarations(pdomBinding);
- }
- if (defs != null) {
- for (int j = 0; j < defs.length; j++) {
- pdomNames.add(new DisplayName((IIndexName)defs[j]));
- }
- }
- }
- }
-
- if (pdomNames.size() > 1)
- {
- ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), new TypeInfoLabelProvider(TypeInfoLabelProvider.SHOW_TYPE_ONLY));
- dialog.setElements(pdomNames.toArray());
- dialog.setTitle(CEditorMessages.getString("AddIncludeOnSelection.label")); //$NON-NLS-1$
- dialog.setMessage(CEditorMessages.getString("AddIncludeOnSelection.description")); //$NON-NLS-1$
- if (dialog.open() == Window.OK) {
- //get selection
- Object[] selects = dialog.getResult();
-
- fRequiredIncludes = new IRequiredInclude[selects.length];
- List usings = new ArrayList(selects.length);
- for (int i = 0; i < fRequiredIncludes.length; i++) {
- IRequiredInclude include = getRequiredInclude(((DisplayName)selects[i]).getPDOMName().getFileName(), getTranslationUnit());
- if (include != null) {
- fRequiredIncludes[i] = include;
- PDOMBinding pdomBinding = ((PDOMBinding)(((DisplayName)selects[i]).getPDOMName().resolveBinding()));
- if (pdomBinding instanceof ICPPBinding)
- {
- //find the enclosing namespace, if there's one
- IQualifiedTypeName qualifiedName = new QualifiedTypeName(getBindingQualifiedName(pdomBinding));
- String qualifiedEnclosingName = (new QualifiedTypeName(qualifiedName.getEnclosingNames())).getFullyQualifiedName();
- if (!qualifiedEnclosingName.equals("")) //$NON-NLS-1$
- usings.add(qualifiedEnclosingName);
- }
- }
- }
- if(usings.size() > 0)
- {
- fUsings = new String[usings.size()];
- for (int i = 0; i < usings.size(); i++)
- {
- fUsings[i] = (String) usings.get(i);
- }
- }
- }
- }
- else if (pdomNames.size() == 1)
- {
- String fileName = ((DisplayName)pdomNames.get(0)).getPDOMName().getFileName();
- fRequiredIncludes = new IRequiredInclude[] {getRequiredInclude(fileName, getTranslationUnit())};
- PDOMBinding pdomBinding = (PDOMBinding) ((DisplayName)pdomNames.get(0)).getPDOMName().resolveBinding();
-
- if (pdomBinding instanceof ICPPBinding)
- {
- //find the enclosing namespace, if there's one
- IQualifiedTypeName qualifiedName = new QualifiedTypeName(getBindingQualifiedName(pdomBinding));
- String qualifiedEnclosingName = new QualifiedTypeName(qualifiedName.getEnclosingNames()).getFullyQualifiedName();
- if (!qualifiedEnclosingName.equals("")) //$NON-NLS-1$
- fUsings = new String[] {qualifiedEnclosingName};
- }
- }
- }
+ Pattern pattern = Pattern.compile(name);
+
+ IndexFilter filter= new IndexFilter() {
+ };
+ IIndexBinding[] bindings= index.findBindings(pattern, false, filter, new NullProgressMonitor());
+ ArrayList pdomNames= new ArrayList();
+ for (int i = 0; i < bindings.length; ++i) {
+ IIndexBinding binding= bindings[i];
+ IIndexName[] defs= null;
+ // class, struct union, enumeration
+ if (binding instanceof ICompositeType || binding instanceof IEnumeration) {
+ defs= index.findDefinitions(binding);
+ }
+ else if (binding instanceof ITypedef || binding instanceof IFunction) {
+ defs= index.findDeclarations(binding);
+ }
+ if (defs != null) {
+ for (int j = 0; j < defs.length; j++) {
+ pdomNames.add(new DisplayName(defs[j], binding));
}
}
}
+
+ if (pdomNames.size() > 1)
+ {
+ ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), new TypeInfoLabelProvider(TypeInfoLabelProvider.SHOW_TYPE_ONLY));
+ dialog.setElements(pdomNames.toArray());
+ dialog.setTitle(CEditorMessages.getString("AddIncludeOnSelection.label")); //$NON-NLS-1$
+ dialog.setMessage(CEditorMessages.getString("AddIncludeOnSelection.description")); //$NON-NLS-1$
+ if (dialog.open() == Window.OK) {
+ //get selection
+ Object[] selects = dialog.getResult();
+
+ fRequiredIncludes = new IRequiredInclude[selects.length];
+ List usings = new ArrayList(selects.length);
+ for (int i = 0; i < fRequiredIncludes.length; i++) {
+ IRequiredInclude include = getRequiredInclude(((DisplayName)selects[i]).getName().getFileName(), getTranslationUnit());
+ if (include != null) {
+ fRequiredIncludes[i] = include;
+ IIndexBinding binding = ((DisplayName)selects[i]).getBinding();
+ if (binding instanceof ICPPBinding)
+ {
+ //find the enclosing namespace, if there's one
+ IQualifiedTypeName qualifiedName = new QualifiedTypeName(getBindingQualifiedName(binding));
+ String qualifiedEnclosingName = (new QualifiedTypeName(qualifiedName.getEnclosingNames())).getFullyQualifiedName();
+ if (!qualifiedEnclosingName.equals("")) //$NON-NLS-1$
+ usings.add(qualifiedEnclosingName);
+ }
+ }
+ }
+ if(usings.size() > 0)
+ {
+ fUsings = new String[usings.size()];
+ for (int i = 0; i < usings.size(); i++)
+ {
+ fUsings[i] = (String) usings.get(i);
+ }
+ }
+ }
+ }
+ else if (pdomNames.size() == 1)
+ {
+ String fileName = ((DisplayName)pdomNames.get(0)).getName().getFileName();
+ fRequiredIncludes = new IRequiredInclude[] {getRequiredInclude(fileName, getTranslationUnit())};
+ IIndexBinding binding = ((DisplayName)pdomNames.get(0)).getBinding();
+
+ if (binding instanceof ICPPBinding) {
+ //find the enclosing namespace, if there's one
+ IQualifiedTypeName qualifiedName = new QualifiedTypeName(getBindingQualifiedName(binding));
+ String qualifiedEnclosingName = new QualifiedTypeName(qualifiedName.getEnclosingNames()).getFullyQualifiedName();
+ if (!qualifiedEnclosingName.equals("")) //$NON-NLS-1$
+ fUsings = new String[] {qualifiedEnclosingName};
+ }
+ }
} catch (CoreException e) {
e.printStackTrace();
}
@@ -471,17 +438,13 @@ public class AddIncludeOnSelectionAction extends Action implements IUpdate {
* @return binding's fully qualified name
* @throws CoreException
*/
- private String getBindingQualifiedName(PDOMBinding pdomBinding) throws CoreException
+ private static String getBindingQualifiedName(IIndexBinding binding) throws CoreException
{
- StringBuffer buf = new StringBuffer(pdomBinding.getName());
- PDOMNode parent = pdomBinding.getParentNode();
- while (parent != null)
- {
- if (parent instanceof PDOMBinding)
- {
- buf.insert(0, ((PDOMBinding)parent).getName() + "::"); //$NON-NLS-1$
- }
- parent = parent.getParentNode();
+ StringBuffer buf = new StringBuffer(binding.getName());
+ binding= binding.getParentBinding();
+ while (binding != null) {
+ buf.insert(0, binding.getName() + "::"); //$NON-NLS-1$
+ binding= binding.getParentBinding();
}
return buf.toString();
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
index 2b6f20dadf9..35cad1dcea9 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
@@ -154,6 +154,7 @@ import org.eclipse.cdt.core.CCorePreferenceConstants;
import org.eclipse.cdt.core.IPositionConverter;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.formatter.DefaultCodeFormatterConstants;
+import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
@@ -2893,10 +2894,22 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IR
SimplePositionTracker positionTracker= new SimplePositionTracker();
positionTracker.startTracking(doc);
+ ASTProvider astProvider= CUIPlugin.getDefault().getASTProvider();
+ IIndex index;
try {
- IASTTranslationUnit ast= CUIPlugin.getDefault().getASTProvider().createAST(cElement, null);
+ index = CCorePlugin.getIndexManager().getIndex(cElement.getCProject());
+ index.acquireReadLock();
+ } catch (CoreException e) {
+ CUIPlugin.getDefault().log(e);
+ return;
+ } catch (InterruptedException e) {
+ return;
+ }
+ try {
+ IASTTranslationUnit ast= astProvider.createAST(cElement, index, null);
reconciled(ast, positionTracker, null);
} finally {
+ index.releaseReadLock();
positionTracker.stopTracking();
}
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/InactiveCodeHighlighting.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/InactiveCodeHighlighting.java
index d8ce166b373..71034e3e518 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/InactiveCodeHighlighting.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/InactiveCodeHighlighting.java
@@ -7,6 +7,7 @@
*
* Contributors:
* Anton Leherbauer (Wind River Systems) - initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.editor;
@@ -40,6 +41,7 @@ import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.LineBackgroundPainter;
+import org.eclipse.cdt.internal.ui.editor.ASTProvider.ASTRunnable;
import org.eclipse.cdt.internal.ui.text.ICReconcilingListener;
/**
@@ -95,11 +97,16 @@ public class InactiveCodeHighlighting implements ICReconcilingListener {
synchronized (fJobLock) {
if (fUpdateJob == null) {
fUpdateJob = new Job(CEditorMessages.getString("InactiveCodeHighlighting_job")) { //$NON-NLS-1$
- protected IStatus run(IProgressMonitor monitor) {
+ protected IStatus run(final IProgressMonitor monitor) {
IStatus result = Status.OK_STATUS;
if (fTranslationUnit != null) {
- IASTTranslationUnit ast= CUIPlugin.getDefault().getASTProvider().getAST(fTranslationUnit, ASTProvider.WAIT_YES, monitor);
- reconciled(ast, null, monitor);
+ final ASTProvider astProvider= CUIPlugin.getDefault().getASTProvider();
+ result= astProvider.runOnAST(fTranslationUnit, ASTProvider.WAIT_YES, monitor, new ASTRunnable() {
+ public IStatus runOnAST(IASTTranslationUnit ast) {
+ reconciled(ast, null, monitor);
+ return Status.OK_STATUS;
+ }
+ });
}
if (monitor.isCanceled()) {
result = Status.CANCEL_STATUS;
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightingReconciler.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightingReconciler.java
index 9d3e0a01228..3d39e6f924c 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightingReconciler.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightingReconciler.java
@@ -8,6 +8,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
* Anton Leherbauer (Wind River Systems) - Adapted for CDT
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.editor;
@@ -40,6 +41,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.ui.CUIPlugin;
+import org.eclipse.cdt.internal.ui.editor.ASTProvider.ASTRunnable;
import org.eclipse.cdt.internal.ui.editor.SemanticHighlightingManager.HighlightedPosition;
import org.eclipse.cdt.internal.ui.editor.SemanticHighlightingManager.HighlightingStyle;
import org.eclipse.cdt.internal.ui.text.ICReconcilingListener;
@@ -420,7 +422,7 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
if (element != null) {
fJob= new Job(CEditorMessages.getString("SemanticHighlighting_job")) { //$NON-NLS-1$
- protected IStatus run(IProgressMonitor monitor) {
+ protected IStatus run(final IProgressMonitor monitor) {
if (oldJob != null) {
try {
oldJob.join();
@@ -431,14 +433,21 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
}
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
- IASTTranslationUnit ast= CUIPlugin.getDefault().getASTProvider().getAST(element, ASTProvider.WAIT_YES, monitor);
- reconciled(ast, null, monitor);
- synchronized (fJobLock) {
- // allow the job to be gc'ed
- if (fJob == this)
- fJob= null;
- }
- return Status.OK_STATUS;
+
+ final Job me= this;
+ ASTProvider astProvider= CUIPlugin.getDefault().getASTProvider();
+ IStatus status= astProvider.runOnAST(element, ASTProvider.WAIT_YES, monitor, new ASTRunnable() {
+ public IStatus runOnAST(IASTTranslationUnit ast) {
+ reconciled(ast, null, monitor);
+ synchronized (fJobLock) {
+ // allow the job to be gc'ed
+ if (fJob == me)
+ fJob= null;
+ }
+ return Status.OK_STATUS;
+ }
+ });
+ return status;
}
};
// fJob.setSystem(true);
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexView.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexView.java
index cde252c4934..a6a2032cfc6 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexView.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexView.java
@@ -183,18 +183,11 @@ public class IndexView extends ViewPart implements PDOM.IListener, IElementChang
try {
if (parentElement instanceof ICProject) {
PDOM pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM((ICProject)parentElement);
- int n = 0;
- PDOMLinkage firstLinkage = pdom.getFirstLinkage();
- for (PDOMLinkage linkage = firstLinkage; linkage != null; linkage = linkage.getNextLinkage())
- ++n;
- if (n == 1) {
+ PDOMLinkage[] linkages= pdom.getLinkages();
+ if (linkages.length == 1) {
// Skip linkages in hierarchy if there is only one
- return getChildren(firstLinkage);
+ return getChildren(linkages[0]);
}
- PDOMLinkage[] linkages = new PDOMLinkage[n];
- int i = 0;
- for (PDOMLinkage linkage = pdom.getFirstLinkage(); linkage != null; linkage = linkage.getNextLinkage())
- linkages[i++] = linkage;
return linkages;
} else if (parentElement instanceof IPDOMNode) {
IPDOMNode node = (IPDOMNode)parentElement;
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexIncludeRelation.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexIncludeRelation.java
index f91355b85ef..51933e51b41 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexIncludeRelation.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexIncludeRelation.java
@@ -15,7 +15,7 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMInclude;
+import org.eclipse.cdt.core.index.IIndexInclude;
/**
* Represents an include relation found in the index.
@@ -25,9 +25,9 @@ public class CIndexIncludeRelation {
private IPath fIncludedBy;
private IPath fIncludes;
- CIndexIncludeRelation(PDOMInclude include) throws CoreException {
- fIncludedBy= Path.fromOSString(include.getIncludedBy().getFileName().getString());
- fIncludes= Path.fromOSString(include.getIncludes().getFileName().getString());
+ CIndexIncludeRelation(IIndexInclude include) throws CoreException {
+ fIncludedBy= Path.fromOSString(include.getIncludedByLocation());
+ fIncludes= Path.fromOSString(include.getIncludesLocation());
}
public boolean isSystemInclude() {
return false;
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexQueries.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexQueries.java
index dd1816bff74..88affdac5c9 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexQueries.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/missingapi/CIndexQueries.java
@@ -12,12 +12,9 @@
package org.eclipse.cdt.internal.ui.missingapi;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
-import java.util.HashSet;
-import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -28,7 +25,6 @@ import org.eclipse.jface.text.Region;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.IPositionConverter;
import org.eclipse.cdt.core.dom.IName;
-import org.eclipse.cdt.core.dom.IPDOM;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
@@ -37,6 +33,10 @@ import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.c.ICExternalBinding;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexFile;
+import org.eclipse.cdt.core.index.IIndexInclude;
+import org.eclipse.cdt.core.index.IIndexManager;
import org.eclipse.cdt.core.index.IIndexName;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
@@ -48,10 +48,6 @@ import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.ui.CUIPlugin;
-import org.eclipse.cdt.internal.core.pdom.PDOM;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMInclude;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
import org.eclipse.cdt.internal.corext.util.CModelUtil;
/**
@@ -59,7 +55,7 @@ import org.eclipse.cdt.internal.corext.util.CModelUtil;
* @since 4.0
*/
public class CIndexQueries {
- private static final int ASTTU_OPTIONS = ILanguage.AST_SKIP_INDEXED_HEADERS | ILanguage.AST_USE_INDEX;
+ private static final int ASTTU_OPTIONS = ITranslationUnit.AST_SKIP_INDEXED_HEADERS;
private static final ICElement[] EMPTY_ELEMENTS = new ICElement[0];
private static final CIndexIncludeRelation[] EMPTY_INCLUDES = new CIndexIncludeRelation[0];
private static final CIndexQueries sInstance= new CIndexQueries();
@@ -113,75 +109,36 @@ public class CIndexQueries {
*/
public CIndexIncludeRelation[] findIncludedBy(ICProject[] scope, ITranslationUnit tu, IProgressMonitor pm) {
HashMap result= new HashMap();
- ICProject projectOfTU= tu.getCProject();
-
- // mstodo progress monitor
- for (int i = scope.length-1; i >= 0; i--) {
- ICProject cproject = scope[i];
- // prefer the project of the translation unit.
- if (i != 0) {
- if (cproject.equals(projectOfTU)) {
- System.arraycopy(scope, 0, scope, 1, i);
- scope[0]= projectOfTU;
- cproject= scope[i];
+ try {
+ IIndex index= CCorePlugin.getIndexManager().getIndex(scope);
+ index.acquireReadLock();
+
+ try {
+ IPath location= tu.getLocation();
+ if (location != null) {
+ IIndexFile file= index.getFile(location);
+ if (file != null) {
+ IIndexInclude[] includes= index.findIncludedBy(file);
+ for (int i = 0; i < includes.length; i++) {
+ IIndexInclude include = includes[i];
+ CIndexIncludeRelation rel= new CIndexIncludeRelation(include);
+ result.put(rel.getIncludedBy(), rel);
+ }
+ }
}
}
- CIndexIncludeRelation[] includes= findIncludedBy(cproject, tu);
- for (int j = 0; j < includes.length; j++) {
- CIndexIncludeRelation include = includes[j];
- result.put(include.getIncludedBy(), include);
+ finally {
+ index.releaseReadLock();
}
}
+ catch (InterruptedException e) {
+ }
+ catch (CoreException e) {
+ CUIPlugin.getDefault().log(e);
+ }
Collection includes= result.values();
return (CIndexIncludeRelation[]) includes.toArray(new CIndexIncludeRelation[includes.size()]);
}
-
- /**
- * Searches for all include-relations in a project that include the given translation unit.
- * @param project the project to be searched.
- * @param tu a translation unit
- * @return an array of include relations.
- * @since 4.0
- */
- public CIndexIncludeRelation[] findIncludedBy(ICProject project, ITranslationUnit tu) {
- try {
- PDOM pdom= (PDOM) CCorePlugin.getPDOMManager().getPDOM(project);
- if (pdom != null) {
- pdom.acquireReadLock();
- try {
- PDOMFile fileTarget= pdom.getFile(locationForTU(tu));
- if (fileTarget != null) {
- ArrayList result= new ArrayList();
- PDOMInclude include= fileTarget.getFirstIncludedBy();
- while (include != null) {
- try {
- result.add(new CIndexIncludeRelation(include));
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
- }
- include= include.getNextInIncludedBy();
- }
- return (CIndexIncludeRelation[]) result.toArray(new CIndexIncludeRelation[result.size()]);
- }
- }
- finally {
- pdom.releaseReadLock();
- }
- }
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
- } catch (InterruptedException e) {
- }
- return EMPTY_INCLUDES;
- }
-
- private IPath locationForTU(ITranslationUnit tu) {
- IResource r= tu.getResource();
- if (r != null) {
- return r.getLocation();
- }
- return tu.getPath();
- }
/**
* Searches for all include-relations defined in the given translation unit.
@@ -191,37 +148,36 @@ public class CIndexQueries {
* @since 4.0
*/
public CIndexIncludeRelation[] findIncludesTo(ITranslationUnit tu, IProgressMonitor pm) {
- ICProject cproject= tu.getCProject();
- if (cproject != null) {
- try {
- PDOM pdom= (PDOM) CCorePlugin.getPDOMManager().getPDOM(cproject);
- if (pdom != null) {
- pdom.acquireReadLock();
- try {
- PDOMFile fileTarget= pdom.getFile(locationForTU(tu));
- if (fileTarget != null) {
+ try {
+ ICProject cproject= tu.getCProject();
+ if (cproject != null) {
+ IIndex index= CCorePlugin.getIndexManager().getIndex(cproject, IIndexManager.ADD_DEPENDENCIES);
+ index.acquireReadLock();
+ try {
+ IPath location= tu.getLocation();
+ if (location != null) {
+ IIndexFile file= index.getFile(location);
+ if (file != null) {
+ IIndexInclude includes[]= index.findIncludes(file);
ArrayList result= new ArrayList();
- PDOMInclude include= fileTarget.getFirstInclude();
- while (include != null) {
- try {
- result.add(new CIndexIncludeRelation(include));
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
- }
- include= include.getNextInIncludes();
+ for (int i = 0; i < includes.length; i++) {
+ IIndexInclude include = includes[i];
+ result.add(new CIndexIncludeRelation(include));
}
return (CIndexIncludeRelation[]) result.toArray(new CIndexIncludeRelation[result.size()]);
}
}
- finally {
- pdom.releaseReadLock();
- }
}
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
- } catch (InterruptedException e) {
- }
- }
+ finally {
+ index.releaseReadLock();
+ }
+ }
+ }
+ catch (CoreException e) {
+ CUIPlugin.getDefault().log(e);
+ }
+ catch (InterruptedException e) {
+ }
return EMPTY_INCLUDES;
}
@@ -255,13 +211,11 @@ public class CIndexQueries {
ISourceRange range;
range = sf.getSourceRange();
ITranslationUnit tu= sf.getTranslationUnit();
- IPDOM pdom= CCorePlugin.getPDOMManager().getPDOM(tu.getCProject());
- if (pdom != null) {
- pdom.acquireReadLock();
- }
+ IIndex index= CCorePlugin.getIndexManager().getIndex(scope);
+ index.acquireReadLock();
try {
ILanguage language = tu.getLanguage();
- IASTTranslationUnit ast= language.getASTTranslationUnit(tu, ASTTU_OPTIONS);
+ IASTTranslationUnit ast= tu.getAST(index, ASTTU_OPTIONS);
if (ast == null) {
return;
}
@@ -272,60 +226,30 @@ public class CIndexQueries {
IASTName name= names[names.length-1];
for (int i = 0; i < scope.length; i++) {
ICProject project = scope[i];
- findCalledBy(name, project, result);
+ findCalledBy(index, name, project, result);
}
}
finally {
- if (pdom != null) {
- pdom.releaseReadLock();
- }
+ index.releaseReadLock();
}
}
- private void findCalledBy(IASTName name, ICProject project, CalledByResult result) {
- try {
- PDOM pdom= (PDOM) CCorePlugin.getPDOMManager().getPDOM(project);
- if (pdom != null) {
- pdom.acquireReadLock();
- try {
- IBinding binding= getPDOMBinding(pdom, name);
- if (binding != null) {
- IName[] names= pdom.getReferences(binding);
- for (int i = 0; i < names.length; i++) {
- IName rname = names[i];
- ITranslationUnit tu= getTranslationUnit(project, rname);
- CIndexReference ref= new CIndexReference(tu, rname);
- ICElement elem = findCalledBy(ref);
- if (elem != null) {
- result.add(elem, ref);
- }
- }
- }
- }
- finally {
- pdom.releaseReadLock();
- }
+ private void findCalledBy(IIndex index, IASTName name, ICProject project, CalledByResult result) throws CoreException {
+ IBinding binding= name.resolveBinding();
+ if (binding != null) {
+ IName[] names= index.findReferences(binding);
+ for (int i = 0; i < names.length; i++) {
+ IName rname = names[i];
+ ITranslationUnit tu= getTranslationUnit(project, rname);
+ CIndexReference ref= new CIndexReference(tu, rname);
+ ICElement elem = findCalledBy(ref);
+ if (elem != null) {
+ result.add(elem, ref);
+ }
}
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
- } catch (InterruptedException e) {
}
}
- private IBinding getPDOMBinding(PDOM pdom, IASTName name) {
- IBinding binding= name.resolveBinding();
- IASTTranslationUnit tu= name.getTranslationUnit();
- ILanguage lang= tu.getLanguage();
- PDOMLinkage linkage;
- try {
- linkage = pdom.getLinkage(lang);
- return linkage.adaptBinding(binding);
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
- }
- return null;
- }
-
private ICElement findCalledBy(CIndexReference reference) {
ITranslationUnit tu= reference.getTranslationUnit();
long timestamp= reference.getTimestamp();
@@ -399,13 +323,10 @@ public class CIndexQueries {
private void findCallsInRange(ICProject[] scope, ITranslationUnit tu, IRegion range, IProgressMonitor pm, CallsToResult result)
throws CoreException, InterruptedException {
- IPDOM pdom= CCorePlugin.getPDOMManager().getPDOM(tu.getCProject());
- if (pdom != null) {
- pdom.acquireReadLock();
- }
+ IIndex index= CCorePlugin.getIndexManager().getIndex(scope);
+ index.acquireReadLock();
try {
- ILanguage language = tu.getLanguage();
- IASTTranslationUnit astTU= language.getASTTranslationUnit(tu, ASTTU_OPTIONS);
+ IASTTranslationUnit astTU= tu.getAST(index, ASTTU_OPTIONS);
if (astTU != null) {
ReferenceVisitor refVisitor= new ReferenceVisitor(astTU.getFilePath(), range.getOffset(), range.getLength());
astTU.accept(refVisitor);
@@ -415,9 +336,9 @@ public class CIndexQueries {
IASTName name = refs[i];
IBinding binding= name.resolveBinding();
if (isRelevantForCallHierarchy(binding)) {
- ICElement[] defs = findAllDefinitions(scope, name);
+ ICElement[] defs = findAllDefinitions(index, name);
if (defs.length == 0) {
- ICElement elem = findAnyDeclaration(scope, name);
+ ICElement elem = findAnyDeclaration(index, null, name);
if (elem != null) {
defs = new ICElement[] { elem };
}
@@ -431,67 +352,32 @@ public class CIndexQueries {
}
}
finally {
- if (pdom != null) {
- pdom.releaseReadLock();
- }
+ index.releaseReadLock();
}
}
- public ICElement[] findAllDefinitions(ICProject[] projectsToSearch, IASTName name) {
- ArrayList result= new ArrayList();
- for (int i = 0; i < projectsToSearch.length; i++) {
- ICProject project = projectsToSearch[i];
- ICElement[] definitions= findAllDefinitions(project, name);
- if (definitions != null && definitions.length > 0) {
- result.addAll(Arrays.asList(definitions));
- }
- }
- return (ICElement[]) result.toArray(new ICElement[result.size()]);
- }
-
- public ICElement[] findAllDefinitions(ICProject project, IASTName name) {
- PDOM pdom;
- try {
- pdom = (PDOM) CCorePlugin.getPDOMManager().getPDOM(project);
- if (pdom != null) {
- pdom.acquireReadLock();
- try {
- IBinding binding= getPDOMBinding(pdom, name);
- if (binding != null) {
- return getCElementsForNames(project, pdom.getDefinitions(binding));
- }
- }
- finally {
- pdom.releaseReadLock();
- }
- }
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
- } catch (InterruptedException e) {
- }
+ public ICElement[] findAllDefinitions(IIndex index, IASTName name) throws CoreException {
+ IBinding binding= name.resolveBinding();
+ if (binding != null) {
+ IIndexName[] defs= index.findDefinitions(binding);
- return EMPTY_ELEMENTS;
- }
-
- private ICElement[] getCElementsForNames(ICProject project, IName[] defs) {
- if (defs != null && defs.length > 0) {
- HashSet result= new HashSet(defs.length);
+ ArrayList result= new ArrayList();
for (int i = 0; i < defs.length; i++) {
- IName defName = defs[i];
- assert !defName.isReference();
- ICElement elem= getCElementForName(project, defName);
- if (elem != null) {
- result.add(elem);
+ IIndexName in = defs[i];
+ ICElement definition= getCElementForName(null, in);
+ if (definition != null) {
+ result.add(definition);
}
+
}
return (ICElement[]) result.toArray(new ICElement[result.size()]);
}
return EMPTY_ELEMENTS;
}
-
- private ICElement getCElementForName(ICProject project, IName declName) {
+
+ public ICElement getCElementForName(ICProject preferProject, IName declName) {
assert !declName.isReference();
- ITranslationUnit tu= getTranslationUnit(project, declName);
+ ITranslationUnit tu= getTranslationUnit(preferProject, declName);
if (tu != null) {
IRegion region= null;
if (declName instanceof IIndexName) {
@@ -553,55 +439,12 @@ public class CIndexQueries {
return deltaOffset >= 0 && deltaEndoffset <= 0;
}
- public ICElement findDefinition(ICProject[] projectsToSearch, IASTName name) {
- name.resolveBinding();
-
- for (int i = 0; i < projectsToSearch.length; i++) {
- ICProject project = projectsToSearch[i];
- ICElement definition= findDefinition(project, name);
- if (definition != null) {
- return definition;
- }
- }
- return null;
- }
-
- public ICElement findDefinition(ICProject project, IASTName name) {
- if (name.isDefinition()) {
- return getCElementForName(project, name);
- }
-
- PDOM pdom;
- try {
- pdom = (PDOM) CCorePlugin.getPDOMManager().getPDOM(project);
- if (pdom != null) {
- pdom.acquireReadLock();
- try {
- IBinding binding= getPDOMBinding(pdom, name);
- if (binding != null) {
- ICElement elem= getFirstCElementForNames(project, pdom.getDefinitions(binding));
- if (elem != null) {
- return elem;
- }
- }
- }
- finally {
- pdom.releaseReadLock();
- }
- }
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
- } catch (InterruptedException e) {
- }
-
- return null;
- }
-
- private ICElement getFirstCElementForNames(ICProject project, IName[] defs) {
- if (defs != null) {
- for (int i = 0; i < defs.length; i++) {
- IName defName = defs[i];
- ICElement elem= getCElementForName(project, defName);
+ public ICElement findAnyDeclaration(IIndex index, ICProject preferProject, IASTName name) throws CoreException {
+ IBinding binding= name.resolveBinding();
+ if (binding != null) {
+ IIndexName[] names= index.findNames(binding, IIndex.FIND_DECLARATIONS);
+ for (int i = 0; i < names.length; i++) {
+ ICElement elem= getCElementForName(preferProject, names[i]);
if (elem != null) {
return elem;
}
@@ -609,48 +452,4 @@ public class CIndexQueries {
}
return null;
}
-
- public ICElement findAnyDeclaration(ICProject[] projectsToSearch, IASTName name) {
- name.resolveBinding();
-
- for (int i = 0; i < projectsToSearch.length; i++) {
- ICProject project = projectsToSearch[i];
- ICElement declaration= findAnyDeclaration(project, name);
- if (declaration != null) {
- return declaration;
- }
- }
- return null;
- }
-
- public ICElement findAnyDeclaration(ICProject project, IASTName name) {
- PDOM pdom;
- try {
- pdom = (PDOM) CCorePlugin.getPDOMManager().getPDOM(project);
- if (pdom != null) {
- pdom.acquireReadLock();
- try {
- IBinding binding= getPDOMBinding(pdom, name);
- if (binding != null) {
- ICElement elem= getFirstCElementForNames(project, pdom.getDefinitions(binding));
- if (elem != null) {
- return elem;
- }
- elem= getFirstCElementForNames(project, pdom.getDeclarations(binding));
- if (elem != null) {
- return elem;
- }
- }
- }
- finally {
- pdom.releaseReadLock();
- }
- }
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
- } catch (InterruptedException e) {
- }
-
- return null;
- }
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchBindingQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchBindingQuery.java
index ca11faa758c..3ce47180887 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchBindingQuery.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchBindingQuery.java
@@ -7,19 +7,22 @@
*
* Contributors:
* QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.search;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
-import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexBinding;
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.ui.CUIPlugin;
+
/**
* @author Doug Schaefer
*
@@ -27,16 +30,16 @@ import org.eclipse.core.runtime.Status;
*/
public class PDOMSearchBindingQuery extends PDOMSearchQuery {
- private PDOMBinding binding;
+ private IIndexBinding binding;
- public PDOMSearchBindingQuery(ICElement[] scope, PDOMBinding binding, int flags) {
+ public PDOMSearchBindingQuery(ICElement[] scope, IIndexBinding binding, int flags) {
super(scope, flags);
this.binding = binding;
}
- public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
+ public IStatus runWithIndex(IIndex index, IProgressMonitor monitor) throws OperationCanceledException {
try {
- createMatches(binding.getLinkage().getLanguage(), binding);
+ createMatches(index, binding);
return Status.OK_STATUS;
} catch (CoreException e) {
return new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, 0, e.getLocalizedMessage(), e);
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElement.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElement.java
index 5707aba4b4f..fcb68c18197 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElement.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElement.java
@@ -7,14 +7,16 @@
*
* Contributors:
* QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.search;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.cdt.core.index.IIndexBinding;
+import org.eclipse.cdt.core.index.IIndexName;
+
/**
* Element class used to group matches.
*
@@ -22,14 +24,14 @@ import org.eclipse.core.runtime.CoreException;
*/
public class PDOMSearchElement {
- private final PDOMBinding binding;
+ private final IIndexBinding binding;
private final String name;
private final String filename;
- public PDOMSearchElement(PDOMName name) throws CoreException {
- binding = name.getPDOMBinding();
+ public PDOMSearchElement(IIndexName name, IIndexBinding binding) throws CoreException {
+ this.binding= binding;
this.name = binding.getName();
- filename = name.getFile().getFileName().getString();
+ filename = name.getFileName();
}
public int hashCode() {
@@ -50,7 +52,7 @@ public class PDOMSearchElement {
return filename;
}
- public PDOMBinding getBinding() {
+ public IIndexBinding getBinding() {
return binding;
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElementQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElementQuery.java
index 4cdca961e96..169cbb50b77 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElementQuery.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElementQuery.java
@@ -7,24 +7,27 @@
*
* Contributors:
* QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.search;
-import org.eclipse.cdt.core.dom.ast.IASTName;
-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
-import org.eclipse.cdt.core.dom.ast.IBinding;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.core.model.ILanguage;
-import org.eclipse.cdt.core.model.ISourceRange;
-import org.eclipse.cdt.core.model.ISourceReference;
-import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
+import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.ILanguage;
+import org.eclipse.cdt.core.model.ISourceRange;
+import org.eclipse.cdt.core.model.ISourceReference;
+import org.eclipse.cdt.core.model.ITranslationUnit;
+
/**
* @author Doug Schaefer
*
@@ -38,17 +41,17 @@ public class PDOMSearchElementQuery extends PDOMSearchQuery {
this.element = element;
}
- public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
+ public IStatus runWithIndex(IIndex index, IProgressMonitor monitor) throws OperationCanceledException {
try {
ISourceRange range = element.getSourceRange();
ITranslationUnit tu = element.getTranslationUnit();
+ IASTTranslationUnit ast= tu.getAST(index, ITranslationUnit.AST_SKIP_ALL_HEADERS);
ILanguage language = tu.getLanguage();
- IASTTranslationUnit ast = language.getASTTranslationUnit(tu, ILanguage.AST_SKIP_ALL_HEADERS | ILanguage.AST_USE_INDEX);
IASTName[] names = language.getSelectedNames(ast, range.getIdStartPos(), range.getIdLength());
-
+
for (int i = 0; i < names.length; ++i) {
IBinding binding = names[i].resolveBinding();
- createMatches(language, binding);
+ createMatches(index, binding);
}
return Status.OK_STATUS;
} catch (CoreException e) {
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchMatch.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchMatch.java
index d7ff962e8ec..bc90f99899c 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchMatch.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchMatch.java
@@ -7,22 +7,25 @@
*
* Contributors:
* QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.search;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.search.ui.text.Match;
+import org.eclipse.cdt.core.index.IIndexBinding;
+import org.eclipse.cdt.core.index.IIndexName;
+
/**
* @author Doug Schaefer
*
*/
public class PDOMSearchMatch extends Match {
- public PDOMSearchMatch(PDOMName name, int offset, int length) throws CoreException {
- super(new PDOMSearchElement(name), offset, length);
+ public PDOMSearchMatch(IIndexBinding binding, IIndexName name, int offset, int length) throws CoreException {
+ super(new PDOMSearchElement(name, binding), offset, length);
}
public String getFileName() throws CoreException {
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPatternQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPatternQuery.java
index a0380c883b6..2efd30ed0cb 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPatternQuery.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPatternQuery.java
@@ -24,9 +24,6 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.dom.IPDOM;
-import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
@@ -38,10 +35,10 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceAlias;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexBinding;
+import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.core.model.ICProject;
-
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.ui.util.Messages;
@@ -122,35 +119,18 @@ public class PDOMSearchPatternQuery extends PDOMSearchQuery {
pattern = (Pattern[])patternList.toArray(new Pattern[patternList.size()]);
}
- public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
+ public IStatus runWithIndex(IIndex index, IProgressMonitor monitor) throws OperationCanceledException {
try {
- for (int i = 0; i < projects.length; ++i)
- searchProject(projects[i], monitor);
- return Status.OK_STATUS;
- } catch (CoreException e) {
- return e.getStatus();
- }
- }
-
- private void searchProject(ICProject project, IProgressMonitor monitor) throws CoreException {
- IPDOM pdom = CCorePlugin.getPDOMManager().getPDOM(project);
-
- try {
- pdom.acquireReadLock();
- } catch (InterruptedException e) {
- return;
- }
-
- try {
- IBinding[] bindings = pdom.findBindings(pattern, monitor);
+ IndexFilter filter= new IndexFilter();
+ IIndexBinding[] bindings = index.findBindings(pattern, false, filter, monitor);
for (int i = 0; i < bindings.length; ++i) {
- PDOMBinding pdomBinding = (PDOMBinding)bindings[i];
-
+ IIndexBinding pdomBinding = bindings[i];
+
//check for the element type of this binding and create matches if
//the element type checkbox is checked in the C/C++ Search Page
-
+
//TODO search for macro
-
+
boolean matches= false;
if ((flags & FIND_ALL_TYPES) == FIND_ALL_TYPES) {
matches= true;
@@ -192,14 +172,15 @@ public class PDOMSearchPatternQuery extends PDOMSearchQuery {
matches= (flags & FIND_TYPEDEF) != 0;
}
if (matches) {
- createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
+ createMatches(index, pdomBinding);
}
}
- } finally {
- pdom.releaseReadLock();
+ } catch (CoreException e) {
+ return e.getStatus();
}
+ return Status.OK_STATUS;
}
-
+
public String getLabel() {
return Messages.format(CSearchMessages.getString("PDOMSearchPatternQuery.PatternQuery_labelPatternInScope"), super.getLabel(), patternStr, scopeDesc); //$NON-NLS-1$
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java
index 7bc559e5eb3..d678435b3a7 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java
@@ -7,6 +7,7 @@
*
* Contributors:
* QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.search;
@@ -14,21 +15,24 @@ package org.eclipse.cdt.internal.ui.search;
import java.util.HashMap;
import java.util.Map;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.ISearchResult;
+
import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexBinding;
+import org.eclipse.cdt.core.index.IIndexName;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
-import org.eclipse.cdt.core.model.ILanguage;
-import org.eclipse.cdt.internal.core.pdom.PDOM;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
import org.eclipse.cdt.ui.CUIPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.search.ui.ISearchQuery;
-import org.eclipse.search.ui.ISearchResult;
/**
* @author Doug Schaefer
@@ -101,37 +105,46 @@ public abstract class PDOMSearchQuery implements ISearchQuery {
* @param name
* @return true to filter name out of the match list
*/
- protected boolean filterName(PDOMName name) {
+ protected boolean filterName(IIndexName name) {
return false; // i.e. keep it
}
- private void collectNames(PDOMName name) throws CoreException {
- while (name != null) {
+ private void collectNames(IIndex index, IIndexName[] names) throws CoreException {
+ for (int i = 0; i < names.length; i++) {
+ IIndexName name = names[i];
if (!filterName(name)) {
IASTFileLocation loc = name.getFileLocation();
- result.addMatch(new PDOMSearchMatch(name, loc.getNodeOffset(), loc.getNodeLength()));
- name = name.getNextInBinding();
+ IIndexBinding binding= index.findBinding(name);
+ result.addMatch(new PDOMSearchMatch(binding, name, loc.getNodeOffset(), loc.getNodeLength()));
}
}
}
- protected void createMatches(ILanguage language, IBinding binding) throws CoreException {
- IPDOMManager manager = CCorePlugin.getPDOMManager();
- for (int i = 0; i < projects.length; ++i) {
- PDOM pdom = (PDOM)manager.getPDOM(projects[i]);
- PDOMBinding pdomBinding = pdom.getLinkage(language).adaptBinding(binding);
- if (pdomBinding != null) {
- if ((flags & FIND_DECLARATIONS) != 0) {
- collectNames(pdomBinding.getFirstDeclaration());
- }
- if ((flags & FIND_DEFINITIONS) != 0) {
- collectNames(pdomBinding.getFirstDefinition());
- }
- if ((flags & FIND_REFERENCES) != 0) {
- collectNames(pdomBinding.getFirstReference());
- }
- }
- }
+ protected void createMatches(IIndex index, IBinding binding) throws CoreException {
+ if (binding != null) {
+ IIndexName[] names= index.findNames(binding, flags);
+ collectNames(index, names);
+ }
}
+ public final IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
+ try {
+ IIndex index= CCorePlugin.getIndexManager().getIndex(projects, 0);
+ try {
+ index.acquireReadLock();
+ } catch (InterruptedException e) {
+ return Status.CANCEL_STATUS;
+ }
+ try {
+ return runWithIndex(index, monitor);
+ }
+ finally {
+ index.releaseReadLock();
+ }
+ } catch (CoreException e) {
+ return e.getStatus();
+ }
+ }
+
+ abstract protected IStatus runWithIndex(IIndex index, IProgressMonitor monitor);
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java
index 4c11157e0b5..9220148b530 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchResult.java
@@ -7,6 +7,7 @@
*
* Contributors:
* QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.search;
@@ -14,10 +15,6 @@ package org.eclipse.cdt.internal.ui.search;
import java.util.ArrayList;
import java.util.List;
-import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
-import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
-import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
@@ -33,6 +30,11 @@ import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.cdt.core.index.IIndexName;
+import org.eclipse.cdt.ui.CUIPlugin;
+
+import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
+
/**
* @author Doug Schaefer
*
@@ -117,10 +119,9 @@ public class PDOMSearchResult extends AbstractTextSearchResult implements IEdito
}
public IFile getFile(Object element) {
- if (element instanceof PDOMName) {
- PDOMName name = (PDOMName)element;
- IASTFileLocation loc = name.getFileLocation();
- IPath path = new Path(loc.getFileName());
+ if (element instanceof IIndexName) {
+ IIndexName name = (IIndexName)element;
+ IPath path = new Path(name.getFileName());
IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(path);
if (files.length > 0)
return files[0];
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTextSelectionQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTextSelectionQuery.java
index 8af08c49db5..bb5cde05dab 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTextSelectionQuery.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTextSelectionQuery.java
@@ -7,23 +7,25 @@
*
* Contributors:
* QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.search;
-import org.eclipse.cdt.core.dom.ast.IASTName;
-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
-import org.eclipse.cdt.core.dom.ast.IBinding;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.core.model.ILanguage;
-import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.ILanguage;
+import org.eclipse.cdt.core.model.ITranslationUnit;
+
/**
* @author Doug Schaefer
*
@@ -39,16 +41,16 @@ public class PDOMSearchTextSelectionQuery extends PDOMSearchQuery {
this.selection = selection;
}
- public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
+ protected IStatus runWithIndex(IIndex index, IProgressMonitor monitor) {
try {
+ IASTTranslationUnit ast= tu.getAST(index, ITranslationUnit.AST_SKIP_ALL_HEADERS);
ILanguage language = tu.getLanguage();
- IASTTranslationUnit ast = language.getASTTranslationUnit(tu, ILanguage.AST_SKIP_ALL_HEADERS | ILanguage.AST_USE_INDEX);
IASTName[] names = language.getSelectedNames(ast, selection.getOffset(), selection.getLength());
for (int i = 0; i < names.length; ++i) {
IBinding binding = names[i].resolveBinding();
if (binding != null)
- createMatches(language, binding);
+ createMatches(index, binding);
}
return Status.OK_STATUS;
} catch (CoreException e) {
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsAction.java
index ba3e31e85e9..472344b6a10 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsAction.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsAction.java
@@ -29,8 +29,6 @@ import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.ui.CUIPlugin;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
-
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.editor.CEditorMessages;
@@ -65,8 +63,8 @@ public class OpenDeclarationsAction extends SelectionParseAction {
int style = 0;
// IPDOM pdom = CCorePlugin.getPDOMManager().getPDOM(workingCopy.getCProject());
// if (!pdom.isEmpty())
-// style |= ILanguage.AST_SKIP_ALL_HEADERS | ILanguage.AST_USE_INDEX;
- IASTTranslationUnit ast = workingCopy.getLanguage().getASTTranslationUnit(workingCopy, style);
+// style |= ITranslationUnit.AST_SKIP_ALL_HEADERS;
+ IASTTranslationUnit ast = workingCopy.getAST(null, style);
IASTName[] selectedNames = workingCopy.getLanguage().getSelectedNames(ast, selectionStart, selectionLength);
if (selectedNames.length > 0 && selectedNames[0] != null) { // just right, only one name selected
@@ -85,24 +83,32 @@ public class OpenDeclarationsAction extends SelectionParseAction {
}
}
});
- } else if (binding instanceof PDOMBinding) {
- PDOMBinding pdomBinding = (PDOMBinding)binding;
- IName name = pdomBinding.getFirstDefinition();
- if (name == null)
- name = pdomBinding.getFirstDeclaration();
- if (name != null) {
- final IName dname = name;
- Display.getDefault().asyncExec(new Runnable() {
- public void run() {
- try {
- open(dname);
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
- }
- }
- });
- }
- }
+ }
+ // mstodo revisit
+// else if (binding instanceof IIndexBinding) {
+// IIndexBinding pdomBinding = (IIndexBinding)binding;
+// IName name = pdomBinding.getFirstDefinition();
+// if (name == null)
+// name = pdomBinding.getFirstDeclaration();
+// // no source location - TODO spit out an error in the status bar
+// if (name != null) {
+// IASTFileLocation fileloc = name.getFileLocation();
+// if (fileloc != null) {
+// final IPath path = new Path(fileloc.getFileName());
+// final int offset = fileloc.getNodeOffset();
+// final int length = fileloc.getNodeLength();
+// Display.getDefault().asyncExec(new Runnable() {
+// public void run() {
+// try {
+// open(path, offset, length);
+// } catch (CoreException e) {
+// CUIPlugin.getDefault().log(e);
+// }
+// }
+// });
+// }
+// }
+// }
}
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDefinitionAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDefinitionAction.java
index adc86c98b47..ec1af87c40c 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDefinitionAction.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDefinitionAction.java
@@ -12,19 +12,25 @@
package org.eclipse.cdt.internal.ui.search.actions;
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.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.swt.widgets.Display;
+import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IName;
+import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
-import org.eclipse.cdt.core.model.ILanguage;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexManager;
+import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.ui.CUIPlugin;
@@ -65,28 +71,48 @@ public class OpenDefinitionAction extends SelectionParseAction {
if (workingCopy == null)
return Status.CANCEL_STATUS;
- IASTTranslationUnit ast = workingCopy.getLanguage().getASTTranslationUnit(workingCopy, ILanguage.AST_SKIP_ALL_HEADERS | ILanguage.AST_USE_INDEX);
- IASTName[] selectedNames = workingCopy.getLanguage().getSelectedNames(ast, selectionStart, selectionLength);
-
- if (selectedNames.length > 0 && selectedNames[0] != null) { // just right, only one name selected
- IASTName searchName = selectedNames[0];
-
- IBinding binding = searchName.resolveBinding();
- if (binding != null) {
- final IName[] declNames = ast.getDefinitions(binding);
- if (declNames.length > 0) {
- runInUIThread(new Runnable() {
- public void run() {
- try {
- open(declNames[0]);
- } catch (CoreException e) {
- CUIPlugin.getDefault().log(e);
- }
- }
- });
+ IIndex index= CCorePlugin.getIndexManager().getIndex(workingCopy.getCProject(),
+ IIndexManager.ADD_DEPENDENCIES | IIndexManager.ADD_DEPENDENT);
+ try {
+ index.acquireReadLock();
+ } catch (InterruptedException e1) {
+ return Status.CANCEL_STATUS;
+ }
+ try {
+ IASTTranslationUnit ast = workingCopy.getAST(index, ITranslationUnit.AST_SKIP_ALL_HEADERS);
+ IASTName[] selectedNames = workingCopy.getLanguage().getSelectedNames(ast, selectionStart, selectionLength);
+
+ if (selectedNames.length > 0 && selectedNames[0] != null) { // just right, only one name selected
+ IASTName searchName = selectedNames[0];
+
+ IBinding binding = searchName.resolveBinding();
+ if (binding != null) {
+ final IName[] declNames = ast.getDefinitions(binding);
+ if (declNames.length > 0) {
+ IASTFileLocation fileloc = declNames[0].getFileLocation();
+ // no source location - TODO spit out an error in the status bar
+ if (fileloc != null) {
+ final IPath path = new Path(fileloc.getFileName());
+ final int offset = fileloc.getNodeOffset();
+ final int length = fileloc.getNodeLength();
+
+ runInUIThread(new Runnable() {
+ public void run() {
+ try {
+ open(path, offset, length);
+ } catch (CoreException e) {
+ CUIPlugin.getDefault().log(e);
+ }
+ }
+ });
+ }
+ }
}
}
}
+ finally {
+ index.releaseReadLock();
+ }
return Status.OK_STATUS;
} catch (CoreException e) {
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/SelectionParseAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/SelectionParseAction.java
index 33c329f8226..15ef71cb0ef 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/SelectionParseAction.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/SelectionParseAction.java
@@ -32,6 +32,7 @@ import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;
@@ -459,10 +460,15 @@ public class SelectionParseAction extends Action {
if (fileloc == null)
// no source location - TODO spit out an error in the status bar
return;
+
+ IPath path = new Path(fileloc.getFileName());
int currentOffset = fileloc.getNodeOffset();
int currentLength = fileloc.getNodeLength();
- IPath path = new Path(fileloc.getFileName());
+ open(path, currentOffset, currentLength);
+ }
+
+ protected void open(IPath path, int currentOffset, int currentLength) throws PartInitException {
IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(path);
if (files.length > 0) {
IEditorPart editor = IDE.openEditor(CUIPlugin.getActivePage(), files[0]);
@@ -484,8 +490,7 @@ public class SelectionParseAction extends Action {
textEditor.selectAndReveal(currentOffset, currentLength);
}
}
-
- }
+ }
public void update() {
setEnabled(getSelectedStringFromEditor() != null);
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java
index 73220377770..75217b72d13 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java
@@ -744,11 +744,7 @@ public class CSourceViewerConfiguration extends TextSourceViewerConfiguration {
}
}
if (contentType != null) {
- try {
- return LanguageManager.getInstance().getLanguage(contentType);
- } catch (CoreException exc) {
- CUIPlugin.getDefault().log(exc.getStatus());
- }
+ return LanguageManager.getInstance().getLanguage(contentType);
}
}
return null;
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/PDOMCompletionContributor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/PDOMCompletionContributor.java
index a3a32d1f54e..2b2c0af3662 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/PDOMCompletionContributor.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/PDOMCompletionContributor.java
@@ -7,14 +7,17 @@
*
* Contributors:
* QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.text.contentassist;
import java.util.List;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.ITextViewer;
+
import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.dom.IPDOM;
import org.eclipse.cdt.core.dom.IPDOMNode;
import org.eclipse.cdt.core.dom.IPDOMVisitor;
import org.eclipse.cdt.core.dom.ast.ASTCompletionNode;
@@ -28,13 +31,12 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.model.IWorkingCopy;
+import org.eclipse.cdt.ui.CUIPlugin;
+import org.eclipse.cdt.ui.text.contentassist.ICompletionContributor;
+
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
-import org.eclipse.cdt.ui.CUIPlugin;
-import org.eclipse.cdt.ui.text.contentassist.ICompletionContributor;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.text.ITextViewer;
/**
* @author Doug Schaefer
@@ -59,7 +61,7 @@ public class PDOMCompletionContributor extends DOMCompletionContributor implemen
return;
try {
- IPDOM pdom = CCorePlugin.getPDOMManager().getPDOM(workingCopy.getCProject());
+ PDOM pdom = (PDOM) CCorePlugin.getPDOMManager().getPDOM(workingCopy.getCProject());
IASTName[] names = completionNode.getNames();
for (int i = 0; i < names.length; ++i) {
IASTName name = names[i];
@@ -88,7 +90,7 @@ public class PDOMCompletionContributor extends DOMCompletionContributor implemen
IType type = expression.getExpressionType();
if (type != null && type instanceof IBinding) {
IBinding binding = (IBinding)type;
- PDOMLinkage linkage = ((PDOM)pdom).getLinkage(workingCopy.getLanguage());
+ PDOMLinkage linkage = pdom.getLinkage(name.getLinkage().getID());
PDOMBinding pdomBinding = linkage.adaptBinding(binding);
if (pdomBinding != null) {
pdomBinding.accept(new IPDOMVisitor() {
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java
index f0b97385b74..30f0d82898a 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java
@@ -8,6 +8,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
* Anton Leherbauer (Wind River Systems)
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.text.folding;
@@ -24,7 +25,9 @@ import java.util.Map;
import java.util.Stack;
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.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.Assert;
import org.eclipse.jface.text.BadLocationException;
@@ -71,6 +74,7 @@ import org.eclipse.cdt.ui.text.folding.ICFoldingStructureProvider;
import org.eclipse.cdt.internal.ui.editor.ASTProvider;
import org.eclipse.cdt.internal.ui.editor.CEditor;
+import org.eclipse.cdt.internal.ui.editor.ASTProvider.ASTRunnable;
import org.eclipse.cdt.internal.ui.text.DocumentCharacterIterator;
import org.eclipse.cdt.internal.ui.text.ICReconcilingListener;
@@ -1060,7 +1064,7 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
}
- private void computeFoldingStructure(FoldingStructureComputationContext ctx) {
+ private void computeFoldingStructure(final FoldingStructureComputationContext ctx) {
if (fCommentFoldingEnabled) {
// compute comment positions from partitioning
try {
@@ -1079,12 +1083,19 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
if (fPreprocessorBranchFoldingEnabled) {
IASTTranslationUnit ast= ctx.getAST();
if (ast == null) {
- ASTProvider astProvider= CUIPlugin.getDefault().getASTProvider();
- ast= astProvider.getAST(getInputElement(), ASTProvider.WAIT_ACTIVE_ONLY, null);
- if (ast != null) {
- ctx.fAST= ast;
- ctx.fASTPositionConverter= astProvider.getActivePositionConverter(getInputElement());
- fInitialASTReconcile= false;
+ final ASTProvider astProvider= CUIPlugin.getDefault().getASTProvider();
+ IStatus status= astProvider.runOnAST(getInputElement(), ASTProvider.WAIT_ACTIVE_ONLY, null, new ASTRunnable() {
+ public IStatus runOnAST(IASTTranslationUnit ast) {
+ if (ast != null) {
+ ctx.fAST= ast;
+ ctx.fASTPositionConverter= astProvider.getActivePositionConverter(getInputElement());
+ fInitialASTReconcile= false;
+ }
+ return Status.OK_STATUS;
+ }
+ });
+ if (!status.isOK()) {
+ CUIPlugin.getDefault().log(status);
}
}
computeFoldingStructure(ast, ctx);
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassWizardUtil.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassWizardUtil.java
index cb33f6edaf9..6a29b596410 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassWizardUtil.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassWizardUtil.java
@@ -8,6 +8,7 @@
* Contributors:
* QNX Software Systems - initial API and implementation
* IBM Corporation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.wizards.classwizard;
@@ -23,6 +24,7 @@ import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.viewers.IStructuredSelection;
@@ -37,13 +39,15 @@ import org.eclipse.cdt.core.browser.IQualifiedTypeName;
import org.eclipse.cdt.core.browser.ITypeInfo;
import org.eclipse.cdt.core.browser.ITypeReference;
import org.eclipse.cdt.core.browser.TypeSearchScope;
-import org.eclipse.cdt.core.dom.IPDOMManager;
+import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICContainer;
@@ -56,12 +60,10 @@ import org.eclipse.cdt.core.parser.IScannerInfoProvider;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor;
-import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.viewsupport.IViewPartInputProvider;
import org.eclipse.cdt.internal.ui.wizards.filewizard.NewSourceFileGenerator;
-import org.eclipse.core.runtime.NullProgressMonitor;
public class NewClassWizardUtil {
@@ -381,59 +383,76 @@ public class NewClassWizardUtil {
* {@link #SEARCH_MATCH_NOTFOUND}.
*/
public static int searchForCppType(IQualifiedTypeName typeName, ICProject project, Class queryType) {
- if(project == null) {
- return SEARCH_MATCH_ERROR;
- }
-
- String fullyQualifiedTypeName = typeName.getFullyQualifiedName();
-
- IPDOMManager pdomManager = CCorePlugin.getPDOMManager();
+ IIndex index= null;
try {
- PDOM pdom = (PDOM)pdomManager.getPDOM(project);
- IBinding[] bindings = pdom.findBindings(Pattern.compile(typeName.getName()), new NullProgressMonitor());
- boolean sameTypeNameExists = false;
- boolean sameNameDifferentTypeExists = false;
-
- for (int i = 0; i < bindings.length; ++i) {
- ICPPBinding binding = (ICPPBinding)bindings[i];
-
- //get the fully qualified name of this binding
- String bindingFullName = CPPVisitor.renderQualifiedName(binding.getQualifiedName());
-
- Class currentNodeType = binding.getClass();
- // full binding
- if (queryType.isAssignableFrom(currentNodeType)) {
- if (bindingFullName.equals(fullyQualifiedTypeName)) {
- return SEARCH_MATCH_FOUND_EXACT;
- } else {
- // same type , same name , but different name space
- // see if there is an exact match;
- sameTypeNameExists = true;
- }
- } else if(ICPPClassType.class.isAssignableFrom(currentNodeType) ||
- IEnumeration.class.isAssignableFrom(currentNodeType) || // TODO - this should maybe be ICPPEnumeration
- ICPPNamespace.class.isAssignableFrom(currentNodeType) ||
- ITypeDef.class.isAssignableFrom(currentNodeType) ||
- ICPPBasicType.class.isAssignableFrom(currentNodeType))
- {
- if (bindingFullName.equals(fullyQualifiedTypeName)) {
- return SEARCH_MATCH_FOUND_EXACT_ANOTHER_TYPE;
- } else {
- // different type , same name , but different name space
- sameNameDifferentTypeExists = true;
- }
- }
- }
- if(sameTypeNameExists){
- return SEARCH_MATCH_FOUND_ANOTHER_NAMESPACE;
- }
-
- if(sameNameDifferentTypeExists){
- return SEARCH_MATCH_FOUND_ANOTHER_TYPE;
+ if (project != null) {
+ index = CCorePlugin.getIndexManager().getIndex(project);
+ index.acquireReadLock();
}
} catch (CoreException e) {
+ CUIPlugin.getDefault().log(e);
+ return SEARCH_MATCH_ERROR;
+ } catch (InterruptedException e) {
+ }
+ if (index == null) {
return SEARCH_MATCH_ERROR;
}
- return SEARCH_MATCH_NOTFOUND;
+ try {
+ String fullyQualifiedTypeName = typeName.getFullyQualifiedName();
+ try {
+ IndexFilter filter= new IndexFilter() {
+ public boolean acceptLinkage(ILinkage linkage) {
+ return linkage.getID() == ILinkage.CPP_LINKAGE_ID;
+ }
+ };
+ // mstodo revisit, the pattern must be split
+ IBinding[] bindings = index.findBindings(Pattern.compile(typeName.getName()), true, filter, new NullProgressMonitor());
+ boolean sameTypeNameExists = false;
+ boolean sameNameDifferentTypeExists = false;
+
+ for (int i = 0; i < bindings.length; ++i) {
+ ICPPBinding binding = (ICPPBinding)bindings[i];
+
+ //get the fully qualified name of this binding
+ String bindingFullName = CPPVisitor.renderQualifiedName(binding.getQualifiedName());
+ Class currentNodeType = binding.getClass();
+ // full binding
+ if (queryType.isAssignableFrom(currentNodeType)) {
+ if (bindingFullName.equals(fullyQualifiedTypeName)) {
+ return SEARCH_MATCH_FOUND_EXACT;
+ } else {
+ // same type , same name , but different name space
+ // see if there is an exact match;
+ sameTypeNameExists = true;
+ }
+ } else if(ICPPClassType.class.isAssignableFrom(currentNodeType) ||
+ IEnumeration.class.isAssignableFrom(currentNodeType) || // TODO - this should maybe be ICPPEnumeration
+ ICPPNamespace.class.isAssignableFrom(currentNodeType) ||
+ ITypeDef.class.isAssignableFrom(currentNodeType) ||
+ ICPPBasicType.class.isAssignableFrom(currentNodeType))
+ {
+ if (bindingFullName.equals(fullyQualifiedTypeName)) {
+ return SEARCH_MATCH_FOUND_EXACT_ANOTHER_TYPE;
+ } else {
+ // different type , same name , but different name space
+ sameNameDifferentTypeExists = true;
+ }
+ }
+ }
+ if(sameTypeNameExists){
+ return SEARCH_MATCH_FOUND_ANOTHER_NAMESPACE;
+ }
+
+ if(sameNameDifferentTypeExists){
+ return SEARCH_MATCH_FOUND_ANOTHER_TYPE;
+ }
+ } catch (CoreException e) {
+ return SEARCH_MATCH_ERROR;
+ }
+ return SEARCH_MATCH_NOTFOUND;
+ }
+ finally {
+ index.releaseReadLock();
+ }
}
}