// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
desc: Private async methods have name property properly configured
info: |
  Updated Productions

  ClassElement : MethodDefinition
    1. Return ClassElementEvaluation of MethodDefinition with arguments ! Get(homeObject, "prototype"),enumerable, and "prototype".

  ClassElement : MethodDefinition
  ClassElement : static MethodDefinition
    1. Perform ? PropertyDefinitionEvaluation with parameters object and enumerable.
    2. Return empty.

  AsyncMethod : async [no LineTerminator here] ClassElementName (UniqueFormalParameters) { AsyncFunctionBody }
    1. Let propKey be the result of evaluating ClassElementName.
    ...
    10. Perform ? DefineOrdinaryMethod(key, homeObject, closure, enumerable).

  ClassElementName : PrivateIdentifier
    1. Let bindingName be StringValue of PrivateIdentifier.
    ...
    5. If scopeEnvRec's binding for bindingName is uninitialized,
      a. Let field be NewPrivateName(bindingName).
      b. Perform ! scopeEnvRec.InitializeBinding(bindingName, field).
    6. Otherwise,
      a. Let field be scopeEnvRec.GetBindingValue(bindingName).
    7. Assert: field.[[Description]] is bindingName.
    8. Return field.

  DefineOrdinaryMethod(key, homeObject, closure, enumerable)
    1. Perform SetFunctionName(closure, key).
    2. If key is a Private Name,
      a. Assert: key does not have a [[Kind]] field.
      b. Set key.[[Kind]] to "method".
      c. Set key.[[Value]] to closure.
      d. Set key.[[Brand]] to homeObject.
    3. Else,
      a. Let desc be the PropertyDescriptor{[[Value]]: closure, [[Writable]]: true, [[Enumerable]]: enumerable, [[Configurable]]: true}.
      b. Perform ? DefinePropertyOrThrow(homeObject, key, desc).
template: default
features: [class-methods-private]
---*/

//- elements
async #method() {};

getPrivateMethod() {
  return this.#method;
}
//- assertions
let c = new C();
assert.sameValue(c.getPrivateMethod().name, "#method");
