| // Copyright 2018 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import type * as Common from '../../core/common/common.js'; |
| |
| import {NativeFunctions} from './NativeFunctions.js'; |
| |
| let javaScriptMetadataInstance: JavaScriptMetadataImpl; |
| |
| export class JavaScriptMetadataImpl implements Common.JavaScriptMetaData.JavaScriptMetaData { |
| private readonly uniqueFunctions: Map<string, string[][]>; |
| private readonly receiverMethods: Map<string, Map<string, string[][]>>; |
| static instance(opts: { |
| forceNew: boolean|null, |
| } = {forceNew: null}): JavaScriptMetadataImpl { |
| const {forceNew} = opts; |
| if (!javaScriptMetadataInstance || forceNew) { |
| javaScriptMetadataInstance = new JavaScriptMetadataImpl(); |
| } |
| |
| return javaScriptMetadataInstance; |
| } |
| constructor() { |
| this.uniqueFunctions = new Map(); |
| this.receiverMethods = new Map(); |
| |
| for (const nativeFunction of NativeFunctions) { |
| if (!nativeFunction.receivers) { |
| this.uniqueFunctions.set(nativeFunction.name, nativeFunction.signatures); |
| continue; |
| } |
| for (const receiver of nativeFunction.receivers) { |
| let method = this.receiverMethods.get(receiver); |
| if (!method) { |
| method = new Map(); |
| this.receiverMethods.set(receiver, method); |
| } |
| method.set(nativeFunction.name, nativeFunction.signatures); |
| } |
| } |
| } |
| |
| signaturesForNativeFunction(name: string): string[][]|null { |
| return this.uniqueFunctions.get(name) || null; |
| } |
| |
| signaturesForInstanceMethod(name: string, receiverClassName: string): string[][]|null { |
| const instanceMethod = this.receiverMethods.get(receiverClassName); |
| if (!instanceMethod) { |
| return null; |
| } |
| return instanceMethod.get(name) || null; |
| } |
| |
| signaturesForStaticMethod(name: string, receiverConstructorName: string): string[][]|null { |
| const staticMethod = this.receiverMethods.get(receiverConstructorName + 'Constructor'); |
| if (!staticMethod) { |
| return null; |
| } |
| return staticMethod.get(name) || null; |
| } |
| } |