diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/LanguageComputer.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/LanguageComputer.java new file mode 100644 index 000000000..4f874998b --- /dev/null +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/LanguageComputer.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright (c) 2022 VMware, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VMware, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.commons.languageserver.util; + +import java.net.URI; + +import org.springframework.ide.vscode.commons.util.text.LanguageId; + +public interface LanguageComputer { + + LanguageId computeLanguage(URI uri); + +} diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java index 22fe8f73f..71e3db1ae 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java @@ -11,6 +11,7 @@ package org.springframework.ide.vscode.commons.languageserver.util; import java.lang.reflect.Type; +import java.net.URI; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -486,8 +487,12 @@ public class SimpleTextDocumentService implements TextDocumentService, DocumentE TextDocument doc = trackedDoc == null ? null : trackedDoc.getDocument(); if (doc == null) { - if (uri.endsWith(".java")) { - doc = new LazyTextDocument(uri, LanguageId.JAVA); + LanguageComputer languageComputer = appContext.getBean(LanguageComputer.class); + if (languageComputer != null) { + LanguageId language = languageComputer.computeLanguage(URI.create(uri)); + if (language != null) { + doc = new LazyTextDocument(uri, language); + } } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java index 46ab316e4..555c40390 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java @@ -11,6 +11,9 @@ package org.springframework.ide.vscode.boot.app; import java.io.File; +import java.net.URI; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -71,12 +74,14 @@ import org.springframework.ide.vscode.commons.languageserver.java.FutureProjectF import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; import org.springframework.ide.vscode.commons.languageserver.util.DocumentEventListenerManager; +import org.springframework.ide.vscode.commons.languageserver.util.LanguageComputer; import org.springframework.ide.vscode.commons.languageserver.util.LspClient; import org.springframework.ide.vscode.commons.languageserver.util.ServerCapabilityInitializer; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.util.FileObserver; import org.springframework.ide.vscode.commons.util.LogRedirect; import org.springframework.ide.vscode.commons.util.text.IDocument; +import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.commons.yaml.ast.YamlASTProvider; import org.springframework.ide.vscode.commons.yaml.ast.YamlParser; import org.springframework.ide.vscode.commons.yaml.completion.YamlAssistContext; @@ -90,6 +95,7 @@ import org.springframework.ide.vscode.languageserver.starter.LanguageServerRunne import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.constructor.SafeConstructor; +import com.google.common.io.Files; import com.google.gson.Gson; import com.google.gson.JsonElement; @@ -309,4 +315,30 @@ public class BootLanguageServerBootApp { @Bean RewriteRecipeRepository rewriteRecipesRepository(SimpleLanguageServer server, JavaProjectFinder projectFinder, BootJavaConfig config) { return new RewriteRecipeRepository(server, projectFinder, config); } + + @Bean + LanguageComputer languageComputer() { + return new LanguageComputer() { + + @Override + public LanguageId computeLanguage(URI uri) { + Path path = Paths.get(uri); + String fileName = path.getFileName().toString(); + switch (Files.getFileExtension(fileName)) { + case "properties": + return LanguageId.BOOT_PROPERTIES; + case "yml": + return LanguageId.BOOT_PROPERTIES_YAML; + case "java": + return LanguageId.JAVA; + case "xml": + return LanguageId.XML; + case "factories": + return LanguageId.SPRING_FACTORIES; + default: + return LanguageId.PLAINTEXT; + } + } + }; + } }