diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java index 58f8062dae0..6ec93159519 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java @@ -12,6 +12,9 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import java.util.HashMap; +import java.util.Map; + import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; @@ -33,6 +36,7 @@ import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.internal.core.dom.Linkage; import org.eclipse.cdt.internal.core.dom.parser.ASTTranslationUnit; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPInheritance.FinalOverriderMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.index.IIndexScope; import org.eclipse.cdt.internal.core.parser.scanner.InternalFileContent; @@ -46,6 +50,9 @@ public class CPPASTTranslationUnit extends ASTTranslationUnit implements ICPPAST private final CPPScopeMapper fScopeMapper= new CPPScopeMapper(this); private CPPASTAmbiguityResolver fAmbiguityResolver; + // Caches + private Map fFinalOverriderMapCache = new HashMap<>(); + public CPPASTTranslationUnit() { } @@ -211,4 +218,8 @@ public class CPPASTTranslationUnit extends ASTTranslationUnit implements ICPPAST fAmbiguityResolver.resolvePendingAmbiguities(node); } } + + public Map getFinalOverriderMapCache() { + return fFinalOverriderMapCache; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPInheritance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPInheritance.java index e09a06242e4..dce110964db 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPInheritance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPInheritance.java @@ -19,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.parser.util.CollectionUtils; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTranslationUnit; import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; /** @@ -96,13 +97,29 @@ public class CPPInheritance { /** * Returns the final overrider map for a class hierarchy. - * + * Final overrider maps are cached in the AST. + * * @param classType the root of the class hierarchy - * @param point the point of template instantiation, if applicable + * @param point The point of template instantiation, if applicable. + * Also used to access the cache in the AST. * @return the computed final overrider map */ public static FinalOverriderMap getFinalOverriderMap(ICPPClassType classType, IASTNode point) { - return FinalOverriderAnalysis.computeFinalOverriderMap(classType, point); + Map cache = null; + if (point != null && point.getTranslationUnit() instanceof CPPASTTranslationUnit) { + cache = ((CPPASTTranslationUnit) point.getTranslationUnit()).getFinalOverriderMapCache(); + } + FinalOverriderMap result = null; + if (cache != null) { + result = cache.get(classType); + } + if (result == null) { + result = FinalOverriderAnalysis.computeFinalOverriderMap(classType, point); + } + if (result != null && cache != null) { + cache.put(classType, result); + } + return result; } private static class FinalOverriderAnalysis {