From 9bc6c1fe56ad743c67c6d14d729f8172fbbdb6e7 Mon Sep 17 00:00:00 2001 From: Enaium Date: Wed, 15 Jan 2025 23:28:56 +0800 Subject: [PATCH] fix: Allow requesting flat scalar values in workspace/configuration --- .../lsp4ij/client/LanguageClientImpl.java | 7 +- .../lsp4ij/client/SettingsHelper.java | 44 +++++++++--- .../lsp4ij/client/SettingsHelperTest.java | 70 +++++++++++++++---- 3 files changed, 95 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/LanguageClientImpl.java b/src/main/java/com/redhat/devtools/lsp4ij/client/LanguageClientImpl.java index f591449ef..73b4a72b6 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/LanguageClientImpl.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/LanguageClientImpl.java @@ -248,14 +248,13 @@ protected Object findSettings(@Nullable String section) { if (section == null) { return config; } - String[] sections = section.split("[.]"); - return findSettings(sections, json); + return findSettings(section, json); } return null; } - protected static Object findSettings(String[] sections, JsonObject jsonObject) { - return SettingsHelper.findSettings(sections, jsonObject); + protected static Object findSettings(String section, JsonObject jsonObject) { + return SettingsHelper.findSettings(section, jsonObject); } /** diff --git a/src/main/java/com/redhat/devtools/lsp4ij/client/SettingsHelper.java b/src/main/java/com/redhat/devtools/lsp4ij/client/SettingsHelper.java index 44318f486..5d9adad1d 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/client/SettingsHelper.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/client/SettingsHelper.java @@ -15,9 +15,10 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Set; + /** * Helpers for extracting nested settings from json */ @@ -28,20 +29,45 @@ private SettingsHelper() { /** * Extract nested settings from json. - * @param sections path to the json element to retrieve - * @param parent Json to look for settings in + * + * @param section path to the json element to retrieve + * @param parent Json to look for settings in * @return the settings retrieved in the specified section and null if the section was not found. */ - public static @Nullable JsonElement findSettings(@NotNull String[] sections, @Nullable JsonObject parent) { + public static @Nullable JsonElement findSettings(@Nullable String section, @Nullable JsonObject parent) { + if (section == null || parent == null) { + return null; + } + + if (parent.has(section)) { + return parent.get(section); + } + + final var sections = section.split("[.]"); JsonElement current = parent; - for (String section : sections) { + for (var split : sections) { if (current instanceof JsonObject currentObject) { - current = currentObject.get(section); - if (current == null) { - return null; + current = currentObject.get(split); + } + } + + if (current != null) { + return current; + } + + for (var key : Set.copyOf(parent.keySet())) { + var keySplit = key.split("[.]"); + if (sections.length > keySplit.length) { + parent.remove(key); + continue; + } + for (int i = 0; i < sections.length; i++) { + if (!sections[i].equals(keySplit[i])) { + parent.remove(key); + break; } } } - return current; + return parent.isEmpty() ? null : parent; } } diff --git a/src/test/java/com/redhat/devtools/lsp4ij/client/SettingsHelperTest.java b/src/test/java/com/redhat/devtools/lsp4ij/client/SettingsHelperTest.java index a00ad36fb..f9515e3b7 100644 --- a/src/test/java/com/redhat/devtools/lsp4ij/client/SettingsHelperTest.java +++ b/src/test/java/com/redhat/devtools/lsp4ij/client/SettingsHelperTest.java @@ -35,26 +35,25 @@ public class SettingsHelperTest extends BasePlatformTestCase { "subsettingA": 1, "subsettingB": 2 } - } + }, + "flat.scalar.value": "flat value", + "flat.scalar.value2": "flat value2", + "JimmerDTO.Classpath.FindBuilder": false, + "JimmerDTO.Classpath.FindConfiguration": false } """; - private static void assertFindSettings(@NotNull String json, @NotNull String[] sections, @Nullable String expectedJsonText) { + private static void assertFindSettings(@NotNull String json, @NotNull String section, @Nullable String expectedJsonText) { JsonObject jsonObject = JsonParser.parseReader(new StringReader(json)).getAsJsonObject(); JsonElement expectedJson = expectedJsonText == null ? null : JsonParser.parseReader(new StringReader(expectedJsonText)); - JsonElement result = SettingsHelper.findSettings(sections, jsonObject); + JsonElement result = SettingsHelper.findSettings(section, jsonObject); assertEquals(result, expectedJson); } - public void testGetSettingsIdentityOnEmptySections() { - String[] requestedPath = new String[0]; - assertFindSettings(testJson, requestedPath, testJson); - } - public void testGetSettingsObjectValue() { - String[] requestedPath = new String[]{"mylsp"}; + var requestedPath = "mylsp"; assertFindSettings(testJson, requestedPath, """ { "myscalarsetting": "value", @@ -67,22 +66,67 @@ public void testGetSettingsObjectValue() { } public void testGetSettingsPrimitiveValue() { - String[] requestedPath = new String[]{"mylsp", "myscalarsetting"}; + var requestedPath = "mylsp.myscalarsetting"; assertFindSettings(testJson, requestedPath, "\"value\""); } public void testGetSettingsDeepPrimitiveValue() { - String[] requestedPath = new String[]{"mylsp", "myobjectsettings", "subsettingA"}; + var requestedPath = "mylsp.myobjectsettings.subsettingA"; assertFindSettings(testJson, requestedPath, "1"); } public void testGetSettingsNonExistingValue() { - String[] requestedPath = new String[]{"mylsp", "nonexistant"}; + var requestedPath = "mylsp.nonexistant"; assertFindSettings(testJson, requestedPath, null); } public void testGetSettingsEmptyJson() { - String[] requestedPath = new String[]{"mylsp", "myobjectsettings", "subsettingA"}; + var requestedPath = "mylsp.myobjectsettings.subsettingA"; assertFindSettings("{}", requestedPath, null); } + + public void testFlatScalarValue() { + var requestedPath = "flat.scalar.value"; + assertFindSettings(testJson, requestedPath, "\"flat value\""); + } + + public void testFlatScalar() { + var requestedPath = "flat.scalar"; + assertFindSettings(testJson, requestedPath, """ + { + "flat.scalar.value": "flat value", + "flat.scalar.value2": "flat value2" + } + """); + } + + public void testFlatScalarNonExisting() { + var requestedPath = "flat.scalar.nonexistant"; + assertFindSettings(testJson, requestedPath, null); + } + + public void testJimmerDTO() { + var requestedPath = "JimmerDTO"; + assertFindSettings(testJson, requestedPath, """ + { + "JimmerDTO.Classpath.FindBuilder": false, + "JimmerDTO.Classpath.FindConfiguration": false + } + """); + } + + public void testJimmerDTOClasspath() { + var requestedPath = "JimmerDTO.Classpath"; + assertFindSettings(testJson, requestedPath, """ + { + "JimmerDTO.Classpath.FindBuilder": false, + "JimmerDTO.Classpath.FindConfiguration": false + } + """); + } + + public void testJimmerDTOClasspathFindBuilder() { + var requestedPath = "JimmerDTO.Classpath.FindBuilder"; + assertFindSettings(testJson, requestedPath, "false"); + } }