From 005b82195be5d19938a6b59548d65cc7c429a044 Mon Sep 17 00:00:00 2001 From: Martin Weber <fifteenknots505@gmail.com> Date: Wed, 10 Jun 2020 21:38:33 +0200 Subject: [PATCH] Bug 559674: Integrate new indexer support into CDT build Change-Id: Ie07e6283f8285e56b7f74f29a8db1cbe222e0304 Signed-off-by: Martin Weber <fifteenknots505@gmail.com> --- .../META-INF/MANIFEST.MF | 3 +- .../internal/CMakeBuildConfiguration.java | 173 ++++- cmake/aggregator/CDT devel.launch | 671 ++++++++++++++++++ .../org.eclipse.cdt.cmake.is.core/plugin.xml | 7 - .../is/core/CompileCommandsJsonParser.java | 121 ++-- .../cmake/is/core/IIndexerInfoConsumer.java | 31 +- .../cdt/cmake/is/core/ParseRequest.java | 76 ++ .../builtins/CompilerBuiltinsDetector.java | 21 +- .../is/core/internal/messages.properties | 2 +- 9 files changed, 964 insertions(+), 141 deletions(-) create mode 100644 cmake/aggregator/CDT devel.launch create mode 100644 cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/ParseRequest.java diff --git a/build/org.eclipse.cdt.cmake.core/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.cmake.core/META-INF/MANIFEST.MF index cc83607a7c8..28011f0ea86 100644 --- a/build/org.eclipse.cdt.cmake.core/META-INF/MANIFEST.MF +++ b/build/org.eclipse.cdt.cmake.core/META-INF/MANIFEST.MF @@ -11,7 +11,8 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.launchbar.core;bundle-version="2.0.0", org.eclipse.cdt.core;bundle-version="5.12.0", org.eclipse.tools.templates.freemarker;bundle-version="1.0.0";visibility:=reexport, - com.google.gson + com.google.gson, + org.eclipse.cdt.cmake.is.core Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Export-Package: org.eclipse.cdt.cmake.core, diff --git a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java index 5e89c87c2f5..1686b778fbd 100644 --- a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java +++ b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java @@ -11,7 +11,6 @@ package org.eclipse.cdt.cmake.core.internal; import java.io.File; -import java.io.FileReader; import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Files; @@ -23,9 +22,15 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; import org.eclipse.cdt.cmake.core.ICMakeToolChainFile; import org.eclipse.cdt.cmake.core.ICMakeToolChainManager; +import org.eclipse.cdt.cmake.is.core.CompileCommandsJsonParser; +import org.eclipse.cdt.cmake.is.core.IIndexerInfoConsumer; +import org.eclipse.cdt.cmake.is.core.ParseRequest; +import org.eclipse.cdt.core.CommandLauncherManager; import org.eclipse.cdt.core.ConsoleOutputStream; import org.eclipse.cdt.core.ErrorParserManager; import org.eclipse.cdt.core.IConsoleParser; @@ -34,17 +39,20 @@ import org.eclipse.cdt.core.build.IToolChain; import org.eclipse.cdt.core.envvar.EnvironmentVariable; import org.eclipse.cdt.core.envvar.IEnvironmentVariable; import org.eclipse.cdt.core.model.ICModelMarker; +import org.eclipse.cdt.core.parser.ExtendedScannerInfo; +import org.eclipse.cdt.core.parser.IScannerInfo; import org.eclipse.cdt.core.resources.IConsole; import org.eclipse.core.resources.IBuildConfiguration; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.jobs.Job; -import com.google.gson.Gson; - public class CMakeBuildConfiguration extends CBuildConfiguration { public static final String CMAKE_GENERATOR = "cmake.generator"; //$NON-NLS-1$ @@ -54,6 +62,7 @@ public class CMakeBuildConfiguration extends CBuildConfiguration { public static final String CLEAN_COMMAND = "cmake.command.clean"; //$NON-NLS-1$ private ICMakeToolChainFile toolChainFile; + private Map<IResource, IScannerInfo> infoPerResource; public CMakeBuildConfiguration(IBuildConfiguration config, String name) throws CoreException { super(config, name); @@ -95,6 +104,7 @@ public class CMakeBuildConfiguration extends CBuildConfiguration { } project.deleteMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE); + infoPerResource = new HashMap<>(); ConsoleOutputStream outStream = console.getOutputStream(); @@ -222,8 +232,10 @@ public class CMakeBuildConfiguration extends CBuildConfiguration { project.refreshLocal(IResource.DEPTH_INFINITE, monitor); - // Load compile_commands.json file - processCompileCommandsFile(monitor); + // parse compile_commands.json file + // built-ins detection output goes to the build console, if the user requested + // output + processCompileCommandsFile(console, monitor); outStream.write(String.format(Messages.CMakeBuildConfiguration_BuildingComplete, epm.getErrorCount(), epm.getWarningCount(), buildDir.toString())); @@ -290,38 +302,22 @@ public class CMakeBuildConfiguration extends CBuildConfiguration { } } - private void processCompileCommandsFile(IProgressMonitor monitor) throws CoreException { - IProject project = getProject(); - Path commandsFile = getBuildDirectory().resolve("compile_commands.json"); //$NON-NLS-1$ - if (Files.exists(commandsFile)) { - List<Job> jobsList = new ArrayList<>(); - monitor.setTaskName(Messages.CMakeBuildConfiguration_ProcCompJson); - try (FileReader reader = new FileReader(commandsFile.toFile())) { - Gson gson = new Gson(); - CompileCommand[] commands = gson.fromJson(reader, CompileCommand[].class); - Map<String, CompileCommand> dedupedCmds = new HashMap<>(); - for (CompileCommand command : commands) { - dedupedCmds.put(command.getFile(), command); - } - for (CompileCommand command : dedupedCmds.values()) { - processLine(command.getCommand(), jobsList); - } - for (Job j : jobsList) { - try { - j.join(); - } catch (InterruptedException e) { - // ignore - } - } - shutdown(); - } catch (IOException e) { - throw new CoreException(Activator.errorStatus( - String.format(Messages.CMakeBuildConfiguration_ProcCompCmds, project.getName()), e)); - } - } + /** + * @param console the console to print the compiler output during built-ins + * detection to or <code>null</code> if no separate console is to + * be allocated. Ignored if workspace preferences indicate that + * no console output is wanted. + * @param monitor the job's progress monitor + */ + private void processCompileCommandsFile(IConsole console, IProgressMonitor monitor) throws CoreException { + CompileCommandsJsonParser parser = new CompileCommandsJsonParser( + new ParseRequest(this, new CMakeIndexerInfoConsumer(this::setScannerInformation), + CommandLauncherManager.getInstance().getCommandLauncher(this), console)); + parser.parse(monitor); } - /** Recursively removes any files and directories found in the specified Path. + /** + * Recursively removes any files and directories found below the specified Path. */ private static void cleanDirectory(Path dir) throws IOException { SimpleFileVisitor<Path> deltor = new SimpleFileVisitor<Path>() { @@ -351,4 +347,111 @@ public class CMakeBuildConfiguration extends CBuildConfiguration { cleanDirectory(buildDir); // TODO: not a directory should we do something? } + + /** + * Overridden since the ScannerInfoCache mechanism does not satisfy our needs. + */ + // interface IScannerInfoProvider + @Override + public IScannerInfo getScannerInformation(IResource resource) { + if (infoPerResource == null) { + // no build was run yet, nothing detected + infoPerResource = new HashMap<>(); + try { + processCompileCommandsFile(null, new NullProgressMonitor()); + } catch (CoreException e) { + Activator.log(e); + } + } + return infoPerResource.get(resource); + } + + private void setScannerInformation(Map<IResource, IScannerInfo> infoPerResource) { + this.infoPerResource = infoPerResource; + } + + private static class CMakeIndexerInfoConsumer implements IIndexerInfoConsumer { + /** + * gathered IScannerInfo objects or <code>null</code> if no new IScannerInfo was + * received + */ + private Map<IResource, IScannerInfo> infoPerResource = new HashMap<>(); + private boolean haveUpdates; + private final Consumer<Map<IResource, IScannerInfo>> resultSetter; + + /** + * @param resultSetter receives the all scanner information when processing is + * finished + */ + public CMakeIndexerInfoConsumer(Consumer<Map<IResource, IScannerInfo>> resultSetter) { + this.resultSetter = Objects.requireNonNull(resultSetter); + } + + @Override + public void acceptSourceFileInfo(String sourceFileName, List<String> systemIncludePaths, + Map<String, String> definedSymbols, List<String> includePaths) { + IFile file = getFileForCMakePath(sourceFileName); + if (file != null) { + ExtendedScannerInfo info = new ExtendedScannerInfo(definedSymbols, + systemIncludePaths.stream().toArray(String[]::new), null, null, + includePaths.stream().toArray(String[]::new)); + infoPerResource.put(file, info); + haveUpdates = true; + } + } + + /** + * Gets an IFile object that corresponds to the source file name given in CMake + * notation. + * + * @param sourceFileName the name of the source file, in CMake notation. Note + * that on windows, CMake writes filenames with forward + * slashes (/) such as {@code H://path//to//source.c}. + * @return a IFile object or <code>null</code> + */ + private IFile getFileForCMakePath(String sourceFileName) { + org.eclipse.core.runtime.Path path = new org.eclipse.core.runtime.Path(sourceFileName); + IFile file = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path); + // TODO maybe we need to introduce a strategy here to get the workbench resource + // Possible build scenarios: + // 1) linux native: should be OK as is + // 2) linux host, building in container: should be OK as is + // 3) windows native: Path.fromOSString()? + // 4) windows host, building in linux container: ??? needs testing on windows + return file; + } + + @Override + public void shutdown() { + if (haveUpdates) { + // we received updates + resultSetter.accept(infoPerResource); + infoPerResource = null; + haveUpdates = false; + } + } + } + + /** Overwritten since we do not parse console output to get scanner information. + */ + // interface IConsoleParser2 + @Override + public boolean processLine(String line) { + return true; + } + + /** Overwritten since we do not parse console output to get scanner information. + */ + // interface IConsoleParser2 + @Override + public boolean processLine(String line, List<Job> jobsArray) { + return true; + } + + /** Overwritten since we do not parse console output to get scanner information. + */ + // interface IConsoleParser2 + @Override + public void shutdown() { + } } diff --git a/cmake/aggregator/CDT devel.launch b/cmake/aggregator/CDT devel.launch new file mode 100644 index 00000000000..5b79ebfcc69 --- /dev/null +++ b/cmake/aggregator/CDT devel.launch @@ -0,0 +1,671 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench"> +<booleanAttribute key="append.args" value="true"/> +<booleanAttribute key="askclear" value="false"/> +<booleanAttribute key="automaticAdd" value="true"/> +<booleanAttribute key="automaticValidate" value="false"/> +<stringAttribute key="bootstrap" value=""/> +<stringAttribute key="checked" value="[NONE]"/> +<booleanAttribute key="clearConfig" value="true"/> +<booleanAttribute key="clearws" value="true"/> +<booleanAttribute key="clearwslog" value="true"/> +<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/CDT devel"/> +<booleanAttribute key="default" value="false"/> +<setAttribute key="deselected_workspace_bundles"> +<setEntry value="org.eclipse.cdt.cmake.is.arm.tests"/> +<setEntry value="org.eclipse.cdt.cmake.is.core.tests"/> +<setEntry value="org.eclipse.cdt.cmake.is.hpenonstop.tests"/> +<setEntry value="org.eclipse.cdt.cmake.is.microsoft.tests"/> +<setEntry value="org.eclipse.cdt.cmake.is.nvidia.tests"/> +<setEntry value="org.eclipse.cdt.cmake.ui"/> +</setAttribute> +<booleanAttribute key="includeOptional" value="true"/> +<stringAttribute key="location" value="${workspace_loc}/../runtime-EclipseApplication"/> +<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> +<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -consolelog"/> +<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/> +<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms40m -Xmx512M -ea"/> +<booleanAttribute key="pde.generated.config" value="false"/> +<stringAttribute key="pde.version" value="3.3"/> +<stringAttribute key="product" value="org.eclipse.sdk.ide"/> +<setAttribute key="selected_target_bundles"> +<setEntry value="com.google.gson@default:default"/> +<setEntry value="com.ibm.icu@default:default"/> +<setEntry value="com.jcraft.jsch@default:default"/> +<setEntry value="com.jcraft.jzlib@default:default"/> +<setEntry value="com.sun.xml.bind@default:default"/> +<setEntry value="jakarta.xml.bind@default:default"/> +<setEntry value="javax.activation*1.1.0.v201211130549@default:default"/> +<setEntry value="javax.annotation*1.3.5.v20200504-1837@default:default"/> +<setEntry value="javax.el@default:default"/> +<setEntry value="javax.inject@default:default"/> +<setEntry value="javax.servlet.jsp@default:default"/> +<setEntry value="javax.servlet@default:default"/> +<setEntry value="javax.xml.stream@default:default"/> +<setEntry value="javax.xml@default:default"/> +<setEntry value="org.apache.ant@default:default"/> +<setEntry value="org.apache.batik.constants@default:default"/> +<setEntry value="org.apache.batik.css@default:default"/> +<setEntry value="org.apache.batik.i18n@default:default"/> +<setEntry value="org.apache.batik.util@default:default"/> +<setEntry value="org.apache.commons.io@default:default"/> +<setEntry value="org.apache.commons.jxpath@default:default"/> +<setEntry value="org.apache.commons.logging@default:default"/> +<setEntry value="org.apache.felix.gogo.runtime@default:default"/> +<setEntry value="org.apache.felix.scr@1:true"/> +<setEntry value="org.apache.log4j@default:default"/> +<setEntry value="org.apache.xmlgraphics@default:default"/> +<setEntry value="org.apiguardian@default:default"/> +<setEntry value="org.eclipse.ant.core@default:default"/> +<setEntry value="org.eclipse.cdt.core.linux.x86_64@default:false"/> +<setEntry value="org.eclipse.cdt.core.linux@default:false"/> +<setEntry value="org.eclipse.cdt.core.native@default:default"/> +<setEntry value="org.eclipse.cdt.core@default:default"/> +<setEntry value="org.eclipse.cdt.debug.core@default:default"/> +<setEntry value="org.eclipse.cdt.debug.ui@default:default"/> +<setEntry value="org.eclipse.cdt.launch@default:default"/> +<setEntry value="org.eclipse.cdt.make.core@default:default"/> +<setEntry value="org.eclipse.cdt.make.ui@default:default"/> +<setEntry value="org.eclipse.cdt.ui@default:default"/> +<setEntry value="org.eclipse.compare.core@default:default"/> +<setEntry value="org.eclipse.compare@default:default"/> +<setEntry value="org.eclipse.core.commands@default:default"/> +<setEntry value="org.eclipse.core.contenttype@default:default"/> +<setEntry value="org.eclipse.core.databinding.observable@default:default"/> +<setEntry value="org.eclipse.core.databinding.property@default:default"/> +<setEntry value="org.eclipse.core.databinding@default:default"/> +<setEntry value="org.eclipse.core.expressions@default:default"/> +<setEntry value="org.eclipse.core.filebuffers@default:default"/> +<setEntry value="org.eclipse.core.filesystem.linux.x86_64@default:false"/> +<setEntry value="org.eclipse.core.filesystem@default:default"/> +<setEntry value="org.eclipse.core.jobs@default:default"/> +<setEntry value="org.eclipse.core.net.linux.x86_64@default:false"/> +<setEntry value="org.eclipse.core.net@default:default"/> +<setEntry value="org.eclipse.core.resources@default:default"/> +<setEntry value="org.eclipse.core.runtime@default:true"/> +<setEntry value="org.eclipse.core.variables@default:default"/> +<setEntry value="org.eclipse.debug.core@default:default"/> +<setEntry value="org.eclipse.debug.ui@default:default"/> +<setEntry value="org.eclipse.e4.core.commands@default:default"/> +<setEntry value="org.eclipse.e4.core.contexts@default:default"/> +<setEntry value="org.eclipse.e4.core.di.annotations@default:default"/> +<setEntry value="org.eclipse.e4.core.di.extensions.supplier@default:default"/> +<setEntry value="org.eclipse.e4.core.di.extensions@default:default"/> +<setEntry value="org.eclipse.e4.core.di@default:default"/> +<setEntry value="org.eclipse.e4.core.services@default:default"/> +<setEntry value="org.eclipse.e4.emf.xpath@default:default"/> +<setEntry value="org.eclipse.e4.ui.bindings@default:default"/> +<setEntry value="org.eclipse.e4.ui.css.core@default:default"/> +<setEntry value="org.eclipse.e4.ui.css.swt.theme@default:default"/> +<setEntry value="org.eclipse.e4.ui.css.swt@default:default"/> +<setEntry value="org.eclipse.e4.ui.di@default:default"/> +<setEntry value="org.eclipse.e4.ui.dialogs@default:default"/> +<setEntry value="org.eclipse.e4.ui.ide@default:default"/> +<setEntry value="org.eclipse.e4.ui.model.workbench@default:default"/> +<setEntry value="org.eclipse.e4.ui.services@default:default"/> +<setEntry value="org.eclipse.e4.ui.swt.gtk@default:false"/> +<setEntry value="org.eclipse.e4.ui.widgets@default:default"/> +<setEntry value="org.eclipse.e4.ui.workbench.addons.swt@default:default"/> +<setEntry value="org.eclipse.e4.ui.workbench.renderers.swt@default:default"/> +<setEntry value="org.eclipse.e4.ui.workbench.swt@default:default"/> +<setEntry value="org.eclipse.e4.ui.workbench3@default:default"/> +<setEntry value="org.eclipse.e4.ui.workbench@default:default"/> +<setEntry value="org.eclipse.emf.common@default:default"/> +<setEntry value="org.eclipse.emf.ecore.change@default:default"/> +<setEntry value="org.eclipse.emf.ecore.xmi@default:default"/> +<setEntry value="org.eclipse.emf.ecore@default:default"/> +<setEntry value="org.eclipse.equinox.app@default:default"/> +<setEntry value="org.eclipse.equinox.bidi@default:default"/> +<setEntry value="org.eclipse.equinox.common@2:true"/> +<setEntry value="org.eclipse.equinox.event@default:default"/> +<setEntry value="org.eclipse.equinox.p2.core@default:default"/> +<setEntry value="org.eclipse.equinox.p2.engine@default:default"/> +<setEntry value="org.eclipse.equinox.p2.metadata.repository@default:default"/> +<setEntry value="org.eclipse.equinox.p2.metadata@default:default"/> +<setEntry value="org.eclipse.equinox.p2.repository@default:default"/> +<setEntry value="org.eclipse.equinox.preferences@default:default"/> +<setEntry value="org.eclipse.equinox.registry@default:default"/> +<setEntry value="org.eclipse.equinox.security.linux.x86_64@default:false"/> +<setEntry value="org.eclipse.equinox.security@default:default"/> +<setEntry value="org.eclipse.help@default:default"/> +<setEntry value="org.eclipse.jdt.annotation*2.2.600.v20200408-1511@default:default"/> +<setEntry value="org.eclipse.jface.databinding@default:default"/> +<setEntry value="org.eclipse.jface.text@default:default"/> +<setEntry value="org.eclipse.jface@default:default"/> +<setEntry value="org.eclipse.launchbar.core@default:default"/> +<setEntry value="org.eclipse.launchbar.ui@default:default"/> +<setEntry value="org.eclipse.ltk.core.refactoring@default:default"/> +<setEntry value="org.eclipse.ltk.ui.refactoring@default:default"/> +<setEntry value="org.eclipse.osgi.compatibility.state@default:false"/> +<setEntry value="org.eclipse.osgi.services@default:default"/> +<setEntry value="org.eclipse.osgi.util@default:default"/> +<setEntry value="org.eclipse.osgi@-1:true"/> +<setEntry value="org.eclipse.search@default:default"/> +<setEntry value="org.eclipse.swt.gtk.linux.x86_64@default:false"/> +<setEntry value="org.eclipse.swt@default:default"/> +<setEntry value="org.eclipse.swtbot.ant.junit@default:false"/> +<setEntry value="org.eclipse.team.core@default:default"/> +<setEntry value="org.eclipse.team.ui@default:default"/> +<setEntry value="org.eclipse.text@default:default"/> +<setEntry value="org.eclipse.tools.templates.core@default:default"/> +<setEntry value="org.eclipse.tools.templates.freemarker@default:default"/> +<setEntry value="org.eclipse.tools.templates.ui@default:default"/> +<setEntry value="org.eclipse.ui.console@default:default"/> +<setEntry value="org.eclipse.ui.editors@default:default"/> +<setEntry value="org.eclipse.ui.forms@default:default"/> +<setEntry value="org.eclipse.ui.ide.application@default:default"/> +<setEntry value="org.eclipse.ui.ide@default:default"/> +<setEntry value="org.eclipse.ui.navigator.resources@default:default"/> +<setEntry value="org.eclipse.ui.navigator@default:default"/> +<setEntry value="org.eclipse.ui.trace@default:default"/> +<setEntry value="org.eclipse.ui.views.properties.tabbed@default:default"/> +<setEntry value="org.eclipse.ui.views@default:default"/> +<setEntry value="org.eclipse.ui.workbench.texteditor@default:default"/> +<setEntry value="org.eclipse.ui.workbench@default:default"/> +<setEntry value="org.eclipse.ui@default:default"/> +<setEntry value="org.eclipse.urischeme@default:default"/> +<setEntry value="org.freemarker@default:default"/> +<setEntry value="org.glassfish.hk2.osgi-resource-locator@default:default"/> +<setEntry value="org.hamcrest.core@default:default"/> +<setEntry value="org.junit.platform.commons@default:default"/> +<setEntry value="org.junit.platform.engine@default:default"/> +<setEntry value="org.junit.platform.launcher@default:default"/> +<setEntry value="org.junit@default:default"/> +<setEntry value="org.opentest4j@default:default"/> +<setEntry value="org.slf4j.api*1.7.30.v20200204-2150@default:default"/> +<setEntry value="org.tukaani.xz@default:default"/> +<setEntry value="org.w3c.css.sac@default:default"/> +<setEntry value="org.w3c.dom.events@default:default"/> +<setEntry value="org.w3c.dom.smil@default:default"/> +<setEntry value="org.w3c.dom.svg@default:default"/> +</setAttribute> +<setAttribute key="selected_workspace_bundles"> +<setEntry value="org.eclipse.cdt.cmake.core@default:default"/> +<setEntry value="org.eclipse.cdt.cmake.is.arm@default:default"/> +<setEntry value="org.eclipse.cdt.cmake.is.core.doc@default:default"/> +<setEntry value="org.eclipse.cdt.cmake.is.core.ui@default:default"/> +<setEntry value="org.eclipse.cdt.cmake.is.core@default:default"/> +<setEntry value="org.eclipse.cdt.cmake.is.hpenonstop@default:default"/> +<setEntry value="org.eclipse.cdt.cmake.is.intel@default:default"/> +<setEntry value="org.eclipse.cdt.cmake.is.microsoft@default:default"/> +<setEntry value="org.eclipse.cdt.cmake.is.nvidia@default:default"/> +<setEntry value="org.eclipse.cdt.core@default:default"/> +</setAttribute> +<booleanAttribute key="show_selected_only" value="false"/> +<booleanAttribute key="tracing" value="false"/> +<mapAttribute key="tracingOptions"> +<mapEntry key="org.eclipse.cdt.cmake.is.core/debug/arglets" value="false"/> +<mapEntry key="org.eclipse.cdt.cmake.is.core/debug/detected.entries" value="false"/> +<mapEntry key="org.eclipse.cdt.cmake.is.core/debug/participant" value="false"/> +<mapEntry key="org.eclipse.cdt.cmake.is.core/debug/performance" value="false"/> +<mapEntry key="org.eclipse.cdt.codan.core/debug" value="false"/> +<mapEntry key="org.eclipse.cdt.codan.core/debug/performance" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/ASTCache" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/deltaprocessor" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/formatter" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/index/IndexFileSet" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/index/locks" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/indexer/activity" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/indexer/problems" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/indexer/problems/inclusion" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/indexer/problems/scanner" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/indexer/problems/syntax" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/indexer/setup" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/indexer/statistics" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/matchlocator" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/model" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/parser" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/parser/CompositeValue" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/parser/exceptions" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/resourceLookup" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/scanner" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/scanner/missingIncludeGuards" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/search" value="false"/> +<mapEntry key="org.eclipse.cdt.core/debug/typeresolver" value="false"/> +<mapEntry key="org.eclipse.cdt.debug.core/debug" value="false"/> +<mapEntry key="org.eclipse.cdt.debug.core/debug/executables" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf.gdb/debug" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf.gdb/debug/timeouts" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf.ui/debug" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf.ui/debug/disassembly" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf.ui/debug/stepping" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf.ui/debug/vm/atomicUpdate" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf.ui/debug/vm/cache" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf.ui/debug/vm/contentProvider" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf.ui/debug/vm/delta" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf.ui/debug/vm/presentationId" value=""/> +<mapEntry key="org.eclipse.cdt.dsf.ui/debug/vm/updates" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf.ui/debug/vm/updates/regex" value=""/> +<mapEntry key="org.eclipse.cdt.dsf/debug" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf/debug/executor" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf/debug/executorName" value=""/> +<mapEntry key="org.eclipse.cdt.dsf/debug/monitors" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf/debug/session" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf/debug/session/dispatches" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf/debug/session/listeners" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf/debug/session/modelAdapters" value="false"/> +<mapEntry key="org.eclipse.cdt.dsf/debugCache" value="false"/> +<mapEntry key="org.eclipse.cdt.make.core/debug" value="true"/> +<mapEntry key="org.eclipse.cdt.make.core/debug/scdiscovery" value="false"/> +<mapEntry key="org.eclipse.cdt.ui/debug" value="false"/> +<mapEntry key="org.eclipse.cdt.ui/debug/SemanticHighlighting" value="false"/> +<mapEntry key="org.eclipse.cdt.ui/debug/contentassist" value="false"/> +<mapEntry key="org.eclipse.cdt.ui/debug/folding" value="false"/> +<mapEntry key="org.eclipse.cdt.ui/debug/includeOrganizer/headerSubstitution" value="false"/> +<mapEntry key="org.eclipse.core.contenttype/debug" value="false"/> +<mapEntry key="org.eclipse.core.expressions/debug/TypeExtensionManager" value="false"/> +<mapEntry key="org.eclipse.core.expressions/tracePropertyResolving" value="false"/> +<mapEntry key="org.eclipse.core.jobs/jobs" value="false"/> +<mapEntry key="org.eclipse.core.jobs/jobs/beginend" value="false"/> +<mapEntry key="org.eclipse.core.jobs/jobs/errorondeadlock" value="false"/> +<mapEntry key="org.eclipse.core.jobs/jobs/locks" value="false"/> +<mapEntry key="org.eclipse.core.jobs/jobs/shutdown" value="false"/> +<mapEntry key="org.eclipse.core.net/debug" value="false"/> +<mapEntry key="org.eclipse.core.net/systemproviders" value="false"/> +<mapEntry key="org.eclipse.core.resources/build/cycle" value="false"/> +<mapEntry key="org.eclipse.core.resources/build/delta" value="false"/> +<mapEntry key="org.eclipse.core.resources/build/failure" value="false"/> +<mapEntry key="org.eclipse.core.resources/build/interrupt" value="false"/> +<mapEntry key="org.eclipse.core.resources/build/invoking" value="false"/> +<mapEntry key="org.eclipse.core.resources/build/needbuild" value="false"/> +<mapEntry key="org.eclipse.core.resources/build/needbuildstack" value="false"/> +<mapEntry key="org.eclipse.core.resources/build/stacktrace" value="false"/> +<mapEntry key="org.eclipse.core.resources/contenttype" value="false"/> +<mapEntry key="org.eclipse.core.resources/contenttype/cache" value="false"/> +<mapEntry key="org.eclipse.core.resources/debug" value="false"/> +<mapEntry key="org.eclipse.core.resources/history" value="false"/> +<mapEntry key="org.eclipse.core.resources/natures" value="false"/> +<mapEntry key="org.eclipse.core.resources/notifications" value="false"/> +<mapEntry key="org.eclipse.core.resources/perf/builders" value="10000"/> +<mapEntry key="org.eclipse.core.resources/perf/listeners" value="500"/> +<mapEntry key="org.eclipse.core.resources/perf/save.participants" value="500"/> +<mapEntry key="org.eclipse.core.resources/perf/snapshot" value="1000"/> +<mapEntry key="org.eclipse.core.resources/preferences" value="false"/> +<mapEntry key="org.eclipse.core.resources/refresh" value="false"/> +<mapEntry key="org.eclipse.core.resources/restore" value="false"/> +<mapEntry key="org.eclipse.core.resources/restore/markers" value="false"/> +<mapEntry key="org.eclipse.core.resources/restore/mastertable" value="false"/> +<mapEntry key="org.eclipse.core.resources/restore/metainfo" value="false"/> +<mapEntry key="org.eclipse.core.resources/restore/snapshots" value="false"/> +<mapEntry key="org.eclipse.core.resources/restore/syncinfo" value="false"/> +<mapEntry key="org.eclipse.core.resources/restore/tree" value="false"/> +<mapEntry key="org.eclipse.core.resources/save" value="false"/> +<mapEntry key="org.eclipse.core.resources/save/markers" value="false"/> +<mapEntry key="org.eclipse.core.resources/save/mastertable" value="false"/> +<mapEntry key="org.eclipse.core.resources/save/metainfo" value="false"/> +<mapEntry key="org.eclipse.core.resources/save/syncinfo" value="false"/> +<mapEntry key="org.eclipse.core.resources/save/tree" value="false"/> +<mapEntry key="org.eclipse.core.resources/strings" value="false"/> +<mapEntry key="org.eclipse.core.runtime/compatibility/debug" value="false"/> +<mapEntry key="org.eclipse.core.runtime/debug" value="false"/> +<mapEntry key="org.eclipse.core.runtime/debug/context" value="false"/> +<mapEntry key="org.eclipse.core.runtime/perf" value="false"/> +<mapEntry key="org.eclipse.core.runtime/perf/success" value="false"/> +<mapEntry key="org.eclipse.core.runtime/preferences/plugin" value="false"/> +<mapEntry key="org.eclipse.core.runtime/url/debug" value="false"/> +<mapEntry key="org.eclipse.core.runtime/url/debug/cachecopy" value="false"/> +<mapEntry key="org.eclipse.core.runtime/url/debug/cachelookup" value="false"/> +<mapEntry key="org.eclipse.core.runtime/url/debug/connect" value="false"/> +<mapEntry key="org.eclipse.debug.core/debug" value="false"/> +<mapEntry key="org.eclipse.debug.core/debug/commands" value="false"/> +<mapEntry key="org.eclipse.debug.core/debug/events" value="false"/> +<mapEntry key="org.eclipse.debug.ui/debug" value="false"/> +<mapEntry key="org.eclipse.debug.ui/debug/breadcrumb" value="false"/> +<mapEntry key="org.eclipse.debug.ui/debug/contextlaunching" value="false"/> +<mapEntry key="org.eclipse.debug.ui/debug/launchhistory" value="false"/> +<mapEntry key="org.eclipse.debug.ui/debug/memory/dynamicLoading" value="false"/> +<mapEntry key="org.eclipse.debug.ui/debug/viewers/breakpointDeltas" value="false"/> +<mapEntry key="org.eclipse.debug.ui/debug/viewers/contentProvider" value="false"/> +<mapEntry key="org.eclipse.debug.ui/debug/viewers/deltas" value="false"/> +<mapEntry key="org.eclipse.debug.ui/debug/viewers/model" value="false"/> +<mapEntry key="org.eclipse.debug.ui/debug/viewers/presentationId" value=""/> +<mapEntry key="org.eclipse.debug.ui/debug/viewers/stateSaveRestore" value="false"/> +<mapEntry key="org.eclipse.debug.ui/debug/viewers/updateSequence" value="false"/> +<mapEntry key="org.eclipse.debug.ui/debug/viewers/viewer" value="false"/> +<mapEntry key="org.eclipse.e4.core.contexts/debug" value="false"/> +<mapEntry key="org.eclipse.e4.core.contexts/debug/listeners" value="false"/> +<mapEntry key="org.eclipse.e4.core.contexts/debug/names" value="false"/> +<mapEntry key="org.eclipse.e4.core.di/debug" value="false"/> +<mapEntry key="org.eclipse.e4.core.services/debug" value="false"/> +<mapEntry key="org.eclipse.e4.core.services/debug/injector" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench.swt/debug" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench.swt/trace" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/commands" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/eclipse.context" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/eclipse.context.verbose" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/focus" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/menus" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/renderer" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench.swt/trace/workbench" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench/debug" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench/trace" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench/trace/commands" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench/trace/eclipse.context" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench/trace/eclipse.context.verbose" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench/trace/focus" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench/trace/menus" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench/trace/renderer" value="false"/> +<mapEntry key="org.eclipse.e4.ui.workbench/trace/workbench" value="false"/> +<mapEntry key="org.eclipse.ecf.provider.filetransfer.httpclient4/debug" value="false"/> +<mapEntry key="org.eclipse.ecf.provider.filetransfer.httpclient4/debug/exceptions/catching" value="false"/> +<mapEntry key="org.eclipse.ecf.provider.filetransfer.httpclient4/debug/exceptions/throwing" value="false"/> +<mapEntry key="org.eclipse.ecf.provider.filetransfer.httpclient4/debug/methods/entering" value="false"/> +<mapEntry key="org.eclipse.ecf.provider.filetransfer.httpclient4/debug/methods/exiting" value="false"/> +<mapEntry key="org.eclipse.ecf.provider.filetransfer.httpclient45/debug" value="false"/> +<mapEntry key="org.eclipse.ecf.provider.filetransfer.httpclient45/debug/exceptions/catching" value="false"/> +<mapEntry key="org.eclipse.ecf.provider.filetransfer.httpclient45/debug/exceptions/throwing" value="false"/> +<mapEntry key="org.eclipse.ecf.provider.filetransfer.httpclient45/debug/methods/entering" value="false"/> +<mapEntry key="org.eclipse.ecf.provider.filetransfer.httpclient45/debug/methods/exiting" value="false"/> +<mapEntry key="org.eclipse.egit.core/debug" value="false"/> +<mapEntry key="org.eclipse.egit.core/debug/core" value="false"/> +<mapEntry key="org.eclipse.egit.core/debug/core/indexdiffcache" value="false"/> +<mapEntry key="org.eclipse.egit.core/debug/core/jsch" value="false"/> +<mapEntry key="org.eclipse.egit.core/debug/core/refresh" value="false"/> +<mapEntry key="org.eclipse.egit.ui/debug" value="false"/> +<mapEntry key="org.eclipse.egit.ui/debug/quickdiff" value="false"/> +<mapEntry key="org.eclipse.egit.ui/debug/repochangescanner" value="false"/> +<mapEntry key="org.eclipse.egit.ui/debug/ui" value="false"/> +<mapEntry key="org.eclipse.egit.ui/debug/ui/decoration" value="false"/> +<mapEntry key="org.eclipse.egit.ui/debug/ui/historyview" value="false"/> +<mapEntry key="org.eclipse.egit.ui/debug/ui/propertiestesters" value="false"/> +<mapEntry key="org.eclipse.egit.ui/debug/ui/repositoriesview" value="false"/> +<mapEntry key="org.eclipse.egit.ui/debug/ui/selection" value="false"/> +<mapEntry key="org.eclipse.equinox.common/debug" value="false"/> +<mapEntry key="org.eclipse.equinox.common/progress_monitors" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/artifacts/mirrors" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/core/parseproblems" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/core/removeRepo" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/debug" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/engine/installregistry" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/engine/profilepreferences" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/events/client" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/generator/parsing" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/metadata/parsing" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/planner/encoding" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/planner/operands" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/planner/projector" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/publisher" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/reconciler" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/ui/default" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.core/updatechecker" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.engine/certificatechecker/unsigned" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.engine/certificatechecker/untrusted" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.engine/engine/debug" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.engine/enginesession/debug" value="false"/> +<mapEntry key="org.eclipse.equinox.p2.engine/profileregistry/debug" value="false"/> +<mapEntry key="org.eclipse.equinox.preferences/general" value="false"/> +<mapEntry key="org.eclipse.equinox.preferences/get" value="false"/> +<mapEntry key="org.eclipse.equinox.preferences/set" value="false"/> +<mapEntry key="org.eclipse.equinox.registry/debug" value="false"/> +<mapEntry key="org.eclipse.equinox.registry/debug/events" value="false"/> +<mapEntry key="org.eclipse.equinox.security.ui/debug" value="false"/> +<mapEntry key="org.eclipse.equinox.security.ui/debug/storage" value="false"/> +<mapEntry key="org.eclipse.equinox.security/debug" value="false"/> +<mapEntry key="org.eclipse.equinox.security/debug/loginFramework" value="false"/> +<mapEntry key="org.eclipse.help.ui/debug" value="true"/> +<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser" value="false"/> +<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser/inprocess" value="false"/> +<mapEntry key="org.eclipse.help.ui/debug/infopop" value="false"/> +<mapEntry key="org.eclipse.help.webapp/debug" value="true"/> +<mapEntry key="org.eclipse.help.webapp/debug/workingsets" value="false"/> +<mapEntry key="org.eclipse.help/debug" value="true"/> +<mapEntry key="org.eclipse.help/debug/context" value="false"/> +<mapEntry key="org.eclipse.help/debug/search" value="false"/> +<mapEntry key="org.eclipse.help/debug/toc" value="false"/> +<mapEntry key="org.eclipse.jdt.apt.core/debug" value="false"/> +<mapEntry key="org.eclipse.jdt.apt.core/debug/compilationEnv" value="false"/> +<mapEntry key="org.eclipse.jdt.apt.core/debug/generatedFileMaps" value="false"/> +<mapEntry key="org.eclipse.jdt.apt.core/debug/generatedFiles" value="false"/> +<mapEntry key="org.eclipse.jdt.apt.pluggable.core/debug" value="false"/> +<mapEntry key="org.eclipse.jdt.core.manipulation/debug" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/buffermanager" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/builder" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/builder/stats" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/compiler" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/completion" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/cpresolution" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/cpresolution/advanced" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/cpresolution/failure" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/dom/ast" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/dom/ast/throw" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/dom/rewrite" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/formatter" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/hierarchy" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/index/freespacetest" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/index/indexer" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/index/insertions" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/index/locks" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/index/logsizemegs" value="0"/> +<mapEntry key="org.eclipse.jdt.core/debug/index/pagecache" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/index/scheduling" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/index/selftest" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/index/space" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/index/timing" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/indexmanager" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/indexmanager/advanced" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/javadelta" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/javadelta/verbose" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/javamodel" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/javamodel/cache" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/javamodel/classpath" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/javamodel/insertions" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/javamodel/invalid_archives" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/postaction" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/resolution" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/search" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/selection" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/sourcemapper" value="false"/> +<mapEntry key="org.eclipse.jdt.core/debug/zipaccess" value="false"/> +<mapEntry key="org.eclipse.jdt.core/perf/completion" value="300"/> +<mapEntry key="org.eclipse.jdt.core/perf/containerinitializer" value="5000"/> +<mapEntry key="org.eclipse.jdt.core/perf/javadeltalistener" value="500"/> +<mapEntry key="org.eclipse.jdt.core/perf/reconcile" value="1000"/> +<mapEntry key="org.eclipse.jdt.core/perf/selection" value="300"/> +<mapEntry key="org.eclipse.jdt.core/perf/variableinitializer" value="5000"/> +<mapEntry key="org.eclipse.jdt.debug/debug" value="false"/> +<mapEntry key="org.eclipse.jdt.debug/debug/astEvaluations" value="false"/> +<mapEntry key="org.eclipse.jdt.debug/debug/astEvaluations/callingThreads" value="false"/> +<mapEntry key="org.eclipse.jdt.debug/debug/jdiEvents" value="false"/> +<mapEntry key="org.eclipse.jdt.debug/debug/jdiRequestTimes" value="false"/> +<mapEntry key="org.eclipse.jdt.launching/debug" value="false"/> +<mapEntry key="org.eclipse.jdt.launching/debug/classpath/jreContainer" value="false"/> +<mapEntry key="org.eclipse.jdt.ui/debug" value="false"/> +<mapEntry key="org.eclipse.jdt.ui/debug/ASTProvider" value="false"/> +<mapEntry key="org.eclipse.jdt.ui/debug/BreadcrumbItemDropDown" value="false"/> +<mapEntry key="org.eclipse.jdt.ui/debug/ResultCollector" value="false"/> +<mapEntry key="org.eclipse.jdt.ui/debug/TypeConstraints" value="false"/> +<mapEntry key="org.eclipse.jdt.ui/perf/content_assist/extensions" value="1000"/> +<mapEntry key="org.eclipse.jdt.ui/perf/content_assist_sorters/extensions" value=""/> +<mapEntry key="org.eclipse.jdt.ui/perf/explorer/RefactorActionGroup" value="150"/> +<mapEntry key="org.eclipse.jdt.ui/perf/explorer/createPartControl" value="1300"/> +<mapEntry key="org.eclipse.jdt.ui/perf/explorer/makeActions" value="1000"/> +<mapEntry key="org.eclipse.jdt.ui/perf/search/participants" value="300"/> +<mapEntry key="org.eclipse.jface.text.source/debug/RevisionRulerColumn" value="false"/> +<mapEntry key="org.eclipse.jface.text/assert/TextSelection/validConstructorArguments" value="false"/> +<mapEntry key="org.eclipse.jface.text/debug/AbstractInformationControlManager" value="false"/> +<mapEntry key="org.eclipse.jface.text/debug/AnnotationPainter" value="false"/> +<mapEntry key="org.eclipse.jface.text/debug/ContentAssistSubjectAdapters" value="false"/> +<mapEntry key="org.eclipse.jface.text/debug/FastPartitioner/PositionCache" value="false"/> +<mapEntry key="org.eclipse.jface/debug" value="false"/> +<mapEntry key="org.eclipse.jface/debug/bidiUtils" value="false"/> +<mapEntry key="org.eclipse.jface/debug/dialog/noparent" value="false"/> +<mapEntry key="org.eclipse.jface/debug/loadURLImageDescriptor2x" value="true"/> +<mapEntry key="org.eclipse.jface/debug/loadURLImageDescriptor2xPngForGif" value="false"/> +<mapEntry key="org.eclipse.jface/debug/loadURLImageDescriptorDirectly" value="false"/> +<mapEntry key="org.eclipse.jface/debug/logURLImageDescriptorMissing2x" value="false"/> +<mapEntry key="org.eclipse.jface/debug/trace/URLImageDescriptor" value="false"/> +<mapEntry key="org.eclipse.jface/debug/viewers/equalElements" value="false"/> +<mapEntry key="org.eclipse.jface/debug/viewers/reentrantViewerCalls" value="false"/> +<mapEntry key="org.eclipse.jface/newlook/preferences/showNewLook" value="false"/> +<mapEntry key="org.eclipse.jface/trace/actions" value="false"/> +<mapEntry key="org.eclipse.jface/trace/toolbarDisposal" value="false"/> +<mapEntry key="org.eclipse.launchbar.core/debug" value="true"/> +<mapEntry key="org.eclipse.launchbar.core/debug/launchbar" value="true"/> +<mapEntry key="org.eclipse.launchbar.ui/iconSize32" value="false"/> +<mapEntry key="org.eclipse.launchbar.ui/launchIconUpdater" value="false"/> +<mapEntry key="org.eclipse.lsp4e/debug" value="false"/> +<mapEntry key="org.eclipse.ltk.core.refactoring/perf/participants/checkConditions" value="300"/> +<mapEntry key="org.eclipse.ltk.core.refactoring/perf/participants/createChanges" value="300"/> +<mapEntry key="org.eclipse.osgi/debug" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/bundleFile" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/bundleStartTime" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/bundleTime" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/cachedmanifest" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/events" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/filter" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/loader" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/location" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/manifest" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/messageBundles" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/objectPool/adds" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/objectPool/dups" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/packageadmin" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/security" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/services" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/startlevel" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/storage" value="false"/> +<mapEntry key="org.eclipse.osgi/debug/systemBundle" value="false"/> +<mapEntry key="org.eclipse.osgi/eclipseadaptor/converter/debug" value="false"/> +<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug" value="false"/> +<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin" value="false"/> +<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver" value="false"/> +<mapEntry key="org.eclipse.osgi/monitor/activation" value="false"/> +<mapEntry key="org.eclipse.osgi/monitor/lazy" value="false"/> +<mapEntry key="org.eclipse.osgi/resolver" value="false"/> +<mapEntry key="org.eclipse.osgi/resolver/hooks" value="false"/> +<mapEntry key="org.eclipse.osgi/resolver/providers" value="false"/> +<mapEntry key="org.eclipse.osgi/resolver/report" value="false"/> +<mapEntry key="org.eclipse.osgi/resolver/roots" value="false"/> +<mapEntry key="org.eclipse.osgi/resolver/uses" value="false"/> +<mapEntry key="org.eclipse.osgi/resolver/wiring" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug/apianalyzer" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug/apidescription" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug/apifilterstore" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug/apiprofile" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug/builder" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug/classfilevisitor" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug/delta" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug/descriptor/framework" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug/pluginworkspacecomponent" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug/profilemanager" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug/search" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug/tagscanner" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug/usereportconverter" value="false"/> +<mapEntry key="org.eclipse.pde.api.tools/debug/workspacedeltaprocessor" value="false"/> +<mapEntry key="org.eclipse.pde.build/debug" value="false"/> +<mapEntry key="org.eclipse.pde.core/classpath" value="false"/> +<mapEntry key="org.eclipse.pde.core/debug" value="false"/> +<mapEntry key="org.eclipse.pde.core/model" value="false"/> +<mapEntry key="org.eclipse.pde.core/target/profile" value="false"/> +<mapEntry key="org.eclipse.pde.core/validation" value="false"/> +<mapEntry key="org.eclipse.pde.ds.annotations/debug" value="false"/> +<mapEntry key="org.eclipse.pde.ds.annotations/ds-annotation-builder" value="false"/> +<mapEntry key="org.eclipse.pde.ds.annotations/ds-annotation-builder/processor" value="false"/> +<mapEntry key="org.eclipse.search/perf" value="false"/> +<mapEntry key="org.eclipse.team.core/backgroundevents" value="false"/> +<mapEntry key="org.eclipse.team.core/debug" value="false"/> +<mapEntry key="org.eclipse.team.core/refreshjob" value="false"/> +<mapEntry key="org.eclipse.team.core/streams" value="false"/> +<mapEntry key="org.eclipse.team.core/threading" value="false"/> +<mapEntry key="org.eclipse.team.ui/compare_editor_input" value="false"/> +<mapEntry key="org.eclipse.team.ui/debug" value="false"/> +<mapEntry key="org.eclipse.team.ui/dnd" value="false"/> +<mapEntry key="org.eclipse.team.ui/history" value="false"/> +<mapEntry key="org.eclipse.team.ui/syncmodels" value="false"/> +<mapEntry key="org.eclipse.tm.terminal.control/debug/log" value="false"/> +<mapEntry key="org.eclipse.tm.terminal.control/debug/log/VT100Backend" value="false"/> +<mapEntry key="org.eclipse.tm.terminal.control/debug/log/char" value="false"/> +<mapEntry key="org.eclipse.tm4e.registry/debug/log/Grammar" value="false"/> +<mapEntry key="org.eclipse.tm4e.ui/debug/log/GenerateTest" value="false"/> +<mapEntry key="org.eclipse.tm4e.ui/debug/log/TMModelManager" value="false"/> +<mapEntry key="org.eclipse.tm4e.ui/debug/log/TMPresentationReconciler" value="false"/> +<mapEntry key="org.eclipse.tm4e.ui/debug/log/ThrowError" value="false"/> +<mapEntry key="org.eclipse.ui.browser/debug" value="false"/> +<mapEntry key="org.eclipse.ui.forms/debug" value="false"/> +<mapEntry key="org.eclipse.ui.forms/debug/focus" value="false"/> +<mapEntry key="org.eclipse.ui.forms/debug/text" value="false"/> +<mapEntry key="org.eclipse.ui.forms/debug/textsize" value="false"/> +<mapEntry key="org.eclipse.ui.ide/debug" value="false"/> +<mapEntry key="org.eclipse.ui.ide/debug/gc" value="false"/> +<mapEntry key="org.eclipse.ui.ide/debug/internalerror/openDialog" value="false"/> +<mapEntry key="org.eclipse.ui.ide/debug/markers" value="false"/> +<mapEntry key="org.eclipse.ui.ide/debug/undomonitor" value="false"/> +<mapEntry key="org.eclipse.ui.intro.universal/debug" value="true"/> +<mapEntry key="org.eclipse.ui.intro.universal/trace/logInfo" value="true"/> +<mapEntry key="org.eclipse.ui.intro.universal/trace/logPerformance" value="false"/> +<mapEntry key="org.eclipse.ui.intro/debug" value="true"/> +<mapEntry key="org.eclipse.ui.intro/debug/toolbar" value="false"/> +<mapEntry key="org.eclipse.ui.intro/flags/noBrowser" value="false"/> +<mapEntry key="org.eclipse.ui.intro/trace/logInfo" value="true"/> +<mapEntry key="org.eclipse.ui.intro/trace/logPerformance" value="false"/> +<mapEntry key="org.eclipse.ui.intro/trace/printHTML" value="false"/> +<mapEntry key="org.eclipse.ui.monitoring/debug/event_monitor" value="false"/> +<mapEntry key="org.eclipse.ui.navigator/debug" value="false"/> +<mapEntry key="org.eclipse.ui.navigator/debug/dnd" value="false"/> +<mapEntry key="org.eclipse.ui.navigator/debug/resolution" value="false"/> +<mapEntry key="org.eclipse.ui.navigator/debug/setup" value="false"/> +<mapEntry key="org.eclipse.ui.navigator/debug/sort" value="false"/> +<mapEntry key="org.eclipse.ui.navigator/debug/viewermap" value="false"/> +<mapEntry key="org.eclipse.ui.navigator/perf/explorer/createPartControl" value="1300"/> +<mapEntry key="org.eclipse.ui.workbench/debug" value="false"/> +<mapEntry key="org.eclipse.ui.workbench/debug/e4" value="false"/> +<mapEntry key="org.eclipse.ui/debug" value="false"/> +<mapEntry key="org.eclipse.ui/debug/contributions" value="false"/> +<mapEntry key="org.eclipse.ui/debug/declaredImages" value="false"/> +<mapEntry key="org.eclipse.ui/debug/job.stale" value="false"/> +<mapEntry key="org.eclipse.ui/debug/showAllJobs" value="false"/> +<mapEntry key="org.eclipse.ui/debug/swtdebug" value="false"/> +<mapEntry key="org.eclipse.ui/debug/swtdebugglobal" value="false"/> +<mapEntry key="org.eclipse.ui/debug/workingSets" value="false"/> +<mapEntry key="org.eclipse.ui/experimental/menus" value="false"/> +<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPartListener" value="false"/> +<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPartListener2" value="false"/> +<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPropertyChangeListener" value="false"/> +<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPartReference" value="false"/> +<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPageListener" value="false"/> +<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPartListener" value="false"/> +<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPartListener2" value="false"/> +<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPerspectiveListener" value="false"/> +<mapEntry key="org.eclipse.ui/perf/contentTypes" value="200"/> +<mapEntry key="org.eclipse.ui/perf/earlyStartup" value="100"/> +<mapEntry key="org.eclipse.ui/perf/page.listeners" value="200"/> +<mapEntry key="org.eclipse.ui/perf/part.activate" value="200"/> +<mapEntry key="org.eclipse.ui/perf/part.control" value="800"/> +<mapEntry key="org.eclipse.ui/perf/part.create" value="800"/> +<mapEntry key="org.eclipse.ui/perf/part.init" value="800"/> +<mapEntry key="org.eclipse.ui/perf/part.input" value="200"/> +<mapEntry key="org.eclipse.ui/perf/part.listeners" value="200"/> +<mapEntry key="org.eclipse.ui/perf/perspective.create" value="800"/> +<mapEntry key="org.eclipse.ui/perf/perspective.listeners" value="200"/> +<mapEntry key="org.eclipse.ui/perf/perspective.switch" value="800"/> +<mapEntry key="org.eclipse.ui/perf/showHeapStatus" value="true"/> +<mapEntry key="org.eclipse.ui/perf/uijob" value="200"/> +<mapEntry key="org.eclipse.ui/perf/workbench.restore" value="30000"/> +<mapEntry key="org.eclipse.ui/perf/workbench.start" value="45000"/> +<mapEntry key="org.eclipse.ui/trace/commands" value="false"/> +<mapEntry key="org.eclipse.ui/trace/contexts" value="false"/> +<mapEntry key="org.eclipse.ui/trace/contexts.performance" value="false"/> +<mapEntry key="org.eclipse.ui/trace/contexts.verbose" value="false"/> +<mapEntry key="org.eclipse.ui/trace/graphics" value="false"/> +<mapEntry key="org.eclipse.ui/trace/handlers" value="false"/> +<mapEntry key="org.eclipse.ui/trace/handlers.performance" value="false"/> +<mapEntry key="org.eclipse.ui/trace/handlers.verbose" value="false"/> +<mapEntry key="org.eclipse.ui/trace/handlers.verbose.commandId" value=""/> +<mapEntry key="org.eclipse.ui/trace/keyBindings" value="false"/> +<mapEntry key="org.eclipse.ui/trace/keyBindings.verbose" value="false"/> +<mapEntry key="org.eclipse.ui/trace/multipageeditor" value="false"/> +<mapEntry key="org.eclipse.ui/trace/operations" value="false"/> +<mapEntry key="org.eclipse.ui/trace/operations.verbose" value="false"/> +<mapEntry key="org.eclipse.ui/trace/perspectives" value="false"/> +<mapEntry key="org.eclipse.ui/trace/sources" value="false"/> +<mapEntry key="org.eclipse.update.configurator/debug" value="false"/> +</mapAttribute> +<booleanAttribute key="useCustomFeatures" value="false"/> +<booleanAttribute key="useDefaultConfig" value="true"/> +<booleanAttribute key="useDefaultConfigArea" value="true"/> +<booleanAttribute key="useProduct" value="false"/> +<booleanAttribute key="usefeatures" value="false"/> +</launchConfiguration> diff --git a/cmake/org.eclipse.cdt.cmake.is.core/plugin.xml b/cmake/org.eclipse.cdt.cmake.is.core/plugin.xml index 5ef8cc69b04..c3fd96ef998 100644 --- a/cmake/org.eclipse.cdt.cmake.is.core/plugin.xml +++ b/cmake/org.eclipse.cdt.cmake.is.core/plugin.xml @@ -3,13 +3,6 @@ <plugin> <extension-point id="detectionParticipant" name="%extension-point.name" schema="schema/participant.exsd"/> "org.eclipse.cdt.cmake.is.core.internal.ui.CompileCommandsJsonParserOptionPage"> - <extension - point="org.eclipse.cdt.core.CBuildConsole"> - <CBuildConsole - class="org.eclipse.cdt.cmake.is.core.internal.builtins.DetectorConsole" - id="org.eclipse.cdt.cmake.is.core.detectorConsole"> - </CBuildConsole> - </extension> <extension id="CompileCommandsJsonParserMarker" name="CMake compile_commands.json parser" diff --git a/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/CompileCommandsJsonParser.java b/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/CompileCommandsJsonParser.java index 1535d984d4f..db50aafead2 100644 --- a/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/CompileCommandsJsonParser.java +++ b/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/CompileCommandsJsonParser.java @@ -13,6 +13,7 @@ import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.nio.file.Files; +import java.nio.file.Paths; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -38,9 +39,7 @@ import org.eclipse.cdt.cmake.is.core.participant.IToolCommandlineParser; import org.eclipse.cdt.cmake.is.core.participant.IToolCommandlineParser.IResult; import org.eclipse.cdt.cmake.is.core.participant.IToolDetectionParticipant; import org.eclipse.cdt.cmake.is.core.participant.builtins.IBuiltinsDetectionBehavior; -import org.eclipse.cdt.core.ICommandLauncher; import org.eclipse.cdt.core.build.CBuildConfiguration; -import org.eclipse.cdt.core.resources.IConsole; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; @@ -68,13 +67,6 @@ import com.google.gson.JsonSyntaxException; * * @author Martin Weber */ -/* - * TODO introduce separate packages for consumers of this class and for - * implementors of the extension point (this package vs. packages - * org.eclipse.cdt.cmake.is.core, org.eclipse.cdt.cmake.is.core.builtins) - * - * - */ public class CompileCommandsJsonParser { private static final boolean DEBUG_TIME = Boolean .parseBoolean(Platform.getDebugOption(Plugin.PLUGIN_ID + "/debug/performance")); //$NON-NLS-1$ @@ -91,8 +83,8 @@ public class CompileCommandsJsonParser { private static final String MARKER_ID = Plugin.PLUGIN_ID + ".CompileCommandsJsonParserMarker"; //$NON-NLS-1$ - private final CBuildConfiguration cBuildConfiguration; - private final IIndexerInfoConsumer indexerInfoConsumer; + private ParseRequest parseRequest; + private final IParserPreferencesAccess prefsAccess; /** @@ -128,29 +120,20 @@ public class CompileCommandsJsonParser { /** * Creates a new object that will try to parse the {@code compile_commands.json} - * file in the build directory of the specified {@code CBuildConfiguration}. + * file in the build directory specified in the {@code ParseRequest#getBuildConfiguration()}. * - * @param buildConfiguration the CBuildConfiguration of the project - * @param indexerInfoConsumer the objects that receives the indexer relevant - * information for each source file + * @param parseRequest the parser configuration */ - public CompileCommandsJsonParser(CBuildConfiguration buildConfiguration, IIndexerInfoConsumer indexerInfoConsumer) { - this.cBuildConfiguration = Objects.requireNonNull(buildConfiguration, "buildConfiguration"); //$NON-NLS-1$ - this.indexerInfoConsumer = Objects.requireNonNull(indexerInfoConsumer, "indexerInfoConsumer"); //$NON-NLS-1$ + // TODO interface ICBuildConfiguration should be sufficient here + public CompileCommandsJsonParser(ParseRequest parseRequest) { + this.parseRequest = Objects.requireNonNull(parseRequest, "parseRequest"); //$NON-NLS-1$ prefsAccess = EclipseContextFactory.getServiceContext(FrameworkUtil.getBundle(getClass()).getBundleContext()) .get(IParserPreferencesAccess.class); } /** * Parses the content of the 'compile_commands.json' file corresponding to the - * specified configuration, if timestamps differ. - * - * @param launcher the launcher to run the compiler for built-in detection. - * Should be capable to run in docker container, if build in - * container is configured for the project. - * @param console the console to print the compiler output during built-in - * detection to or <code>null</code> if a separate console is to - * be allocated. + * specified configuration, if time-stamps differ. * @param monitor the job's progress monitor * * @return {@code true} if the json file did change since the last invocation of @@ -158,10 +141,11 @@ public class CompileCommandsJsonParser { * {@code false} * @throws CoreException */ - private boolean processJsonFile(ICommandLauncher launcher, IConsole console, IProgressMonitor monitor) - throws CoreException { - final IProject project = cBuildConfiguration.getBuildConfiguration().getProject(); - java.nio.file.Path buildRoot = cBuildConfiguration.getBuildDirectory(); + private boolean processJsonFile(IProgressMonitor monitor) throws CoreException { + final CBuildConfiguration configuration = parseRequest.getBuildConfiguration(); + final IProject project = configuration.getBuildConfiguration().getProject(); + java.nio.file.Path buildRoot = Paths.get(configuration.getBuildDirectoryURI()); + final java.nio.file.Path jsonFile = buildRoot.resolve("compile_commands.json"); //$NON-NLS-1$ if (!Files.exists(jsonFile)) { // no json file was produced in the build @@ -178,7 +162,7 @@ public class CompileCommandsJsonParser { // tread as 'file does nor exist' return false; } - IContainer buildContainer = cBuildConfiguration.getBuildContainer(); + IContainer buildContainer = configuration.getBuildContainer(); final IFile jsonFileRc = buildContainer.getFile(new Path("compile_commands.json")); //$NON-NLS-1$ Long sessionLastModified = (Long) buildContainer.getSessionProperty(TIMESTAMP_COMPILE_COMMANDS_PROPERTY); @@ -207,7 +191,7 @@ public class CompileCommandsJsonParser { return false; } - detectBuiltins(launcher, console, monitor); + detectBuiltins(monitor); // store time-stamp buildContainer.setSessionProperty(TIMESTAMP_COMPILE_COMMANDS_PROPERTY, tsJsonModified); return true; @@ -274,31 +258,25 @@ public class CompileCommandsJsonParser { } /** - * @param launcher the launcher to run the compiler for built-in detection. - * Should be capable to run in docker container, if build in - * container is configured for the project. - * @param console the console to print the compiler output during built-in - * detection to or <code>null</code> if a separate console is to - * be allocated. * @param monitor * @throws CoreException */ - private void detectBuiltins(ICommandLauncher launcher, IConsole console, IProgressMonitor monitor) - throws CoreException { - if (builtinDetectorsToRun == null || builtinDetectorsToRun.isEmpty()) + private void detectBuiltins(IProgressMonitor monitor) throws CoreException { + if (builtinDetectorsToRun.isEmpty()) return; monitor.setTaskName(Messages.CompileCommandsJsonParser_msg_detecting_builtins); - java.nio.file.Path buildDir = cBuildConfiguration.getBuildDirectory(); + java.nio.file.Path buildDir = parseRequest.getBuildConfiguration().getBuildDirectory(); // run each built-in detector and collect the results.. Map<String, IRawIndexerInfo> builtinDetectorsResults = new HashMap<>(); for (Entry<String, CompilerBuiltinsDetector> entry : builtinDetectorsToRun.entrySet()) { - IRawIndexerInfo result = entry.getValue().detectBuiltins(cBuildConfiguration.getBuildConfiguration(), - buildDir, launcher, console, monitor); + IRawIndexerInfo result = entry.getValue().detectBuiltins( + parseRequest.getBuildConfiguration().getBuildConfiguration(), buildDir, parseRequest.getLauncher(), + parseRequest.getConsole(), monitor); // store detector key with result builtinDetectorsResults.put(entry.getKey(), result); } - // all built-in detectors have been run at this point + // all built-in detectors have been run at this point, reduce memory footprint builtinDetectorsToRun.clear(); // most of the time we get different String objects for different source files @@ -361,7 +339,8 @@ public class CompileCommandsJsonParser { .map(stringPooler).collect(Collectors.toList()); // feed the paths and defines with the file name to the indexer.. - indexerInfoConsumer.acceptSourceFileInfo(sourceFileName, systemIncludePaths, effectiveDefines, includePaths); + parseRequest.getIndexerInfoConsumer().acceptSourceFileInfo(sourceFileName, systemIncludePaths, effectiveDefines, + includePaths); } private static void createMarker(IResource rc, String message) throws CoreException { @@ -431,14 +410,9 @@ public class CompileCommandsJsonParser { /** * Parses the {@code compile_commands.json} file in the build directory of the - * project if necessary and generates indexer information. - * - * @param launcher the launcher to run the compiler for built-in detection. - * Should be capable to run in docker container, if build in - * container is configured for the project. - * @param console the console to print the compiler output during built-in - * detection to or <code>null</code> if a separate console is to - * be allocated. + * build configuration if necessary and generates indexer information. If the JSON file did not change since the last invocation + * of this method on the same build configuration, parsing of the file will be skipped; that is: + * Method {@link IIndexerInfoConsumer#accept()} is not invoked. * @param monitor the job's progress monitor * * @return {@code true} if the {@code compile_commands.json} file did change @@ -447,20 +421,25 @@ public class CompileCommandsJsonParser { * indexer should be notified. * @throws CoreException */ - public boolean parse(ICommandLauncher launcher, IConsole console, IProgressMonitor monitor) throws CoreException { + public boolean parse(IProgressMonitor monitor) throws CoreException { long start = 0; + fileResults = new HashMap<>(); + builtinDetectorsToRun = new HashMap<>(); + fileToBuiltinDetectorLinks = new HashMap<>(); + try { if (DEBUG_TIME) { System.out.printf("Project %s parsing compile_commands.json ...%n", //$NON-NLS-1$ - cBuildConfiguration.getProject().getName()); + parseRequest.getBuildConfiguration().getProject().getName()); start = System.currentTimeMillis(); } - return processJsonFile(launcher, console, monitor); + return processJsonFile(monitor); } finally { + parseRequest.getIndexerInfoConsumer().shutdown(); if (DEBUG_TIME) { long end = System.currentTimeMillis(); System.out.printf("Project %s parsed compile_commands.json file in %dms%n", //$NON-NLS-1$ - cBuildConfiguration.getProject().getName(), end - start); + parseRequest.getBuildConfiguration().getProject().getName(), end - start); } // clean up builtinDetectorsToRun = null; @@ -474,9 +453,14 @@ public class CompileCommandsJsonParser { * run. * * @param compilerCommand the command name of the compiler - * @param builtinDetectionArgs compiler arguments that affect built-ins - * detection + * @param builtinDetectionArgs the compiler arguments from the command-line that + * affect built-in detection. For the GNU compilers, + * these are options like {@code --sysroot} and + * options that specify the language's standard + * ({@code -std=c++17}. * @param sourceFileExtension the extension of the source file name + * @return a Map-key suitable to minimize the set of CompilerBuiltinsDetector to + * run */ @SuppressWarnings("nls") private static String makeBuiltinsDetectorKey(String compilerCommand, List<String> builtinDetectionArgs, @@ -504,27 +488,20 @@ public class CompileCommandsJsonParser { * @param result */ private void rememberFileResult(String sourceFileName, IRawIndexerInfo result) { - if (fileResults == null) - fileResults = new HashMap<>(); fileResults.put(sourceFileName, result); } /** * @param sourceFileName the name of the source file + * @param compilerCommand the command name of the compiler * @param builtinDetectionArgs the compiler arguments from the command-line that * affect built-in detection. For the GNU compilers, * these are options like {@code --sysroot} and * options that specify the language's standard * ({@code -std=c++17}. - * @return a Map-key suitable to minimize the set of CompilerBuiltinsDetector to - * run */ - private String rememberBuiltinsDetection(String sourceFileName, - IBuiltinsDetectionBehavior builtinsDetectionBehavior, String compilerCommand, - List<String> builtinDetectionArgs) { - if (builtinDetectorsToRun == null) - builtinDetectorsToRun = new HashMap<>(3, 1.0f); - + private void rememberBuiltinsDetection(String sourceFileName, IBuiltinsDetectionBehavior builtinsDetectionBehavior, + String compilerCommand, List<String> builtinDetectionArgs) { String extension = FilenameUtils.getExtension(sourceFileName); String key = makeBuiltinsDetectorKey(compilerCommand, builtinDetectionArgs, extension); if (!builtinDetectorsToRun.containsKey(key)) { @@ -533,11 +510,7 @@ public class CompileCommandsJsonParser { builtinDetectorsToRun.put(key, detector); } // remember the built-ins detector for the source file - if (fileToBuiltinDetectorLinks == null) - fileToBuiltinDetectorLinks = new HashMap<>(); - fileToBuiltinDetectorLinks.put(sourceFileName, key); - return key; } } diff --git a/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/IIndexerInfoConsumer.java b/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/IIndexerInfoConsumer.java index 2d3e7c27175..a921dd1e4c5 100644 --- a/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/IIndexerInfoConsumer.java +++ b/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/IIndexerInfoConsumer.java @@ -15,20 +15,39 @@ import java.util.List; import java.util.Map; /** - * Receives the indexer relevant information for each source file. + * Receives the indexer relevant information for each source file while a {@link + * CompileCommandsJsonParser#parse() compile_commands.json file is parsed}. + * + * @see CompileCommandsJsonParser * * @author weber */ public interface IIndexerInfoConsumer { - // TODO Docs - // Yes. Docs are currently intentionally missing here, since ATM it is not clear how to properly handle the sourceFileName argument. - // // Cmake writes filenames with forward slashes (/) even if it runs on windows. // OTOH, IScannerInfoProvider requests info for IResourceS. - // Somewhere in the calling sequence, the filenames have to be converted/mapped to IResource.Conversion*could* + // Somewhere in the calling sequence, the filenames have to be converted/mapped to IResource. Conversion *could* // be done in CompileCommandsJsonParser, but when I think of builds running // in a Linux-Docker-Container under windows, it might be better to do the conversion - //on the IIndexerInfoConsumer side which has more information on the build setup. + // on the IIndexerInfoConsumer side which has more information on the build setup. + + /** Adds indexer relevant information for a single source file. + * + * @param sourceFileName + * the name of the source file, in CMake notation. Note that on windows, CMake writes filenames with forward + * slashes (/) such as {@code H://path//to//source.c}. + * @param systemIncludePaths + * the system include paths ({@code #include <...>}) used to compile the given source file + * @param definedSymbols + * the preprocessor macros used to compile the given source file + * @param includePaths + * the local include paths ({@code #include "..."}) used to compile the given source file + */ void acceptSourceFileInfo(String sourceFileName, List<String> systemIncludePaths, Map<String, String> definedSymbols, List<String> includePaths); + + /** + * Notifies this consumer that no further calls to {link {@link #acceptSourceFileInfo(String, List, Map, List)} will + * happen during the current parse operation. + */ + void shutdown(); } diff --git a/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/ParseRequest.java b/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/ParseRequest.java new file mode 100644 index 00000000000..913e042056e --- /dev/null +++ b/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/ParseRequest.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright (c) 2020 Martin Weber. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ + +package org.eclipse.cdt.cmake.is.core; + +import java.util.Objects; + +import org.eclipse.cdt.core.ICommandLauncher; +import org.eclipse.cdt.core.build.CBuildConfiguration; +import org.eclipse.cdt.core.resources.IConsole; + +/** Holds the arguments used to create a {@link CompileCommandsJsonParser}. + * + * @author weber + */ +public final class ParseRequest { + private final CBuildConfiguration buildConfiguration; + private final IIndexerInfoConsumer indexerInfoConsumer; + private final ICommandLauncher launcher; + private final IConsole console; + + /** Creates a new ParseRequest object. + * + * @param buildConfiguration the build configuration of the project + * @param indexerInfoConsumer the object that receives the indexer relevant + * information for each source file + * @param launcher the launcher to run the compiler for built-ins detection. + * Should be capable to run in docker container, if build in + * container is configured for the project. + * @param console the console to print the compiler output during built-ins + * detection to or <code>null</code> if no console output is requested. + * Ignored if workspace preferences indicate that no console output is wanted. + */ + public ParseRequest(CBuildConfiguration buildConfiguration, IIndexerInfoConsumer indexerInfoConsumer, + ICommandLauncher launcher, IConsole console) { + this.buildConfiguration = Objects.requireNonNull(buildConfiguration, "buildConfiguration"); //$NON-NLS-1$ + this.indexerInfoConsumer = Objects.requireNonNull(indexerInfoConsumer, "indexerInfoConsumer"); //$NON-NLS-1$ + this.launcher = Objects.requireNonNull(launcher, "launcher"); //$NON-NLS-1$ + this.console = console; + } + + /** Gets the build configuration of the project. + */ + public CBuildConfiguration getBuildConfiguration() { + return buildConfiguration; + } + + /** Gets the object that receives the indexer relevant + * information for each source file + */ + public IIndexerInfoConsumer getIndexerInfoConsumer() { + return indexerInfoConsumer; + } + + /** Gets the launcher to run the compiler for built-ins detection. + */ + public ICommandLauncher getLauncher() { + return launcher; + } + + /** Gets the console to print the compiler output during built-ins detection to. + * + * @return the console or <code>null</code> if no console output is requested. + */ + public IConsole getConsole() { + return console; + } +} diff --git a/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/internal/builtins/CompilerBuiltinsDetector.java b/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/internal/builtins/CompilerBuiltinsDetector.java index f8331b29706..dc72cf15f58 100644 --- a/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/internal/builtins/CompilerBuiltinsDetector.java +++ b/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/internal/builtins/CompilerBuiltinsDetector.java @@ -51,11 +51,6 @@ import org.osgi.framework.FrameworkUtil; * @author Martin Weber */ public class CompilerBuiltinsDetector { - /** - * console ID for extension point org.eclipse.cdt.core.CBuildConsole (see - * plugin.xml) - */ - private static final String CONSOLE_ID = Plugin.PLUGIN_ID + ".detectorConsole"; //$NON-NLS-1$ /** error marker ID */ private static final String MARKER_ID = Plugin.PLUGIN_ID + ".CompilerBuiltinsDetectorMarker"; //$NON-NLS-1$ @@ -94,8 +89,7 @@ public class CompilerBuiltinsDetector { * @param launcher the launcher that can run in docker container, if * any * @param console the console to print the compiler output to or - * <code>null</code> if a separate console is to be - * allocated. + * <code>null</code> if no console output is requested. * @throws CoreException */ public IRawIndexerInfo detectBuiltins(IBuildConfiguration buildConfiguration, java.nio.file.Path theBuildDirectory, @@ -240,16 +234,8 @@ public class CompilerBuiltinsDetector { IParserPreferences prefs = EclipseContextFactory .getServiceContext(FrameworkUtil.getBundle(getClass()).getBundleContext()) .get(IParserPreferencesAccess.class).getWorkspacePreferences(); - if (!prefs.getAllocateConsole()) { - return null; // no console to allocate - } else { + if (console != null && prefs.getAllocateConsole()) { IProject project = buildConfiguration.getProject(); - if (console == null) { - // need to allocate console, but none is given - String consoleId = CONSOLE_ID + "." + project.getName(); //$NON-NLS-1$ - console = CCorePlugin.getDefault().getConsole(CONSOLE_ID, consoleId, null, null); - } - console.start(project); try { final ConsoleOutputStream cis = console.getInfoStream(); @@ -262,8 +248,9 @@ public class CompilerBuiltinsDetector { cis.write("\n".getBytes()); //$NON-NLS-1$ } catch (IOException ignore) { } + return console; } - return console; + return null; // no console to allocate } } diff --git a/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/internal/messages.properties b/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/internal/messages.properties index e19e075194c..2055f216fd3 100644 --- a/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/internal/messages.properties +++ b/cmake/org.eclipse.cdt.cmake.is.core/src/main/java/org/eclipse/cdt/cmake/is/core/internal/messages.properties @@ -12,7 +12,7 @@ # Martin Weber - initial API and implementation ############################################################################### ParserPreferencesAccess_e_get_preferences=Unable to get preferences for node: {0}.{1} -ParserPreferencesMetadata_label_console=&Show output of compiler built-in detection in a console in the Console View +ParserPreferencesMetadata_label_console=&Show output of compiler built-in detection in the build console ParserPreferencesMetadata_label_suffix=&Suffix pattern: ParserPreferencesMetadata_label_try_suffix=&Also try with version suffix ParserPreferencesMetadata_ttip_suffix=Specify a Java regular expression pattern here