diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java index 294f12af11f..3752a9698c5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java @@ -119,6 +119,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; 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.ICPPConstructor; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionScope; @@ -1295,6 +1296,9 @@ public class CPPVisitor { public CollectReferencesAction( IBinding binding ){ + if (binding instanceof ICPPDeferredTemplateInstance) { + binding= ((ICPPDeferredTemplateInstance) binding).getSpecializedBinding(); + } this.binding = binding; this.refs = new IASTName[ DEFAULT_LIST_SIZE ]; @@ -1317,7 +1321,7 @@ public class CPPVisitor { } public int visit( IASTName name ){ - if( name instanceof ICPPASTQualifiedName ) return PROCESS_CONTINUE; + if( name instanceof ICPPASTQualifiedName || name instanceof ICPPASTTemplateId ) return PROCESS_CONTINUE; ASTNodeProperty prop = name.getPropertyInParent(); ASTNodeProperty p2 = null; @@ -1394,6 +1398,8 @@ public class CPPVisitor { candidate = null; else candidate = bs[ ++n ]; + } else if (potential instanceof ICPPDeferredTemplateInstance) { + candidate= ((ICPPDeferredTemplateInstance) potential).getSpecializedBinding(); } else { candidate = potential; } diff --git a/core/org.eclipse.cdt.ui.tests/resources/ceditor/occurrences.cpp b/core/org.eclipse.cdt.ui.tests/resources/ceditor/occurrences.cpp index 4148c6a4344..f0e9e934475 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/ceditor/occurrences.cpp +++ b/core/org.eclipse.cdt.ui.tests/resources/ceditor/occurrences.cpp @@ -1,5 +1,6 @@ #define INT int #define FUNCTION_MACRO(arg) globalFunc(arg) +#define EMPTY_MACRO(arg) enum Enumeration { ONE, TWO, THREE @@ -11,15 +12,22 @@ static int globalStaticVariable = 0; void globalFunc(int a); static void globalStaticFunc() { + EMPTY_MACRO(n); globalVariable = 1; + EMPTY_MACRO(1); + return 0; } -; class Base1 { + Base1(); + ~Base1(); }; class Base2 { }; +Base1::~Base1() {} +Base1::Base1() {} + class ClassContainer : Base1, Base2 { public: static int staticPubField; @@ -47,6 +55,7 @@ template class TemplateClass { tArg1 = arg1; tArg2 = arg2; } + void m(TemplateClass&); }; template class PartialInstantiatedClass : TemplateClass { diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/MarkOccurrenceTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/MarkOccurrenceTest.java index 0abc1a89a97..d649b228cfc 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/MarkOccurrenceTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/MarkOccurrenceTest.java @@ -187,7 +187,7 @@ public class MarkOccurrenceTest extends TestCase { fEditor.selectAndReveal(fMatch.getOffset(), fMatch.getLength()); - assertOccurrences(3); + assertOccurrences(5); assertOccurrencesInWidget(); } @@ -201,7 +201,7 @@ public class MarkOccurrenceTest extends TestCase { fEditor.selectAndReveal(fMatch.getOffset(), fMatch.getLength()); - assertOccurrences(2); + assertOccurrences(3); assertOccurrencesInWidget(); } @@ -291,6 +291,36 @@ public class MarkOccurrenceTest extends TestCase { assertOccurrencesInWidget(); } + public void testMarkConstructorOccurrences() { + try { + fMatch= fFindReplaceDocumentAdapter.find(0, "Base1(", true, true, false, false); + } catch (BadLocationException e) { + fail(); + } + assertNotNull(fMatch); + + fEditor.selectAndReveal(fMatch.getOffset(), fMatch.getLength()); + + assertOccurrences(2); + assertOccurrencesInWidget(); + } + + + public void testMarkDestructorOccurrences() { + try { + fMatch= fFindReplaceDocumentAdapter.find(0, "~Base1", true, true, false, false); + } catch (BadLocationException e) { + fail(); + } + assertNotNull(fMatch); + + fMatch= new Region(fMatch.getOffset() + 1, fMatch.getLength() - 1); + fEditor.selectAndReveal(fMatch.getOffset(), fMatch.getLength()); + + assertOccurrences(2); + assertOccurrencesInWidget(); + } + public void testMarkLocalOccurrences() { try { fMatch= fFindReplaceDocumentAdapter.find(0, "localVar", true, true, true, false); @@ -319,6 +349,20 @@ public class MarkOccurrenceTest extends TestCase { assertOccurrencesInWidget(); } + public void testMarkEmptyMacroOccurrences() { + try { + fMatch= fFindReplaceDocumentAdapter.find(0, "EMPTY_MACRO", true, true, true, false); + } catch (BadLocationException e) { + fail(); + } + assertNotNull(fMatch); + + fEditor.selectAndReveal(fMatch.getOffset(), fMatch.getLength()); + + assertOccurrences(3); + assertOccurrencesInWidget(); + } + public void testMarkEnumeratorOccurrences() { try { fMatch= fFindReplaceDocumentAdapter.find(0, "ONE", true, true, true, false); 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 a268a22d587..d8c29db4584 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.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; import org.eclipse.cdt.core.formatter.DefaultCodeFormatterConstants; import org.eclipse.cdt.core.model.CModelException; @@ -2942,13 +2943,22 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IC OccurrenceLocation[] locations= null; IASTNode selectedNode= astRoot.selectNodeForLocation(astRoot.getFilePath(), wordRegion.getOffset(), wordRegion.getLength()); - + if (selectedNode == null && astRoot instanceof ICPPASTTranslationUnit && wordRegion.getOffset() > 0) { + // destructor? + try { + if (document.getChar(wordRegion.getOffset() - 1) == '~') { + selectedNode= astRoot.selectNodeForLocation(astRoot.getFilePath(), wordRegion.getOffset() - 1, wordRegion.getLength() + 1); + } + } catch (BadLocationException exc) { + // should not happen + } + } final class NameFinder extends ASTVisitor { - { + private IASTName fName; + + public NameFinder() { shouldVisitNames= true; } - IASTName fName; - public int visit(IASTName name) { fName= name; return PROCESS_ABORT;