mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-10 17:55:39 +02:00
Follow-up for 169860, fix regression in type hierarchy, inheritance via typedefs
This commit is contained in:
parent
5af2db4d4c
commit
f405ef7559
7 changed files with 32 additions and 8 deletions
|
@ -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.
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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() ) };
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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() ) };
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 ){
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Add table
Reference in a new issue