Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/def/typescript.ts
Original file line number Diff line number Diff line change
Expand Up @@ -503,6 +503,12 @@ export default function (fork: Fork) {
def("ClassAccessorProperty")
.bases("Declaration", "TSHasOptionalTypeAnnotation");

def("CallExpression")
.bases("TSHasOptionalTypeParameterInstantiation");

def("NewExpression")
.bases("TSHasOptionalTypeParameterInstantiation");

// Defined already in es6 and babel-core.
def("ClassBody")
.field("body", [or(
Expand Down
3 changes: 3 additions & 0 deletions src/gen/builders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,7 @@ export interface NewExpressionBuilder {
comments?: K.CommentKind[] | null;
loc?: K.SourceLocationKind | null;
typeArguments?: null | K.TypeParameterInstantiationKind;
typeParameters?: K.TSTypeParameterInstantiationKind | null;
}
): namedTypes.NewExpression;
}
Expand All @@ -598,6 +599,7 @@ export interface CallExpressionBuilder {
loc?: K.SourceLocationKind | null;
optional?: boolean;
typeArguments?: null | K.TypeParameterInstantiationKind;
typeParameters?: K.TSTypeParameterInstantiationKind | null;
}
): namedTypes.CallExpression;
}
Expand Down Expand Up @@ -1206,6 +1208,7 @@ export interface OptionalCallExpressionBuilder {
loc?: K.SourceLocationKind | null;
optional?: boolean;
typeArguments?: null | K.TypeParameterInstantiationKind;
typeParameters?: K.TSTypeParameterInstantiationKind | null;
}
): namedTypes.OptionalCallExpression;
}
Expand Down
2 changes: 1 addition & 1 deletion src/gen/kinds.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ export type MemberExpressionKind = namedTypes.MemberExpression | namedTypes.Opti
export type UpdateExpressionKind = namedTypes.UpdateExpression;
export type LogicalExpressionKind = namedTypes.LogicalExpression;
export type ConditionalExpressionKind = namedTypes.ConditionalExpression;
export type TSHasOptionalTypeParameterInstantiationKind = namedTypes.NewExpression | namedTypes.CallExpression | namedTypes.OptionalCallExpression | namedTypes.TSExpressionWithTypeArguments | namedTypes.TSTypeReference | namedTypes.TSImportType | namedTypes.TSInstantiationExpression;
export type NewExpressionKind = namedTypes.NewExpression;
export type CallExpressionKind = namedTypes.CallExpression | namedTypes.OptionalCallExpression;
export type RestElementKind = namedTypes.RestElement;
Expand Down Expand Up @@ -126,7 +127,6 @@ export type TypeParameterInstantiationKind = namedTypes.TypeParameterInstantiati
export type TSTypeParameterInstantiationKind = namedTypes.TSTypeParameterInstantiation;
export type ClassImplementsKind = namedTypes.ClassImplements;
export type TSTypeKind = namedTypes.TSExpressionWithTypeArguments | namedTypes.TSTypeReference | namedTypes.TSAnyKeyword | namedTypes.TSBigIntKeyword | namedTypes.TSBooleanKeyword | namedTypes.TSNeverKeyword | namedTypes.TSNullKeyword | namedTypes.TSNumberKeyword | namedTypes.TSObjectKeyword | namedTypes.TSStringKeyword | namedTypes.TSSymbolKeyword | namedTypes.TSUndefinedKeyword | namedTypes.TSUnknownKeyword | namedTypes.TSVoidKeyword | namedTypes.TSIntrinsicKeyword | namedTypes.TSThisType | namedTypes.TSArrayType | namedTypes.TSLiteralType | namedTypes.TSUnionType | namedTypes.TSIntersectionType | namedTypes.TSConditionalType | namedTypes.TSInferType | namedTypes.TSParenthesizedType | namedTypes.TSFunctionType | namedTypes.TSConstructorType | namedTypes.TSMappedType | namedTypes.TSTupleType | namedTypes.TSNamedTupleMember | namedTypes.TSRestType | namedTypes.TSOptionalType | namedTypes.TSIndexedAccessType | namedTypes.TSTypeOperator | namedTypes.TSTypePredicate | namedTypes.TSTypeQuery | namedTypes.TSImportType | namedTypes.TSTypeLiteral;
export type TSHasOptionalTypeParameterInstantiationKind = namedTypes.TSExpressionWithTypeArguments | namedTypes.TSTypeReference | namedTypes.TSImportType | namedTypes.TSInstantiationExpression;
export type TSExpressionWithTypeArgumentsKind = namedTypes.TSExpressionWithTypeArguments;
export type FlowKind = namedTypes.AnyTypeAnnotation | namedTypes.EmptyTypeAnnotation | namedTypes.MixedTypeAnnotation | namedTypes.VoidTypeAnnotation | namedTypes.SymbolTypeAnnotation | namedTypes.NumberTypeAnnotation | namedTypes.BigIntTypeAnnotation | namedTypes.NumberLiteralTypeAnnotation | namedTypes.NumericLiteralTypeAnnotation | namedTypes.BigIntLiteralTypeAnnotation | namedTypes.StringTypeAnnotation | namedTypes.StringLiteralTypeAnnotation | namedTypes.BooleanTypeAnnotation | namedTypes.BooleanLiteralTypeAnnotation | namedTypes.NullableTypeAnnotation | namedTypes.NullLiteralTypeAnnotation | namedTypes.NullTypeAnnotation | namedTypes.ThisTypeAnnotation | namedTypes.ExistsTypeAnnotation | namedTypes.ExistentialTypeParam | namedTypes.FunctionTypeAnnotation | namedTypes.ArrayTypeAnnotation | namedTypes.ObjectTypeAnnotation | namedTypes.GenericTypeAnnotation | namedTypes.MemberTypeAnnotation | namedTypes.IndexedAccessType | namedTypes.OptionalIndexedAccessType | namedTypes.UnionTypeAnnotation | namedTypes.IntersectionTypeAnnotation | namedTypes.TypeofTypeAnnotation | namedTypes.TypeParameter | namedTypes.InterfaceTypeAnnotation | namedTypes.TupleTypeAnnotation | namedTypes.InferredPredicate | namedTypes.DeclaredPredicate;
export type FlowTypeKind = namedTypes.AnyTypeAnnotation | namedTypes.EmptyTypeAnnotation | namedTypes.MixedTypeAnnotation | namedTypes.VoidTypeAnnotation | namedTypes.SymbolTypeAnnotation | namedTypes.NumberTypeAnnotation | namedTypes.BigIntTypeAnnotation | namedTypes.NumberLiteralTypeAnnotation | namedTypes.NumericLiteralTypeAnnotation | namedTypes.BigIntLiteralTypeAnnotation | namedTypes.StringTypeAnnotation | namedTypes.StringLiteralTypeAnnotation | namedTypes.BooleanTypeAnnotation | namedTypes.BooleanLiteralTypeAnnotation | namedTypes.NullableTypeAnnotation | namedTypes.NullLiteralTypeAnnotation | namedTypes.NullTypeAnnotation | namedTypes.ThisTypeAnnotation | namedTypes.ExistsTypeAnnotation | namedTypes.ExistentialTypeParam | namedTypes.FunctionTypeAnnotation | namedTypes.ArrayTypeAnnotation | namedTypes.ObjectTypeAnnotation | namedTypes.GenericTypeAnnotation | namedTypes.MemberTypeAnnotation | namedTypes.IndexedAccessType | namedTypes.OptionalIndexedAccessType | namedTypes.UnionTypeAnnotation | namedTypes.IntersectionTypeAnnotation | namedTypes.TypeofTypeAnnotation | namedTypes.TypeParameter | namedTypes.InterfaceTypeAnnotation | namedTypes.TupleTypeAnnotation;
Expand Down
16 changes: 8 additions & 8 deletions src/gen/namedTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -293,14 +293,18 @@ export namespace namedTypes {
alternate: K.ExpressionKind;
}

