From f149692a4bb1640f48650cd8980f16fa26bd77e6 Mon Sep 17 00:00:00 2001 From: hazzard993 Date: Mon, 4 Jan 2021 20:21:55 +1000 Subject: [PATCH] Allow numeric access to MultiReturn --- src/transformation/utils/diagnostics.ts | 4 +++ src/transformation/visitors/access.ts | 21 ++++++++++++- .../__snapshots__/multi.spec.ts.snap | 31 +++++++++++++++++++ test/unit/language-extensions/multi.spec.ts | 20 ++++++++++++ 4 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/transformation/utils/diagnostics.ts b/src/transformation/utils/diagnostics.ts index 8f69eadd9..d7b7b6467 100644 --- a/src/transformation/utils/diagnostics.ts +++ b/src/transformation/utils/diagnostics.ts @@ -164,6 +164,10 @@ export const invalidMultiTypeArrayLiteralElementInitializer = createErrorDiagnos "This array literal pattern cannot have initializers." ); +export const invalidMultiReturnAccess = createErrorDiagnosticFactory( + "The MultiReturn type can only be accessed via an element access expression of a numeric type." +); + export const unsupportedMultiFunctionAssignment = createErrorDiagnosticFactory( "Omitted expressions and BindingElements are expected here." ); diff --git a/src/transformation/visitors/access.ts b/src/transformation/visitors/access.ts index eaa5591b7..6cf61a62c 100644 --- a/src/transformation/visitors/access.ts +++ b/src/transformation/visitors/access.ts @@ -3,10 +3,12 @@ import * as lua from "../../LuaAST"; import { transformBuiltinPropertyAccessExpression } from "../builtins"; import { FunctionVisitor, TransformationContext } from "../context"; import { AnnotationKind, getTypeAnnotations } from "../utils/annotations"; +import { invalidMultiReturnAccess } from "../utils/diagnostics"; import { addToNumericExpression } from "../utils/lua-ast"; import { LuaLibFeature, transformLuaLibFunction } from "../utils/lualib"; import { isArrayType, isNumberType, isStringType } from "../utils/typescript"; import { tryGetConstEnumValue } from "./enum"; +import { returnsMultiType } from "./language-extensions/multi"; import { transformLuaTablePropertyAccessExpression, validateLuaTableElementAccessExpression } from "./lua-table"; export function transformElementAccessArgument( @@ -41,7 +43,20 @@ export const transformElementAccessExpression: FunctionVisitor = ( @@ -63,6 +78,10 @@ export const transformPropertyAccessExpression: FunctionVisitor { .setOptions(multiProjectOptions) .expectToEqual(1); }); + +test.each(["0", "i"])("allow MultiReturn numeric access", expression => { + util.testFunction` + ${multiFunction} + const i = 0; + return multi(1)[${expression}]; + ` + .setOptions(multiProjectOptions) + .expectToEqual(1); +}); + +test.each(["multi()['forEach']", "multi().forEach"])("disallow MultiReturn non-numeric access", expression => { + util.testFunction` + ${multiFunction} + return ${expression}; + ` + .setOptions(multiProjectOptions) + .expectDiagnosticsToMatchSnapshot([invalidMultiReturnAccess.code]); +});