From 88c96a37122c83c5af752c0627df2bb6cf9738ed Mon Sep 17 00:00:00 2001 From: Mike Kucera Date: Wed, 18 Mar 2009 13:17:31 +0000 Subject: [PATCH] bug 269034, mark occurrences for overloaded operators --- .../dom/parser/cpp/semantics/CPPVisitor.java | 16 +++++++++++++++- .../resources/ceditor/occurrences.cpp | 2 ++ .../cdt/ui/tests/text/MarkOccurrenceTest.java | 17 ++++++++++++++++- .../eclipse/cdt/internal/ui/editor/CEditor.java | 4 +++- .../internal/ui/search/OccurrencesFinder.java | 16 +++++++++++----- 5 files changed, 47 insertions(+), 8 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 4e8e261bb6e..8811c8d1ffa 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -38,6 +38,7 @@ import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTGotoStatement; import org.eclipse.cdt.core.dom.ast.IASTIdExpression; +import org.eclipse.cdt.core.dom.ast.IASTImplicitNameOwner; import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression; import org.eclipse.cdt.core.dom.ast.IASTLabelStatement; @@ -1438,7 +1439,8 @@ public class CPPVisitor extends ASTQueries { prop == ICPPASTUsingDeclaration.NAME || prop == IASTNamedTypeSpecifier.NAME || prop == ICPPASTConstructorChainInitializer.MEMBER_ID || - prop == ICPPASTTemplateId.TEMPLATE_ID_ARGUMENT) { + prop == ICPPASTTemplateId.TEMPLATE_ID_ARGUMENT || + prop == IASTImplicitNameOwner.IMPLICIT_NAME) { break; } return PROCESS_CONTINUE; @@ -1828,6 +1830,18 @@ public class CPPVisitor extends ASTQueries { return action.getReferences(); } + public static IASTName[] getImplicitReferences(IASTTranslationUnit tu, IBinding binding) { + CollectReferencesAction action = new CollectReferencesAction(binding) { + { + shouldVisitNames = false; + shouldVisitImplicitNames = true; + shouldVisitImplicitNameAlternates = true; + } + }; + tu.accept(action); + return action.getReferences(); + } + public static IASTName[] getDeclarations(IASTTranslationUnit tu, IBinding binding) { CollectDeclarationsAction action = new CollectDeclarationsAction(binding); tu.accept(action); 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 c3f7834b32d..5a5bc9d1bec 100644 --- a/core/org.eclipse.cdt.ui.tests/resources/ceditor/occurrences.cpp +++ b/core/org.eclipse.cdt.ui.tests/resources/ceditor/occurrences.cpp @@ -71,6 +71,7 @@ struct CppStruct { union CppUnion { int unionField; + CppUnion operator+(CppUnion); }; typedef CppUnion TUnion; @@ -105,6 +106,7 @@ INT ClassContainer::staticPrivMethod() { CppUnion un; un.unionField= 2; staticPubMethod(staticPubField); + un + un; label: FUNCTION_MACRO(0); if (un.unionField < st->structField) 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 403fd4d60dd..9df501d8f84 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2008 IBM Corporation and others. + * Copyright (c) 2000, 2009 IBM Corporation 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 @@ -479,6 +479,21 @@ public class MarkOccurrenceTest extends BaseUITestCase { assertOccurrencesInWidget(); } + public void testMarkOperatorOccurrences() { + try { + fMatch= fFindReplaceDocumentAdapter.find(0, "operator+", true, true, true, false); + } catch (BadLocationException e) { + fail(); + } + assertNotNull(fMatch); + + fEditor.selectAndReveal(fMatch.getOffset(), fMatch.getLength()); + + assertOccurrences(2); + assertOccurrencesInWidget(); + } + + public void testNoOccurrencesIfDisabled() { CUIPlugin.getDefault().getPreferenceStore().setValue(PreferenceConstants.EDITOR_MARK_OCCURRENCES, false); fOccurrences= Integer.MAX_VALUE; 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 3123f5b4b0e..aa6a8290330 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2008 IBM Corporation and others. + * Copyright (c) 2005, 2009 IBM Corporation 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 @@ -3204,6 +3204,8 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IC IASTNodeSelector selector= astRoot.getNodeSelector(null); IASTName name= selector.findEnclosingName(selection.getOffset(), selection.getLength()); + if(name == null) + name = selector.findEnclosingImplicitName(selection.getOffset(), selection.getLength()); if (validator != null && !validator.isValid(selection)) { return; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/OccurrencesFinder.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/OccurrencesFinder.java index ef3d6095d0c..3dfc1c66eb8 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/OccurrencesFinder.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/OccurrencesFinder.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2008 IBM Corporation and others. + * Copyright (c) 2000, 2009 IBM Corporation 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 @@ -21,6 +21,8 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; + import org.eclipse.cdt.internal.ui.util.Messages; public class OccurrencesFinder implements IOccurrencesFinder { @@ -55,15 +57,19 @@ public class OccurrencesFinder implements IOccurrencesFinder { if (fResult == null) { fResult= new ArrayList(); IASTName[] names= fRoot.getDeclarationsInAST(fTarget); - for (int i= 0; i < names.length; i++) { - IASTName candidate= names[i]; + for (IASTName candidate : names) { if (candidate.isPartOfTranslationUnitFile()) { addUsage(candidate, candidate.resolveBinding()); } } names= fRoot.getReferences(fTarget); - for (int i= 0; i < names.length; i++) { - IASTName candidate= names[i]; + for (IASTName candidate : names) { + if (candidate.isPartOfTranslationUnitFile()) { + addUsage(candidate, candidate.resolveBinding()); + } + } + names= CPPVisitor.getImplicitReferences(fRoot, fTarget); + for (IASTName candidate : names) { if (candidate.isPartOfTranslationUnitFile()) { addUsage(candidate, candidate.resolveBinding()); }