"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.AstImport = exports.AstImportKind = void 0;
const node_core_library_1 = require("@rushstack/node-core-library");
const AstEntity_1 = require("./AstEntity");
/**
 * Indicates the import kind for an `AstImport`.
 */
var AstImportKind;
(function (AstImportKind) {
    /**
     * An import statement such as `import X from "y";`.
     */
    AstImportKind[AstImportKind["DefaultImport"] = 0] = "DefaultImport";
    /**
     * An import statement such as `import { X } from "y";`.
     */
    AstImportKind[AstImportKind["NamedImport"] = 1] = "NamedImport";
    /**
     * An import statement such as `import * as x from "y";`.
     */
    AstImportKind[AstImportKind["StarImport"] = 2] = "StarImport";
    /**
     * An import statement such as `import x = require("y");`.
     */
    AstImportKind[AstImportKind["EqualsImport"] = 3] = "EqualsImport";
    /**
     * An import statement such as `interface foo { foo: import("bar").a.b.c }`.
     */
    AstImportKind[AstImportKind["ImportType"] = 4] = "ImportType";
})(AstImportKind = exports.AstImportKind || (exports.AstImportKind = {}));
/**
 * For a symbol that was imported from an external package, this tracks the import
 * statement that was used to reach it.
 */
class AstImport extends AstEntity_1.AstSyntheticEntity {
    constructor(options) {
        super();
        this.importKind = options.importKind;
        this.modulePath = options.modulePath;
        this.exportName = options.exportName;
        // We start with this assumption, but it may get changed later if non-type-only import is encountered.
        this.isTypeOnlyEverywhere = options.isTypeOnly;
        this.key = AstImport.getKey(options);
    }
    /** {@inheritdoc} */
    get localName() {
        // abstract
        return this.exportName;
    }
    /**
     * Calculates the lookup key used with `AstImport.key`
     */
    static getKey(options) {
        switch (options.importKind) {
            case AstImportKind.DefaultImport:
                return `${options.modulePath}:${options.exportName}`;
            case AstImportKind.NamedImport:
                return `${options.modulePath}:${options.exportName}`;
            case AstImportKind.StarImport:
                return `${options.modulePath}:*`;
            case AstImportKind.EqualsImport:
                return `${options.modulePath}:=`;
            case AstImportKind.ImportType: {
                const subKey = !options.exportName
                    ? '*' // Equivalent to StarImport
                    : options.exportName.includes('.') // Equivalent to a named export
                        ? options.exportName.split('.')[0]
                        : options.exportName;
                return `${options.modulePath}:${subKey}`;
            }
            default:
                throw new node_core_library_1.InternalError('Unknown AstImportKind');
        }
    }
}
exports.AstImport = AstImport;
//# sourceMappingURL=AstImport.js.map