Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Schorn2012-10-02 08:48:24 +0000
committerMarkus Schorn2012-10-02 08:48:24 +0000
commit5e681bbe505074e4f79681a1201b4eac1c9ab281 (patch)
treecafeda303d345e7b340599fd9c60289cd9479f1e /core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPBaseClause.java
parent7cc3de7acf2a377cf916372b9b6763e130917ef9 (diff)
downloadorg.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.java52
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 {

Back to the top