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.IValue;
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.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
@ -1461,4 +1462,43 @@ public class IndexUpdateTests extends IndexTestBase {
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.semantics.SemanticUtil;
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.dom.IPDOMMemberOwner;
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 {
getPDOM().removeCachedResult(record+PDOMCPPLinkage.CACHE_BASES);
final PDOM pdom = getPDOM();
final Database db = getDB();
pdom.removeCachedResult(record+PDOMCPPLinkage.CACHE_BASES);
PDOMCPPBase base= getFirstBase();
PDOMCPPBase predecessor= null;
PDOMCPPBase prevBase= null;
long nameRec= classDefName.getRecord();
boolean deleted= false;
while (base != null) {
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) {
deleted= true;
base.delete();
} else if (deleted) {
deleted= false;
if (predecessor == null) {
setFirstBase(base);
} else {
predecessor.setNextBase(base);
} else {
if (deleted) {
deleted= false;
if (prevBase == null) {
setFirstBase(base);
} else {
prevBase.setNextBase(base);
}
}
predecessor= base;
prevBase= base;
}
base= nextBase;
}
if (deleted) {
if (predecessor == null) {
if (prevBase == null) {
setFirstBase(null);
} else {
predecessor.setNextBase(null);
prevBase.setNextBase(null);
}
}
}