From ee2db04840937c2ed2e9f4ba6fc23e68fc6e5e37 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Thu, 29 Sep 2005 21:24:29 +0000 Subject: [PATCH] Created the PDOM Updator which directly hooks up as a resource change listener, thus bypassing all the madness with the indexer. --- .../src/org/eclipse/cdt/core/CCorePlugin.java | 4 + .../eclipse/cdt/core/dom/IPDOMProvider.java | 9 +++ .../src/org/eclipse/cdt/core/dom/PDOM.java | 80 +++++++++++++++++++ .../core/dom/InternalASTServiceProvider.java | 34 +------- .../internal/core/dom/NullPDOMProvider.java | 6 ++ 5 files changed, 101 insertions(+), 32 deletions(-) create mode 100644 core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/dom/PDOM.java diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java index ea03ef62031..51edecd6a91 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java @@ -24,6 +24,7 @@ import java.util.MissingResourceException; import java.util.ResourceBundle; import org.eclipse.cdt.core.dom.CDOM; +import org.eclipse.cdt.core.dom.PDOM; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.IWorkingCopy; import org.eclipse.cdt.core.parser.IScannerInfoProvider; @@ -291,6 +292,9 @@ public class CCorePlugin extends Plugin { //Fired up the indexer fCoreModel.startIndexing(); + + // Fire up the PDOM + PDOM.startup(); // Set the default for using the structual parse mode to build the CModel getPluginPreferences().setDefault(PREF_USE_STRUCTURAL_PARSE_MODE, false); diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/dom/IPDOMProvider.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/dom/IPDOMProvider.java index 5097154dc85..38bef67a402 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/dom/IPDOMProvider.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/dom/IPDOMProvider.java @@ -11,6 +11,7 @@ package org.eclipse.cdt.core.dom; import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.model.IElementChangedListener; import org.eclipse.core.resources.IProject; /** @@ -33,5 +34,13 @@ public interface IPDOMProvider { * @return the PDOM for the project */ public IPDOM getPDOM(IProject project); + + /** + * Return the element changed listener that will handled change + * events that require the PDOM be updated. + * + * @return the element changed listener + */ + public IElementChangedListener getElementChangedListener(); } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/dom/PDOM.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/dom/PDOM.java new file mode 100644 index 00000000000..4d292b395a4 --- /dev/null +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/dom/PDOM.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * 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.dom; + +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.model.IElementChangedListener; +import org.eclipse.cdt.internal.core.dom.NullPDOMProvider; +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; + +/** + * @author Doug Schaefer + * + */ +public class PDOM { + + private static IPDOMProvider pdomProvider; + + private static synchronized void initPDOMProvider() { + IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(IPDOMProvider.ID); + IExtension[] extensions = extensionPoint.getExtensions(); + if (extensions.length > 0) { + // For now just take the first one + IConfigurationElement[] elements= extensions[0].getConfigurationElements(); + if (elements.length > 0) { + // For now just take the first provider + try { + pdomProvider = (IPDOMProvider)elements[0].createExecutableExtension("class"); //$NON-NLS-1$ + return; + } catch (CoreException e) { + } + } + } + + // Couldn't find one + pdomProvider = new NullPDOMProvider(); + } + + private static IPDOMProvider getPDOMProvider() { + if (pdomProvider == null) { + initPDOMProvider(); + } + + return pdomProvider; + } + + /** + * Get the PDOM for the given project. + * + * @param project + * @return the PDOM for the project + */ + public static IPDOM getPDOM(IProject project) { + return getPDOMProvider().getPDOM(project); + } + + /** + * Startup the PDOM. This mainly sets us up to handle model + * change events. + */ + public static void startup() { + IElementChangedListener listener = getPDOMProvider().getElementChangedListener(); + if (listener != null) { + CoreModel.getDefault().addElementChangedListener(listener); + } + } + +} diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/dom/InternalASTServiceProvider.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/dom/InternalASTServiceProvider.java index 993d1e18c11..1b42ee442ef 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/dom/InternalASTServiceProvider.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/dom/InternalASTServiceProvider.java @@ -13,8 +13,8 @@ package org.eclipse.cdt.internal.core.dom; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IASTServiceProvider; import org.eclipse.cdt.core.dom.ICodeReaderFactory; -import org.eclipse.cdt.core.dom.IPDOMProvider; import org.eclipse.cdt.core.dom.IParserConfiguration; +import org.eclipse.cdt.core.dom.PDOM; import org.eclipse.cdt.core.dom.ast.ASTCompletionNode; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.parser.CodeReader; @@ -43,11 +43,6 @@ import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IStorage; -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; import org.eclipse.core.runtime.content.IContentType; /** @@ -64,31 +59,6 @@ public class InternalASTServiceProvider implements IASTServiceProvider { "GNUC++" //$NON-NLS-1$ }; - private IPDOMProvider pdomProvider; - - private IPDOMProvider getPDOMProvider() { - if (pdomProvider == null) { - IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(IPDOMProvider.ID); - IExtension[] extensions = extensionPoint.getExtensions(); - if (extensions.length > 0) { - // For now just take the first one - IConfigurationElement[] elements= extensions[0].getConfigurationElements(); - if (elements.length > 0) { - // For now just take the first provider - try { - pdomProvider = (IPDOMProvider)elements[0].createExecutableExtension("class"); //$NON-NLS-1$ - return pdomProvider; - } catch (CoreException e) { - } - } - } - - // Couldn't find one - pdomProvider = new NullPDOMProvider(); - } - return pdomProvider; - } - /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.IASTServiceProvider#getName() */ @@ -201,7 +171,7 @@ public class InternalASTServiceProvider implements IASTServiceProvider { // Parse IASTTranslationUnit tu = parser.parse(); // Set the PDOM if we can find one - tu.setPDOM(getPDOMProvider().getPDOM(project)); + tu.setPDOM(PDOM.getPDOM(project)); return tu; } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/dom/NullPDOMProvider.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/dom/NullPDOMProvider.java index 25d9a91dd52..6407eb7d103 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/dom/NullPDOMProvider.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/dom/NullPDOMProvider.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.dom; import org.eclipse.cdt.core.dom.IPDOM; import org.eclipse.cdt.core.dom.IPDOMProvider; +import org.eclipse.cdt.core.model.IElementChangedListener; import org.eclipse.core.resources.IProject; /** @@ -25,4 +26,9 @@ public class NullPDOMProvider implements IPDOMProvider { return null; } + public IElementChangedListener getElementChangedListener() { + // here too + return null; + } + }