diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index c7a400c4190..be29537c9de 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -2314,7 +2314,7 @@ public class AST2TemplateTests extends AST2BaseTest { // }; // // void main(Iter::iter_reference r); - public void _testSpecializationSelection_229218() throws Exception { + public void testSpecializationSelection_229218() throws Exception { IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true); CPPNameCollector col = new CPPNameCollector(); tu.accept(col); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassTemplate.java index 41cff074cae..5aeb26064b6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassTemplate.java @@ -1,16 +1,14 @@ /******************************************************************************* - * Copyright (c) 2005 IBM Corporation and others. + * Copyright (c) 2005, 2008 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * IBM - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ -/* - * Created on Mar 31, 2005 - */ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; @@ -18,6 +16,6 @@ import org.eclipse.cdt.core.dom.ast.DOMException; /** * @author aniefer */ -public interface ICPPClassTemplate extends ICPPTemplateDefinition { +public interface ICPPClassTemplate extends ICPPTemplateDefinition, ICPPClassType { public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateDefinition.java index 713eeccc287..13ce8ab0f66 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateDefinition.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateDefinition.java @@ -1,19 +1,20 @@ /******************************************************************************* - * Copyright (c) 2004, 2005 IBM Corporation and others. + * Copyright (c) 2004, 2008 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * IBM - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; /** - * @author Doug Schaefer + * Base interface for all template definitions including explicit (partial) specializations. */ public interface ICPPTemplateDefinition extends ICPPBinding { @@ -24,4 +25,10 @@ public interface ICPPTemplateDefinition extends ICPPBinding { * @return array of ICPPTemplateParameter */ public ICPPTemplateParameter[] getTemplateParameters() throws DOMException; + + /** + * Returns the scope defined by this template definition. + * @since 5.0 + */ + public ICPPTemplateScope getTemplateScope() throws DOMException; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java index 1209bd6fc2f..cf7d1c9ef67 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java @@ -24,7 +24,6 @@ import org.eclipse.cdt.core.dom.ast.ITypedef; 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.ICPPConstructor; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; @@ -49,9 +48,9 @@ public class CPPClassInstance extends CPPInstance implements ICPPClassType { if (cls != null) { ICPPBase[] result = null; ICPPBase[] bindings = cls.getBases(); - for (int i = 0; i < bindings.length; i++) { - ICPPBase specBinding = (ICPPBase) ((ICPPInternalBase) bindings[i]).clone(); - IBinding base = bindings[i].getBaseClass(); + for (ICPPBase binding : bindings) { + ICPPBase specBinding = (ICPPBase) ((ICPPInternalBase) binding).clone(); + IBinding base = binding.getBaseClass(); if (base instanceof IType) { IType specBase = CPPTemplates.instantiateType((IType) base, argumentMap); specBase = getUltimateType(specBase, false); @@ -125,7 +124,7 @@ public class CPPClassInstance extends CPPInstance implements ICPPClassType { return true; if (type instanceof ITypedef || type instanceof IIndexType) return type.isSameType(this); - if (type instanceof ICPPDeferredTemplateInstance && type instanceof ICPPClassType) + if (type instanceof ICPPDeferredClassInstance) return type.isSameType(this); // the CPPDeferredClassInstance has some fuzziness if (type instanceof ICPPTemplateInstance) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecializationScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecializationScope.java index 73e13f725b6..8831d8302c8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecializationScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecializationScope.java @@ -47,7 +47,7 @@ public class CPPClassSpecializationScope implements ICPPClassScope, IASTInternal this.specialization = specialization; } - private ICPPClassType getOriginalClass() { + protected ICPPClassType getOriginalClass() { return (ICPPClassType) specialization.getSpecializedBinding(); } @@ -88,8 +88,8 @@ public class CPPClassSpecializationScope implements ICPPClassScope, IASTInternal return null; IBinding[] specs = new IBinding[0]; - for (int i = 0; i < bindings.length; i++) { - specs = (IBinding[]) ArrayUtil.append(IBinding.class, specs, getInstance(bindings[i])); + for (IBinding binding : bindings) { + specs = (IBinding[]) ArrayUtil.append(IBinding.class, specs, getInstance(binding)); } specs = (IBinding[]) ArrayUtil.trim(IBinding.class, specs); return CPPSemantics.resolveAmbiguities(name, specs); @@ -111,8 +111,8 @@ public class CPPClassSpecializationScope implements ICPPClassScope, IASTInternal classScope.getBindings(name, forceResolve, prefixLookup, fileSet) : null; if (bindings != null) { - for (int i = 0; i < bindings.length; i++) { - result = (IBinding[]) ArrayUtil.append(IBinding.class, result, getInstance(bindings[i])); + for (IBinding binding : bindings) { + result = (IBinding[]) ArrayUtil.append(IBinding.class, result, getInstance(binding)); } } @@ -142,8 +142,8 @@ public class CPPClassSpecializationScope implements ICPPClassScope, IASTInternal if (bindings == null) return ICPPConstructor.EMPTY_CONSTRUCTOR_ARRAY; ICPPConstructor[] specs = new ICPPConstructor[0]; - for (int i = 0; i < bindings.length; i++) { - specs = (ICPPConstructor[]) ArrayUtil.append(ICPPConstructor.class, specs, getInstance(bindings[i])); + for (ICPPConstructor binding : bindings) { + specs = (ICPPConstructor[]) ArrayUtil.append(ICPPConstructor.class, specs, getInstance(binding)); } return (ICPPConstructor[]) ArrayUtil.trim(ICPPConstructor.class, specs); } @@ -155,8 +155,8 @@ public class CPPClassSpecializationScope implements ICPPClassScope, IASTInternal if (bindings == null) return ICPPMethod.EMPTY_CPPMETHOD_ARRAY; ICPPMethod[] specs = new ICPPMethod[0]; - for (int i = 0; i < bindings.length; i++) { - specs = (ICPPMethod[]) ArrayUtil.append(ICPPMethod.class, specs, getInstance(bindings[i])); + for (ICPPMethod binding : bindings) { + specs = (ICPPMethod[]) ArrayUtil.append(ICPPMethod.class, specs, getInstance(binding)); } return (ICPPMethod[]) ArrayUtil.trim(ICPPMethod.class, specs); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java index acee4691e87..47540911ec2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java @@ -1,22 +1,22 @@ /******************************************************************************* - * Copyright (c) 2005, 2007 IBM Corporation and others. + * Copyright (c) 2005, 2008 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation - * Bryan Wilkinson (QNX) + * IBM - Initial API and implementation + * Bryan Wilkinson (QNX) + * Markus Schorn (Wind River Systems) *******************************************************************************/ -/* - * Created on May 2, 2005 - */ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IProblemBinding; +import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; @@ -24,7 +24,10 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateDefinition.CPPTemplateProblem; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; /** @@ -128,4 +131,16 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization public String toString() { return getName(); } + + public ICPPTemplateScope getTemplateScope() throws DOMException { + IScope scope= getCompositeScope().getParent(); + if (scope instanceof ICPPTemplateScope) { + return (ICPPTemplateScope) scope; + } + IASTNode def= getDefinition(); + if (def == null) { + def= getDeclarations()[0]; + } + throw new DOMException(new CPPTemplateProblem(def, IProblemBinding.SEMANTIC_BAD_SCOPE, CharArrayUtils.EMPTY)); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java index 9f07844f7f9..4e1a04d4e22 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java @@ -8,21 +8,17 @@ * Contributors: * IBM Corporation - initial API and implementation * Sergey Prigogin (Google) + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.IField; -import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; 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.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -33,88 +29,36 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; * * @author aniefer */ -public class CPPDeferredClassInstance extends CPPInstance - implements ICPPClassType, ICPPDeferredTemplateInstance, ICPPInternalDeferredClassInstance { +public class CPPDeferredClassInstance extends CPPUnknownClass implements ICPPDeferredClassInstance { + private IType[] fArguments; + private ObjectMap fArgmap; + private ICPPScope fUnknownScope; + public CPPDeferredClassInstance(ICPPClassTemplate orig, ObjectMap argMap, IType[] arguments) { - super(null, orig, argMap, arguments); + super(orig); + fArgmap= argMap; + fArguments= arguments; } - public ICPPBase[] getBases() throws DOMException { - return ((ICPPClassType) getClassTemplate()).getBases(); - } - - public IField[] getFields() { - return null; - } - - public IField findField(String name) { - return null; - } - - public ICPPField[] getDeclaredFields() { - return null; - } - - public ICPPMethod[] getMethods() { - return null; - } - - public ICPPMethod[] getAllDeclaredMethods() { - return null; - } - - public ICPPMethod[] getDeclaredMethods() { - return null; - } - - public ICPPConstructor[] getConstructors() { - return ICPPConstructor.EMPTY_CONSTRUCTOR_ARRAY; - } - - public IBinding[] getFriends() { - return null; - } - - public int getKey() throws DOMException { - return ((ICPPClassType) getClassTemplate()).getKey(); - } - - public IScope getCompositeScope() throws DOMException { - if (getArgumentMap() != null) { - return new CPPClassSpecializationScope(this); - } - return ((ICPPClassType) getClassTemplate()).getCompositeScope(); + private ICPPClassTemplate getClassTemplate() { + return (ICPPClassTemplate) getSpecializedBinding(); } @Override - public Object clone() { - return this; + public CPPDeferredClassInstance clone() { + CPPDeferredClassInstance cloned= (CPPDeferredClassInstance) super.clone(); + return cloned; } - public IType instantiate(ObjectMap argMap) { - IType[] arguments = getArguments(); - IType[] newArgs = new IType[arguments.length]; - int size = arguments.length; - for (int i = 0; i < size; i++) { - newArgs[i] = CPPTemplates.instantiateType(arguments[i], argMap); - } - - ICPPClassTemplate classTemplate = getClassTemplate(); - if (argMap.containsKey(classTemplate)) { - classTemplate = (ICPPClassTemplate) argMap.get(classTemplate); - } - - return (IType) ((ICPPInternalTemplateInstantiator) classTemplate).instantiate(newArgs); - } - + @Override public boolean isSameType(IType type) { if (type == this) return true; // allow some fuzziness here. ICPPClassTemplate classTemplate = getClassTemplate(); - if (type instanceof ICPPDeferredTemplateInstance && type instanceof ICPPClassType) { + if (type instanceof ICPPDeferredClassInstance) { ICPPClassTemplate typeClass = (ICPPClassTemplate) ((ICPPDeferredTemplateInstance) type).getSpecializedBinding(); return typeClass == classTemplate; @@ -127,11 +71,56 @@ public class CPPDeferredClassInstance extends CPPInstance return false; } - public ICPPClassType[] getNestedClasses() throws DOMException { - return null; + @Override + public int getKey() throws DOMException { + return getClassTemplate().getKey(); + } + + public IType[] getArguments() { + return fArguments; } - private ICPPClassTemplate getClassTemplate() { - return (ICPPClassTemplate) getSpecializedBinding(); + public ICPPTemplateDefinition getTemplateDefinition() { + return (ICPPTemplateDefinition) scopeBinding; + } + + public ObjectMap getArgumentMap() { + return fArgmap; + } + + @Override + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap) { + IType[] arguments = getArguments(); + IType[] newArgs = new IType[arguments.length]; + int size = arguments.length; + for (int i = 0; i < size; i++) { + newArgs[i] = CPPTemplates.instantiateType(arguments[i], argMap); + } + + ICPPClassTemplate classTemplate = getClassTemplate(); + if (argMap.containsKey(classTemplate)) { + classTemplate = (ICPPClassTemplate) argMap.get(classTemplate); + } + + return ((ICPPInternalTemplateInstantiator) classTemplate).instantiate(newArgs); + } + + public IBinding getSpecializedBinding() { + return getTemplateDefinition(); + } + + @Override + public ICPPScope getUnknownScope() throws DOMException { + if (fUnknownScope != null) + return fUnknownScope; + + final ICPPClassTemplate classTemplate = getClassTemplate(); + if (classTemplate.getPartialSpecializations().length == 0) { + if (fArgmap == null) { + return fUnknownScope= (ICPPScope) classTemplate.getCompositeScope(); + } + return fUnknownScope= new CPPClassSpecializationScope(this); + } + return super.getUnknownScope(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java index 9bde0bc43f3..9b7505a5799 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java @@ -33,6 +33,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; @@ -93,6 +94,9 @@ public class CPPFunctionTemplate extends CPPTemplateDefinition implements ICPPFu public boolean takesVarArgs() throws DOMException { throw new DOMException( this ); } + public ICPPTemplateScope getTemplateScope() throws DOMException { + throw new DOMException( this ); + } } protected IFunctionType type = null; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java index 0ee82c31c73..1538d064baf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java @@ -6,18 +6,25 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * IBM - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IProblemBinding; +import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateDefinition.CPPTemplateProblem; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; /** @@ -76,4 +83,17 @@ public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) { return null; } + + public ICPPTemplateScope getTemplateScope() throws DOMException { + IScope scope= getFunctionScope().getParent(); + if (scope instanceof ICPPTemplateScope) { + return (ICPPTemplateScope) scope; + } + IASTNode def= getDefinition(); + if (def == null) { + def= getDeclarations()[0]; + } + throw new DOMException(new CPPTemplateProblem(def, IProblemBinding.SEMANTIC_BAD_SCOPE, CharArrayUtils.EMPTY)); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java index 5e4c6840613..cf259a9d39f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java @@ -1,17 +1,14 @@ /******************************************************************************* - * Copyright (c) 2005, 2007 IBM Corporation and others. + * Copyright (c) 2005, 2008 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation - * Markus Schorn (Wind River Systems) + * IBM - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ -/* - * Created on Mar 14, 2005 - */ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ILinkage; @@ -41,7 +38,9 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; import org.eclipse.cdt.core.parser.util.ArrayUtil; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.Linkage; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; @@ -73,6 +72,9 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC public boolean isGloballyQualified() throws DOMException { throw new DOMException(this); } + public ICPPTemplateScope getTemplateScope() throws DOMException { + throw new DOMException(this); + } } //private IASTName templateName; @@ -161,8 +163,8 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC public void addSpecialization(IType[] types, ICPPSpecialization spec) { if (types == null) return; - for (int i = 0; i < types.length; i++) { - if (types[i] == null) + for (IType type : types) { + if (type == null) return; } if (instances == null) @@ -237,6 +239,15 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC return definition != null ? definition : declarations[0]; } + public ICPPTemplateScope getTemplateScope() throws DOMException { + final IASTName name = getTemplateName(); + ICPPASTTemplateDeclaration template = CPPTemplates.getTemplateDeclaration(name); + if (template != null) { + return template.getScope(); + } + throw new DOMException(new CPPTemplateProblem(name, IProblemBinding.SEMANTIC_BAD_SCOPE, CharArrayUtils.EMPTY)); + } + /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IBinding#getName() */ @@ -290,13 +301,13 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC ICPPASTTemplateParameter[] params = template.getTemplateParameters(); ICPPTemplateParameter p = null; ICPPTemplateParameter[] result = null; - for (int i = 0; i < params.length; i++) { - if (params[i] instanceof ICPPASTSimpleTypeTemplateParameter) { - p = (ICPPTemplateParameter) ((ICPPASTSimpleTypeTemplateParameter) params[i]).getName().resolveBinding(); - } else if (params[i] instanceof ICPPASTParameterDeclaration) { - p = (ICPPTemplateParameter) ((ICPPASTParameterDeclaration) params[i]).getDeclarator().getName().resolveBinding(); - } else if (params[i] instanceof ICPPASTTemplatedTypeTemplateParameter) { - p = (ICPPTemplateParameter) ((ICPPASTTemplatedTypeTemplateParameter) params[i]).getName().resolveBinding(); + for (ICPPASTTemplateParameter param : params) { + if (param instanceof ICPPASTSimpleTypeTemplateParameter) { + p = (ICPPTemplateParameter) ((ICPPASTSimpleTypeTemplateParameter) param).getName().resolveBinding(); + } else if (param instanceof ICPPASTParameterDeclaration) { + p = (ICPPTemplateParameter) ((ICPPASTParameterDeclaration) param).getDeclarator().getName().resolveBinding(); + } else if (param instanceof ICPPASTTemplatedTypeTemplateParameter) { + p = (ICPPTemplateParameter) ((ICPPASTTemplatedTypeTemplateParameter) param).getName().resolveBinding(); } if (p != null) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateScope.java index 3b25c574701..be67b801f46 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateScope.java @@ -1,17 +1,14 @@ /******************************************************************************* - * Copyright (c) 2005, 2007 IBM Corporation and others. + * Copyright (c) 2005, 2008 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation - * Markus Schorn (Wind River Systems) + * IBM - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ -/* - * Created on Mar 11, 2005 - */ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.IName; @@ -87,8 +84,8 @@ public class CPPTemplateScope extends CPPScope implements ICPPTemplateScope { return ((ICPPClassType) binding).getCompositeScope(); } else if (binding instanceof ICPPNamespace) { return ((ICPPNamespace) binding).getNamespaceScope(); - } else if (binding instanceof ICPPInternalUnknown) { - return ((ICPPInternalUnknown) binding).getUnknownScope(); + } else if (binding instanceof ICPPUnknownBinding) { + return ((ICPPUnknownBinding) binding).getUnknownScope(); } else if (binding instanceof IProblemBinding) { if (binding instanceof ICPPScope) return (IScope) binding; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java index d80e95c6897..a37d33e9c77 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java @@ -7,6 +7,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -23,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplatedTypeTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; @@ -31,6 +33,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ObjectMap; @@ -40,7 +43,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; * @author aniefer */ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implements - ICPPTemplateTemplateParameter, ICPPClassType, ICPPInternalTemplate, ICPPInternalUnknown { + ICPPTemplateTemplateParameter, ICPPClassType, ICPPInternalTemplate, ICPPUnknownBinding { private ICPPTemplateParameter[] templateParameters = null; private ObjectMap instances = null; @@ -71,13 +74,13 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement ICPPASTTemplateParameter[] params = template.getTemplateParameters(); ICPPTemplateParameter p = null; ICPPTemplateParameter[] result = null; - for (int i = 0; i < params.length; i++) { - if (params[i] instanceof ICPPASTSimpleTypeTemplateParameter) { - p = (ICPPTemplateParameter) ((ICPPASTSimpleTypeTemplateParameter)params[i]).getName().resolveBinding(); - } else if (params[i] instanceof ICPPASTParameterDeclaration) { - p = (ICPPTemplateParameter) ((ICPPASTParameterDeclaration)params[i]).getDeclarator().getName().resolveBinding(); - } else if (params[i] instanceof ICPPASTTemplatedTypeTemplateParameter) { - p = (ICPPTemplateParameter) ((ICPPASTTemplatedTypeTemplateParameter)params[i]).getName().resolveBinding(); + for (ICPPASTTemplateParameter param : params) { + if (param instanceof ICPPASTSimpleTypeTemplateParameter) { + p = (ICPPTemplateParameter) ((ICPPASTSimpleTypeTemplateParameter)param).getName().resolveBinding(); + } else if (param instanceof ICPPASTParameterDeclaration) { + p = (ICPPTemplateParameter) ((ICPPASTParameterDeclaration)param).getDeclarator().getName().resolveBinding(); + } else if (param instanceof ICPPASTTemplatedTypeTemplateParameter) { + p = (ICPPTemplateParameter) ((ICPPASTTemplatedTypeTemplateParameter)param).getName().resolveBinding(); } if (p != null) { @@ -224,12 +227,23 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement instances.put(types, spec); } - - public IBinding resolveUnknown(ObjectMap argMap) { - return null; - } - public ICPPClassType[] getNestedClasses() { return ICPPClassType.EMPTY_CLASS_ARRAY; } + + public ICPPTemplateScope getTemplateScope() throws DOMException { + return null; + } + + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap) { + return null; + } + + public IASTName getUnknownName() { + return null; + } + + public ICPPBinding getContainerBinding() { + return null; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java index 5bbaf769105..991c9519697 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2007 IBM Corporation and others. + * Copyright (c) 2005, 2008 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 @@ -7,6 +7,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -17,6 +18,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.core.parser.util.ObjectMap; @@ -27,7 +29,7 @@ import org.eclipse.cdt.internal.core.index.IIndexType; * @author aniefer */ public class CPPTemplateTypeParameter extends CPPTemplateParameter implements - ICPPTemplateTypeParameter, IType, ICPPInternalUnknown { + ICPPTemplateTypeParameter, IType, ICPPUnknownBinding { private ICPPScope unknownScope; public CPPTemplateTypeParameter(IASTName name) { @@ -65,8 +67,16 @@ public class CPPTemplateTypeParameter extends CPPTemplateParameter implements return false; } - public IBinding resolveUnknown(ObjectMap argMap) { + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap) { // Cannot do resolution here since the result is not necessarily a binding. return null; - } + } + + public IASTName getUnknownName() { + return null; + } + + public ICPPBinding getContainerBinding() { + return null; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java index 03e1556f1e4..c52d795aa46 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java @@ -16,35 +16,34 @@ import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; -import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IScope; -import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; -import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.internal.core.dom.Linkage; -import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.core.runtime.PlatformObject; /** * @author aniefer */ public abstract class CPPUnknownBinding extends PlatformObject - implements ICPPInternalUnknown, Cloneable { + implements ICPPUnknownBinding, ICPPInternalBinding, Cloneable { private ICPPScope unknownScope; - protected ICPPInternalUnknown scopeBinding; + protected ICPPBinding scopeBinding; protected IASTName name; - public CPPUnknownBinding(ICPPInternalUnknown scopeBinding, IASTName name) { + public CPPUnknownBinding(ICPPUnknownBinding scopeBinding, IASTName name) { super(); this.name = name; this.scopeBinding = scopeBinding; } + public CPPUnknownBinding(ICPPTemplateDefinition templateDef) { + this.name= new CPPASTName(templateDef.getNameCharArray()); + this.scopeBinding= templateDef; + } + public IASTNode[] getDeclarations() { return null; } @@ -82,55 +81,23 @@ public abstract class CPPUnknownBinding extends PlatformObject return name.toCharArray(); } - public IScope getScope() { - return scopeBinding.getUnknownScope(); + public IScope getScope() throws DOMException { + if (scopeBinding instanceof ICPPUnknownBinding) { + return ((ICPPUnknownBinding) scopeBinding).getUnknownScope(); + } else if (scopeBinding instanceof ICPPTemplateDefinition) { + return ((ICPPTemplateDefinition) scopeBinding).getTemplateScope(); + } + assert false; + return null; } - public ICPPScope getUnknownScope() { + public ICPPScope getUnknownScope() throws DOMException { if (unknownScope == null) { unknownScope = new CPPUnknownScope(this, name); } return unknownScope; } - public IBinding resolveUnknown(ObjectMap argMap) throws DOMException { - IBinding result = this; - IType t = null; - if (scopeBinding instanceof ICPPTemplateTypeParameter) { - t = CPPTemplates.instantiateType((ICPPTemplateTypeParameter) scopeBinding, argMap); - } else if (scopeBinding instanceof ICPPInternalUnknownClassType) { - IBinding binding = ((ICPPInternalUnknownClassType) scopeBinding).resolveUnknown(argMap); - if (binding instanceof IType) { - t = (IType) binding; - } - } - if (t != null) { - t = SemanticUtil.getUltimateType(t, false); - if (t instanceof ICPPClassType) { - IScope s = ((ICPPClassType) t).getCompositeScope(); - if (s != null && ASTInternal.isFullyCached(s)) { - // If name did not come from an AST but was created just to encapsulate - // a simple identifier, we should not use getBinding method since it may - // lead to a NullPointerException. - if (name.getParent() != null) { - result = s.getBinding(name, true); - } else { - IBinding[] bindings = s.find(name.toString()); - if (bindings != null && bindings.length > 0) { - result = bindings[0]; - } - } - } - } else if (t instanceof ICPPInternalUnknown) { - result = resolvePartially((ICPPInternalUnknown) t, argMap); - } - } - return result; - } - - - protected abstract IBinding resolvePartially(ICPPInternalUnknown parentBinding, ObjectMap argMap); - public ILinkage getLinkage() { return Linkage.CPP_LINKAGE; } @@ -148,4 +115,12 @@ public abstract class CPPUnknownBinding extends PlatformObject public String toString() { return getName(); } + + public IASTName getUnknownName() { + return name; + } + + public ICPPBinding getContainerBinding() { + return scopeBinding; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java index cdeb765936e..132b7a60b26 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java @@ -12,12 +12,14 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; +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.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; @@ -29,12 +31,16 @@ import org.eclipse.cdt.core.parser.util.ObjectMap; * * @author aniefer */ -public class CPPUnknownClass extends CPPUnknownBinding implements ICPPInternalUnknownClassType { +public class CPPUnknownClass extends CPPUnknownBinding implements ICPPUnknownClassType { - public CPPUnknownClass(ICPPInternalUnknown scopeBinding, IASTName name) { + public CPPUnknownClass(ICPPUnknownBinding scopeBinding, IASTName name) { super(scopeBinding, name); } + protected CPPUnknownClass(ICPPClassTemplate template) { + super(template); + } + public ICPPBase[] getBases() { return ICPPBase.EMPTY_BASE_ARRAY; } @@ -71,11 +77,11 @@ public class CPPUnknownClass extends CPPUnknownBinding implements ICPPInternalUn return IBinding.EMPTY_BINDING_ARRAY; } - public int getKey() { + public int getKey() throws DOMException{ return 0; } - public IScope getCompositeScope() { + public final IScope getCompositeScope() throws DOMException { return getUnknownScope(); } @@ -87,8 +93,7 @@ public class CPPUnknownClass extends CPPUnknownBinding implements ICPPInternalUn return ICPPClassType.EMPTY_CLASS_ARRAY; } - @Override - public IBinding resolvePartially(ICPPInternalUnknown parentBinding, ObjectMap argMap) { + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap) { if (parentBinding == this.scopeBinding) { return this; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java index 4f4cb636a0c..fdddd9d43a6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java @@ -11,12 +11,9 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; -import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -25,10 +22,10 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; * * @author Sergey Prigogin */ -public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPInternalUnknownClassInstance { +public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPUnknownClassInstance { private final IType[] arguments; - public CPPUnknownClassInstance(ICPPInternalUnknown scopeBinding, IASTName name, IType[] arguments) { + public CPPUnknownClassInstance(ICPPUnknownBinding scopeBinding, IASTName name, IType[] arguments) { super(scopeBinding, name); this.arguments = arguments; } @@ -37,24 +34,11 @@ public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPInte return arguments; } - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown#resolveUnknown(org.eclipse.cdt.core.parser.util.ObjectMap) - */ - @Override - public IBinding resolveUnknown(ObjectMap argMap) throws DOMException { - IBinding result = super.resolveUnknown(argMap); - if (result instanceof ICPPSpecialization && result instanceof ICPPTemplateDefinition) { - IType[] newArgs = CPPTemplates.instantiateTypes(arguments, argMap); - result = CPPTemplates.instantiateTemplate((ICPPTemplateDefinition) result, newArgs, null); - } - return result; - } - /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassType#resolvePartially(org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown, org.eclipse.cdt.core.parser.util.ObjectMap) */ @Override - public IBinding resolvePartially(ICPPInternalUnknown parentBinding, ObjectMap argMap) { + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap) { IType[] newArgs = CPPTemplates.instantiateTypes(arguments, argMap); return new CPPUnknownClassInstance(parentBinding, name, newArgs); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java index f32da9ca224..fadedc0662d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java @@ -21,6 +21,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.parser.util.ArrayUtil; @@ -32,11 +33,11 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; * @author aniefer */ public class CPPUnknownScope implements ICPPScope, ICPPInternalUnknownScope { - private final ICPPInternalUnknown binding; + private final ICPPUnknownBinding binding; private final IASTName scopeName; private CharArrayObjectMap map; - public CPPUnknownScope(ICPPInternalUnknown binding, IASTName name) { + public CPPUnknownScope(ICPPUnknownBinding binding, IASTName name) { super(); this.scopeName = name; this.binding = binding; @@ -127,8 +128,8 @@ public class CPPUnknownScope implements ICPPScope, ICPPInternalUnknownScope { IBinding[] result = null; if (prefixLookup) { Object[] keys = map.keyArray(); - for (int i = 0; i < keys.length; i++) { - char[] key = (char[]) keys[i]; + for (Object key2 : keys) { + char[] key = (char[]) key2; if (CharArrayUtils.equals(key, 0, c.length, c, true)) { result = (IBinding[]) ArrayUtil.append(IBinding.class, result, map.get(key)); } @@ -167,7 +168,7 @@ public class CPPUnknownScope implements ICPPScope, ICPPInternalUnknownScope { /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownScope#getUnknownBinding() */ - public ICPPInternalUnknown getScopeBinding() { + public ICPPBinding getScopeBinding() { return binding; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPDeferredClassInstance.java similarity index 57% rename from core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalDeferredClassInstance.java rename to core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPDeferredClassInstance.java index cfa19c6ad9a..8ded3f2eb94 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPDeferredClassInstance.java @@ -1,26 +1,20 @@ /******************************************************************************* - * Copyright (c) 2007 QNX Software Systems and others. + * Copyright (c) 2007, 2008 QNX Software Systems 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation + * QNX - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; -import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; /** - * @author Bryan Wilkinson - * + * Interface for deferred class template instances. */ -public interface ICPPInternalDeferredClassInstance { - - /** - * instantiate the original template - */ - public IType instantiate(ObjectMap argMap); +public interface ICPPDeferredClassInstance extends ICPPUnknownClassType, ICPPDeferredTemplateInstance { } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknown.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknown.java deleted file mode 100644 index 8d49cbe3d76..00000000000 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknown.java +++ /dev/null @@ -1,29 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004, 2005 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 - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ - -/* - * Created on May 3, 2005 - */ -package org.eclipse.cdt.internal.core.dom.parser.cpp; - -import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; -import org.eclipse.cdt.core.parser.util.ObjectMap; - -/** - * @author aniefer - */ -public interface ICPPInternalUnknown extends ICPPInternalBinding { - public ICPPScope getUnknownScope(); - - public IBinding resolveUnknown(ObjectMap argMap) throws DOMException; -} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknownClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknownClassType.java deleted file mode 100644 index cf3e36d14f9..00000000000 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknownClassType.java +++ /dev/null @@ -1,31 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Google, Inc 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 - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Sergey Prigogin (Google) - initial API and implementation - *******************************************************************************/ -package org.eclipse.cdt.internal.core.dom.parser.cpp; - -import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; -import org.eclipse.cdt.core.parser.util.ObjectMap; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown; - -/* - * @author Sergey Prigogin - */ -public interface ICPPInternalUnknownClassType extends ICPPClassType, ICPPInternalUnknown { - /** - * Resolves unknown type to another unknown type that is a step closer to the final - * name resolution. - * @param parentBinding a new parent binding, usually a result of partial resolution - * of the original parent binding. - * @param argMap template argument map. - * @return a partially resolved, but still unknown, binding. - */ - public IBinding resolvePartially(ICPPInternalUnknown parentBinding, ObjectMap argMap); -} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknownScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknownScope.java index f6b32ae2bec..b551fb4844b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknownScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknownScope.java @@ -10,11 +10,11 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.internal.core.dom.parser.IASTInternalScope; /** * Scope corresponding to an unknown binding. - * @see ICPPInternalUnknown * * @author Sergey Prigogin */ @@ -23,5 +23,5 @@ public interface ICPPInternalUnknownScope extends IASTInternalScope { /** * @return Returns the binding corresponding to the scope. */ - public abstract ICPPInternalUnknown getScopeBinding(); + public abstract ICPPBinding getScopeBinding(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownBinding.java new file mode 100644 index 00000000000..8a8e1c80179 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownBinding.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.dom.parser.cpp; + +import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; +import org.eclipse.cdt.core.parser.util.ObjectMap; + +/** + * Represents a binding found within a template definition that cannot be resolved until + * the template gets instantiated. + * + * This interface should be made public + * @since 5.0 + */ +public interface ICPPUnknownBinding extends ICPPBinding { + + /** + * Returns the binding of the scope containing this binding. + * @since 5.0 + */ + public ICPPBinding getContainerBinding(); + + /** + * Returns the scope this binding represents. + * @throws DOMException + */ + public ICPPScope getUnknownScope() throws DOMException; + + /** + * Returns a the name of the unknown binding that has to be searched in the parent scope. + * The ast-node may not be rooted in an ast-tree. May be null. + */ + public IASTName getUnknownName(); + + /** + * Resolves unknown type to another unknown type that is a step closer to the final + * name resolution. + * @param parentBinding a new parent binding, usually a result of partial resolution + * of the original parent binding, or null for deferred template + * instantiations. + * @param argMap template argument map. + * @return a partially resolved, but still unknown, binding. + */ + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap); +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknownClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownClassInstance.java similarity index 80% rename from core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknownClassInstance.java rename to core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownClassInstance.java index 3be5e546c8a..cabb1b9ab11 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknownClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownClassInstance.java @@ -12,11 +12,15 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.IType; -/* +/** * Represents a partially instantiated C++ class template, declaration of which is not yet available. * - * @author Sergey Prigogin + * This interface should be made public. + * @since 5.0 */ -public interface ICPPInternalUnknownClassInstance extends ICPPInternalUnknownClassType { +public interface ICPPUnknownClassInstance extends ICPPUnknownClassType { + /** + * Returns the arguments of the instantiation + */ public IType[] getArguments(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownClassType.java new file mode 100644 index 00000000000..0e01b38bd60 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownClassType.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.dom.parser.cpp; + +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; + +/** + * Represents a binding for a type found in a template definition, that can be + * determined only after the template is instantiated. + * + * This interface should be made public. + * @since 5.0 + */ +public interface ICPPUnknownClassType extends ICPPUnknownBinding, ICPPClassType { + +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index 5d9b3c544ff..a1a98703d86 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -137,6 +137,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUsingDeclaration; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUsingDirective; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator; import org.eclipse.cdt.internal.core.index.IIndexScope; @@ -313,6 +314,11 @@ public class CPPSemantics { name = (IASTName) name.getParent(); } + // if the lookup in base-classes ran into a deferred instance, use the computed unknown binding. + if (binding == null && data.unknownBinding != null) { + binding= data.unknownBinding; + } + if (binding != null) { if (name.getPropertyInParent() == IASTNamedTypeSpecifier.NAME && !(binding instanceof IType || binding instanceof ICPPConstructor)) { IASTNode parent = name.getParent().getParent(); @@ -746,18 +752,20 @@ public class CPPSemantics { } private static Object lookupInParents(LookupData data, ICPPScope lookIn) throws DOMException{ - ICPPBase[] bases = null; - if (lookIn instanceof ICPPClassScope) { - ICPPClassType c = ((ICPPClassScope)lookIn).getClassType(); - if (c != null) - bases = c.getBases(); - } + if (lookIn instanceof ICPPClassScope == false) + return null; + + final ICPPClassType classType= ((ICPPClassScope)lookIn).getClassType(); + if (classType == null) + return null; + + final ICPPBase[] bases= classType.getBases(); + if (bases == null || bases.length == 0) + return null; Object inherited = null; Object result = null; - if (bases == null || bases.length == 0) - return null; //use data to detect circular inheritance if (data.inheritanceChain == null) @@ -771,19 +779,27 @@ public class CPPSemantics { } int size = bases.length; - for (int i = 0; i < size; i++) - { + for (int i = 0; i < size; i++) { inherited = null; - ICPPClassType cls = null; IBinding b = bases[i].getBaseClass(); - if (b instanceof ICPPClassType) - cls = (ICPPClassType) b; - else + if (b instanceof ICPPClassType == false) continue; - ICPPScope parent = (ICPPScope) cls.getCompositeScope(); + + final ICPPClassType cls= (ICPPClassType) b; + final ICPPScope parent = (ICPPScope) cls.getCompositeScope(); - if (parent == null || parent instanceof CPPUnknownScope) + if (parent == null) continue; + if (parent instanceof CPPUnknownScope) { + if (data.unknownBinding == null && classType instanceof ICPPClassTemplate && data.astName != null) { + ICPPClassTemplate template= ((ICPPClassTemplate) classType); + IBinding thisType= CPPTemplates.instantiateWithinClassTemplate(template); + if (thisType instanceof ICPPUnknownBinding) { + data.unknownBinding= ((ICPPUnknownBinding) thisType).getUnknownScope().getBinding(data.astName, true); + } + } + continue; + } if (!bases[i].isVirtual() || !data.visited.containsKey(parent)) { if (bases[i].isVirtual()) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index cff1c068a11..4e7ef2944b6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -55,10 +55,12 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplatedTypeTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; @@ -80,6 +82,7 @@ import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectSet; +import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTLiteralExpression; @@ -108,10 +111,11 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTypedefSpecialization; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBase; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalClassTemplate; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplate; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassType; /** * @author aniefer @@ -733,12 +737,10 @@ public class CPPTemplates { } else { newType = t; } - } else if (type instanceof ICPPInternalDeferredClassInstance) { - newType = ((ICPPInternalDeferredClassInstance) type).instantiate(argMap); - } else if (type instanceof ICPPInternalUnknown) { + } else if (type instanceof ICPPUnknownBinding) { IBinding binding; try { - binding = ((ICPPInternalUnknown) type).resolveUnknown(argMap); + binding = CPPTemplates.resolveUnknown((ICPPUnknownBinding) type, argMap); } catch (DOMException e) { binding = e.getProblem(); } @@ -1325,7 +1327,7 @@ public class CPPTemplates { } } return true; - } else if (p instanceof ICPPInternalUnknown) { + } else if (p instanceof ICPPUnknownBinding) { return true; // An unknown type may match anything. } else { return p.isSameType(a); @@ -1478,13 +1480,14 @@ public class CPPTemplates { //to order class template specializations, we need to transform them into function templates ICPPFunctionTemplate template1 = null, template2 = null; - if (spec1 instanceof ICPPClassType) { +// if (spec1 instanceof ICPPClassType) { template1 = classTemplateSpecializationToFunctionTemplate(spec1); template2 = classTemplateSpecializationToFunctionTemplate(spec2); - } else if (spec1 instanceof ICPPFunction) { - template1 = (ICPPFunctionTemplate) spec1; - template2 = (ICPPFunctionTemplate) spec2; - } +// } +// else if (spec1 instanceof ICPPFunction) { +// template1 = (ICPPFunctionTemplate) spec1; +// template2 = (ICPPFunctionTemplate) spec2; +// } return orderTemplateFunctions(template1, template2); } @@ -1528,9 +1531,6 @@ public class CPPTemplates { * arguments of the partial specialization */ static private ICPPFunctionTemplate classTemplateSpecializationToFunctionTemplate(ICPPClassTemplatePartialSpecialization specialization) { - if (!(specialization instanceof ICPPClassType)) - return null; - ICPPTemplateDefinition template = specialization; IType[] args = null; try { @@ -1695,10 +1695,18 @@ public class CPPTemplates { if (map.containsKey(defaultType)) { arg = (IType) map.get(defaultType); } - } else if (defaultType instanceof ICPPInternalDeferredClassInstance) { + } else if (defaultType instanceof ICPPUnknownBinding) { // A default template parameter may be depend on a previously defined // parameter: template > class B {}; - arg = ((ICPPInternalDeferredClassInstance) defaultType).instantiate(map); + IType resolvedType= null; + try { + IBinding resolved= CPPTemplates.resolveUnknown((ICPPUnknownBinding) defaultType, map); + if (resolved instanceof IType) { + resolvedType= (IType) resolved; + } + } catch (DOMException e) { + } + arg= resolvedType == null ? defaultType : resolvedType; } else { arg = defaultType; } @@ -1784,4 +1792,53 @@ public class CPPTemplates { return new ICPPBase[0]; } + + /** + * Attempts to (partially) resolve an unknown binding with the given arguments. + */ + public static IBinding resolveUnknown(ICPPUnknownBinding unknown, ObjectMap argMap) throws DOMException { + ICPPBinding parentBinding= unknown.getContainerBinding(); + IBinding result = unknown; + IType t = null; + if (parentBinding instanceof ICPPTemplateTypeParameter) { + t = CPPTemplates.instantiateType((ICPPTemplateTypeParameter) parentBinding, argMap); + } else if (parentBinding instanceof ICPPUnknownClassType) { + IBinding binding= CPPTemplates.resolveUnknown((ICPPUnknownClassType) parentBinding, argMap); + if (binding instanceof IType) { + t = (IType) binding; + } + } + if (t != null) { + t = SemanticUtil.getUltimateType(t, false); + if (t instanceof ICPPUnknownBinding) { + result = unknown.resolvePartially((ICPPUnknownBinding) t, argMap); + } else if (t instanceof ICPPClassType) { + IScope s = ((ICPPClassType) t).getCompositeScope(); + if (s != null && ASTInternal.isFullyCached(s)) { + // If name did not come from an AST but was created just to encapsulate + // a simple identifier, we should not use getBinding method since it may + // lead to a NullPointerException. + IASTName name= unknown.getUnknownName(); + if (name != null) { + if (name.getParent() != null) { + result = s.getBinding(name, true); + } else { + IBinding[] bindings = s.find(name.toString()); + if (bindings != null && bindings.length > 0) { + result = bindings[0]; + } + } + if (unknown instanceof ICPPUnknownClassInstance && result instanceof ICPPTemplateDefinition) { + IType[] newArgs = CPPTemplates.instantiateTypes(((ICPPUnknownClassInstance) unknown).getArguments(), argMap); + result = CPPTemplates.instantiateTemplate((ICPPTemplateDefinition) result, newArgs, null); + } + } + } + } + } else if (unknown instanceof ICPPDeferredTemplateInstance) { + result= unknown.resolvePartially(null, argMap); + } + + return result; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 5b8c3e43cf2..c80f0f1e8aa 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -177,7 +177,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.GPPPointerToMemberType; import org.eclipse.cdt.internal.core.dom.parser.cpp.GPPPointerType; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.index.IIndexScope; /** @@ -924,8 +924,8 @@ public class CPPVisitor { scope= ((ICPPClassType)binding).getCompositeScope(); } else if (binding instanceof ICPPNamespace) { scope= ((ICPPNamespace)binding).getNamespaceScope(); - } else if (binding instanceof ICPPInternalUnknown) { - scope= ((ICPPInternalUnknown)binding).getUnknownScope(); + } else if (binding instanceof ICPPUnknownBinding) { + scope= ((ICPPUnknownBinding)binding).getUnknownScope(); } else if (binding instanceof IProblemBinding) { if (binding instanceof ICPPScope) scope= (IScope) binding; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java index 0373a5aa999..cb3c61fda02 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java @@ -33,6 +33,7 @@ import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTTypeId; +import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IPointerType; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; @@ -95,6 +96,7 @@ class LookupData { public boolean typesOnly = false; public boolean considerConstructors = false; + public IBinding unknownBinding= null; public Object foundItems = null; public Object [] functionParameters; public IASTNode [] templateArguments; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/CompositeIndexBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/CompositeIndexBinding.java index e0e91a1416f..e8a75aac971 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/CompositeIndexBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/CompositeIndexBinding.java @@ -13,11 +13,10 @@ package org.eclipse.cdt.internal.core.index.composite; import org.eclipse.cdt.core.dom.ILinkage; -import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexFile; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; +import org.eclipse.cdt.internal.core.index.IIndexScope; import org.eclipse.core.runtime.CoreException; /** @@ -71,7 +70,7 @@ public abstract class CompositeIndexBinding implements IIndexBinding { return new String[] {getName()}; } - public IScope getScope() throws DOMException { + public IIndexScope getScope() { return cf.getCompositeScope(rbinding.getScope()); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java index 115a9cb80bf..a8fc8c20a0a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java @@ -6,7 +6,8 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation + * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; @@ -51,8 +52,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexMacroContainer; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassInstance; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassType; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassType; import org.eclipse.cdt.internal.core.index.CIndex; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.IIndexScope; @@ -254,10 +255,10 @@ public class CPPCompositesFactory extends AbstractCompositeFactory { result = new CompositeCPPField(this, (ICPPField) binding); } else if (binding instanceof ICPPVariable) { result = new CompositeCPPVariable(this, (ICPPVariable) binding); - } else if (binding instanceof ICPPInternalUnknownClassInstance) { - result = new CompositeCPPUnknownClassInstance(this, (ICPPInternalUnknownClassInstance) binding); - } else if (binding instanceof ICPPInternalUnknownClassType) { - result = new CompositeCPPUnknownClassType(this, (ICPPInternalUnknownClassType) binding); + } else if (binding instanceof ICPPUnknownClassInstance) { + result = new CompositeCPPUnknownClassInstance(this, (ICPPUnknownClassInstance) binding); + } else if (binding instanceof ICPPUnknownClassType) { + result = new CompositeCPPUnknownClassType(this, (ICPPUnknownClassType) binding); } else if (binding instanceof ICPPClassType) { ICPPClassType def = (ICPPClassType) findOneBinding(binding); result = def == null ? null : new CompositeCPPClassType(this, def); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java index ea9f2b2e526..7a596f10eb0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java @@ -6,7 +6,8 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation + * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; @@ -21,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; @@ -30,8 +32,8 @@ import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; import org.eclipse.core.runtime.CoreException; -public class CompositeCPPClassTemplate extends CompositeCPPClassType implements -ICPPClassTemplate, ICPPInternalTemplateInstantiator { +public class CompositeCPPClassTemplate extends CompositeCPPClassType + implements ICPPClassTemplate, ICPPInternalTemplateInstantiator { public CompositeCPPClassTemplate(ICompositesFactory cf, ICPPClassType ct) { super(cf, ct); @@ -88,4 +90,8 @@ ICPPClassTemplate, ICPPInternalTemplateInstantiator { return CPPTemplates.instantiateTemplate(this, arguments, null); } + + public ICPPTemplateScope getTemplateScope() throws DOMException { + return (ICPPTemplateScope) getCompositeScope().getParent(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplatePartialSpecialization.java index 326c7e139c6..bfa65473cca 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplatePartialSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplatePartialSpecialization.java @@ -15,7 +15,6 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; @@ -25,7 +24,7 @@ import org.eclipse.core.runtime.CoreException; public class CompositeCPPClassTemplatePartialSpecialization extends CompositeCPPClassTemplate implements ICPPClassTemplatePartialSpecialization, ICPPSpecialization, IPDOMOverloader { public CompositeCPPClassTemplatePartialSpecialization(ICompositesFactory cf, ICPPClassTemplatePartialSpecialization delegate) { - super(cf, (ICPPClassType) delegate); + super(cf, delegate); } public ICPPClassTemplate getPrimaryClassTemplate() throws DOMException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplateSpecialization.java index 9b4b90c4d10..f648daf2408 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplateSpecialization.java @@ -1,12 +1,13 @@ /******************************************************************************* - * Copyright (c) 2007 Symbian Software Systems and others. + * Copyright (c) 2007, 2008 Symbian Software Systems 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation + * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; @@ -18,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; @@ -59,4 +61,7 @@ CompositeCPPClassSpecialization implements ICPPClassTemplate, ICPPInternalTempla return InternalTemplateInstantiatorUtil.instantiate(arguments, cf, rbinding); } + public ICPPTemplateScope getTemplateScope() throws DOMException { + return (ICPPTemplateScope) getCompositeScope().getParent(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java index 6154d7fd313..800de32ce2d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java @@ -1,31 +1,39 @@ /******************************************************************************* - * Copyright (c) 2007 Symbian Software Systems and others. + * Copyright (c) 2007, 2008 Symbian Software Systems 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation + * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; +import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; +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.ICPPConstructor; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.parser.util.ObjectMap; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalDeferredClassInstance; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassType; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; -public class CompositeCPPDeferredClassInstance extends CompositeCPPClassType implements ICPPInternalDeferredClassInstance, ICPPDeferredTemplateInstance, ICPPSpecialization { +public class CompositeCPPDeferredClassInstance extends CompositeCPPClassType implements ICPPDeferredClassInstance { + + private ICPPScope unknownScope; public CompositeCPPDeferredClassInstance(ICompositesFactory cf, ICPPClassType rbinding) { super(cf, rbinding); @@ -40,26 +48,37 @@ public class CompositeCPPDeferredClassInstance extends CompositeCPPClassType imp public ICPPConstructor[] getConstructors() { return ICPPConstructor.EMPTY_CONSTRUCTOR_ARRAY; } - - // TODO - what happens to the arguments? - public ICPPSpecialization deferredInstance(IType[] arguments, ObjectMap argMap) { - ICPPSpecialization spec= ((ICPPInternalTemplateInstantiator) rbinding).deferredInstance(argMap, arguments); - return (ICPPSpecialization) cf.getCompositeBinding((IIndexFragmentBinding)spec); + + public IType[] getArguments() { return TemplateInstanceUtil.getArguments(cf, (ICPPTemplateInstance) rbinding); } + public ObjectMap getArgumentMap() { return TemplateInstanceUtil.getArgumentMap(cf, rbinding); } + public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); } + + public IASTName getUnknownName() { + return ((ICPPUnknownClassType) rbinding).getUnknownName(); } - // TODO - what happens to the arguments? - public ICPPSpecialization getInstance(IType[] arguments) { - ICPPSpecialization ins= ((ICPPInternalTemplateInstantiator)rbinding).getInstance(arguments); - return (ICPPSpecialization) cf.getCompositeBinding((IIndexFragmentBinding)ins); + public ICPPBinding getContainerBinding() { + ICPPBinding scopeBinding= ((ICPPUnknownClassType) rbinding).getContainerBinding(); + return (ICPPBinding) cf.getCompositeBinding((IIndexFragmentBinding)scopeBinding); } - // TODO - what happens to the arguments? - public IBinding instantiate(IType[] arguments) { - IBinding ins= ((ICPPInternalTemplateInstantiator)rbinding).instantiate(arguments); - return cf.getCompositeBinding((IIndexFragmentBinding)ins); + public ICPPScope getUnknownScope() throws DOMException { + if (unknownScope == null) { + final ICPPClassTemplate classTemplate= (ICPPClassTemplate) getTemplateDefinition(); + if (classTemplate.getPartialSpecializations().length == 0) { + unknownScope= new CompositeCPPClassSpecializationScope(cf, rbinding); + } + else { + unknownScope= new CompositeCPPUnknownScope(this, getUnknownName()); + } + } + return unknownScope; } - - public IType instantiate(ObjectMap argMap) { + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPUnknownBinding#resolvePartially(org.eclipse.cdt.core.dom.ast.cpp.ICPPUnknownClassBinding, org.eclipse.cdt.core.parser.util.ObjectMap) + */ + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap) { IType[] arguments = getArguments(); IType [] newArgs = new IType[ arguments.length ]; @@ -68,10 +87,6 @@ public class CompositeCPPDeferredClassInstance extends CompositeCPPClassType imp newArgs[i] = CPPTemplates.instantiateType( arguments[i], argMap ); } - return (IType) ((ICPPInternalTemplateInstantiator)getTemplateDefinition()).instantiate( newArgs ); + return ((ICPPInternalTemplateInstantiator)getTemplateDefinition()).instantiate( newArgs ); } - - public IType[] getArguments() { return TemplateInstanceUtil.getArguments(cf, (ICPPTemplateInstance) rbinding); } - public ObjectMap getArgumentMap() { return TemplateInstanceUtil.getArgumentMap(cf, rbinding); } - public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplate.java index d3fcaaa1a36..be23482b3e3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplate.java @@ -6,7 +6,8 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation + * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; @@ -17,12 +18,14 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; -public class CompositeCPPFunctionTemplate extends CompositeCPPFunction implements ICPPFunctionTemplate, ICPPInternalTemplateInstantiator { +public class CompositeCPPFunctionTemplate extends CompositeCPPFunction + implements ICPPFunctionTemplate, ICPPInternalTemplateInstantiator { public CompositeCPPFunctionTemplate(ICompositesFactory cf, ICPPFunction rbinding) { super(cf, rbinding); @@ -47,4 +50,8 @@ public class CompositeCPPFunctionTemplate extends CompositeCPPFunction implement public IBinding instantiate(IType[] arguments) { return InternalTemplateInstantiatorUtil.instantiate(arguments, cf, rbinding); } + + public ICPPTemplateScope getTemplateScope() throws DOMException { + return (ICPPTemplateScope) getFunctionScope().getParent(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplateSpecialization.java index 1bcf4fccd6a..af6ee6f80a8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplateSpecialization.java @@ -1,12 +1,13 @@ /******************************************************************************* - * Copyright (c) 2007 Symbian Software Systems and others. + * Copyright (c) 2007, 2008 Symbian Software Systems 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation + * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; @@ -17,14 +18,14 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; -public class CompositeCPPFunctionTemplateSpecialization - extends CompositeCPPFunctionSpecialization - implements ICPPFunctionTemplate, ICPPInternalTemplateInstantiator { +public class CompositeCPPFunctionTemplateSpecialization extends CompositeCPPFunctionSpecialization + implements ICPPFunctionTemplate, ICPPInternalTemplateInstantiator { public CompositeCPPFunctionTemplateSpecialization(ICompositesFactory cf, ICPPFunction ft) { super(cf, ft); @@ -49,4 +50,8 @@ public class CompositeCPPFunctionTemplateSpecialization public IBinding instantiate(IType[] arguments) { return InternalTemplateInstantiatorUtil.instantiate(arguments, cf, rbinding); } + + public ICPPTemplateScope getTemplateScope() throws DOMException { + return (ICPPTemplateScope) getFunctionScope().getParent(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassInstance.java index 8780b9740a5..d8fafa3b275 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassInstance.java @@ -6,19 +6,15 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Sergey Prigogin (Google) - initial API and implementation + * Sergey Prigogin (Google) - initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; -import org.eclipse.cdt.core.parser.util.ObjectMap; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassInstance; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; @@ -26,14 +22,15 @@ import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; * @author Sergey Prigogin */ class CompositeCPPUnknownClassInstance extends CompositeCPPUnknownClassType - implements ICPPInternalUnknownClassInstance { + implements ICPPUnknownClassInstance { + public CompositeCPPUnknownClassInstance(ICompositesFactory cf, - ICPPInternalUnknownClassInstance rbinding) { + ICPPUnknownClassInstance rbinding) { super(cf, rbinding); } public IType[] getArguments() { - IType[] arguments = ((ICPPInternalUnknownClassInstance) rbinding).getArguments(); + IType[] arguments = ((ICPPUnknownClassInstance) rbinding).getArguments(); try { for (int i = 0; i < arguments.length; i++) { arguments[i] = cf.getCompositeType((IIndexType) arguments[i]); @@ -43,17 +40,4 @@ class CompositeCPPUnknownClassInstance extends CompositeCPPUnknownClassType } return arguments; } - - @Override - public IBinding resolveUnknown(ObjectMap argMap) throws DOMException { - IBinding result = super.resolveUnknown(argMap); - if (result instanceof ICPPSpecialization && result instanceof ICPPTemplateDefinition) { - IType[] newArgs = CPPTemplates.instantiateTypes(getArguments(), argMap); - IBinding instance = CPPTemplates.instantiateTemplate((ICPPTemplateDefinition) result, newArgs, null); - if (instance != null) { - result = instance; - } - } - return result; - } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java index 0b55afd4873..b14257e712c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java @@ -6,43 +6,38 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Sergey Prigogin (Google) - initial API and implementation + * Sergey Prigogin (Google) - initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; -import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; -import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.parser.util.ObjectMap; -import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassType; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassType; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; -import org.eclipse.core.runtime.CoreException; /** * @author Sergey Prigogin */ -class CompositeCPPUnknownClassType extends CompositeCPPBinding -implements ICPPInternalUnknownClassType, IIndexType { - public CompositeCPPUnknownClassType(ICompositesFactory cf, ICPPInternalUnknownClassType rbinding) { +class CompositeCPPUnknownClassType extends CompositeCPPBinding implements ICPPUnknownClassType, IIndexType { + private ICPPScope unknownScope; + + public CompositeCPPUnknownClassType(ICompositesFactory cf, ICPPUnknownClassType rbinding) { super(cf, rbinding); } @@ -134,74 +129,21 @@ implements ICPPInternalUnknownClassType, IIndexType { } public ICPPScope getUnknownScope() { - // TODO Auto-generated method stub - return null; + if (unknownScope == null) { + unknownScope= new CompositeCPPUnknownScope(this, getUnknownName()); + } + return unknownScope; + } + + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap) { + return ((ICPPUnknownClassType) rbinding).resolvePartially(parentBinding, argMap); } - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown#resolveUnknown(org.eclipse.cdt.core.parser.util.ObjectMap) - */ - public IBinding resolveUnknown(ObjectMap argMap) throws DOMException { - IBinding result = this; - IType t = null; - try { - if(rbinding instanceof PDOMBinding) { - IIndexFragmentBinding tparentBinding = (IIndexFragmentBinding) ((PDOMBinding) rbinding).getParentBinding(); - IIndexBinding parentBinding= cf.getCompositeBinding(tparentBinding); - - - if (parentBinding instanceof ICPPTemplateTypeParameter) { - t = CPPTemplates.instantiateType((ICPPTemplateTypeParameter) parentBinding, argMap); - } else if (parentBinding instanceof ICPPInternalUnknownClassType) { - IBinding binding = ((ICPPInternalUnknownClassType) parentBinding).resolveUnknown(argMap); - if (binding instanceof IType) { - t = (IType) binding; - } - } - } - - if (t != null) { - t = SemanticUtil.getUltimateType(t, false); - if (t instanceof ICPPClassType) { - IScope s = ((ICPPClassType) t).getCompositeScope(); - if (s != null && ASTInternal.isFullyCached(s)) { - IBinding[] bindings = s.find(getName()); - if (bindings != null && bindings.length > 0) { - result = bindings[0]; - } - } - } else if (t instanceof ICPPInternalUnknown) { - result = resolvePartially((ICPPInternalUnknown) t, argMap); - } - } - } catch(CoreException ce) { - CCorePlugin.log(ce); - } - - return result; + public IASTName getUnknownName() { + return ((ICPPUnknownClassType) rbinding).getUnknownName(); } - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassType#resolvePartially(org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown, org.eclipse.cdt.core.parser.util.ObjectMap) - */ - public IBinding resolvePartially(ICPPInternalUnknown parentBinding, ObjectMap argMap) { - return ((ICPPInternalUnknownClassType) rbinding).resolvePartially(parentBinding, argMap); - } - - public void addDeclaration(IASTNode node) { - } - - public void addDefinition(IASTNode node) { - } - - public IASTNode[] getDeclarations() { - return null; - } - - public IASTNode getDefinition() { - return null; - } - - public void removeDeclaration(IASTNode node) { + public ICPPBinding getContainerBinding() { + return ((ICPPUnknownClassType) rbinding).getContainerBinding(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownScope.java new file mode 100644 index 00000000000..482841690d6 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownScope.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.index.composite.cpp; + +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.index.IIndexName; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownScope; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; +import org.eclipse.cdt.internal.core.index.IIndexScope; + +public class CompositeCPPUnknownScope extends CPPUnknownScope implements IIndexScope { + private CompositeCPPBinding fBinding; + + public CompositeCPPUnknownScope(CompositeCPPBinding binding, IASTName name) { + super((ICPPUnknownBinding) binding, name); + fBinding= binding; + } + + @Override + public IIndexName getScopeName() { + return null; + } + + @Override + public IIndexScope getParent() { + return fBinding.getScope(); + } + + @Override + public CompositeCPPBinding getScopeBinding() { + return fBinding; + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index 902e6907068..36ae3e733f1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -172,6 +172,7 @@ public class PDOM extends PlatformObject implements IPDOM { * 56 - using directives (bug 216527) * 57.0 - macro references (bug 156561) * 58.0 - non-type parameters (bug 207840) + * 59.0 - changed modeling of deferred class instances (bug 229218) */ public static final int LINKAGES = Database.DATA_AREA; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java index f2aab4f961a..7ba366ac179 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java @@ -33,7 +33,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; @@ -43,6 +42,7 @@ import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassScope; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; @@ -133,7 +133,7 @@ class PDOMCPPClassInstance extends PDOMCPPInstance implements } if (type instanceof ITypedef) return ((ITypedef)type).isSameType(this); - if (type instanceof ICPPDeferredTemplateInstance && type instanceof ICPPClassType) + if (type instanceof ICPPDeferredClassInstance) return type.isSameType(this); //the CPPDeferredClassInstance has some fuzziness if (type instanceof ICPPTemplateInstance) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecializationScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecializationScope.java new file mode 100644 index 00000000000..edddafd68fd --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecializationScope.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.pdom.dom.cpp; + +import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.IScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.index.IIndexBinding; +import org.eclipse.cdt.core.index.IIndexName; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassSpecializationScope; +import org.eclipse.cdt.internal.core.index.IIndexScope; + +/** + * @since 5.0 + */ +public class PDOMCPPClassSpecializationScope extends CPPClassSpecializationScope implements IIndexScope { + + private final PDOMCPPDeferredClassInstance fBinding; + + public PDOMCPPClassSpecializationScope(PDOMCPPDeferredClassInstance specialization) { + super(specialization); + fBinding= specialization; + } + + public IIndexBinding getScopeBinding() { + return fBinding; + } + + @Override + public IIndexName getScopeName() { + return null; + } + + @Override + public IIndexScope getParent() { + ICPPClassType cls = getOriginalClass(); + try { + IScope scope = cls.getCompositeScope(); + if (scope != null) { + scope= scope.getParent(); + if (scope instanceof IIndexScope) { + return (IIndexScope) scope; + } + } + } catch (DOMException e) { + } + return null; + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java index e0d61d2bce7..c1589025562 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java @@ -68,7 +68,7 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType protected static final int RECORD_SIZE = PDOMCPPClassType.RECORD_SIZE + 16; public PDOMCPPClassTemplate(PDOM pdom, PDOMNode parent, ICPPClassTemplate template) throws CoreException { - super(pdom, parent, (ICPPClassType) template); + super(pdom, parent, template); } public PDOMCPPClassTemplate(PDOM pdom, int bindingRecord) { @@ -208,6 +208,10 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType @Override public IIndexScope getScope() { + return getTemplateScope(); + } + + public PDOMCPPTemplateScope getTemplateScope() { if (scope == null) { scope = new PDOMCPPTemplateScope(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java index d230906228a..d5911dc3938 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java @@ -1,12 +1,13 @@ /******************************************************************************* - * Copyright (c) 2007 QNX Software Systems and others. + * Copyright (c) 2007, 2008 QNX Software Systems 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation + * QNX - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; @@ -19,11 +20,11 @@ import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; 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.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; @@ -53,7 +54,7 @@ class PDOMCPPClassTemplateSpecialization extends public PDOMCPPClassTemplateSpecialization(PDOM pdom, PDOMNode parent, ICPPClassTemplate template, PDOMBinding specialized) throws CoreException { - super(pdom, parent, (ICPPClassType) template, specialized); + super(pdom, parent, template, specialized); } public PDOMCPPClassTemplateSpecialization(PDOM pdom, int bindingRecord) { @@ -170,4 +171,11 @@ class PDOMCPPClassTemplateSpecialization extends PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + INSTANCES, getLinkageImpl()); list.accept(visitor); } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition#getTemplateScope() + */ + public ICPPTemplateScope getTemplateScope() throws DOMException { + return (ICPPTemplateScope) getCompositeScope().getParent(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java index ada792f3564..b791c9cf068 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java @@ -1,32 +1,38 @@ /******************************************************************************* - * Copyright (c) 2007 QNX Software Systems and others. + * Copyright (c) 2007, 2008 QNX Software Systems 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation + * QNX - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; 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.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.parser.util.ObjectMap; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalDeferredClassInstance; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexType; @@ -40,8 +46,7 @@ import org.eclipse.core.runtime.CoreException; /** * @author Bryan Wilkinson */ -class PDOMCPPDeferredClassInstance extends PDOMCPPInstance implements - ICPPClassType, IPDOMMemberOwner, IIndexType, ICPPDeferredTemplateInstance, ICPPInternalDeferredClassInstance { +class PDOMCPPDeferredClassInstance extends PDOMCPPInstance implements ICPPDeferredClassInstance, IPDOMMemberOwner, IIndexType { private static final int MEMBERLIST = PDOMCPPInstance.RECORD_SIZE + 0; @@ -50,6 +55,8 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPInstance implements */ @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMCPPInstance.RECORD_SIZE + 4; + + private ICPPScope unknownScope; public PDOMCPPDeferredClassInstance(PDOM pdom, PDOMNode parent, ICPPClassType classType, PDOMBinding instantiated) throws CoreException { @@ -93,7 +100,7 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPInstance implements ICPPClassTemplate classTemplate = (ICPPClassTemplate) getTemplateDefinition(); //allow some fuzziness here. - if (type instanceof ICPPDeferredTemplateInstance && type instanceof ICPPClassType) { + if (type instanceof ICPPDeferredClassInstance) { ICPPClassTemplate typeClass = (ICPPClassTemplate) ((ICPPDeferredTemplateInstance)type).getSpecializedBinding(); return typeClass == classTemplate; } else if (type instanceof ICPPClassTemplate && classTemplate == type) { @@ -108,17 +115,7 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPInstance implements public ICPPConstructor[] getConstructors() throws DOMException { return ICPPConstructor.EMPTY_CONSTRUCTOR_ARRAY; } - - /** - * @param argMap - * @return This class instance re-instantiated with resolved template arguments. - */ - public IType instantiate(ObjectMap argMap) { - IType[] arguments = getArguments(); - IType[] newArgs = CPPTemplates.instantiateTypes(arguments, argMap); - return (IType) ((ICPPInternalTemplateInstantiator) getTemplateDefinition()).instantiate(newArgs); - } - + public void addMember(PDOMNode member) throws CoreException { PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkageImpl()); list.addMember(member); @@ -156,4 +153,34 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPInstance implements public ICPPClassType[] getNestedClasses() throws DOMException { fail(); return null; } @Override public Object clone() {fail();return null;} + + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap) { + IType[] arguments = getArguments(); + IType[] newArgs = CPPTemplates.instantiateTypes(arguments, argMap); + return ((ICPPInternalTemplateInstantiator) getTemplateDefinition()).instantiate(newArgs); + } + + public ICPPScope getUnknownScope() throws DOMException { + if (unknownScope == null) { + final ICPPClassTemplate classTemplate= (ICPPClassTemplate) getTemplateDefinition(); + if (classTemplate.getPartialSpecializations().length == 0) { + unknownScope= new PDOMCPPClassSpecializationScope(this); + } else { + unknownScope= new PDOMCPPUnknownScope(this, new CPPASTName(getNameCharArray())); + } + } + return unknownScope; + } + + public IASTName getUnknownName() { + return new CPPASTName(getNameCharArray()); + } + + public ICPPBinding getContainerBinding() { + try { + return (ICPPBinding) getParentBinding(); + } catch (CoreException e) { + return null; + } + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java index fc5a47229ae..e1fd3dce617 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java @@ -238,4 +238,8 @@ class PDOMCPPFunctionTemplate extends PDOMCPPFunction implements public IIndexBinding getScopeBinding() { return this; } + + public ICPPTemplateScope getTemplateScope() throws DOMException { + return this; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplateSpecialization.java index b31c341708a..58684f835aa 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplateSpecialization.java @@ -21,6 +21,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPDeferredFunctionInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; @@ -150,4 +151,8 @@ class PDOMCPPFunctionTemplateSpecialization extends PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + INSTANCES, getLinkageImpl()); list.accept(visitor); } + + public ICPPTemplateScope getTemplateScope() throws DOMException { + return (ICPPTemplateScope) getFunctionScope().getParent(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index fcf269bd8b7..3f1a0297cdc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -70,10 +70,10 @@ import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBlockScope; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassInstance; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassType; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownScope; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassType; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; @@ -360,10 +360,10 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { } else if (binding instanceof ICPPClassTemplate) { pdomBinding= new PDOMCPPClassTemplate(pdom, parent, (ICPPClassTemplate) binding); } else if (binding instanceof ICPPClassType) { - if (binding instanceof ICPPInternalUnknownClassInstance) { - pdomBinding= new PDOMCPPUnknownClassInstance(pdom, parent, (ICPPInternalUnknownClassInstance) binding); - } else if (binding instanceof ICPPInternalUnknown) { - pdomBinding= new PDOMCPPUnknownClassType(pdom, parent, (ICPPInternalUnknownClassType) binding); + if (binding instanceof ICPPUnknownClassInstance) { + pdomBinding= new PDOMCPPUnknownClassInstance(pdom, parent, (ICPPUnknownClassInstance) binding); + } else if (binding instanceof ICPPUnknownClassType) { + pdomBinding= new PDOMCPPUnknownClassType(pdom, parent, (ICPPUnknownClassType) binding); } else { pdomBinding= new PDOMCPPClassType(pdom, parent, (ICPPClassType) binding); } @@ -527,10 +527,10 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { } else if (binding instanceof ICPPClassType) { return CPP_DEFERRED_CLASS_INSTANCE; } - } else if (binding instanceof ICPPInternalUnknown) { - if (binding instanceof ICPPInternalUnknownClassInstance) { + } else if (binding instanceof ICPPUnknownBinding) { + if (binding instanceof ICPPUnknownClassInstance) { return CPP_UNKNOWN_CLASS_INSTANCE; - } else if (binding instanceof ICPPInternalUnknownClassType) { + } else if (binding instanceof ICPPUnknownClassType) { return CPP_UNKNOWN_CLASS_TYPE; } } else if (binding instanceof ICPPTemplateInstance) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java index 0aa5bf49087..b7accd51326 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java @@ -17,7 +17,7 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTExpression; -import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; @@ -26,7 +26,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.pdom.PDOM; @@ -39,7 +39,7 @@ import org.eclipse.core.runtime.CoreException; * @author Bryan Wilkinson */ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMemberOwner, - ICPPTemplateNonTypeParameter, ICPPInternalUnknown, IIndexType { + ICPPTemplateNonTypeParameter, ICPPUnknownBinding, IIndexType { private static final int MEMBERLIST = PDOMCPPVariable.RECORD_SIZE + 4; @@ -120,26 +120,19 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe return null; } - public IBinding resolveUnknown(ObjectMap argMap) { fail(); return null; } - - public void addDeclaration(IASTNode node) { - } - - public void addDefinition(IASTNode node) { - } - - public IASTNode[] getDeclarations() { - return IASTNode.EMPTY_NODE_ARRAY; - } - - public IASTNode getDefinition() { - return null; - } - - public void removeDeclaration(IASTNode node) { - } - public IASTExpression getDefault() { return null; } + + public IASTName getUnknownName() { + return null; + } + + public ICPPBinding getContainerBinding() { + return null; + } + + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap) { + return null; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java index 78291596a98..9ffed11e75f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java @@ -15,7 +15,7 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; @@ -25,7 +25,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.pdom.PDOM; @@ -38,7 +38,7 @@ import org.eclipse.core.runtime.CoreException; * @author Bryan Wilkinson */ class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements IPDOMMemberOwner, - ICPPTemplateTypeParameter, ICPPInternalUnknown, IIndexType { + ICPPTemplateTypeParameter, ICPPUnknownBinding, IIndexType { private static final int DEFAULT_TYPE = PDOMCPPBinding.RECORD_SIZE + 0; private static final int MEMBERLIST = PDOMCPPBinding.RECORD_SIZE + 4; @@ -144,22 +144,11 @@ class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements IPDOMMember return null; } - public IBinding resolveUnknown(ObjectMap argMap) { fail(); return null; } - - public void addDeclaration(IASTNode node) { - } - - public void addDefinition(IASTNode node) { - } - - public IASTNode[] getDeclarations() { - return IASTNode.EMPTY_NODE_ARRAY; - } - - public IASTNode getDefinition() { + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap) { fail(); return null;} + public IASTName getUnknownName() { return null; } - - public void removeDeclaration(IASTNode node) { + public ICPPBinding getContainerBinding() { + return null; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java index 825e7d51301..a32df61c83c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java @@ -6,7 +6,8 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Sergey Prigogin (Google) - initial API and implementation + * Sergey Prigogin (Google) - initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; @@ -18,17 +19,14 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMNode; import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; -import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownClassInstance; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassInstance; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.pdom.PDOM; @@ -39,8 +37,7 @@ import org.eclipse.core.runtime.CoreException; /** * @author Sergey Prigogin */ -class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType - implements ICPPInternalUnknownClassInstance { +class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType implements ICPPUnknownClassInstance { private static final int ARGUMENTS = PDOMCPPUnknownClassType.RECORD_SIZE + 0; @@ -50,8 +47,7 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType // Cached values. IType[] arguments; - public PDOMCPPUnknownClassInstance(PDOM pdom, PDOMNode parent, - ICPPInternalUnknownClassInstance classInstance) throws CoreException { + public PDOMCPPUnknownClassInstance(PDOM pdom, PDOMNode parent, ICPPUnknownClassInstance classInstance) throws CoreException { super(pdom, parent, classInstance); PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); @@ -106,27 +102,8 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType return arguments; } - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown#resolveUnknown(org.eclipse.cdt.core.parser.util.ObjectMap) - */ @Override - public IBinding resolveUnknown(ObjectMap argMap) throws DOMException { - IBinding result = super.resolveUnknown(argMap); - if (result instanceof ICPPSpecialization && result instanceof ICPPTemplateDefinition) { - IType[] newArgs = CPPTemplates.instantiateTypes(getArguments(), argMap); - IBinding instance = CPPTemplates.instantiateTemplate((ICPPTemplateDefinition) result, newArgs, null); - if (instance != null) { - result = instance; - } - } - return result; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassType#resolvePartially(org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown, org.eclipse.cdt.core.parser.util.ObjectMap) - */ - @Override - public IBinding resolvePartially(ICPPInternalUnknown parentBinding, ObjectMap argMap) { + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap) { IType[] arguments = getArguments(); IType[] newArgs = CPPTemplates.instantiateTypes(arguments, argMap); if (parentBinding instanceof PDOMNode && isChildOf((PDOMNode) parentBinding) && diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java index 25916323c9e..61afb49d2b7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java @@ -6,7 +6,8 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Sergey Prigogin (Google) - initial API and implementation + * Sergey Prigogin (Google) - initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; @@ -14,31 +15,27 @@ import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; -import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.Util; -import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownClass; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassType; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassType; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexScope; import org.eclipse.cdt.internal.core.index.IIndexType; @@ -46,23 +43,23 @@ import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; /** * @author Sergey Prigogin */ -class PDOMCPPUnknownClassType extends PDOMCPPBinding implements ICPPClassScope, ICPPInternalUnknownClassType, +class PDOMCPPUnknownClassType extends PDOMCPPBinding implements ICPPClassScope, ICPPUnknownClassType, IPDOMMemberOwner, IIndexType, IIndexScope { - private static final int FIRSTBASE = PDOMCPPBinding.RECORD_SIZE + 0; - private static final int KEY = PDOMCPPBinding.RECORD_SIZE + 4; // byte - private static final int MEMBERLIST = PDOMCPPBinding.RECORD_SIZE + 8; + private static final int KEY = PDOMCPPBinding.RECORD_SIZE + 0; // byte + private static final int MEMBERLIST = PDOMCPPBinding.RECORD_SIZE + 4; @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 12; + protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 8; + + private ICPPScope unknownScope; - public PDOMCPPUnknownClassType(PDOM pdom, PDOMNode parent, ICPPInternalUnknownClassType classType) + public PDOMCPPUnknownClassType(PDOM pdom, PDOMNode parent, ICPPUnknownClassType classType) throws CoreException { super(pdom, parent, classType.getNameCharArray()); @@ -105,23 +102,7 @@ class PDOMCPPUnknownClassType extends PDOMCPPBinding implements ICPPClassScope, public int getNodeType() { return IIndexCPPBindingConstants.CPP_UNKNOWN_CLASS_TYPE; } - - public PDOMCPPBase getFirstBase() throws CoreException { - int rec = pdom.getDB().getInt(record + FIRSTBASE); - return rec != 0 ? new PDOMCPPBase(pdom, rec) : null; - } - - private void setFirstBase(PDOMCPPBase base) throws CoreException { - int rec = base != null ? base.getRecord() : 0; - pdom.getDB().putInt(record + FIRSTBASE, rec); - } - - public void addBase(PDOMCPPBase base) throws CoreException { - PDOMCPPBase firstBase = getFirstBase(); - base.setNextBase(firstBase); - setFirstBase(base); - } - + @Override public void accept(IPDOMVisitor visitor) throws CoreException { super.accept(visitor); @@ -137,21 +118,17 @@ class PDOMCPPUnknownClassType extends PDOMCPPBinding implements ICPPClassScope, return this; } - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown#getUnknownScope() - */ - public ICPPScope getUnknownScope() { fail(); return null; } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.index.IIndexScope#getScopeBinding() - */ + public ICPPScope getUnknownScope() { + if (unknownScope == null) { + unknownScope= new PDOMCPPUnknownScope(this, getUnknownName()); + } + return unknownScope; + } + public IIndexBinding getScopeBinding() { return this; } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#isGloballyQualified() - */ @Override public boolean isGloballyQualified() throws DOMException { try { @@ -170,10 +147,6 @@ class PDOMCPPUnknownClassType extends PDOMCPPBinding implements ICPPClassScope, addMember(member); } - public boolean isFullyCached() { - return true; - } - @Override public IBinding getBinding(IASTName name, boolean resolve, IIndexFileSet fileSet) throws DOMException { return null; @@ -200,26 +173,6 @@ class PDOMCPPUnknownClassType extends PDOMCPPBinding implements ICPPClassScope, return true; } - public void removeBase(PDOMName pdomName) throws CoreException { - } - - public void addDeclaration(IASTNode node) { - } - - public void addDefinition(IASTNode node) { - } - - public IASTNode[] getDeclarations() { - return null; - } - - public IASTNode getDefinition() { - return null; - } - - public void removeDeclaration(IASTNode node) { - } - /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getBases() */ @@ -294,57 +247,30 @@ class PDOMCPPUnknownClassType extends PDOMCPPBinding implements ICPPClassScope, return ICPPClassType.EMPTY_CLASS_ARRAY; } - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown#resolveUnknown(org.eclipse.cdt.core.parser.util.ObjectMap) - */ - public IBinding resolveUnknown(ObjectMap argMap) throws DOMException { - IBinding result = this; - try { - IIndexBinding parentBinding = getParentBinding(); - IType t = null; - if (parentBinding instanceof ICPPTemplateTypeParameter) { - t = CPPTemplates.instantiateType((ICPPTemplateTypeParameter) parentBinding, argMap); - } else if (parentBinding instanceof ICPPInternalUnknownClassType) { - IBinding binding = ((ICPPInternalUnknownClassType) parentBinding).resolveUnknown(argMap); - if (binding instanceof IType) { - t = (IType) binding; - } - } - if (t != null) { - t = SemanticUtil.getUltimateType(t, false); - if (t instanceof ICPPClassType) { - IScope s = ((ICPPClassType) t).getCompositeScope(); - if (s != null && ASTInternal.isFullyCached(s)) { - IBinding[] bindings = s.find(getName()); - if (bindings != null && bindings.length > 0) { - result = bindings[0]; - } - } - } else if (t instanceof ICPPInternalUnknown) { - result = resolvePartially((ICPPInternalUnknown) t, argMap); - } - } - } catch (CoreException e) { - } - return result; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownClassType#resolvePartially(org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown, org.eclipse.cdt.core.parser.util.ObjectMap) - */ - public IBinding resolvePartially(ICPPInternalUnknown parentBinding, ObjectMap argMap) { + public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap) { try { if (parentBinding == getParentBinding()) { return this; } } catch (CoreException e) { } - IASTName name = new CPPASTName(getNameCharArray()); - return new CPPUnknownClass(parentBinding, name); + return new CPPUnknownClass(parentBinding, getUnknownName()); } @Override public String toString() { return ASTTypeUtil.getType(this); } + + public IASTName getUnknownName() { + return new CPPASTName(getNameCharArray()); + } + + public ICPPBinding getContainerBinding() { + try { + return (ICPPBinding) getParentBinding(); + } catch (CoreException e) { + return null; + } + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownScope.java new file mode 100644 index 00000000000..2295119aa17 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownScope.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.pdom.dom.cpp; + +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.index.IIndexName; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownScope; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; +import org.eclipse.cdt.internal.core.index.IIndexScope; + +/** + * @since 5.0 + */ +public class PDOMCPPUnknownScope extends CPPUnknownScope implements IIndexScope { + + private PDOMCPPBinding fBinding; + + public PDOMCPPUnknownScope(PDOMCPPBinding binding, IASTName name) { + super((ICPPUnknownBinding) binding, name); + } + + @Override + public IIndexName getScopeName() { + return null; + } + + @Override + public IIndexScope getParent() { + return fBinding.getScope(); + } + + @Override + public PDOMCPPBinding getScopeBinding() { + return fBinding; + } +}