package com.jetbrains.lang.dart.ide.formatter.settings; import com.intellij.application.options.IndentOptionsEditor; import com.intellij.application.options.SmartIndentOptionsEditor; import com.intellij.lang.Language; import com.intellij.psi.codeStyle.CodeStyleSettingsCustomizable; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider; import com.jetbrains.lang.dart.DartLanguage; import org.jetbrains.annotations.NotNull; public class DartLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettingsProvider { @NotNull @Override public Language getLanguage() { return DartLanguage.INSTANCE; } @Override public String getCodeSample(@NotNull SettingsType settingsType) { if (settingsType == SettingsType.SPACING_SETTINGS) { return SPACING_CODE_SAMPLE; } if (settingsType == SettingsType.WRAPPING_AND_BRACES_SETTINGS) { return WRAPPING_CODE_SAMPLE; } if (settingsType == SettingsType.INDENT_SETTINGS) { return INDENT_CODE_SAMPLE; } return BLANK_LINES_CODE_SAMPLE; } @Override public IndentOptionsEditor getIndentOptionsEditor() { return new SmartIndentOptionsEditor(); } @Override public CommonCodeStyleSettings getDefaultCommonSettings() { CommonCodeStyleSettings defaultSettings = new CommonCodeStyleSettings(getLanguage()); CommonCodeStyleSettings.IndentOptions indentOptions = defaultSettings.initIndentOptions(); indentOptions.INDENT_SIZE = 2; indentOptions.CONTINUATION_INDENT_SIZE = 4; indentOptions.TAB_SIZE = 2; defaultSettings.RIGHT_MARGIN = 80; defaultSettings.CALL_PARAMETERS_WRAP = CommonCodeStyleSettings.WRAP_AS_NEEDED; defaultSettings.METHOD_PARAMETERS_WRAP = CommonCodeStyleSettings.WRAP_AS_NEEDED; defaultSettings.ARRAY_INITIALIZER_WRAP = CommonCodeStyleSettings.WRAP_AS_NEEDED; defaultSettings.BINARY_OPERATION_WRAP = CommonCodeStyleSettings.WRAP_AS_NEEDED; defaultSettings.ASSIGNMENT_WRAP = CommonCodeStyleSettings.WRAP_AS_NEEDED; // TODO Remove if not needed. defaultSettings.ARRAY_INITIALIZER_WRAP = CommonCodeStyleSettings.WRAP_AS_NEEDED; defaultSettings.TERNARY_OPERATION_WRAP = CommonCodeStyleSettings.WRAP_AS_NEEDED | CommonCodeStyleSettings.WRAP_ON_EVERY_ITEM; defaultSettings.TERNARY_OPERATION_SIGNS_ON_NEXT_LINE = true; defaultSettings.ALIGN_MULTILINE_TERNARY_OPERATION = false; defaultSettings.ALIGN_MULTILINE_PARAMETERS = false; defaultSettings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE = true; defaultSettings.KEEP_SIMPLE_METHODS_IN_ONE_LINE = true; defaultSettings.KEEP_SIMPLE_CLASSES_IN_ONE_LINE = true; return defaultSettings; } @Override public void customizeSettings(@NotNull CodeStyleSettingsCustomizable consumer, @NotNull SettingsType settingsType) { if (settingsType == SettingsType.SPACING_SETTINGS) { consumer.showStandardOptions("SPACE_BEFORE_METHOD_CALL_PARENTHESES", "SPACE_BEFORE_METHOD_PARENTHESES", "SPACE_BEFORE_IF_PARENTHESES", "SPACE_BEFORE_WHILE_PARENTHESES", "SPACE_BEFORE_FOR_PARENTHESES", "SPACE_BEFORE_CATCH_PARENTHESES", "SPACE_BEFORE_SWITCH_PARENTHESES", "SPACE_AROUND_ASSIGNMENT_OPERATORS", "SPACE_AROUND_LOGICAL_OPERATORS", "SPACE_AROUND_EQUALITY_OPERATORS", "SPACE_AROUND_RELATIONAL_OPERATORS", "SPACE_AROUND_ADDITIVE_OPERATORS", "SPACE_AROUND_MULTIPLICATIVE_OPERATORS", "SPACE_AROUND_SHIFT_OPERATORS", "SPACE_BEFORE_METHOD_LBRACE", "SPACE_BEFORE_IF_LBRACE", "SPACE_BEFORE_ELSE_LBRACE", "SPACE_BEFORE_WHILE_LBRACE", "SPACE_BEFORE_FOR_LBRACE", "SPACE_BEFORE_SWITCH_LBRACE", "SPACE_BEFORE_TRY_LBRACE", "SPACE_BEFORE_CATCH_LBRACE", "SPACE_BEFORE_WHILE_KEYWORD", "SPACE_BEFORE_ELSE_KEYWORD", "SPACE_BEFORE_CATCH_KEYWORD", "SPACE_WITHIN_METHOD_CALL_PARENTHESES", "SPACE_WITHIN_METHOD_PARENTHESES", "SPACE_WITHIN_IF_PARENTHESES", "SPACE_WITHIN_WHILE_PARENTHESES", "SPACE_WITHIN_FOR_PARENTHESES", "SPACE_WITHIN_CATCH_PARENTHESES", "SPACE_WITHIN_SWITCH_PARENTHESES", "SPACE_BEFORE_QUEST", "SPACE_AFTER_QUEST", "SPACE_BEFORE_COLON", "SPACE_AFTER_COLON", "SPACE_AFTER_COMMA", "SPACE_AFTER_COMMA_IN_TYPE_ARGUMENTS", "SPACE_BEFORE_COMMA", "SPACE_AROUND_UNARY_OPERATOR" ); } else if (settingsType == SettingsType.BLANK_LINES_SETTINGS) { consumer.showStandardOptions("KEEP_BLANK_LINES_IN_CODE"); } else if (settingsType == SettingsType.WRAPPING_AND_BRACES_SETTINGS) { consumer.showStandardOptions("RIGHT_MARGIN", "WRAP_ON_TYPING", "KEEP_LINE_BREAKS", "KEEP_FIRST_COLUMN_COMMENT", "BRACE_STYLE", "METHOD_BRACE_STYLE", "CALL_PARAMETERS_WRAP", "CALL_PARAMETERS_LPAREN_ON_NEXT_LINE", "CALL_PARAMETERS_RPAREN_ON_NEXT_LINE", "METHOD_PARAMETERS_WRAP", "METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE", "METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE", "ELSE_ON_NEW_LINE", "WHILE_ON_NEW_LINE", "CATCH_ON_NEW_LINE", "ALIGN_MULTILINE_PARAMETERS", "ALIGN_MULTILINE_PARAMETERS_IN_CALLS", "ALIGN_MULTILINE_BINARY_OPERATION", "BINARY_OPERATION_WRAP", "BINARY_OPERATION_SIGN_ON_NEXT_LINE", "ASSIGNMENT_WRAP", // TODO Remove if not needed. "PLACE_ASSIGNMENT_SIGN_ON_NEXT_LINE", // TODO Remove if not needed. "TERNARY_OPERATION_WRAP", "TERNARY_OPERATION_SIGNS_ON_NEXT_LINE", "PARENTHESES_EXPRESSION_LPAREN_WRAP", "PARENTHESES_EXPRESSION_RPAREN_WRAP", "ALIGN_MULTILINE_TERNARY_OPERATION", "KEEP_SIMPLE_BLOCKS_IN_ONE_LINE", "KEEP_SIMPLE_METHODS_IN_ONE_LINE", "KEEP_SIMPLE_CLASSES_IN_ONE_LINE", "SPECIAL_ELSE_IF_TREATMENT"); } } public static final String SPACING_CODE_SAMPLE = "class Foo {\n" + " List<List<int>> tmp;\n" + " foo(int x, z) {\n" + " new Foo(x, 2);\n" + " int absSum(int a, int b) {\n" + " int value = a + b;\n" + " return value > 0 ? value : -value;\n" + " }\n" + " var arr = [\"zero\", \"one\"];\n" + " var y = (x ^ 0x123) << 2;\n" + " for (var i in tmp) {\n" + " y = (y ^ 0x123) << 2;\n" + " }\n" + " var k = x % 2 == 1 ? 0 : 1;\n" + " do {\n" + " try {\n" + " if (0 < x && x < 10) {\n" + " while (x != y) {\n" + " x = absSum(x * 3, 5);\n" + " }\n" + " z += 2;\n" + " } else if (x > 20) {\n" + " z = x << 1;\n" + " } else {\n" + " z = x | 2;\n" + " }\n" + " switch (k) {\n" + " case 0:\n" + " var s1 = 'zero';\n" + " break;\n" + " case 2:\n" + " var s1 = 'two';\n" + " break;\n" + " default:\n" + " var s1 = 'other';\n" + " }\n" + " } catch (e) {\n" + " var message = arr[0];\n" + " }\n" + " } while (x < 0);\n" + " }\n" + "\n" + " Foo(int n, int m) {\n" + " tmp = new List<List<int>>();\n" + " for (int i; i < 10; ++i) tmp.add(new List<int>());\n" + " }\n" + "}"; public static final String WRAPPING_CODE_SAMPLE = "class Foo {\n" + " // function fBar (x,y);\n" + " fOne(argA, argB, argC, argD, argE, argF, argG, argH) {\n" + " List<String> numbers = ['one', 'two', 'three', 'four', 'five', 'six'];\n" + " var x = (\"\" + argA) + argB + argC + argD + argE + argF + argG + argH;\n" + " try {\n" + " this.fTwo(argA, argB, argC, this.fThree(\"\", argE, argF, argG, argH));\n" + " } catch (ignored) {}\n" + " var z = argA == 'Some string' ? 'yes' : 'no';\n" + " var colors = ['red', 'green', 'blue', 'black', 'white', 'gray'];\n" + " for (var colorIndex in colors) {\n" + " var colorString = numbers[colorIndex];\n" + " }\n" + " do {\n" + " colors.removeLast();\n" + " } while (colors.length > 0);\n" + " }\n" + "\n" + " fTwo(strA, strB, strC, strD) {\n" + " if (true)\n" + " return strC;\n" + " if (strA == 'one' ||\n" + " strB == 'two') {\n" + " return strA + strB;\n" + " } else if (true) return strD;\n" + " throw strD;\n" + " }\n" + "\n" + " fThree(strA, strB, strC, strD, strE) {\n" + " return strA + strB + strC + strD + strE;\n" + " }\n" + "}"; public static final String BLANK_LINES_CODE_SAMPLE = "class Foo {\n" + " Foo() {\n" + " }\n" + "\n" + "\n" + " main() {\n" + " print(\"Hello!\");\n" + " }\n" + "}"; public static final String INDENT_CODE_SAMPLE = "main(){\n" + " print(239);\n" + "}"; }