From 1d2beb8576ea552a9da18710cc72a9a537497f16 Mon Sep 17 00:00:00 2001 From: sebthom Date: Mon, 29 Jan 2024 00:08:58 +0100 Subject: [PATCH] feat: parse and display colorized bracket pairs --- .../LanguageConfigurationMessages.java | 1 + .../LanguageConfigurationMessages.properties | 1 + .../internal/model/LanguageConfiguration.java | 15 ++++++++++++++- .../LanguageConfigurationInfoWidget.java | 13 ++++++++++++- .../internal/supports/ParsingTest.java | 18 ++++++++++++++++++ 5 files changed, 46 insertions(+), 2 deletions(-) diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.java index 972aebe47..268ee8711 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.java +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.java @@ -31,6 +31,7 @@ public final class LanguageConfigurationMessages extends NLS { public static String LanguageConfigurationInfoWidget_blockCommentsEnd; public static String LanguageConfigurationInfoWidget_blockCommentsStart; public static String LanguageConfigurationInfoWidget_brackets_title; + public static String LanguageConfigurationInfoWidget_colorizedBracketPairs_title; public static String LanguageConfigurationInfoWidget_comments_title; public static String LanguageConfigurationInfoWidget_end; public static String LanguageConfigurationInfoWidget_folding_title; diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.properties b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.properties index 9ca1162d6..3248dc8e1 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.properties +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/LanguageConfigurationMessages.properties @@ -18,6 +18,7 @@ LanguageConfigurationInfoWidget_autoCloseBefore_title=Auto Close Before LanguageConfigurationInfoWidget_blockCommentsEnd=Block Comment End: LanguageConfigurationInfoWidget_blockCommentsStart=Block Comment Start: LanguageConfigurationInfoWidget_brackets_title=Brackets +LanguageConfigurationInfoWidget_colorizedBracketPairs_title=Colorized Bracket Pairs LanguageConfigurationInfoWidget_comments_title=Comments LanguageConfigurationInfoWidget_end=End: LanguageConfigurationInfoWidget_folding_title=Folding diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/model/LanguageConfiguration.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/model/LanguageConfiguration.java index 76e08a6b2..cf0ead752 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/model/LanguageConfiguration.java +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/model/LanguageConfiguration.java @@ -291,6 +291,11 @@ private static String removeTrailingCommas(String jsonString) { langCfg.surroundingPairs.removeIf(Objects::isNull); } + if (castNullable(langCfg.colorizedBracketPairs) == null) { + langCfg.colorizedBracketPairs = Collections.emptyList(); + } else { + langCfg.colorizedBracketPairs.removeIf(Objects::isNull); + } return langCfg; } @@ -420,7 +425,15 @@ public List getSurroundingPairs() { return surroundingPairs; } - // TODO private @Nullable List getColorizedBracketPairs(); + private List colorizedBracketPairs = lazyNonNull(); + + /** + * Defines a list of bracket pairs that are colorized depending on their nesting level. + * If not set, the configured brackets will be used. + */ + public List getColorizedBracketPairs() { + return colorizedBracketPairs; + } private @Nullable String autoCloseBefore; diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationInfoWidget.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationInfoWidget.java index 26da09e3d..b8686ef00 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationInfoWidget.java +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationInfoWidget.java @@ -50,7 +50,8 @@ public class LanguageConfigurationInfoWidget extends Composite { LanguageConfigurationInfoWidget_folding_title, LanguageConfigurationInfoWidget_wordPattern_title, LanguageConfigurationInfoWidget_onEnterRules_title, - LanguageConfigurationInfoWidget_indentationRules_title + LanguageConfigurationInfoWidget_indentationRules_title, + LanguageConfigurationInfoWidget_colorizedBracketPairs_title, }; private Text lineCommentText; @@ -81,6 +82,8 @@ public class LanguageConfigurationInfoWidget extends Composite { private Text indentationIndentNextLinePattern; private Text indentationUnIndentedLinePattern; + private CharacterPairsTableWidget colorizedBracketPairsTable; + public LanguageConfigurationInfoWidget(final Composite parent, final int style) { super(parent, style); super.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).spacing(-1, 0).equalWidth(false).create()); @@ -139,6 +142,7 @@ private void createUI(final Composite parent) { createStackLayer.apply(this::createWordPatternInfo), createStackLayer.apply(this::createOnEnterRulesInfo), createStackLayer.apply(this::createIndentationRulesInfo), + createStackLayer.apply(this::createColorizedBracketPairsInfo), }; tableViewer.addSelectionChangedListener(event -> { @@ -168,6 +172,7 @@ public void refresh(@Nullable final LanguageConfiguration configuration) { indentationIncreaseIndentPattern.setText(""); indentationIndentNextLinePattern.setText(""); indentationUnIndentedLinePattern.setText(""); + colorizedBracketPairsTable.setInput(null); if (configuration == null) return; @@ -214,6 +219,8 @@ public void refresh(@Nullable final LanguageConfiguration configuration) { indentationIndentNextLinePattern.setText(Objects.toString(indentationRules.indentNextLinePattern, "")); indentationUnIndentedLinePattern.setText(Objects.toString(indentationRules.unIndentedLinePattern, "")); } + + colorizedBracketPairsTable.setInput(configuration.getColorizedBracketPairs()); } private void createCommentsInfo(final Composite parent) { @@ -261,6 +268,10 @@ private void createIndentationRulesInfo(final Composite parent) { indentationUnIndentedLinePattern = createText(parent, LanguageConfigurationInfoWidget_indentationRules_unIndentedLinePattern); } + private void createColorizedBracketPairsInfo(final Composite parent) { + colorizedBracketPairsTable = new CharacterPairsTableWidget(parent); + } + private Text createText(final Composite parent, final String s) { final var label = new Label(parent, SWT.NONE); label.setText(s); diff --git a/org.eclipse.tm4e.languageconfiguration/src/test/java/org/eclipse/tm4e/languageconfiguration/internal/supports/ParsingTest.java b/org.eclipse.tm4e.languageconfiguration/src/test/java/org/eclipse/tm4e/languageconfiguration/internal/supports/ParsingTest.java index 88c494c67..d63e34aab 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/test/java/org/eclipse/tm4e/languageconfiguration/internal/supports/ParsingTest.java +++ b/org.eclipse.tm4e.languageconfiguration/src/test/java/org/eclipse/tm4e/languageconfiguration/internal/supports/ParsingTest.java @@ -118,6 +118,24 @@ public FileVisitResult visitFile(final Path file, final @Nullable BasicFileAttri assertTrue(count.intValue() > 10, "Only " + count.intValue() + " language configurations found, expected more than 10!"); } + @Test + void testParseColorizedBracketsPair() throws Exception { + final var languageConfiguration = LanguageConfiguration.load(new StringReader(""" + { + "colorizedBracketPairs": [ + ["(",")"], + ["[","]"], + ["{","}"], + ["<",">"] + ], + }""")); + assertNotNull(languageConfiguration); + + assertEquals(4, languageConfiguration.getColorizedBracketPairs().size()); + assertEquals("(", languageConfiguration.getColorizedBracketPairs().get(0).open); + assertEquals(")", languageConfiguration.getColorizedBracketPairs().get(0).close); + } + @Test void testIndentationRules() throws Exception { final var languageConfiguration = LanguageConfiguration.load(new StringReader("""