Skip to content

Commit

Permalink
Fix 35060
Browse files Browse the repository at this point in the history
  • Loading branch information
jack-williams committed Nov 13, 2019
1 parent 94f8590 commit 393be5d
Show file tree
Hide file tree
Showing 7 changed files with 525 additions and 22 deletions.
21 changes: 10 additions & 11 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14531,25 +14531,24 @@ namespace ts {
* if we have found an elaboration, or we should ignore
* any other elaborations when relating the `source` and
* `target` types.
*
* @param source
* @param target
* @param reportErrors
*/
function tryElaborateArrayLikeErrors(source: Type, target: Type, reportErrors: boolean): boolean {
if (isTupleLikeType(source)) {
const sourceTuple: TupleType | undefined = (source as TupleTypeReference).target;
if (sourceTuple && sourceTuple.readonly && isArrayOrTupleLikeType(target) &&
(!isReadonlyArrayType(target) || isTupleType(target) && !target.target.readonly)) {
if (isTupleType(source)) {
// If source is a readonly tuple
// and target is an array or tuple
// and target is not a readonly array
// and target is not a readonly tuple
if (source.target?.readonly && (isTupleType(target) || isArrayType(target)) &&
!isReadonlyArrayType(target) && !(isTupleType(target) && target.target.readonly)) {
if (reportErrors) {
reportError(Diagnostics.The_type_0_is_readonly_and_cannot_be_assigned_to_the_mutable_type_1, typeToString(source), typeToString(target));
}
return false;
}
return isArrayLikeType(target);
return isTupleType(target) || isArrayType(target);
}
if (isTupleLikeType(target)) {
return isArrayLikeType(source);
if (isTupleType(target)) {
return isArrayType(source);
}
if (isReadonlyArrayType(source) && isArrayType(target) && !isReadonlyArrayType(target)) {
if (reportErrors) {
Expand Down
20 changes: 10 additions & 10 deletions tests/baselines/reference/arityAndOrderCompatibility01.errors.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,30 @@ tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(15,12): erro
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(17,5): error TS2461: Type '{ 0: string; 1: number; length: 2; }' is not an array type.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(18,5): error TS2741: Property '2' is missing in type '[string, number]' but required in type '[number, number, number]'.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(19,5): error TS2741: Property '2' is missing in type 'StrNum' but required in type '[number, number, number]'.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(20,5): error TS2740: Type '{ 0: string; 1: number; length: 2; }' is missing the following properties from type '[number, number, number]': 2, pop, push, concat, and 16 more.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(20,5): error TS2322: Type '{ 0: string; 1: number; length: 2; }' is not assignable to type '[number, number, number]'.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(21,5): error TS2741: Property '2' is missing in type '[string, number]' but required in type '[string, number, number]'.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(22,5): error TS2741: Property '2' is missing in type 'StrNum' but required in type '[string, number, number]'.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(23,5): error TS2740: Type '{ 0: string; 1: number; length: 2; }' is missing the following properties from type '[string, number, number]': 2, pop, push, concat, and 16 more.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(23,5): error TS2322: Type '{ 0: string; 1: number; length: 2; }' is not assignable to type '[string, number, number]'.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(24,5): error TS2322: Type '[string, number]' is not assignable to type '[number]'.
Types of property '0' are incompatible.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(25,5): error TS2322: Type 'StrNum' is not assignable to type '[number]'.
Types of property '0' are incompatible.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(26,5): error TS2740: Type '{ 0: string; 1: number; length: 2; }' is missing the following properties from type '[number]': pop, push, concat, join, and 15 more.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(26,5): error TS2322: Type '{ 0: string; 1: number; length: 2; }' is not assignable to type '[number]'.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(27,5): error TS2322: Type '[string, number]' is not assignable to type '[string]'.
Types of property 'length' are incompatible.
Type '2' is not assignable to type '1'.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(28,5): error TS2322: Type 'StrNum' is not assignable to type '[string]'.
Types of property 'length' are incompatible.
Type '2' is not assignable to type '1'.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(29,5): error TS2740: Type '{ 0: string; 1: number; length: 2; }' is missing the following properties from type '[string]': pop, push, concat, join, and 15 more.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(29,5): error TS2322: Type '{ 0: string; 1: number; length: 2; }' is not assignable to type '[string]'.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(30,5): error TS2322: Type '[string, number]' is not assignable to type '[number, string]'.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(31,5): error TS2322: Type 'StrNum' is not assignable to type '[number, string]'.
Types of property '0' are incompatible.
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(32,5): error TS2740: Type '{ 0: string; 1: number; length: 2; }' is missing the following properties from type '[number, string]': pop, push, concat, join, and 15 more.
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(32,5): error TS2322: Type '{ 0: string; 1: number; length: 2; }' is not assignable to type '[number, string]'.


==== tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts (17 errors) ====
Expand Down Expand Up @@ -58,7 +58,7 @@ tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(32,5): error
!!! error TS2741: Property '2' is missing in type 'StrNum' but required in type '[number, number, number]'.
var j3: [number, number, number] = z;
~~
!!! error TS2740: Type '{ 0: string; 1: number; length: 2; }' is missing the following properties from type '[number, number, number]': 2, pop, push, concat, and 16 more.
!!! error TS2322: Type '{ 0: string; 1: number; length: 2; }' is not assignable to type '[number, number, number]'.
var k1: [string, number, number] = x;
~~
!!! error TS2741: Property '2' is missing in type '[string, number]' but required in type '[string, number, number]'.
Expand All @@ -67,7 +67,7 @@ tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(32,5): error
!!! error TS2741: Property '2' is missing in type 'StrNum' but required in type '[string, number, number]'.
var k3: [string, number, number] = z;
~~
!!! error TS2740: Type '{ 0: string; 1: number; length: 2; }' is missing the following properties from type '[string, number, number]': 2, pop, push, concat, and 16 more.
!!! error TS2322: Type '{ 0: string; 1: number; length: 2; }' is not assignable to type '[string, number, number]'.
var l1: [number] = x;
~~
!!! error TS2322: Type '[string, number]' is not assignable to type '[number]'.
Expand All @@ -80,7 +80,7 @@ tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(32,5): error
!!! error TS2322: Type 'string' is not assignable to type 'number'.
var l3: [number] = z;
~~
!!! error TS2740: Type '{ 0: string; 1: number; length: 2; }' is missing the following properties from type '[number]': pop, push, concat, join, and 15 more.
!!! error TS2322: Type '{ 0: string; 1: number; length: 2; }' is not assignable to type '[number]'.
var m1: [string] = x;
~~
!!! error TS2322: Type '[string, number]' is not assignable to type '[string]'.
Expand All @@ -93,7 +93,7 @@ tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(32,5): error
!!! error TS2322: Type '2' is not assignable to type '1'.
var m3: [string] = z;
~~
!!! error TS2740: Type '{ 0: string; 1: number; length: 2; }' is missing the following properties from type '[string]': pop, push, concat, join, and 15 more.
!!! error TS2322: Type '{ 0: string; 1: number; length: 2; }' is not assignable to type '[string]'.
var n1: [number, string] = x;
~~
!!! error TS2322: Type '[string, number]' is not assignable to type '[number, string]'.
Expand All @@ -105,7 +105,7 @@ tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(32,5): error
!!! error TS2322: Type 'string' is not assignable to type 'number'.
var n3: [number, string] = z;
~~
!!! error TS2740: Type '{ 0: string; 1: number; length: 2; }' is missing the following properties from type '[number, string]': pop, push, concat, join, and 15 more.
!!! error TS2322: Type '{ 0: string; 1: number; length: 2; }' is not assignable to type '[number, string]'.
var o1: [string, number] = x;
var o2: [string, number] = y;
var o3: [string, number] = y;
Expand Down
122 changes: 121 additions & 1 deletion tests/baselines/reference/readonlyTupleAndArrayElaboration.errors.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,37 @@ tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(23,9): error TS2345: Ar
The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(24,9): error TS2345: Argument of type 'readonly number[]' is not assignable to parameter of type 'number[]'.
The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(27,7): error TS2322: Type 'readonly [1]' is not assignable to type 'readonly []'.
Types of property 'length' are incompatible.
Type '1' is not assignable to type '0'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(30,7): error TS4104: The type 'readonly [1]' is 'readonly' and cannot be assigned to the mutable type '[]'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(33,7): error TS2322: Type '[1]' is not assignable to type 'readonly []'.
Types of property 'length' are incompatible.
Type '1' is not assignable to type '0'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(36,7): error TS2322: Type '[1]' is not assignable to type '[]'.
Types of property 'length' are incompatible.
Type '1' is not assignable to type '0'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(39,7): error TS2322: Type 'readonly number[]' is not assignable to type 'readonly boolean[]'.
Type 'number' is not assignable to type 'boolean'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(42,7): error TS4104: The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'boolean[]'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(45,7): error TS2322: Type 'number[]' is not assignable to type 'readonly boolean[]'.
Type 'number' is not assignable to type 'boolean'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(48,7): error TS2322: Type 'number[]' is not assignable to type 'boolean[]'.
Type 'number' is not assignable to type 'boolean'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(51,7): error TS2322: Type 'readonly [1]' is not assignable to type 'readonly boolean[]'.
Type '1' is not assignable to type 'boolean'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(54,7): error TS4104: The type 'readonly [1]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(57,7): error TS2322: Type '[1]' is not assignable to type 'readonly boolean[]'.
Type '1' is not assignable to type 'boolean'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(60,7): error TS2322: Type '[1]' is not assignable to type 'boolean[]'.
Type '1' is not assignable to type 'boolean'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(63,7): error TS2741: Property '0' is missing in type 'readonly number[]' but required in type 'readonly [1]'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(66,7): error TS2740: Type 'readonly number[]' is missing the following properties from type '[1]': 0, pop, push, reverse, and 4 more.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(69,7): error TS2741: Property '0' is missing in type 'number[]' but required in type 'readonly [1]'.
tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(72,7): error TS2741: Property '0' is missing in type 'number[]' but required in type '[1]'.


==== tests/cases/compiler/readonlyTupleAndArrayElaboration.ts (6 errors) ====
==== tests/cases/compiler/readonlyTupleAndArrayElaboration.ts (22 errors) ====
// @strict
// #Repro from #30839

Expand Down Expand Up @@ -55,4 +83,96 @@ tests/cases/compiler/readonlyTupleAndArrayElaboration.ts(24,9): error TS2345: Ar
~
!!! error TS2345: Argument of type 'readonly number[]' is not assignable to parameter of type 'number[]'.
!!! error TS2345: The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.

const t1: readonly [1] = [1];
const t2: readonly [] = t1;
~~
!!! error TS2322: Type 'readonly [1]' is not assignable to type 'readonly []'.
!!! error TS2322: Types of property 'length' are incompatible.
!!! error TS2322: Type '1' is not assignable to type '0'.

const t3: readonly [1] = [1];
const t4: [] = t3;
~~
!!! error TS4104: The type 'readonly [1]' is 'readonly' and cannot be assigned to the mutable type '[]'.

const t5: [1] = [1];
const t6: readonly [] = t5;
~~
!!! error TS2322: Type '[1]' is not assignable to type 'readonly []'.
!!! error TS2322: Types of property 'length' are incompatible.
!!! error TS2322: Type '1' is not assignable to type '0'.

const t7: [1] = [1];
const t8: [] = t7;
~~
!!! error TS2322: Type '[1]' is not assignable to type '[]'.
!!! error TS2322: Types of property 'length' are incompatible.
!!! error TS2322: Type '1' is not assignable to type '0'.

const a1: readonly number[] = [1];
const a2: readonly boolean[] = a1;
~~
!!! error TS2322: Type 'readonly number[]' is not assignable to type 'readonly boolean[]'.
!!! error TS2322: Type 'number' is not assignable to type 'boolean'.

const a3: readonly number[] = [1];
const a4: boolean[] = a3;
~~
!!! error TS4104: The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'boolean[]'.

const a5: number[] = [1];
const a6: readonly boolean [] = a5;
~~
!!! error TS2322: Type 'number[]' is not assignable to type 'readonly boolean[]'.
!!! error TS2322: Type 'number' is not assignable to type 'boolean'.

const a7: number[] = [1];
const a8: boolean[] = a7;
~~
!!! error TS2322: Type 'number[]' is not assignable to type 'boolean[]'.
!!! error TS2322: Type 'number' is not assignable to type 'boolean'.

const ta1: readonly [1] = [1];
const ta2: readonly boolean[] = ta1;
~~~
!!! error TS2322: Type 'readonly [1]' is not assignable to type 'readonly boolean[]'.
!!! error TS2322: Type '1' is not assignable to type 'boolean'.

const ta3: readonly [1] = [1];
const ta4: number[] = ta3;
~~~
!!! error TS4104: The type 'readonly [1]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.

const ta5: [1] = [1];
const ta6: readonly boolean[] = ta5;
~~~
!!! error TS2322: Type '[1]' is not assignable to type 'readonly boolean[]'.
!!! error TS2322: Type '1' is not assignable to type 'boolean'.

const ta7: [1] = [1];
const ta8: boolean[] = ta7;
~~~
!!! error TS2322: Type '[1]' is not assignable to type 'boolean[]'.
!!! error TS2322: Type '1' is not assignable to type 'boolean'.

const at1: readonly number[] = [1];
const at2: readonly [1] = at1;
~~~
!!! error TS2741: Property '0' is missing in type 'readonly number[]' but required in type 'readonly [1]'.

const at3: readonly number[] = [1];
const at4: [1] = at3;
~~~
!!! error TS2740: Type 'readonly number[]' is missing the following properties from type '[1]': 0, pop, push, reverse, and 4 more.

const at5: number[] = [1];
const at6: readonly [1] = at5;
~~~
!!! error TS2741: Property '0' is missing in type 'number[]' but required in type 'readonly [1]'.

const at7: number[] = [1];
const at8: [1] = at7;
~~~
!!! error TS2741: Property '0' is missing in type 'number[]' but required in type '[1]'.

80 changes: 80 additions & 0 deletions tests/baselines/reference/readonlyTupleAndArrayElaboration.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,54 @@ declare const c: ReadonlyArray<number>;
arryFn2(a);
arryFn2(b);
arryFn2(c);

const t1: readonly [1] = [1];
const t2: readonly [] = t1;

const t3: readonly [1] = [1];
const t4: [] = t3;

const t5: [1] = [1];
const t6: readonly [] = t5;

const t7: [1] = [1];
const t8: [] = t7;

const a1: readonly number[] = [1];
const a2: readonly boolean[] = a1;

const a3: readonly number[] = [1];
const a4: boolean[] = a3;

const a5: number[] = [1];
const a6: readonly boolean [] = a5;

const a7: number[] = [1];
const a8: boolean[] = a7;

const ta1: readonly [1] = [1];
const ta2: readonly boolean[] = ta1;

const ta3: readonly [1] = [1];
const ta4: number[] = ta3;

const ta5: [1] = [1];
const ta6: readonly boolean[] = ta5;

const ta7: [1] = [1];
const ta8: boolean[] = ta7;

const at1: readonly number[] = [1];
const at2: readonly [1] = at1;

const at3: readonly number[] = [1];
const at4: [1] = at3;

const at5: number[] = [1];
const at6: readonly [1] = at5;

const at7: number[] = [1];
const at8: [1] = at7;


//// [readonlyTupleAndArrayElaboration.js]
Expand All @@ -39,3 +87,35 @@ arryFn2(point);
arryFn2(a);
arryFn2(b);
arryFn2(c);
var t1 = [1];
var t2 = t1;
var t3 = [1];
var t4 = t3;
var t5 = [1];
var t6 = t5;
var t7 = [1];
var t8 = t7;
var a1 = [1];
var a2 = a1;
var a3 = [1];
var a4 = a3;
var a5 = [1];
var a6 = a5;
var a7 = [1];
var a8 = a7;
var ta1 = [1];
var ta2 = ta1;
var ta3 = [1];
var ta4 = ta3;
var ta5 = [1];
var ta6 = ta5;
var ta7 = [1];
var ta8 = ta7;
var at1 = [1];
var at2 = at1;
var at3 = [1];
var at4 = at3;
var at5 = [1];
var at6 = at5;
var at7 = [1];
var at8 = at7;

0 comments on commit 393be5d

Please sign in to comment.