From 29aba5e310a595309ad9c9995ba2a1334b8c305b Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Fri, 20 Feb 2009 13:41:55 +0000 Subject: [PATCH] Map index bindings for class instances back to AST, bug 262719. --- .../core/dom/parser/cpp/CPPScopeMapper.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScopeMapper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScopeMapper.java index e951dad0128..6307cdde668 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScopeMapper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScopeMapper.java @@ -29,14 +29,18 @@ import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDirective; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArrayMap; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.index.IIndexScope; /** @@ -285,6 +289,20 @@ public class CPPScopeMapper { } public ICPPClassType mapToAST(ICPPClassType type) { + if (type instanceof ICPPTemplateInstance) { + ICPPTemplateInstance inst= (ICPPTemplateInstance) type; + ICPPTemplateDefinition template= inst.getTemplateDefinition(); + if (template instanceof IIndexBinding && template instanceof ICPPClassType) { + IBinding mapped= mapToAST((ICPPClassType) template); + if (mapped != template && mapped instanceof ICPPClassType) { + mapped= CPPTemplates.instantiate((ICPPClassTemplate) mapped, inst.getTemplateArguments()); + if (mapped instanceof ICPPClassType) + return (ICPPClassType) mapped; + } + } + return type; + } + if (fClasses == null) { fClasses= new CharArrayMap(); fTu.accept(new Visitor());