From ec3283c69dbf1d1c118524946095d96fbb230b9f Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 21 Jan 2008 13:24:27 +0000 Subject: [PATCH] Caches a step computed by the macro expansion explorer, bug 23540. --- .../core/parser/scanner/MultiMacroExpansionExplorer.java | 9 ++++++++- .../internal/ui/text/c/hover/CMacroExpansionInput.java | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/MultiMacroExpansionExplorer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/MultiMacroExpansionExplorer.java index 05264b33c24..b34bd9ab332 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/MultiMacroExpansionExplorer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/MultiMacroExpansionExplorer.java @@ -57,6 +57,8 @@ public class MultiMacroExpansionExplorer extends MacroExpansionExplorer { private final SingleMacroExpansionExplorer[] fDelegates; private final String fFilePath; private final Map fMacroLocations; + private MacroExpansionStep fCachedStep; + private int fCachedStepID= -1; public MultiMacroExpansionExplorer(IASTTranslationUnit tu, IASTFileLocation loc) { if (tu == null || loc == null || loc.getNodeLength() == 0) { @@ -191,6 +193,9 @@ public class MultiMacroExpansionExplorer extends MacroExpansionExplorer { if (step < 0) { throw new IndexOutOfBoundsException(); } + if (fCachedStep != null && fCachedStepID == step) { + return fCachedStep; + } int i; MacroExpansionStep dresult= null; StringBuilder before= new StringBuilder(); @@ -218,7 +223,9 @@ public class MultiMacroExpansionExplorer extends MacroExpansionExplorer { List replacements= new ArrayList(); shiftAndAddEdits(shift, dresult.getReplacements(), replacements); - return new MacroExpansionStep(before.toString(), dresult.getExpandedMacro(), dresult.getLocationOfExpandedMacroDefinition(), replacements.toArray(new ReplaceEdit[replacements.size()])); + fCachedStep= new MacroExpansionStep(before.toString(), dresult.getExpandedMacro(), dresult.getLocationOfExpandedMacroDefinition(), replacements.toArray(new ReplaceEdit[replacements.size()])); + fCachedStepID= step; + return fCachedStep; } private void appendGap(StringBuilder result, int i) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInput.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInput.java index 92712588fa2..52efaee65d4 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInput.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CMacroExpansionInput.java @@ -156,7 +156,9 @@ public class CMacroExpansionInput { if (node instanceof IASTName) { IASTName macroName= (IASTName) node; IBinding binding= macroName.getBinding(); - if (binding instanceof IMacroBinding && !macroName.isDefinition()) { + // skip macro references that belong to a macro definition or an undef directive + if (binding instanceof IMacroBinding && !macroName.isDefinition() && + macroName.getParent() instanceof IASTTranslationUnit) { addExpansionNode(node); createMacroExpansionExplorer(ast); return Status.OK_STATUS;