From 00a7db1c4d2c6c032114da567ef072a80ef8188f Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Mon, 17 Apr 2017 12:47:32 -0400 Subject: [PATCH] Add indexing support for CDT Build in Container - in LanguageSettingsSerializableSettings class, call the CommandLauncherFactoryManager getLanguageSettingEntries method to get the massaged language setting entries based on the current list - in LanguageSettingsProviderSerializer, try and get the pooled entries using the cfg description so that it will have the project and can use the CommandLauncherFactoryManager to get entries from image - add getLanguageSettingEntries method to CommandLauncherFactoryManager to convert include paths to locally cached paths copied from image - add verifyLanguageSettingEntries method to ICommandLauncherFactory - fix copy header logic in ContainerCommandLauncherFactory - add verifyLanguageSettingEntries method to ContainerCommandLauncherFactory that looks to see if the project is currently enabled for container build and any include path entries are ones that have been copied over as part of a CopyVolumesFromImage job in which case they are replaced in the entries list - fix the ContainerPropertyTab performOK method to always refresh the builtin specs for the time-being so switching can be done between container and regular build Change-Id: I004e916253cbaae9c6dfed1ef4f5844678fe0dd9 --- .../providers/GCCBuiltinSpecsDetector.java | 2 +- .../LanguageSettingsSerializableProvider.java | 4 + .../LanguageSettingsProvidersSerializer.java | 4 + .../core/CommandLauncherFactoryManager.java | 11 +++ .../cdt/core/ICommandLauncherFactory.java | 9 +++ .../ContainerCommandLauncherFactory.java | 75 ++++++++++++++++++- .../docker/launcher/ContainerPropertyTab.java | 23 +++--- 7 files changed, 112 insertions(+), 16 deletions(-) diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/GCCBuiltinSpecsDetector.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/GCCBuiltinSpecsDetector.java index 163e22a088d..d07d225b8cc 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/GCCBuiltinSpecsDetector.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/GCCBuiltinSpecsDetector.java @@ -74,7 +74,7 @@ public class GCCBuiltinSpecsDetector extends ToolchainBuiltinSpecsDetector imple @Override protected List parseOptions(String line) { line = line.trim(); - + // contribution of -dD option if (line.startsWith("#define")) { return makeList(line); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java index 1a1d3f5b717..b3b2c7de9b3 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java @@ -169,6 +169,10 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr entries = fStorage.getSettingEntries(rcProjectPath, null); } } + + if (cfgDescription != null) { + entries = CommandLauncherFactoryManager.getInstance().getLanguageSettingEntries(cfgDescription.getProjectDescription().getProject(), entries); + } return entries; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java index 1338d2b704d..b20ca4b62f3 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java @@ -1456,6 +1456,10 @@ public class LanguageSettingsProvidersSerializer { return getSettingEntriesUpResourceTree(provider, cfgDescription, parentFolder, languageId); } // if out of parent resources - get default entries + entries = getSettingEntriesPooled(provider, cfgDescription, null, languageId); + if (entries != null) { + return entries; + } entries = getSettingEntriesPooled(provider, null, null, languageId); if (entries != null) { return entries; diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncherFactoryManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncherFactoryManager.java index b48b5632eab..a57f929a6dd 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncherFactoryManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncherFactoryManager.java @@ -212,6 +212,17 @@ public class CommandLauncherFactoryManager { } } + + public List getLanguageSettingEntries(IProject project, List entries) { + List verifiedEntries = entries; + for (ICommandLauncherFactory factory : factories) { + ICommandLauncher launcher = factory.getCommandLauncher(project); + if (launcher != null) { + verifiedEntries = factory.verifyLanguageSettingEntries(project, entries); + } + } + return verifiedEntries; + } } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICommandLauncherFactory.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICommandLauncherFactory.java index 91af328ee8d..1eaf567000f 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICommandLauncherFactory.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICommandLauncherFactory.java @@ -33,5 +33,14 @@ public interface ICommandLauncherFactory { * @param entries - List of language setting entries */ public void registerLanguageSettingEntries(IProject project, List entries); + + /** + * Verify language setting entries for a project and change any entries that + * have been copied to a local location + * @param project - IProject used in obtaining language setting entries + * @param entries - List of language setting entries + * @return modified List of language setting entries + */ + public List verifyLanguageSettingEntries(IProject project, List entries); } diff --git a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/docker/launcher/ContainerCommandLauncherFactory.java b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/docker/launcher/ContainerCommandLauncherFactory.java index 3205081131c..1df8ebe8f13 100644 --- a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/docker/launcher/ContainerCommandLauncherFactory.java +++ b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/docker/launcher/ContainerCommandLauncherFactory.java @@ -12,10 +12,12 @@ package org.eclipse.cdt.docker.launcher; import java.util.ArrayList; import java.util.List; +import java.util.Set; import org.eclipse.cdt.core.ICommandLauncher; import org.eclipse.cdt.core.ICommandLauncherFactory; import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.settings.model.CIncludePathEntry; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICIncludePathEntry; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; @@ -58,7 +60,9 @@ public class ContainerCommandLauncherFactory @Override public void registerLanguageSettingEntries(IProject project, - List entries) { + List langEntries) { + @SuppressWarnings("unchecked") + List entries = (List) langEntries; ICConfigurationDescription cfgd = CoreModel.getDefault() .getProjectDescription(project).getActiveConfiguration(); IConfiguration cfg = ManagedBuildManager @@ -88,14 +92,14 @@ public class ContainerCommandLauncherFactory List paths = new ArrayList<>(); for (ICLanguageSettingEntry entry : entries) { if (entry instanceof ICIncludePathEntry) { - String path = entry.getValue(); - paths.add(path); + paths.add(entry.getValue()); } } if (paths.size() > 0) { IPath pluginPath = Platform.getStateLocation(Platform .getBundle(DockerLaunchUIPlugin.PLUGIN_ID)); IPath hostDir = pluginPath.append(prefix); + @SuppressWarnings("unused") int status = launcher.fetchContainerDirs(connectionName, imageName, paths, hostDir); @@ -106,6 +110,71 @@ public class ContainerCommandLauncherFactory } + @Override + public List verifyLanguageSettingEntries( + IProject project, List entries) { + if (entries == null) { + return null; + } + ICConfigurationDescription cfgd = CoreModel.getDefault() + .getProjectDescription(project).getActiveConfiguration(); + IConfiguration cfg = ManagedBuildManager + .getConfigurationForDescription(cfgd); + IOptionalBuildProperties props = cfg.getOptionalBuildProperties(); + if (props != null) { + String enablementProperty = props.getProperty( + ContainerCommandLauncher.CONTAINER_BUILD_ENABLED); + if (enablementProperty != null) { + boolean enableContainer = Boolean + .parseBoolean(enablementProperty); + if (enableContainer) { + String connectionName = props.getProperty( + ContainerCommandLauncher.CONNECTION_ID); + String imageName = props + .getProperty(ContainerCommandLauncher.IMAGE_ID); + if (connectionName == null || connectionName.isEmpty() + || imageName == null || imageName.isEmpty()) { + DockerLaunchUIPlugin.logErrorMessage( + Messages.ContainerCommandLauncher_invalid_values); + return entries; + } + + ContainerLauncher launcher = new ContainerLauncher(); + Set copiedVolumes = launcher + .getCopiedVolumes(connectionName, imageName); + List newEntries = new ArrayList<>(); + IPath pluginPath = Platform.getStateLocation( + Platform.getBundle(DockerLaunchUIPlugin.PLUGIN_ID)); + String prefix = getCleanName(connectionName) + + IPath.SEPARATOR + getCleanName(imageName); // $NON-NLS-1$ + IPath hostDir = pluginPath.append(prefix); + + for (ICLanguageSettingEntry entry : entries) { + if (entry instanceof ICIncludePathEntry) { + if (copiedVolumes + .contains(((ICIncludePathEntry) entry) + .getName().toString())) { + // //$NON-NLS-2$ + IPath newPath = hostDir.append(entry.getName()); + CIncludePathEntry newEntry = new CIncludePathEntry( + newPath.toString(), + entry.getFlags()); + newEntries.add(newEntry); + continue; + } else { + newEntries.add(entry); + } + } else { + newEntries.add(entry); + } + } + return newEntries; + } + } + } + return entries; + } + private String getCleanName(String name) { return name.replaceAll("[:/]", "_"); //$NON-NLS-1$ //$NON-NLS-2$ } diff --git a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyTab.java b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyTab.java index 832768ca449..c2dd35b9959 100644 --- a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyTab.java +++ b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyTab.java @@ -317,20 +317,19 @@ public class ContainerPropertyTab extends AbstractCBuildPropertyTab @Override protected void performOK() { - if (enableButton.getSelection()) { - ICConfigurationDescription cfgd = ManagedBuildManager - .getDescriptionForConfiguration(iCfg); - List providers = ((ILanguageSettingsProvidersKeeper) cfgd) - .getLanguageSettingProviders(); - for (ILanguageSettingsProvider provider : providers) { - if (provider instanceof GCCBuiltinSpecsDetector) { - GCCBuiltinSpecsDetector d = (GCCBuiltinSpecsDetector) provider; - // force recalculation of gcc include path - d.clear(); - d.handleEvent(null); - } + ICConfigurationDescription cfgd = ManagedBuildManager + .getDescriptionForConfiguration(iCfg); + List providers = ((ILanguageSettingsProvidersKeeper) cfgd) + .getLanguageSettingProviders(); + for (ILanguageSettingsProvider provider : providers) { + if (provider instanceof GCCBuiltinSpecsDetector) { + GCCBuiltinSpecsDetector d = (GCCBuiltinSpecsDetector) provider; + // force recalculation of gcc include path + d.clear(); + d.handleEvent(null); } } + super.performOK(); }