From 1a8f399b8b82c5dd11bdaa170d7b26dc06c32bfb Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Thu, 12 Jul 2018 13:53:05 -0400 Subject: Bug 536884 - Removing header cache should cause ScannerInfo refresh - add a new IToolChain property "cdt.needScannerRefresh" that is set if scanner info needs to be refreshed - for a Container build, turn the property on in ContainerGCCToolChain startBuildProcess() if the Container headers for the toolchain's have been deleted - in CBuildConfiguration processLine(), look for the toolchain property when looking to see if scannerinfo should be calculated - in CBuildConfiguration, turn the toolchain property off in shutdown() Change-Id: I67a3537d1e2967dc15b66a1c37abda1ae8f78bff --- .../cdt/core/build/CBuildConfiguration.java | 34 ++++++++++++++++++++-- .../launcher/ContainerCommandLauncherFactory.java | 9 ++++-- .../ui/launchbar/ContainerGCCToolChain.java | 9 ++++++ 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuildConfiguration.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuildConfiguration.java index bc2e24cd2e7..76c50e694f3 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuildConfiguration.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuildConfiguration.java @@ -106,6 +106,8 @@ public abstract class CBuildConfiguration extends PlatformObject IConsoleParser2, IElementChangedListener { private static final String LAUNCH_MODE = "cdt.launchMode"; //$NON-NLS-1$ + + private static final String NEED_REFRESH = "cdt.needScannerRefresh"; //$NON-NLS-1$ private static final List DEFAULT_COMMAND = new ArrayList<>(0); @@ -470,8 +472,15 @@ public abstract class CBuildConfiguration extends PlatformObject } } } + IToolChain tc = getToolChain(); + if (tc instanceof IToolChain2) { + // we may have a Container build...default to Path based on command + return Paths.get(command); + } } catch (InvalidPathException e) { // ignore + } catch (CoreException e) { + // ignore } return null; } @@ -937,6 +946,15 @@ public abstract class CBuildConfiguration extends PlatformObject IResource[] resources = toolChain.getResourcesFromCommand(command, getBuildDirectoryURI()); if (resources != null && resources.length > 0) { List commandStrings = toolChain.stripCommand(command, resources); + + boolean needScannerRefresh = false; + + if (toolChain instanceof IToolChain2) { + String needRefresh = toolChain.getProperty(NEED_REFRESH); + if ("true".equals(needRefresh)) { //$NON-NLS-1$ + needScannerRefresh = true; + } + } for (IResource resource : resources) { loadScannerInfoCache(); @@ -951,7 +969,7 @@ public abstract class CBuildConfiguration extends PlatformObject hasCommand = false; } } - if (!hasCommand) { + if (!hasCommand || needScannerRefresh) { Path commandPath = findCommand(command.get(0)); if (commandPath != null) { command.set(0, commandPath.toString()); @@ -1058,6 +1076,15 @@ public abstract class CBuildConfiguration extends PlatformObject IResource[] resources = toolChain.getResourcesFromCommand(command, getBuildDirectoryURI()); if (resources != null && resources.length > 0) { List commandStrings = toolChain.stripCommand(command, resources); + + boolean needScannerRefresh = false; + + if (toolChain instanceof IToolChain2) { + String needRefresh = toolChain.getProperty(NEED_REFRESH); + if ("true".equals(needRefresh)) { //$NON-NLS-1$ + needScannerRefresh = true; + } + } for (IResource resource : resources) { loadScannerInfoCache(); @@ -1072,7 +1099,7 @@ public abstract class CBuildConfiguration extends PlatformObject hasCommand = false; } } - if (!hasCommand) { + if (!hasCommand || needScannerRefresh) { Path commandPath = findCommand(command.get(0)); if (commandPath != null) { command.set(0, commandPath.toString()); @@ -1117,6 +1144,9 @@ public abstract class CBuildConfiguration extends PlatformObject @Override public void shutdown() { // TODO persist changes + + // Bug 536884 - Turn off any manual future scanner refresh + toolChain.setProperty(NEED_REFRESH, "false"); //$NON-NLS-1$ // Trigger a reindex if anything changed // TODO be more surgical 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 1d3e4b3e1a3..596482cb266 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 @@ -41,6 +41,7 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Platform; import org.eclipse.linuxtools.docker.ui.launch.ContainerLauncher; +@SuppressWarnings("restriction") public class ContainerCommandLauncherFactory implements ICommandLauncherFactory, ICommandLauncherFactory2 { @@ -349,8 +350,12 @@ public class ContainerCommandLauncherFactory } } else { - // TODO: fix this logic in future so it can be done using a call - // rather than using a property of the toolchain + // Bug 536884 - if no include entries, check if the copied + // header files have been erased by the end-user in which + // case mark that scanner info needs refreshing (only way + // the headers will be recopied) + // TODO: fix this in a minor release to be an additional method + // that can be registered by the removal of the header files IPath pluginPath = Platform .getStateLocation(Platform .getBundle(DockerLaunchUIPlugin.PLUGIN_ID)) diff --git a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ui/launchbar/ContainerGCCToolChain.java b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ui/launchbar/ContainerGCCToolChain.java index 9fce12031fd..5104f9b9a74 100644 --- a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ui/launchbar/ContainerGCCToolChain.java +++ b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ui/launchbar/ContainerGCCToolChain.java @@ -20,6 +20,7 @@ import java.nio.file.InvalidPathException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -641,6 +642,14 @@ public class ContainerGCCToolChain extends PlatformObject ICommandLauncher launcher = CommandLauncherManager.getInstance() .getCommandLauncher(config); + // Bug 536884 - following is a kludge to allow us to check if the + // Container headers have been deleted by the user in which case + // we need to re-perform scanner info collection and copy headers + // to the host. + // TODO: make this cleaner + CommandLauncherManager.getInstance().processIncludePaths(config, + Collections.emptyList()); + launcher.setProject(config.getBuildConfiguration().getProject()); if (launcher instanceof ICBuildCommandLauncher) { ((ICBuildCommandLauncher) launcher).setBuildConfiguration(config); -- cgit v1.2.3