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:
parent
5d6ea978bb
commit
ad1fb3be6c
2 changed files with 59 additions and 12 deletions
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue