diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/BuiltinSpecsDetectorTest.java b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/BuiltinSpecsDetectorTest.java index 68c897fe425..5c3e4e7ab0e 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/BuiltinSpecsDetectorTest.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/BuiltinSpecsDetectorTest.java @@ -888,6 +888,41 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase { provider.unregisterListener(); } + /** + * Test running a provider after changing the compiler command. + */ + public void testAbstractBuiltinSpecsDetector_RerunOnCommandArgsChange() throws Exception { + // Create test "compiler" + java.io.File compiler = new java.io.File("compiler"); + compiler.createNewFile(); + assertTrue(compiler.exists()); + String compilerPath = compiler.getAbsolutePath(); + + // Create provider + MockBuiltinSpecsDetectorWithRunCount provider = new MockBuiltinSpecsDetectorWithRunCount(); + provider.setCommand(compilerPath + " arg1"); + // register environment listener on workspace + provider.registerListener(null); + waitForProviderToFinish(); + assertEquals(1, provider.getExecutedCount()); + + // Check that an event doesn't trigger unnecessary rerun + provider.handleEvent(null); + waitForProviderToFinish(); + assertEquals(1, provider.getExecutedCount()); + + // Change the compiler command + provider.setCommand(compilerPath + " arg2"); + + // Check that an event triggers rerun after changing the compiler command + provider.handleEvent(null); + waitForProviderToFinish(); + assertEquals(2, provider.getExecutedCount()); + + // unregister listeners + provider.unregisterListener(); + } + /** * Check that entries get grouped by kinds by stock built-in specs detector. */ diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuiltinSpecsDetector.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuiltinSpecsDetector.java index 30d6e4fd1f9..696b57563e4 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuiltinSpecsDetector.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuiltinSpecsDetector.java @@ -7,6 +7,7 @@ * * Contributors: * Andrew Gvozdev - initial API and implementation + * Liviu Ionescu - Bug 413678: trigger discovery after command line change *******************************************************************************/ package org.eclipse.cdt.managedbuilder.language.settings.providers; @@ -419,6 +420,10 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti for (String languageId : languageIds) { try { String command = resolveCommand(languageId); + if (command != null) { + envHashNew = 31*envHashNew + command.hashCode(); + } + String[] cmdArray = CommandLineUtil.argumentsToArray(command); if (cmdArray != null && cmdArray.length > 0) { IPath location = new Path(cmdArray[0]);