1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 17:05:26 +02:00

For deferred class instances also defer selection of partial instantiation, bug 229218.

This commit is contained in:
Markus Schorn 2008-05-08 13:10:05 +00:00
parent 3b147b1e56
commit eb179298f4
53 changed files with 871 additions and 709 deletions

View file

@ -2314,7 +2314,7 @@ public class AST2TemplateTests extends AST2BaseTest {
// };
//
// void main(Iter<int*>::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);

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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) {

View file

@ -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);
}

View file

@ -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));
}
}

View file

@ -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();
}
}

View file

@ -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;

View file

@ -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));
}
}

View file

@ -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) {

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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;
}

View file

@ -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 {
}

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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();
}

View file

@ -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 <code>null</code>.
*/
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 <code>null</code> for deferred template
* instantiations.
* @param argMap template argument map.
* @return a partially resolved, but still unknown, binding.
*/
public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap);
}

View file

@ -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();
}

View file

@ -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 {
}

View file

@ -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()) {

View file

@ -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<typename T1, typename T2 = A<T1> > 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;
}
}

View file

@ -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;

View file

@ -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;

View file

@ -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());
}

View file

@ -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);

View file

@ -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();
}
}

View file

@ -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 {

View file

@ -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();
}
}

View file

@ -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); }
}

View file

@ -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();
}
}

View file

@ -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();
}
}

View file

@ -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;
}
}

View file

@ -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();
}
}

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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) {

View file

@ -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;
}
}

View file

@ -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();
}

View file

@ -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();
}
}

View file

@ -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;
}
}
}

View file

@ -238,4 +238,8 @@ class PDOMCPPFunctionTemplate extends PDOMCPPFunction implements
public IIndexBinding getScopeBinding() {
return this;
}
public ICPPTemplateScope getTemplateScope() throws DOMException {
return this;
}
}

View file

@ -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();
}
}

View file

@ -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) {

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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) &&

View file

@ -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;
}
}
}

View file

@ -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;
}
}