1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 08:55:25 +02:00

Bug 314635 - Marking occurrences is very slow on a large file due to searching for implicitReferences (interim fix)

This commit is contained in:
Anton Leherbauer 2010-05-28 08:00:01 +00:00
parent ca9f612e04
commit 599285f0c3
3 changed files with 43 additions and 11 deletions

View file

@ -54,6 +54,7 @@ import org.eclipse.cdt.ui.testplugin.EditorTestHelper;
import org.eclipse.cdt.ui.tests.BaseUITestCase;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.editor.SemanticHighlightings;
import org.eclipse.cdt.internal.ui.viewsupport.ISelectionListenerWithAST;
import org.eclipse.cdt.internal.ui.viewsupport.SelectionListenerWithASTManager;
@ -116,7 +117,12 @@ public class MarkOccurrenceTest extends BaseUITestCase {
fProjectSetup.setUp();
}
assertNotNull(fgHighlightRGB);
CUIPlugin.getDefault().getPreferenceStore().setValue(PreferenceConstants.EDITOR_MARK_OCCURRENCES, true);
final IPreferenceStore store = CUIPlugin.getDefault().getPreferenceStore();
store.setValue(PreferenceConstants.EDITOR_MARK_OCCURRENCES, true);
// TLETODO temporary fix for bug 314635
store.setValue(PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX
+ SemanticHighlightings.OVERLOADED_OPERATOR
+ PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED_SUFFIX, true);
fEditor= openCEditor(new Path("/" + PROJECT + "/src/occurrences.cpp"));
assertNotNull(fEditor);
fTextWidget= fEditor.getViewer().getTextWidget();
@ -153,6 +159,12 @@ public class MarkOccurrenceTest extends BaseUITestCase {
*/
@Override
protected void tearDown() throws Exception {
final IPreferenceStore store = CUIPlugin.getDefault().getPreferenceStore();
store.setToDefault(PreferenceConstants.EDITOR_MARK_OCCURRENCES);
// TLETODO temporary fix for bug 314635
store.setToDefault(PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX
+ SemanticHighlightings.OVERLOADED_OPERATOR
+ PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED_SUFFIX);
SelectionListenerWithASTManager.getDefault().removeListener(fEditor, fSelWASTListener);
EditorTestHelper.closeAllEditors();
if (fProjectSetup != null) {

View file

@ -3283,18 +3283,18 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IC
}
if (name != null) {
// try {
// IASTFileLocation location= name.getFileLocation();
// if (!document.get(location.getNodeOffset(), location.getNodeLength()).equals(name.toString())) {
// System.err.println("CEditor.updateOccurrenceAnnotations() invalid ast");
// return;
// }
// } catch (BadLocationException exc) {
// }
IBinding binding= name.resolveBinding();
if (binding != null) {
OccurrencesFinder occurrencesFinder= new OccurrencesFinder();
if (occurrencesFinder.initialize(astRoot, name) == null) {
// TLETODO temporary fix for bug 314635
boolean overloadedOperatorsEnabled = getPreferenceStore().getBoolean(
PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX
+ SemanticHighlightings.OVERLOADED_OPERATOR
+ PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED_SUFFIX);
if (!overloadedOperatorsEnabled) {
occurrencesFinder.setOptions(OccurrencesFinder.OPTION_EXCLUDE_IMPLICIT_REFERENCES);
}
locations= occurrencesFinder.getOccurrences();
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2009 IBM Corporation and others.
* Copyright (c) 2000, 2010 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
@ -32,12 +32,19 @@ public class OccurrencesFinder implements IOccurrencesFinder {
public static final String ID= "OccurrencesFinder"; //$NON-NLS-1$
/**
* If set, don't search for implicit references.
*/
public static final int OPTION_EXCLUDE_IMPLICIT_REFERENCES = 1;
private IASTTranslationUnit fRoot;
private IASTName fSelectedNode;
private IBinding fTarget;
private List<OccurrenceLocation> fResult;
private String fDescription;
private int fOptions;
public OccurrencesFinder() {
super();
@ -56,6 +63,15 @@ public class OccurrencesFinder implements IOccurrencesFinder {
return null;
}
/**
* Specify search options.
*
* @param options
*/
public void setOptions(int options) {
fOptions = options;
}
private void performSearch() {
if (fResult == null) {
fResult= new ArrayList<OccurrenceLocation>();
@ -71,7 +87,7 @@ public class OccurrencesFinder implements IOccurrencesFinder {
addUsage(candidate, candidate.resolveBinding());
}
}
if (canHaveImplicitReference(fTarget)) {
if (needImplicitReferences() && canHaveImplicitReference(fTarget)) {
names= CPPVisitor.getImplicitReferences(fRoot, fTarget);
for (IASTName candidate : names) {
if (candidate.isPartOfTranslationUnitFile()) {
@ -82,6 +98,10 @@ public class OccurrencesFinder implements IOccurrencesFinder {
}
}
private boolean needImplicitReferences() {
return (fOptions & OPTION_EXCLUDE_IMPLICIT_REFERENCES) == 0;
}
private boolean canHaveImplicitReference(IBinding binding) {
final char[] op = Keywords.cOPERATOR;
final char[] nameCharArray = binding.getNameCharArray();