From eeebe5234c8b9bb73b98bc55fa1024b137fa4fd9 Mon Sep 17 00:00:00 2001 From: Jonah Graham Date: Sat, 25 Apr 2020 12:16:25 -0400 Subject: [PATCH] Bug 562452: Avoid using .C for C++ files when calculating specs Change-Id: I0fe24a8343e73d501ae09e8bf3721e3d310a696d --- .../META-INF/MANIFEST.MF | 2 +- .../AbstractBuiltinSpecsDetector.java | 29 +++++++++++++++---- .../ToolchainBuiltinSpecsDetector.java | 19 ++++++------ 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/build/org.eclipse.cdt.managedbuilder.core/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.managedbuilder.core/META-INF/MANIFEST.MF index ee0249ddded..fb26e2a50dd 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/META-INF/MANIFEST.MF +++ b/build/org.eclipse.cdt.managedbuilder.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.managedbuilder.core; singleton:=true -Bundle-Version: 8.8.0.qualifier +Bundle-Version: 8.9.0.qualifier Bundle-Activator: org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin Bundle-Vendor: %providerName Bundle-Localization: plugin 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 c06d5a17c0c..a372a3a74af 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 @@ -26,6 +26,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Optional; import java.util.Set; import org.eclipse.cdt.core.CCorePlugin; @@ -894,23 +895,41 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti * @return file extension associated with the language or {@code null} if not found. */ protected String getSpecFileExtension(String languageId) { - String ext = null; + Optional extension = Optional.empty(); ILanguageDescriptor langDescriptor = LanguageManager.getInstance().getLanguageDescriptor(languageId); if (langDescriptor != null) { IContentType[] contentTypes = langDescriptor.getContentTypes(); if (contentTypes != null && contentTypes.length > 0) { String[] fileExtensions = contentTypes[0].getFileSpecs(IContentType.FILE_EXTENSION_SPEC); - if (fileExtensions != null && fileExtensions.length > 0) { - ext = fileExtensions[0]; + if (fileExtensions != null) { + List extensions = Arrays.asList(fileExtensions); + extension = selectBestSpecFileExtension(extensions); } } } - if (ext == null) { + if (!extension.isPresent()) { ManagedBuilderCorePlugin.log(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, "Unable to find file extension for language " + languageId)); //$NON-NLS-1$ + return null; } - return ext; + return extension.get(); + } + + /** + * Return the best extension to use for calculating spec file from a list of extensions. + * @param extensions list of possible extensions to choose from + * @return one of the extensions deemed the best one to use from the list + * @since 8.9 + */ + protected Optional selectBestSpecFileExtension(List extensions) { + return extensions.stream().filter(s -> s != null && !s.isEmpty()).findFirst().map(ext -> { + // Bug 562452: Special case where we prefer not to use .C for c++ files. + if ("C".equals(ext) && extensions.contains("cpp")) { //$NON-NLS-1$//$NON-NLS-2$ + return "cpp"; //$NON-NLS-1$ + } + return ext; + }); } /** diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/ToolchainBuiltinSpecsDetector.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/ToolchainBuiltinSpecsDetector.java index 98219a57c92..59312318f0a 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/ToolchainBuiltinSpecsDetector.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/ToolchainBuiltinSpecsDetector.java @@ -16,6 +16,7 @@ package org.eclipse.cdt.managedbuilder.language.settings.providers; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -139,19 +140,17 @@ public abstract class ToolchainBuiltinSpecsDetector extends AbstractBuiltinSpecs @Override protected String getSpecFileExtension(String languageId) { - Optional found = languageTool(languageId)// - .flatMap(t -> Optional.of(t.getAllInputExtensions()))// - .flatMap(e -> Arrays.asList(e).stream().findFirst()); - if (!found.isPresent()) { + Optional optionalExtensions = languageTool(languageId) + .flatMap(t -> Optional.of(t.getAllInputExtensions())); + List extensions = optionalExtensions.map(Arrays::asList).orElseGet(() -> Collections.emptyList()); + Optional extension = selectBestSpecFileExtension(extensions); + + if (!extension.isPresent()) { + //this looks like either invalid configuration settings or API issue ManagedBuilderCorePlugin.error(NLS.bind("Unable to find file extension for language {0}", languageId)); //$NON-NLS-1$ return null; } - String firstInput = found.get(); - if (firstInput == null || firstInput.isEmpty()) { - //this looks like either invalid configuration settings or API issue - ManagedBuilderCorePlugin.error(NLS.bind("Unable to find file extension for language {0}", languageId)); //$NON-NLS-1$ - } - return firstInput; + return extension.get(); } @Override