*/
public class LanguageRecognizer implements BatchComponent, Startable {
- static final String NO_EXTENSION = "<UNSET>";
-
private final Project project;
private final Language[] languages;
*/
private SetMultimap<String, String> langsByExtension = HashMultimap.create();
+ /**
+ * Some plugins, like web and cobol, can analyze all the source files, whatever
+ * their file extension. This behavior is kept for backward-compatibility,
+ * but it should be fixed with future multi-language support.
+ */
+ private boolean ignoreFileExtension = false;
+
public LanguageRecognizer(Project project, Language[] languages) {
this.project = project;
this.languages = languages;
@Override
public void start() {
for (Language language : languages) {
- if (language.getFileSuffixes().length == 0) {
- langsByExtension.put(NO_EXTENSION, language.getKey());
+ if (language.getFileSuffixes().length == 0 && language.getKey().equals(project.getLanguageKey())) {
+ ignoreFileExtension = true;
} else {
for (String suffix : language.getFileSuffixes()) {
@CheckForNull
String of(File file) {
+ if (ignoreFileExtension) {
+ return project.getLanguageKey();
+ }
// multi-language is not supported yet. Filter on project language
String extension = sanitizeExtension(FilenameUtils.getExtension(file.getName()));
- extension = StringUtils.defaultIfBlank(extension, NO_EXTENSION);
Set<String> langs = langsByExtension.get(extension);
return langs.contains(project.getLanguageKey()) ? project.getLanguageKey() : null;
}
@Test
public void language_with_no_extension() throws Exception {
- // abap here is associated to files without extension
+ // abap does not declare any file extensions.
+ // When analyzing an ABAP project, then all source files must be parsed.
Language[] languages = new Language[]{new MockLanguage("java", "java"), new MockLanguage("abap")};
- // files without extension are detected only on abap projects
+ // No side-effect on non-ABAP projects
LanguageRecognizer recognizer = new LanguageRecognizer(newProject("java"), languages);
recognizer.start();
assertThat(recognizer.of(temp.newFile("abc"))).isNull();
+ assertThat(recognizer.of(temp.newFile("abc.abap"))).isNull();
+ assertThat(recognizer.of(temp.newFile("abc.java"))).isEqualTo("java");
recognizer.stop();
recognizer = new LanguageRecognizer(newProject("abap"), languages);
recognizer.start();
assertThat(recognizer.of(temp.newFile("abc"))).isEqualTo("abap");
+ assertThat(recognizer.of(temp.newFile("abc.txt"))).isEqualTo("abap");
+ assertThat(recognizer.of(temp.newFile("abc.java"))).isEqualTo("abap");
recognizer.stop();
-
}
private Project newProject(String language) {