1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 17:05:26 +02:00

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
This commit is contained in:
Jeff Johnston 2018-07-12 13:53:05 -04:00
parent a394557c60
commit 1a8f399b8b
3 changed files with 48 additions and 4 deletions

View file

@ -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<String> 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<String> 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<String> 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

View file

@ -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))

View file

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