1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-21 21:52:10 +02:00

Bug 559674: Integrate new indexer support into CDT build

Change-Id: Ie07e6283f8285e56b7f74f29a8db1cbe222e0304
Signed-off-by: Martin Weber <fifteenknots505@gmail.com>
This commit is contained in:
Martin Weber 2020-06-10 21:38:33 +02:00
parent 94f1bb0f30
commit 005b82195b
9 changed files with 964 additions and 141 deletions

View file

@ -11,7 +11,8 @@ Require-Bundle: org.eclipse.core.runtime,
org.eclipse.launchbar.core;bundle-version="2.0.0", org.eclipse.launchbar.core;bundle-version="2.0.0",
org.eclipse.cdt.core;bundle-version="5.12.0", org.eclipse.cdt.core;bundle-version="5.12.0",
org.eclipse.tools.templates.freemarker;bundle-version="1.0.0";visibility:=reexport, 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-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy Bundle-ActivationPolicy: lazy
Export-Package: org.eclipse.cdt.cmake.core, Export-Package: org.eclipse.cdt.cmake.core,

View file

@ -11,7 +11,6 @@
package org.eclipse.cdt.cmake.core.internal; package org.eclipse.cdt.cmake.core.internal;
import java.io.File; import java.io.File;
import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.nio.file.FileVisitResult; import java.nio.file.FileVisitResult;
import java.nio.file.Files; import java.nio.file.Files;
@ -23,9 +22,15 @@ import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; 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.ICMakeToolChainFile;
import org.eclipse.cdt.cmake.core.ICMakeToolChainManager; 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.ConsoleOutputStream;
import org.eclipse.cdt.core.ErrorParserManager; import org.eclipse.cdt.core.ErrorParserManager;
import org.eclipse.cdt.core.IConsoleParser; 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.EnvironmentVariable;
import org.eclipse.cdt.core.envvar.IEnvironmentVariable; import org.eclipse.cdt.core.envvar.IEnvironmentVariable;
import org.eclipse.cdt.core.model.ICModelMarker; 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.cdt.core.resources.IConsole;
import org.eclipse.core.resources.IBuildConfiguration; import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.Job;
import com.google.gson.Gson;
public class CMakeBuildConfiguration extends CBuildConfiguration { public class CMakeBuildConfiguration extends CBuildConfiguration {
public static final String CMAKE_GENERATOR = "cmake.generator"; //$NON-NLS-1$ 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$ public static final String CLEAN_COMMAND = "cmake.command.clean"; //$NON-NLS-1$
private ICMakeToolChainFile toolChainFile; private ICMakeToolChainFile toolChainFile;
private Map<IResource, IScannerInfo> infoPerResource;
public CMakeBuildConfiguration(IBuildConfiguration config, String name) throws CoreException { public CMakeBuildConfiguration(IBuildConfiguration config, String name) throws CoreException {
super(config, name); super(config, name);
@ -95,6 +104,7 @@ public class CMakeBuildConfiguration extends CBuildConfiguration {
} }
project.deleteMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE); project.deleteMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);
infoPerResource = new HashMap<>();
ConsoleOutputStream outStream = console.getOutputStream(); ConsoleOutputStream outStream = console.getOutputStream();
@ -222,8 +232,10 @@ public class CMakeBuildConfiguration extends CBuildConfiguration {
project.refreshLocal(IResource.DEPTH_INFINITE, monitor); project.refreshLocal(IResource.DEPTH_INFINITE, monitor);
// Load compile_commands.json file // parse compile_commands.json file
processCompileCommandsFile(monitor); // 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(), outStream.write(String.format(Messages.CMakeBuildConfiguration_BuildingComplete, epm.getErrorCount(),
epm.getWarningCount(), buildDir.toString())); epm.getWarningCount(), buildDir.toString()));
@ -290,38 +302,22 @@ public class CMakeBuildConfiguration extends CBuildConfiguration {
} }
} }
private void processCompileCommandsFile(IProgressMonitor monitor) throws CoreException { /**
IProject project = getProject(); * @param console the console to print the compiler output during built-ins
Path commandsFile = getBuildDirectory().resolve("compile_commands.json"); //$NON-NLS-1$ * detection to or <code>null</code> if no separate console is to
if (Files.exists(commandsFile)) { * be allocated. Ignored if workspace preferences indicate that
List<Job> jobsList = new ArrayList<>(); * no console output is wanted.
monitor.setTaskName(Messages.CMakeBuildConfiguration_ProcCompJson); * @param monitor the job's progress monitor
try (FileReader reader = new FileReader(commandsFile.toFile())) { */
Gson gson = new Gson(); private void processCompileCommandsFile(IConsole console, IProgressMonitor monitor) throws CoreException {
CompileCommand[] commands = gson.fromJson(reader, CompileCommand[].class); CompileCommandsJsonParser parser = new CompileCommandsJsonParser(
Map<String, CompileCommand> dedupedCmds = new HashMap<>(); new ParseRequest(this, new CMakeIndexerInfoConsumer(this::setScannerInformation),
for (CompileCommand command : commands) { CommandLauncherManager.getInstance().getCommandLauncher(this), console));
dedupedCmds.put(command.getFile(), command); parser.parse(monitor);
}
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));
}
}
} }
/** 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 { private static void cleanDirectory(Path dir) throws IOException {
SimpleFileVisitor<Path> deltor = new SimpleFileVisitor<Path>() { SimpleFileVisitor<Path> deltor = new SimpleFileVisitor<Path>() {
@ -351,4 +347,111 @@ public class CMakeBuildConfiguration extends CBuildConfiguration {
cleanDirectory(buildDir); cleanDirectory(buildDir);
// TODO: not a directory should we do something? // 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() {
}
} }

View file

@ -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&#13;&#10;-Xmx512M&#13;&#10;-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>

View file

@ -3,13 +3,6 @@
<plugin> <plugin>
<extension-point id="detectionParticipant" name="%extension-point.name" schema="schema/participant.exsd"/> <extension-point id="detectionParticipant" name="%extension-point.name" schema="schema/participant.exsd"/>
"org.eclipse.cdt.cmake.is.core.internal.ui.CompileCommandsJsonParserOptionPage"> "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 <extension
id="CompileCommandsJsonParserMarker" id="CompileCommandsJsonParserMarker"
name="CMake compile_commands.json parser" name="CMake compile_commands.json parser"

View file

@ -13,6 +13,7 @@ import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.io.Reader; import java.io.Reader;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; 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.IToolCommandlineParser.IResult;
import org.eclipse.cdt.cmake.is.core.participant.IToolDetectionParticipant; import org.eclipse.cdt.cmake.is.core.participant.IToolDetectionParticipant;
import org.eclipse.cdt.cmake.is.core.participant.builtins.IBuiltinsDetectionBehavior; 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.build.CBuildConfiguration;
import org.eclipse.cdt.core.resources.IConsole;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
@ -68,13 +67,6 @@ import com.google.gson.JsonSyntaxException;
* *
* @author Martin Weber * @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 { public class CompileCommandsJsonParser {
private static final boolean DEBUG_TIME = Boolean private static final boolean DEBUG_TIME = Boolean
.parseBoolean(Platform.getDebugOption(Plugin.PLUGIN_ID + "/debug/performance")); //$NON-NLS-1$ .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 static final String MARKER_ID = Plugin.PLUGIN_ID + ".CompileCommandsJsonParserMarker"; //$NON-NLS-1$
private final CBuildConfiguration cBuildConfiguration; private ParseRequest parseRequest;
private final IIndexerInfoConsumer indexerInfoConsumer;
private final IParserPreferencesAccess prefsAccess; 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} * 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 parseRequest the parser configuration
* @param indexerInfoConsumer the objects that receives the indexer relevant
* information for each source file
*/ */
public CompileCommandsJsonParser(CBuildConfiguration buildConfiguration, IIndexerInfoConsumer indexerInfoConsumer) { // TODO interface ICBuildConfiguration should be sufficient here
this.cBuildConfiguration = Objects.requireNonNull(buildConfiguration, "buildConfiguration"); //$NON-NLS-1$ public CompileCommandsJsonParser(ParseRequest parseRequest) {
this.indexerInfoConsumer = Objects.requireNonNull(indexerInfoConsumer, "indexerInfoConsumer"); //$NON-NLS-1$ this.parseRequest = Objects.requireNonNull(parseRequest, "parseRequest"); //$NON-NLS-1$
prefsAccess = EclipseContextFactory.getServiceContext(FrameworkUtil.getBundle(getClass()).getBundleContext()) prefsAccess = EclipseContextFactory.getServiceContext(FrameworkUtil.getBundle(getClass()).getBundleContext())
.get(IParserPreferencesAccess.class); .get(IParserPreferencesAccess.class);
} }
/** /**
* Parses the content of the 'compile_commands.json' file corresponding to the * Parses the content of the 'compile_commands.json' file corresponding to the
* specified configuration, if timestamps differ. * specified configuration, if time-stamps 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.
* @param monitor the job's progress monitor * @param monitor the job's progress monitor
* *
* @return {@code true} if the json file did change since the last invocation of * @return {@code true} if the json file did change since the last invocation of
@ -158,10 +141,11 @@ public class CompileCommandsJsonParser {
* {@code false} * {@code false}
* @throws CoreException * @throws CoreException
*/ */
private boolean processJsonFile(ICommandLauncher launcher, IConsole console, IProgressMonitor monitor) private boolean processJsonFile(IProgressMonitor monitor) throws CoreException {
throws CoreException { final CBuildConfiguration configuration = parseRequest.getBuildConfiguration();
final IProject project = cBuildConfiguration.getBuildConfiguration().getProject(); final IProject project = configuration.getBuildConfiguration().getProject();
java.nio.file.Path buildRoot = cBuildConfiguration.getBuildDirectory(); java.nio.file.Path buildRoot = Paths.get(configuration.getBuildDirectoryURI());
final java.nio.file.Path jsonFile = buildRoot.resolve("compile_commands.json"); //$NON-NLS-1$ final java.nio.file.Path jsonFile = buildRoot.resolve("compile_commands.json"); //$NON-NLS-1$
if (!Files.exists(jsonFile)) { if (!Files.exists(jsonFile)) {
// no json file was produced in the build // no json file was produced in the build
@ -178,7 +162,7 @@ public class CompileCommandsJsonParser {
// tread as 'file does nor exist' // tread as 'file does nor exist'
return false; return false;
} }
IContainer buildContainer = cBuildConfiguration.getBuildContainer(); IContainer buildContainer = configuration.getBuildContainer();
final IFile jsonFileRc = buildContainer.getFile(new Path("compile_commands.json")); //$NON-NLS-1$ final IFile jsonFileRc = buildContainer.getFile(new Path("compile_commands.json")); //$NON-NLS-1$
Long sessionLastModified = (Long) buildContainer.getSessionProperty(TIMESTAMP_COMPILE_COMMANDS_PROPERTY); Long sessionLastModified = (Long) buildContainer.getSessionProperty(TIMESTAMP_COMPILE_COMMANDS_PROPERTY);
@ -207,7 +191,7 @@ public class CompileCommandsJsonParser {
return false; return false;
} }
detectBuiltins(launcher, console, monitor); detectBuiltins(monitor);
// store time-stamp // store time-stamp
buildContainer.setSessionProperty(TIMESTAMP_COMPILE_COMMANDS_PROPERTY, tsJsonModified); buildContainer.setSessionProperty(TIMESTAMP_COMPILE_COMMANDS_PROPERTY, tsJsonModified);
return true; 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 * @param monitor
* @throws CoreException * @throws CoreException
*/ */
private void detectBuiltins(ICommandLauncher launcher, IConsole console, IProgressMonitor monitor) private void detectBuiltins(IProgressMonitor monitor) throws CoreException {
throws CoreException { if (builtinDetectorsToRun.isEmpty())
if (builtinDetectorsToRun == null || builtinDetectorsToRun.isEmpty())
return; return;
monitor.setTaskName(Messages.CompileCommandsJsonParser_msg_detecting_builtins); 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.. // run each built-in detector and collect the results..
Map<String, IRawIndexerInfo> builtinDetectorsResults = new HashMap<>(); Map<String, IRawIndexerInfo> builtinDetectorsResults = new HashMap<>();
for (Entry<String, CompilerBuiltinsDetector> entry : builtinDetectorsToRun.entrySet()) { for (Entry<String, CompilerBuiltinsDetector> entry : builtinDetectorsToRun.entrySet()) {
IRawIndexerInfo result = entry.getValue().detectBuiltins(cBuildConfiguration.getBuildConfiguration(), IRawIndexerInfo result = entry.getValue().detectBuiltins(
buildDir, launcher, console, monitor); parseRequest.getBuildConfiguration().getBuildConfiguration(), buildDir, parseRequest.getLauncher(),
parseRequest.getConsole(), monitor);
// store detector key with result // store detector key with result
builtinDetectorsResults.put(entry.getKey(), 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(); builtinDetectorsToRun.clear();
// most of the time we get different String objects for different source files // 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()); .map(stringPooler).collect(Collectors.toList());
// feed the paths and defines with the file name to the indexer.. // 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 { 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 * Parses the {@code compile_commands.json} file in the build directory of the
* project if necessary and generates indexer information. * 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:
* @param launcher the launcher to run the compiler for built-in detection. * Method {@link IIndexerInfoConsumer#accept()} is not invoked.
* 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 the job's progress monitor * @param monitor the job's progress monitor
* *
* @return {@code true} if the {@code compile_commands.json} file did change * @return {@code true} if the {@code compile_commands.json} file did change
@ -447,20 +421,25 @@ public class CompileCommandsJsonParser {
* indexer should be notified. * indexer should be notified.
* @throws CoreException * @throws CoreException
*/ */
public boolean parse(ICommandLauncher launcher, IConsole console, IProgressMonitor monitor) throws CoreException { public boolean parse(IProgressMonitor monitor) throws CoreException {
long start = 0; long start = 0;
fileResults = new HashMap<>();
builtinDetectorsToRun = new HashMap<>();
fileToBuiltinDetectorLinks = new HashMap<>();
try { try {
if (DEBUG_TIME) { if (DEBUG_TIME) {
System.out.printf("Project %s parsing compile_commands.json ...%n", //$NON-NLS-1$ System.out.printf("Project %s parsing compile_commands.json ...%n", //$NON-NLS-1$
cBuildConfiguration.getProject().getName()); parseRequest.getBuildConfiguration().getProject().getName());
start = System.currentTimeMillis(); start = System.currentTimeMillis();
} }
return processJsonFile(launcher, console, monitor); return processJsonFile(monitor);
} finally { } finally {
parseRequest.getIndexerInfoConsumer().shutdown();
if (DEBUG_TIME) { if (DEBUG_TIME) {
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
System.out.printf("Project %s parsed compile_commands.json file in %dms%n", //$NON-NLS-1$ 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 // clean up
builtinDetectorsToRun = null; builtinDetectorsToRun = null;
@ -474,9 +453,14 @@ public class CompileCommandsJsonParser {
* run. * run.
* *
* @param compilerCommand the command name of the compiler * @param compilerCommand the command name of the compiler
* @param builtinDetectionArgs compiler arguments that affect built-ins * @param builtinDetectionArgs the compiler arguments from the command-line that
* detection * 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 * @param sourceFileExtension the extension of the source file name
* @return a Map-key suitable to minimize the set of CompilerBuiltinsDetector to
* run
*/ */
@SuppressWarnings("nls") @SuppressWarnings("nls")
private static String makeBuiltinsDetectorKey(String compilerCommand, List<String> builtinDetectionArgs, private static String makeBuiltinsDetectorKey(String compilerCommand, List<String> builtinDetectionArgs,
@ -504,27 +488,20 @@ public class CompileCommandsJsonParser {
* @param result * @param result
*/ */
private void rememberFileResult(String sourceFileName, IRawIndexerInfo result) { private void rememberFileResult(String sourceFileName, IRawIndexerInfo result) {
if (fileResults == null)
fileResults = new HashMap<>();
fileResults.put(sourceFileName, result); fileResults.put(sourceFileName, result);
} }
/** /**
* @param sourceFileName the name of the source file * @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 * @param builtinDetectionArgs the compiler arguments from the command-line that
* affect built-in detection. For the GNU compilers, * affect built-in detection. For the GNU compilers,
* these are options like {@code --sysroot} and * these are options like {@code --sysroot} and
* options that specify the language's standard * options that specify the language's standard
* ({@code -std=c++17}. * ({@code -std=c++17}.
* @return a Map-key suitable to minimize the set of CompilerBuiltinsDetector to
* run
*/ */
private String rememberBuiltinsDetection(String sourceFileName, private void rememberBuiltinsDetection(String sourceFileName, IBuiltinsDetectionBehavior builtinsDetectionBehavior,
IBuiltinsDetectionBehavior builtinsDetectionBehavior, String compilerCommand, String compilerCommand, List<String> builtinDetectionArgs) {
List<String> builtinDetectionArgs) {
if (builtinDetectorsToRun == null)
builtinDetectorsToRun = new HashMap<>(3, 1.0f);
String extension = FilenameUtils.getExtension(sourceFileName); String extension = FilenameUtils.getExtension(sourceFileName);
String key = makeBuiltinsDetectorKey(compilerCommand, builtinDetectionArgs, extension); String key = makeBuiltinsDetectorKey(compilerCommand, builtinDetectionArgs, extension);
if (!builtinDetectorsToRun.containsKey(key)) { if (!builtinDetectorsToRun.containsKey(key)) {
@ -533,11 +510,7 @@ public class CompileCommandsJsonParser {
builtinDetectorsToRun.put(key, detector); builtinDetectorsToRun.put(key, detector);
} }
// remember the built-ins detector for the source file // remember the built-ins detector for the source file
if (fileToBuiltinDetectorLinks == null)
fileToBuiltinDetectorLinks = new HashMap<>();
fileToBuiltinDetectorLinks.put(sourceFileName, key); fileToBuiltinDetectorLinks.put(sourceFileName, key);
return key;
} }
} }

View file

@ -15,20 +15,39 @@ import java.util.List;
import java.util.Map; 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 * @author weber
*/ */
public interface IIndexerInfoConsumer { 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. // Cmake writes filenames with forward slashes (/) even if it runs on windows.
// OTOH, IScannerInfoProvider requests info for IResourceS. // 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 // 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 // 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, void acceptSourceFileInfo(String sourceFileName, List<String> systemIncludePaths,
Map<String, String> definedSymbols, List<String> includePaths); 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();
} }

View file

@ -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;
}
}

View file

@ -51,11 +51,6 @@ import org.osgi.framework.FrameworkUtil;
* @author Martin Weber * @author Martin Weber
*/ */
public class CompilerBuiltinsDetector { 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 */ /** error marker ID */
private static final String MARKER_ID = Plugin.PLUGIN_ID + ".CompilerBuiltinsDetectorMarker"; //$NON-NLS-1$ 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 * @param launcher the launcher that can run in docker container, if
* any * any
* @param console the console to print the compiler output to or * @param console the console to print the compiler output to or
* <code>null</code> if a separate console is to be * <code>null</code> if no console output is requested.
* allocated.
* @throws CoreException * @throws CoreException
*/ */
public IRawIndexerInfo detectBuiltins(IBuildConfiguration buildConfiguration, java.nio.file.Path theBuildDirectory, public IRawIndexerInfo detectBuiltins(IBuildConfiguration buildConfiguration, java.nio.file.Path theBuildDirectory,
@ -240,16 +234,8 @@ public class CompilerBuiltinsDetector {
IParserPreferences prefs = EclipseContextFactory IParserPreferences prefs = EclipseContextFactory
.getServiceContext(FrameworkUtil.getBundle(getClass()).getBundleContext()) .getServiceContext(FrameworkUtil.getBundle(getClass()).getBundleContext())
.get(IParserPreferencesAccess.class).getWorkspacePreferences(); .get(IParserPreferencesAccess.class).getWorkspacePreferences();
if (!prefs.getAllocateConsole()) { if (console != null && prefs.getAllocateConsole()) {
return null; // no console to allocate
} else {
IProject project = buildConfiguration.getProject(); 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); console.start(project);
try { try {
final ConsoleOutputStream cis = console.getInfoStream(); final ConsoleOutputStream cis = console.getInfoStream();
@ -262,8 +248,9 @@ public class CompilerBuiltinsDetector {
cis.write("\n".getBytes()); //$NON-NLS-1$ cis.write("\n".getBytes()); //$NON-NLS-1$
} catch (IOException ignore) { } catch (IOException ignore) {
} }
return console;
} }
return console; return null; // no console to allocate
} }
} }

View file

@ -12,7 +12,7 @@
# Martin Weber - initial API and implementation # Martin Weber - initial API and implementation
############################################################################### ###############################################################################
ParserPreferencesAccess_e_get_preferences=Unable to get preferences for node: {0}.{1} 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_suffix=&Suffix pattern:
ParserPreferencesMetadata_label_try_suffix=&Also try with version suffix ParserPreferencesMetadata_label_try_suffix=&Also try with version suffix
ParserPreferencesMetadata_ttip_suffix=Specify a Java regular expression pattern here ParserPreferencesMetadata_ttip_suffix=Specify a Java regular expression pattern here