code: private ParseTree parsePatternAssignmentTarget(PatternKind patternKind) {
      SourcePosition start = getTreeStartLocation();
      ParseTree assignmentTarget;
      assignmentTarget = parsePatternAssignmentTargetNoDefault(patternKind);
  
      if (peek(TokenType.EQUAL)) {
        eat(TokenType.EQUAL);
        ParseTree defaultValue = parseAssignmentExpression();
        assignmentTarget =
            new DefaultParameterTree(getTreeLocation(start), assignmentTarget, defaultValue);
      }
      return assignmentTarget;
    }
docs: A PatternAssignmentTarget is the location where the assigned value gets stored, including an
  optional default value.
  
  <dl>
  <dt> Spec AssignmentElement === PatternAssignmentTarget(PatternKind.ANY)
  <dd> Valid in an assignment that is not a formal parameter list or variable declaration.
  Sub-patterns and arbitrary left hand side expressions are allowed.
  
  <dt> Spec BindingElement === PatternAssignmentElement(PatternKind.INITIALIZER)
  <dd> Valid in a formal parameter list or variable declaration statement.
  Only sub-patterns and identifiers are allowed.
  </dl>
  Examples:
  <pre>
  <code>
  [a, {foo: b = 'default'}] = someArray;          // valid
  [x.a, {foo: x.b = 'default'}] = someArray;      // valid
  
  let [a, {foo: b = 'default'}] = someArray;      // valid
  let [x.a, {foo: x.b = 'default'}] = someArray;  // invalid
  
  function f([a, {foo: b = 'default'}]) {...}     // valid
  function f([x.a, {foo: x.b = 'default'}]) {...} // invalid
  </code>
  </pre>