| /******************************************************************************* |
| * Copyright (c) 2009, 2012 xored software, Inc., NumberFour AG |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * xored software, Inc. - initial API and Implementation (Vladimir Belov) |
| * NumberFour AG - new option to control space before parens of anonymous function (Alex Panchenko) |
| *******************************************************************************/ |
| package org.eclipse.dltk.javascript.formatter; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.eclipse.dltk.ui.CodeFormatterConstants; |
| |
| @SuppressWarnings("nls") |
| public final class JavaScriptFormatterConstants { |
| |
| /* |
| * On adding a new option, you should register it in the static{} block!!! |
| */ |
| |
| public static final String FORMATTER_TAB_CHAR = CodeFormatterConstants.FORMATTER_TAB_CHAR; |
| public static final String FORMATTER_TAB_SIZE = CodeFormatterConstants.FORMATTER_TAB_SIZE; |
| public static final String FORMATTER_INDENTATION_SIZE = CodeFormatterConstants.FORMATTER_INDENTATION_SIZE; |
| |
| // JavaScriptFormatterConstants.LINES_FILE_AFTER_REQUIRE, |
| // JavaScriptFormatterConstants.LINES_FILE_BETWEEN_MODULE, |
| // JavaScriptFormatterConstants.LINES_FILE_BETWEEN_CLASS, |
| // JavaScriptFormatterConstants.LINES_FILE_BETWEEN_METHOD, |
| // JavaScriptFormatterConstants.LINES_BEFORE_FIRST, |
| // JavaScriptFormatterConstants.LINES_BEFORE_MODULE, |
| // JavaScriptFormatterConstants.LINES_BEFORE_CLASS, |
| // JavaScriptFormatterConstants.LINES_BEFORE_METHOD }; |
| |
| public static final String LINES_PRESERVE = "lines.preserve"; //$NON-NLS-1$ |
| |
| public static final String WRAP_COMMENTS = "wrap.comments"; //$NON-NLS-1$ |
| public static final String WRAP_COMMENTS_LENGTH = "wrap.comments.length"; //$NON-NLS-1$ |
| |
| public static final String FORMATTER_PROFILES = "formatter.profiles"; //$NON-NLS-1$ |
| public static final String FORMATTER_ACTIVE_PROFILE = "formatter.profiles.active"; //$NON-NLS-1$ |
| |
| public static final String INDENT_METHOD = "formatter.indent.function";//$NON-NLS-1$ |
| public static final String INDENT_BLOCK = "formatter.indent.blocks";//$NON-NLS-1$ |
| public static final String INDENT_SWITCH = "formatter.indent.switch";//$NON-NLS-1$ |
| public static final String INDENT_CASE = "formatter.indent.case";//$NON-NLS-1$ |
| public static final String INDENT_BREAK = "formatter.indent.break";//$NON-NLS-1$ |
| public static final String INDENT_EMPTY_LINES = "formatter.indent.empty.lines";//$NON-NLS-1$ |
| |
| public static final String BRACE_METHOD = "formatter.braces.function";//$NON-NLS-1$ |
| public static final String BRACE_EMPTY_FUNCTION = "formatter.braces.empty.function";//$NON-NLS-1$ |
| public static final String BRACE_BLOCK = "formatter.braces.blocks";//$NON-NLS-1$ |
| public static final String BRACE_SWITCH = "formatter.braces.switch";//$NON-NLS-1$ |
| public static final String BRACE_CASE = "formatter.braces.case";//$NON-NLS-1$ |
| public static final String BRACE_ARRAY = "formatter.braces.array";//$NON-NLS-1$ |
| public static final String BRACE_EMPTY_ARRAY = "formatter.braces.empty.array";//$NON-NLS-1$ |
| public static final String BRACE_EMPTY_OBJECT = "formatter.braces.empty.object";//$NON-NLS-1$ |
| |
| // ////////////////////////////////////////////////////////////////////////// |
| // NOT OPTIONS ! |
| // |
| |
| // Same line |
| public static final String BRACE_SAME_LINE = "same.line";//$NON-NLS-1$ |
| // Next line |
| public static final String BRACE_NEXT_LINE = "next.line";//$NON-NLS-1$ |
| // Next line indented |
| public static final String BRACE_NEXT_LINE_INDENTED = "next.line.indented";//$NON-NLS-1$ |
| // Next line on wrap |
| public static final String BRACE_NEXT_LINE_ON_WRAP = "next.line.on.wrap";//$NON-NLS-1$ |
| |
| // |
| // ////////////////////////////////////////////////////////////////////////// |
| |
| public static final String STATEMENT_NEW_LINE = "formatter.statement.new.line";//$NON-NLS-1$ |
| |
| /** |
| * Internal option used in indenting only mode. |
| */ |
| public static final String KEEP_LINES = "formatter.keep.lines";//$NON-NLS-1$ |
| |
| public static final String NEW_LINE_IN_EMPTY_METHOD = "formatter.newlines.empty.method";//$NON-NLS-1$ |
| public static final String NEW_LINE_IN_EMPTY_BLOCK = "formatter.newlines.empty.block";//$NON-NLS-1$ |
| public static final String NEW_LINE_AT_EOF = "formatter.newlines.eof";//$NON-NLS-1$ |
| |
| public static final String NEW_LINE_BEFORE_ELSE_IN_IF = "formatter.newlines.else";//$NON-NLS-1$ |
| public static final String NEW_LINE_BEFORE_CATCH_IN_TRY = "formatter.newlines.catch";//$NON-NLS-1$ |
| public static final String NEW_LINE_BEFORE_FINALLY_IN_TRY = "formatter.newlines.finally";//$NON-NLS-1$ |
| public static final String NEW_LINE_BEFORE_WHILE_IN_DO = "formatter.newlines.while";//$NON-NLS-1$ |
| |
| public static final String KEEP_THEN_ON_SAME_LINE = "formatter.samelines.then";//$NON-NLS-1$ |
| public static final String KEEP_SIMPLE_IF_ON_ONE_LINE = "formatter.samelines.simpleif";//$NON-NLS-1$ |
| |
| // TODO does it duplicate NEW_LINE_BEFORE_ELSE_IN_IF ? |
| //public static final String KEEP_ELSE_ON_SAME_LINE = "formatter.samelines.else";//$NON-NLS-1$ |
| |
| public static final String KEEP_ELSE_IF_ON_ONE_LINE = "formatter.samelines.elseif";//$NON-NLS-1$ |
| public static final String KEEP_RETURN_ON_ONE_LINE = "formatter.samelines.return";//$NON-NLS-1$ |
| public static final String KEEP_THROW_ON_ONE_LINE = "formatter.samelines.throw";//$NON-NLS-1$ |
| |
| // ///////////////////////////////////////////// |
| // |
| // SPACES |
| // |
| |
| // IF spaces |
| public static final String INSERT_SPACE_BEFORE_LP_IF = "formatter.insertspace.before.lp.if"; |
| public static final String INSERT_SPACE_AFTER_LP_IF = "formatter.insertspace.after.lp.if"; |
| public static final String INSERT_SPACE_BEFORE_RP_IF = "formatter.insertspace.before.rp.if"; |
| |
| // FOR spaces |
| public static final String INSERT_SPACE_BEFORE_LP_FOR = "formatter.insertspace.before.lp.for"; |
| public static final String INSERT_SPACE_AFTER_LP_FOR = "formatter.insertspace.after.lp.for"; |
| public static final String INSERT_SPACE_BEFORE_RP_FOR = "formatter.insertspace.before.rp.for"; |
| |
| // SWITCH spaces |
| public static final String INSERT_SPACE_BEFORE_LP_SWITCH = "formatter.insertspace.before.lp.switch"; |
| public static final String INSERT_SPACE_AFTER_LP_SWITCH = "formatter.insertspace.after.lp.switch"; |
| public static final String INSERT_SPACE_BEFORE_RP_SWITCH = "formatter.insertspace.before.rp.switch"; |
| |
| // WHILE-DO..WHILE spaces |
| public static final String INSERT_SPACE_BEFORE_LP_WHILE = "formatter.insertspace.before.lp.while"; |
| public static final String INSERT_SPACE_AFTER_LP_WHILE = "formatter.insertspace.after.lp.while"; |
| public static final String INSERT_SPACE_BEFORE_RP_WHILE = "formatter.insertspace.before.rp.while"; |
| |
| // CALL spaces |
| public static final String INSERT_SPACE_BEFORE_LP_CALL = "formatter.insertspace.before.lp.call"; |
| public static final String INSERT_SPACE_AFTER_LP_CALL = "formatter.insertspace.after.lp.call"; |
| public static final String INSERT_SPACE_BEFORE_RP_CALL = "formatter.insertspace.before.rp.call"; |
| |
| // EXPRESSION spaces |
| public static final String INSERT_SPACE_BEFORE_LP_EXPRESSION = "formatter.insertspace.before.lp.expression"; |
| public static final String INSERT_SPACE_AFTER_LP_EXPRESSION = "formatter.insertspace.after.lp.expression"; |
| public static final String INSERT_SPACE_BEFORE_RP_EXPRESSION = "formatter.insertspace.before.rp.expression"; |
| |
| // FUNCTION spaces |
| public static final String INSERT_SPACE_BEFORE_LP_FUNCTION_ARGUMENTS = "formatter.insertspace.before.lp.function"; |
| public static final String INSERT_SPACE_AFTER_LP_FUNCTION_ARGUMENTS = "formatter.insertspace.after.lp.function"; |
| public static final String INSERT_SPACE_BEFORE_RP_FUNCTION_ARGUMENTS = "formatter.insertspace.before.rp.function"; |
| public static final String INSERT_SPACE_BETWEEN_PARENS_FUNCTION_NO_ARGUMENTS = "formatter.insertspace.between.parents.empty"; |
| public static final String INSERT_SPACE_BEFORE_PARENS_ANONYMOUS_FUNCTION = "formatter.insertspace.before.parens.anonymous.function"; |
| |
| // CATCH spaces |
| public static final String INSERT_SPACE_BEFORE_LP_CATCH = "formatter.insertspace.before.lp.catch"; |
| public static final String INSERT_SPACE_AFTER_LP_CATCH = "formatter.insertspace.after.lp.catch"; |
| public static final String INSERT_SPACE_BEFORE_RP_CATCH = "formatter.insertspace.before.rp.catch"; |
| |
| // WITH spaces |
| public static final String INSERT_SPACE_BEFORE_LP_WITH = "formatter.insertspace.before.lp.with"; |
| public static final String INSERT_SPACE_AFTER_LP_WITH = "formatter.insertspace.after.lp.with"; |
| public static final String INSERT_SPACE_BEFORE_RP_WITH = "formatter.insertspace.before.rp.with"; |
| |
| // Register options here |
| |
| private static void registerOptions() { |
| |
| registerBooleanOption(STATEMENT_NEW_LINE, true); |
| |
| registerStringOption(FORMATTER_TAB_CHAR, CodeFormatterConstants.TAB); |
| registerIntegerOption(FORMATTER_TAB_SIZE, 4); |
| registerIntegerOption(FORMATTER_INDENTATION_SIZE, 2); |
| |
| registerIntegerOption(LINES_PRESERVE, -1); |
| |
| registerBooleanOption(WRAP_COMMENTS, true); |
| registerIntegerOption(WRAP_COMMENTS_LENGTH, 80); |
| |
| // Miss this options! |
| // registerStringOption(FORMATTER_PROFILES); |
| // registerStringOption(FORMATTER_ACTIVE_PROFILE); |
| |
| registerBooleanOption(INDENT_METHOD, true); |
| registerBooleanOption(INDENT_BLOCK, true); |
| registerBooleanOption(INDENT_SWITCH, false); |
| registerBooleanOption(INDENT_CASE, true); |
| registerBooleanOption(INDENT_BREAK, true); |
| registerBooleanOption(INDENT_EMPTY_LINES, true); |
| |
| registerStringOption(BRACE_METHOD, BRACE_SAME_LINE); |
| registerStringOption(BRACE_BLOCK, BRACE_SAME_LINE); |
| registerStringOption(BRACE_SWITCH, BRACE_SAME_LINE); |
| registerStringOption(BRACE_CASE, BRACE_SAME_LINE); |
| registerStringOption(BRACE_ARRAY, BRACE_SAME_LINE); |
| registerBooleanOption(BRACE_EMPTY_ARRAY, true); |
| registerBooleanOption(BRACE_EMPTY_FUNCTION, false); |
| registerBooleanOption(BRACE_EMPTY_OBJECT, false); |
| |
| registerBooleanOption(NEW_LINE_IN_EMPTY_METHOD, false); |
| registerBooleanOption(NEW_LINE_IN_EMPTY_BLOCK, false); |
| registerBooleanOption(NEW_LINE_AT_EOF, true); |
| |
| registerBooleanOption(NEW_LINE_BEFORE_ELSE_IN_IF, false); |
| registerBooleanOption(NEW_LINE_BEFORE_CATCH_IN_TRY, false); |
| registerBooleanOption(NEW_LINE_BEFORE_FINALLY_IN_TRY, false); |
| registerBooleanOption(NEW_LINE_BEFORE_WHILE_IN_DO, false); |
| |
| registerBooleanOption(KEEP_THEN_ON_SAME_LINE, false); |
| registerBooleanOption(KEEP_SIMPLE_IF_ON_ONE_LINE, false); |
| |
| // registerBooleanOption(KEEP_ELSE_ON_SAME_LINE, true); |
| registerBooleanOption(KEEP_ELSE_IF_ON_ONE_LINE, true); |
| registerBooleanOption(KEEP_RETURN_ON_ONE_LINE, false); |
| registerBooleanOption(KEEP_THROW_ON_ONE_LINE, false); |
| |
| // IF spaces |
| registerBooleanOption(INSERT_SPACE_BEFORE_LP_IF, true); |
| registerBooleanOption(INSERT_SPACE_AFTER_LP_IF, false); |
| registerBooleanOption(INSERT_SPACE_BEFORE_RP_IF, false); |
| |
| // FOR spaces |
| registerBooleanOption(INSERT_SPACE_BEFORE_LP_FOR, true); |
| registerBooleanOption(INSERT_SPACE_AFTER_LP_FOR, false); |
| registerBooleanOption(INSERT_SPACE_BEFORE_RP_FOR, false); |
| |
| // SWITCH spaces |
| registerBooleanOption(INSERT_SPACE_BEFORE_LP_SWITCH, true); |
| registerBooleanOption(INSERT_SPACE_AFTER_LP_SWITCH, false); |
| registerBooleanOption(INSERT_SPACE_BEFORE_RP_SWITCH, false); |
| |
| // WHILE-DO..WHILE spaces |
| registerBooleanOption(INSERT_SPACE_BEFORE_LP_WHILE, true); |
| registerBooleanOption(INSERT_SPACE_AFTER_LP_WHILE, false); |
| registerBooleanOption(INSERT_SPACE_BEFORE_RP_WHILE, false); |
| |
| // CALL spaces |
| registerBooleanOption(INSERT_SPACE_BEFORE_LP_CALL, false); |
| registerBooleanOption(INSERT_SPACE_AFTER_LP_CALL, false); |
| registerBooleanOption(INSERT_SPACE_BEFORE_RP_CALL, false); |
| |
| // EXPRESSION spaces |
| registerBooleanOption(INSERT_SPACE_BEFORE_LP_EXPRESSION, true); |
| registerBooleanOption(INSERT_SPACE_AFTER_LP_EXPRESSION, false); |
| registerBooleanOption(INSERT_SPACE_BEFORE_RP_EXPRESSION, false); |
| |
| // FUNCTION spaces |
| registerBooleanOption(INSERT_SPACE_BEFORE_LP_FUNCTION_ARGUMENTS, false); |
| registerBooleanOption(INSERT_SPACE_AFTER_LP_FUNCTION_ARGUMENTS, false); |
| registerBooleanOption(INSERT_SPACE_BEFORE_RP_FUNCTION_ARGUMENTS, false); |
| registerBooleanOption( |
| INSERT_SPACE_BETWEEN_PARENS_FUNCTION_NO_ARGUMENTS, false); |
| registerBooleanOption(INSERT_SPACE_BEFORE_PARENS_ANONYMOUS_FUNCTION, |
| false); |
| |
| // CATCH spaces |
| registerBooleanOption(INSERT_SPACE_BEFORE_LP_CATCH, true); |
| registerBooleanOption(INSERT_SPACE_AFTER_LP_CATCH, false); |
| registerBooleanOption(INSERT_SPACE_BEFORE_RP_CATCH, false); |
| |
| // WITH spaces |
| registerBooleanOption(INSERT_SPACE_BEFORE_LP_WITH, true); |
| registerBooleanOption(INSERT_SPACE_AFTER_LP_WITH, false); |
| registerBooleanOption(INSERT_SPACE_BEFORE_RP_WITH, false); |
| |
| } |
| |
| // ////////////////////////////////////////////////////////////////////////// |
| // ////////////////////////////////////////////////////////////////////////// |
| // ////////////////////////////////////////////////////////////////////////// |
| // ////////////////////////////////////////////////////////////////////////// |
| // ////////////////////////////////////////////////////////////////////////// |
| |
| private static final Map<String, OptionInfo> options; |
| private static final String[] names; |
| |
| static { |
| options = new HashMap<String, OptionInfo>(); |
| |
| registerOptions(); |
| |
| List<String> keys = new ArrayList<String>(options.keySet()); |
| Collections.sort(keys); |
| |
| names = keys.toArray(new String[keys.size()]); |
| } |
| |
| // ////////////////////////////////////////////////////////////////////////// |
| // ////////////////////////////////////////////////////////////////////////// |
| // ////////////////////////////////////////////////////////////////////////// |
| // ////////////////////////////////////////////////////////////////////////// |
| // ////////////////////////////////////////////////////////////////////////// |
| |
| private final static class OptionInfo { |
| int type; |
| Object defaultValue; |
| |
| public OptionInfo(int type, Object defaultValue) { |
| this.type = type; |
| this.defaultValue = defaultValue; |
| } |
| } |
| |
| private static final int STRING = 0; |
| private static final int BOOLEAN = 1; |
| private static final int INT = 2; |
| |
| private static void registerIntegerOption(String name, int defaultValue) { |
| internalRegisterOption(name, INT, Integer.valueOf(defaultValue)); |
| } |
| |
| private static void registerStringOption(String name, String defaultValue) { |
| internalRegisterOption(name, STRING, defaultValue); |
| } |
| |
| private static void registerBooleanOption(String name, boolean defaultValue) { |
| internalRegisterOption(name, BOOLEAN, Boolean.valueOf(defaultValue)); |
| } |
| |
| private static void internalRegisterOption(String name, int type, |
| Object defaultValue) { |
| options.put(name, new OptionInfo(type, defaultValue)); |
| } |
| |
| public static boolean isDefined(String name) { |
| return options.containsKey(name); |
| } |
| |
| public static boolean isBoolean(String name) { |
| if (!isDefined(name)) |
| return false; |
| |
| return options.get(name).type == BOOLEAN; |
| } |
| |
| public static boolean isInteger(String name) { |
| if (!isDefined(name)) |
| return false; |
| |
| return options.get(name).type == INT; |
| } |
| |
| public static boolean isString(String name) { |
| if (!isDefined(name)) |
| return false; |
| |
| return options.get(name).type == STRING; |
| } |
| |
| public static String[] getNames() { |
| return names; |
| } |
| |
| public static Object getDefaultValue(String name) { |
| if (!isDefined(name)) |
| return null; |
| |
| return options.get(name).defaultValue; |
| } |
| |
| public static Map<String, Object> getDefaults() { |
| Map<String, Object> values = new HashMap<String, Object>(); |
| for (Map.Entry<String, OptionInfo> entry : options.entrySet()) { |
| values.put(entry.getKey(), entry.getValue().defaultValue); |
| } |
| return values; |
| } |
| } |