From 3851ae5ee1c0c4b70131cc8ec188d9325efb5ae0 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Mon, 28 Nov 2005 16:51:06 +0000 Subject: [PATCH] Fixed PDOM rebuilding. Fixed file names to be paths in file system instead of workspace. Fixed BTree visit problem that showed off as names appearing more than once in the Bindings View. --- .../cdt/core/dom/ast/gnu/cpp/GPPLanguage.java | 3 ++ .../cdt/internal/core/pdom/PDOMDatabase.java | 6 +-- .../cdt/internal/core/pdom/db/BTree.java | 2 +- .../cdt/internal/core/pdom/db/Database.java | 49 ++++++++++++------- .../core/dom/SavedCodeReaderFactory.java | 2 +- 5 files changed, 38 insertions(+), 24 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java index 0754fbe33f6..1cb12ba2e3d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java @@ -31,6 +31,7 @@ import org.eclipse.cdt.core.parser.ParserUtil; import org.eclipse.cdt.core.parser.ScannerInfo; import org.eclipse.cdt.internal.core.dom.SavedCodeReaderFactory; import org.eclipse.cdt.internal.core.dom.parser.ISourceCodeParser; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPField; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVariable; import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser; import org.eclipse.cdt.internal.core.dom.parser.cpp.GPPParserExtensionConfiguration; @@ -105,6 +106,8 @@ public class GPPLanguage implements ILanguage { if (binding == null) return null; + if (binding instanceof CPPField) + return null; if (binding instanceof CPPVariable) return new PDOMCPPVariable(pdom, name, (CPPVariable)binding); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMDatabase.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMDatabase.java index f649cf9efa1..2924fdd88c3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMDatabase.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMDatabase.java @@ -27,7 +27,9 @@ import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.QualifiedName; +import org.eclipse.core.runtime.Status; /** @@ -118,11 +120,9 @@ public class PDOMDatabase implements IPDOM { } public void delete() throws CoreException { - db = null; + getDB().clear(); bindingIndex = null; fileIndex = null; - System.gc(); - dbPath.toFile().delete(); } public ICodeReaderFactory getCodeReaderFactory() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/BTree.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/BTree.java index aa521cd9dfd..025057a3d2a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/BTree.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/BTree.java @@ -243,7 +243,7 @@ public class BTree { } } - return visit(getChild(chunk, node, i), visitor, found); + return true; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Database.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Database.java index 1ec77ad4e6a..7f91d87196b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Database.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/Database.java @@ -51,22 +51,12 @@ public class Database { } toc = new Chunk[(int)nChunks]; - - // Load in the magic chunk zero - toc[0] = new Chunk(file, 0); - int oldversion = toc[0].getInt(0); - if (oldversion != version) { - // Conversion? - toc[0].putInt(0, version); - } + init(version); } catch (IOException e) { throw new CoreException(new DBStatus(e)); } } - - /** - * Create the database, including chunk zero and the b-trees. - */ + private void create() throws CoreException { try { file.seek(0); @@ -75,6 +65,27 @@ public class Database { throw new CoreException(new DBStatus(e)); } } + + private void init(int version) throws CoreException { + // Load in the magic chunk zero + toc[0] = new Chunk(file, 0); + int oldversion = toc[0].getInt(0); + if (oldversion != version) { + // Conversion? + toc[0].putInt(0, version); + } + } + + /** + * Empty the contents of the Database, make it ready to start again + * @throws CoreException + */ + public void clear() throws CoreException { + int version = toc[0].getInt(0); + create(); + toc = new Chunk[1]; + init(version); + } /** * Return the Chunk that contains the given offset. @@ -158,15 +169,15 @@ public class Database { private int createChunk() throws CoreException { try { - int offset = (int)file.length(); + Chunk[] oldtoc = toc; + int n = oldtoc.length; + int offset = n * CHUNK_SIZE; file.seek(offset); file.write(new byte[CHUNK_SIZE]); - Chunk[] oldtoc = toc; - int i = oldtoc.length; - toc = new Chunk[i + 1]; - System.arraycopy(oldtoc, 0, toc, 0, i); - toc[i] = new Chunk(file, offset); - return i; + toc = new Chunk[n + 1]; + System.arraycopy(oldtoc, 0, toc, 0, n); + toc[n] = new Chunk(file, offset); + return n; } catch (IOException e) { throw new CoreException(new DBStatus(e)); } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/dom/SavedCodeReaderFactory.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/dom/SavedCodeReaderFactory.java index bebb9643865..87cb62b509f 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/dom/SavedCodeReaderFactory.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/dom/SavedCodeReaderFactory.java @@ -79,7 +79,7 @@ public class SavedCodeReaderFactory implements ICodeReaderFactory { } public CodeReader createCodeReaderForTranslationUnit(ITranslationUnit tu) { - return new CodeReader(tu.getPath().toOSString(), tu.getContents()); + return new CodeReader(tu.getResource().getLocation().toOSString(), tu.getContents()); } /* (non-Javadoc)