export interface NewExpression extends Omit<Expression, "type"> {
export interface TSHasOptionalTypeParameterInstantiation {
typeParameters?: K.TSTypeParameterInstantiationKind | null;
}

export interface NewExpression extends Omit<Expression, "type">, TSHasOptionalTypeParameterInstantiation {
type: "NewExpression";
callee: K.ExpressionKind;
arguments: (K.ExpressionKind | K.SpreadElementKind)[];
typeArguments?: null | K.TypeParameterInstantiationKind;
}

export interface CallExpression extends Omit<Expression, "type">, Omit<ChainElement, "type"> {
export interface CallExpression extends Omit<Expression, "type">, Omit<ChainElement, "type">, TSHasOptionalTypeParameterInstantiation {
type: "CallExpression";
callee: K.ExpressionKind;
arguments: (K.ExpressionKind | K.SpreadElementKind)[];
Expand Down Expand Up @@ -751,10 +755,6 @@ export namespace namedTypes {

export interface TSType extends Node {}

export interface TSHasOptionalTypeParameterInstantiation {
typeParameters?: K.TSTypeParameterInstantiationKind | null;
}

export interface TSExpressionWithTypeArguments extends Omit<TSType, "type">, TSHasOptionalTypeParameterInstantiation {
type: "TSExpressionWithTypeArguments";
expression: K.IdentifierKind | K.TSQualifiedNameKind;
Expand Down Expand Up @@ -1773,6 +1773,7 @@ export namespace namedTypes {
export let UpdateExpression: Type<UpdateExpression>;
export let LogicalExpression: Type<LogicalExpression>;
export let ConditionalExpression: Type<ConditionalExpression>;
export let TSHasOptionalTypeParameterInstantiation: Type<TSHasOptionalTypeParameterInstantiation>;
export let NewExpression: Type<NewExpression>;
export let CallExpression: Type<CallExpression>;
export let RestElement: Type<RestElement>;
Expand Down Expand Up @@ -1849,7 +1850,6 @@ export namespace namedTypes {
export let TSTypeParameterInstantiation: Type<TSTypeParameterInstantiation>;
export let ClassImplements: Type<ClassImplements>;
export let TSType: Type<TSType>;
export let TSHasOptionalTypeParameterInstantiation: Type<TSHasOptionalTypeParameterInstantiation>;
export let TSExpressionWithTypeArguments: Type<TSExpressionWithTypeArguments>;
export let Flow: Type<Flow>;
export let FlowType: Type<FlowType>;
Expand Down Expand Up @@ -2068,6 +2068,7 @@ export interface NamedTypes {
UpdateExpression: Type<namedTypes.UpdateExpression>;
LogicalExpression: Type<namedTypes.LogicalExpression>;
ConditionalExpression: Type<namedTypes.ConditionalExpression>;
TSHasOptionalTypeParameterInstantiation: Type<namedTypes.TSHasOptionalTypeParameterInstantiation>;
NewExpression: Type<namedTypes.NewExpression>;
CallExpression: Type<namedTypes.CallExpression>;
RestElement: Type<namedTypes.RestElement>;
Expand Down Expand Up @@ -2144,7 +2145,6 @@ export interface NamedTypes {
TSTypeParameterInstantiation: Type<namedTypes.TSTypeParameterInstantiation>;
ClassImplements: Type<namedTypes.ClassImplements>;
TSType: Type<namedTypes.TSType>;
TSHasOptionalTypeParameterInstantiation: Type<namedTypes.TSHasOptionalTypeParameterInstantiation>;
TSExpressionWithTypeArguments: Type<namedTypes.TSExpressionWithTypeArguments>;
Flow: Type<namedTypes.Flow>;
FlowType: Type<namedTypes.FlowType>;
Expand Down
8 changes: 4 additions & 4 deletions src/gen/visitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ export interface Visitor<M = {}> {
visitUpdateExpression?(this: Context & M, path: NodePath<namedTypes.UpdateExpression>): any;
visitLogicalExpression?(this: Context & M, path: NodePath<namedTypes.LogicalExpression>): any;
visitConditionalExpression?(this: Context & M, path: NodePath<namedTypes.ConditionalExpression>): any;
visitTSHasOptionalTypeParameterInstantiation?(
this: Context & M,
path: NodePath<namedTypes.TSHasOptionalTypeParameterInstantiation>
): any;
visitNewExpression?(this: Context & M, path: NodePath<namedTypes.NewExpression>): any;
visitCallExpression?(this: Context & M, path: NodePath<namedTypes.CallExpression>): any;
visitRestElement?(this: Context & M, path: NodePath<namedTypes.RestElement>): any;
Expand Down Expand Up @@ -130,10 +134,6 @@ export interface Visitor<M = {}> {
visitTSTypeParameterInstantiation?(this: Context & M, path: NodePath<namedTypes.TSTypeParameterInstantiation>): any;
visitClassImplements?(this: Context & M, path: NodePath<namedTypes.ClassImplements>): any;
visitTSType?(this: Context & M, path: NodePath<namedTypes.TSType>): any;
visitTSHasOptionalTypeParameterInstantiation?(
this: Context & M,
path: NodePath<namedTypes.TSHasOptionalTypeParameterInstantiation>
): any;
visitTSExpressionWithTypeArguments?(
this: Context & M,
path: NodePath<namedTypes.TSExpressionWithTypeArguments>
Expand Down
67 changes: 67 additions & 0 deletions src/test/typescript.ts
Original file line number Diff line number Diff line change
Expand Up @@ -407,5 +407,72 @@ glob("**/*.ts", {
}
});
});

it("issue #343: CallExpression with type parameters", function () {
const program = babelParse("fn<FetchResult>();", {
plugins: ["typescript"]
});

const identifiers: string[] = [];

assertVisited(program, {
visitIdentifier(path) {
identifiers.push(path.node.name);
this.traverse(path);
}
});

assert.deepEqual(identifiers, ["FetchResult", "fn"]);
});

it("NewExpression with type parameters", function () {
const program = babelParse("new Container<Item>();", {
plugins: ["typescript"]
});

const identifiers: string[] = [];

assertVisited(program, {
visitIdentifier(path) {
identifiers.push(path.node.name);
this.traverse(path);
}
});

assert.deepEqual(identifiers, ["Item", "Container"]);
});

it("OptionalCallExpression with type parameters", function () {
const program = babelParse("obj?.method<Result>();", {
plugins: ["typescript"]
});

const identifiers: string[] = [];

assertVisited(program, {
visitIdentifier(path) {
identifiers.push(path.node.name);
this.traverse(path);
}
});

assert.deepEqual(identifiers, ["Result", "obj", "method"]);
});

it("Complex nested type parameters in CallExpression", function () {
const program = babelParse("func<Array<Map<string, User>>>(data);", {
plugins: ["typescript"]
});

const identifiers: string[] = [];
assertVisited(program, {
visitIdentifier(path) {
identifiers.push(path.node.name);
this.traverse(path);
}
});

assert.deepEqual(identifiers, [ "User", "Map", "Array", "func", "data"]);
});
});
});