package com.redhat.ceylon.eclipse.code.style; import static com.redhat.ceylon.eclipse.code.style.CeylonFormatterConstants.*; import ceylon.formatter.options.FormattingOptions; import ceylon.formatter.options.IndentMode; import ceylon.formatter.options.Mixed; import ceylon.formatter.options.Spaces; import ceylon.formatter.options.SparseFormattingOptions; import ceylon.formatter.options.Tabs; import ceylon.formatter.options.VariableOptions; import ceylon.formatter.options.all_; import ceylon.formatter.options.combinedOptions_; import ceylon.formatter.options.crlf_; import ceylon.formatter.options.lf_; import ceylon.formatter.options.os_; import ceylon.formatter.options.unlimited_; import ceylon.language.Range; import ceylon.language.Singleton; import ceylon.language.span_; /** * Wrapper around VariableOptions * */ public class FormatterPreferences { private static final String FALSE = "false"; private static final String TRUE = "true"; private VariableOptions options; private SparseFormattingOptions ideOptions; public FormatterPreferences(FormattingOptions options) { this.options = new VariableOptions(options); this.ideOptions = CeylonStyle.getEclipseWsOptions(null); } public String get(String key) { String ret = null; switch (key) { case FORMATTER_indentMode: ret = ideOptions.getIndentMode().getClass().getSimpleName() .toLowerCase(); break; case FORMATTER_indentMode_Spaces_Size: case FORMATTER_indentMode_Tabs_Size: ret = new Long(ideOptions.getIndentMode().getWidthOfLevel()) .toString(); break; case FORMATTER_indent_Blank_Lines: ret = booleanString(options.getIndentBlankLines()); break; case FORMATTER_indent_Before_Type_Info: ret = options.getIndentBeforeTypeInfo().toString(); break; case FORMATTER_space_BeforeMethodOrClassPositionalArgumentList: ret = booleanString(options .getSpaceBeforeMethodOrClassPositionalArgumentList()); break; case FORMATTER_space_AroundSatisfiesOf: ret = booleanString(options.getSpaceAroundSatisfiesOf()); break; case FORMATTER_space_AroundImportAliasEqualsSign: ret = booleanString(options.getSpaceAroundImportAliasEqualsSign()); break; case FORMATTER_space_AfterTypeParamListComma: ret = booleanString(options.getSpaceAfterTypeParamListComma()); break; case FORMATTER_space_AfterTypeArgListComma: ret = booleanString(options.getSpaceAfterTypeArgListComma()); break; case FORMATTER_space_AroundTypeParamListEqualsSign: ret = booleanString(options.getSpaceAroundTypeParamListEqualsSign()); break; case FORMATTER_space_BeforeSequenceEnumerationClosingBrace: ret = booleanString(options .getSpaceBeforeSequenceEnumerationClosingBrace()); break; case FORMATTER_space_BeforeParamListOpeningParen: ret = booleanString(options.getSpaceBeforeParamListOpeningParen()); break; case FORMATTER_space_BeforeParamListClosingParen: ret = booleanString(options.getSpaceBeforeParamListClosingParen()); break; case FORMATTER_space_AfterParamListClosingParen: ret = booleanString(options.getSpaceAfterParamListClosingParen()); break; case FORMATTER_space_BeforeValueIteratorClosingParenthesis: ret = booleanString(options .getSpaceBeforeValueIteratorClosingParenthesis()); break; case FORMATTER_space_AfterSequenceEnumerationOpeningBrace: ret = booleanString(options .getSpaceAfterSequenceEnumerationOpeningBrace()); break; case FORMATTER_space_BeforeAnnotationPositionalArgumentList: ret = booleanString(options .getSpaceBeforeAnnotationPositionalArgumentList()); break; case FORMATTER_space_AfterValueIteratorOpeningParenthesis: ret = booleanString(options .getSpaceAfterValueIteratorOpeningParenthesis()); break; case FORMATTER_space_AfterParamListOpeningParen: ret = booleanString(options.getSpaceAfterParamListOpeningParen()); break; case FORMATTER_space_AfterControlStructureKeyword: ret = booleanString(options.getSpaceAfterControlStructureKeyword()); break; case FORMATTER_space_OptionalAroundOperatorLevel: ret = options.getSpaceOptionalAroundOperatorLevel().toString(); break; case FORMATTER_maxLineLength: if ((options.getMaxLineLength() instanceof ceylon.formatter.options.Unlimited)) { ret = TRUE; // unlimited } else { ret = FALSE; } break; case FORMATTER_maxLineLength_Number: if (options.getMaxLineLength() instanceof ceylon.formatter.options.Unlimited) { ret = "0"; } else { ret = options.getMaxLineLength().toString(); } break; case FORMATTER_lineBreakStrategy: ret = options.getLineBreakStrategy().toString(); break; case FORMATTER_lineBreaksAfterLineComment_First: ret = options.getLineBreaksAfterLineComment().getFirst().toString(); break; case FORMATTER_lineBreaksAfterLineComment_Last: ret = options.getLineBreaksAfterLineComment().getLast().toString(); break; case FORMATTER_lineBreaksAfterSingleComment_First: ret = options.getLineBreaksAfterSingleComment().getFirst() .toString(); break; case FORMATTER_lineBreaksAfterSingleComment_Last: ret = options.getLineBreaksAfterSingleComment().getLast() .toString(); break; case FORMATTER_lineBreaksBeforeMultiComment_First: ret = options.getLineBreaksBeforeMultiComment().getFirst() .toString(); break; case FORMATTER_lineBreaksBeforeMultiComment_Last: ret = options.getLineBreaksBeforeMultiComment().getLast() .toString(); break; case FORMATTER_lineBreaksAfterMultiComment_First: ret = options.getLineBreaksAfterMultiComment().getFirst() .toString(); break; case FORMATTER_lineBreaksAfterMultiComment_Last: ret = options.getLineBreaksAfterMultiComment().getLast().toString(); break; case FORMATTER_lineBreaksBeforeSingleComment_First: ret = options.getLineBreaksBeforeSingleComment().getFirst() .toString(); break; case FORMATTER_lineBreaksBeforeSingleComment_Last: ret = options.getLineBreaksBeforeSingleComment().getLast() .toString(); break; case FORMATTER_lineBreaksInTypeParameterList_First: ret = options.getLineBreaksInTypeParameterList().getFirst() .toString(); break; case FORMATTER_lineBreaksInTypeParameterList_Last: ret = options.getLineBreaksInTypeParameterList().getLast() .toString(); break; case FORMATTER_lineBreaksBeforeLineComment_First: ret = options.getLineBreaksBeforeLineComment().getFirst() .toString(); break; case FORMATTER_lineBreaksBeforeLineComment_Last: ret = options.getLineBreaksBeforeLineComment().getLast().toString(); break; case FORMATTER_lineBreaksBetweenImportElements_First: ret = options.getLineBreaksBetweenImportElements().getFirst().toString(); break; case FORMATTER_lineBreaksBetweenImportElements_Last: ret = options.getLineBreaksBetweenImportElements().getLast().toString(); break; case FORMATTER_elseOnOwnLine: ret = booleanString(options.getElseOnOwnLine()); break; case FORMATTER_failFast: ret = booleanString(options.getFailFast()); break; case FORMATTER_braceOnOwnLine: ret = booleanString(options.getBraceOnOwnLine()); break; case FORMATTER_inlineAnnotations: if (options.getInlineAnnotations() instanceof ceylon.formatter.options.All) { ret = TRUE; // All } else { ret = FALSE; } break; case FORMATTER_inlineAnnotations_List: if (options.getInlineAnnotations() instanceof ceylon.formatter.options.All) { ret = "all"; } else { @SuppressWarnings("unchecked") // checked by Ceylon type info ceylon.language.Iterable<? extends String, ? extends Object> it = (ceylon.language.Iterable<? extends String, ? extends Object>)options.getInlineAnnotations(); ret = ceylon.language.String.join(",", it); } break; case FORMATTER_lineBreak: ret = ideOptions.getLineBreak().toString(); break; // to set up previewer only case FORMATTER_LINE_SPLIT: ret = "80"; break; case FORMATTER_TAB_SIZE: ret = "4"; break; default: break; } return ret; } private String booleanString(ceylon.language.Boolean b) { return b.booleanValue() ? TRUE : FALSE; } public void put(String key, String value) { int num; switch (key) { case FORMATTER_indentMode: IndentMode indentMode = getIndentMode(value, new Long(options .getIndentMode().getWidthOfLevel()).intValue()); options.setIndentMode(indentMode); break; case FORMATTER_indentMode_Spaces_Size: case FORMATTER_indentMode_Tabs_Size: String mode = options.getIndentMode().getClass().getSimpleName() .toLowerCase(); indentMode = getIndentMode(mode, Integer.parseInt(value)); options.setIndentMode(indentMode); break; case FORMATTER_indent_Blank_Lines: options.setIndentBlankLines(ceylonBoolean(value)); break; case FORMATTER_indent_Before_Type_Info: options.setIndentBeforeTypeInfo(new ceylon.language.Integer( new Long(value))); break; case FORMATTER_space_BeforeMethodOrClassPositionalArgumentList: options.setSpaceBeforeMethodOrClassPositionalArgumentList(ceylonBoolean(value)); break; case FORMATTER_space_AroundSatisfiesOf: options.setSpaceAroundSatisfiesOf(ceylonBoolean(value)); break; case FORMATTER_space_AroundImportAliasEqualsSign: options.setSpaceAroundImportAliasEqualsSign(ceylonBoolean(value)); break; case FORMATTER_space_AfterTypeParamListComma: options.setSpaceAfterTypeParamListComma(ceylonBoolean(value)); break; case FORMATTER_space_AfterTypeArgListComma: options.setSpaceAfterTypeArgListComma(ceylonBoolean(value)); break; case FORMATTER_space_AroundTypeParamListEqualsSign: options.setSpaceAroundTypeParamListEqualsSign(ceylonBoolean(value)); break; case FORMATTER_space_BeforeSequenceEnumerationClosingBrace: options.setSpaceBeforeSequenceEnumerationClosingBrace(ceylonBoolean(value)); break; case FORMATTER_space_BeforeParamListOpeningParen: options.setSpaceBeforeParamListOpeningParen(ceylonBoolean(value)); break; case FORMATTER_space_BeforeParamListClosingParen: options.setSpaceBeforeParamListClosingParen(ceylonBoolean(value)); break; case FORMATTER_space_AfterParamListClosingParen: options.setSpaceAfterParamListClosingParen(ceylonBoolean(value)); break; case FORMATTER_space_BeforeValueIteratorClosingParenthesis: options.setSpaceBeforeValueIteratorClosingParenthesis(ceylonBoolean(value)); break; case FORMATTER_space_AfterSequenceEnumerationOpeningBrace: options.setSpaceAfterSequenceEnumerationOpeningBrace(ceylonBoolean(value)); break; case FORMATTER_space_BeforeAnnotationPositionalArgumentList: options.setSpaceBeforeAnnotationPositionalArgumentList(ceylonBoolean(value)); break; case FORMATTER_space_AfterValueIteratorOpeningParenthesis: options.setSpaceAfterValueIteratorOpeningParenthesis(ceylonBoolean(value)); break; case FORMATTER_space_AfterParamListOpeningParen: options.setSpaceAfterParamListOpeningParen(ceylonBoolean(value)); break; case FORMATTER_space_AfterControlStructureKeyword: options.setSpaceAfterControlStructureKeyword(ceylonBoolean(value)); break; case FORMATTER_space_OptionalAroundOperatorLevel: options.setSpaceOptionalAroundOperatorLevel( new ceylon.language.Integer(new Long(value))); break; case FORMATTER_maxLineLength: if (TRUE.equals(value)) { options.setMaxLineLength(unlimited_.get_()); } else { options.setMaxLineLength(ceylon.language.Integer.instance(80L)); // don't use FormattingOptions.$default$maxLineLength(null): that's unlimited! } break; case FORMATTER_maxLineLength_Number: if (value == null) { options.setMaxLineLength(unlimited_.get_()); } else { if (value.equals("0")) { options.setMaxLineLength(unlimited_.get_()); } else { options.setMaxLineLength(ceylon.language.Integer.instance(java.lang.Integer.parseInt(value))); } } break; case FORMATTER_lineBreakStrategy: options.setLineBreakStrategy(options.getLineBreakStrategy()); // default only break; case FORMATTER_lineBreaksAfterLineComment_First: num = Integer.parseInt(value); options.setLineBreaksAfterLineComment(setFirst( options.getLineBreaksAfterLineComment(), num)); break; case FORMATTER_lineBreaksAfterLineComment_Last: num = Integer.parseInt(value); options.setLineBreaksAfterLineComment(setLast( options.getLineBreaksAfterLineComment(), num)); break; case FORMATTER_lineBreaksAfterSingleComment_First: num = Integer.parseInt(value); options.setLineBreaksAfterSingleComment(setFirst( options.getLineBreaksAfterSingleComment(), num)); break; case FORMATTER_lineBreaksAfterSingleComment_Last: num = Integer.parseInt(value); options.setLineBreaksAfterSingleComment(setLast( options.getLineBreaksAfterSingleComment(), num)); break; case FORMATTER_lineBreaksBeforeMultiComment_First: num = Integer.parseInt(value); options.setLineBreaksBeforeMultiComment(setFirst( options.getLineBreaksBeforeMultiComment(), num)); break; case FORMATTER_lineBreaksBeforeMultiComment_Last: num = Integer.parseInt(value); options.setLineBreaksBeforeMultiComment(setLast( options.getLineBreaksBeforeMultiComment(), num)); break; case FORMATTER_lineBreaksAfterMultiComment_First: num = Integer.parseInt(value); options.setLineBreaksAfterMultiComment(setFirst( options.getLineBreaksAfterMultiComment(), num)); break; case FORMATTER_lineBreaksAfterMultiComment_Last: num = Integer.parseInt(value); options.setLineBreaksAfterMultiComment(setLast( options.getLineBreaksAfterMultiComment(), num)); break; case FORMATTER_lineBreaksBeforeSingleComment_First: num = Integer.parseInt(value); options.setLineBreaksBeforeSingleComment(setFirst( options.getLineBreaksBeforeSingleComment(), num)); break; case FORMATTER_lineBreaksBeforeSingleComment_Last: num = Integer.parseInt(value); options.setLineBreaksBeforeSingleComment(setLast( options.getLineBreaksBeforeSingleComment(), num)); break; case FORMATTER_lineBreaksInTypeParameterList_First: num = Integer.parseInt(value); options.setLineBreaksInTypeParameterList(setFirst( options.getLineBreaksInTypeParameterList(), num)); break; case FORMATTER_lineBreaksInTypeParameterList_Last: num = Integer.parseInt(value); options.setLineBreaksInTypeParameterList(setLast( options.getLineBreaksInTypeParameterList(), num)); break; case FORMATTER_lineBreaksBeforeLineComment_First: num = Integer.parseInt(value); options.setLineBreaksBeforeLineComment(setFirst( options.getLineBreaksBeforeLineComment(), num)); break; case FORMATTER_lineBreaksBeforeLineComment_Last: num = Integer.parseInt(value); options.setLineBreaksBeforeLineComment(setLast( options.getLineBreaksBeforeLineComment(), num)); break; case FORMATTER_lineBreaksBetweenImportElements_First: num = Integer.parseInt(value); options.setLineBreaksBetweenImportElements(setFirst( options.getLineBreaksBetweenImportElements(), num)); break; case FORMATTER_lineBreaksBetweenImportElements_Last: num = Integer.parseInt(value); options.setLineBreaksBetweenImportElements(setLast( options.getLineBreaksBetweenImportElements(), num)); break; case FORMATTER_elseOnOwnLine: options.setElseOnOwnLine(ceylonBoolean(value)); break; case FORMATTER_failFast: options.setFailFast(ceylonBoolean(value)); break; case FORMATTER_braceOnOwnLine: options.setBraceOnOwnLine(ceylonBoolean(value)); break; case FORMATTER_inlineAnnotations: if (TRUE.equals(value)) { options.setInlineAnnotations(all_.get_()); } else { options.setInlineAnnotations(FormattingOptions.$default$inlineAnnotations(null, null, null, null, null, null, null, null)); } break; case FORMATTER_inlineAnnotations_List: if (value == null) { options.setInlineAnnotations(all_.get_()); } else { if (value.equals("all")) { options.setInlineAnnotations(all_.get_()); } else { options.setInlineAnnotations(ceylon.language.String.split(value.replace(',', ' '))); } } break; case FORMATTER_lineBreak: if (ceylon.formatter.options.lf_.get_().toString().equals(value)) { options.setLineBreak(lf_.get_()); } else if (ceylon.formatter.options.os_.get_().toString() .equals(value)) { options.setLineBreak(os_.get_()); } else if (ceylon.formatter.options.crlf_.get_().toString() .equals(value)) { options.setLineBreak(crlf_.get_()); } break; default: break; } } private Range<ceylon.language.Integer> setFirst( Range<ceylon.language.Integer> range, int num) { return span_.span(range.getFirst().$getType$(), new ceylon.language.Integer(num), range.getLast()); } private Range<ceylon.language.Integer> setLast( Range<ceylon.language.Integer> range, int num) { return span_.span(range.getFirst().$getType$(), range.getFirst(), new ceylon.language.Integer(num)); } private ceylon.language.Boolean ceylonBoolean(String value) { return Boolean.parseBoolean(value) ? new ceylon.language.true_() : new ceylon.language.false_(); } private IndentMode getIndentMode(String mode, int n1) { if (FORMATTER_indentMode_Spaces.equalsIgnoreCase(mode)) { return new Spaces(n1); } else if (FORMATTER_indentMode_Tabs.equalsIgnoreCase(mode)) { return new Tabs(n1); } else if (FORMATTER_indentMode_Mixed.equalsIgnoreCase(mode)) { return new Mixed(new Tabs(n1), new Spaces(n1)); } return options.getIndentMode(); } public FormattingOptions getOptions() { return combinedOptions_.combinedOptions(new FormattingOptions(), new Singleton<SparseFormattingOptions>( SparseFormattingOptions.$TypeDescriptor$, options)); } }