Wrap createChildWrap()

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;
  }