// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @implements {Common.JavaScriptMetadata}
 */
export default class JavaScriptMetadataImpl {
  constructor() {
    /** @type {!Map<string, !Array<!Array<string>>>} */
    this._uniqueFunctions = new Map();
    /** @type {!Map<string, !Map<string, !Array<!Array<string>>>>} */
    this._instanceMethods = new Map();
    /** @type {!Map<string, !Map<string, !Array<!Array<string>>>>} */
    this._staticMethods = new Map();

    for (const nativeFunction of JavaScriptMetadata.NativeFunctions) {
      if (!nativeFunction.receiver) {
        this._uniqueFunctions.set(nativeFunction.name, nativeFunction.signatures);
      } else if (nativeFunction.static) {
        if (!this._staticMethods.has(nativeFunction.receiver)) {
          this._staticMethods.set(nativeFunction.receiver, new Map());
        }
        this._staticMethods.get(nativeFunction.receiver).set(nativeFunction.name, nativeFunction.signatures);
      } else {
        if (!this._instanceMethods.has(nativeFunction.receiver)) {
          this._instanceMethods.set(nativeFunction.receiver, new Map());
        }
        this._instanceMethods.get(nativeFunction.receiver).set(nativeFunction.name, nativeFunction.signatures);
      }
    }
  }

  /**
   * @override
   * @param {string} name
   * @return {?Array<!Array<string>>}
   */
  signaturesForNativeFunction(name) {
    return this._uniqueFunctions.get(name) || null;
  }

  /**
   * @override
   * @param {string} name
   * @param {string} receiverClassName
   * @return {?Array<!Array<string>>}
   */
  signaturesForInstanceMethod(name, receiverClassName) {
    if (!this._instanceMethods.has(receiverClassName)) {
      return null;
    }
    return this._instanceMethods.get(receiverClassName).get(name) || null;
  }

  /**
   * @override
   * @param {string} name
   * @param {string} receiverConstructorName
   * @return {?Array<!Array<string>>}
   */
  signaturesForStaticMethod(name, receiverConstructorName) {
    if (!this._staticMethods.has(receiverConstructorName)) {
      return null;
    }
    return this._staticMethods.get(receiverConstructorName).get(name) || null;
  }
}

/* Legacy exported object */
self.JavaScriptMetadata = self.JavaScriptMetadata || {};

/* Legacy exported object */
JavaScriptMetadata = JavaScriptMetadata || {};

/**
 * @constructor
 */
JavaScriptMetadata.JavaScriptMetadata = JavaScriptMetadataImpl;

/**
 * @type {!Array<{
 *  name: string,
 *  signatures: !Array<!Array<string>>,
 *  static: (boolean|undefined),
 *  receiver: (string|undefined),
 * }>}
 */
JavaScriptMetadata.NativeFunctions;
