diff --git a/src/parser/node.js b/src/parser/node.js index fa44f561c4..43146fd7ff 100644 --- a/src/parser/node.js +++ b/src/parser/node.js @@ -4,6 +4,7 @@ import { SourceLocation } from "../util/location"; // Start an AST node, attaching a start offset. const pp = Parser.prototype; +const commentKeys = ["leadingComments", "trailingComments", "innerComments"]; class Node { constructor(pos?: number, loc?: SourceLocation, filename?: string) { @@ -20,8 +21,14 @@ class Node { loc: SourceLocation; __clone(): Node { - let node2 = new Node; - for (let key in this) node2[key] = this[key]; + const node2 = new Node; + for (let key in this) { + // Do not clone comments that are already attached to the node + if (commentKeys.indexOf(key) < 0) { + node2[key] = this[key]; + } + } + return node2; } } diff --git a/test/fixtures/comments/basic/shebang-import/actual.js b/test/fixtures/comments/basic/shebang-import/actual.js new file mode 100755 index 0000000000..450358ed06 --- /dev/null +++ b/test/fixtures/comments/basic/shebang-import/actual.js @@ -0,0 +1,3 @@ +#!/usr/bin/env babel-node + +import {spawn} from 'foobar'; diff --git a/test/fixtures/comments/basic/shebang-import/expected.json b/test/fixtures/comments/basic/shebang-import/expected.json new file mode 100644 index 0000000000..3d0e83f874 --- /dev/null +++ b/test/fixtures/comments/basic/shebang-import/expected.json @@ -0,0 +1,154 @@ +{ + "type": "File", + "start": 0, + "end": 56, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 29 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 56, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 29 + } + }, + "sourceType": "module", + "body": [ + { + "type": "ImportDeclaration", + "start": 27, + "end": 56, + "loc": { + "start": { + "line": 3, + "column": 0 + }, + "end": { + "line": 3, + "column": 29 + } + }, + "specifiers": [ + { + "type": "ImportSpecifier", + "start": 35, + "end": 40, + "loc": { + "start": { + "line": 3, + "column": 8 + }, + "end": { + "line": 3, + "column": 13 + } + }, + "imported": { + "type": "Identifier", + "start": 35, + "end": 40, + "loc": { + "start": { + "line": 3, + "column": 8 + }, + "end": { + "line": 3, + "column": 13 + } + }, + "name": "spawn" + }, + "local": { + "type": "Identifier", + "start": 35, + "end": 40, + "loc": { + "start": { + "line": 3, + "column": 8 + }, + "end": { + "line": 3, + "column": 13 + } + }, + "name": "spawn" + } + } + ], + "source": { + "type": "StringLiteral", + "start": 47, + "end": 55, + "loc": { + "start": { + "line": 3, + "column": 20 + }, + "end": { + "line": 3, + "column": 28 + } + }, + "extra": { + "rawValue": "foobar", + "raw": "'foobar'" + }, + "value": "foobar" + }, + "leadingComments": [ + { + "type": "CommentLine", + "value": "/usr/bin/env babel-node", + "start": 0, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 25 + } + } + } + ] + } + ], + "directives": [] + }, + "comments": [ + { + "type": "CommentLine", + "value": "/usr/bin/env babel-node", + "start": 0, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 25 + } + } + } + ] +} diff --git a/test/fixtures/comments/basic/shebang-import/options.json b/test/fixtures/comments/basic/shebang-import/options.json new file mode 100644 index 0000000000..2104ca4328 --- /dev/null +++ b/test/fixtures/comments/basic/shebang-import/options.json @@ -0,0 +1,3 @@ +{ + "sourceType": "module" +} diff --git a/test/fixtures/comments/basic/shebang-object/actual.js b/test/fixtures/comments/basic/shebang-object/actual.js new file mode 100755 index 0000000000..a61adc7c27 --- /dev/null +++ b/test/fixtures/comments/basic/shebang-object/actual.js @@ -0,0 +1,3 @@ +#!/usr/bin/env babel-node + +var { spawn } = x; diff --git a/test/fixtures/comments/basic/shebang-object/expected.json b/test/fixtures/comments/basic/shebang-object/expected.json new file mode 100644 index 0000000000..199d8d452a --- /dev/null +++ b/test/fixtures/comments/basic/shebang-object/expected.json @@ -0,0 +1,189 @@ +{ + "type": "File", + "start": 0, + "end": 45, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 18 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 45, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 18 + } + }, + "sourceType": "script", + "body": [ + { + "type": "VariableDeclaration", + "start": 27, + "end": 45, + "loc": { + "start": { + "line": 3, + "column": 0 + }, + "end": { + "line": 3, + "column": 18 + } + }, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 31, + "end": 44, + "loc": { + "start": { + "line": 3, + "column": 4 + }, + "end": { + "line": 3, + "column": 17 + } + }, + "id": { + "type": "ObjectPattern", + "start": 31, + "end": 40, + "loc": { + "start": { + "line": 3, + "column": 4 + }, + "end": { + "line": 3, + "column": 13 + } + }, + "properties": [ + { + "type": "ObjectProperty", + "start": 33, + "end": 38, + "loc": { + "start": { + "line": 3, + "column": 6 + }, + "end": { + "line": 3, + "column": 11 + } + }, + "method": false, + "shorthand": true, + "computed": false, + "key": { + "type": "Identifier", + "start": 33, + "end": 38, + "loc": { + "start": { + "line": 3, + "column": 6 + }, + "end": { + "line": 3, + "column": 11 + } + }, + "name": "spawn" + }, + "value": { + "type": "Identifier", + "start": 33, + "end": 38, + "loc": { + "start": { + "line": 3, + "column": 6 + }, + "end": { + "line": 3, + "column": 11 + } + }, + "name": "spawn" + }, + "extra": { + "shorthand": true + } + } + ] + }, + "init": { + "type": "Identifier", + "start": 43, + "end": 44, + "loc": { + "start": { + "line": 3, + "column": 16 + }, + "end": { + "line": 3, + "column": 17 + } + }, + "name": "x" + } + } + ], + "kind": "var", + "leadingComments": [ + { + "type": "CommentLine", + "value": "/usr/bin/env babel-node", + "start": 0, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 25 + } + } + } + ] + } + ], + "directives": [] + }, + "comments": [ + { + "type": "CommentLine", + "value": "/usr/bin/env babel-node", + "start": 0, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 25 + } + } + } + ] +}