diff --git a/core/org.eclipse.cdt.core/pdom/org/eclipse/cdt/core/pdom/IPDOMDatabaseProvider.java b/core/org.eclipse.cdt.core/pdom/org/eclipse/cdt/core/pdom/IPDOMDatabaseProvider.java new file mode 100644 index 00000000000..5ff32cdd9c5 --- /dev/null +++ b/core/org.eclipse.cdt.core/pdom/org/eclipse/cdt/core/pdom/IPDOMDatabaseProvider.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2005 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * QNX - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.pdom; + +import java.sql.Connection; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.core.runtime.QualifiedName; + +public interface IPDOMDatabaseProvider { + + public static final QualifiedName dbNameKey + = new QualifiedName(CCorePlugin.PLUGIN_ID, "pdomDBName"); + + Connection getDatabase(String dbName, boolean create); + + void shutdownDatabase(String dbName); + +} diff --git a/core/org.eclipse.cdt.core/pdom/org/eclipse/cdt/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/pdom/org/eclipse/cdt/core/pdom/PDOM.java index 0bda0ecc05c..c48d1b19055 100644 --- a/core/org.eclipse.cdt.core/pdom/org/eclipse/cdt/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/pdom/org/eclipse/cdt/core/pdom/PDOM.java @@ -1,21 +1,30 @@ package org.eclipse.cdt.core.pdom; -import java.util.HashSet; +import java.sql.Connection; +import java.util.HashMap; import java.util.Iterator; -import java.util.Set; +import java.util.Map; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.IScope; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtension; +import org.eclipse.core.runtime.IExtensionPoint; +import org.eclipse.core.runtime.Platform; public class PDOM { - // To reduce storage requirements we have a single table that contains all - // of the strings in the PDOM. To check for equality, all you need to do - // is compare string handles. - private Set stringTable = new HashSet(); + // The DOM hash map + private static Map pdomMap = new HashMap(); + + private Connection dbConn; - private IScope globalScope; + private PDOM(Connection conn) { + dbConn = conn; + } /** * Look up the name from the DOM in the PDOM and return the PDOM @@ -79,4 +88,47 @@ public class PDOM { } + /** + * Return the PDOM for the given project + * + * @param project + * @return the PDOM for the project + * @throws CoreException + */ + public static PDOM getPDOM(IProject project) throws CoreException { + // Get the name for the db + boolean create = false; + String dbName = project.getPersistentProperty(IPDOMDatabaseProvider.dbNameKey); + if (dbName == null) { + // New database + create = true; + // TODO - the name shouldn't be the project name in case the + // user changes it and creates a new one with the old name + dbName = project.getName(); + project.setPersistentProperty(IPDOMDatabaseProvider.dbNameKey, dbName); + } else { + // See if we got one already + PDOM pdom = (PDOM)pdomMap.get(dbName); + if (pdom != null) + return pdom; + } + + // Find our database provider + IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(CCorePlugin.PLUGIN_ID, "PDOMDatabaseProvider"); //$NON-NLS-1$ + IExtension[] extensions = extensionPoint.getExtensions(); + + if (extensions.length == 0) + // No DB providers + return null; + + // For now pick the first one. In the future we may want to support more + IConfigurationElement[] elements = extensions[0].getConfigurationElements(); + IPDOMDatabaseProvider dbProvider + = (IPDOMDatabaseProvider)elements[0].createExecutableExtension("class"); //$NON-NLS-1$ + + // create the PDOM + PDOM pdom = new PDOM(dbProvider.getDatabase(dbName, create)); + pdomMap.put(dbName, pdom); + return pdom; + } } diff --git a/core/org.eclipse.cdt.core/pdom/org/eclipse/cdt/core/pdom/PDOMASTServiceProvider.java b/core/org.eclipse.cdt.core/pdom/org/eclipse/cdt/core/pdom/PDOMASTServiceProvider.java new file mode 100644 index 00000000000..55b8b2ee4e4 --- /dev/null +++ b/core/org.eclipse.cdt.core/pdom/org/eclipse/cdt/core/pdom/PDOMASTServiceProvider.java @@ -0,0 +1,59 @@ +package org.eclipse.cdt.core.pdom; + +import org.eclipse.cdt.core.dom.IASTServiceProvider; +import org.eclipse.cdt.core.dom.ICodeReaderFactory; +import org.eclipse.cdt.core.dom.IParserConfiguration; +import org.eclipse.cdt.core.dom.ast.ASTCompletionNode; +import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IStorage; + +public class PDOMASTServiceProvider implements IASTServiceProvider { + + public IASTTranslationUnit getTranslationUnit(IFile fileToParse) + throws UnsupportedDialectException { + // TODO Auto-generated method stub + return null; + } + + public IASTTranslationUnit getTranslationUnit(IStorage fileToParse, + IProject project, ICodeReaderFactory fileCreator) + throws UnsupportedDialectException { + // TODO Auto-generated method stub + return null; + } + + public IASTTranslationUnit getTranslationUnit(IStorage fileToParse, + IProject project) throws UnsupportedDialectException { + // TODO Auto-generated method stub + return null; + } + + public IASTTranslationUnit getTranslationUnit(IFile fileToParse, + ICodeReaderFactory fileCreator) throws UnsupportedDialectException { + // TODO Auto-generated method stub + return null; + } + + public IASTTranslationUnit getTranslationUnit(IFile fileToParse, + ICodeReaderFactory fileCreator, IParserConfiguration configuration) + throws UnsupportedDialectException { + // TODO Auto-generated method stub + return null; + } + + public ASTCompletionNode getCompletionNode(IFile fileToParse, int offset, + ICodeReaderFactory fileCreator) throws UnsupportedDialectException { + // TODO Auto-generated method stub + return null; + } + + public ASTCompletionNode getCompletionNode(IStorage fileToParse, + IProject project, int offset, ICodeReaderFactory fileCreator) + throws UnsupportedDialectException { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/core/org.eclipse.cdt.core/plugin.xml b/core/org.eclipse.cdt.core/plugin.xml index 22c3a5d9f20..f49e449d65a 100644 --- a/core/org.eclipse.cdt.core/plugin.xml +++ b/core/org.eclipse.cdt.core/plugin.xml @@ -63,6 +63,7 @@ + diff --git a/core/org.eclipse.cdt.core/schema/PDOMDatabaseProvider.exsd b/core/org.eclipse.cdt.core/schema/PDOMDatabaseProvider.exsd new file mode 100644 index 00000000000..61cce184201 --- /dev/null +++ b/core/org.eclipse.cdt.core/schema/PDOMDatabaseProvider.exsd @@ -0,0 +1,112 @@ + + + + + + + + + This extension point provides the database to be used for the Persistent DOM. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Enter the first release in which this extension point appears.] + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + + + + + + + + +