1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Extends fix for 180168 (using shared AST) to search.

Extends fix for 183973 (plain C in C++-project) to content-assist, hyperlink-detector, search and source-hover.
This commit is contained in:
Markus Schorn 2007-05-25 09:23:10 +00:00
parent 6c578aa80c
commit c8dce15ce0
18 changed files with 223 additions and 131 deletions

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.model.CoreModel;
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.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
@ -157,7 +158,7 @@ public class ASTCacheTests extends BaseTestCase {
final int[] counter= {0};
cache.setActiveElement(fTU1);
IStatus status= cache.runOnAST(fTU1, false, null, new ASTRunnable() {
public IStatus runOnAST(IASTTranslationUnit ast) throws CoreException {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) throws CoreException {
assertNull(ast);
counter[0]++;
return Status.OK_STATUS;
@ -168,7 +169,7 @@ public class ASTCacheTests extends BaseTestCase {
IProgressMonitor npm= new NullProgressMonitor();
npm.setCanceled(true);
status= cache.runOnAST(fTU1, true, npm, new ASTRunnable() {
public IStatus runOnAST(IASTTranslationUnit ast) throws CoreException {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) throws CoreException {
assertNull(ast);
counter[0]++;
return Status.OK_STATUS;
@ -178,7 +179,7 @@ public class ASTCacheTests extends BaseTestCase {
npm.setCanceled(false);
status= cache.runOnAST(fTU1, true, npm, new ASTRunnable() {
public IStatus runOnAST(IASTTranslationUnit ast) throws CoreException {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) throws CoreException {
assertNotNull(ast);
counter[0]++;
return Status.OK_STATUS;
@ -203,7 +204,7 @@ public class ASTCacheTests extends BaseTestCase {
}
reconciler1.fStopped= true;
IStatus status= cache.runOnAST(fTU1, true, null, new ASTRunnable() {
public IStatus runOnAST(IASTTranslationUnit ast) throws CoreException {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) throws CoreException {
assertNotNull(ast);
assertTrue(cache.isActiveElement(fTU1));
assertFalse(cache.isReconciling(fTU1));
@ -225,7 +226,7 @@ public class ASTCacheTests extends BaseTestCase {
reconciler2.fStopped= true;
status= cache.runOnAST(fTU2, true, null, new ASTRunnable() {
public IStatus runOnAST(IASTTranslationUnit ast) throws CoreException {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) throws CoreException {
assertNotNull(ast);
assertTrue(cache.isActiveElement(fTU2));
assertFalse(cache.isReconciling(fTU2));
@ -256,7 +257,7 @@ public class ASTCacheTests extends BaseTestCase {
cache.setActiveElement(fTU1);
Thread.sleep(50);
waitForAST(cache, fTU1, new ASTRunnable() {
public IStatus runOnAST(IASTTranslationUnit ast) {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) {
assertNotNull(ast);
assertEquals("void foo1() {}", ast.getDeclarations()[0].getRawSignature());
return Status.OK_STATUS;
@ -264,7 +265,7 @@ public class ASTCacheTests extends BaseTestCase {
});
waitForAST(cache, fTU2, new ASTRunnable() {
public IStatus runOnAST(IASTTranslationUnit ast) {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) {
assertNotNull(ast);
assertEquals("void foo2() {}", ast.getDeclarations()[0].getRawSignature());
return Status.OK_STATUS;
@ -275,7 +276,7 @@ public class ASTCacheTests extends BaseTestCase {
cache.setActiveElement(fTU2);
Thread.sleep(50);
waitForAST(cache, fTU2, new ASTRunnable() {
public IStatus runOnAST(IASTTranslationUnit ast) {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) {
assertNotNull(ast);
assertEquals("void foo2() {}", ast.getDeclarations()[0].getRawSignature());
return Status.OK_STATUS;
@ -283,7 +284,7 @@ public class ASTCacheTests extends BaseTestCase {
});
waitForAST(cache, fTU1, new ASTRunnable() {
public IStatus runOnAST(IASTTranslationUnit ast) {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) {
assertNotNull(ast);
assertEquals("void foo1() {}", ast.getDeclarations()[0].getRawSignature());
return Status.OK_STATUS;

View file

@ -14,6 +14,7 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexManager;
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;
@ -50,10 +51,11 @@ public class ASTCache {
/**
* Do something with the given AST.
*
* @param lang the language with which the AST has been created.
* @param ast the translation unit AST, may be <code>null</code>
* @return a status object
*/
IStatus runOnAST(IASTTranslationUnit ast) throws CoreException;
IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) throws CoreException;
}
private final int fParseMode;
@ -205,7 +207,8 @@ public class ASTCache {
try {
IASTTranslationUnit ast= getAST(tUnit, index, wait, monitor);
return astRunnable.runOnAST(ast);
ILanguage lang= (tUnit instanceof TranslationUnit) ? ((TranslationUnit) tUnit).getLanguageOfContext() : tUnit.getLanguage();
return astRunnable.runOnAST(lang, ast);
}
catch (CoreException e) {
return e.getStatus();

View file

@ -83,6 +83,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
protected IProblemRequestor problemRequestor;
SourceManipulationInfo sourceManipulationInfo = null;
private ILanguage fLanguageOfContext;
public TranslationUnit(ICElement parent, IFile file, String idType) {
super(parent, file, ICElement.C_UNIT);
@ -754,9 +755,41 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
codeReaderFactory= new IndexBasedCodeReaderFactory(getCProject(), index, codeReaderFactory);
}
ITranslationUnit configureWith = getSourceContextTU(index, style);
IScannerInfo scanInfo= configureWith.getScannerInfo( (style & AST_SKIP_IF_NO_BUILD_INFO) == 0);
if (scanInfo == null) {
return null;
}
CodeReader reader;
reader = getCodeReader();
if (reader != null) {
ILanguage language= configureWith.getLanguage();
fLanguageOfContext= language;
if (language != null) {
if (language instanceof AbstractLanguage) {
int options= 0;
if ((style & AST_SKIP_FUNCTION_BODIES) != 0) {
options |= AbstractLanguage.OPTION_SKIP_FUNCTION_BODIES;
}
if ((style & AST_CREATE_COMMENT_NODES) != 0) {
options |= AbstractLanguage.OPTION_ADD_COMMENTS;
}
return ((AbstractLanguage)language).getASTTranslationUnit(reader, scanInfo, codeReaderFactory, index, options, ParserUtil.getParserLogService());
}
return language.getASTTranslationUnit(reader, scanInfo, codeReaderFactory, index, ParserUtil.getParserLogService());
}
}
return null;
}
private ITranslationUnit getSourceContextTU(IIndex index, int style) {
ITranslationUnit configureWith= this;
try {
if (index != null && (style & AST_CONFIGURE_USING_SOURCE_CONTEXT) != 0) {
if (index != null && (style & AST_CONFIGURE_USING_SOURCE_CONTEXT) != 0) {
try {
fLanguageOfContext= null;
IIndexFile context= null;
IIndexFile indexFile= index.getFile(IndexLocationFactory.getIFL(this));
if (indexFile != null) {
@ -773,36 +806,11 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
}
}
}
}
catch (CoreException e) {
CCorePlugin.log(e);
}
IScannerInfo scanInfo= configureWith.getScannerInfo( (style & AST_SKIP_IF_NO_BUILD_INFO) == 0);
if (scanInfo == null) {
return null;
}
CodeReader reader;
reader = getCodeReader();
if (reader != null) {
ILanguage language= configureWith.getLanguage();
if (language != null) {
if (language instanceof AbstractLanguage) {
int options= 0;
if ((style & AST_SKIP_FUNCTION_BODIES) != 0) {
options |= AbstractLanguage.OPTION_SKIP_FUNCTION_BODIES;
}
if ((style & AST_CREATE_COMMENT_NODES) != 0) {
options |= AbstractLanguage.OPTION_ADD_COMMENTS;
}
return ((AbstractLanguage)language).getASTTranslationUnit(reader, scanInfo, codeReaderFactory, index, options, ParserUtil.getParserLogService());
}
return language.getASTTranslationUnit(reader, scanInfo, codeReaderFactory, index, ParserUtil.getParserLogService());
catch (CoreException e) {
CCorePlugin.log(e);
}
}
return null;
return configureWith;
}
private IIndexFile getParsedInContext(IIndexFile indexFile)
@ -829,7 +837,9 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
codeReaderFactory = SavedCodeReaderFactory.getInstance();
}
IScannerInfo scanInfo = getScannerInfo( (style & ITranslationUnit.AST_SKIP_IF_NO_BUILD_INFO) == 0);
ITranslationUnit configureWith= getSourceContextTU(index, style);
IScannerInfo scanInfo = configureWith.getScannerInfo( (style & ITranslationUnit.AST_SKIP_IF_NO_BUILD_INFO) == 0);
if (scanInfo == null) {
return null;
}
@ -837,7 +847,8 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
CodeReader reader;
reader = getCodeReader();
ILanguage language= getLanguage();
ILanguage language= configureWith.getLanguage();
fLanguageOfContext= language;
if (language != null) {
return language.getCompletionNode(reader, scanInfo, codeReaderFactory, index, ParserUtil.getParserLogService(), offset);
}
@ -882,4 +893,13 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
}
return null;
}
/**
* Return the language of the context this file was parsed in. Works only after using
* {@link #getAST(IIndex, int)} with the flag {@link ITranslationUnit#AST_CONFIGURE_USING_SOURCE_CONTEXT}.
*/
public ILanguage getLanguageOfContext() throws CoreException {
final ILanguage result= fLanguageOfContext;
return result != null ? result : getLanguage();
}
}

View file

@ -25,6 +25,7 @@ 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.jface.action.IAction;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.TextSelection;
@ -47,12 +48,15 @@ import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.model.CoreModel;
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.testplugin.FileManager;
import org.eclipse.cdt.ui.tests.BaseUITestCase;
import org.eclipse.cdt.internal.core.model.ASTCache.ASTRunnable;
import org.eclipse.cdt.internal.core.parser.ParserException;
import org.eclipse.cdt.internal.ui.editor.ASTProvider;
import org.eclipse.cdt.internal.ui.editor.ICEditorActionDefinitionIds;
import org.eclipse.cdt.internal.ui.search.actions.OpenDeclarationsAction;
@ -210,16 +214,21 @@ public class BaseSelectionTestsIndexer extends BaseUITestCase {
// the action above should highlight the declaration, so now retrieve it and use that selection to get the IASTName selected on the TU
ISelection sel = ((AbstractTextEditor)part).getSelectionProvider().getSelection();
final IASTName[] result= {null};
if (sel instanceof ITextSelection) {
ITextSelection textSel = (ITextSelection)sel;
final ITextSelection textSel = (ITextSelection)sel;
ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(file);
IASTTranslationUnit ast = tu.getAST();
IASTName[] names = tu.getLanguage().getSelectedNames(ast, textSel.getOffset(), textSel.getLength());
if (names == null || names.length == 0)
return null;
return names[0];
IStatus ok= ASTProvider.getASTProvider().runOnAST(tu, ASTProvider.WAIT_YES, monitor, new ASTRunnable() {
public IStatus runOnAST(ILanguage language, IASTTranslationUnit ast) throws CoreException {
IASTName[] names = language.getSelectedNames(ast, textSel.getOffset(), textSel.getLength());
if (names != null && names.length > 0)
result[0]= names[0];
return Status.OK_STATUS;
}
});
assertTrue(ok.isOK());
return result[0];
}
}

View file

@ -28,8 +28,10 @@ import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
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.jface.text.ITextSelection;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelection;
@ -47,14 +49,17 @@ import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.model.CoreModel;
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.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.FileManager;
import org.eclipse.cdt.ui.tests.BaseUITestCase;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.model.ASTCache.ASTRunnable;
import org.eclipse.cdt.internal.core.parser.ParserException;
import org.eclipse.cdt.internal.ui.editor.ASTProvider;
import org.eclipse.cdt.internal.ui.search.actions.OpenDeclarationsAction;
/**
@ -241,17 +246,21 @@ public class CPPSelectionTestsNoIndexer extends BaseUITestCase {
// the action above should highlight the declaration, so now retrieve it and use that selection to get the IASTName selected on the TU
ISelection sel = ((AbstractTextEditor)part).getSelectionProvider().getSelection();
if (sel instanceof TextSelection) {
ITextSelection textSel = (ITextSelection)sel;
final IASTName[] result= {null};
if (sel instanceof ITextSelection) {
final ITextSelection textSel = (ITextSelection)sel;
ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(file);
IASTTranslationUnit ast = tu.getAST();
IASTName[] names = tu.getLanguage().getSelectedNames(ast, textSel.getOffset(), textSel.getLength());
if (names.length == 0) {
assertFalse(true);
} else {
return names[0];
}
IStatus ok= ASTProvider.getASTProvider().runOnAST(tu, ASTProvider.WAIT_YES, monitor, new ASTRunnable() {
public IStatus runOnAST(ILanguage language, IASTTranslationUnit ast) throws CoreException {
IASTName[] names = language.getSelectedNames(ast, textSel.getOffset(), textSel.getLength());
if (names != null && names.length > 0)
result[0]= names[0];
return Status.OK_STATUS;
}
});
assertTrue(ok.isOK());
return result[0];
}
}

View file

@ -26,8 +26,10 @@ import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
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.jface.text.ITextSelection;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelection;
@ -44,14 +46,17 @@ import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.model.CoreModel;
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.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.FileManager;
import org.eclipse.cdt.ui.tests.BaseUITestCase;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.model.ASTCache.ASTRunnable;
import org.eclipse.cdt.internal.core.parser.ParserException;
import org.eclipse.cdt.internal.ui.editor.ASTProvider;
import org.eclipse.cdt.internal.ui.search.actions.OpenDeclarationsAction;
/**
@ -266,16 +271,21 @@ public class CSelectionTestsNoIndexer extends BaseUITestCase {
// the action above should highlight the declaration, so now retrieve it and use that selection to get the IASTName selected on the TU
ISelection sel = ((AbstractTextEditor)part).getSelectionProvider().getSelection();
if (sel instanceof TextSelection) {
ITextSelection textSel = (ITextSelection)sel;
final IASTName[] result= {null};
if (sel instanceof ITextSelection) {
final ITextSelection textSel = (ITextSelection)sel;
ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(file);
IASTTranslationUnit ast = tu.getAST();
IASTName[] names = tu.getLanguage().getSelectedNames(ast, textSel.getOffset(), textSel.getLength());
if (names == null || names.length == 0)
return null;
return names[0];
IStatus ok= ASTProvider.getASTProvider().runOnAST(tu, ASTProvider.WAIT_YES, monitor, new ASTRunnable() {
public IStatus runOnAST(ILanguage language, IASTTranslationUnit ast) throws CoreException {
IASTName[] names = language.getSelectedNames(ast, textSel.getOffset(), textSel.getLength());
if (names != null && names.length > 0)
result[0]= names[0];
return Status.OK_STATUS;
}
});
assertTrue(ok.isOK());
return result[0];
}
}

View file

@ -33,6 +33,7 @@ import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexManager;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.ui.CUIPlugin;
@ -86,29 +87,27 @@ public class CElementHyperlinkDetector implements IHyperlinkDetector {
final IHyperlink[] result= {null};
try {
ASTProvider.getASTProvider().runOnAST(workingCopy, ASTProvider.WAIT_YES, null, new ASTRunnable() {
public IStatus runOnAST(IASTTranslationUnit ast) {
try {
IASTName[] selectedNames =
workingCopy.getLanguage().getSelectedNames(ast, selection.getOffset(), selection.getLength());
IStatus status= ASTProvider.getASTProvider().runOnAST(workingCopy, ASTProvider.WAIT_YES, null, new ASTRunnable() {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) {
IASTName[] selectedNames=
lang.getSelectedNames(ast, selection.getOffset(), selection.getLength());
IRegion linkRegion;
if(selectedNames.length > 0 && selectedNames[0] != null) { // found a name
linkRegion = new Region(selection.getOffset(), selection.getLength());
}
else { // check if we are in an include statement
linkRegion = matchIncludeStatement(ast, selection);
}
IRegion linkRegion;
if(selectedNames.length > 0 && selectedNames[0] != null) { // found a name
linkRegion = new Region(selection.getOffset(), selection.getLength());
}
else { // check if we are in an include statement
linkRegion = matchIncludeStatement(ast, selection);
}
if(linkRegion != null)
result[0]= new CElementHyperlink(linkRegion, openAction);
}
catch (CoreException e) {
return e.getStatus();
}
if(linkRegion != null)
result[0]= new CElementHyperlink(linkRegion, openAction);
return Status.OK_STATUS;
}
});
if (!status.isOK()) {
CUIPlugin.getDefault().log(status);
}
} finally {
index.releaseReadLock();
}

View file

@ -39,6 +39,7 @@ import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfndefStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.ui.CUIPlugin;
@ -106,7 +107,7 @@ public class InactiveCodeHighlighting implements ICReconcilingListener, ITextInp
if (fTranslationUnit != null) {
final ASTProvider astProvider= CUIPlugin.getDefault().getASTProvider();
result= astProvider.runOnAST(fTranslationUnit, ASTProvider.WAIT_YES, monitor, new ASTCache.ASTRunnable() {
public IStatus runOnAST(IASTTranslationUnit ast) {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) {
reconciled(ast, true, monitor);
return Status.OK_STATUS;
}

View file

@ -44,6 +44,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.core.model.ASTCache;
@ -559,7 +560,7 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener {
final Job me= this;
ASTProvider astProvider= CUIPlugin.getDefault().getASTProvider();
IStatus status= astProvider.runOnAST(element, ASTProvider.WAIT_YES, monitor, new ASTCache.ASTRunnable() {
public IStatus runOnAST(IASTTranslationUnit ast) {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) {
reconciled(ast, true, monitor);
synchronized (fJobLock) {
// allow the job to be gc'ed

View file

@ -50,6 +50,7 @@ import org.eclipse.cdt.core.index.IIndex;
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.ILanguage;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.ui.CUIPlugin;
@ -102,7 +103,7 @@ public class ToggleSourceAndHeaderAction extends TextEditorAction {
{
shouldVisitDeclarators= true;
}
public IStatus runOnAST(IASTTranslationUnit ast) {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) {
fIndex= ast.getIndex();
fFilePath= Path.fromOSString(ast.getFilePath());
fMap= new HashMap();

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2006 QNX Software Systems and others.
* Copyright (c) 2006, 2007 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
@ -18,15 +18,12 @@ 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;
import org.eclipse.cdt.internal.ui.viewsupport.IndexUI;
/**
* @author Doug Schaefer
@ -43,15 +40,11 @@ public class PDOMSearchElementQuery extends PDOMSearchQuery {
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();
IASTName[] names = language.getSelectedNames(ast, range.getIdStartPos(), range.getIdLength());
for (int i = 0; i < names.length; ++i) {
IBinding binding = names[i].resolveBinding();
createMatches(index, binding);
if (element instanceof ICElement) {
IBinding binding= IndexUI.elementToBinding(index, (ICElement) element);
if (binding != null) {
createMatches(index, binding);
}
}
return Status.OK_STATUS;
} catch (CoreException e) {

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2006 QNX Software Systems and others.
* Copyright (c) 2006, 2007 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
@ -26,6 +26,10 @@ import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.core.model.ASTCache.ASTRunnable;
import org.eclipse.cdt.internal.ui.editor.ASTProvider;
/**
* @author Doug Schaefer
*
@ -41,25 +45,23 @@ public class PDOMSearchTextSelectionQuery extends PDOMSearchQuery {
this.selection = selection;
}
protected IStatus runWithIndex(IIndex index, IProgressMonitor monitor) {
try {
IASTTranslationUnit ast= tu.getAST(index, ITranslationUnit.AST_SKIP_ALL_HEADERS);
ILanguage language = tu.getLanguage();
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(index, binding);
protected IStatus runWithIndex(final IIndex index, IProgressMonitor monitor) {
return ASTProvider.getASTProvider().runOnAST(tu, ASTProvider.WAIT_YES, monitor, new ASTRunnable() {
public IStatus runOnAST(ILanguage language, IASTTranslationUnit ast) throws CoreException {
IASTName[] names = language.getSelectedNames(ast, selection.getOffset(), selection.getLength());
if (names != null) {
for (int i = 0; i < names.length; ++i) {
IBinding binding = names[i].resolveBinding();
if (binding != null)
createMatches(index, binding);
}
}
return Status.OK_STATUS;
}
return Status.OK_STATUS;
} catch (CoreException e) {
return e.getStatus();
}
});
}
public String getLabel() {
return super.getLabel() + " " + selection.getText(); //$NON-NLS-1$
}
}

View file

@ -41,6 +41,7 @@ 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.ISourceRange;
import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
@ -107,11 +108,11 @@ public class OpenDeclarationsAction extends SelectionParseAction {
}
}
public IStatus runOnAST(IASTTranslationUnit ast) throws CoreException {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) throws CoreException {
int selectionStart = selNode.getOffset();
int selectionLength = selNode.getLength();
IASTName[] selectedNames = fWorkingCopy.getLanguage().getSelectedNames(ast, selectionStart, selectionLength);
IASTName[] selectedNames = lang.getSelectedNames(ast, selectionStart, selectionLength);
if (selectedNames.length > 0 && selectedNames[0] != null) { // just right, only one name selected
boolean found = false;

View file

@ -40,8 +40,8 @@ import org.eclipse.cdt.internal.ui.editor.CEditorMessages;
/**
* Open Definition Action (Ctrl+F3).
*
* @author dsteffle
*
* @deprecated use {@link OpenDeclarationsAction}.
*/
public class OpenDefinitionAction extends SelectionParseAction {

View file

@ -68,6 +68,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
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.ILanguage;
import org.eclipse.cdt.core.model.ISourceRange;
import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
@ -117,11 +118,11 @@ public class CSourceHover extends AbstractCEditorTextHover implements ITextHover
/*
* @see org.eclipse.cdt.internal.core.model.ASTCache.ASTRunnable#runOnAST(org.eclipse.cdt.core.dom.ast.IASTTranslationUnit)
*/
public IStatus runOnAST(IASTTranslationUnit ast) {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) {
if (ast != null) {
try {
IASTName[] names;
names = fTU.getLanguage().getSelectedNames(ast, fTextRegion.getOffset(), fTextRegion.getLength());
names = lang.getSelectedNames(ast, fTextRegion.getOffset(), fTextRegion.getLength());
if (names != null && names.length >= 1) {
for (int i = 0; i < names.length; i++) {
IASTName name= names[i];

View file

@ -128,7 +128,7 @@ public class CContentAssistInvocationContext extends ContentAssistInvocationCont
}
}
int flags = ITranslationUnit.AST_SKIP_ALL_HEADERS;
int flags = ITranslationUnit.AST_SKIP_ALL_HEADERS | ITranslationUnit.AST_CONFIGURE_USING_SOURCE_CONTEXT;
if (fIndex == null) {
flags = 0;
}

View file

@ -59,6 +59,7 @@ import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IElementChangedListener;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.model.IMember;
import org.eclipse.cdt.core.model.IParent;
import org.eclipse.cdt.core.model.ISourceRange;
@ -1038,7 +1039,7 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
if (ast == null) {
final ASTProvider astProvider= CUIPlugin.getDefault().getASTProvider();
IStatus status= astProvider.runOnAST(getInputElement(), ASTProvider.WAIT_ACTIVE_ONLY, null, new ASTCache.ASTRunnable() {
public IStatus runOnAST(IASTTranslationUnit ast) {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) {
if (ast != null) {
ctx.fAST= ast;
fInitialReconcilePending= false;

View file

@ -36,9 +36,17 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
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;
import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
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.ICPPTemplateParameter;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexFile;
@ -50,6 +58,7 @@ import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModelUtil;
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.ISourceRange;
import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
@ -97,17 +106,48 @@ public class IndexUI {
return binding instanceof IEnumeration;
case ICElement.C_NAMESPACE:
return binding instanceof ICPPNamespace;
case ICElement.C_STRUCT_DECLARATION:
case ICElement.C_STRUCT:
return binding instanceof ICompositeType &&
((ICompositeType) binding).getKey() == ICompositeType.k_struct;
case ICElement.C_CLASS:
case ICElement.C_CLASS_DECLARATION:
return binding instanceof ICPPClassType &&
((ICompositeType) binding).getKey() == ICPPClassType.k_class;
case ICElement.C_UNION:
case ICElement.C_UNION_DECLARATION:
return binding instanceof ICompositeType &&
((ICompositeType) binding).getKey() == ICompositeType.k_union;
case ICElement.C_TYPEDEF:
return binding instanceof ITypedef;
case ICElement.C_METHOD:
case ICElement.C_METHOD_DECLARATION:
return binding instanceof ICPPMethod;
case ICElement.C_FIELD:
return binding instanceof IField;
case ICElement.C_FUNCTION:
case ICElement.C_FUNCTION_DECLARATION:
return binding instanceof ICPPFunction && !(binding instanceof ICPPMethod);
case ICElement.C_VARIABLE:
case ICElement.C_VARIABLE_DECLARATION:
return binding instanceof IVariable;
case ICElement.C_ENUMERATOR:
return binding instanceof IEnumerator;
case ICElement.C_TEMPLATE_CLASS:
case ICElement.C_TEMPLATE_CLASS_DECLARATION:
case ICElement.C_TEMPLATE_STRUCT:
case ICElement.C_TEMPLATE_STRUCT_DECLARATION:
case ICElement.C_TEMPLATE_UNION:
case ICElement.C_TEMPLATE_UNION_DECLARATION:
return binding instanceof ICPPClassTemplate;
case ICElement.C_TEMPLATE_FUNCTION:
case ICElement.C_TEMPLATE_FUNCTION_DECLARATION:
return binding instanceof ICPPFunctionTemplate && !(binding instanceof ICPPMethod);
case ICElement.C_TEMPLATE_METHOD_DECLARATION:
case ICElement.C_TEMPLATE_METHOD:
return binding instanceof ICPPFunctionTemplate && binding instanceof ICPPMethod;
case ICElement.C_TEMPLATE_VARIABLE:
return binding instanceof ICPPTemplateParameter;
}
} catch (DOMException e) {
// index bindings don't throw the DOMException.
@ -258,7 +298,7 @@ public class IndexUI {
final IASTName[] result= {null};
ASTProvider.getASTProvider().runOnAST(workingCopy, ASTProvider.WAIT_YES, null, new ASTRunnable() {
public IStatus runOnAST(IASTTranslationUnit ast) {
public IStatus runOnAST(ILanguage lang, IASTTranslationUnit ast) {
FindNameForSelectionVisitor finder= new FindNameForSelectionVisitor(ast.getFilePath(), selectionStart, selectionLength);
ast.accept(finder);
result[0]= finder.getSelectedName();