diff --git a/lib/ast-converter.js b/lib/ast-converter.js index ea8a187..8b009ca 100644 --- a/lib/ast-converter.js +++ b/lib/ast-converter.js @@ -759,6 +759,7 @@ module.exports = function(ast, extra) { SyntaxKind.Parameter === node.parent.kind || SyntaxKind.PropertyDeclaration === node.parent.kind || SyntaxKind.PropertySignature === node.parent.kind || + SyntaxKind.MethodDeclaration === node.parent.kind || SyntaxKind.MethodSignature === node.parent.kind )) { result.optional = true; diff --git a/tests/fixtures/typescript/basics/abstract-class-with-optional-method.result.js b/tests/fixtures/typescript/basics/abstract-class-with-optional-method.result.js new file mode 100644 index 0000000..9e409d8 --- /dev/null +++ b/tests/fixtures/typescript/basics/abstract-class-with-optional-method.result.js @@ -0,0 +1,521 @@ +module.exports = { + "body": [ + { + "declaration": { + "body": { + "body": [ + { + "accessibility": null, + "computed": false, + "decorators": [], + "key": { + "loc": { + "end": { + "column": 16, + "line": 2 + }, + "start": { + "column": 4, + "line": 2 + } + }, + "name": "createSocket", + "optional": true, + "range": [ + 43, + 55 + ], + "type": "Identifier" + }, + "kind": "method", + "loc": { + "end": { + "column": 37, + "line": 2 + }, + "start": { + "column": 4, + "line": 2 + } + }, + "range": [ + 43, + 76 + ], + "static": false, + "type": "MethodDefinition", + "value": { + "async": false, + "body": null, + "expression": false, + "generator": false, + "id": null, + "loc": { + "end": { + "column": 37, + "line": 2 + }, + "start": { + "column": 16, + "line": 2 + } + }, + "params": [], + "range": [ + 56, + 76 + ], + "returnType": { + "loc": { + "end": { + "column": 36, + "line": 2 + }, + "start": { + "column": 21, + "line": 2 + } + }, + "range": [ + 60, + 75 + ], + "type": "TypeAnnotation", + "typeAnnotation": { + "loc": { + "end": { + "column": 36, + "line": 2 + }, + "start": { + "column": 21, + "line": 2 + } + }, + "range": [ + 60, + 75 + ], + "type": "TSTypeReference", + "typeArguments": [ + { + "loc": { + "end": { + "column": 35, + "line": 2 + }, + "start": { + "column": 29, + "line": 2 + } + }, + "range": [ + 68, + 74 + ], + "type": "TSStringKeyword" + } + ], + "typeName": { + "loc": { + "end": { + "column": 28, + "line": 2 + }, + "start": { + "column": 21, + "line": 2 + } + }, + "name": "Promise", + "range": [ + 60, + 67 + ], + "type": "Identifier" + } + } + }, + "type": "FunctionExpression" + } + } + ], + "loc": { + "end": { + "column": 1, + "line": 3 + }, + "start": { + "column": 37, + "line": 1 + } + }, + "range": [ + 37, + 78 + ], + "type": "ClassBody" + }, + "decorators": [], + "id": { + "loc": { + "end": { + "column": 36, + "line": 1 + }, + "start": { + "column": 22, + "line": 1 + } + }, + "name": "AbstractSocket", + "range": [ + 22, + 36 + ], + "type": "Identifier" + }, + "implements": [], + "loc": { + "end": { + "column": 1, + "line": 3 + }, + "start": { + "column": 16, + "line": 1 + } + }, + "range": [ + 16, + 78 + ], + "superClass": null, + "type": "TSAbstractClassDeclaration" + }, + "loc": { + "end": { + "column": 1, + "line": 3 + }, + "start": { + "column": 0, + "line": 1 + } + }, + "range": [ + 0, + 78 + ], + "source": null, + "specifiers": [], + "type": "ExportNamedDeclaration" + } + ], + "loc": { + "end": { + "column": 1, + "line": 3 + }, + "start": { + "column": 0, + "line": 1 + } + }, + "range": [ + 0, + 78 + ], + "sourceType": "module", + "tokens": [ + { + "loc": { + "end": { + "column": 6, + "line": 1 + }, + "start": { + "column": 0, + "line": 1 + } + }, + "range": [ + 0, + 6 + ], + "type": "Keyword", + "value": "export" + }, + { + "loc": { + "end": { + "column": 15, + "line": 1 + }, + "start": { + "column": 7, + "line": 1 + } + }, + "range": [ + 7, + 15 + ], + "type": "Identifier", + "value": "abstract" + }, + { + "loc": { + "end": { + "column": 21, + "line": 1 + }, + "start": { + "column": 16, + "line": 1 + } + }, + "range": [ + 16, + 21 + ], + "type": "Keyword", + "value": "class" + }, + { + "loc": { + "end": { + "column": 36, + "line": 1 + }, + "start": { + "column": 22, + "line": 1 + } + }, + "range": [ + 22, + 36 + ], + "type": "Identifier", + "value": "AbstractSocket" + }, + { + "loc": { + "end": { + "column": 38, + "line": 1 + }, + "start": { + "column": 37, + "line": 1 + } + }, + "range": [ + 37, + 38 + ], + "type": "Punctuator", + "value": "{" + }, + { + "loc": { + "end": { + "column": 16, + "line": 2 + }, + "start": { + "column": 4, + "line": 2 + } + }, + "range": [ + 43, + 55 + ], + "type": "Identifier", + "value": "createSocket" + }, + { + "loc": { + "end": { + "column": 17, + "line": 2 + }, + "start": { + "column": 16, + "line": 2 + } + }, + "range": [ + 55, + 56 + ], + "type": "Punctuator", + "value": "?" + }, + { + "loc": { + "end": { + "column": 18, + "line": 2 + }, + "start": { + "column": 17, + "line": 2 + } + }, + "range": [ + 56, + 57 + ], + "type": "Punctuator", + "value": "(" + }, + { + "loc": { + "end": { + "column": 19, + "line": 2 + }, + "start": { + "column": 18, + "line": 2 + } + }, + "range": [ + 57, + 58 + ], + "type": "Punctuator", + "value": ")" + }, + { + "loc": { + "end": { + "column": 20, + "line": 2 + }, + "start": { + "column": 19, + "line": 2 + } + }, + "range": [ + 58, + 59 + ], + "type": "Punctuator", + "value": ":" + }, + { + "loc": { + "end": { + "column": 28, + "line": 2 + }, + "start": { + "column": 21, + "line": 2 + } + }, + "range": [ + 60, + 67 + ], + "type": "Identifier", + "value": "Promise" + }, + { + "loc": { + "end": { + "column": 29, + "line": 2 + }, + "start": { + "column": 28, + "line": 2 + } + }, + "range": [ + 67, + 68 + ], + "type": "Punctuator", + "value": "<" + }, + { + "loc": { + "end": { + "column": 35, + "line": 2 + }, + "start": { + "column": 29, + "line": 2 + } + }, + "range": [ + 68, + 74 + ], + "type": "Identifier", + "value": "string" + }, + { + "loc": { + "end": { + "column": 36, + "line": 2 + }, + "start": { + "column": 35, + "line": 2 + } + }, + "range": [ + 74, + 75 + ], + "type": "Punctuator", + "value": ">" + }, + { + "loc": { + "end": { + "column": 37, + "line": 2 + }, + "start": { + "column": 36, + "line": 2 + } + }, + "range": [ + 75, + 76 + ], + "type": "Punctuator", + "value": ";" + }, + { + "loc": { + "end": { + "column": 1, + "line": 3 + }, + "start": { + "column": 0, + "line": 3 + } + }, + "range": [ + 77, + 78 + ], + "type": "Punctuator", + "value": "}" + } + ], + "type": "Program" +}; diff --git a/tests/fixtures/typescript/basics/abstract-class-with-optional-method.src.ts b/tests/fixtures/typescript/basics/abstract-class-with-optional-method.src.ts new file mode 100644 index 0000000..f39ba3f --- /dev/null +++ b/tests/fixtures/typescript/basics/abstract-class-with-optional-method.src.ts @@ -0,0 +1,3 @@ +export abstract class AbstractSocket { + createSocket?(): Promise; +} \ No newline at end of file diff --git a/tests/fixtures/typescript/basics/class-with-optional-methods.result.js b/tests/fixtures/typescript/basics/class-with-optional-methods.result.js new file mode 100644 index 0000000..13b27ea --- /dev/null +++ b/tests/fixtures/typescript/basics/class-with-optional-methods.result.js @@ -0,0 +1,771 @@ +module.exports = { + "body": [ + { + "body": { + "body": [ + { + "accessibility": null, + "computed": false, + "decorators": [], + "key": { + "loc": { + "end": { + "column": 5, + "line": 2 + }, + "start": { + "column": 2, + "line": 2 + } + }, + "name": "foo", + "optional": true, + "range": [ + 14, + 17 + ], + "type": "Identifier" + }, + "kind": "method", + "loc": { + "end": { + "column": 9, + "line": 2 + }, + "start": { + "column": 2, + "line": 2 + } + }, + "range": [ + 14, + 21 + ], + "static": false, + "type": "MethodDefinition", + "value": { + "async": false, + "body": null, + "expression": false, + "generator": false, + "id": null, + "loc": { + "end": { + "column": 9, + "line": 2 + }, + "start": { + "column": 5, + "line": 2 + } + }, + "params": [], + "range": [ + 18, + 21 + ], + "type": "FunctionExpression" + } + }, + { + "accessibility": null, + "computed": false, + "decorators": [], + "key": { + "loc": { + "end": { + "column": 5, + "line": 3 + }, + "start": { + "column": 2, + "line": 3 + } + }, + "name": "bar", + "optional": true, + "range": [ + 24, + 27 + ], + "type": "Identifier" + }, + "kind": "method", + "loc": { + "end": { + "column": 17, + "line": 3 + }, + "start": { + "column": 2, + "line": 3 + } + }, + "range": [ + 24, + 39 + ], + "static": false, + "type": "MethodDefinition", + "value": { + "async": false, + "body": null, + "expression": false, + "generator": false, + "id": null, + "loc": { + "end": { + "column": 17, + "line": 3 + }, + "start": { + "column": 5, + "line": 3 + } + }, + "params": [], + "range": [ + 28, + 39 + ], + "returnType": { + "loc": { + "end": { + "column": 16, + "line": 3 + }, + "start": { + "column": 10, + "line": 3 + } + }, + "range": [ + 32, + 38 + ], + "type": "TypeAnnotation", + "typeAnnotation": { + "loc": { + "end": { + "column": 16, + "line": 3 + }, + "start": { + "column": 10, + "line": 3 + } + }, + "range": [ + 32, + 38 + ], + "type": "TSStringKeyword" + } + }, + "type": "FunctionExpression" + } + }, + { + "accessibility": "private", + "computed": false, + "decorators": [], + "key": { + "loc": { + "end": { + "column": 13, + "line": 4 + }, + "start": { + "column": 10, + "line": 4 + } + }, + "name": "baz", + "optional": true, + "range": [ + 50, + 53 + ], + "type": "Identifier" + }, + "kind": "method", + "loc": { + "end": { + "column": 25, + "line": 4 + }, + "start": { + "column": 2, + "line": 4 + } + }, + "range": [ + 42, + 65 + ], + "static": false, + "type": "MethodDefinition", + "value": { + "async": false, + "body": null, + "expression": false, + "generator": false, + "id": null, + "loc": { + "end": { + "column": 25, + "line": 4 + }, + "start": { + "column": 13, + "line": 4 + } + }, + "params": [], + "range": [ + 54, + 65 + ], + "returnType": { + "loc": { + "end": { + "column": 24, + "line": 4 + }, + "start": { + "column": 18, + "line": 4 + } + }, + "range": [ + 58, + 64 + ], + "type": "TypeAnnotation", + "typeAnnotation": { + "loc": { + "end": { + "column": 24, + "line": 4 + }, + "start": { + "column": 18, + "line": 4 + } + }, + "range": [ + 58, + 64 + ], + "type": "TSStringKeyword" + } + }, + "type": "FunctionExpression" + } + } + ], + "loc": { + "end": { + "column": 1, + "line": 5 + }, + "start": { + "column": 10, + "line": 1 + } + }, + "range": [ + 10, + 67 + ], + "type": "ClassBody" + }, + "decorators": [], + "id": { + "loc": { + "end": { + "column": 9, + "line": 1 + }, + "start": { + "column": 6, + "line": 1 + } + }, + "name": "Foo", + "range": [ + 6, + 9 + ], + "type": "Identifier" + }, + "implements": [], + "loc": { + "end": { + "column": 1, + "line": 5 + }, + "start": { + "column": 0, + "line": 1 + } + }, + "range": [ + 0, + 67 + ], + "superClass": null, + "type": "ClassDeclaration" + } + ], + "loc": { + "end": { + "column": 1, + "line": 5 + }, + "start": { + "column": 0, + "line": 1 + } + }, + "range": [ + 0, + 67 + ], + "sourceType": "script", + "tokens": [ + { + "loc": { + "end": { + "column": 5, + "line": 1 + }, + "start": { + "column": 0, + "line": 1 + } + }, + "range": [ + 0, + 5 + ], + "type": "Keyword", + "value": "class" + }, + { + "loc": { + "end": { + "column": 9, + "line": 1 + }, + "start": { + "column": 6, + "line": 1 + } + }, + "range": [ + 6, + 9 + ], + "type": "Identifier", + "value": "Foo" + }, + { + "loc": { + "end": { + "column": 11, + "line": 1 + }, + "start": { + "column": 10, + "line": 1 + } + }, + "range": [ + 10, + 11 + ], + "type": "Punctuator", + "value": "{" + }, + { + "loc": { + "end": { + "column": 5, + "line": 2 + }, + "start": { + "column": 2, + "line": 2 + } + }, + "range": [ + 14, + 17 + ], + "type": "Identifier", + "value": "foo" + }, + { + "loc": { + "end": { + "column": 6, + "line": 2 + }, + "start": { + "column": 5, + "line": 2 + } + }, + "range": [ + 17, + 18 + ], + "type": "Punctuator", + "value": "?" + }, + { + "loc": { + "end": { + "column": 7, + "line": 2 + }, + "start": { + "column": 6, + "line": 2 + } + }, + "range": [ + 18, + 19 + ], + "type": "Punctuator", + "value": "(" + }, + { + "loc": { + "end": { + "column": 8, + "line": 2 + }, + "start": { + "column": 7, + "line": 2 + } + }, + "range": [ + 19, + 20 + ], + "type": "Punctuator", + "value": ")" + }, + { + "loc": { + "end": { + "column": 9, + "line": 2 + }, + "start": { + "column": 8, + "line": 2 + } + }, + "range": [ + 20, + 21 + ], + "type": "Punctuator", + "value": ";" + }, + { + "loc": { + "end": { + "column": 5, + "line": 3 + }, + "start": { + "column": 2, + "line": 3 + } + }, + "range": [ + 24, + 27 + ], + "type": "Identifier", + "value": "bar" + }, + { + "loc": { + "end": { + "column": 6, + "line": 3 + }, + "start": { + "column": 5, + "line": 3 + } + }, + "range": [ + 27, + 28 + ], + "type": "Punctuator", + "value": "?" + }, + { + "loc": { + "end": { + "column": 7, + "line": 3 + }, + "start": { + "column": 6, + "line": 3 + } + }, + "range": [ + 28, + 29 + ], + "type": "Punctuator", + "value": "(" + }, + { + "loc": { + "end": { + "column": 8, + "line": 3 + }, + "start": { + "column": 7, + "line": 3 + } + }, + "range": [ + 29, + 30 + ], + "type": "Punctuator", + "value": ")" + }, + { + "loc": { + "end": { + "column": 9, + "line": 3 + }, + "start": { + "column": 8, + "line": 3 + } + }, + "range": [ + 30, + 31 + ], + "type": "Punctuator", + "value": ":" + }, + { + "loc": { + "end": { + "column": 16, + "line": 3 + }, + "start": { + "column": 10, + "line": 3 + } + }, + "range": [ + 32, + 38 + ], + "type": "Identifier", + "value": "string" + }, + { + "loc": { + "end": { + "column": 17, + "line": 3 + }, + "start": { + "column": 16, + "line": 3 + } + }, + "range": [ + 38, + 39 + ], + "type": "Punctuator", + "value": ";" + }, + { + "loc": { + "end": { + "column": 9, + "line": 4 + }, + "start": { + "column": 2, + "line": 4 + } + }, + "range": [ + 42, + 49 + ], + "type": "Keyword", + "value": "private" + }, + { + "loc": { + "end": { + "column": 13, + "line": 4 + }, + "start": { + "column": 10, + "line": 4 + } + }, + "range": [ + 50, + 53 + ], + "type": "Identifier", + "value": "baz" + }, + { + "loc": { + "end": { + "column": 14, + "line": 4 + }, + "start": { + "column": 13, + "line": 4 + } + }, + "range": [ + 53, + 54 + ], + "type": "Punctuator", + "value": "?" + }, + { + "loc": { + "end": { + "column": 15, + "line": 4 + }, + "start": { + "column": 14, + "line": 4 + } + }, + "range": [ + 54, + 55 + ], + "type": "Punctuator", + "value": "(" + }, + { + "loc": { + "end": { + "column": 16, + "line": 4 + }, + "start": { + "column": 15, + "line": 4 + } + }, + "range": [ + 55, + 56 + ], + "type": "Punctuator", + "value": ")" + }, + { + "loc": { + "end": { + "column": 17, + "line": 4 + }, + "start": { + "column": 16, + "line": 4 + } + }, + "range": [ + 56, + 57 + ], + "type": "Punctuator", + "value": ":" + }, + { + "loc": { + "end": { + "column": 24, + "line": 4 + }, + "start": { + "column": 18, + "line": 4 + } + }, + "range": [ + 58, + 64 + ], + "type": "Identifier", + "value": "string" + }, + { + "loc": { + "end": { + "column": 25, + "line": 4 + }, + "start": { + "column": 24, + "line": 4 + } + }, + "range": [ + 64, + 65 + ], + "type": "Punctuator", + "value": ";" + }, + { + "loc": { + "end": { + "column": 1, + "line": 5 + }, + "start": { + "column": 0, + "line": 5 + } + }, + "range": [ + 66, + 67 + ], + "type": "Punctuator", + "value": "}" + } + ], + "type": "Program" +}; diff --git a/tests/fixtures/typescript/basics/class-with-optional-methods.src.ts b/tests/fixtures/typescript/basics/class-with-optional-methods.src.ts new file mode 100644 index 0000000..2fe152d --- /dev/null +++ b/tests/fixtures/typescript/basics/class-with-optional-methods.src.ts @@ -0,0 +1,5 @@ +class Foo { + foo?(); + bar?(): string; + private baz?(): string; +} diff --git a/tests/fixtures/typescript/basics/declare-class-with-optional-method.result.js b/tests/fixtures/typescript/basics/declare-class-with-optional-method.result.js new file mode 100644 index 0000000..d834af4 --- /dev/null +++ b/tests/fixtures/typescript/basics/declare-class-with-optional-method.result.js @@ -0,0 +1,393 @@ +module.exports = { + "body": [ + { + "body": { + "body": [ + { + "accessibility": null, + "computed": false, + "decorators": [], + "key": { + "loc": { + "end": { + "column": 7, + "line": 2 + }, + "start": { + "column": 4, + "line": 2 + } + }, + "name": "bar", + "optional": true, + "range": [ + 24, + 27 + ], + "type": "Identifier" + }, + "kind": "method", + "loc": { + "end": { + "column": 16, + "line": 2 + }, + "start": { + "column": 4, + "line": 2 + } + }, + "range": [ + 24, + 36 + ], + "static": false, + "type": "MethodDefinition", + "value": { + "async": false, + "body": null, + "expression": false, + "generator": false, + "id": null, + "loc": { + "end": { + "column": 16, + "line": 2 + }, + "start": { + "column": 7, + "line": 2 + } + }, + "params": [], + "range": [ + 28, + 36 + ], + "returnType": { + "loc": { + "end": { + "column": 15, + "line": 2 + }, + "start": { + "column": 12, + "line": 2 + } + }, + "range": [ + 32, + 35 + ], + "type": "TypeAnnotation", + "typeAnnotation": { + "loc": { + "end": { + "column": 15, + "line": 2 + }, + "start": { + "column": 12, + "line": 2 + } + }, + "range": [ + 32, + 35 + ], + "type": "TSAnyKeyword" + } + }, + "type": "FunctionExpression" + } + } + ], + "loc": { + "end": { + "column": 1, + "line": 3 + }, + "start": { + "column": 18, + "line": 1 + } + }, + "range": [ + 18, + 38 + ], + "type": "ClassBody" + }, + "decorators": [], + "id": { + "loc": { + "end": { + "column": 17, + "line": 1 + }, + "start": { + "column": 14, + "line": 1 + } + }, + "name": "Foo", + "range": [ + 14, + 17 + ], + "type": "Identifier" + }, + "implements": [], + "loc": { + "end": { + "column": 1, + "line": 3 + }, + "start": { + "column": 0, + "line": 1 + } + }, + "range": [ + 0, + 38 + ], + "superClass": null, + "type": "ClassDeclaration" + } + ], + "loc": { + "end": { + "column": 1, + "line": 3 + }, + "start": { + "column": 0, + "line": 1 + } + }, + "range": [ + 0, + 38 + ], + "sourceType": "script", + "tokens": [ + { + "loc": { + "end": { + "column": 7, + "line": 1 + }, + "start": { + "column": 0, + "line": 1 + } + }, + "range": [ + 0, + 7 + ], + "type": "Identifier", + "value": "declare" + }, + { + "loc": { + "end": { + "column": 13, + "line": 1 + }, + "start": { + "column": 8, + "line": 1 + } + }, + "range": [ + 8, + 13 + ], + "type": "Keyword", + "value": "class" + }, + { + "loc": { + "end": { + "column": 17, + "line": 1 + }, + "start": { + "column": 14, + "line": 1 + } + }, + "range": [ + 14, + 17 + ], + "type": "Identifier", + "value": "Foo" + }, + { + "loc": { + "end": { + "column": 19, + "line": 1 + }, + "start": { + "column": 18, + "line": 1 + } + }, + "range": [ + 18, + 19 + ], + "type": "Punctuator", + "value": "{" + }, + { + "loc": { + "end": { + "column": 7, + "line": 2 + }, + "start": { + "column": 4, + "line": 2 + } + }, + "range": [ + 24, + 27 + ], + "type": "Identifier", + "value": "bar" + }, + { + "loc": { + "end": { + "column": 8, + "line": 2 + }, + "start": { + "column": 7, + "line": 2 + } + }, + "range": [ + 27, + 28 + ], + "type": "Punctuator", + "value": "?" + }, + { + "loc": { + "end": { + "column": 9, + "line": 2 + }, + "start": { + "column": 8, + "line": 2 + } + }, + "range": [ + 28, + 29 + ], + "type": "Punctuator", + "value": "(" + }, + { + "loc": { + "end": { + "column": 10, + "line": 2 + }, + "start": { + "column": 9, + "line": 2 + } + }, + "range": [ + 29, + 30 + ], + "type": "Punctuator", + "value": ")" + }, + { + "loc": { + "end": { + "column": 11, + "line": 2 + }, + "start": { + "column": 10, + "line": 2 + } + }, + "range": [ + 30, + 31 + ], + "type": "Punctuator", + "value": ":" + }, + { + "loc": { + "end": { + "column": 15, + "line": 2 + }, + "start": { + "column": 12, + "line": 2 + } + }, + "range": [ + 32, + 35 + ], + "type": "Identifier", + "value": "any" + }, + { + "loc": { + "end": { + "column": 16, + "line": 2 + }, + "start": { + "column": 15, + "line": 2 + } + }, + "range": [ + 35, + 36 + ], + "type": "Punctuator", + "value": ";" + }, + { + "loc": { + "end": { + "column": 1, + "line": 3 + }, + "start": { + "column": 0, + "line": 3 + } + }, + "range": [ + 37, + 38 + ], + "type": "Punctuator", + "value": "}" + } + ], + "type": "Program" +}; diff --git a/tests/fixtures/typescript/basics/declare-class-with-optional-method.src.ts b/tests/fixtures/typescript/basics/declare-class-with-optional-method.src.ts new file mode 100644 index 0000000..ecb4a4e --- /dev/null +++ b/tests/fixtures/typescript/basics/declare-class-with-optional-method.src.ts @@ -0,0 +1,3 @@ +declare class Foo { + bar?(): any; +} \ No newline at end of file