TS: Support readonly type expressions

This commit is contained in:
Asger F
2019-04-10 12:26:46 +01:00
parent 11f460c6a3
commit d5ae69d40a
7 changed files with 30 additions and 2 deletions

View File

@@ -66,6 +66,7 @@ public class TypeExprKinds {
private static final int optionalTypeExpr = 33;
private static final int restTypeExpr = 34;
private static final int bigintLiteralTypeExpr = 35;
private static final int readonlyTypeExpr = 36;
public static int getTypeExprKind(final INode type, final IdContext idcontext) {
Integer kind =
@@ -127,7 +128,11 @@ public class TypeExprKinds {
@Override
public Integer visit(UnaryTypeExpr nd, Void c) {
return keyofTypeExpr;
switch (nd.getKind()) {
case Keyof: return keyofTypeExpr;
case Readonly: return readonlyTypeExpr;
}
throw new CatastrophicError("Unhandled UnaryTypeExpr kind: " + nd.getKind());
}
@Override

View File

@@ -2132,6 +2132,9 @@ public class TypeScriptASTConverter {
if (operator.equals("KeyOfKeyword")) {
return new UnaryTypeExpr(loc, UnaryTypeExpr.Kind.Keyof, convertChildAsType(node, "type"));
}
if (operator.equals("ReadonlyKeyword")) {
return new UnaryTypeExpr(loc, UnaryTypeExpr.Kind.Readonly, convertChildAsType(node, "type"));
}
if (operator.equals("UniqueKeyword")) {
return new KeywordTypeExpr(loc, "unique symbol");
}

View File

@@ -970,6 +970,14 @@ class RestTypeExpr extends @resttypeexpr, TypeExpr {
TypeExpr getElementType() { result = getArrayType().(ArrayTypeExpr).getElementType() }
}
/**
* A type of form `readonly T`, such as `readonly number[]`.
*/
class ReadonlyTypeExpr extends @readonlytypeexpr, TypeExpr {
/** Gets the type `T` in `readonly T`. */
TypeExpr getElementType() { result = getChildTypeExpr(0) }
}
/**
* A possibly qualified name that refers to a variable from inside a type.
*

View File

@@ -573,6 +573,7 @@ case @typeexpr.kind of
| 33 = @optionaltypeexpr
| 34 = @resttypeexpr
| 35 = @bigintliteraltypeexpr
| 36 = @readonlytypeexpr
;
@typeref = @typeaccess | @typedecl;

View File

@@ -1,9 +1,11 @@
| (T \| ConcatArray<T>)[] | `T \| ConcatArray<T>` |
| (number \| ConcatArray<number>)[] | `number \| ConcatArray<number>` |
| (number[] \| ConcatArray<number[]>)[] | `number[] \| ConcatArray<number[]>` |
| (string \| number \| ConcatArray<string \| number>)[] | `string \| number \| ConcatArray<string \| number>` |
| (string \| number)[] | `string \| number` |
| ConcatArray<T>[] | `ConcatArray<T>` |
| ConcatArray<number>[] | `ConcatArray<number>` |
| ConcatArray<number[]>[] | `ConcatArray<number[]>` |
| ConcatArray<string \| number>[] | `ConcatArray<string \| number>` |
| S[] | `S` |
| T[] | `T` |
@@ -11,6 +13,8 @@
| [number, string] | `string \| number` |
| any[] | `any` |
| number[] | `number` |
| number[][] | `number[]` |
| readonly T[] | `T` |
| readonly number[] | `number` |
| readonly number[][] | `number[]` |
| string[] | `string` |

View File

@@ -1,9 +1,11 @@
| (T \| ConcatArray<T>)[] | T \| ConcatArray<T> |
| (number \| ConcatArray<number>)[] | number \| ConcatArray<number> |
| (number[] \| ConcatArray<number[]>)[] | number[] \| ConcatArray<number[]> |
| (string \| number \| ConcatArray<string \| number>)[] | string \| number \| ConcatArray<string \| number> |
| (string \| number)[] | string \| number |
| ConcatArray<T>[] | ConcatArray<T> |
| ConcatArray<number>[] | ConcatArray<number> |
| ConcatArray<number[]>[] | ConcatArray<number[]> |
| ConcatArray<string \| number>[] | ConcatArray<string \| number> |
| NumberIndexable | object |
| S[] | S |
@@ -12,7 +14,9 @@
| [number, string] | string \| number |
| any[] | any |
| number[] | number |
| number[][] | number[] |
| readonly T[] | T |
| readonly number[] | number |
| readonly number[][] | number[] |
| string | string |
| string[] | string |

View File

@@ -1,5 +1,5 @@
let plain: number[];
let radonly: ReadonlyArray<number>;
let readonly: ReadonlyArray<number>;
let tuple: [number, string];
interface NumberIndexable {
@@ -14,3 +14,6 @@ interface StringIndexable {
let numberIndexable: NumberIndexable;
let stringIndexable: StringIndexable;
let readonlySyntax: readonly number[];
let readonlySyntax2: readonly number[][];