in Dart/src/com/jetbrains/lang/dart/ide/formatter/DartWrappingProcessor.java [36:246]
Wrap createChildWrap(ASTNode child, Wrap defaultWrap, Wrap childWrap) {
final IElementType childType = child.getElementType();
final IElementType elementType = myNode.getElementType();
if (childType == COMMA || childType == SEMICOLON) return defaultWrap;
//
// Function definition/call
//
if (elementType == ARGUMENT_LIST) {
if (child instanceof PsiErrorElement) {
myNode.putUserData(DART_ARGUMENT_LIST_WRAP_KEY, null);
}
if (childWrap != null) {
return Wrap.createChildWrap(childWrap, WrapType.NORMAL, true);
}
Wrap wrap;
// First, do persistent object management.
if (myNode.getFirstChildNode() == child && childType != NAMED_ARGUMENT) {
ASTNode[] children = myNode.getChildren(DartIndentProcessor.EXPRESSIONS);
if (children.length >= 7) { // Approximation; dart_style uses dynamic programming with cost-based analysis to choose.
wrap = Wrap.createWrap(WrapType.ALWAYS, true);
}
else {
wrap = Wrap.createWrap(WrapType.NORMAL, true); // NORMAL,CHOP_DOWN_IF_LONG
}
if (myNode.getLastChildNode() != child) {
myNode.putUserData(DART_ARGUMENT_LIST_WRAP_KEY, wrap);
}
}
else {
if (childType == NAMED_ARGUMENT) {
ASTNode[] named = myNode.getChildren(NAMED_ARGUMENTS);
wrap = myNode.getUserData(DART_ARGUMENT_LIST_WRAP_KEY);
if (child == named[0]) {
if (named.length > 1) {
ASTNode[] children = myNode.getChildren(DartIndentProcessor.EXPRESSIONS);
Wrap namedWrap;
if (children.length >= 7 || named.length > 4) { // Another approximation.
namedWrap = Wrap.createWrap(WrapType.ALWAYS, true);
}
else {
namedWrap = Wrap.createWrap(WrapType.CHOP_DOWN_IF_LONG, true);
}
myNode.putUserData(DART_ARGUMENT_LIST_WRAP_KEY, namedWrap);
}
}
}
else {
wrap = myNode.getUserData(DART_ARGUMENT_LIST_WRAP_KEY);
}
if (myNode.getLastChildNode() == child) {
myNode.putUserData(DART_ARGUMENT_LIST_WRAP_KEY, null);
}
}
// Second, decide what object to return.
if (childType == MULTI_LINE_COMMENT || childType == FUNCTION_EXPRESSION) {
return Wrap.createWrap(WrapType.NONE, false);
}
return wrap != null ? wrap : Wrap.createWrap(WrapType.NORMAL, false);
}
if (elementType == FORMAL_PARAMETER_LIST) {
if (myNode.getFirstChildNode() == child) {
return createWrap(false);
}
if (childType == RPAREN) {
return createWrap(false);
}
return Wrap.createWrap(WrapType.NORMAL, true);
}
if (elementType == INITIALIZERS) {
if (childType != COLON && isNotFirstInitializer(child)) {
return Wrap.createWrap(WrapType.ALWAYS, true);
}
if (childType == COLON && !DartSpacingProcessor.hasMultipleInitializers(child)) {
return Wrap.createWrap(WrapType.NORMAL, true);
}
}
if (elementType == SET_OR_MAP_LITERAL_EXPRESSION || elementType == LIST_LITERAL_EXPRESSION) {
// First, do persistent object management.
Wrap wrap = sharedWrap(child, DART_COLLECTION_ELEMENT_WRAP_KEY);
// Second, decide what object to return.
if (childType == LBRACE || childType == LBRACKET) {
return Wrap.createWrap(WrapType.NONE, false);
}
if (childType == MULTI_LINE_COMMENT || childType == CONST || childType == TYPE_ARGUMENTS) {
return Wrap.createWrap(WrapType.NONE, false);
}
return wrap != null ? wrap : Wrap.createWrap(WrapType.NORMAL, true);
}
//
// Wrap after arrows.
//
if (elementType == FUNCTION_BODY) {
if (FormatterUtil.isPrecededBy(child, EXPRESSION_BODY_DEF)) {
return createWrap(true);
}
}
if (childType == CALL_EXPRESSION) {
if (FormatterUtil.isPrecededBy(child, EXPRESSION_BODY_DEF)) {
return createWrap(true);
}
}
//
// If
//
if (elementType == IF_STATEMENT) {
if (childType == ELSE) {
return createWrap(false);
}
else if (!BLOCKS.contains(childType) && child == child.getTreeParent().getLastChildNode()) {
return createWrap(true);
}
}
//
//Binary expressions
//
if (BINARY_EXPRESSIONS.contains(elementType)) {
if (isRightOperand(child)) {
return Wrap.createWrap(WrapType.NORMAL, true);
}
}
//
// Assignment
//
if (elementType == ASSIGN_EXPRESSION) {
if (childType != ASSIGNMENT_OPERATOR) {
return Wrap.createWrap(WrapType.NORMAL, true);
}
}
//
// Ternary expressions
//
if (elementType == TERNARY_EXPRESSION) {
if (myNode.getFirstChildNode() != child) {
if (childType == QUEST) {
final Wrap wrap = Wrap.createWrap(WrapType.CHOP_DOWN_IF_LONG, true);
myNode.putUserData(DART_TERNARY_EXPRESSION_WRAP_KEY, wrap);
return wrap;
}
if (childType == COLON) {
final Wrap wrap = myNode.getUserData(DART_TERNARY_EXPRESSION_WRAP_KEY);
myNode.putUserData(DART_TERNARY_EXPRESSION_WRAP_KEY, null);
return wrap != null ? wrap : Wrap.createWrap(WrapType.CHOP_DOWN_IF_LONG, true);
}
}
return Wrap.createWrap(WrapType.NONE, true);
}
if (childType == HIDE_COMBINATOR || childType == SHOW_COMBINATOR) {
return createWrap(true);
}
if (childType == VAR_DECLARATION_LIST && elementType != FOR_LOOP_PARTS) {
if (varDeclListContainsVarInit(child)) {
return Wrap.createWrap(WrapType.ALWAYS, true);
}
else {
return Wrap.createWrap(WrapType.CHOP_DOWN_IF_LONG, true);
}
}
if (childType == VAR_DECLARATION_LIST_PART) {
ASTNode parent = getParent();
if (parent != null && parent.getElementType() == FOR_LOOP_PARTS) {
return Wrap.createWrap(WrapType.NORMAL, true);
}
else {
if (varDeclListContainsVarInit(myNode)) {
return Wrap.createWrap(WrapType.ALWAYS, true);
}
else {
return Wrap.createWrap(WrapType.CHOP_DOWN_IF_LONG, true);
}
}
}
if (elementType == CLASS_DEFINITION) {
if (childType == SUPERCLASS || childType == INTERFACES || childType == MIXINS) {
return Wrap.createWrap(WrapType.CHOP_DOWN_IF_LONG, true);
}
}
if (elementType == MIXIN_APPLICATION && childType == MIXINS) {
return Wrap.createWrap(WrapType.CHOP_DOWN_IF_LONG, true);
}
if (elementType == ENUM_DEFINITION) {
if (childType == ENUM_CONSTANT_DECLARATION) {
return Wrap.createWrap(WrapType.CHOP_DOWN_IF_LONG, true);
}
}
if (elementType == TYPE_LIST) {
if (childType == TYPE) {
Wrap wrap = sharedWrap(child, DART_TYPE_LIST_WRAP_KEY);
return wrap == null ? Wrap.createWrap(WrapType.NORMAL, true) : wrap;
}
}
if (elementType == REFERENCE_EXPRESSION && (childType == DOT || childType == QUEST_DOT)) {
return Wrap.createWrap(WrapType.NORMAL, true); // NORMAL,CHOP_DOWN_IF_LONG
}
return defaultWrap;
}