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.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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
deleted= false;
|
if (deleted) {
|
||||||
if (predecessor == null) {
|
deleted= false;
|
||||||
setFirstBase(base);
|
if (prevBase == null) {
|
||||||
} else {
|
setFirstBase(base);
|
||||||
predecessor.setNextBase(base);
|
} else {
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue