blob: 5bde7057c72cd86351074578c0ae11c6b05c3889 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* Markus Schorn (Wind River Systems)
* Andrew Ferguson (Symbian)
* Anton Leherbauer (Wind River Systems)
* oyvind.harboe@zylin.com - http://bugs.eclipse.org/250638
* Jens Elmenthaler - http://bugs.eclipse.org/173458 (camel case completion)
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.core;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.eclipse.cdt.core.build.ICBuildConfiguration;
import org.eclipse.cdt.core.build.ICBuildConfigurationManager;
import org.eclipse.cdt.core.build.IToolChainManager;
import org.eclipse.cdt.core.cdtvariables.ICdtVariableManager;
import org.eclipse.cdt.core.cdtvariables.IUserVarSupplier;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.tag.ITagService;
import org.eclipse.cdt.core.envvar.IEnvironmentVariableManager;
import org.eclipse.cdt.core.index.IIndexManager;
import org.eclipse.cdt.core.language.settings.providers.ScannerDiscoveryLegacySupport;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
import org.eclipse.cdt.core.resources.IConsole;
import org.eclipse.cdt.core.resources.IPathEntryVariableManager;
import org.eclipse.cdt.core.settings.model.ICConfigExtensionReference;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager;
import org.eclipse.cdt.core.settings.model.WriteAccessException;
import org.eclipse.cdt.core.settings.model.util.CDataUtil;
import org.eclipse.cdt.internal.core.CContentTypes;
import org.eclipse.cdt.internal.core.CDTLogWriter;
import org.eclipse.cdt.internal.core.CdtVarPathEntryVariableManager;
import org.eclipse.cdt.internal.core.ICConsole;
import org.eclipse.cdt.internal.core.PositionTrackerManager;
import org.eclipse.cdt.internal.core.build.CBuildConfigurationManager;
import org.eclipse.cdt.internal.core.build.ToolChainManager;
import org.eclipse.cdt.internal.core.cdtvariables.CdtVariableManager;
import org.eclipse.cdt.internal.core.cdtvariables.UserVarSupplier;
import org.eclipse.cdt.internal.core.dom.ast.tag.TagService;
import org.eclipse.cdt.internal.core.envvar.EnvironmentVariableManager;
import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsScannerInfoProvider;
import org.eclipse.cdt.internal.core.model.CModelManager;
import org.eclipse.cdt.internal.core.model.Util;
import org.eclipse.cdt.internal.core.pdom.PDOMManager;
import org.eclipse.cdt.internal.core.resources.ResourceLookup;
import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager;
import org.eclipse.cdt.internal.core.settings.model.ExceptionFactory;
import org.eclipse.cdt.internal.errorparsers.ErrorParserExtensionManager;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.ICommand;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
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.IExtensionRegistry;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import com.ibm.icu.text.MessageFormat;
/**
* CCorePlugin is the life-cycle owner of the core plug-in, and starting point
* for access to many core APIs.
*
* @noextend This class is not intended to be subclassed by clients.
* @noinstantiate This class is not intended to be instantiated by clients.
*/
public class CCorePlugin extends Plugin {
public static final int STATUS_CDTPROJECT_EXISTS = 1;
public static final int STATUS_CDTPROJECT_MISMATCH = 2;
public static final int CDT_PROJECT_NATURE_ID_MISMATCH = 3;
/**
* Status code for core exception that is thrown if a pdom grew larger than
* the supported limit.
*
* @since 5.2
*/
public static final int STATUS_PDOM_TOO_LARGE = 4;
public static final String PLUGIN_ID = "org.eclipse.cdt.core"; //$NON-NLS-1$
public static final String BUILDER_MODEL_ID = PLUGIN_ID + ".CBuildModel"; //$NON-NLS-1$
public static final String BINARY_PARSER_SIMPLE_ID = "BinaryParser"; //$NON-NLS-1$
public static final String BINARY_PARSER_UNIQ_ID = PLUGIN_ID + "." + BINARY_PARSER_SIMPLE_ID; //$NON-NLS-1$
public static final String PREF_BINARY_PARSER = "binaryparser"; //$NON-NLS-1$
public static final String DEFAULT_BINARY_PARSER_SIMPLE_ID = "ELF"; //$NON-NLS-1$
public static final String DEFAULT_BINARY_PARSER_UNIQ_ID = PLUGIN_ID + "." //$NON-NLS-1$
+ DEFAULT_BINARY_PARSER_SIMPLE_ID;
public static final String PREF_USE_STRUCTURAL_PARSE_MODE = "useStructualParseMode"; //$NON-NLS-1$
public static final String INDEX_SIMPLE_ID = "CIndex"; //$NON-NLS-1$
public static final String INDEX_UNIQ_ID = PLUGIN_ID + "." + INDEX_SIMPLE_ID; //$NON-NLS-1$
public static final String INDEXER_SIMPLE_ID = "CIndexer"; //$NON-NLS-1$
public static final String INDEXER_UNIQ_ID = PLUGIN_ID + "." + INDEXER_SIMPLE_ID; //$NON-NLS-1$
public static final String PREF_INDEXER = "indexer"; //$NON-NLS-1$
public static final String DEFAULT_INDEXER = IPDOMManager.ID_FAST_INDEXER;
/**
* Name of the extension point for contributing an error parser
*/
public static final String ERROR_PARSER_SIMPLE_ID = "ErrorParser"; //$NON-NLS-1$
/**
* Full unique name of the extension point for contributing an error parser
*/
public static final String ERROR_PARSER_UNIQ_ID = PLUGIN_ID + "." + ERROR_PARSER_SIMPLE_ID; //$NON-NLS-1$
// default store for pathentry
public static final String DEFAULT_PATHENTRY_STORE_ID = PLUGIN_ID + ".cdtPathEntryStore"; //$NON-NLS-1$
// Build Model Interface Discovery
public static final String BUILD_SCANNER_INFO_SIMPLE_ID = "ScannerInfoProvider"; //$NON-NLS-1$
public static final String BUILD_SCANNER_INFO_UNIQ_ID = PLUGIN_ID + "." + BUILD_SCANNER_INFO_SIMPLE_ID; //$NON-NLS-1$
public static final String DEFAULT_PROVIDER_ID = CCorePlugin.PLUGIN_ID + ".defaultConfigDataProvider"; //$NON-NLS-1$
private static final String SCANNER_INFO_PROVIDER2_NAME = "ScannerInfoProvider2"; //$NON-NLS-1$
private static final String SCANNER_INFO_PROVIDER2 = PLUGIN_ID + "." + SCANNER_INFO_PROVIDER2_NAME; //$NON-NLS-1$
/**
* Name of the extension point for contributing a source code formatter
*/
public static final String FORMATTER_EXTPOINT_ID = "CodeFormatter"; //$NON-NLS-1$
/**
* Possible configurable option ID.
*
* @see #getDefaultOptions
*/
public static final String CORE_ENCODING = PLUGIN_ID + ".encoding"; //$NON-NLS-1$
/**
* IContentType id for C Source Unit
*/
public static final String CONTENT_TYPE_CSOURCE = "org.eclipse.cdt.core.cSource"; //$NON-NLS-1$
/**
* IContentType id for C Header Unit
*/
public static final String CONTENT_TYPE_CHEADER = "org.eclipse.cdt.core.cHeader"; //$NON-NLS-1$
/**
* IContentType id for C++ Source Unit
*/
public static final String CONTENT_TYPE_CXXSOURCE = "org.eclipse.cdt.core.cxxSource"; //$NON-NLS-1$
/**
* IContentType id for C++ Header Unit
*/
public static final String CONTENT_TYPE_CXXHEADER = "org.eclipse.cdt.core.cxxHeader"; //$NON-NLS-1$
/**
* IContentType id for ASM Unit
*/
public static final String CONTENT_TYPE_ASMSOURCE = "org.eclipse.cdt.core.asmSource"; //$NON-NLS-1$
/**
* IContentType id for Binary Files
*/
public static final String CONTENT_TYPE_BINARYFILE = "org.eclipse.cdt.core.binaryFile"; //$NON-NLS-1$
/**
* Possible configurable option value.
*
* @see #getDefaultOptions()
*/
public static final String INSERT = "insert"; //$NON-NLS-1$
/**
* Possible configurable option value.
*
* @see #getDefaultOptions()
*/
public static final String DO_NOT_INSERT = "do not insert"; //$NON-NLS-1$
/**
* Possible configurable option value.
*
* @see #getDefaultOptions()
*/
public static final String TAB = "tab"; //$NON-NLS-1$
/**
* Possible configurable option value.
*
* @see #getDefaultOptions()
*/
public static final String SPACE = "space"; //$NON-NLS-1$
private static CCorePlugin fgCPlugin;
private static ResourceBundle fgResourceBundle;
/**
* @noreference This field is not intended to be referenced by clients.
*/
public CDTLogWriter cdtLog;
private volatile CProjectDescriptionManager fNewCProjectDescriptionManager;
private CoreModel fCoreModel;
private PDOMManager pdomManager;
private ITagService tagService = new TagService();
private CdtVarPathEntryVariableManager fPathEntryVariableManager;
private CBuildConfigurationManager buildConfigManager;
private final class NullConsole implements IConsole {
private ConsoleOutputStream nullStream = new ConsoleOutputStream() {
@Override
public void write(byte[] b) throws IOException {
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
}
@Override
public void write(int c) throws IOException {
}
};
@Override
public void start(IProject project) {
}
@Override
public ConsoleOutputStream getOutputStream() {
return nullStream;
}
@Override
public ConsoleOutputStream getInfoStream() {
return nullStream;
}
@Override
public ConsoleOutputStream getErrorStream() {
return nullStream;
}
}
// -------- static methods --------
static {
try {
fgResourceBundle = ResourceBundle.getBundle("org.eclipse.cdt.internal.core.CCorePluginResources"); //$NON-NLS-1$
} catch (MissingResourceException x) {
fgResourceBundle = null;
}
}
/**
* Returns the shared working copies currently registered for the default
* buffer factory.
*
* @since 5.1
*/
public static IWorkingCopy[] getSharedWorkingCopies() {
return CModelManager.getDefault().getSharedWorkingCopies(null);
}
public static String getResourceString(String key) {
try {
return fgResourceBundle.getString(key);
} catch (MissingResourceException e) {
return "!" + key + "!"; //$NON-NLS-1$ //$NON-NLS-2$
} catch (NullPointerException e) {
return "#" + key + "#"; //$NON-NLS-1$ //$NON-NLS-2$
}
}
public static IWorkspace getWorkspace() {
return ResourcesPlugin.getWorkspace();
}
public static String getFormattedString(String key, String arg) {
return MessageFormat.format(getResourceString(key), new Object[] { arg });
}
public static String getFormattedString(String key, String[] args) {
final Object[] objArgs = args;
return MessageFormat.format(getResourceString(key), objArgs);
}
public static ResourceBundle getResourceBundle() {
return fgResourceBundle;
}
public static IPositionTrackerManager getPositionTrackerManager() {
return PositionTrackerManager.getInstance();
}
public static CCorePlugin getDefault() {
return fgCPlugin;
}
/**
* @see Plugin#shutdown
*/
@Override
public void stop(BundleContext context) throws Exception {
try {
pdomManager.shutdown();
PositionTrackerManager.getInstance().uninstall();
// if (fDescriptorManager != null) {
// fDescriptorManager.shutdown();
// }
if (fCoreModel != null) {
fCoreModel.shutdown();
}
if (cdtLog != null) {
cdtLog.shutdown();
}
if (fPathEntryVariableManager != null) {
fPathEntryVariableManager.shutdown();
}
fNewCProjectDescriptionManager.shutdown();
ResourceLookup.shutdown();
buildConfigManager.dispose();
buildConfigManager = null;
savePluginPreferences();
} finally {
super.stop(context);
}
}
/**
* @see Plugin#startup
*/
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
// do harmless stuff first.
cdtLog = new CDTLogWriter(CCorePlugin.getDefault().getStateLocation().append(".log").toFile()); //$NON-NLS-1$
configurePluginDebugOptions();
PositionTrackerManager.getInstance().install();
ResourceLookup.startup();
ToolChainManager toolChainManager = new ToolChainManager();
context.registerService(IToolChainManager.class, toolChainManager, null);
buildConfigManager = new CBuildConfigurationManager();
context.registerService(ICBuildConfigurationManager.class, buildConfigManager, null);
// new project model needs to register the resource listener first.
CProjectDescriptionManager descManager = CProjectDescriptionManager.getInstance();
final Job post1 = descManager.startup();
fNewCProjectDescriptionManager = descManager;
fPathEntryVariableManager = new CdtVarPathEntryVariableManager();
fPathEntryVariableManager.startup();
fCoreModel = CoreModel.getDefault();
fCoreModel.startup();
pdomManager = new PDOMManager();
final Job post2 = pdomManager.startup();
// bug 186755, when started after the platform has been started the job
// manager
// is no longer suspended. So we have to start a job at the very end to
// make
// sure we don't trigger a concurrent plug-in activation from within the
// job.
post1.schedule();
post2.schedule();
}
/**
* TODO: Add all options here Returns a table of all known configurable
* options with their default values. These options allow to configure the
* behavior of the underlying components. The client may safely use the
* result as a template that they can modify and then pass to
* <code>setOptions</code>.
*
* Helper constants have been defined on CCorePlugin for each of the option
* ID and their possible constant values.
*
* Note: more options might be added in further releases.
*
* <pre>
* RECOGNIZED OPTIONS:
*
* CORE / Specify Default Source Encoding Format
* Get the encoding format for translated sources. This setting is read-only, it is equivalent
* to 'ResourcesPlugin.getEncoding()'.
* - option id: "org.eclipse.cdt.core.encoding"
* - possible values: { any of the supported encoding names}.
* - default: <platform default>
* </pre>
*
* @return a mutable map containing the default settings of all known
* options (key type: <code>String</code>; value type:
* <code>String</code>)
* @see #setOptions
*/
public static HashMap<String, String> getDefaultOptions() {
HashMap<String, String> defaultOptions = new HashMap<>(10);
// see #initializeDefaultPluginPreferences() for changing default
// settings
Preferences preferences = getDefault().getPluginPreferences();
HashSet<String> optionNames = CModelManager.OptionNames;
// get preferences set to their default
for (String propertyName : preferences.defaultPropertyNames()) {
if (optionNames.contains(propertyName))
defaultOptions.put(propertyName, preferences.getDefaultString(propertyName));
}
// get preferences not set to their default
for (String propertyName : preferences.propertyNames()) {
if (optionNames.contains(propertyName))
defaultOptions.put(propertyName, preferences.getDefaultString(propertyName));
}
// get encoding through resource plugin
defaultOptions.put(CORE_ENCODING, ResourcesPlugin.getEncoding());
return defaultOptions;
}
/**
* Helper method for returning one option value only. Equivalent to
* <code>(String)CCorePlugin.getOptions().get(optionName)</code> Note that
* it may answer <code>null</code> if this option does not exist.
* <p>
* For a complete description of the configurable options, see
* <code>getDefaultOptions</code>.
* </p>
*
* @param optionName
* the name of an option
* @return the String value of a given option
* @see CCorePlugin#getDefaultOptions
*/
public static String getOption(String optionName) {
if (CORE_ENCODING.equals(optionName)) {
return ResourcesPlugin.getEncoding();
}
if (CModelManager.OptionNames.contains(optionName)) {
Preferences preferences = getDefault().getPluginPreferences();
return preferences.getString(optionName).trim();
}
return null;
}
/**
* Returns the table of the current options. Initially, all options have
* their default values, and this method returns a table that includes all
* known options.
* <p>
* For a complete description of the configurable options, see
* <code>getDefaultOptions</code>.
* </p>
*
* @return table of current settings of all options (key type:
* <code>String</code>; value type: <code>String</code>)
* @see CCorePlugin#getDefaultOptions
*/
public static HashMap<String, String> getOptions() {
HashMap<String, String> options = new HashMap<>(10);
// see #initializeDefaultPluginPreferences() for changing default
// settings
Plugin plugin = getDefault();
if (plugin != null) {
Preferences preferences = plugin.getPluginPreferences();
HashSet<String> optionNames = CModelManager.OptionNames;
// get preferences set to their default
for (String propertyName : preferences.defaultPropertyNames()) {
if (optionNames.contains(propertyName)) {
options.put(propertyName, preferences.getDefaultString(propertyName));
}
}
// get preferences not set to their default
for (String propertyName : preferences.propertyNames()) {
if (optionNames.contains(propertyName)) {
options.put(propertyName, preferences.getString(propertyName).trim());
}
}
// get encoding through resource plugin
options.put(CORE_ENCODING, ResourcesPlugin.getEncoding());
}
return options;
}
/**
* Sets the current table of options. All and only the options explicitly
* included in the given table are remembered; all previous option settings
* are forgotten, including ones not explicitly mentioned.
* <p>
* For a complete description of the configurable options, see
* <code>getDefaultOptions</code>.
* </p>
*
* @param newOptions
* the new options (key type: <code>String</code>; value type:
* <code>String</code>), or <code>null</code> to reset all
* options to their default values
* @see CCorePlugin#getDefaultOptions
*/
public static void setOptions(HashMap<String, String> newOptions) {
// see #initializeDefaultPluginPreferences() for changing default
// settings
Preferences preferences = getDefault().getPluginPreferences();
if (newOptions == null) {
newOptions = getDefaultOptions();
}
for (String key : newOptions.keySet()) {
if (!CModelManager.OptionNames.contains(key))
continue; // unrecognized option
if (key.equals(CORE_ENCODING))
continue; // skipped, contributed by resource prefs
String value = newOptions.get(key);
preferences.setValue(key, value);
}
// persist options
getDefault().savePluginPreferences();
}
/**
* Create CDT console adapter for build console defined as an extension. See
* {@code org.eclipse.cdt.core.CBuildConsole} extension point. If the
* console class is instance of {@link ICConsole} it is initialized with
* context id, name and icon to be shown in the list of consoles in the
* Console view.
*
* @param extConsoleId
* - console id defined in the extension point.
* @param contextId
* - context menu id in the Console view. A caller needs to
* define a distinct one for own use.
* @param name
* - name of console to appear in the list of consoles in context
* menu in the Console view.
* @param iconUrl
* - a {@link URL} of the icon for the context menu of the
* Console view. The url is expected to point to an image in
* eclipse OSGi bundle. Here is an example how to retrieve URL:
* <br/>
* <code>
* URL iconUrl = CUIPlugin.getDefault().getBundle().getEntry("icons/obj16/flask.png");
* </code>
*
* @return CDT console adapter.
*
* @since 5.4
*/
public IConsole getConsole(String extConsoleId, String contextId, String name, URL iconUrl) {
try {
IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
.getExtensionPoint(CCorePlugin.PLUGIN_ID, "CBuildConsole"); //$NON-NLS-1$
if (extensionPoint != null) {
IExtension[] extensions = extensionPoint.getExtensions();
for (IExtension extension : extensions) {
IConfigurationElement[] configElements = extension.getConfigurationElements();
for (IConfigurationElement configElement : configElements) {
String consoleID = configElement.getAttribute("id"); //$NON-NLS-1$
if ((extConsoleId == null && consoleID == null)
|| (extConsoleId != null && extConsoleId.equals(consoleID))) {
IConsole console = (IConsole) configElement.createExecutableExtension("class"); //$NON-NLS-1$
if (console instanceof ICConsole) {
((ICConsole) console).init(contextId, name, iconUrl);
}
return console;
}
}
}
}
} catch (CoreException e) {
log(e);
}
return new NullConsole();
}
/**
* Create CDT console adapter. The adapter serves as a bridge between core
* plugin and UI console API in a way that a user can create a UI console
* from plugins having no dependencies to UI.
*
* @param id
* - id of the console specified in extension point to
* instantiate console adapter.
* @return CDT console adapter.
*/
public IConsole getConsole(String id) {
return getConsole(id, null, null, null);
}
/**
* Create CDT console adapter for build console. A new instance of class
* {@code org.eclipse.cdt.internal.ui.buildconsole.CBuildConsole} is created
* and initialized with the parameters.
*
* @param contextId
* - context menu id in the Console view. A caller needs to
* define a distinct one for own use.
* @param name
* - name of console to appear in the list of consoles in context
* menu in the Console view.
* @param iconUrl
* - a {@link URL} of the icon for the context menu of the
* Console view. The url is expected to point to an image in
* eclipse OSGi bundle. Here is an example how to retrieve URL:
* <br/>
* <code>
* URL iconUrl = CUIPlugin.getDefault().getBundle().getResource("icons/obj16/flask.png");
* </code> <br/>
* {@code iconUrl} can be <b>null</b>, in that case the default
* image is used. See
* {@code org.eclipse.cdt.internal.ui.buildconsole.BuildConsole(IBuildConsoleManager, String, String, URL)}
*
* @return CDT console adapter.
*
* @since 5.3
*/
public IConsole getBuildConsole(String contextId, String name, URL iconUrl) {
return getConsole(null, contextId, name, iconUrl);
}
/**
* Create CDT console adapter connected to the default build console.
*/
public IConsole getConsole() {
String consoleID = System.getProperty("org.eclipse.cdt.core.console"); //$NON-NLS-1$
return getConsole(consoleID);
}
/**
* @deprecated Use {@link #getDefaultBinaryParserExtensions(IProject)}
* instead.
*/
@Deprecated
public ICExtensionReference[] getBinaryParserExtensions(IProject project) throws CoreException {
ICExtensionReference ext[] = new ICExtensionReference[0];
if (project != null) {
try {
ICDescriptor cdesc = getCProjectDescription(project, false);
if (cdesc == null)
return ext;
ICExtensionReference[] cextensions = cdesc.get(BINARY_PARSER_UNIQ_ID, true);
if (cextensions != null && cextensions.length > 0)
ext = cextensions;
} catch (CoreException e) {
log(e);
}
}
return ext;
}
/**
* Returns the binary parser extensions for the default settings
* configuration.
*
* @since 5.2
*/
public ICConfigExtensionReference[] getDefaultBinaryParserExtensions(IProject project)
throws CoreException {
ICConfigExtensionReference ext[] = new ICConfigExtensionReference[0];
if (project != null) {
ICProjectDescription desc = CCorePlugin.getDefault().getProjectDescription(project, false);
if (desc != null) {
ICConfigurationDescription cfgDesc = desc.getDefaultSettingConfiguration();
if (cfgDesc != null) {
ext = cfgDesc.get(CCorePlugin.BINARY_PARSER_UNIQ_ID);
}
}
}
return ext;
}
/**
* @deprecated - use getBinaryParserExtensions(IProject project)
*/
@Deprecated
public IBinaryParser[] getBinaryParser(IProject project) throws CoreException {
IBinaryParser parsers[] = null;
if (project != null) {
try {
ICDescriptor cdesc = getCProjectDescription(project, false);
ICExtensionReference[] cextensions = cdesc.get(BINARY_PARSER_UNIQ_ID, true);
if (cextensions.length > 0) {
ArrayList<IBinaryParser> list = new ArrayList<>(cextensions.length);
for (ICExtensionReference ref : cextensions) {
IBinaryParser parser = null;
try {
parser = (IBinaryParser) ref.createExtension();
} catch (ClassCastException e) {
log(e); // wrong binary parser definition ?
}
if (parser != null) {
list.add(parser);
}
}
parsers = new IBinaryParser[list.size()];
list.toArray(parsers);
}
} catch (CoreException e) {
// ignore since we fall back to a default....
}
}
if (parsers == null) {
IBinaryParser parser = getDefaultBinaryParser();
if (parser != null) {
parsers = new IBinaryParser[] { parser };
}
}
return parsers;
}
public IBinaryParser getDefaultBinaryParser() throws CoreException {
IBinaryParser parser = null;
String id = getPluginPreferences().getDefaultString(PREF_BINARY_PARSER);
if (id == null || id.isEmpty()) {
id = DEFAULT_BINARY_PARSER_UNIQ_ID;
}
IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
.getExtensionPoint(CCorePlugin.PLUGIN_ID, BINARY_PARSER_SIMPLE_ID);
IExtension extension = extensionPoint.getExtension(id);
if (extension != null) {
IConfigurationElement element[] = extension.getConfigurationElements();
for (IConfigurationElement element2 : element) {
if (element2.getName().equalsIgnoreCase("cextension")) { //$NON-NLS-1$
parser = (IBinaryParser) element2.createExecutableExtension("run"); //$NON-NLS-1$
break;
}
}
} else {
IStatus s = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, -1,
CCorePlugin.getResourceString("CCorePlugin.exception.noBinaryFormat"), null); //$NON-NLS-1$
throw new CoreException(s);
}
return parser;
}
/**
* Returns the binary parser with the given id.
*
* @param id id of binary parser
* @return binary parser
* @throws CoreException
* @since 6.0
*/
public IBinaryParser getBinaryParser(String id) throws CoreException {
IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
.getExtensionPoint(CCorePlugin.PLUGIN_ID, BINARY_PARSER_SIMPLE_ID);
IExtension extension = extensionPoint.getExtension(id);
if (extension != null) {
IConfigurationElement element[] = extension.getConfigurationElements();
for (IConfigurationElement element2 : element) {
if (element2.getName().equalsIgnoreCase("cextension")) { //$NON-NLS-1$
return (IBinaryParser) element2.createExecutableExtension("run"); //$NON-NLS-1$
}
}
} else {
IStatus s = new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, -1,
CCorePlugin.getResourceString("CCorePlugin.exception.noBinaryFormat"), null); //$NON-NLS-1$
throw new CoreException(s);
}
return null;
}
public CoreModel getCoreModel() {
return fCoreModel;
}
public static IIndexManager getIndexManager() {
return getDefault().pdomManager;
}
/**
* @since 5.5
*/
public static ITagService getTagService() {
return getDefault().tagService;
}
public IPathEntryVariableManager getPathEntryVariableManager() {
return fPathEntryVariableManager;
}
/**
* @deprecated use {@link #getProjectDescription(IProject, boolean)} instead
*/
@Deprecated
public ICDescriptor getCProjectDescription(IProject project) throws CoreException {
return fNewCProjectDescriptionManager.getDescriptorManager().getDescriptor(project);
}
/**
* Please use {@link #getProjectDescription(IProject, boolean)} to fetch the
* ICProjectDescription for the project. And use
* {@link ICProjectDescription#getConfigurations()} to get an array of
* ICConfigurationDescriptions, which have similar API to ICDescriptor,
* allowing you to store settings and configure extensions at the
* Configuration level rather than at the project level.
*
* @param project
* @param create
* @return ICDescriptor or <b>null</b> if <b>create</b> is <b>false</b> and
* no .cdtproject file exists on disk.
* @throws CoreException
* @deprecated
*/
@Deprecated
public ICDescriptor getCProjectDescription(IProject project, boolean create) throws CoreException {
return fNewCProjectDescriptionManager.getDescriptorManager().getDescriptor(project, create);
}
public void mapCProjectOwner(IProject project, String id, boolean override) throws CoreException {
try {
if (!override) {
fNewCProjectDescriptionManager.getDescriptorManager().configure(project, id);
} else {
fNewCProjectDescriptionManager.getDescriptorManager().convert(project, id);
}
} catch (Exception e) {
throw ExceptionFactory.createCoreException(e);
}
}
/**
* @deprecated Settings should be set per ICConfigurationDescription rather
* than global to the project. Please use
* {@link #getProjectDescription(IProject, boolean)} to fetch
* the ICProjectDescription for the project. And use
* {@link ICProjectDescription#getConfigurations()} to get an
* array of ICConfigurationDescriptions, which have similar API
* to ICDescriptor, allowing you to store settings and configure
* extensions at the Configuration level rather than at the
* project level.
*/
@Deprecated
public ICDescriptorManager getCDescriptorManager() {
return fNewCProjectDescriptionManager.getDescriptorManager();
}
/**
* Creates a C project resource given the project handle and description.
*
* @param description
* the project description to create a project resource for
* @param projectHandle
* the project handle to create a project resource for
* @param monitor
* the progress monitor to show visual progress with
* @param projectID
* required for mapping the project to an owner
*
* @exception CoreException
* if the operation fails
* @exception OperationCanceledException
* if the operation is canceled
*/
public IProject createCProject(final IProjectDescription description, final IProject projectHandle,
IProgressMonitor monitor, final String projectID)
throws CoreException, OperationCanceledException {
getWorkspace().run(new IWorkspaceRunnable() {
@Override
public void run(IProgressMonitor monitor) throws CoreException {
try {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
monitor.beginTask("Creating C Project...", 3); //$NON-NLS-1$
if (!projectHandle.exists()) {
projectHandle.create(description, new SubProgressMonitor(monitor, 1));
}
if (monitor.isCanceled()) {
throw new OperationCanceledException();
}
// Open first.
projectHandle.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(monitor, 1));
mapCProjectOwner(projectHandle, projectID, false);
// Add C Nature ... does not add duplicates
CProjectNature.addCNature(projectHandle, new SubProgressMonitor(monitor, 1));
} finally {
monitor.done();
}
}
}, getWorkspace().getRoot(), 0, monitor);
return projectHandle;
}
public IProject createCDTProject(final IProjectDescription description, final IProject projectHandle,
IProgressMonitor monitor) throws CoreException, OperationCanceledException {
return createCDTProject(description, projectHandle, null, monitor);
}
public IProject createCDTProject(final IProjectDescription description, final IProject projectHandle,
final String bsId, IProgressMonitor monitor) throws CoreException, OperationCanceledException {
getWorkspace().run(new IWorkspaceRunnable() {
@Override
public void run(IProgressMonitor monitor) throws CoreException {
try {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
monitor.beginTask("Creating C Project...", 3); //$NON-NLS-1$
if (!projectHandle.exists()) {
projectHandle.create(description, new SubProgressMonitor(monitor, 1));
}
if (monitor.isCanceled()) {
throw new OperationCanceledException();
}
// Open first.
projectHandle.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(monitor, 1));
// mapCProjectOwner(projectHandle, projectID, false);
// Add C Nature ... does not add duplicates
CProjectNature.addCNature(projectHandle, new SubProgressMonitor(monitor, 1));
if (bsId != null) {
ICProjectDescription projDes = createProjectDescription(projectHandle, true);
ICConfigurationDescription cfgs[] = projDes.getConfigurations();
ICConfigurationDescription cfg = null;
for (ICConfigurationDescription cfg2 : cfgs) {
if (bsId.equals(cfg2.getBuildSystemId())) {
cfg = cfg2;
break;
}
}
if (cfg == null) {
ICConfigurationDescription prefCfg = getPreferenceConfiguration(bsId);
if (prefCfg != null) {
cfg = projDes.createConfiguration(CDataUtil.genId(prefCfg.getId()),
prefCfg.getName(), prefCfg);
}
}
if (cfg != null) {
setProjectDescription(projectHandle, projDes);
}
}
} finally {
monitor.done();
}
}
}, getWorkspace().getRoot(), 0, monitor);
return projectHandle;
}
/**
* Method convertProjectFromCtoCC converts a C Project to a C++ Project The
* newProject MUST, not be null, already have a C Nature && must NOT already
* have a C++ Nature
*
* @param projectHandle
* @param monitor
* @throws CoreException
*/
public void convertProjectFromCtoCC(IProject projectHandle, IProgressMonitor monitor)
throws CoreException {
if ((projectHandle != null) && projectHandle.hasNature(CProjectNature.C_NATURE_ID)
&& !projectHandle.hasNature(CCProjectNature.CC_NATURE_ID)) {
// Add C++ Nature ... does not add duplicates
CCProjectNature.addCCNature(projectHandle, monitor);
}
}
/**
* Method to convert a project to a C nature All checks should have been
* done externally (as in the Conversion Wizards). This method blindly does
* the conversion.
*/
public void convertProjectToC(IProject projectHandle, IProgressMonitor monitor, String projectID)
throws CoreException {
if ((projectHandle == null) || (monitor == null) || (projectID == null)) {
return;
}
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IProjectDescription description = workspace.newProjectDescription(projectHandle.getName());
description.setLocation(projectHandle.getFullPath());
createCProject(description, projectHandle, monitor, projectID);
}
public void convertProjectToNewC(IProject projectHandle, String bsId, IProgressMonitor monitor)
throws CoreException {
if ((projectHandle == null) || (monitor == null) || (bsId == null)) {
throw new NullPointerException();
}
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IProjectDescription description = workspace.newProjectDescription(projectHandle.getName());
description.setLocation(projectHandle.getFullPath());
createCDTProject(description, projectHandle, bsId, monitor);
}
/**
* Method to convert a project to a C++ nature
*/
public void convertProjectToCC(IProject projectHandle, IProgressMonitor monitor, String projectID)
throws CoreException {
if ((projectHandle == null) || (monitor == null) || (projectID == null)) {
return;
}
createCProject(projectHandle.getDescription(), projectHandle, monitor, projectID);
// now add C++ nature
convertProjectFromCtoCC(projectHandle, monitor);
}
public void convertProjectToNewCC(IProject projectHandle, String bsId, IProgressMonitor monitor)
throws CoreException {
if ((projectHandle == null) || (monitor == null) || (bsId == null)) {
throw new NullPointerException();
}
createCDTProject(projectHandle.getDescription(), projectHandle, bsId, monitor);
// now add C++ nature
convertProjectFromCtoCC(projectHandle, monitor);
}
/**
* Get the IProcessList contributed interface for the platform.
*
* @return IProcessList
*/
public IProcessList getProcessList() throws CoreException {
IExtensionPoint extension = Platform.getExtensionRegistry().getExtensionPoint(CCorePlugin.PLUGIN_ID,
"ProcessList"); //$NON-NLS-1$
if (extension != null) {
IExtension[] extensions = extension.getExtensions();
IConfigurationElement defaultContributor = null;
for (IExtension extension2 : extensions) {
IConfigurationElement[] configElements = extension2.getConfigurationElements();
for (IConfigurationElement configElement : configElements) {
if (configElement.getName().equals("processList")) { //$NON-NLS-1$
String platform = configElement.getAttribute("platform"); //$NON-NLS-1$
if (platform == null) { // first contributor found with
// not platform will be default.
if (defaultContributor == null) {
defaultContributor = configElement;
}
} else if (platform.equals(Platform.getOS())) {
// found explicit contributor for this platform.
return (IProcessList) configElement.createExecutableExtension("class"); //$NON-NLS-1$
}
}
}
}
if (defaultContributor != null) {
return (IProcessList) defaultContributor.createExecutableExtension("class"); //$NON-NLS-1$
}
}
return null;
}
/**
* @deprecated since CDT 6.1. Use
* {@link ErrorParserManager#getErrorParserAvailableIds()}
* instead
* @return array of error parsers ids
*/
@Deprecated
public String[] getAllErrorParsersIDs() {
ErrorParserExtensionManager.loadErrorParserExtensions();
return ErrorParserExtensionManager
.getErrorParserAvailableIdsInContext(ErrorParserManager.BUILD_CONTEXT);
}
/**
* @deprecated since CDT 6.1. Use
* {@link ErrorParserManager#getErrorParserCopy(String)} instead
* @param id
* - id of error parser
* @return array of error parsers
*/
@Deprecated
public IErrorParser[] getErrorParser(String id) {
ErrorParserExtensionManager.loadErrorParserExtensions();
IErrorParser errorParser = ErrorParserExtensionManager.getErrorParserInternal(id);
if (errorParser == null) {
return new IErrorParser[] {};
} else {
return new IErrorParser[] { errorParser };
}
}
public IScannerInfoProvider getScannerInfoProvider(IProject project) {
IScannerInfoProvider provider = null;
try {
// Look up in session property for previously created provider
QualifiedName scannerInfoProviderName = new QualifiedName(PLUGIN_ID, SCANNER_INFO_PROVIDER2_NAME);
provider = (IScannerInfoProvider) project.getSessionProperty(scannerInfoProviderName);
if (provider != null)
return provider;
// Next search the extension registry to see if a provider is
// registered with a build command
provider = getExtensionScannerInfoProvider2(project);
// If we are new style build configurations, get the provider there
IBuildConfiguration activeConfig = project.getActiveBuildConfig();
ICBuildConfiguration cconfig = activeConfig.getAdapter(ICBuildConfiguration.class);
if (cconfig != null) {
return cconfig;
}
// Regular usage is where Language Settings Providers are employed
if (provider == null && ScannerDiscoveryLegacySupport
.isLanguageSettingsProvidersFunctionalityEnabled(project)) {
provider = new LanguageSettingsScannerInfoProvider();
}
// Fall back to the MBS legacy
if (provider == null)
provider = fNewCProjectDescriptionManager.getScannerInfoProviderProxy(project);
project.setSessionProperty(scannerInfoProviderName, provider);
} catch (CoreException e) {
// Bug 313725: When project is being closed, don't report an error.
if (!project.isOpen())
return null;
log(e);
}
return provider;
}
/**
* Clears cached scanner info provider for the given project so that the
* next call to {@link #getScannerInfoProvider(IProject)} would return an up
* to date scanner info provider.
*
* @noreference This method is not intended to be referenced by clients.
*/
public void resetCachedScannerInfoProvider(IProject project) {
try {
QualifiedName scannerInfoProviderName = new QualifiedName(PLUGIN_ID, SCANNER_INFO_PROVIDER2_NAME);
project.setSessionProperty(scannerInfoProviderName, null);
} catch (CoreException e) {
if (project.isOpen()) {
log(e);
}
}
}
/**
* Find {@link IScannerInfoProvider} registered as extension via extension
* point org.eclipse.cdt.core.ScannerInfoProvider2.
*/
private IScannerInfoProvider getExtensionScannerInfoProvider2(IProject project) throws CoreException {
IScannerInfoProvider provider = null;
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint point = registry.getExtensionPoint(SCANNER_INFO_PROVIDER2);
if (point != null) {
IExtension[] exts = point.getExtensions();
for (IExtension ext : exts) {
IConfigurationElement[] elems = ext.getConfigurationElements();
for (IConfigurationElement elem : elems) {
String builder = elem.getAttribute("builder"); //$NON-NLS-1$
if (builder != null) {
IProjectDescription desc = project.getDescription();
ICommand[] commands = desc.getBuildSpec();
for (ICommand command : commands)
if (builder.equals(command.getBuilderName()))
provider = (IScannerInfoProvider) elem.createExecutableExtension("class"); //$NON-NLS-1$
}
}
}
}
return provider;
}
/**
* Helper function, returning the content type for a filename Same as:
*
* <pre>
* getContentType(null, filename)
* </pre>
*
* @param filename
* @return the content type found, or <code>null</code>
*/
public static IContentType getContentType(String filename) {
return CContentTypes.getContentType(null, filename);
}
/**
* Returns the content type for a filename. The method respects project
* specific content type definitions. The lookup prefers case- sensitive
* matches over the others.
*
* @param project
* a project with possible project specific settings. Can be
* <code>null</code>
* @param filename
* a filename to compute the content type for
* @return the content type found or <code>null</code>
*/
public static IContentType getContentType(IProject project, String filename) {
return CContentTypes.getContentType(project, filename);
}
/**
* Tests whether the given project uses its project specific content types.
*/
public static boolean usesProjectSpecificContentTypes(IProject project) {
return CContentTypes.usesProjectSpecificContentTypes(project);
}
/**
* Enables or disables the project specific content types.
*/
public static void setUseProjectSpecificContentTypes(IProject project, boolean val) {
CContentTypes.setUseProjectSpecificContentTypes(project, val);
}
private static final String MODEL = CCorePlugin.PLUGIN_ID + "/debug/model"; //$NON-NLS-1$
private static final String PARSER = CCorePlugin.PLUGIN_ID + "/debug/parser"; //$NON-NLS-1$
private static final String PARSER_EXCEPTIONS = CCorePlugin.PLUGIN_ID + "/debug/parser/exceptions"; //$NON-NLS-1$
private static final String SCANNER = CCorePlugin.PLUGIN_ID + "/debug/scanner"; //$NON-NLS-1$
private static final String DELTA = CCorePlugin.PLUGIN_ID + "/debug/deltaprocessor"; //$NON-NLS-1$
/**
* Configure the plug-in with respect to option settings defined in
* ".options" file
*/
public void configurePluginDebugOptions() {
if (CCorePlugin.getDefault().isDebugging()) {
String option = Platform.getDebugOption(PARSER);
if (option != null)
Util.VERBOSE_PARSER = option.equalsIgnoreCase("true"); //$NON-NLS-1$
option = Platform.getDebugOption(PARSER_EXCEPTIONS);
if (option != null)
Util.PARSER_EXCEPTIONS = option.equalsIgnoreCase("true"); //$NON-NLS-1$
option = Platform.getDebugOption(SCANNER);
if (option != null)
Util.VERBOSE_SCANNER = option.equalsIgnoreCase("true"); //$NON-NLS-1$
option = Platform.getDebugOption(MODEL);
if (option != null)
Util.VERBOSE_MODEL = option.equalsIgnoreCase("true"); //$NON-NLS-1$
option = Platform.getDebugOption(DELTA);
if (option != null)
Util.VERBOSE_DELTA = option.equalsIgnoreCase("true"); //$NON-NLS-1$
}
}
// Preference to turn on/off the use of structural parse mode to build the
// CModel.
public void setStructuralParseMode(boolean useNewParser) {
getPluginPreferences().setValue(PREF_USE_STRUCTURAL_PARSE_MODE, useNewParser);
savePluginPreferences();
}
public boolean useStructuralParseMode() {
return getPluginPreferences().getBoolean(PREF_USE_STRUCTURAL_PARSE_MODE);
}
/**
* @deprecated use {@link ITranslationUnit} or {@link ILanguage} to
* construct ASTs, instead.
*/
@Deprecated
public org.eclipse.cdt.core.dom.CDOM getDOM() {
return org.eclipse.cdt.core.dom.CDOM.getInstance();
}
public ICdtVariableManager getCdtVariableManager() {
return CdtVariableManager.getDefault();
}
public IEnvironmentVariableManager getBuildEnvironmentManager() {
return EnvironmentVariableManager.getDefault();
}
public ICConfigurationDescription getPreferenceConfiguration(String buildSystemId) throws CoreException {
return fNewCProjectDescriptionManager.getPreferenceConfiguration(buildSystemId);
}
public ICConfigurationDescription getPreferenceConfiguration(String buildSystemId, boolean write)
throws CoreException {
return fNewCProjectDescriptionManager.getPreferenceConfiguration(buildSystemId, write);
}
public void setPreferenceConfiguration(String buildSystemId, ICConfigurationDescription des)
throws CoreException {
fNewCProjectDescriptionManager.setPreferenceConfiguration(buildSystemId, des);
}
/**
* Equivalent to
* <code>createProjectDescription(IProject, boolean, false)</code>.
*
* @see #createProjectDescription(IProject, boolean, boolean)
*/
public ICProjectDescription createProjectDescription(IProject project, boolean loadIfExists)
throws CoreException {
return fNewCProjectDescriptionManager.createProjectDescription(project, loadIfExists);
}
/**
* Creates and returns a writable project description.
*
* @param project
* project for which the project description is requested
* @param loadIfExists
* if true the method first tries to load and return the project
* description from the settings file (.cproject), if false, the
* stored settings are ignored and the new (empty) project
* description is created
* @param creating
* if true the created project description will be contain the
* true "isCdtProjectCreating" state. <br>
* NOTE: in case the project already contains the project
* description AND its "isCdtProjectCreating" is false the
* resulting description will be created with the false
* "isCdtProjectCreating" state.
*
* <br>
* NOTE: changes made to the returned project description will
* not be applied until the
* {@link #setProjectDescription(IProject, ICProjectDescription)}
* is called.
* @return {@link ICProjectDescription}
* @throws CoreException
*/
public ICProjectDescription createProjectDescription(IProject project, boolean loadIfExists,
boolean creating) throws CoreException {
return fNewCProjectDescriptionManager.createProjectDescription(project, loadIfExists, creating);
}
/**
* Returns the project description associated with this project or null if
* the project does not contain the CDT data associated with it.
*
* This is a convenience method fully equivalent to
* getProjectDescription(project, true) see
* {@link #getProjectDescription(IProject, boolean)} for more detail.
*
* @param project
* @return a writable copy of the ICProjectDescription or null if the
* project does not contain the CDT data associated with it. <br>
* Note: changes to the project description will not be
* reflected/used by the core until the
* {@link #setProjectDescription(IProject, ICProjectDescription)} is
* called.
*
* @see #getProjectDescription(IProject, boolean)
*/
public ICProjectDescription getProjectDescription(IProject project) {
return fNewCProjectDescriptionManager.getProjectDescription(project);
}
/**
* Called to save/apply the project description. The method should be called
* to apply changes made to the project description returned by the
* {@link #getProjectDescription(IProject, boolean)} or
* {@link #createProjectDescription(IProject, boolean)}
*
* @param project
* @param des
* @throws CoreException
*
* @see #getProjectDescription(IProject, boolean)
* @see #createProjectDescription(IProject, boolean)
*/
public void setProjectDescription(IProject project, ICProjectDescription des) throws CoreException {
fNewCProjectDescriptionManager.setProjectDescription(project, des);
}
public void setProjectDescription(IProject project, ICProjectDescription des, boolean force,
IProgressMonitor monitor) throws CoreException {
fNewCProjectDescriptionManager.setProjectDescription(project, des, force, monitor);
}
/**
* Returns the project description associated with this project or null if
* the project does not contain the CDT data associated with it.
*
* @param project
* project for which the description is requested
* @param write
* if true, the writable description copy is returned. If false
* the cached read-only description is returned.
*
* <br>
* CDT core maintains the cached project description settings. If
* only read access is needed to description, then the read-only
* project description should be obtained. This description
* always operates with cached data and thus it is better to use
* it for performance reasons. All set* calls to the read-only
* description result in the {@link WriteAccessException}.
*
* When the writable description is requested, the description
* copy is created. Changes to this description will not be
* reflected/used by the core and the Build System until the
* {@link #setProjectDescription(IProject, ICProjectDescription)}
* is called.
*
* Each getProjectDescription(project, true) returns a new copy
* of the project description.
*
* The writable description uses the cached data until the first
* set call after that the description communicates directly to
* the Build System i.e. the implementer of the
* org.eclipse.cdt.core.CConfigurationDataProvider extension This
* ensures the Core<->Build System settings integrity.
*
* @return {@link ICProjectDescription} or null if the project does not
* contain the CDT data associated with it.
*/
public ICProjectDescription getProjectDescription(IProject project, boolean write) {
return fNewCProjectDescriptionManager.getProjectDescription(project, write);
}
/**
* Forces the cached data of the specified projects to be re-calculated.
*
* @param projects
* if <code>null</code>, all projects within the workspace are
* updated
* @param monitor
* @throws CoreException
*/
public void updateProjectDescriptions(IProject projects[], IProgressMonitor monitor)
throws CoreException {
fNewCProjectDescriptionManager.updateProjectDescriptions(projects, monitor);
}
/**
* Answers whether the given project is a new-style project, i.e.
* CConfigurationDataProvider-driven.
*/
public boolean isNewStyleProject(IProject project) {
return fNewCProjectDescriptionManager.isNewStyleProject(project);
}
/**
* Answers whether the given project is a new-style project, i.e.
* CConfigurationDataProvider-driven
*/
public boolean isNewStyleProject(ICProjectDescription des) {
return fNewCProjectDescriptionManager.isNewStyleProject(des);
}
public ICProjectDescriptionManager getProjectDescriptionManager() {
return fNewCProjectDescriptionManager;
}
/**
* @return editable User-variable's supplier
*/
public static IUserVarSupplier getUserVarSupplier() {
return UserVarSupplier.getInstance();
}
// NON-API
/**
* @noreference This constructor is not intended to be referenced by
* clients.
*/
public CCorePlugin() {
super();
fgCPlugin = this;
}
/**
* @noreference This method is not intended to be referenced by clients.
*/
public static void log(String e) {
log(createStatus(e));
}
/**
* Prints a message in the log
*
* @param severity
* - desired severity of the message in the log, one of
* {@link IStatus#INFO}, {@link IStatus#WARNING} or
* {@link IStatus#ERROR}
* @param msg
* - message
*
* @since 5.5
* @noreference This method is not intended to be referenced by clients.
*/
public static void log(int severity, String msg) {
log(new Status(severity, PLUGIN_ID, msg));
}
/**
* Prints a message in the log accompanied by stack trace
*
* @param severity
* - desired severity of the message in the log, one of
* {@link IStatus#INFO}, {@link IStatus#WARNING} or
* {@link IStatus#ERROR}
* @param msg
* - message
*
* @since 5.5
* @noreference This method is not intended to be referenced by clients.
*/
public static void logStackTrace(int severity, String msg) {
log(new Status(severity, PLUGIN_ID, msg, new Exception()));
}
/**
* @noreference This method is not intended to be referenced by clients.
*/
public static void log(Throwable e) {
if (e instanceof CoreException) {
log(((CoreException) e).getStatus());
} else {
String msg = e.getMessage();
if (msg == null) {
log("Error", e); //$NON-NLS-1$
} else {
log("Error: " + msg, e); //$NON-NLS-1$
}
}
}
/**
* @noreference This method is not intended to be referenced by clients.
*/
public static void log(String message, Throwable e) {
Throwable nestedException;
if (e instanceof CModelException
&& (nestedException = ((CModelException) e).getException()) != null) {
e = nestedException;
}
log(createStatus(message, e));
}
/**
* @noreference This method is not intended to be referenced by clients.
*/
public static IStatus createStatus(String msg) {
return createStatus(msg, null);
}
/**
* @noreference This method is not intended to be referenced by clients.
*/
public static IStatus createStatus(String msg, Throwable e) {
return new Status(IStatus.ERROR, PLUGIN_ID, msg, e);
}
/**
* @noreference This method is not intended to be referenced by clients.
*/
public static void log(IStatus status) {
getDefault().getLog().log(status);
}
/**
* @deprecated use getIndexManager().
* @noreference This method is not intended to be referenced by clients.
*/
@Deprecated
public static IPDOMManager getPDOMManager() {
return getDefault().pdomManager;
}
/**
* Returns the preference controlling whether source roots are shown at the
* top of projects or embedded within the resource tree of projects when
* they are not top level folders.
*
* @return boolean preference value
* @since 5.2
*/
public static boolean showSourceRootsAtTopOfProject() {
return InstanceScope.INSTANCE.getNode(PLUGIN_ID)
.getBoolean(CCorePreferenceConstants.SHOW_SOURCE_ROOTS_AT_TOP_LEVEL_OF_PROJECT, true);
}
/**
* Return the given OSGi service.
*
* @param service service class
* @return service
* @since 6.0
*/
public static <T> T getService(Class<T> service) {
BundleContext context = fgCPlugin.getBundle().getBundleContext();
ServiceReference<T> ref = context.getServiceReference(service);
return ref != null ? context.getService(ref) : null;
}
}