UNPKG

typescript-to-lua

Version:

A generic TypeScript to Lua transpiler. Write your code in TypeScript and publish Lua!

118 lines 6.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.transformIdentifierExpression = void 0; exports.transformIdentifier = transformIdentifier; exports.getCustomNameFromSymbol = getCustomNameFromSymbol; exports.transformIdentifierWithSymbol = transformIdentifierWithSymbol; const ts = require("typescript"); const lua = require("../../LuaAST"); const builtins_1 = require("../builtins"); const promise_1 = require("../builtins/promise"); const context_1 = require("../context"); const diagnostics_1 = require("../utils/diagnostics"); const export_1 = require("../utils/export"); const safe_names_1 = require("../utils/safe-names"); const symbols_1 = require("../utils/symbols"); const optional_chaining_1 = require("./optional-chaining"); const typescript_1 = require("../utils/typescript"); const language_extensions_1 = require("../utils/language-extensions"); const call_extension_1 = require("./language-extensions/call-extension"); const identifier_1 = require("./language-extensions/identifier"); const annotations_1 = require("../utils/annotations"); function transformIdentifier(context, identifier) { return transformNonValueIdentifier(context, identifier, context.checker.getSymbolAtLocation(identifier)); } function getCustomNameFromSymbol(context, symbol) { let retVal; if (symbol) { const declarations = symbol.getDeclarations(); if (declarations) { let customNameAnnotation = undefined; for (const declaration of declarations) { const nodeAnnotations = (0, annotations_1.getNodeAnnotations)(declaration); const foundAnnotation = nodeAnnotations.get(annotations_1.AnnotationKind.CustomName); if (foundAnnotation) { customNameAnnotation = foundAnnotation; break; } // If the symbol is an imported value, check the original declaration // beware of declaration.propertyName, this is the import name alias and should not be renamed! if (ts.isImportSpecifier(declaration) && !declaration.propertyName) { const importedType = context.checker.getTypeAtLocation(declaration); if (importedType.symbol) { const importedCustomName = getCustomNameFromSymbol(context, importedType.symbol); if (importedCustomName) { return importedCustomName; } } } } if (customNameAnnotation) { retVal = customNameAnnotation.args[0]; } } } return retVal; } function transformNonValueIdentifier(context, identifier, symbol) { if ((0, optional_chaining_1.isOptionalContinuation)(identifier)) { const result = lua.createIdentifier(identifier.text, undefined, context_1.tempSymbolId); (0, optional_chaining_1.getOptionalContinuationData)(identifier).usedIdentifiers.push(result); return result; } const extensionKind = symbol ? (0, language_extensions_1.getExtensionKindForSymbol)(context, symbol) : (0, language_extensions_1.getExtensionKindForNode)(context, identifier); if (extensionKind) { if (call_extension_1.callExtensions.has(extensionKind)) { // Avoid putting duplicate diagnostic on the name of a variable declaration, due to the inferred type if (!(ts.isVariableDeclaration(identifier.parent) && identifier.parent.name === identifier)) { context.diagnostics.push((0, diagnostics_1.invalidCallExtensionUse)(identifier)); } // fall through } else if ((0, identifier_1.isIdentifierExtensionValue)(symbol, extensionKind)) { (0, identifier_1.reportInvalidExtensionValue)(context, identifier, extensionKind); return lua.createAnonymousIdentifier(identifier); } } const type = context.checker.getTypeAtLocation(identifier); if ((0, typescript_1.isStandardLibraryType)(context, type, undefined)) { (0, builtins_1.checkForLuaLibType)(context, type); if ((0, promise_1.isPromiseClass)(context, identifier)) { return (0, promise_1.createPromiseIdentifier)(identifier); } } let text = (0, safe_names_1.hasUnsafeIdentifierName)(context, identifier, symbol) ? (0, safe_names_1.createSafeName)(identifier.text) : identifier.text; const customName = getCustomNameFromSymbol(context, symbol); if (customName) text = customName; const symbolId = (0, symbols_1.getIdentifierSymbolId)(context, identifier, symbol); return lua.createIdentifier(text, identifier, symbolId, identifier.text); } function transformIdentifierWithSymbol(context, node, symbol) { if (symbol) { const exportScope = (0, export_1.getSymbolExportScope)(context, symbol); if (exportScope) { const name = symbol.name; const text = (0, safe_names_1.hasUnsafeIdentifierName)(context, node, symbol) ? (0, safe_names_1.createSafeName)(name) : name; const symbolId = (0, symbols_1.getIdentifierSymbolId)(context, node, symbol); const identifier = lua.createIdentifier(text, node, symbolId, name); return (0, export_1.createExportedIdentifier)(context, identifier, exportScope); } } const builtinResult = (0, builtins_1.transformBuiltinIdentifierExpression)(context, node, symbol); if (builtinResult) { return builtinResult; } return transformNonValueIdentifier(context, node, symbol); } const transformIdentifierExpression = (node, context) => { if (ts.identifierToKeywordKind(node) === ts.SyntaxKind.UndefinedKeyword) { return lua.createNilLiteral(node); } const symbol = context.checker.getSymbolAtLocation(node); return transformIdentifierWithSymbol(context, node, symbol); }; exports.transformIdentifierExpression = transformIdentifierExpression; //# sourceMappingURL=identifier.js.map