1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 391284: Updating the list of the base classes did not work correctly.

This commit is contained in:
Markus Schorn 2012-10-08 07:56:27 +02:00 committed by Sergey Prigogin
parent 5d6ea978bb
commit ad1fb3be6c
2 changed files with 59 additions and 12 deletions

View file

@ -28,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
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.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; 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.ICPPConstructor;
@ -1461,4 +1462,43 @@ public class IndexUpdateTests extends IndexTestBase {
fIndex.releaseReadLock(); fIndex.releaseReadLock();
} }
} }
// struct Base {
// void foo() {}
// };
// struct Derived: Base {
// Derived();
// };
// struct Base {
// void foo() {}
// };
// struct Derived: Base {
// Derived();
// };
public void testBaseClass_Bug391284() throws Exception {
setupFile(2, true);
fIndex.acquireReadLock();
try {
final ICPPClassType s = (ICPPClassType) findBinding("Derived");
assertNotNull(s);
final ICPPBase[] bases = s.getBases();
assertEquals(1, bases.length);
assertEquals("Base", bases[0].getBaseClass().getName());
} finally {
fIndex.releaseReadLock();
}
updateFile();
fIndex.acquireReadLock();
try {
final ICPPClassType s = (ICPPClassType) findBinding("Derived");
assertNotNull(s);
final ICPPBase[] bases = s.getBases();
assertEquals(1, bases.length);
assertEquals("Base", bases[0].getBaseClass().getName());
} finally {
fIndex.releaseReadLock();
}
}
} }

View file

@ -37,6 +37,8 @@ import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; 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.IIndexCPPBindingConstants;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; 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.IPDOMMemberOwner;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
@ -155,33 +157,38 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO
} }
public void removeBases(PDOMName classDefName) throws CoreException { public void removeBases(PDOMName classDefName) throws CoreException {
getPDOM().removeCachedResult(record+PDOMCPPLinkage.CACHE_BASES); final PDOM pdom = getPDOM();
final Database db = getDB();
pdom.removeCachedResult(record+PDOMCPPLinkage.CACHE_BASES);
PDOMCPPBase base= getFirstBase(); PDOMCPPBase base= getFirstBase();
PDOMCPPBase predecessor= null; PDOMCPPBase prevBase= null;
long nameRec= classDefName.getRecord(); long nameRec= classDefName.getRecord();
boolean deleted= false; boolean deleted= false;
while (base != null) { while (base != null) {
PDOMCPPBase nextBase = base.getNextBase(); PDOMCPPBase nextBase = base.getNextBase();
long classDefRec= getDB().getRecPtr(base.getRecord() + PDOMCPPBase.CLASS_DEFINITION); long classDefRec= db.getRecPtr(base.getRecord() + PDOMCPPBase.CLASS_DEFINITION);
if (classDefRec == nameRec) { if (classDefRec == nameRec) {
deleted= true; deleted= true;
base.delete(); base.delete();
} else if (deleted) { } else {
if (deleted) {
deleted= false; deleted= false;
if (predecessor == null) { if (prevBase == null) {
setFirstBase(base); setFirstBase(base);
} else { } else {
predecessor.setNextBase(base); prevBase.setNextBase(base);
} }
predecessor= base; }
prevBase= base;
} }
base= nextBase; base= nextBase;
} }
if (deleted) { if (deleted) {
if (predecessor == null) { if (prevBase == null) {
setFirstBase(null); setFirstBase(null);
} else { } else {
predecessor.setNextBase(null); prevBase.setNextBase(null);
} }
} }
} }