/*******************************************************************************
* Copyright (c) 2010 Martin Schnabel <mb0@mb0.org>.
* 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
******************************************************************************/
package org.axdt.as3.formatting;
import org.axdt.as3.config.IFormattingConfig;
import org.axdt.as3.config.IFormattingConfig.IndentStyle;
import org.axdt.as3.services.As3GrammarAccess;
import org.axdt.as3.services.As3GrammarAccess.As3ArrayElementHeadElements;
import org.axdt.as3.services.As3GrammarAccess.As3ArrayElementTailElements;
import org.axdt.as3.services.As3GrammarAccess.As3ArrayInitializerElements;
import org.axdt.as3.services.As3GrammarAccess.As3MetadataTagElements;
import org.axdt.as3.services.As3GrammarAccess.ObjectInitialiserElements;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.AbstractElement;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.formatting.impl.FormattingConfig;
import org.eclipse.xtext.parsetree.reconstr.ITokenStream;
import org.eclipse.xtext.util.Pair;
import com.google.inject.Inject;
/**
* @author mb0
*/
public class As3Formatter extends ConfigurableDeclarativeFormatter {
@Inject
protected IFormattingConfig formattingConfig;
@Override
protected As3GrammarAccess getGrammarAccess() {
return (As3GrammarAccess) super.getGrammarAccess();
}
@Override
protected void configureFormatting(FormattingConfig c) {
IndentStyle indentStyle = formattingConfig.getIndentStyle(null);
int autoLineWrap = formattingConfig.getInt(null, IFormattingConfig.MAX_LINE_WIDTH);
int minMemberWrap = 1;
As3GrammarAccess f = getGrammarAccess();
c.setAutoLinewrap(autoLineWrap);
c.setLinewrap(1, 1, 2).after(f.getVirtualSemiRule());
c.setNoSpace().before(f.getVirtualSemiRule());
// colon
c.setNoSpace().around(f.getResultTypeAccess().getColonKeyword_0_1());
c.setNoSpace().around(f.getVarTypeAssignAccess().getColonKeyword_1());
c.setNoSpace().around(f.getVarTypeAccess().getColonKeyword_0());
c.setNoSpace().around(f.getAs3LiteralFieldAccess().getColonKeyword_2());
// dot
for (Keyword comma : f.findKeywords(".")) {
c.setNoSpace().around(comma);
}
// import fqn is a data type rule
// we use the converter and a rewritten IValueSerializer
// comma
for (Keyword comma : f.findKeywords(",")) {
c.setNoSpace().before(comma);
}
// arithmetic
c.setNoSpace().before(
f.getIPostfixExpressionAccess()
.getPlusSignPlusSignKeyword_1_0_0_1());
c.setNoSpace().before(
f.getIPostfixExpressionAccess()
.getHyphenMinusHyphenMinusKeyword_1_1_0_1());
// pairs
for (Pair<Keyword, Keyword> pair : f.findKeywordPairs("(", ")")) {
c.setNoSpace().bounds(pair.getFirst(), pair.getSecond());
}
c.setNoSpace().before(
f.getAs3ArgumentsAccess().getLeftParenthesisKeyword_1());
c.setNoSpace().bounds(
f.getAs3PropertyOperatorAccess()
.getLeftSquareBracketKeyword_1_0(),
f.getAs3PropertyOperatorAccess()
.getRightSquareBracketKeyword_1_4());
// initializers
As3ArrayInitializerElements arrayInitializer = f
.getAs3ArrayInitializerAccess();
As3ArrayElementHeadElements arrayHead = f.getAs3ArrayElementHeadAccess();
As3ArrayElementTailElements arrayTail = f.getAs3ArrayElementTailAccess();
configureInitializers(c,
arrayHead.getLeftSquareBracketKeyword_1(),
arrayInitializer.getRightSquareBracketKeyword_3(),
arrayTail.getCommaKeyword_1());
ObjectInitialiserElements objectInitialiser = f
.getObjectInitialiserAccess();
configureInitializers(c,
objectInitialiser.getLeftCurlyBracketKeyword_1(),
objectInitialiser.getRightCurlyBracketKeyword_4(),
objectInitialiser.getCommaKeyword_3_2_0());
c.setLinewrap(0, 0, 1).after(objectInitialiser.getCommaKeyword_3_3_0());
// metadata
As3MetadataTagElements metadataTag = f.getAs3MetadataTagAccess();
c.setNoSpace().bounds(metadataTag.getLeftSquareBracketKeyword_0(),
metadataTag.getRightSquareBracketKeyword_3());
c.setNoSpace().around(metadataTag.getLeftParenthesisKeyword_2_0());
c.setNoSpace().around(metadataTag.getRightParenthesisKeyword_2_3());
c.setLinewrap(1, 1, 1).after(
metadataTag.getRightSquareBracketKeyword_3());
// indentations
c.setIndentation(f.getAs3BlockAccess().getLeftCurlyBracketKeyword_1(),
f.getAs3BlockAccess().getRightCurlyBracketKeyword_4());
c.setLinewrap(1, 1, 2).after(
f.getAs3BlockAccess().getLeftCurlyBracketKeyword_1());
c.setLinewrap(1, 1, 2).after(
f.getAs3BlockAccess().getRightCurlyBracketKeyword_4());
indentStyle.breakBefore(c, f.getAs3BlockAccess()
.getLeftCurlyBracketKeyword_1());
c.setIndentation(f.getAs3ClassAccess().getLeftCurlyBracketKeyword_7(),
f.getAs3ClassAccess().getRightCurlyBracketKeyword_10());
c.setLinewrap(minMemberWrap, 2, 2).after(
f.getAs3ClassAccess().getLeftCurlyBracketKeyword_7());
indentStyle.breakBefore(c, f.getAs3ClassAccess()
.getLeftCurlyBracketKeyword_7());
c.setLinewrap().after(
f.getAs3ClassAccess().getRightCurlyBracketKeyword_10());
c.setIndentation(f.getAs3InterfaceAccess()
.getLeftCurlyBracketKeyword_6(), f.getAs3InterfaceAccess()
.getRightCurlyBracketKeyword_9());
c.setLinewrap(minMemberWrap, 2, 2).after(
f.getAs3InterfaceAccess().getLeftCurlyBracketKeyword_6());
indentStyle.breakBefore(c, f.getAs3InterfaceAccess()
.getLeftCurlyBracketKeyword_6());
c.setLinewrap().after(
f.getAs3InterfaceAccess().getRightCurlyBracketKeyword_9());
c.setIndentation(
f.getAs3PackageAccess().getLeftCurlyBracketKeyword_4(), f
.getAs3PackageAccess().getRightCurlyBracketKeyword_7());
c.setLinewrap(minMemberWrap, 2, 2).after(
f.getAs3PackageAccess().getLeftCurlyBracketKeyword_4());
indentStyle.breakBefore(c, f.getAs3PackageAccess()
.getLeftCurlyBracketKeyword_4());
c.setLinewrap().after(
f.getAs3PackageAccess().getRightCurlyBracketKeyword_7());
// indentations for auto line wrap
c.setIndentation(f.getAs3OperationAccess()
.getLeftParenthesisKeyword_6(), f.getAs3OperationAccess()
.getRightParenthesisKeyword_9());
c.setIndentation(f.getAs3OperationAccess().getFunctionKeyword_1(), f
.getAs3OperationAccess().getBodyAssignment_12());
c.setIndentation(f.getAs3FunctionExpressionAccess()
.getLeftParenthesisKeyword_3(), f
.getAs3FunctionExpressionAccess()
.getRightParenthesisKeyword_6());
c.setIndentation(f.getAs3FunctionExpressionAccess()
.getFunctionKeyword_0(), f.getAs3FunctionExpressionAccess()
.getBodyAssignment_10());
// comments
c.setLinewrap(0, 1, 2).before(f.getSL_COMMENTRule());
c.setLinewrap(1, 1, 2).before(f.getML_COMMENTRule());
c.setLinewrap(1, 1, 2).before(f.getDOC_COMMENTRule());
c.setLinewrap(1, 1, 2).after(f.getML_COMMENTRule());
c.setLinewrap(1, 1, 1).after(f.getDOC_COMMENTRule());
// misc
c.setNoSpace().before(
f.getAs3PropertyOperatorAccess()
.getLeftSquareBracketKeyword_1_0());
c.setNoSpace().before(
f.getAs3FunctionExpressionAccess()
.getLeftParenthesisKeyword_3());
c.setNoSpace().before(
f.getAs3OperationAccess().getLeftParenthesisKeyword_6());
c.setNoSpace().before(
f.getAs3OperationSignatureAccess()
.getLeftParenthesisKeyword_6());
c.setNoSpace().around(
f.getAs3QueryOperatorAccess().getFullStopFullStopKeyword_0_0());
c.setNoLinewrap().before(
f.getAs3DoStatementAccess().getWhileKeyword_4());
c.setLinewrap(minMemberWrap, Math.max(1, minMemberWrap), 2).after(
f.getAs3ImportListRule());
c.setNoLinewrap().between(
f.getAs3BlockAccess().getRightCurlyBracketKeyword_4(),
f.getAs3IfStatementAccess().getElseKeyword_5_0_0_1());
}
protected void configureInitializers(FormattingConfig c,
AbstractElement left, AbstractElement right, EObject sep) {
c.setLinewrap(0, 0, 1).bounds(left, right);
c.setLinewrap(0, 0, 1).after(sep);
c.setIndentation(left, right);
}
@Override
public ITokenStream createFormatterStream(String indent, ITokenStream out,
boolean preserveWhitespaces) {
return new As3FormattingStream(out, indent, getConfig(),
createMatcher(), getHiddenTokenHelper(), preserveWhitespaces,
getGrammarAccess());
}
}