diff options
author | Markus Schorn | 2012-10-02 08:48:24 +0000 |
---|---|---|
committer | Markus Schorn | 2012-10-02 08:48:24 +0000 |
commit | 5e681bbe505074e4f79681a1201b4eac1c9ab281 (patch) | |
tree | cafeda303d345e7b340599fd9c60289cd9479f1e /core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBaseClause.java | |
parent | 7cc3de7acf2a377cf916372b9b6763e130917ef9 (diff) | |
download | org.eclipse.cdt-5e681bbe505074e4f79681a1201b4eac1c9ab281.tar.gz org.eclipse.cdt-5e681bbe505074e4f79681a1201b4eac1c9ab281.tar.xz org.eclipse.cdt-5e681bbe505074e4f79681a1201b4eac1c9ab281.zip |
Bug 381824: Storing dependent bindings.
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBaseClause.java')
-rw-r--r-- | core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBaseClause.java | 52 |
1 files changed, 36 insertions, 16 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBaseClause.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBaseClause.java index 7963c9d8979..5d45beba891 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBaseClause.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBaseClause.java @@ -16,6 +16,7 @@ import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUti import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.getNestedType; import org.eclipse.cdt.core.dom.IName; +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.ISemanticProblem; @@ -24,40 +25,41 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; 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.ICPPTemplateParameter; public class CPPBaseClause implements ICPPBase, ICPPInternalBase { - private ICPPASTBaseSpecifier base; - private IBinding baseClass; + private final ICPPASTBaseSpecifier base; + private IType baseClass; public CPPBaseClause(ICPPASTBaseSpecifier base) { this.base = base; } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBase#getBaseClass() - */ @Override public IBinding getBaseClass() { + IType type= getBaseClassType(); + type = getNestedType(type, TDEF); + if (type instanceof IBinding) + return (IBinding) type; + return null; + } + + @Override + public IType getBaseClassType() { if (baseClass == null) { IBinding b = base.getName().resolveBinding(); - if (b instanceof IProblemBinding) { + if (b instanceof IProblemBinding || ! (b instanceof IType)) { baseClass = new CPPClassType.CPPClassTypeProblem(base.getName(), ((IProblemBinding) b).getID()); } else { - IType t= null; - if (b instanceof IType) { - t= getNestedType((IType) b, TDEF); - } - if (t instanceof ICPPClassType || t instanceof ICPPTemplateParameter) { - baseClass = (IBinding) t; - } else { + baseClass= (IType) b; + IType check= getNestedType(baseClass, TDEF); + if (!(check instanceof ICPPClassType || check instanceof ICPPUnknownType)) { baseClass = new CPPClassType.CPPClassTypeProblem(base.getName(), ISemanticProblem.BINDING_NO_CLASS); } } } return baseClass; } - + /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBase#getVisibility() */ @@ -86,6 +88,12 @@ public class CPPBaseClause implements ICPPBase, ICPPInternalBase { @Override public void setBaseClass(IBinding cls) { + if (cls instanceof IType) + baseClass = (IType) cls; + } + + @Override + public void setBaseClass(IType cls) { baseClass = cls; } @@ -94,7 +102,19 @@ public class CPPBaseClause implements ICPPBase, ICPPInternalBase { return base.getName(); } - @Override + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBase#getClassDefinitionName() + */ + @Override + public IName getClassDefinitionName() { + IASTNode parent = base.getParent(); + if (parent instanceof ICPPASTCompositeTypeSpecifier) { + return ((ICPPASTCompositeTypeSpecifier) parent).getName(); + } + return null; + } + + @Override public ICPPBase clone() { ICPPBase t = null; try { |