package com.intellij.lang.javascript.formatter;
import com.intellij.application.options.IndentOptionsEditor;
import com.intellij.lang.Language;
import com.intellij.lang.javascript.JSBundle;
import com.intellij.lang.javascript.JavaScriptSupportLoader;
import com.intellij.psi.codeStyle.CodeStyleSettingsCustomizable;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author Rustam Vishnyakov
*/
public class ActionScriptLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettingsProvider {
@NotNull
@Override
public Language getLanguage() {
return JavaScriptSupportLoader.ECMA_SCRIPT_L4;
}
@Override
public IndentOptionsEditor getIndentOptionsEditor() {
return new ActionScriptIndentOptionsEditor();
}
@Override
public String getCodeSample(@NotNull SettingsType settingsType) {
switch (settingsType) {
case WRAPPING_AND_BRACES_SETTINGS:
return WRAPPING_CODE_SAMPLE;
case BLANK_LINES_SETTINGS:
return BLANK_LINE_CODE_SAMPLE;
case SPACING_SETTINGS:
return GENERAL_CODE_SAMPLE;
case LANGUAGE_SPECIFIC:
return GENERAL_CODE_SAMPLE;
case INDENT_SETTINGS:
return INDENT_CODE_SAMPLE;
}
return GENERAL_CODE_SAMPLE;
}
@Override
public void customizeSettings(@NotNull CodeStyleSettingsCustomizable consumer, @NotNull SettingsType settingsType) {
if (settingsType == SettingsType.SPACING_SETTINGS) {
consumer.showStandardOptions(JSLanguageCodeStyleSettingsProvider.STANDARD_SPACING_OPTIONS);
consumer
.showCustomOption(ECMA4CodeStyleSettings.class, "SPACE_BEFORE_PROPERTY_COLON",
JSBundle.message("space.before.name.value.separator"),
CodeStyleSettingsCustomizable.SPACES_OTHER);
consumer
.showCustomOption(ECMA4CodeStyleSettings.class, "SPACE_AFTER_PROPERTY_COLON",
JSBundle.message("space.after.name.value.separator"),
CodeStyleSettingsCustomizable.SPACES_OTHER);
consumer
.showCustomOption(ECMA4CodeStyleSettings.class, "SPACE_AFTER_DOTS_IN_REST_PARAMETER",
JSBundle.message("space.after.dots.in.rest.parameter"),
CodeStyleSettingsCustomizable.SPACES_OTHER);
consumer.showCustomOption(JSCodeStyleSettings.class, "SPACE_BEFORE_FUNCTION_LEFT_PARENTH",
JSBundle.message("space.before.function.left.parenth"),
CodeStyleSettingsCustomizable.SPACES_BEFORE_PARENTHESES);
consumer
.showCustomOption(ECMA4CodeStyleSettings.class, "SPACE_BEFORE_TYPE_COLON",
JSBundle.message("space.before.type.colon"),
CodeStyleSettingsCustomizable.SPACES_OTHER);
consumer
.showCustomOption(ECMA4CodeStyleSettings.class, "SPACE_AFTER_TYPE_COLON",
JSBundle.message("space.after.type.colon"),
CodeStyleSettingsCustomizable.SPACES_OTHER);
consumer.showCustomOption(ECMA4CodeStyleSettings.class,
"SPACES_WITHIN_OBJECT_LITERAL_BRACES",
JSBundle.message("spaces.within.object.literal.braces"),
CodeStyleSettingsCustomizable.SPACES_WITHIN);
}
else if (settingsType == SettingsType.BLANK_LINES_SETTINGS) {
List<String> blankLinesOptions = new ArrayList<>();
blankLinesOptions.addAll(Arrays.asList("KEEP_BLANK_LINES_IN_CODE",
"BLANK_LINES_AFTER_IMPORTS",
"BLANK_LINES_BEFORE_IMPORTS",
"BLANK_LINES_AROUND_METHOD",
"KEEP_BLANK_LINES_IN_CODE",
"BLANK_LINES_BEFORE_PACKAGE",
"BLANK_LINES_AFTER_PACKAGE"));
consumer.showStandardOptions(ArrayUtil.toStringArray(blankLinesOptions));
}
else if (settingsType == SettingsType.WRAPPING_AND_BRACES_SETTINGS) {
List<String> wrappingOptions = new ArrayList<>();
wrappingOptions.addAll(Arrays.asList(JSLanguageCodeStyleSettingsProvider.STANDARD_WRAPPING_OPTIONS));
wrappingOptions.addAll(Arrays.asList("CLASS_BRACE_STYLE",
"EXTENDS_LIST_WRAP",
"ALIGN_MULTILINE_EXTENDS_LIST",
"EXTENDS_KEYWORD_WRAP"));
consumer.showStandardOptions(ArrayUtil.toStringArray(wrappingOptions));
consumer.renameStandardOption("ARRAY_INITIALIZER_LBRACE_ON_NEXT_LINE", JSBundle.message("js.array.new.line.after.left.bracket"));
consumer.renameStandardOption("ARRAY_INITIALIZER_RBRACE_ON_NEXT_LINE", JSBundle.message("js.array.new.line.before.right.bracket"));
consumer.showCustomOption(ECMA4CodeStyleSettings.class, "FUNCTION_EXPRESSION_BRACE_STYLE",
JSBundle.message("js.function.expression.brace.style"),
CodeStyleSettingsCustomizable.WRAPPING_BRACES,
CodeStyleSettingsCustomizable.OptionAnchor.AFTER,
"METHOD_BRACE_STYLE",
CodeStyleSettingsCustomizable.BRACE_PLACEMENT_OPTIONS,
CodeStyleSettingsCustomizable.BRACE_PLACEMENT_VALUES);
consumer.showCustomOption(ECMA4CodeStyleSettings.class, "REFORMAT_C_STYLE_COMMENTS",
JSBundle.message("js.format.cstyle.comments"),
CodeStyleSettingsCustomizable.WRAPPING_COMMENTS);
//object literals
consumer.showCustomOption(ECMA4CodeStyleSettings.class,
"OBJECT_LITERAL_WRAP",
"Object literals",
null,
CodeStyleSettingsCustomizable.WRAP_OPTIONS,
CodeStyleSettingsCustomizable.WRAP_VALUES);
consumer.showCustomOption(ECMA4CodeStyleSettings.class, "ALIGN_OBJECT_PROPERTIES",
JSBundle.message("js.code.style.align.caption"),
JSBundle.message("js.code.style.object.literals.category.name"),
JSLanguageCodeStyleSettingsProvider.ALIGN_OBJECT_PROPERTIES_OPTIONS,
JSLanguageCodeStyleSettingsProvider.ALIGN_OBJECT_PROPERTIES_VALUES);
//var statements
consumer.showCustomOption(ECMA4CodeStyleSettings.class,
"VAR_DECLARATION_WRAP",
JSBundle.message("js.wrap.settings.var.group.name"),
null,
CodeStyleSettingsCustomizable.WRAP_OPTIONS,
CodeStyleSettingsCustomizable.WRAP_VALUES);
consumer.showCustomOption(ECMA4CodeStyleSettings.class, "ALIGN_VAR_STATEMENTS",
JSBundle.message("js.code.style.align.caption"),
JSBundle.message("js.wrap.settings.var.group.name"),
JSLanguageCodeStyleSettingsProvider.ALIGN_VAR_STATEMENT_OPTIONS,
JSLanguageCodeStyleSettingsProvider.ALIGN_VAR_STATEMENT_VALUES);
}
else if (settingsType == SettingsType.LANGUAGE_SPECIFIC) {
consumer.showStandardOptions("LINE_COMMENT_AT_FIRST_COLUMN");
}
}
protected String getPreviewText() {
return "/*\n" +
" Multiline\n" +
" C-style\n" +
" Comment\n" +
" */\n" +
"var myLink = {\n" +
" img: \"btn.gif\",\n" +
" text: \"Button\",\n" +
" width: 128\n" +
" },\n" +
" local = true,\n" +
" initial = -1;\n" +
"var cssClasses = [\"bold\", \"red\",]\n" +
"var selector = \"#id\";\n" +
"\n" +
"var color = \"red\";\n" +
"var offset = 10;\n" +
"\n" +
"varName = val;";
}
@Override
public String getFileExt() {
return "as";
}
@Override
public String getLanguageName() {
return "ActionScript";
}
@Override
public CommonCodeStyleSettings getDefaultCommonSettings() {
CommonCodeStyleSettings commonSettings = new CommonCodeStyleSettings(getLanguage());
commonSettings.BLANK_LINES_AFTER_PACKAGE = 0;
commonSettings.initIndentOptions();
return commonSettings;
}
public final static String GENERAL_CODE_SAMPLE =
"package {\n" +
"class Foo {\n" +
"public function foo(x:int, z) {\n" +
"var arr = [\"zero\", \"one\"];\n" +
"var x = {0:\"zero\", 1:\"one\"};\n" +
"var y = (x ^ 0x123) << 2;\n" +
"var k = x > 15 ? 1 : 2;\n" +
"do {\n" +
"try {\n" +
"if (0 < x && x < 10) {\n" +
"while (x != y) {\n" +
"x = f(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:Exception) {\n" +
"var message = arr[0];\n" +
"}\n" +
"} while (x < 0);\n" +
"}\n" +
"\n" +
" function sum(...args) {\n" +
" for (var i:uint = 0; i < args.length; i++) {\n" +
" trace(args[i]);\n" +
" }\n" +
" }" +
"\n" +
"}\n" +
"}";
public final static String WRAPPING_CODE_SAMPLE =
"function buzz() { return 0; }\n\n" +
"class Foo {\n" +
"\n" +
"numbers : ['one', 'two', 'three', 'four', 'five', 'six'];\n" +
"\n" +
"// function fBar (x,y);\n" +
"function fOne(argA, argB, argC, argD, argE, argF, argG, argH) {\n" +
"x = argA + argB + argC + argD + argE + argF + argG + argH;\n" +
"this.fTwo(argA, argB, argC, this.fThree(argD, argE, argF, argG, argH));\n" +
"var z = argA == 'Some string' ? 'yes' : 'no';\n" +
"var colors = ['red', 'green', 'blue', 'black', 'white', 'gray'];\n" +
"for (var colorIndex = 0; colorIndex < colors.length; colorIndex++) \n" +
"var colorString = this.numbers[colorIndex];\n" +
"}\n" +
"\n" +
"function fTwo(strA, strB, strC, strD) {\n" +
"if (true)\nreturn strC;\n" +
"if (strA == 'one' || \n" +
"strB == 'two' || strC == 'three') {\n" +
"return strA + strB + strC;\n" +
"} else return strD\n" +
"return strD;\n" +
"}\n" +
"\n" +
"function fThree(strA, strB, strC, strD, strE) {\n" +
"return strA + strB + strC + strD + strE;\n" +
"}\n" +
"/*\n" +
" Multiline\n" +
" C-style\n" +
" Comment\n" +
" */\n" +
"function fFour() {\n" +
" var myLinkText = \"Button\",\n" +
" local = true,\n" +
" initial = -1;\n" +
" var cssClasses = [\"bold\", \"red\",]\n" +
" var selector = \"#id\";\n" +
"\n" +
" var color = \"red\";\n" +
" var offset = 10;\n" +
" }" +
"}";
public final static String BLANK_LINE_CODE_SAMPLE =
"package {\n" +
"import com.jetbrains.flex.Demo;\n" +
"import com.jetbrains.flex.Sample;\n" +
"class Foo {\n" +
" var demo : Demo;\n" +
" var sample : Sample;\n" +
" public function foo(x:int, z) {\n" +
" var y = x * z;\n\n\n" +
" return y;\n" +
" }\n" +
" public function getSample() {\n" +
" return sample;\n" +
" }\n" +
"}\n" +
"\n" +
"}";
public final static String INDENT_CODE_SAMPLE =
"package {\n" +
"class Foo {\n" +
" public function foo(x:int, z) {\n" +
" var y = x * z;\n\n\n" +
" return y;\n" +
" }\n" +
"}\n" +
"}";
}