parseVariableDeclaration_(binding, noIn, initializerRequired) {
    let initRequired = initializerRequired !== INITIALIZER_OPTIONAL;
    let start = this.getTreeStartLocation_();

    let lvalue;
    let typeAnnotation;
    if (this.peekPattern_(peekType())) {
      lvalue = this.parseBindingPattern_();
      typeAnnotation = null;
    } else {
      lvalue = this.parseBindingIdentifier_();
      typeAnnotation = this.parseTypeAnnotationOpt_();
    }

    let init = null;
    if (peek(EQUAL)) {
      init = this.parseInitializer_(noIn);
    } else if (lvalue.isPattern() && initRequired) {
      this.reportError_(lvalue.location,
                        'destructuring must have an initializer');
    }

    return new VariableDeclaration(this.getTreeLocation_(start), lvalue,
        typeAnnotation, init);
  }
VariableDeclaration :
  BindingIdentifier Initializeropt
  BindingPattern Initializer

VariableDeclarationNoIn :
  BindingIdentifier InitializerNoInopt
  BindingPattern InitializerNoIn

@param {TokenType} binding
@param {boolean} noIn
@param {boolean} initializerRequired
@return {VariableDeclaration}
@private