fix(es/parser): Fix bugs (#1405)

swc_ecma_parser:
 - Parse generics in class methods with special name properly.
This commit is contained in:
강동윤 2021-02-17 01:47:00 +09:00 committed by GitHub
parent a53186c842
commit 5ad57b02f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 1370 additions and 2 deletions

View File

@ -7,7 +7,7 @@ include = ["Cargo.toml", "src/**/*.rs", "examples/**/*.rs"]
license = "Apache-2.0/MIT"
name = "swc_ecma_parser"
repository = "https://github.com/swc-project/swc.git"
version = "0.47.1"
version = "0.47.2"
[features]
default = []

View File

@ -297,6 +297,8 @@ impl<'a, I: Tokens> Parser<I> {
}
fn parse_class_member(&mut self) -> PResult<ClassMember> {
trace_cur!(self, parse_class_member);
let start = cur_pos!(self);
let decorators = self.parse_decorators(false)?;
let declare = self.syntax().typescript() && eat!(self, "declare");
@ -476,6 +478,7 @@ impl<'a, I: Tokens> Parser<I> {
);
}
trace_cur!(self, parse_class_member_with_is_static__normal_class_member);
let mut key = self.parse_class_prop_name()?;
let is_optional = self.input.syntax().typescript() && eat!(self, '?');
@ -496,6 +499,8 @@ impl<'a, I: Tokens> Parser<I> {
if self.is_class_method()? {
// handle a(){} / get(){} / set(){} / async(){}
trace_cur!(self, parse_class_member_with_is_static__normal_class_method);
if readonly {
syntax_error!(self, span!(self, start), SyntaxError::ReadOnlyMethod);
}
@ -819,7 +824,9 @@ impl<'a, I: Tokens> Parser<I> {
}
fn is_class_method(&mut self) -> PResult<bool> {
Ok(is!(self, '(') || (self.input.syntax().typescript() && is!(self, '<')))
Ok(is!(self, '(')
|| (self.input.syntax().typescript() && is!(self, '<'))
|| (self.input.syntax().typescript() && is!(self, JSXTagStart)))
}
fn is_class_property(&mut self) -> PResult<bool> {
@ -912,6 +919,8 @@ impl<'a, I: Tokens> Parser<I> {
where
F: FnOnce(&mut Self) -> PResult<Vec<Param>>,
{
trace_cur!(self, parse_fn_args_body);
// let prev_in_generator = self.ctx().in_generator;
let ctx = Context {
in_async: is_async,
@ -922,6 +931,7 @@ impl<'a, I: Tokens> Parser<I> {
self.with_ctx(ctx).parse_with(|p| {
let type_params = if p.syntax().typescript() && is_one_of!(p, '<', JSXTagStart) {
//
trace_cur!(p, parse_fn_args_body__type_params);
Some(p.parse_ts_type_params()?)
} else {
None
@ -1033,6 +1043,8 @@ impl<'a, I: Tokens> Parser<I> {
where
F: FnOnce(&mut Self) -> PResult<Vec<Param>>,
{
trace_cur!(self, make_method);
let is_static = static_token.is_some();
let ctx = Context {
span_of_fn_name: Some(key.span()),

View File

@ -0,0 +1,5 @@
function foo<P extends RouteParams = RP, S extends State = RS>(
name: string,
path: string,
...middleware: RouterMiddleware<P, S>[]
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)>; { }

View File

@ -0,0 +1,653 @@
{
"type": "Script",
"span": {
"start": 0,
"end": 216,
"ctxt": 0
},
"body": [
{
"type": "FunctionDeclaration",
"identifier": {
"type": "Identifier",
"span": {
"start": 9,
"end": 12,
"ctxt": 0
},
"value": "foo",
"typeAnnotation": null,
"optional": false
},
"declare": false,
"params": [
{
"type": "Parameter",
"span": {
"start": 68,
"end": 80,
"ctxt": 0
},
"decorators": [],
"pat": {
"type": "Identifier",
"span": {
"start": 68,
"end": 80,
"ctxt": 0
},
"value": "name",
"typeAnnotation": {
"type": "TsTypeAnnotation",
"span": {
"start": 72,
"end": 80,
"ctxt": 0
},
"typeAnnotation": {
"type": "TsKeywordType",
"span": {
"start": 74,
"end": 80,
"ctxt": 0
},
"kind": "string"
}
},
"optional": false
}
},
{
"type": "Parameter",
"span": {
"start": 86,
"end": 98,
"ctxt": 0
},
"decorators": [],
"pat": {
"type": "Identifier",
"span": {
"start": 86,
"end": 98,
"ctxt": 0
},
"value": "path",
"typeAnnotation": {
"type": "TsTypeAnnotation",
"span": {
"start": 90,
"end": 98,
"ctxt": 0
},
"typeAnnotation": {
"type": "TsKeywordType",
"span": {
"start": 92,
"end": 98,
"ctxt": 0
},
"kind": "string"
}
},
"optional": false
}
},
{
"type": "Parameter",
"span": {
"start": 104,
"end": 143,
"ctxt": 0
},
"decorators": [],
"pat": {
"type": "RestElement",
"span": {
"start": 104,
"end": 143,
"ctxt": 0
},
"rest": {
"start": 104,
"end": 107,
"ctxt": 0
},
"argument": {
"type": "Identifier",
"span": {
"start": 107,
"end": 117,
"ctxt": 0
},
"value": "middleware",
"typeAnnotation": null,
"optional": false
},
"typeAnnotation": {
"type": "TsTypeAnnotation",
"span": {
"start": 117,
"end": 143,
"ctxt": 0
},
"typeAnnotation": {
"type": "TsArrayType",
"span": {
"start": 119,
"end": 143,
"ctxt": 0
},
"elemType": {
"type": "TsTypeReference",
"span": {
"start": 119,
"end": 141,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 119,
"end": 135,
"ctxt": 0
},
"value": "RouterMiddleware",
"typeAnnotation": null,
"optional": false
},
"typeParams": {
"type": "TsTypeParameterInstantiation",
"span": {
"start": 135,
"end": 141,
"ctxt": 0
},
"params": [
{
"type": "TsTypeReference",
"span": {
"start": 136,
"end": 137,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 136,
"end": 137,
"ctxt": 0
},
"value": "P",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
{
"type": "TsTypeReference",
"span": {
"start": 139,
"end": 140,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 139,
"end": 140,
"ctxt": 0
},
"value": "S",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
}
]
}
}
}
}
}
}
],
"decorators": [],
"span": {
"start": 0,
"end": 212,
"ctxt": 0
},
"body": null,
"generator": false,
"async": false,
"typeParameters": {
"type": "TsTypeParameterDeclaration",
"span": {
"start": 12,
"end": 62,
"ctxt": 0
},
"parameters": [
{
"type": "TsTypeParameter",
"span": {
"start": 13,
"end": 39,
"ctxt": 0
},
"name": {
"type": "Identifier",
"span": {
"start": 13,
"end": 14,
"ctxt": 0
},
"value": "P",
"typeAnnotation": null,
"optional": false
},
"constraint": {
"type": "TsTypeReference",
"span": {
"start": 23,
"end": 34,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 23,
"end": 34,
"ctxt": 0
},
"value": "RouteParams",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"default": {
"type": "TsTypeReference",
"span": {
"start": 37,
"end": 39,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 37,
"end": 39,
"ctxt": 0
},
"value": "RP",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
}
},
{
"type": "TsTypeParameter",
"span": {
"start": 41,
"end": 61,
"ctxt": 0
},
"name": {
"type": "Identifier",
"span": {
"start": 41,
"end": 42,
"ctxt": 0
},
"value": "S",
"typeAnnotation": null,
"optional": false
},
"constraint": {
"type": "TsTypeReference",
"span": {
"start": 51,
"end": 56,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 51,
"end": 56,
"ctxt": 0
},
"value": "State",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"default": {
"type": "TsTypeReference",
"span": {
"start": 59,
"end": 61,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 59,
"end": 61,
"ctxt": 0
},
"value": "RS",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
}
}
]
},
"returnType": {
"type": "TsTypeAnnotation",
"span": {
"start": 145,
"end": 211,
"ctxt": 0
},
"typeAnnotation": {
"type": "TsTypeReference",
"span": {
"start": 147,
"end": 211,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 147,
"end": 153,
"ctxt": 0
},
"value": "Router",
"typeAnnotation": null,
"optional": false
},
"typeParams": {
"type": "TsTypeParameterInstantiation",
"span": {
"start": 153,
"end": 211,
"ctxt": 0
},
"params": [
{
"type": "TsConditionalType",
"span": {
"start": 154,
"end": 181,
"ctxt": 0
},
"checkType": {
"type": "TsTypeReference",
"span": {
"start": 154,
"end": 155,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 154,
"end": 155,
"ctxt": 0
},
"value": "P",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"extendsType": {
"type": "TsTypeReference",
"span": {
"start": 164,
"end": 166,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 164,
"end": 166,
"ctxt": 0
},
"value": "RP",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"trueType": {
"type": "TsTypeReference",
"span": {
"start": 169,
"end": 170,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 169,
"end": 170,
"ctxt": 0
},
"value": "P",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"falseType": {
"type": "TsParenthesizedType",
"span": {
"start": 173,
"end": 181,
"ctxt": 0
},
"typeAnnotation": {
"type": "TsIntersectionType",
"span": {
"start": 174,
"end": 180,
"ctxt": 0
},
"types": [
{
"type": "TsTypeReference",
"span": {
"start": 174,
"end": 175,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 174,
"end": 175,
"ctxt": 0
},
"value": "P",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
{
"type": "TsTypeReference",
"span": {
"start": 178,
"end": 180,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 178,
"end": 180,
"ctxt": 0
},
"value": "RP",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
}
]
}
}
},
{
"type": "TsConditionalType",
"span": {
"start": 183,
"end": 210,
"ctxt": 0
},
"checkType": {
"type": "TsTypeReference",
"span": {
"start": 183,
"end": 184,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 183,
"end": 184,
"ctxt": 0
},
"value": "S",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"extendsType": {
"type": "TsTypeReference",
"span": {
"start": 193,
"end": 195,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 193,
"end": 195,
"ctxt": 0
},
"value": "RS",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"trueType": {
"type": "TsTypeReference",
"span": {
"start": 198,
"end": 199,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 198,
"end": 199,
"ctxt": 0
},
"value": "S",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"falseType": {
"type": "TsParenthesizedType",
"span": {
"start": 202,
"end": 210,
"ctxt": 0
},
"typeAnnotation": {
"type": "TsIntersectionType",
"span": {
"start": 203,
"end": 209,
"ctxt": 0
},
"types": [
{
"type": "TsTypeReference",
"span": {
"start": 203,
"end": 204,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 203,
"end": 204,
"ctxt": 0
},
"value": "S",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
{
"type": "TsTypeReference",
"span": {
"start": 207,
"end": 209,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 207,
"end": 209,
"ctxt": 0
},
"value": "RS",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
}
]
}
}
}
]
}
}
}
},
{
"type": "BlockStatement",
"span": {
"start": 213,
"end": 216,
"ctxt": 0
},
"stmts": []
}
],
"interpreter": null
}

View File

@ -0,0 +1,7 @@
class Foo {
delete<P extends RouteParams = RP, S extends State = RS>(
name: string,
path: string,
...middleware: RouterMiddleware<P, S>[]
): Router<P extends RP ? P : (P & RP), S extends RS ? S : (S & RS)> { }
}

View File

@ -0,0 +1,691 @@
{
"type": "Script",
"span": {
"start": 0,
"end": 243,
"ctxt": 0
},
"body": [
{
"type": "ClassDeclaration",
"identifier": {
"type": "Identifier",
"span": {
"start": 6,
"end": 9,
"ctxt": 0
},
"value": "Foo",
"typeAnnotation": null,
"optional": false
},
"declare": false,
"span": {
"start": 0,
"end": 243,
"ctxt": 0
},
"decorators": [],
"body": [
{
"type": "ClassMethod",
"span": {
"start": 16,
"end": 241,
"ctxt": 0
},
"key": {
"type": "Identifier",
"span": {
"start": 16,
"end": 22,
"ctxt": 0
},
"value": "delete",
"typeAnnotation": null,
"optional": false
},
"function": {
"params": [
{
"type": "Parameter",
"span": {
"start": 82,
"end": 94,
"ctxt": 0
},
"decorators": [],
"pat": {
"type": "Identifier",
"span": {
"start": 82,
"end": 94,
"ctxt": 0
},
"value": "name",
"typeAnnotation": {
"type": "TsTypeAnnotation",
"span": {
"start": 86,
"end": 94,
"ctxt": 0
},
"typeAnnotation": {
"type": "TsKeywordType",
"span": {
"start": 88,
"end": 94,
"ctxt": 0
},
"kind": "string"
}
},
"optional": false
}
},
{
"type": "Parameter",
"span": {
"start": 104,
"end": 116,
"ctxt": 0
},
"decorators": [],
"pat": {
"type": "Identifier",
"span": {
"start": 104,
"end": 116,
"ctxt": 0
},
"value": "path",
"typeAnnotation": {
"type": "TsTypeAnnotation",
"span": {
"start": 108,
"end": 116,
"ctxt": 0
},
"typeAnnotation": {
"type": "TsKeywordType",
"span": {
"start": 110,
"end": 116,
"ctxt": 0
},
"kind": "string"
}
},
"optional": false
}
},
{
"type": "Parameter",
"span": {
"start": 126,
"end": 165,
"ctxt": 0
},
"decorators": [],
"pat": {
"type": "RestElement",
"span": {
"start": 126,
"end": 165,
"ctxt": 0
},
"rest": {
"start": 126,
"end": 129,
"ctxt": 0
},
"argument": {
"type": "Identifier",
"span": {
"start": 129,
"end": 139,
"ctxt": 0
},
"value": "middleware",
"typeAnnotation": null,
"optional": false
},
"typeAnnotation": {
"type": "TsTypeAnnotation",
"span": {
"start": 139,
"end": 165,
"ctxt": 0
},
"typeAnnotation": {
"type": "TsArrayType",
"span": {
"start": 141,
"end": 165,
"ctxt": 0
},
"elemType": {
"type": "TsTypeReference",
"span": {
"start": 141,
"end": 163,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 141,
"end": 157,
"ctxt": 0
},
"value": "RouterMiddleware",
"typeAnnotation": null,
"optional": false
},
"typeParams": {
"type": "TsTypeParameterInstantiation",
"span": {
"start": 157,
"end": 163,
"ctxt": 0
},
"params": [
{
"type": "TsTypeReference",
"span": {
"start": 158,
"end": 159,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 158,
"end": 159,
"ctxt": 0
},
"value": "P",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
{
"type": "TsTypeReference",
"span": {
"start": 161,
"end": 162,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 161,
"end": 162,
"ctxt": 0
},
"value": "S",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
}
]
}
}
}
}
}
}
],
"decorators": [],
"span": {
"start": 16,
"end": 241,
"ctxt": 0
},
"body": {
"type": "BlockStatement",
"span": {
"start": 238,
"end": 241,
"ctxt": 0
},
"stmts": []
},
"generator": false,
"async": false,
"typeParameters": {
"type": "TsTypeParameterDeclaration",
"span": {
"start": 22,
"end": 72,
"ctxt": 0
},
"parameters": [
{
"type": "TsTypeParameter",
"span": {
"start": 23,
"end": 49,
"ctxt": 0
},
"name": {
"type": "Identifier",
"span": {
"start": 23,
"end": 24,
"ctxt": 0
},
"value": "P",
"typeAnnotation": null,
"optional": false
},
"constraint": {
"type": "TsTypeReference",
"span": {
"start": 33,
"end": 44,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 33,
"end": 44,
"ctxt": 0
},
"value": "RouteParams",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"default": {
"type": "TsTypeReference",
"span": {
"start": 47,
"end": 49,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 47,
"end": 49,
"ctxt": 0
},
"value": "RP",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
}
},
{
"type": "TsTypeParameter",
"span": {
"start": 51,
"end": 71,
"ctxt": 0
},
"name": {
"type": "Identifier",
"span": {
"start": 51,
"end": 52,
"ctxt": 0
},
"value": "S",
"typeAnnotation": null,
"optional": false
},
"constraint": {
"type": "TsTypeReference",
"span": {
"start": 61,
"end": 66,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 61,
"end": 66,
"ctxt": 0
},
"value": "State",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"default": {
"type": "TsTypeReference",
"span": {
"start": 69,
"end": 71,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 69,
"end": 71,
"ctxt": 0
},
"value": "RS",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
}
}
]
},
"returnType": {
"type": "TsTypeAnnotation",
"span": {
"start": 171,
"end": 237,
"ctxt": 0
},
"typeAnnotation": {
"type": "TsTypeReference",
"span": {
"start": 173,
"end": 237,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 173,
"end": 179,
"ctxt": 0
},
"value": "Router",
"typeAnnotation": null,
"optional": false
},
"typeParams": {
"type": "TsTypeParameterInstantiation",
"span": {
"start": 179,
"end": 237,
"ctxt": 0
},
"params": [
{
"type": "TsConditionalType",
"span": {
"start": 180,
"end": 207,
"ctxt": 0
},
"checkType": {
"type": "TsTypeReference",
"span": {
"start": 180,
"end": 181,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 180,
"end": 181,
"ctxt": 0
},
"value": "P",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"extendsType": {
"type": "TsTypeReference",
"span": {
"start": 190,
"end": 192,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 190,
"end": 192,
"ctxt": 0
},
"value": "RP",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"trueType": {
"type": "TsTypeReference",
"span": {
"start": 195,
"end": 196,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 195,
"end": 196,
"ctxt": 0
},
"value": "P",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"falseType": {
"type": "TsParenthesizedType",
"span": {
"start": 199,
"end": 207,
"ctxt": 0
},
"typeAnnotation": {
"type": "TsIntersectionType",
"span": {
"start": 200,
"end": 206,
"ctxt": 0
},
"types": [
{
"type": "TsTypeReference",
"span": {
"start": 200,
"end": 201,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 200,
"end": 201,
"ctxt": 0
},
"value": "P",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
{
"type": "TsTypeReference",
"span": {
"start": 204,
"end": 206,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 204,
"end": 206,
"ctxt": 0
},
"value": "RP",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
}
]
}
}
},
{
"type": "TsConditionalType",
"span": {
"start": 209,
"end": 236,
"ctxt": 0
},
"checkType": {
"type": "TsTypeReference",
"span": {
"start": 209,
"end": 210,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 209,
"end": 210,
"ctxt": 0
},
"value": "S",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"extendsType": {
"type": "TsTypeReference",
"span": {
"start": 219,
"end": 221,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 219,
"end": 221,
"ctxt": 0
},
"value": "RS",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"trueType": {
"type": "TsTypeReference",
"span": {
"start": 224,
"end": 225,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 224,
"end": 225,
"ctxt": 0
},
"value": "S",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
"falseType": {
"type": "TsParenthesizedType",
"span": {
"start": 228,
"end": 236,
"ctxt": 0
},
"typeAnnotation": {
"type": "TsIntersectionType",
"span": {
"start": 229,
"end": 235,
"ctxt": 0
},
"types": [
{
"type": "TsTypeReference",
"span": {
"start": 229,
"end": 230,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 229,
"end": 230,
"ctxt": 0
},
"value": "S",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
},
{
"type": "TsTypeReference",
"span": {
"start": 233,
"end": 235,
"ctxt": 0
},
"typeName": {
"type": "Identifier",
"span": {
"start": 233,
"end": 235,
"ctxt": 0
},
"value": "RS",
"typeAnnotation": null,
"optional": false
},
"typeParams": null
}
]
}
}
}
]
}
}
}
},
"kind": "method",
"isStatic": false,
"accessibility": null,
"isAbstract": false,
"isOptional": false
}
],
"superClass": null,
"isAbstract": false,
"typeParams": null,
"superTypeParams": null,
"implements": []
}
],
"interpreter": null
}