desugarVariableDeclaration_(tree) {
    let tempRValueName = this.getTempIdentifier();
    let tempRValueIdent = createIdentifierExpression(tempRValueName);
    let desugaring;
    let initializer;

    // Don't use parens for these cases:
    // - tree.initializer is assigned to a temporary.
    // - tree.initializer normally doesn't need parens for member access.
    // Don't use temporary if:
    // - there is only one value to assign (and no initializer).
    switch (tree.initializer.type) {
      // Paren not necessary.
      case ARRAY_LITERAL:
      case CALL_EXPRESSION:
      case IDENTIFIER_EXPRESSION:
      case LITERAL_EXPRESSION:
      case MEMBER_EXPRESSION:
      case MEMBER_LOOKUP_EXPRESSION:
      case OBJECT_LITERAL:
      case PAREN_EXPRESSION:
        initializer = tree.initializer;
    }

    // [1] Try first using a temporary (used later as the base rvalue).
    desugaring = new VariableDeclarationDesugaring(tempRValueIdent);
    desugaring.assign(desugaring.rvalue, tree.initializer);
    let initializerFound = this.desugarPattern_(desugaring, tree.lvalue);

    // [2] Was the temporary necessary? Then return.
    if (initializerFound || desugaring.declarations.length > 2) {
      return desugaring.declarations;
    }

    if (!initializer) {
      initializer = createParenExpression(tree.initializer);
    }

    // [3] Redo everything without the temporary.
    desugaring = new VariableDeclarationDesugaring(initializer);
    this.desugarPattern_(desugaring, tree.lvalue);

    return desugaring.declarations;
  }
@param {VariableDeclaration} tree
@return {Array.<VariableDeclaration>}