From 6dd7c4bcbef2496b9e2db3d5ba7ad10bdf97b239 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Mon, 1 Feb 2016 11:01:53 +0300 Subject: [PATCH] Properties files: code formatting is introduced --- .../psi/PropertiesElementFactory.java | 2 +- .../PropertiesCodeStyleSettings.java | 42 ++++++- .../PropertiesCodeStyleSettingsPanel.form | 37 ------ .../PropertiesCodeStyleSettingsPanel.java | 85 ++++---------- ...ngPropertyKeyValueDelimiterInspection.java | 2 +- ...AlphaUnsortedPropertiesFileInspection.java | 2 +- plugins/properties/src/META-INF/plugin.xml | 1 + .../PropertiesFormattingModelBuilder.java | 85 ++++++++++++++ .../formatting/PropertiesRootBlock.java | 109 ++++++++++++++++++ .../properties/formatting/PropertyBlock.java | 56 +++++++++ .../properties/formatting/SeparatorBlock.java | 55 +++++++++ .../lang/properties/PropertiesFileTest.java | 4 +- 12 files changed, 376 insertions(+), 104 deletions(-) delete mode 100644 plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.form create mode 100644 plugins/properties/src/com/intellij/lang/properties/formatting/PropertiesFormattingModelBuilder.java create mode 100644 plugins/properties/src/com/intellij/lang/properties/formatting/PropertiesRootBlock.java create mode 100644 plugins/properties/src/com/intellij/lang/properties/formatting/PropertyBlock.java create mode 100644 plugins/properties/src/com/intellij/lang/properties/formatting/SeparatorBlock.java diff --git a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/PropertiesElementFactory.java b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/PropertiesElementFactory.java index a3959081a7a7..74d09f10d7a5 100644 --- a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/PropertiesElementFactory.java +++ b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/PropertiesElementFactory.java @@ -56,7 +56,7 @@ public class PropertiesElementFactory { @Nullable Project project, boolean escape) { if (delimiter == null) { - delimiter = project == null ? PropertiesCodeStyleSettings.DEFAULT_KEY_VALUE_DELIMITER : PropertiesCodeStyleSettings.getInstance(project).KEY_VALUE_DELIMITER; + delimiter = project == null ? '=' : PropertiesCodeStyleSettings.getInstance(project).getDelimiter(); } return (escape ? escape(name) : name) + String.valueOf(delimiter) + (escape ? escapeValue(value) : value); } diff --git a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettings.java b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettings.java index 1ba1422ff3a4..17885b20b498 100644 --- a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettings.java +++ b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettings.java @@ -17,15 +17,17 @@ package com.intellij.lang.properties.psi.codeStyle; import com.intellij.lang.properties.PropertiesLanguage; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.InvalidDataException; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.codeStyle.CustomCodeStyleSettings; +import org.jdom.Element; /** * @author Dmitry Batkovich */ public class PropertiesCodeStyleSettings extends CustomCodeStyleSettings { - public final static char DEFAULT_KEY_VALUE_DELIMITER = '='; + public final static char[] DELIMITERS = new char[]{'=', ':', ' '}; public PropertiesCodeStyleSettings(CodeStyleSettings container) { super(PropertiesLanguage.INSTANCE.getID(), container); @@ -35,5 +37,41 @@ public class PropertiesCodeStyleSettings extends CustomCodeStyleSettings { return CodeStyleSettingsManager.getSettings(project).getCustomSettings(PropertiesCodeStyleSettings.class); } - public char KEY_VALUE_DELIMITER = DEFAULT_KEY_VALUE_DELIMITER; + public boolean SPACES_AROUND_KEY_VALUE_DELIMITER = false; + public int KEY_VALUE_DELIMITER_CODE = 0; + + public char getDelimiter() { + return DELIMITERS[KEY_VALUE_DELIMITER_CODE]; + } + + @Override + public void readExternal(Element parentElement) throws InvalidDataException { + super.readExternal(parentElement); + parentElement = parentElement.getChild(getTagName()); + if (parentElement != null) { + Character delimiter = null; + for (final Object o : parentElement.getChildren("option")) { + Element e = (Element)o; + String fieldName = e.getAttributeValue("name"); + if ("KEY_VALUE_DELIMITER".equals(fieldName)) { + final String value = e.getAttributeValue("value"); + delimiter = value.charAt(0); + break; + } + } + if (delimiter != null) { + switch (delimiter) { + case '=': + KEY_VALUE_DELIMITER_CODE = 0; + break; + case ':': + KEY_VALUE_DELIMITER_CODE = 1; + break; + case ' ': + KEY_VALUE_DELIMITER_CODE = 2; + break; + } + } + } + } } diff --git a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.form b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.form deleted file mode 100644 index 1c2c50f97d1b..000000000000 --- a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.form +++ /dev/null @@ -1,37 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.java b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.java index 6c9819b77695..c78a980720ad 100644 --- a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.java +++ b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/psi/codeStyle/PropertiesCodeStyleSettingsPanel.java @@ -15,63 +15,48 @@ */ package com.intellij.lang.properties.psi.codeStyle; -import com.intellij.application.options.CodeStyleAbstractPanel; +import com.intellij.application.options.codeStyle.OptionTableWithPreviewPanel; import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.highlighter.EditorHighlighter; +import com.intellij.openapi.editor.highlighter.EditorHighlighterFactory; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.StdFileTypes; -import com.intellij.openapi.options.ConfigurationException; -import com.intellij.openapi.ui.ComboBox; import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider; +import com.intellij.testFramework.LightVirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.*; - /** * @author Dmitry Batkovich */ -public class PropertiesCodeStyleSettingsPanel extends CodeStyleAbstractPanel { - private final static String WHITESPACE_ELEMENT = "Whitespace symbol"; - - private ComboBox myDelimiterCombo; - private JPanel myPanel; - +public class PropertiesCodeStyleSettingsPanel extends OptionTableWithPreviewPanel { public PropertiesCodeStyleSettingsPanel(CodeStyleSettings settings) { super(settings); - final DefaultComboBoxModel model = new DefaultComboBoxModel(); - model.addElement(':'); - model.addElement('='); - model.addElement(WHITESPACE_ELEMENT); - myDelimiterCombo.setModel(model); - selectChar(settings.getCustomSettings(PropertiesCodeStyleSettings.class)); - } - - private void selectChar(PropertiesCodeStyleSettings settings) { - myDelimiterCombo.setSelectedItem(settings.KEY_VALUE_DELIMITER == ' ' ? WHITESPACE_ELEMENT : settings.KEY_VALUE_DELIMITER); - } - - private char getSelectedChar() { - final Object item = myDelimiterCombo.getModel().getSelectedItem(); - if (item instanceof Character) { - return (Character)item; - } - assert item == WHITESPACE_ELEMENT; - return ' '; - } - - private void createUIComponents() { + init(); } @Override - protected int getRightMargin() { - return 0; + public LanguageCodeStyleSettingsProvider.SettingsType getSettingsType() { + return LanguageCodeStyleSettingsProvider.SettingsType.BLANK_LINES_SETTINGS; + } + + @Override + protected void initTables() { + addOption("ALIGN_GROUP_FIELD_DECLARATIONS", "Align properties in column"); + showStandardOptions("SPACE_AROUND_ASSIGNMENT_OPERATORS", "ALIGN_GROUP_FIELD_DECLARATIONS"); + showCustomOption(PropertiesCodeStyleSettings.class, "SPACES_AROUND_KEY_VALUE_DELIMITER", + "Insert space around key-value delimiter", null); + showCustomOption(PropertiesCodeStyleSettings.class, + "KEY_VALUE_DELIMITER_CODE", + "Key-value delimiter", null, + new String[]{"=", ":", "whitespace symbol"}, new int[]{0, 1, 2}); } @Nullable @Override protected EditorHighlighter createHighlighter(EditorColorsScheme scheme) { - return null; + return EditorHighlighterFactory.getInstance().createEditorHighlighter(new LightVirtualFile("p.properties"), scheme, null); } @NotNull @@ -83,29 +68,9 @@ public class PropertiesCodeStyleSettingsPanel extends CodeStyleAbstractPanel { @Nullable @Override protected String getPreviewText() { - return null; - } - - @Override - public void apply(CodeStyleSettings settings) throws ConfigurationException { - final PropertiesCodeStyleSettings propertiesCodeStyleSettings = settings.getCustomSettings(PropertiesCodeStyleSettings.class); - propertiesCodeStyleSettings.KEY_VALUE_DELIMITER = getSelectedChar(); - } - - @Override - public boolean isModified(CodeStyleSettings settings) { - final PropertiesCodeStyleSettings propertiesCodeStyleSettings = settings.getCustomSettings(PropertiesCodeStyleSettings.class); - return propertiesCodeStyleSettings.KEY_VALUE_DELIMITER != getSelectedChar(); - } - - @Nullable - @Override - public JComponent getPanel() { - return myPanel; - } - - @Override - protected void resetImpl(CodeStyleSettings settings) { - selectChar(settings.getCustomSettings(PropertiesCodeStyleSettings.class)); + return "key1=value\n" + + "some_key=some_value\n" + + "#commentaries\n" + + "last.key=some text here"; } } diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/WrongPropertyKeyValueDelimiterInspection.java b/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/WrongPropertyKeyValueDelimiterInspection.java index f99284e13f59..a37e2bdb2f6b 100644 --- a/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/WrongPropertyKeyValueDelimiterInspection.java +++ b/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/WrongPropertyKeyValueDelimiterInspection.java @@ -39,7 +39,7 @@ public class WrongPropertyKeyValueDelimiterInspection extends PropertySuppressab return PsiElementVisitor.EMPTY_VISITOR; } final PropertiesCodeStyleSettings codeStyleSettings = PropertiesCodeStyleSettings.getInstance(holder.getProject()); - final char codeStyleKeyValueDelimiter = codeStyleSettings.KEY_VALUE_DELIMITER; + final char codeStyleKeyValueDelimiter = codeStyleSettings.getDelimiter(); return new PsiElementVisitor() { @Override public void visitElement(PsiElement element) { diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unsorted/AlphaUnsortedPropertiesFileInspection.java b/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unsorted/AlphaUnsortedPropertiesFileInspection.java index feab80c38ada..7fe5a6d8ffab 100644 --- a/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unsorted/AlphaUnsortedPropertiesFileInspection.java +++ b/plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unsorted/AlphaUnsortedPropertiesFileInspection.java @@ -129,7 +129,7 @@ public class AlphaUnsortedPropertiesFileInspection extends LocalInspectionTool { return Comparing.compare(p1.getKey(), p2.getKey(), String.CASE_INSENSITIVE_ORDER); } }); - final char delimiter = PropertiesCodeStyleSettings.getInstance(file.getProject()).KEY_VALUE_DELIMITER; + final char delimiter = PropertiesCodeStyleSettings.getInstance(file.getProject()).getDelimiter(); final StringBuilder rawText = new StringBuilder(); for (int i = 0; i < properties.size(); i++) { IProperty property = properties.get(i); diff --git a/plugins/properties/src/META-INF/plugin.xml b/plugins/properties/src/META-INF/plugin.xml index 4937e63a1006..a41aa11884ce 100644 --- a/plugins/properties/src/META-INF/plugin.xml +++ b/plugins/properties/src/META-INF/plugin.xml @@ -112,6 +112,7 @@ + diff --git a/plugins/properties/src/com/intellij/lang/properties/formatting/PropertiesFormattingModelBuilder.java b/plugins/properties/src/com/intellij/lang/properties/formatting/PropertiesFormattingModelBuilder.java new file mode 100644 index 000000000000..c03bcbba791d --- /dev/null +++ b/plugins/properties/src/com/intellij/lang/properties/formatting/PropertiesFormattingModelBuilder.java @@ -0,0 +1,85 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.lang.properties.formatting; + +import com.intellij.formatting.*; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.formatter.FormattingDocumentModelImpl; +import com.intellij.psi.impl.source.SourceTreeToPsiMap; +import com.intellij.psi.impl.source.tree.TreeElement; +import com.intellij.psi.impl.source.tree.TreeUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Dmitry Batkovich + */ +public class PropertiesFormattingModelBuilder implements FormattingModelBuilder { + @NotNull + @Override + public PropertiesFormattingModel createModel(PsiElement element, CodeStyleSettings settings) { + final ASTNode root = TreeUtil.getFileElement((TreeElement)SourceTreeToPsiMap.psiElementToTree(element)); + final FormattingDocumentModelImpl documentModel = FormattingDocumentModelImpl.createOn(element.getContainingFile()); + return new PropertiesFormattingModel(root, documentModel, settings); + } + + @Nullable + @Override + public TextRange getRangeAffectingIndent(PsiFile file, int offset, ASTNode elementAtOffset) { + return null; + } + + private static class PropertiesFormattingModel implements FormattingModel { + private final FormattingDocumentModelImpl myDocumentModel; + private PropertiesRootBlock myRoot; + + public PropertiesFormattingModel(ASTNode root, FormattingDocumentModelImpl documentModel, CodeStyleSettings settings) { + myRoot = new PropertiesRootBlock(root, null, settings); + myDocumentModel = documentModel; + } + + @NotNull + @Override + public Block getRootBlock() { + return myRoot; + } + + @NotNull + @Override + public FormattingDocumentModel getDocumentModel() { + return myDocumentModel; + } + + @Override + public TextRange replaceWhiteSpace(TextRange textRange, String whiteSpace) { + return textRange; + } + + @Override + public TextRange shiftIndentInsideRange(ASTNode node, TextRange range, int indent) { + return null; + } + + @Override + public void commitChanges() { + + } + } +} diff --git a/plugins/properties/src/com/intellij/lang/properties/formatting/PropertiesRootBlock.java b/plugins/properties/src/com/intellij/lang/properties/formatting/PropertiesRootBlock.java new file mode 100644 index 000000000000..371eb06d0df4 --- /dev/null +++ b/plugins/properties/src/com/intellij/lang/properties/formatting/PropertiesRootBlock.java @@ -0,0 +1,109 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.lang.properties.formatting; + +import com.intellij.formatting.Alignment; +import com.intellij.formatting.Block; +import com.intellij.formatting.Spacing; +import com.intellij.formatting.Wrap; +import com.intellij.lang.ASTNode; +import com.intellij.lang.properties.parsing.PropertiesTokenTypes; +import com.intellij.lang.properties.parsing.PropertyListStubElementType; +import com.intellij.lang.properties.parsing.PropertyStubElementType; +import com.intellij.lang.properties.psi.codeStyle.PropertiesCodeStyleSettings; +import com.intellij.lang.properties.psi.impl.PropertyKeyImpl; +import com.intellij.lang.properties.psi.impl.PropertyValueImpl; +import com.intellij.psi.PsiWhiteSpace; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.formatter.common.AbstractBlock; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Dmitry Batkovich + */ +public class PropertiesRootBlock extends AbstractBlock { + + private final CodeStyleSettings mySettings; + private Alignment mySeparatorAlignment; + + protected PropertiesRootBlock(@NotNull ASTNode node, + @Nullable Wrap wrap, CodeStyleSettings settings) { + super(node, wrap, Alignment.createAlignment()); + mySettings = settings; + mySeparatorAlignment = Alignment.createAlignment(true, Alignment.Anchor.LEFT); + } + + @Override + protected List buildChildren() { + final List result = new ArrayList<>(); + ASTNode child = myNode.getFirstChildNode(); + while (child != null) { + if (!(child instanceof PsiWhiteSpace)) { + if (child.getElementType() instanceof PropertyListStubElementType) { + ASTNode propertyNode = child.getFirstChildNode(); + while (propertyNode != null) { + if (propertyNode.getElementType() instanceof PropertyStubElementType) { + collectPropertyBlock(propertyNode, result); + } + else if (PropertiesTokenTypes.END_OF_LINE_COMMENT.equals(propertyNode.getElementType())) { + result.add(new PropertyBlock(propertyNode, null)); + } + propertyNode = propertyNode.getTreeNext(); + } + break; + } + } + if (PropertiesTokenTypes.END_OF_LINE_COMMENT.equals(child.getElementType())) { + result.add(new PropertyBlock(child, null)); + } + child = child.getTreeNext(); + } + return result; + } + + private void collectPropertyBlock(ASTNode propertyNode, List collector) { + final ASTNode key = propertyNode.getFirstChildNode(); + if (key instanceof PropertyKeyImpl) { + collector.add(new PropertyBlock(key, null)); + final ASTNode separator = key.getTreeNext(); + if (separator != null && PropertiesTokenTypes.KEY_VALUE_SEPARATOR.equals(separator.getElementType())) { + collector.add(new SeparatorBlock(separator, mySettings.ALIGN_GROUP_FIELD_DECLARATIONS ? mySeparatorAlignment : null)); + final ASTNode value = separator.getTreeNext(); + if (value instanceof PropertyValueImpl) { + collector.add(new PropertyBlock(value, null)); + } + } + } + } + + @Nullable + @Override + public Spacing getSpacing(@Nullable Block child1, @NotNull Block child2) { + return mySettings.getCustomSettings(PropertiesCodeStyleSettings.class).SPACES_AROUND_KEY_VALUE_DELIMITER && + (child1 instanceof SeparatorBlock || child2 instanceof SeparatorBlock) + ? Spacing.createSpacing(1, 1, 0, true, 0) + : Spacing.createSpacing(0, 0, 0, true, 0); + } + + @Override + public boolean isLeaf() { + return false; + } +} diff --git a/plugins/properties/src/com/intellij/lang/properties/formatting/PropertyBlock.java b/plugins/properties/src/com/intellij/lang/properties/formatting/PropertyBlock.java new file mode 100644 index 000000000000..a7dd751b95c7 --- /dev/null +++ b/plugins/properties/src/com/intellij/lang/properties/formatting/PropertyBlock.java @@ -0,0 +1,56 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.lang.properties.formatting; + +import com.intellij.formatting.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.formatter.common.AbstractBlock; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; + +/** + * @author Dmitry Batkovich + */ +public class PropertyBlock extends AbstractBlock { + protected PropertyBlock(@NotNull ASTNode node, + @Nullable Alignment alignment) { + super(node, null, alignment); + } + + @Override + protected List buildChildren() { + return Collections.emptyList(); + } + + @Nullable + @Override + public Spacing getSpacing(@Nullable Block child1, @NotNull Block child2) { + return null; + } + + @Override + public boolean isLeaf() { + return true; + } + + @Override + public Indent getIndent() { + return Indent.getAbsoluteNoneIndent(); + } +} diff --git a/plugins/properties/src/com/intellij/lang/properties/formatting/SeparatorBlock.java b/plugins/properties/src/com/intellij/lang/properties/formatting/SeparatorBlock.java new file mode 100644 index 000000000000..4a5e87623d89 --- /dev/null +++ b/plugins/properties/src/com/intellij/lang/properties/formatting/SeparatorBlock.java @@ -0,0 +1,55 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.lang.properties.formatting; + +import com.intellij.formatting.Alignment; +import com.intellij.formatting.Block; +import com.intellij.formatting.Indent; +import com.intellij.formatting.Spacing; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.text.StringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; + +/** + * @author Dmitry Batkovich + */ +public class SeparatorBlock extends PropertyBlock { + private final static Logger LOG = Logger.getInstance(SeparatorBlock.class); + + protected SeparatorBlock(@NotNull ASTNode node, + @Nullable Alignment alignment) { + super(node, alignment); + } + + @NotNull + @Override + public TextRange getTextRange() { + final String nodeText = myNode.getText(); + int separatorLocalOffset = StringUtil.indexOfAny(nodeText, "=:"); + if (separatorLocalOffset == -1 && !nodeText.isEmpty() && nodeText.charAt(0) == ' ') { + separatorLocalOffset = 0; + } + LOG.assertTrue(separatorLocalOffset > -1, "Invalid separator \"" + myNode.getText() + "\'"); + final int separatorOffset = myNode.getStartOffset() + separatorLocalOffset; + return new TextRange(separatorOffset, separatorOffset + 1); + } +} diff --git a/plugins/properties/testSrc/com/intellij/lang/properties/PropertiesFileTest.java b/plugins/properties/testSrc/com/intellij/lang/properties/PropertiesFileTest.java index ce479b88c18e..93c519058709 100644 --- a/plugins/properties/testSrc/com/intellij/lang/properties/PropertiesFileTest.java +++ b/plugins/properties/testSrc/com/intellij/lang/properties/PropertiesFileTest.java @@ -182,12 +182,12 @@ public class PropertiesFileTest extends LightPlatformCodeInsightFixtureTestCase public void testNonDefaultKeyValueDelimiter() { final PropertiesCodeStyleSettings codeStyleSettings = PropertiesCodeStyleSettings.getInstance(getProject()); - codeStyleSettings.KEY_VALUE_DELIMITER = ':'; + codeStyleSettings.KEY_VALUE_DELIMITER_CODE = 1; final PropertyImpl property = (PropertyImpl)PropertiesElementFactory.createProperty(getProject(), "xxx", "yyy"); final Character delimiter = property.getKeyValueDelimiter(); assertNotNull(delimiter); assertEquals(':', (char)delimiter); assertEquals("xxx:yyy", property.getPsiElement().getText()); - codeStyleSettings.KEY_VALUE_DELIMITER = PropertiesCodeStyleSettings.DEFAULT_KEY_VALUE_DELIMITER; + codeStyleSettings.KEY_VALUE_DELIMITER_CODE = 0; } }