Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Ridge2015-07-19 02:29:21 +0000
committerNathan Ridge2015-07-25 08:00:35 +0000
commit8af3f1df866e526686a60889226d405257b55f24 (patch)
tree1a4c42e9bf69209a0bddf23522cd2c93cee2f0bc
parentd9a2c02fbf285a3979679a74ad3ccff0a06194d4 (diff)
downloadorg.eclipse.cdt-8af3f1df866e526686a60889226d405257b55f24.tar.gz
org.eclipse.cdt-8af3f1df866e526686a60889226d405257b55f24.tar.xz
org.eclipse.cdt-8af3f1df866e526686a60889226d405257b55f24.zip
Bug 86654 - Cache final overrider maps in the AST
Change-Id: I33d79c160b7aa7b014042ea06e0b851abc9cb608 Signed-off-by: Nathan Ridge <zeratul976@hotmail.com>
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java11
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPInheritance.java23
2 files changed, 31 insertions, 3 deletions
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<ICPPClassType, FinalOverriderMap> fFinalOverriderMapCache = new HashMap<>();
+
public CPPASTTranslationUnit() {
}
@@ -211,4 +218,8 @@ public class CPPASTTranslationUnit extends ASTTranslationUnit implements ICPPAST
fAmbiguityResolver.resolvePendingAmbiguities(node);
}
}
+
+ public Map<ICPPClassType, FinalOverriderMap> 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<ICPPClassType, FinalOverriderMap> 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 {

Back to the top