From ff4e2bc16721eaf6106a1e3abc201d16de9f0215 Mon Sep 17 00:00:00 2001 From: Rustam Vishnyakov Date: Thu, 24 Jan 2019 14:47:03 +0300 Subject: [PATCH] EditorConfig support for list properties --- .../codeStyle/properties/BooleanAccessor.java | 2 +- .../properties/BraceStyleAccessor.java | 2 +- .../properties/CodeStylePropertyAccessor.java | 11 ++++++++ .../CommaSeparatedValuesAccessor.java | 9 ++---- .../properties/EnumPropertyAccessor.java | 2 +- .../properties/ForceBracesAccessor.java | 2 +- .../codeStyle/properties/IntegerAccessor.java | 2 +- .../properties/ScalarPropertyAccessor.java | 28 +++++++++++++++++++ .../codeStyle/properties/StringAccessor.java | 2 +- .../properties/ValueListPropertyAccessor.java | 12 ++++++++ .../properties/WrappingAccessor.java | 2 +- ...EditorConfigCodeStyleSettingsModifier.java | 14 ++++------ ...ntellijConfigOptionDescriptorProvider.java | 7 +++-- 13 files changed, 70 insertions(+), 25 deletions(-) create mode 100644 platform/lang-api/src/com/intellij/application/options/codeStyle/properties/ScalarPropertyAccessor.java diff --git a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/BooleanAccessor.java b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/BooleanAccessor.java index a6a129903395..b962012d4330 100644 --- a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/BooleanAccessor.java +++ b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/BooleanAccessor.java @@ -8,7 +8,7 @@ import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; -public class BooleanAccessor extends CodeStylePropertyAccessor implements CodeStyleChoiceList { +public class BooleanAccessor extends ScalarPropertyAccessor implements CodeStyleChoiceList { private final static List BOOLEAN_VALS = Arrays.asList("false", "true"); diff --git a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/BraceStyleAccessor.java b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/BraceStyleAccessor.java index 193435123e0c..057b558ce635 100644 --- a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/BraceStyleAccessor.java +++ b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/BraceStyleAccessor.java @@ -10,7 +10,7 @@ import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; -class BraceStyleAccessor extends CodeStylePropertyAccessor implements CodeStyleChoiceList { +class BraceStyleAccessor extends ScalarPropertyAccessor implements CodeStyleChoiceList { private final static BidirectionalMap BRACE_STYLE_MAP = new BidirectionalMap<>(); public static final String VALUE_END_OF_LINE = "end_of_line"; diff --git a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/CodeStylePropertyAccessor.java b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/CodeStylePropertyAccessor.java index 50f20b3d3c3c..4a022f65be4b 100644 --- a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/CodeStylePropertyAccessor.java +++ b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/CodeStylePropertyAccessor.java @@ -47,6 +47,17 @@ public abstract class CodeStylePropertyAccessor { return null; } + public final boolean setFromString(@NotNull String valueString) { + V extValue = parseString(valueString); + if (extValue != null) { + return set(extValue); + } + return false; + } + + @Nullable + protected abstract V parseString(@NotNull String string); + @NotNull public Class getObjectClass() { return myObject.getClass(); diff --git a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/CommaSeparatedValuesAccessor.java b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/CommaSeparatedValuesAccessor.java index 024f38cf7c59..e3163c386ee2 100644 --- a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/CommaSeparatedValuesAccessor.java +++ b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/CommaSeparatedValuesAccessor.java @@ -21,7 +21,7 @@ public class CommaSeparatedValuesAccessor extends ValueListPropertyAccessor 0) { valueBuilder.append(","); } - valueBuilder.append(extVal); + valueBuilder.append(value); } return valueBuilder.toString(); } @@ -29,11 +29,6 @@ public class CommaSeparatedValuesAccessor extends ValueListPropertyAccessor toExternal(@NotNull String value) { - List valueList = ContainerUtil.newArrayList(); - String[] parts = value.split(","); - for (String part : parts) { - valueList.add(part.trim()); - } - return valueList; + return getValueList(value); } } diff --git a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/EnumPropertyAccessor.java b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/EnumPropertyAccessor.java index 396e7196a8a0..4c2a7662ed88 100644 --- a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/EnumPropertyAccessor.java +++ b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/EnumPropertyAccessor.java @@ -10,7 +10,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; -public class EnumPropertyAccessor extends CodeStylePropertyAccessor implements CodeStyleChoiceList{ +public class EnumPropertyAccessor extends ScalarPropertyAccessor implements CodeStyleChoiceList{ private final Class myEnumClass; private final BidirectionalMap myEnumMap = new BidirectionalMap<>(); diff --git a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/ForceBracesAccessor.java b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/ForceBracesAccessor.java index 9cae4fa336ae..5860eedb2f1b 100644 --- a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/ForceBracesAccessor.java +++ b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/ForceBracesAccessor.java @@ -10,7 +10,7 @@ import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; -class ForceBracesAccessor extends CodeStylePropertyAccessor implements CodeStyleChoiceList { +class ForceBracesAccessor extends ScalarPropertyAccessor implements CodeStyleChoiceList { private final static BidirectionalMap FORCE_BRACES_MAP = new BidirectionalMap<>(); diff --git a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/IntegerAccessor.java b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/IntegerAccessor.java index ff15c8bd979e..c178c63984fe 100644 --- a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/IntegerAccessor.java +++ b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/IntegerAccessor.java @@ -5,7 +5,7 @@ import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; -public class IntegerAccessor extends CodeStylePropertyAccessor { +public class IntegerAccessor extends ScalarPropertyAccessor { IntegerAccessor(@NotNull Object object, @NotNull Field field) { super(object, field); } diff --git a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/ScalarPropertyAccessor.java b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/ScalarPropertyAccessor.java new file mode 100644 index 000000000000..99849d74e7c9 --- /dev/null +++ b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/ScalarPropertyAccessor.java @@ -0,0 +1,28 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.application.options.codeStyle.properties; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Field; + +public abstract class ScalarPropertyAccessor extends CodeStylePropertyAccessor { + + public ScalarPropertyAccessor(@NotNull Object object, @NotNull Field field) { + super(object, field); + } + + @Nullable + @Override + protected abstract T fromExternal(@NotNull String extVal); + + @NotNull + @Override + protected abstract String toExternal(@NotNull T value); + + @Nullable + @Override + protected String parseString(@NotNull String string) { + return string; + } +} \ No newline at end of file diff --git a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/StringAccessor.java b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/StringAccessor.java index ba5ea7ae0ad4..7b6baa98d9a8 100644 --- a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/StringAccessor.java +++ b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/StringAccessor.java @@ -7,7 +7,7 @@ import org.jetbrains.annotations.Nullable; import java.lang.reflect.Field; -class StringAccessor extends CodeStylePropertyAccessor { +class StringAccessor extends ScalarPropertyAccessor { StringAccessor(@NotNull Object object, @NotNull Field field) { super(object, field); diff --git a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/ValueListPropertyAccessor.java b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/ValueListPropertyAccessor.java index 51e73ba7d539..4d453f5180eb 100644 --- a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/ValueListPropertyAccessor.java +++ b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/ValueListPropertyAccessor.java @@ -1,6 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.application.options.codeStyle.properties; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -19,4 +20,15 @@ public abstract class ValueListPropertyAccessor extends CodeStylePropertyAcce @NotNull @Override protected abstract List toExternal(@NotNull T value); + + @Nullable + @Override + protected List parseString(@NotNull String string) { + return getValueList(string); + } + + @NotNull + protected static List getValueList(@NotNull String string) { + return ContainerUtil.map(string.split(","), s -> s.trim()); + } } diff --git a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/WrappingAccessor.java b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/WrappingAccessor.java index c508f2f9eefb..94bb32f68759 100644 --- a/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/WrappingAccessor.java +++ b/platform/lang-api/src/com/intellij/application/options/codeStyle/properties/WrappingAccessor.java @@ -10,7 +10,7 @@ import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; -class WrappingAccessor extends CodeStylePropertyAccessor implements CodeStyleChoiceList { +class WrappingAccessor extends ScalarPropertyAccessor implements CodeStyleChoiceList { private final static BidirectionalMap WRAPPING_MAP = new BidirectionalMap<>(); public static final String VALUE_OFF = "off"; diff --git a/plugins/editorconfig/src/org/editorconfig/configmanagement/extended/EditorConfigCodeStyleSettingsModifier.java b/plugins/editorconfig/src/org/editorconfig/configmanagement/extended/EditorConfigCodeStyleSettingsModifier.java index 51c3ab734acd..30ed52c0e13f 100644 --- a/plugins/editorconfig/src/org/editorconfig/configmanagement/extended/EditorConfigCodeStyleSettingsModifier.java +++ b/plugins/editorconfig/src/org/editorconfig/configmanagement/extended/EditorConfigCodeStyleSettingsModifier.java @@ -1,16 +1,15 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.editorconfig.configmanagement.extended; -import com.intellij.application.options.codeStyle.properties.CodeStylePropertyAccessor; -import com.intellij.application.options.codeStyle.properties.ValueListPropertyAccessor; -import com.intellij.psi.codeStyle.modifier.CodeStyleSettingsModifier; import com.intellij.application.options.codeStyle.properties.AbstractCodeStylePropertyMapper; +import com.intellij.application.options.codeStyle.properties.CodeStylePropertyAccessor; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleSettings; -import com.intellij.psi.codeStyle.modifier.CodeStyleStatusBarUIContributor; import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider; +import com.intellij.psi.codeStyle.modifier.CodeStyleSettingsModifier; +import com.intellij.psi.codeStyle.modifier.CodeStyleStatusBarUIContributor; import com.intellij.psi.codeStyle.modifier.TransientCodeStyleSettings; import org.editorconfig.Utils; import org.editorconfig.configmanagement.EditorConfigNavigationActionsFactory; @@ -82,11 +81,8 @@ public class EditorConfigCodeStyleSettingsModifier implements CodeStyleSettingsM String intellijName = EditorConfigIntellijNameUtil.toIntellijName(mapper, option.getKey()); if (intellijName != null) { CodeStylePropertyAccessor accessor = mapper.getAccessor(intellijName); - if (!(accessor instanceof ValueListPropertyAccessor)) { - //noinspection unchecked - if (accessor != null && accessor.set(option.getVal())) { - isModified = true; - } + if (accessor != null) { + isModified |= accessor.setFromString(option.getVal()); } } } diff --git a/plugins/editorconfig/src/org/editorconfig/configmanagement/extended/IntellijConfigOptionDescriptorProvider.java b/plugins/editorconfig/src/org/editorconfig/configmanagement/extended/IntellijConfigOptionDescriptorProvider.java index fc2f3a891cf7..ec5aa77166cf 100644 --- a/plugins/editorconfig/src/org/editorconfig/configmanagement/extended/IntellijConfigOptionDescriptorProvider.java +++ b/plugins/editorconfig/src/org/editorconfig/configmanagement/extended/IntellijConfigOptionDescriptorProvider.java @@ -67,9 +67,12 @@ public class IntellijConfigOptionDescriptorProvider implements EditorConfigOptio return new EditorConfigNumberDescriptor(null, null); } else if (accessor instanceof ValueListPropertyAccessor) { - return null; // No support yet + return new EditorConfigListDescriptor(0, true, Collections.singletonList(new EditorConfigStringDescriptor(null, null)), null, null); } - return new EditorConfigStringDescriptor(null, null); + else if (accessor instanceof ScalarPropertyAccessor) { + return new EditorConfigStringDescriptor(null, null); + } + return null; } private static List choicesToDescriptorList(@NotNull CodeStyleChoiceList list) {