1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-21 21:52:10 +02:00

Bug 562452: Avoid using .C for C++ files when calculating specs

Change-Id: I0fe24a8343e73d501ae09e8bf3721e3d310a696d
This commit is contained in:
Jonah Graham 2020-04-25 12:16:25 -04:00
parent df7c89b876
commit 9bc8e1d0be
3 changed files with 32 additions and 16 deletions

View file

@ -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.8.1.qualifier
Bundle-Activator: org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin
Bundle-Vendor: %providerName
Bundle-Localization: plugin

View file

@ -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,32 @@ 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<String> 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<String> extensions = Arrays.asList(fileExtensions);
extension = extensions.stream().filter(s -> s != null && !s.isEmpty()).findFirst();
extension = extension.map(ext2 -> {
// Bug 562452: Special case where we prefer not to use .C for c++ files.
if ("C".equals(ext2) && extensions.contains("cpp")) { //$NON-NLS-1$//$NON-NLS-2$
return "cpp"; //$NON-NLS-1$
}
return ext2;
});
}
}
}
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();
}
/**

View file

@ -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,24 @@ public abstract class ToolchainBuiltinSpecsDetector extends AbstractBuiltinSpecs
@Override
protected String getSpecFileExtension(String languageId) {
Optional<String> found = languageTool(languageId)//
.flatMap(t -> Optional.of(t.getAllInputExtensions()))//
.flatMap(e -> Arrays.asList(e).stream().findFirst());
if (!found.isPresent()) {
Optional<String[]> optionalExtensions = languageTool(languageId)
.flatMap(t -> Optional.of(t.getAllInputExtensions()));
List<String> extensions = optionalExtensions.map(Arrays::asList).orElseGet(() -> Collections.emptyList());
Optional<String> extension = extensions.stream().filter(s -> s != null && !s.isEmpty()).findFirst();
extension = extension.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;
});
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