From f405ef755994c2ea020c7d17ab1dd6cdf897746e Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 29 Jan 2007 11:51:44 +0000 Subject: [PATCH] Follow-up for 169860, fix regression in type hierarchy, inheritance via typedefs --- .../org/eclipse/cdt/core/dom/ast/cpp/ICPPBase.java | 7 +++++++ .../internal/core/dom/parser/cpp/CPPBaseClause.java | 13 +++++++++++-- .../core/dom/parser/cpp/CPPClassTemplate.java | 2 +- .../internal/core/dom/parser/cpp/CPPClassType.java | 2 +- .../cdt/internal/core/pdom/dom/cpp/PDOMCPPBase.java | 9 +++++++-- .../core/pdom/dom/cpp/PDOMCPPClassType.java | 3 ++- .../cdt/internal/ui/typehierarchy/THGraph.java | 4 +++- 7 files changed, 32 insertions(+), 8 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPBase.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPBase.java index 68909aba9b2..f8862bfa77e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPBase.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPBase.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.cdt.core.dom.ast.cpp; +import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; @@ -30,6 +31,12 @@ public interface ICPPBase { * @return */ public IBinding getBaseClass() throws DOMException; + + /** + * Returns the name that specifies the base class. + * @since 4.0 + */ + public IName getBaseClassSpecifierName(); /** * The visibility qualifier applied to the base class. 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 6e26b45da3d..f1aa059ac7c 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 @@ -14,8 +14,9 @@ */ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import org.eclipse.cdt.core.dom.IName; 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.IProblemBinding; import org.eclipse.cdt.core.dom.ast.ITypedef; @@ -32,7 +33,7 @@ import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; public class CPPBaseClause implements ICPPBase { static public class CPPBaseProblem extends ProblemBinding implements ICPPBase { private ICPPClassType classProblem = null; - public CPPBaseProblem( IASTNode node, int id, char[] arg ) { + public CPPBaseProblem( IASTName node, int id, char[] arg ) { super( node, id, arg ); } public IBinding getBaseClass() { @@ -49,6 +50,9 @@ public class CPPBaseClause implements ICPPBase { public boolean isVirtual() throws DOMException { throw new DOMException( this ); } + public IName getBaseClassSpecifierName() { + return (IName) node; + } } private ICPPASTBaseSpecifier base = null; private IBinding baseClass = null; @@ -57,6 +61,7 @@ public class CPPBaseClause implements ICPPBase { this.base = base; } + /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBase#getBaseClass() */ @@ -106,4 +111,8 @@ public class CPPBaseClause implements ICPPBase { baseClass = cls; } + public IName getBaseClassSpecifierName() { + return base.getName(); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java index 2a974bf5ff0..2c9655d4498 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java @@ -195,7 +195,7 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements if( definition == null ){ checkForDefinition(); if( definition == null ){ - IASTNode node = (declarations != null && declarations.length > 0) ? declarations[0] : null; + IASTName node = (declarations != null && declarations.length > 0) ? declarations[0] : null; return new ICPPBase [] { new CPPBaseClause.CPPBaseProblem( node, IProblemBinding.SEMANTIC_DEFINITION_NOT_FOUND, getNameCharArray() ) }; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java index 56d26063c61..4288fed6e10 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java @@ -452,7 +452,7 @@ public class CPPClassType extends PlatformObject implements ICPPClassType, ICPPI if( definition == null ){ checkForDefinition(); if( definition == null ){ - IASTNode node = (declarations != null && declarations.length > 0) ? declarations[0] : null; + IASTName node = (declarations != null && declarations.length > 0) ? declarations[0] : null; return new ICPPBase [] { new CPPBaseClause.CPPBaseProblem( node, IProblemBinding.SEMANTIC_DEFINITION_NOT_FOUND, getNameCharArray() ) }; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBase.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBase.java index 6c1cdef0802..7acd10a72f5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBase.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBase.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.internal.core.pdom.PDOM; @@ -69,7 +70,7 @@ class PDOMCPPBase implements ICPPBase { return pdom.getDB().getByte(record + FLAGS); } - public PDOMName getBaseClassSpecifierImpl() { + public PDOMName getBaseClassSpecifierNameImpl() { try { int rec = pdom.getDB().getInt(record + BASECLASS_SPECIFIER); if (rec != 0) { @@ -81,9 +82,13 @@ class PDOMCPPBase implements ICPPBase { return null; } + public IName getBaseClassSpecifierName() { + return getBaseClassSpecifierNameImpl(); + } + public IBinding getBaseClass() { try { - PDOMName name= getBaseClassSpecifierImpl(); + PDOMName name= getBaseClassSpecifierNameImpl(); if (name != null) { PDOMBinding b = name.getPDOMBinding(); while( b instanceof PDOMCPPTypedef && ((PDOMCPPTypedef)b).getType() instanceof PDOMBinding ){ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java index 7b24640c489..94953474c6e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java @@ -474,7 +474,8 @@ ICPPClassScope, IPDOMMemberOwner, IIndexType { PDOMCPPBase predecessor= null; int nameRec= pdomName.getRecord(); while (base != null) { - if (base.getBaseClassSpecifierImpl().getRecord() == nameRec) { + PDOMName name = base.getBaseClassSpecifierNameImpl(); + if (name != null && name.getRecord() == nameRec) { break; } predecessor= base; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THGraph.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THGraph.java index 7f397363a0d..ec636562547 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THGraph.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/typehierarchy/THGraph.java @@ -21,6 +21,7 @@ import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; @@ -164,7 +165,8 @@ class THGraph { return; } ICPPBase base= bases[i]; - IBinding basecl= base.getBaseClass(); + IName name= base.getBaseClassSpecifierName(); + IBinding basecl= name != null ? index.findBinding(name) : base.getBaseClass(); ICElementHandle[] baseElems= IndexUI.findRepresentative(index, basecl); if (baseElems.length > 0) { ICElementHandle baseElem= baseElems[0];