From c3264f785c88917e294064c6ab61378d822bf2ad Mon Sep 17 00:00:00 2001 From: Vladimir Panimaskin Date: Sat, 16 Oct 2021 01:10:01 +0300 Subject: [PATCH] WEB-46949 insert leading/trailing space within block comment GitOrigin-RevId: 14f63a01c4eca077762b1426939aa0abc8594dda --- .../testData/codeStyle/jsonExport.json | 1 + .../CodeStyleSettingsCustomizable.java | 3 +- .../codeStyle/CommonCodeStyleSettings.java | 1 + .../messages/ApplicationBundle.properties | 3 +- .../options/codeStyle/CommenterForm.form | 12 +- .../options/codeStyle/CommenterForm.java | 28 ++- .../CommentByBlockCommentHandler.java | 66 +++++-- .../testData/codeStyle/json/exportToJson.json | 1 + resources-en/src/search/searchableOptions.xml | 180 ++++++++++++------ .../XmlLanguageCodeStyleSettingsProvider.java | 3 +- 10 files changed, 217 insertions(+), 81 deletions(-) diff --git a/java/java-tests/testData/codeStyle/jsonExport.json b/java/java-tests/testData/codeStyle/jsonExport.json index b873a46f4792..51b8f378083e 100644 --- a/java/java-tests/testData/codeStyle/jsonExport.json +++ b/java/java-tests/testData/codeStyle/jsonExport.json @@ -48,6 +48,7 @@ "blank_lines_before_method_body": 0, "blank_lines_before_package": 0, "block_brace_style": "end_of_line", + "block_comment_add_space": false, "block_comment_at_first_column": true, "builder_methods": [ "" diff --git a/platform/code-style-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsCustomizable.java b/platform/code-style-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsCustomizable.java index 996df438797b..b2bdc03eff8f 100644 --- a/platform/code-style-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsCustomizable.java +++ b/platform/code-style-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsCustomizable.java @@ -209,7 +209,8 @@ public interface CodeStyleSettingsCustomizable { enum CommenterOption { LINE_COMMENT_ADD_SPACE, LINE_COMMENT_AT_FIRST_COLUMN, - BLOCK_COMMENT_AT_FIRST_COLUMN + BLOCK_COMMENT_AT_FIRST_COLUMN, + BLOCK_COMMENT_ADD_SPACE } /** diff --git a/platform/code-style-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java b/platform/code-style-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java index 891c05bdeb9c..dabba507f5c8 100644 --- a/platform/code-style-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java +++ b/platform/code-style-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java @@ -240,6 +240,7 @@ public class CommonCodeStyleSettings { * Tells if a space is added when commenting/uncommenting lines with a line comment. */ public boolean LINE_COMMENT_ADD_SPACE = false; + public boolean BLOCK_COMMENT_ADD_SPACE = false; public boolean KEEP_LINE_BREAKS = true; diff --git a/platform/ide-core/resources/messages/ApplicationBundle.properties b/platform/ide-core/resources/messages/ApplicationBundle.properties index 73efd9fbf46e..c36f5b6d3763 100644 --- a/platform/ide-core/resources/messages/ApplicationBundle.properties +++ b/platform/ide-core/resources/messages/ApplicationBundle.properties @@ -600,7 +600,8 @@ editorsearch.in.selection.with.hint=Search in selection. {0} to search for selec code.style.other.file.types=Other File Types code.style.other.label=Text files and unsupported file types\: -checkbox.line.comment.add.space=Add a space at comment start +checkbox.line.comment.add.space=Add a space at line comment start +checkbox.block.comment.add.space=Add a space at block comment start rainbow.option.panel.display.name=Semantic highlighting checkbox.stop.1=Color #1 diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CommenterForm.form b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CommenterForm.form index 423a4051e4ce..37da591adc75 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CommenterForm.form +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CommenterForm.form @@ -1,6 +1,6 @@
- + @@ -18,7 +18,7 @@ - + @@ -37,6 +37,14 @@ + + + + + + + + diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CommenterForm.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CommenterForm.java index 0b72f81d3e73..5e4db986b5a3 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CommenterForm.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CommenterForm.java @@ -37,7 +37,8 @@ public class CommenterForm implements CodeStyleSettingsCustomizable { private JBCheckBox myLineCommentAtFirstColumnCb; private JBCheckBox myLineCommentAddSpaceCb; private JBCheckBox myBlockCommentAtFirstJBCheckBox; - + private JBCheckBox myBlockCommentAddSpaceCb; + private final Language myLanguage; public CommenterForm(Language language) { @@ -64,21 +65,24 @@ public class CommenterForm implements CodeStyleSettingsCustomizable { myBlockCommentAtFirstJBCheckBox.setSelected(langSettings.BLOCK_COMMENT_AT_FIRST_COLUMN); myLineCommentAddSpaceCb.setSelected(langSettings.LINE_COMMENT_ADD_SPACE && !langSettings.LINE_COMMENT_AT_FIRST_COLUMN); myLineCommentAddSpaceCb.setEnabled(!langSettings .LINE_COMMENT_AT_FIRST_COLUMN); + myBlockCommentAddSpaceCb.setSelected(langSettings.BLOCK_COMMENT_ADD_SPACE); } - - + + public void apply(@NotNull CodeStyleSettings settings) { CommonCodeStyleSettings langSettings = settings.getCommonSettings(myLanguage); langSettings.LINE_COMMENT_AT_FIRST_COLUMN = myLineCommentAtFirstColumnCb.isSelected(); langSettings.BLOCK_COMMENT_AT_FIRST_COLUMN = myBlockCommentAtFirstJBCheckBox.isSelected(); langSettings.LINE_COMMENT_ADD_SPACE = myLineCommentAddSpaceCb.isSelected(); + langSettings.BLOCK_COMMENT_ADD_SPACE = myBlockCommentAddSpaceCb.isSelected(); } - + public boolean isModified(@NotNull CodeStyleSettings settings) { CommonCodeStyleSettings langSettings = settings.getCommonSettings(myLanguage); return myLineCommentAtFirstColumnCb.isSelected() != langSettings.LINE_COMMENT_AT_FIRST_COLUMN || myBlockCommentAtFirstJBCheckBox.isSelected() != langSettings.BLOCK_COMMENT_AT_FIRST_COLUMN - || myLineCommentAddSpaceCb.isSelected() != langSettings.LINE_COMMENT_ADD_SPACE; + || myLineCommentAddSpaceCb.isSelected() != langSettings.LINE_COMMENT_ADD_SPACE + || myBlockCommentAddSpaceCb.isSelected() != langSettings.BLOCK_COMMENT_ADD_SPACE; } public JPanel getCommenterPanel() { @@ -102,15 +106,19 @@ public class CommenterForm implements CodeStyleSettingsCustomizable { else if (CommenterOption.BLOCK_COMMENT_AT_FIRST_COLUMN.name().equals(optionName)) { myBlockCommentAtFirstJBCheckBox.setVisible(true); } + else if (CommenterOption.BLOCK_COMMENT_ADD_SPACE.name().equals(optionName)) { + myBlockCommentAddSpaceCb.setVisible(true); + } } } - + private void setAllOptionsVisible(boolean isVisible) { myLineCommentAtFirstColumnCb.setVisible(isVisible); myLineCommentAddSpaceCb.setVisible(isVisible); myBlockCommentAtFirstJBCheckBox.setVisible(isVisible); + myBlockCommentAddSpaceCb.setVisible(isVisible); } - + private void customizeSettings() { setAllOptionsVisible(false); LanguageCodeStyleSettingsProvider settingsProvider = LanguageCodeStyleSettingsProvider.forLanguage(myLanguage); @@ -118,6 +126,10 @@ public class CommenterForm implements CodeStyleSettingsCustomizable { settingsProvider.customizeSettings(this, LanguageCodeStyleSettingsProvider.SettingsType.COMMENTER_SETTINGS); } myCommenterPanel.setVisible( - myLineCommentAtFirstColumnCb.isVisible() || myLineCommentAddSpaceCb.isVisible() || myBlockCommentAtFirstJBCheckBox.isVisible()); + myLineCommentAtFirstColumnCb.isVisible() + || myLineCommentAddSpaceCb.isVisible() + || myBlockCommentAtFirstJBCheckBox.isVisible() + || myBlockCommentAddSpaceCb.isVisible() + ); } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/generation/CommentByBlockCommentHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/generation/CommentByBlockCommentHandler.java index cab2a0cf3fc0..448ad1c606bd 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/generation/CommentByBlockCommentHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/generation/CommentByBlockCommentHandler.java @@ -48,6 +48,7 @@ public final class CommentByBlockCommentHandler extends MultiCaretCodeInsightAct private Editor myEditor; private Caret myCaret; private PsiFile myFile; + private Language myLanguage; private Document myDocument; private Commenter myCommenter; private CommenterDataHolder mySelfManagedCommenterData; @@ -63,6 +64,7 @@ public final class CommentByBlockCommentHandler extends MultiCaretCodeInsightAct myWarningLocation = null; myDocument = editor.getDocument(); + myLanguage = getLanguage(caret, file); FeatureUsageTracker.getInstance().triggerFeatureUsed("codeassists.comment.block"); final Commenter commenter = findCommenter(myFile, myEditor, caret); @@ -138,8 +140,11 @@ public final class CommentByBlockCommentHandler extends MultiCaretCodeInsightAct } } if (selectionStart == selectionEnd) { - myDocument.insertString(selectionStart, prefix + suffix); - myCaret.moveToOffset(selectionStart + prefix.length()); + CommonCodeStyleSettings settings = getLanguageSettings(); + int offset = settings.BLOCK_COMMENT_ADD_SPACE ? prefix.length() + 1 : prefix.length(); + String comment = settings.BLOCK_COMMENT_ADD_SPACE ? prefix + " " + suffix : prefix + suffix; + myDocument.insertString(selectionStart, comment); + myCaret.moveToOffset(selectionStart + offset); } else { commentRange(selectionStart, selectionEnd, prefix, suffix, commenter); @@ -149,6 +154,15 @@ public final class CommentByBlockCommentHandler extends MultiCaretCodeInsightAct showMessageIfNeeded(); } + private static @NotNull Language getLanguage(@NotNull Caret caret, @NotNull PsiFile file) { + Language language = PsiUtilBase.getLanguageInEditor(caret, file.getProject()); + return language != null ? language : file.getLanguage(); + } + + private @NotNull CommonCodeStyleSettings getLanguageSettings() { + return CodeStyle.getLanguageSettings(myFile, myLanguage); + } + private void showMessageIfNeeded() { if (myWarning != null) { myEditor.getScrollingModel().disableAnimation(); @@ -397,9 +411,9 @@ public final class CommentByBlockCommentHandler extends MultiCaretCodeInsightAct final CharSequence chars = myDocument.getCharsSequence(); LogicalPosition caretPosition = myCaret.getLogicalPosition(); + CommonCodeStyleSettings settings = getLanguageSettings(); if (startOffset == 0 || chars.charAt(startOffset - 1) == '\n') { if (endOffset == myDocument.getTextLength() || endOffset > 0 && chars.charAt(endOffset - 1) == '\n') { - CommonCodeStyleSettings settings = CodeStyle.getLanguageSettings(myFile); String space; Boolean forced = commenter instanceof IndentedCommenter ? ((IndentedCommenter)commenter).forceIndentedBlockComment() : null; if ((forced == null && !settings.BLOCK_COMMENT_AT_FIRST_COLUMN) || forced == Boolean.TRUE) { @@ -430,10 +444,17 @@ public final class CommentByBlockCommentHandler extends MultiCaretCodeInsightAct } } - TextRange range = insertNestedComments(startOffset, endOffset, commentPrefix, commentSuffix, commenter); + String nestingPrefix = commentPrefix; + String nestingSuffix = commentSuffix; + if (settings.BLOCK_COMMENT_ADD_SPACE) { + nestingPrefix += " "; + nestingSuffix = " " + nestingSuffix; + } + + TextRange range = insertNestedComments(startOffset, endOffset, nestingPrefix, nestingSuffix, commenter); if (range != null) { myCaret.setSelection(range.getStartOffset(), range.getEndOffset()); - LogicalPosition pos = new LogicalPosition(caretPosition.line, caretPosition.column + commentPrefix.length()); + LogicalPosition pos = new LogicalPosition(caretPosition.line, caretPosition.column + nestingPrefix.length()); myCaret.moveToLogicalPosition(pos); } } @@ -683,7 +704,7 @@ public final class CommentByBlockCommentHandler extends MultiCaretCodeInsightAct } } - private TextRange expandRange(int delOffset1, int delOffset2) { + private @NotNull TextRange expandRange(int delOffset1, int delOffset2) { CharSequence chars = myDocument.getCharsSequence(); int offset1 = CharArrayUtil.shiftBackward(chars, delOffset1 - 1, " \t"); if (offset1 < 0 || chars.charAt(offset1) == '\n' || chars.charAt(offset1) == '\r') { @@ -702,20 +723,37 @@ public final class CommentByBlockCommentHandler extends MultiCaretCodeInsightAct } private Couple findCommentBlock(TextRange range, String commentPrefix, String commentSuffix) { + CommonCodeStyleSettings settings = getLanguageSettings(); CharSequence chars = myDocument.getCharsSequence(); int startOffset = range.getStartOffset(); boolean endsProperly = CharArrayUtil.regionMatches(chars, range.getEndOffset() - commentSuffix.length(), commentSuffix); - TextRange start = expandRange(startOffset, startOffset + commentPrefix.length()); - TextRange end; - if (endsProperly) { - end = expandRange(range.getEndOffset() - commentSuffix.length(), range.getEndOffset()); - } - else { - end = new TextRange(range.getEndOffset(), range.getEndOffset()); + TextRange initialPrefix = TextRange.create(startOffset, startOffset + commentPrefix.length()); + TextRange prefix = expandRange(initialPrefix.getStartOffset(), initialPrefix.getEndOffset()); + // is expanded only in cases when the comment prefix or suffix are the only characters in the line except whitespaces + // so there's no need to remove block white space + if (settings.BLOCK_COMMENT_ADD_SPACE && initialPrefix.equals(prefix)) { + if (StringUtil.isChar(chars, prefix.getEndOffset(), ' ')) { + prefix = prefix.grown(1); + } } - return Couple.of(start, end); + TextRange suffix; + if (endsProperly) { + TextRange initialSuffix = TextRange.create(range.getEndOffset() - commentSuffix.length(), range.getEndOffset()); + suffix = expandRange(initialSuffix.getStartOffset(), initialSuffix.getEndOffset()); + if (settings.BLOCK_COMMENT_ADD_SPACE && initialSuffix.equals(suffix)) { + int suffixSpaceIdx = suffix.getStartOffset() - 1; + if (prefix.getEndOffset() <= suffixSpaceIdx && StringUtil.isChar(chars, suffixSpaceIdx, ' ')) { + suffix = TextRange.create(suffixSpaceIdx, suffix.getEndOffset()); + } + } + } + else { + suffix = new TextRange(range.getEndOffset(), range.getEndOffset()); + } + + return Couple.of(prefix, suffix); } public void uncommentRange(TextRange range, String commentPrefix, String commentSuffix, Commenter commenter) { diff --git a/platform/platform-tests/testData/codeStyle/json/exportToJson.json b/platform/platform-tests/testData/codeStyle/json/exportToJson.json index cc6e24ac1442..cedb6e663404 100644 --- a/platform/platform-tests/testData/codeStyle/json/exportToJson.json +++ b/platform/platform-tests/testData/codeStyle/json/exportToJson.json @@ -32,6 +32,7 @@ "align_attributes": true, "align_text": false, "attribute_wrap": "normal", + "block_comment_add_space": false, "block_comment_at_first_column": true, "continuation_indent_size": 8, "do_not_align_children_of_min_lines": 0, diff --git a/resources-en/src/search/searchableOptions.xml b/resources-en/src/search/searchableOptions.xml index cc57519d56fb..d4756695fb4a 100644 --- a/resources-en/src/search/searchableOptions.xml +++ b/resources-en/src/search/searchableOptions.xml @@ -16955,12 +16955,20 @@