Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"Build not configured correctly" in Core Build is an insufficient error message #1077

Open
jonahgraham opened this issue Feb 6, 2025 · 1 comment
Milestone

Comments

@jonahgraham
Copy link
Member

Originally posted by @jonahgraham in #1076 (comment)

When launch mode, tool chain or launch configuration cannot be loaded, CBuildConfiguration's constructor throws a CoreException with code of STATUS_BUILD_CONFIG_NOT_VALID.

This currently leads to Build not configured correctly error when trying to build. There may be other paths that need updating.

Saving the IStatus's message and returning that later we can display to the user this info when they build:

image

diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuilder.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuilder.java
index f826df0fb0..f2907da510 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuilder.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuilder.java
@@ -2,6 +2,7 @@ package org.eclipse.cdt.core.build;
 
 import java.io.IOException;
 import java.util.Map;
+import java.util.Optional;
 
 import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.resources.IConsole;
@@ -36,9 +37,13 @@ public class CBuilder extends IncrementalProjectBuilder {
 			console.start(project);
 
 			// Get the build configuration
-			ICBuildConfiguration config = getBuildConfig().getAdapter(ICBuildConfiguration.class);
+			// XXX Why was adapter used and not manager directly?
+			ICBuildConfigurationManager manager = CCorePlugin.getService(ICBuildConfigurationManager.class);
+			ICBuildConfiguration config = manager.getBuildConfiguration(getBuildConfig());
 			if (config == null) {
-				console.getErrorStream().write(Messages.CBuilder_NotConfiguredCorrectly);
+				Optional<String> errorMessage = manager.getBuildConfigurationErroMessage(getBuildConfig());
+				String message = errorMessage.orElse(Messages.CBuilder_NotConfiguredCorrectly);
+				console.getErrorStream().write(message);
 				return null;
 			}
 
@@ -59,9 +64,13 @@ public class CBuilder extends IncrementalProjectBuilder {
 			console.start(project);
 
 			// Get the build configuration
-			ICBuildConfiguration config = getBuildConfig().getAdapter(ICBuildConfiguration.class);
+			// XXX Why was adapter used and not manager directly?
+			ICBuildConfigurationManager manager = CCorePlugin.getService(ICBuildConfigurationManager.class);
+			ICBuildConfiguration config = manager.getBuildConfiguration(getBuildConfig());
 			if (config == null) {
-				console.getErrorStream().write(Messages.CBuilder_NotConfiguredCorrectly2);
+				Optional<String> errorMessage = manager.getBuildConfigurationErroMessage(getBuildConfig());
+				String message = errorMessage.orElse(Messages.CBuilder_NotConfiguredCorrectly);
+				console.getErrorStream().write(message);
 				return;
 			}
 
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationManager.java
index 8ea561a53b..959f3211e5 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationManager.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationManager.java
@@ -10,6 +10,8 @@
  *******************************************************************************/
 package org.eclipse.cdt.core.build;
 
+import java.util.Optional;
+
 import org.eclipse.core.resources.IBuildConfiguration;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
@@ -98,4 +100,9 @@ public interface ICBuildConfigurationManager {
 	 */
 	boolean supports(IProject project) throws CoreException;
 
+	/**
+	 * @since 9.0
+	 */
+	Optional<String> getBuildConfigurationErroMessage(IBuildConfiguration buildConfig);
+
 }
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/CBuildConfigurationManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/CBuildConfigurationManager.java
index c53b16cc99..62013c060c 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/CBuildConfigurationManager.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/CBuildConfigurationManager.java
@@ -20,6 +20,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 
 import org.eclipse.cdt.core.CCorePlugin;
@@ -94,7 +95,7 @@ public class CBuildConfigurationManager
 
 	private Map<String, Provider> providers;
 	private Map<IBuildConfiguration, ICBuildConfiguration> configs = new HashMap<>();
-	private Set<IBuildConfiguration> noConfigs = new HashSet<>();
+	private Map<IBuildConfiguration, String> noConfigs = new HashMap<>();
 
 	public CBuildConfigurationManager() {
 		ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
@@ -194,7 +195,7 @@ public class CBuildConfigurationManager
 		ICBuildConfiguration config = null;
 		Set<IProject> projects = new HashSet<>();
 		synchronized (configs) {
-			Iterator<IBuildConfiguration> iterator = noConfigs.iterator();
+			Iterator<IBuildConfiguration> iterator = noConfigs.keySet().iterator();
 			while (iterator.hasNext()) {
 				IBuildConfiguration buildConfig = iterator.next();
 				String configName = null;
@@ -247,7 +248,8 @@ public class CBuildConfigurationManager
 		ICBuildConfiguration config = null;
 		boolean resetBinaryParser = false;
 		synchronized (configs) {
-			if (!noConfigs.contains(buildConfig)) {
+			if (!noConfigs.containsKey(buildConfig)) {
+				String noConfigErrorMessage = ""; //$NON-NLS-1$
 				config = configs.get(buildConfig);
 				if (config == null) {
 					String configName = null;
@@ -272,8 +274,10 @@ public class CBuildConfigurationManager
 							config = provider.getCBuildConfiguration(buildConfig, configName);
 						} catch (CoreException e) {
 							IStatus status = e.getStatus();
-							if (!status.getPlugin().equals(CCorePlugin.PLUGIN_ID)
-									|| status.getCode() != CCorePlugin.STATUS_BUILD_CONFIG_NOT_VALID) {
+							if (status.getPlugin().equals(CCorePlugin.PLUGIN_ID)
+									&& status.getCode() == CCorePlugin.STATUS_BUILD_CONFIG_NOT_VALID) {
+								noConfigErrorMessage = status.getMessage();
+							} else {
 								throw e;
 							}
 						}
@@ -286,7 +290,7 @@ public class CBuildConfigurationManager
 					}
 
 					if (config == null) {
-						noConfigs.add(buildConfig);
+						noConfigs.put(buildConfig, noConfigErrorMessage);
 					}
 				}
 			}
@@ -447,4 +451,8 @@ public class CBuildConfigurationManager
 		return false;
 	}
 
+	@Override
+	public Optional<String> getBuildConfigurationErroMessage(IBuildConfiguration buildConfig) {
+		return Optional.ofNullable(noConfigs.get(buildConfig));
+	}
 }
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/Messages.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/Messages.java
index 98529b1bf4..81d637ef50 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/Messages.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/Messages.java
@@ -19,7 +19,6 @@ public class Messages extends NLS {
 	public static String CBuilder_ExceptionWhileBuilding;
 	public static String CBuilder_ExceptionWhileBuilding2;
 	public static String CBuilder_NotConfiguredCorrectly;
-	public static String CBuilder_NotConfiguredCorrectly2;
 	public static String CBuildConfiguration_CBuildConfiguration_LaunchModeMissong;
 	public static String CBuildConfiguration_CBuildConfiguration_LaunchTargetMissing;
 	public static String CBuildConfiguration_CBuildConfiguration_ToolchainMissing;
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/messages.properties b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/messages.properties
index bbe8af1ab5..54e970ffd9 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/messages.properties
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/messages.properties
@@ -11,7 +11,6 @@
 CBuilder_ExceptionWhileBuilding=Exception while building
 CBuilder_ExceptionWhileBuilding2=Exception while building
 CBuilder_NotConfiguredCorrectly=Build not configured correctly\n
-CBuilder_NotConfiguredCorrectly2=Build not configured correctly\n
 StandardBuildConfiguration_0=Building in: %s\n
 StandardBuildConfiguration_1=Build complete (%d errors, %d warnings): %s\n
 StandardBuildConfiguration_Failure=Error: %s
@jonahgraham
Copy link
Member Author

cc: @betamaxbandit

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant