1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 09:46:02 +02:00

generalize indexer-support API

Use IFile to specify the file to parse instead of a file-name implicitly
calculated from CBuildConfiguration.

Change-Id: If9d66a0b7533e9e403bc22fa21bf8e6e8fa80436
Signed-off-by: Martin Weber <fifteenknots505@gmail.com>
This commit is contained in:
Martin Weber 2020-11-10 20:58:33 +01:00
parent de80240232
commit 4d40c5b68f
5 changed files with 58 additions and 76 deletions

View file

@ -144,7 +144,7 @@ public class CMakeBuildConfiguration extends CBuildConfiguration {
runCMake = true; runCMake = true;
} }
ICMakeProperties cmakeProperties = pc.load(); ICMakeProperties cmakeProperties = getPropertiesController().load();
runCMake |= !Files.exists(buildDir.resolve("CMakeCache.txt")); //$NON-NLS-1$ runCMake |= !Files.exists(buildDir.resolve("CMakeCache.txt")); //$NON-NLS-1$
IOsOverrides overrides = extractCMakeOsOverrides(cmakeProperties); IOsOverrides overrides = extractCMakeOsOverrides(cmakeProperties);
@ -263,7 +263,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);
ICMakeProperties cmakeProperties = pc.load(); ICMakeProperties cmakeProperties = getPropertiesController().load();
IOsOverrides overrides = extractCMakeOsOverrides(cmakeProperties); IOsOverrides overrides = extractCMakeOsOverrides(cmakeProperties);
List<String> command = makeCMakeBuildCommandline(cmakeProperties, overrides, "clean"); //$NON-NLS-1$ List<String> command = makeCMakeBuildCommandline(cmakeProperties, overrides, "clean"); //$NON-NLS-1$
ConsoleOutputStream outStream = console.getOutputStream(); ConsoleOutputStream outStream = console.getOutputStream();
@ -430,8 +430,9 @@ public class CMakeBuildConfiguration extends CBuildConfiguration {
* @param monitor the job's progress monitor * @param monitor the job's progress monitor
*/ */
private void processCompileCommandsFile(IConsole console, IProgressMonitor monitor) throws CoreException { private void processCompileCommandsFile(IConsole console, IProgressMonitor monitor) throws CoreException {
IFile file = getBuildContainer().getFile(new org.eclipse.core.runtime.Path("compile_commands.json")); //$NON-NLS-1$
CompileCommandsJsonParser parser = new CompileCommandsJsonParser( CompileCommandsJsonParser parser = new CompileCommandsJsonParser(
new ParseRequest(this, new CMakeIndexerInfoConsumer(this::setScannerInformation), new ParseRequest(file, new CMakeIndexerInfoConsumer(this::setScannerInformation),
CommandLauncherManager.getInstance().getCommandLauncher(this), console)); CommandLauncherManager.getInstance().getCommandLauncher(this), console));
parser.parse(monitor); parser.parse(monitor);
} }
@ -464,7 +465,7 @@ public class CMakeBuildConfiguration extends CBuildConfiguration {
*/ */
private CMakePropertiesController getPropertiesController() { private CMakePropertiesController getPropertiesController() {
if (pc == null) { if (pc == null) {
Path filePath = Path.of(getProject().getFile(".settings/CDT-cmake.yaml").getLocationURI()); //$NON-NLS-1$ final Path filePath = Path.of(getProject().getFile(".settings/CDT-cmake.yaml").getLocationURI()); //$NON-NLS-1$
pc = new CMakePropertiesController(filePath, () -> { pc = new CMakePropertiesController(filePath, () -> {
deleteCMakeCache = true; deleteCMakeCache = true;
// TODO delete cache file here for the case a user restarts the workbench // TODO delete cache file here for the case a user restarts the workbench

View file

@ -13,7 +13,6 @@ 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;
@ -39,7 +38,6 @@ 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.build.CBuildConfiguration;
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;
@ -142,15 +140,14 @@ public class CompileCommandsJsonParser {
* @throws CoreException * @throws CoreException
*/ */
private boolean processJsonFile(IProgressMonitor monitor) throws CoreException { private boolean processJsonFile(IProgressMonitor monitor) throws CoreException {
final CBuildConfiguration configuration = parseRequest.getBuildConfiguration(); final IFile jsonFile = parseRequest.getFile();
final IProject project = configuration.getBuildConfiguration().getProject(); final IProject project = jsonFile.getProject();
java.nio.file.Path buildRoot = Paths.get(configuration.getBuildDirectoryURI());
project.deleteMarkers(MARKER_ID, false, IResource.DEPTH_INFINITE); project.deleteMarkers(MARKER_ID, false, IResource.DEPTH_INFINITE);
final java.nio.file.Path jsonFile = buildRoot.resolve("compile_commands.json"); //$NON-NLS-1$ final java.nio.file.Path jsonDiskFile = java.nio.file.Path.of(jsonFile.getLocationURI());
if (!Files.exists(jsonFile)) { if (!Files.exists(jsonDiskFile)) {
// no json file was produced in the build // no json file was produced in the build
final String msg = String.format(Messages.CompileCommandsJsonParser_errmsg_file_not_found, jsonFile, final String msg = String.format(Messages.CompileCommandsJsonParser_errmsg_file_not_found, jsonDiskFile,
WORKBENCH_WILL_NOT_KNOW_ALL_MSG); WORKBENCH_WILL_NOT_KNOW_ALL_MSG);
createMarker(project, msg); createMarker(project, msg);
return false; return false;
@ -158,42 +155,41 @@ public class CompileCommandsJsonParser {
// file exists on disk... // file exists on disk...
long tsJsonModified = 0; long tsJsonModified = 0;
try { try {
tsJsonModified = Files.getLastModifiedTime(jsonFile).toMillis(); tsJsonModified = Files.getLastModifiedTime(jsonDiskFile).toMillis();
} catch (IOException e) { } catch (IOException e) {
// treat as 'file is not modified' // treat as 'file is not modified'
return false; return false;
} }
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); IContainer buildRootFolder = jsonFile.getParent();
Long sessionLastModified = (Long) buildRootFolder.getSessionProperty(TIMESTAMP_COMPILE_COMMANDS_PROPERTY);
if (sessionLastModified == null || sessionLastModified.longValue() < tsJsonModified) { if (sessionLastModified == null || sessionLastModified.longValue() < tsJsonModified) {
// must parse json file... // must parse json file...
monitor.setTaskName(Messages.CompileCommandsJsonParser_msg_processing); monitor.setTaskName(Messages.CompileCommandsJsonParser_msg_processing);
try (Reader in = new FileReader(jsonFile.toFile())) { try (Reader in = new FileReader(jsonDiskFile.toFile())) {
// parse file... // parse file...
Gson gson = new Gson(); Gson gson = new Gson();
CommandEntry[] sourceFileInfos = gson.fromJson(in, CommandEntry[].class); CommandEntry[] sourceFileInfos = gson.fromJson(in, CommandEntry[].class);
for (CommandEntry sourceFileInfo : sourceFileInfos) { for (CommandEntry sourceFileInfo : sourceFileInfos) {
processCommandEntry(sourceFileInfo, jsonFileRc); processCommandEntry(sourceFileInfo, jsonFile);
} }
} catch (JsonSyntaxException | JsonIOException ex) { } catch (JsonSyntaxException | JsonIOException ex) {
// file format error // file format error
final String msg = String.format(Messages.CompileCommandsJsonParser_errmsg_not_json, jsonFile, final String msg = String.format(Messages.CompileCommandsJsonParser_errmsg_not_json, jsonDiskFile,
WORKBENCH_WILL_NOT_KNOW_ALL_MSG); WORKBENCH_WILL_NOT_KNOW_ALL_MSG);
createMarker(jsonFileRc, msg); createMarker(jsonFile, msg);
return false; return false;
} catch (IOException ex) { } catch (IOException ex) {
final String msg = String.format(Messages.CompileCommandsJsonParser_errmsg_read_error, jsonFile, final String msg = String.format(Messages.CompileCommandsJsonParser_errmsg_read_error, jsonDiskFile,
WORKBENCH_WILL_NOT_KNOW_ALL_MSG); WORKBENCH_WILL_NOT_KNOW_ALL_MSG);
createMarker(jsonFileRc, msg); createMarker(jsonFile, msg);
return false; return false;
} }
detectBuiltins(monitor); detectBuiltins(monitor);
// store time-stamp // store time-stamp
buildContainer.setSessionProperty(TIMESTAMP_COMPILE_COMMANDS_PROPERTY, tsJsonModified); buildRootFolder.setSessionProperty(TIMESTAMP_COMPILE_COMMANDS_PROPERTY, tsJsonModified);
return true; return true;
} }
return false; return false;
@ -266,13 +262,15 @@ public class CompileCommandsJsonParser {
return; return;
monitor.setTaskName(Messages.CompileCommandsJsonParser_msg_detecting_builtins); monitor.setTaskName(Messages.CompileCommandsJsonParser_msg_detecting_builtins);
java.nio.file.Path buildDir = parseRequest.getBuildConfiguration().getBuildDirectory(); final IFile jsonFile = parseRequest.getFile();
final IContainer buildRootFolder = jsonFile.getParent();
java.nio.file.Path buildDir = java.nio.file.Path.of(buildRootFolder.getLocationURI());
// 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( IRawIndexerInfo result = entry.getValue().detectBuiltins(jsonFile.getProject(), buildDir,
parseRequest.getBuildConfiguration().getBuildConfiguration(), buildDir, parseRequest.getLauncher(), parseRequest.getLauncher(), parseRequest.getConsole(), monitor);
parseRequest.getConsole(), monitor);
// store detector key with result // store detector key with result
builtinDetectorsResults.put(entry.getKey(), result); builtinDetectorsResults.put(entry.getKey(), result);
} }
@ -431,8 +429,8 @@ public class CompileCommandsJsonParser {
try { try {
if (DEBUG_TIME) { if (DEBUG_TIME) {
System.out.printf("Project %s parsing compile_commands.json ...%n", //$NON-NLS-1$ System.out.printf("Parsing file '%s' ...%n", //$NON-NLS-1$
parseRequest.getBuildConfiguration().getProject().getName()); parseRequest.getFile().getLocationURI().getPath());
start = System.currentTimeMillis(); start = System.currentTimeMillis();
} }
return processJsonFile(monitor); return processJsonFile(monitor);
@ -440,8 +438,8 @@ public class CompileCommandsJsonParser {
parseRequest.getIndexerInfoConsumer().shutdown(); 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("Parsed file '%s' in %dms%n", //$NON-NLS-1$
parseRequest.getBuildConfiguration().getProject().getName(), end - start); parseRequest.getFile().getLocationURI().getPath(), end - start);
} }
// clean up // clean up
builtinDetectorsToRun = null; builtinDetectorsToRun = null;

View file

@ -14,22 +14,22 @@ package org.eclipse.cdt.cmake.is.core;
import java.util.Objects; import java.util.Objects;
import org.eclipse.cdt.core.ICommandLauncher; 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.resources.IConsole;
import org.eclipse.core.resources.IFile;
/** Holds the arguments used to create a {@link CompileCommandsJsonParser}. /** Holds the arguments used to create a {@link CompileCommandsJsonParser}.
* *
* @author weber * @author weber
*/ */
public final class ParseRequest { public final class ParseRequest {
private final CBuildConfiguration buildConfiguration; private final IFile compileCommandsJson;
private final IIndexerInfoConsumer indexerInfoConsumer; private final IIndexerInfoConsumer indexerInfoConsumer;
private final ICommandLauncher launcher; private final ICommandLauncher launcher;
private final IConsole console; private final IConsole console;
/** Creates a new ParseRequest object. /** Creates a new ParseRequest object.
* *
* @param buildConfiguration the build configuration of the project * @param compileCommandsJsonFile the file to parse
* @param indexerInfoConsumer the object that receives the indexer relevant * @param indexerInfoConsumer the object that receives the indexer relevant
* information for each source file * information for each source file
* @param launcher the launcher to run the compiler for built-ins detection. * @param launcher the launcher to run the compiler for built-ins detection.
@ -39,18 +39,18 @@ public final class ParseRequest {
* detection to or <code>null</code> if no console output is requested. * detection to or <code>null</code> if no console output is requested.
* Ignored if workspace preferences indicate that no console output is wanted. * Ignored if workspace preferences indicate that no console output is wanted.
*/ */
public ParseRequest(CBuildConfiguration buildConfiguration, IIndexerInfoConsumer indexerInfoConsumer, public ParseRequest(IFile compileCommandsJsonFile, IIndexerInfoConsumer indexerInfoConsumer,
ICommandLauncher launcher, IConsole console) { ICommandLauncher launcher, IConsole console) {
this.buildConfiguration = Objects.requireNonNull(buildConfiguration, "buildConfiguration"); //$NON-NLS-1$ this.compileCommandsJson = Objects.requireNonNull(compileCommandsJsonFile, "compileCommandsJsonFile"); //$NON-NLS-1$
this.indexerInfoConsumer = Objects.requireNonNull(indexerInfoConsumer, "indexerInfoConsumer"); //$NON-NLS-1$ this.indexerInfoConsumer = Objects.requireNonNull(indexerInfoConsumer, "indexerInfoConsumer"); //$NON-NLS-1$
this.launcher = Objects.requireNonNull(launcher, "launcher"); //$NON-NLS-1$ this.launcher = Objects.requireNonNull(launcher, "launcher"); //$NON-NLS-1$
this.console = console; this.console = console;
} }
/** Gets the build configuration of the project. /** Gets the 'compile_commands.json' file to parse.
*/ */
public CBuildConfiguration getBuildConfiguration() { public IFile getFile() {
return buildConfiguration; return compileCommandsJson;
} }
/** Gets the object that receives the indexer relevant /** Gets the object that receives the indexer relevant

View file

@ -14,10 +14,8 @@ import java.nio.file.Files;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
import org.eclipse.cdt.cmake.is.core.IParserPreferences; import org.eclipse.cdt.cmake.is.core.IParserPreferences;
import org.eclipse.cdt.cmake.is.core.IParserPreferencesAccess; import org.eclipse.cdt.cmake.is.core.IParserPreferencesAccess;
@ -26,13 +24,9 @@ import org.eclipse.cdt.cmake.is.core.participant.IRawIndexerInfo;
import org.eclipse.cdt.cmake.is.core.participant.builtins.IBuiltinsDetectionBehavior; import org.eclipse.cdt.cmake.is.core.participant.builtins.IBuiltinsDetectionBehavior;
import org.eclipse.cdt.cmake.is.core.participant.builtins.IBuiltinsOutputProcessor; import org.eclipse.cdt.cmake.is.core.participant.builtins.IBuiltinsOutputProcessor;
import org.eclipse.cdt.cmake.is.core.participant.builtins.OutputSniffer; import org.eclipse.cdt.cmake.is.core.participant.builtins.OutputSniffer;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ConsoleOutputStream; import org.eclipse.cdt.core.ConsoleOutputStream;
import org.eclipse.cdt.core.ICommandLauncher; import org.eclipse.cdt.core.ICommandLauncher;
import org.eclipse.cdt.core.envvar.IEnvironmentVariable;
import org.eclipse.cdt.core.envvar.IEnvironmentVariableManager;
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.IMarker; import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -59,7 +53,7 @@ public class CompilerBuiltinsDetector {
private final List<String> builtinsDetectionArgs; private final List<String> builtinsDetectionArgs;
private final IBuiltinsDetectionBehavior builtinsDetectionBehavior; private final IBuiltinsDetectionBehavior builtinsDetectionBehavior;
private IBuildConfiguration buildConfiguration; private IProject project;
private java.nio.file.Path buildDirectory; private java.nio.file.Path buildDirectory;
/** /**
@ -84,18 +78,18 @@ public class CompilerBuiltinsDetector {
/** /**
* Runs built-in detection. * Runs built-in detection.
* *
* @param buildConfiguration the project build configuration to use * @param project the project
* @param theBuildDirectory the build directory of the build configuration * @param buildDirectory the build root directory. This is the working directory of the compiler process. Temporary,
* @param launcher the launcher that can run in docker container, if * but cacheable input files for the compiler are generated her also
* any * @param launcher the launcher for the compiler process
* @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 no console output is requested. * <code>null</code> if no console output is requested.
* @throws CoreException * @throws CoreException
*/ */
public IRawIndexerInfo detectBuiltins(IBuildConfiguration buildConfiguration, java.nio.file.Path theBuildDirectory, public IRawIndexerInfo detectBuiltins(IProject project, java.nio.file.Path buildDirectory,
ICommandLauncher launcher, IConsole console, IProgressMonitor monitor) throws CoreException { ICommandLauncher launcher, IConsole console, IProgressMonitor monitor) throws CoreException {
this.buildConfiguration = Objects.requireNonNull(buildConfiguration, "buildConfiguration"); //$NON-NLS-1$ this.project = Objects.requireNonNull(project, "project"); //$NON-NLS-1$
this.buildDirectory = Objects.requireNonNull(theBuildDirectory, "buildDirectory"); //$NON-NLS-1$ this.buildDirectory = Objects.requireNonNull(buildDirectory, "buildDirectory"); //$NON-NLS-1$
if (monitor == null) { if (monitor == null) {
monitor = new NullProgressMonitor(); monitor = new NullProgressMonitor();
@ -108,7 +102,7 @@ public class CompilerBuiltinsDetector {
console = startOutputConsole(console); console = startOutputConsole(console);
launcher.setProject(buildConfiguration.getProject()); launcher.setProject(project);
launcher.showCommand(console != null); launcher.showCommand(console != null);
final Process proc = launcher.execute(new Path(command), argList.toArray(new String[argList.size()]), getEnvp(), final Process proc = launcher.execute(new Path(command), argList.toArray(new String[argList.size()]), getEnvp(),
new Path(this.buildDirectory.toString()), monitor); new Path(this.buildDirectory.toString()), monitor);
@ -166,33 +160,25 @@ public class CompilerBuiltinsDetector {
} }
/** /**
* Get environment variables from configuration as array of "var=value" suitable * Get environment variables from configuration as array of "var=value".
* for using as "envp" with Runtime.exec(String[] cmdarray, String[] envp, File
* dir)
* *
* @return String array of environment variables in format "var=value". Does not * @return String array of environment variables in format "var=value". Does not
* return {@code null}. * return {@code null}.
*/ */
private String[] getEnvp() { private String[] getEnvp() {
IEnvironmentVariableManager mngr = CCorePlugin.getDefault().getBuildEnvironmentManager();
IEnvironmentVariable[] vars = mngr.getVariables(buildConfiguration, true);
// Convert into envp strings
Set<String> strings = new HashSet<>(vars.length);
for (IEnvironmentVariable var : vars) {
if (var.getName().startsWith("LANGUAGE" + '=') || var.getName().startsWith("LC_ALL" + '=')) //$NON-NLS-1$ //$NON-NLS-2$
continue;
strings.add(var.getName() + '=' + var.getValue());
}
// On POSIX (Linux, UNIX) systems reset language variables to default (English) // On POSIX (Linux, UNIX) systems reset language variables to default (English)
// with UTF-8 encoding since GNU compilers can handle only UTF-8 characters. // with UTF-8 encoding since GNU compilers can handle only UTF-8 characters.
// Include paths with locale characters will be handled properly regardless // Include paths with locale characters will be handled properly regardless
// of the language as long as the encoding is set to UTF-8. // of the language as long as the encoding is set to UTF-8.
// English language is set for parser because it relies on English messages // English language is set for parser because it relies on English messages
// in the output of the 'gcc -v' builtinsDetectionArgs. // in the output of the 'gcc -v'.
strings.add("LANGUAGE" + "=en"); // override for GNU gettext //$NON-NLS-1$ //$NON-NLS-2$ String[] strings = {
strings.add("LC_ALL" + "=C.UTF-8"); // for other parts of the system libraries //$NON-NLS-1$ //$NON-NLS-2$ // override for GNU gettext
"LANGUAGE" + "=en", //$NON-NLS-1$//$NON-NLS-2$
// for other parts of the system libraries
"LC_ALL" + "=C.UTF-8" }; //$NON-NLS-1$ //$NON-NLS-2$
return strings.toArray(new String[strings.size()]); return strings;
} }
/** /**
@ -218,7 +204,7 @@ public class CompilerBuiltinsDetector {
} }
private void createMarker(String message) throws CoreException { private void createMarker(String message) throws CoreException {
IMarker marker = buildConfiguration.getProject().createMarker(MARKER_ID); IMarker marker = project.createMarker(MARKER_ID);
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO); marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO);
marker.setAttribute(IMarker.MESSAGE, message); marker.setAttribute(IMarker.MESSAGE, message);
} }
@ -235,15 +221,12 @@ public class CompilerBuiltinsDetector {
.getServiceContext(FrameworkUtil.getBundle(getClass()).getBundleContext()) .getServiceContext(FrameworkUtil.getBundle(getClass()).getBundleContext())
.get(IParserPreferencesAccess.class).getWorkspacePreferences(); .get(IParserPreferencesAccess.class).getWorkspacePreferences();
if (console != null && prefs.getAllocateConsole()) { if (console != null && prefs.getAllocateConsole()) {
IProject project = buildConfiguration.getProject();
console.start(project); console.start(project);
try { try {
final ConsoleOutputStream cis = console.getInfoStream(); final ConsoleOutputStream cis = console.getInfoStream();
String msg; String msg;
msg = String.format(Messages.CompilerBuiltinsDetector_msg_detection_start, msg = String.format(Messages.CompilerBuiltinsDetector_msg_detection_start,
SimpleDateFormat.getTimeInstance().format(new Date()), project.getName(), SimpleDateFormat.getTimeInstance().format(new Date()), project.getName());
buildConfiguration.getName().isEmpty() ? "?" : buildConfiguration.getName(), //$NON-NLS-1$
String.join(" ", builtinsDetectionArgs)); //$NON-NLS-1$
cis.write(msg.getBytes()); cis.write(msg.getBytes());
cis.write("\n".getBytes()); //$NON-NLS-1$ cis.write("\n".getBytes()); //$NON-NLS-1$
} catch (IOException ignore) { } catch (IOException ignore) {

View file

@ -13,5 +13,5 @@
############################################################################### ###############################################################################
CompilerBuiltinsDetector_errmsg_command_failed=%1$s exited with status %2$d. CompilerBuiltinsDetector_errmsg_command_failed=%1$s exited with status %2$d.
CompilerBuiltinsDetector_msg_detection_finished=Detecting compiler built-ins took %d ms. CompilerBuiltinsDetector_msg_detection_finished=Detecting compiler built-ins took %d ms.
CompilerBuiltinsDetector_msg_detection_start=%1$s Detecting compiler built-ins: %2$s::%3$s for '%4$s' CompilerBuiltinsDetector_msg_detection_start=%1$s Detecting compiler built-ins for project '%2$s'
DetectorConsole_title=Compiler Built-ins Detection Console DetectorConsole_title=Compiler Built-ins Detection Console