From 80c9e934434284eeeabf4e2515946cc183d6931e Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Tue, 19 Sep 2023 10:35:00 -0700 Subject: [PATCH 1/5] Some tuple names --- src/compiler/checker.ts | 17 ++++++++++------- .../argumentsReferenceInFunction1_Js.errors.txt | 4 ++-- .../restTuplesFromContextualTypes.types | 4 ++-- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index fae333d4a824c..be7d5fbbe203c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -19362,7 +19362,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return instantiateMappedType(mappedType, prependTypeMapping(typeVariable, singleton, mapper)); }); const newReadonly = getModifiedReadonlyState(tupleType.target.readonly, getMappedTypeModifiers(mappedType)); - return createTupleType(elementTypes, map(elementTypes, _ => ElementFlags.Variadic), newReadonly); + return createTupleType(elementTypes, map(elementTypes, _ => ElementFlags.Variadic), newReadonly); // TODO(jakebailey): names? } function instantiateMappedArrayType(arrayType: Type, mappedType: MappedType, mapper: TypeMapper) { @@ -30635,9 +30635,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } popContextualType(); if (inDestructuringPattern) { + // TODO(jakebailey): names? return createTupleType(elementTypes, elementFlags); } if (forceTuple || inConstContext || inTupleContext) { + // TODO(jakebailey): names? return createArrayLiteralType(createTupleType(elementTypes, elementFlags, /*readonly*/ inConstContext && !(contextualType && someType(contextualType, isMutableArrayLikeType)))); } return createArrayLiteralType(createArrayType( @@ -33235,6 +33237,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (arg.kind === SyntaxKind.SyntheticExpression && (arg as SyntheticExpression).tupleNameSource) { names.push((arg as SyntheticExpression).tupleNameSource!); } + // else { + // names.push(undefined); + // } + // TODO(jakebailey): names? need test } return createTupleType(types, flags, inConstContext && !someType(restType, isMutableArrayLikeType), length(names) === length(types) ? names : undefined); } @@ -35571,12 +35577,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { types.push(restType); flags.push(ElementFlags.Variadic); } - const name = getNameableDeclarationAtPosition(source, i); - if (name) { - names.push(name); - } + names.push(getNameableDeclarationAtPosition(source, i)); } - return createTupleType(types, flags, readonly, length(names) === length(types) ? names : undefined); + return createTupleType(types, flags, readonly, names); } // Return the number of parameters in a signature. The rest parameter, if present, counts as one @@ -38220,7 +38223,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } } } - return createTupleType(elementTypes, elementFlags, type.target.readonly); + return createTupleType(elementTypes, elementFlags, type.target.readonly); // TODO(jakebailey): names? } function widenTypeInferredFromInitializer(declaration: HasExpressionInitializer, type: Type) { diff --git a/tests/baselines/reference/argumentsReferenceInFunction1_Js.errors.txt b/tests/baselines/reference/argumentsReferenceInFunction1_Js.errors.txt index 507a3f5639249..9d55aafa33e31 100644 --- a/tests/baselines/reference/argumentsReferenceInFunction1_Js.errors.txt +++ b/tests/baselines/reference/argumentsReferenceInFunction1_Js.errors.txt @@ -1,5 +1,5 @@ index.js(1,25): error TS7006: Parameter 'f' implicitly has an 'any' type. -index.js(13,29): error TS2345: Argument of type 'IArguments' is not assignable to parameter of type '[any?, ...any[]]'. +index.js(13,29): error TS2345: Argument of type 'IArguments' is not assignable to parameter of type '[f?: any, ...any[]]'. ==== index.js (2 errors) ==== @@ -19,6 +19,6 @@ index.js(13,29): error TS2345: Argument of type 'IArguments' is not assignable t const debuglog = function() { return format.apply(null, arguments); ~~~~~~~~~ -!!! error TS2345: Argument of type 'IArguments' is not assignable to parameter of type '[any?, ...any[]]'. +!!! error TS2345: Argument of type 'IArguments' is not assignable to parameter of type '[f?: any, ...any[]]'. }; \ No newline at end of file diff --git a/tests/baselines/reference/restTuplesFromContextualTypes.types b/tests/baselines/reference/restTuplesFromContextualTypes.types index d80a1124a0f1c..a9de22bade988 100644 --- a/tests/baselines/reference/restTuplesFromContextualTypes.types +++ b/tests/baselines/reference/restTuplesFromContextualTypes.types @@ -265,8 +265,8 @@ f3((a, b, c) => {}) f3((...x) => {}) >f3((...x) => {}) : void >f3 : (cb: (x: number, args_0: boolean, ...args_1: string[]) => void) => void ->(...x) => {} : (x_0: number, x_1: boolean, ...x_2: string[]) => void ->x : [number, boolean, ...string[]] +>(...x) => {} : (x: number, x_1: boolean, ...x_2: string[]) => void +>x : [x: number, boolean, ...string[]] f3((a, ...x) => {}) >f3((a, ...x) => {}) : void From 6204d95187b47dda4d1fba441ff1831a1a0898c0 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Tue, 19 Sep 2023 10:39:37 -0700 Subject: [PATCH 2/5] Remove todos from bindings, which aren't yet supported --- src/compiler/checker.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index be7d5fbbe203c..96335497a496e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -30635,11 +30635,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } popContextualType(); if (inDestructuringPattern) { - // TODO(jakebailey): names? return createTupleType(elementTypes, elementFlags); } if (forceTuple || inConstContext || inTupleContext) { - // TODO(jakebailey): names? return createArrayLiteralType(createTupleType(elementTypes, elementFlags, /*readonly*/ inConstContext && !(contextualType && someType(contextualType, isMutableArrayLikeType)))); } return createArrayLiteralType(createArrayType( @@ -38223,7 +38221,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } } } - return createTupleType(elementTypes, elementFlags, type.target.readonly); // TODO(jakebailey): names? + return createTupleType(elementTypes, elementFlags, type.target.readonly); } function widenTypeInferredFromInitializer(declaration: HasExpressionInitializer, type: Type) { From 70afd0933708c3ae6c310bcae6de029df03ee737 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Tue, 19 Sep 2023 12:21:28 -0700 Subject: [PATCH 3/5] Add test --- .../reference/partiallyNamedTuples3.js | 17 +++++++++++++++++ .../reference/partiallyNamedTuples3.symbols | 12 ++++++++++++ .../reference/partiallyNamedTuples3.types | 16 ++++++++++++++++ .../types/tuple/named/partiallyNamedTuples3.ts | 6 ++++++ 4 files changed, 51 insertions(+) create mode 100644 tests/baselines/reference/partiallyNamedTuples3.js create mode 100644 tests/baselines/reference/partiallyNamedTuples3.symbols create mode 100644 tests/baselines/reference/partiallyNamedTuples3.types create mode 100644 tests/cases/conformance/types/tuple/named/partiallyNamedTuples3.ts diff --git a/tests/baselines/reference/partiallyNamedTuples3.js b/tests/baselines/reference/partiallyNamedTuples3.js new file mode 100644 index 0000000000000..36d639391a5de --- /dev/null +++ b/tests/baselines/reference/partiallyNamedTuples3.js @@ -0,0 +1,17 @@ +//// [tests/cases/conformance/types/tuple/named/partiallyNamedTuples3.ts] //// + +//// [partiallyNamedTuples3.ts] +declare const tuple: [number, name: string, boolean, value: number, string]; + +const output = ((...args) => args)(...tuple); + + +//// [partiallyNamedTuples3.js] +"use strict"; +var output = (function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return args; +}).apply(void 0, tuple); diff --git a/tests/baselines/reference/partiallyNamedTuples3.symbols b/tests/baselines/reference/partiallyNamedTuples3.symbols new file mode 100644 index 0000000000000..9a73d914ddc94 --- /dev/null +++ b/tests/baselines/reference/partiallyNamedTuples3.symbols @@ -0,0 +1,12 @@ +//// [tests/cases/conformance/types/tuple/named/partiallyNamedTuples3.ts] //// + +=== partiallyNamedTuples3.ts === +declare const tuple: [number, name: string, boolean, value: number, string]; +>tuple : Symbol(tuple, Decl(partiallyNamedTuples3.ts, 0, 13)) + +const output = ((...args) => args)(...tuple); +>output : Symbol(output, Decl(partiallyNamedTuples3.ts, 2, 5)) +>args : Symbol(args, Decl(partiallyNamedTuples3.ts, 2, 17)) +>args : Symbol(args, Decl(partiallyNamedTuples3.ts, 2, 17)) +>tuple : Symbol(tuple, Decl(partiallyNamedTuples3.ts, 0, 13)) + diff --git a/tests/baselines/reference/partiallyNamedTuples3.types b/tests/baselines/reference/partiallyNamedTuples3.types new file mode 100644 index 0000000000000..4b9732ea4ccbd --- /dev/null +++ b/tests/baselines/reference/partiallyNamedTuples3.types @@ -0,0 +1,16 @@ +//// [tests/cases/conformance/types/tuple/named/partiallyNamedTuples3.ts] //// + +=== partiallyNamedTuples3.ts === +declare const tuple: [number, name: string, boolean, value: number, string]; +>tuple : [number, name: string, boolean, value: number, string] + +const output = ((...args) => args)(...tuple); +>output : [number, string, boolean, number, string] +>((...args) => args)(...tuple) : [number, string, boolean, number, string] +>((...args) => args) : (args_0: number, args_1: string, args_2: boolean, args_3: number, args_4: string) => [number, string, boolean, number, string] +>(...args) => args : (args_0: number, args_1: string, args_2: boolean, args_3: number, args_4: string) => [number, string, boolean, number, string] +>args : [number, string, boolean, number, string] +>args : [number, string, boolean, number, string] +>...tuple : string | number | boolean +>tuple : [number, name: string, boolean, value: number, string] + diff --git a/tests/cases/conformance/types/tuple/named/partiallyNamedTuples3.ts b/tests/cases/conformance/types/tuple/named/partiallyNamedTuples3.ts new file mode 100644 index 0000000000000..14ac6b03a7dfc --- /dev/null +++ b/tests/cases/conformance/types/tuple/named/partiallyNamedTuples3.ts @@ -0,0 +1,6 @@ +// @strict: true +// @lib: esnext + +declare const tuple: [number, name: string, boolean, value: number, string]; + +const output = ((...args) => args)(...tuple); From d18e8b4986db9be0866effe4234c24f1206a4dcb Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Tue, 19 Sep 2023 12:22:01 -0700 Subject: [PATCH 4/5] Fix IIFE example --- src/compiler/checker.ts | 9 ++++----- .../baselines/reference/partiallyNamedTuples3.types | 12 ++++++------ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 96335497a496e..fea5a798a0e0e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -33235,12 +33235,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (arg.kind === SyntaxKind.SyntheticExpression && (arg as SyntheticExpression).tupleNameSource) { names.push((arg as SyntheticExpression).tupleNameSource!); } - // else { - // names.push(undefined); - // } - // TODO(jakebailey): names? need test + else { + names.push(undefined); + } } - return createTupleType(types, flags, inConstContext && !someType(restType, isMutableArrayLikeType), length(names) === length(types) ? names : undefined); + return createTupleType(types, flags, inConstContext && !someType(restType, isMutableArrayLikeType), names); } function checkTypeArguments(signature: Signature, typeArgumentNodes: readonly TypeNode[], reportErrors: boolean, headMessage?: DiagnosticMessage): Type[] | undefined { diff --git a/tests/baselines/reference/partiallyNamedTuples3.types b/tests/baselines/reference/partiallyNamedTuples3.types index 4b9732ea4ccbd..91da7e460d788 100644 --- a/tests/baselines/reference/partiallyNamedTuples3.types +++ b/tests/baselines/reference/partiallyNamedTuples3.types @@ -5,12 +5,12 @@ declare const tuple: [number, name: string, boolean, value: number, string]; >tuple : [number, name: string, boolean, value: number, string] const output = ((...args) => args)(...tuple); ->output : [number, string, boolean, number, string] ->((...args) => args)(...tuple) : [number, string, boolean, number, string] ->((...args) => args) : (args_0: number, args_1: string, args_2: boolean, args_3: number, args_4: string) => [number, string, boolean, number, string] ->(...args) => args : (args_0: number, args_1: string, args_2: boolean, args_3: number, args_4: string) => [number, string, boolean, number, string] ->args : [number, string, boolean, number, string] ->args : [number, string, boolean, number, string] +>output : [number, name: string, boolean, value: number, string] +>((...args) => args)(...tuple) : [number, name: string, boolean, value: number, string] +>((...args) => args) : (args_0: number, name: string, args_2: boolean, value: number, args_4: string) => [number, name: string, boolean, value: number, string] +>(...args) => args : (args_0: number, name: string, args_2: boolean, value: number, args_4: string) => [number, name: string, boolean, value: number, string] +>args : [number, name: string, boolean, value: number, string] +>args : [number, name: string, boolean, value: number, string] >...tuple : string | number | boolean >tuple : [number, name: string, boolean, value: number, string] From bfc9ebfb3d4661c169ddbd1275fa63607a765107 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Tue, 19 Sep 2023 13:31:22 -0700 Subject: [PATCH 5/5] Remove another TODO --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index fea5a798a0e0e..f1fde64dd3bec 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -19362,7 +19362,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return instantiateMappedType(mappedType, prependTypeMapping(typeVariable, singleton, mapper)); }); const newReadonly = getModifiedReadonlyState(tupleType.target.readonly, getMappedTypeModifiers(mappedType)); - return createTupleType(elementTypes, map(elementTypes, _ => ElementFlags.Variadic), newReadonly); // TODO(jakebailey): names? + return createTupleType(elementTypes, map(elementTypes, _ => ElementFlags.Variadic), newReadonly); } function instantiateMappedArrayType(arrayType: Type, mappedType: MappedType, mapper: TypeMapper) {