From 7c343c6050910963740f7fe2700536cd315016cb Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Fri, 2 Oct 2009 09:25:24 +0000 Subject: [PATCH] Avoid computation of implicit references, bug 291024. --- .../ui/editor/SemanticHighlighting.java | 11 ++++++- .../SemanticHighlightingReconciler.java | 32 ++++++++++++------- .../ui/editor/SemanticHighlightings.java | 9 +++++- .../internal/ui/search/OccurrencesFinder.java | 30 ++++++++++++++--- 4 files changed, 64 insertions(+), 18 deletions(-) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlighting.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlighting.java index 67e42f4ec09..0fb2e1632bb 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlighting.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlighting.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2007 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 @@ -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; @@ -72,6 +73,14 @@ public abstract class SemanticHighlighting { * @return the display name */ public abstract String getDisplayName(); + + /** + * Indicates that the highlighting needs to visit implicit names + * (e.g. overloaded operators) + */ + public boolean requiresImplicitNames() { + return false; + } /** * Returns true iff the semantic highlighting consumes the semantic token. 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 b99444e054f..b3259d9d4eb 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 @@ -64,7 +64,13 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener { * Collects positions from the AST. */ private class PositionCollector extends CPPASTVisitor { - { + + /** The semantic token */ + private SemanticToken fToken= new SemanticToken(); + private int fMinLocation; + + public PositionCollector(boolean visitImplicitNames) { + fMinLocation= -1; shouldVisitTranslationUnit= true; shouldVisitNames= true; shouldVisitDeclarations= true; @@ -72,16 +78,8 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener { shouldVisitStatements= true; shouldVisitDeclarators= true; shouldVisitNamespaces= true; - shouldVisitImplicitNames = true; - shouldVisitImplicitNameAlternates = true; - } - - /** The semantic token */ - private SemanticToken fToken= new SemanticToken(); - private int fMinLocation; - - public PositionCollector() { - fMinLocation= -1; + shouldVisitImplicitNames = visitImplicitNames; + shouldVisitImplicitNameAlternates = visitImplicitNames; } /* @@ -351,7 +349,7 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener { if (ast == null || fJobPresenter.isCanceled()) return; - PositionCollector collector= new PositionCollector(); + PositionCollector collector= new PositionCollector(requiresImplicitNames()); startReconcilingPositions(); @@ -376,6 +374,16 @@ public class SemanticHighlightingReconciler implements ICReconcilingListener { } } + private boolean requiresImplicitNames() { + for (int i = 0; i < fSemanticHighlightings.length; i++) { + SemanticHighlighting sh = fSemanticHighlightings[i]; + if (sh.requiresImplicitNames() && fHighlightings[i].isEnabled()) { + return true; + } + } + return false; + } + /** * Start reconciling positions. */ diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightings.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightings.java index fde325e2339..a27640ef1c1 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightings.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/SemanticHighlightings.java @@ -1935,6 +1935,13 @@ public class SemanticHighlightings { return OVERLOADED_OPERATOR; } + + @Override + public boolean requiresImplicitNames() { + return true; + } + + /* * @see org.eclipse.cdt.internal.ui.editor.SemanticHighlighting#getDefaultTextColor() */ @@ -1964,7 +1971,7 @@ public class SemanticHighlightings { */ @Override public boolean isEnabledByDefault() { - return true; + return false; } /* 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 3dfc1c66eb8..ee7611a522c 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 @@ -20,6 +20,9 @@ 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.ICPPASTTemplateId; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; +import org.eclipse.cdt.core.parser.Keywords; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; @@ -68,15 +71,34 @@ public class OccurrencesFinder implements IOccurrencesFinder { addUsage(candidate, candidate.resolveBinding()); } } - names= CPPVisitor.getImplicitReferences(fRoot, fTarget); - for (IASTName candidate : names) { - if (candidate.isPartOfTranslationUnitFile()) { - addUsage(candidate, candidate.resolveBinding()); + if (canHaveImplicitReference(fTarget)) { + names= CPPVisitor.getImplicitReferences(fRoot, fTarget); + for (IASTName candidate : names) { + if (candidate.isPartOfTranslationUnitFile()) { + addUsage(candidate, candidate.resolveBinding()); + } } } } } + private boolean canHaveImplicitReference(IBinding binding) { + final char[] op = Keywords.cOPERATOR; + final char[] nameCharArray = binding.getNameCharArray(); + if (nameCharArray.length > 0) { + if (nameCharArray[0] == '~') { + return true; + } + if (CharArrayUtils.equals(nameCharArray, 0, op.length, op)) { + return true; + } + } + if (binding instanceof ICPPConstructor) + return true; + + return false; + } + public OccurrenceLocation[] getOccurrences() { performSearch(); if (fResult.isEmpty())