From ad1fb3be6cf40acf4016840eeab410e1aa47f082 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 8 Oct 2012 07:56:27 +0200 Subject: [PATCH] Bug 391284: Updating the list of the base classes did not work correctly. --- .../index/tests/IndexUpdateTests.java | 40 +++++++++++++++++++ .../core/pdom/dom/cpp/PDOMCPPClassType.java | 31 ++++++++------ 2 files changed, 59 insertions(+), 12 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexUpdateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexUpdateTests.java index c25c43b7e29..80faf0f2e50 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexUpdateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexUpdateTests.java @@ -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(); + } + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java index 33b513eab94..bbe9d762471 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java @@ -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); } } }