parsePatternProperty_(useBinding) {
    let start = this.getTreeStartLocation_();

    let name = this.parsePropertyName_();

    let requireColon = name.type !== LITERAL_PROPERTY_NAME ||
        !name.literalToken.isStrictKeyword() &&
        name.literalToken.type !== IDENTIFIER;
    if (requireColon || peek(COLON)) {
      this.eat_(COLON);
      let element = this.parsePatternElement_(useBinding);
      // TODO(arv): Rename ObjectPatternField to BindingProperty
      return new ObjectPatternField(this.getTreeLocation_(start),
                                    name, element);
    }

    let token = name.literalToken;
    if (this.strictMode_ && token.isStrictKeyword())
      this.reportReservedIdentifier_(token);

    if (useBinding) {
      let binding = new BindingIdentifier(name.location, token);
      let initializer = this.parseInitializerOpt_(ALLOW_IN);
      return new BindingElement(this.getTreeLocation_(start), binding,
                                initializer);
    }

    let assignment = new IdentifierExpression(name.location, token);
    let initializer = this.parseInitializerOpt_(ALLOW_IN);
    return new AssignmentElement(this.getTreeLocation_(start), assignment,
                                 initializer);
  }
BindingProperty :
  SingleNameBinding
  PropertyName : BindingElement

SingleNameBinding :
  BindingIdentifier Initializeropt