diff --git a/internal/ast/ast.go b/internal/ast/ast.go index ea6d64104d..52206b9237 100644 --- a/internal/ast/ast.go +++ b/internal/ast/ast.go @@ -183,11 +183,11 @@ func (list *NodeList) Pos() int { return list.Loc.Pos() } func (list *NodeList) End() int { return list.Loc.End() } func (list *NodeList) HasTrailingComma() bool { - if len(list.Nodes) == 0 || PositionIsSynthesized(list.End()) { + if len(list.Nodes) == 0 { return false } last := list.Nodes[len(list.Nodes)-1] - return !PositionIsSynthesized(last.End()) && last.End() < list.End() + return last.End() < list.End() } func (list *NodeList) Clone(f NodeFactoryCoercible) *NodeList { diff --git a/internal/ast/deepclone.go b/internal/ast/deepclone.go index d359b00c39..48e9b4893d 100644 --- a/internal/ast/deepclone.go +++ b/internal/ast/deepclone.go @@ -9,6 +9,9 @@ func getDeepCloneVisitor(f *NodeFactory, syntheticLocation bool) *NodeVisitor { func(node *Node) *Node { visited := visitor.VisitEachChild(node) if visited != node { + if syntheticLocation { + visited.Loc = core.NewTextRange(-1, -1) + } return visited } c := node.Clone(f) // forcibly clone leaf nodes, which will then cascade new nodes/arrays upwards via `update` calls @@ -26,21 +29,39 @@ func getDeepCloneVisitor(f *NodeFactory, syntheticLocation bool) *NodeVisitor { if nodes == nil { return nil } - // force update empty lists - if len(nodes.Nodes) == 0 { - return nodes.Clone(v.Factory) + visited := v.VisitNodes(nodes) + var newList *NodeList + if visited != nodes { + newList = visited + } else { + newList = nodes.Clone(v.Factory) + } + if syntheticLocation { + newList.Loc = core.NewTextRange(-1, -1) + if nodes.HasTrailingComma() { + newList.Nodes[len(newList.Nodes)-1].Loc = core.NewTextRange(-2, -2) + } } - return v.VisitNodes(nodes) + return newList }, VisitModifiers: func(nodes *ModifierList, v *NodeVisitor) *ModifierList { if nodes == nil { return nil } - // force update empty lists - if len(nodes.Nodes) == 0 { - return nodes.Clone(v.Factory) + visited := v.VisitModifiers(nodes) + var newList *ModifierList + if visited != nodes { + newList = visited + } else { + newList = nodes.Clone(v.Factory) + } + if syntheticLocation { + newList.Loc = core.NewTextRange(-1, -1) + if nodes.HasTrailingComma() { + newList.Nodes[len(newList.Nodes)-1].Loc = core.NewTextRange(-2, -2) + } } - return v.VisitModifiers(nodes) + return newList }, }, ) diff --git a/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.js b/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.js new file mode 100644 index 0000000000..e76b2fcda6 --- /dev/null +++ b/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.js @@ -0,0 +1,53 @@ +//// [tests/cases/compiler/declarationEmitNoCrashOnCrossFileNode.ts] //// + +//// [index.ts] +import { foo } from './other'; +export class Foo { + public bar = foo(); +} +//// [other.ts] +/** + * Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eu aliquet lectus, nec rhoncus metus. Donec dapibus consectetur risus vitae porta. Aenean nisi neque, dignissim quis varius vel, volutpat vel tellus. Praesent lacinia molestie est, vel convallis odio ornare id. Pellentesque quis purus ante. Morbi a nisl justo. Etiam malesuada ipsum sem, fringilla rhoncus turpis ullamcorper et. Aenean laoreet, nisl id tempus pellentesque, elit elit congue felis, sit amet luctus nulla orci sit amet velit. Praesent non tincidunt nisi, at tempor eros. Quisque tincidunt euismod posuere. Ut blandit mauris elit, a porttitor orci aliquam ac. Duis imperdiet gravida ultrices. In. + */ + +export function foo(): ({ a, b }: { a: string, b: string }) => void { + return () => {} +} + +//// [other.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.foo = foo; +/** + * Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eu aliquet lectus, nec rhoncus metus. Donec dapibus consectetur risus vitae porta. Aenean nisi neque, dignissim quis varius vel, volutpat vel tellus. Praesent lacinia molestie est, vel convallis odio ornare id. Pellentesque quis purus ante. Morbi a nisl justo. Etiam malesuada ipsum sem, fringilla rhoncus turpis ullamcorper et. Aenean laoreet, nisl id tempus pellentesque, elit elit congue felis, sit amet luctus nulla orci sit amet velit. Praesent non tincidunt nisi, at tempor eros. Quisque tincidunt euismod posuere. Ut blandit mauris elit, a porttitor orci aliquam ac. Duis imperdiet gravida ultrices. In. + */ +function foo() { + return () => { }; +} +//// [index.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Foo = void 0; +const other_1 = require("./other"); +class Foo { + bar = (0, other_1.foo)(); +} +exports.Foo = Foo; + + +//// [other.d.ts] +/** + * Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eu aliquet lectus, nec rhoncus metus. Donec dapibus consectetur risus vitae porta. Aenean nisi neque, dignissim quis varius vel, volutpat vel tellus. Praesent lacinia molestie est, vel convallis odio ornare id. Pellentesque quis purus ante. Morbi a nisl justo. Etiam malesuada ipsum sem, fringilla rhoncus turpis ullamcorper et. Aenean laoreet, nisl id tempus pellentesque, elit elit congue felis, sit amet luctus nulla orci sit amet velit. Praesent non tincidunt nisi, at tempor eros. Quisque tincidunt euismod posuere. Ut blandit mauris elit, a porttitor orci aliquam ac. Duis imperdiet gravida ultrices. In. + */ +export declare function foo(): ({ a, b }: { + a: string; + b: string; +}) => void; +//# sourceMappingURL=other.d.ts.map//// [index.d.ts] +export declare class Foo { + bar: ({ a, b }: { + a: string; + b: string; + }) => void; +} +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.js.map b/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.js.map new file mode 100644 index 0000000000..41df270097 --- /dev/null +++ b/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.js.map @@ -0,0 +1,7 @@ +//// [index.d.ts.map] +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AACA,qBAAa,GAAG;IACL,GAAG;;;eAAS;CACtB"} +//// https://sokra.github.io/source-map-visualization#base64,ZXhwb3J0IGRlY2xhcmUgY2xhc3MgRm9vIHsNCiAgICBiYXI6ICh7IGEsIGIgfTogew0KICAgICAgICBhOiBzdHJpbmc7DQogICAgICAgIGI6IHN0cmluZzsNCiAgICB9KSA9PiB2b2lkOw0KfQ0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZC50cy5tYXA=,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLHFCQUFhLEdBQUc7SUFDTCxHQUFHOzs7ZUFBUztDQUN0QiJ9,aW1wb3J0IHsgZm9vIH0gZnJvbSAnLi9vdGhlcic7CmV4cG9ydCBjbGFzcyBGb28gewogICAgcHVibGljIGJhciA9IGZvbygpOwp9 + +//// [other.d.ts.map] +{"version":3,"file":"other.d.ts","sourceRoot":"","sources":["other.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,CAElE"} +//// https://sokra.github.io/source-map-visualization#base64,LyoqDQogKiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LiBNYXVyaXMgZXUgYWxpcXVldCBsZWN0dXMsIG5lYyByaG9uY3VzIG1ldHVzLiBEb25lYyBkYXBpYnVzIGNvbnNlY3RldHVyIHJpc3VzIHZpdGFlIHBvcnRhLiBBZW5lYW4gbmlzaSBuZXF1ZSwgZGlnbmlzc2ltIHF1aXMgdmFyaXVzIHZlbCwgdm9sdXRwYXQgdmVsIHRlbGx1cy4gUHJhZXNlbnQgbGFjaW5pYSBtb2xlc3RpZSBlc3QsIHZlbCBjb252YWxsaXMgb2RpbyBvcm5hcmUgaWQuIFBlbGxlbnRlc3F1ZSBxdWlzIHB1cnVzIGFudGUuIE1vcmJpIGEgbmlzbCBqdXN0by4gRXRpYW0gbWFsZXN1YWRhIGlwc3VtIHNlbSwgZnJpbmdpbGxhIHJob25jdXMgdHVycGlzIHVsbGFtY29ycGVyIGV0LiBBZW5lYW4gbGFvcmVldCwgbmlzbCBpZCB0ZW1wdXMgcGVsbGVudGVzcXVlLCBlbGl0IGVsaXQgY29uZ3VlIGZlbGlzLCBzaXQgYW1ldCBsdWN0dXMgbnVsbGEgb3JjaSBzaXQgYW1ldCB2ZWxpdC4gUHJhZXNlbnQgbm9uIHRpbmNpZHVudCBuaXNpLCBhdCB0ZW1wb3IgZXJvcy4gUXVpc3F1ZSB0aW5jaWR1bnQgZXVpc21vZCBwb3N1ZXJlLiBVdCBibGFuZGl0IG1hdXJpcyBlbGl0LCBhIHBvcnR0aXRvciBvcmNpIGFsaXF1YW0gYWMuIER1aXMgaW1wZXJkaWV0IGdyYXZpZGEgdWx0cmljZXMuIEluLg0KICovDQpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBmb28oKTogKHsgYSwgYiB9OiB7DQogICAgYTogc3RyaW5nOw0KICAgIGI6IHN0cmluZzsNCn0pID0+IHZvaWQ7DQovLyMgc291cmNlTWFwcGluZ1VSTD1vdGhlci5kLnRzLm1hcA==,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RoZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm90aGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsd0JBQWdCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUFDLENBQUMsRUFBRSxNQUFNLENBQUE7Q0FBRSxLQUFLLElBQUksQ0FFbEUifQ==,LyoqCiAqIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuIE1hdXJpcyBldSBhbGlxdWV0IGxlY3R1cywgbmVjIHJob25jdXMgbWV0dXMuIERvbmVjIGRhcGlidXMgY29uc2VjdGV0dXIgcmlzdXMgdml0YWUgcG9ydGEuIEFlbmVhbiBuaXNpIG5lcXVlLCBkaWduaXNzaW0gcXVpcyB2YXJpdXMgdmVsLCB2b2x1dHBhdCB2ZWwgdGVsbHVzLiBQcmFlc2VudCBsYWNpbmlhIG1vbGVzdGllIGVzdCwgdmVsIGNvbnZhbGxpcyBvZGlvIG9ybmFyZSBpZC4gUGVsbGVudGVzcXVlIHF1aXMgcHVydXMgYW50ZS4gTW9yYmkgYSBuaXNsIGp1c3RvLiBFdGlhbSBtYWxlc3VhZGEgaXBzdW0gc2VtLCBmcmluZ2lsbGEgcmhvbmN1cyB0dXJwaXMgdWxsYW1jb3JwZXIgZXQuIEFlbmVhbiBsYW9yZWV0LCBuaXNsIGlkIHRlbXB1cyBwZWxsZW50ZXNxdWUsIGVsaXQgZWxpdCBjb25ndWUgZmVsaXMsIHNpdCBhbWV0IGx1Y3R1cyBudWxsYSBvcmNpIHNpdCBhbWV0IHZlbGl0LiBQcmFlc2VudCBub24gdGluY2lkdW50IG5pc2ksIGF0IHRlbXBvciBlcm9zLiBRdWlzcXVlIHRpbmNpZHVudCBldWlzbW9kIHBvc3VlcmUuIFV0IGJsYW5kaXQgbWF1cmlzIGVsaXQsIGEgcG9ydHRpdG9yIG9yY2kgYWxpcXVhbSBhYy4gRHVpcyBpbXBlcmRpZXQgZ3JhdmlkYSB1bHRyaWNlcy4gSW4uCiAqLwoKZXhwb3J0IGZ1bmN0aW9uIGZvbygpOiAoeyBhLCBiIH06IHsgYTogc3RyaW5nLCBiOiBzdHJpbmcgfSkgPT4gdm9pZCB7CiAgICByZXR1cm4gKCkgPT4ge30KfQ== diff --git a/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.sourcemap.txt b/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.sourcemap.txt new file mode 100644 index 0000000000..5a2bdbbe2a --- /dev/null +++ b/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.sourcemap.txt @@ -0,0 +1,161 @@ +=================================================================== +JsFile: other.d.ts +mapUrl: other.d.ts.map +sourceRoot: +sources: other.ts +=================================================================== +------------------------------------------------------------------- +emittedFile:/other.d.ts +sourceFile:other.ts +------------------------------------------------------------------- +>>>/** +1 > +2 >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-> +1 > +1 >Emitted(1, 1) Source(1, 1) + SourceIndex(0) +--- +>>> * Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eu aliquet lectus, nec rhoncus metus. Donec dapibus consectetur risus vitae porta. Aenean nisi neque, dignissim quis varius vel, volutpat vel tellus. Praesent lacinia molestie est, vel convallis odio ornare id. Pellentesque quis purus ante. Morbi a nisl justo. Etiam malesuada ipsum sem, fringilla rhoncus turpis ullamcorper et. Aenean laoreet, nisl id tempus pellentesque, elit elit congue felis, sit amet luctus nulla orci sit amet velit. Praesent non tincidunt nisi, at tempor eros. Quisque tincidunt euismod posuere. Ut blandit mauris elit, a porttitor orci aliquam ac. Duis imperdiet gravida ultrices. In. +>>> */ +1->^^^ +2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-> +1->/** + > * Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eu aliquet lectus, nec rhoncus metus. Donec dapibus consectetur risus vitae porta. Aenean nisi neque, dignissim quis varius vel, volutpat vel tellus. Praesent lacinia molestie est, vel convallis odio ornare id. Pellentesque quis purus ante. Morbi a nisl justo. Etiam malesuada ipsum sem, fringilla rhoncus turpis ullamcorper et. Aenean laoreet, nisl id tempus pellentesque, elit elit congue felis, sit amet luctus nulla orci sit amet velit. Praesent non tincidunt nisi, at tempor eros. Quisque tincidunt euismod posuere. Ut blandit mauris elit, a porttitor orci aliquam ac. Duis imperdiet gravida ultrices. In. + > */ +1->Emitted(3, 4) Source(3, 4) + SourceIndex(0) +--- +>>>export declare function foo(): ({ a, b }: { +1-> +2 >^^^^^^^^^^^^^^^^^^^^^^^^ +3 > ^^^ +4 > ^^^^ +5 > ^ +6 > ^^ +7 > ^ +8 > ^^ +9 > ^ +10> ^^ +11> ^^ +1-> + > + > +2 >export function +3 > foo +4 > (): +5 > ( +6 > { +7 > a +8 > , +9 > b +10> } +11> : +1->Emitted(4, 1) Source(5, 1) + SourceIndex(0) +2 >Emitted(4, 25) Source(5, 17) + SourceIndex(0) +3 >Emitted(4, 28) Source(5, 20) + SourceIndex(0) +4 >Emitted(4, 32) Source(5, 24) + SourceIndex(0) +5 >Emitted(4, 33) Source(5, 25) + SourceIndex(0) +6 >Emitted(4, 35) Source(5, 27) + SourceIndex(0) +7 >Emitted(4, 36) Source(5, 28) + SourceIndex(0) +8 >Emitted(4, 38) Source(5, 30) + SourceIndex(0) +9 >Emitted(4, 39) Source(5, 31) + SourceIndex(0) +10>Emitted(4, 41) Source(5, 33) + SourceIndex(0) +11>Emitted(4, 43) Source(5, 35) + SourceIndex(0) +--- +>>> a: string; +1 >^^^^ +2 > ^ +3 > ^^ +4 > ^^^^^^ +5 > ^ +6 > ^-> +1 >{ +2 > a +3 > : +4 > string +5 > , +1 >Emitted(5, 5) Source(5, 37) + SourceIndex(0) +2 >Emitted(5, 6) Source(5, 38) + SourceIndex(0) +3 >Emitted(5, 8) Source(5, 40) + SourceIndex(0) +4 >Emitted(5, 14) Source(5, 46) + SourceIndex(0) +5 >Emitted(5, 15) Source(5, 47) + SourceIndex(0) +--- +>>> b: string; +1->^^^^ +2 > ^ +3 > ^^ +4 > ^^^^^^ +5 > ^ +1-> +2 > b +3 > : +4 > string +5 > +1->Emitted(6, 5) Source(5, 48) + SourceIndex(0) +2 >Emitted(6, 6) Source(5, 49) + SourceIndex(0) +3 >Emitted(6, 8) Source(5, 51) + SourceIndex(0) +4 >Emitted(6, 14) Source(5, 57) + SourceIndex(0) +5 >Emitted(6, 15) Source(5, 57) + SourceIndex(0) +--- +>>>}) => void; +1 >^ +2 > ^^^^^ +3 > ^^^^ +4 > ^ +5 > ^^^^^^^^^^^^^^^^^^^^^^^-> +1 > } +2 > ) => +3 > void +4 > { + > return () => {} + > } +1 >Emitted(7, 2) Source(5, 59) + SourceIndex(0) +2 >Emitted(7, 7) Source(5, 64) + SourceIndex(0) +3 >Emitted(7, 11) Source(5, 68) + SourceIndex(0) +4 >Emitted(7, 12) Source(7, 2) + SourceIndex(0) +--- +>>>//# sourceMappingURL=other.d.ts.map=================================================================== +JsFile: index.d.ts +mapUrl: index.d.ts.map +sourceRoot: +sources: index.ts +=================================================================== +------------------------------------------------------------------- +emittedFile:/index.d.ts +sourceFile:index.ts +------------------------------------------------------------------- +>>>export declare class Foo { +1 > +2 >^^^^^^^^^^^^^^^^^^^^^ +3 > ^^^ +1 >import { foo } from './other'; + > +2 >export class +3 > Foo +1 >Emitted(1, 1) Source(2, 1) + SourceIndex(0) +2 >Emitted(1, 22) Source(2, 14) + SourceIndex(0) +3 >Emitted(1, 25) Source(2, 17) + SourceIndex(0) +--- +>>> bar: ({ a, b }: { +1 >^^^^ +2 > ^^^ +3 > ^^^^^^^^^^^^-> +1 > { + > public +2 > bar +1 >Emitted(2, 5) Source(3, 12) + SourceIndex(0) +2 >Emitted(2, 8) Source(3, 15) + SourceIndex(0) +--- +>>> a: string; +>>> b: string; +>>> }) => void; +1->^^^^^^^^^^^^^^^ +1-> = foo(); +1->Emitted(5, 16) Source(3, 24) + SourceIndex(0) +--- +>>>} +1 >^ +2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-> +1 > + >} +1 >Emitted(6, 2) Source(4, 2) + SourceIndex(0) +--- +>>>//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.symbols b/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.symbols new file mode 100644 index 0000000000..f7f382a453 --- /dev/null +++ b/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.symbols @@ -0,0 +1,27 @@ +//// [tests/cases/compiler/declarationEmitNoCrashOnCrossFileNode.ts] //// + +=== /index.ts === +import { foo } from './other'; +>foo : Symbol(foo, Decl(index.ts, 0, 8)) + +export class Foo { +>Foo : Symbol(Foo, Decl(index.ts, 0, 30)) + + public bar = foo(); +>bar : Symbol(Foo.bar, Decl(index.ts, 1, 18)) +>foo : Symbol(foo, Decl(index.ts, 0, 8)) +} +=== /other.ts === +/** + * Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eu aliquet lectus, nec rhoncus metus. Donec dapibus consectetur risus vitae porta. Aenean nisi neque, dignissim quis varius vel, volutpat vel tellus. Praesent lacinia molestie est, vel convallis odio ornare id. Pellentesque quis purus ante. Morbi a nisl justo. Etiam malesuada ipsum sem, fringilla rhoncus turpis ullamcorper et. Aenean laoreet, nisl id tempus pellentesque, elit elit congue felis, sit amet luctus nulla orci sit amet velit. Praesent non tincidunt nisi, at tempor eros. Quisque tincidunt euismod posuere. Ut blandit mauris elit, a porttitor orci aliquam ac. Duis imperdiet gravida ultrices. In. + */ + +export function foo(): ({ a, b }: { a: string, b: string }) => void { +>foo : Symbol(foo, Decl(other.ts, 0, 0)) +>a : Symbol(a, Decl(other.ts, 4, 25)) +>b : Symbol(b, Decl(other.ts, 4, 28)) +>a : Symbol(a, Decl(other.ts, 4, 35)) +>b : Symbol(b, Decl(other.ts, 4, 46)) + + return () => {} +} diff --git a/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.types b/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.types new file mode 100644 index 0000000000..c28e0acf8a --- /dev/null +++ b/testdata/baselines/reference/compiler/declarationEmitNoCrashOnCrossFileNode.types @@ -0,0 +1,29 @@ +//// [tests/cases/compiler/declarationEmitNoCrashOnCrossFileNode.ts] //// + +=== /index.ts === +import { foo } from './other'; +>foo : () => ({ a, b }: { a: string; b: string; }) => void + +export class Foo { +>Foo : Foo + + public bar = foo(); +>bar : ({ a, b }: { a: string; b: string; }) => void +>foo() : ({ a, b }: { a: string; b: string; }) => void +>foo : () => ({ a, b }: { a: string; b: string; }) => void +} +=== /other.ts === +/** + * Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eu aliquet lectus, nec rhoncus metus. Donec dapibus consectetur risus vitae porta. Aenean nisi neque, dignissim quis varius vel, volutpat vel tellus. Praesent lacinia molestie est, vel convallis odio ornare id. Pellentesque quis purus ante. Morbi a nisl justo. Etiam malesuada ipsum sem, fringilla rhoncus turpis ullamcorper et. Aenean laoreet, nisl id tempus pellentesque, elit elit congue felis, sit amet luctus nulla orci sit amet velit. Praesent non tincidunt nisi, at tempor eros. Quisque tincidunt euismod posuere. Ut blandit mauris elit, a porttitor orci aliquam ac. Duis imperdiet gravida ultrices. In. + */ + +export function foo(): ({ a, b }: { a: string, b: string }) => void { +>foo : () => ({ a, b }: { a: string; b: string; }) => void +>a : string +>b : string +>a : string +>b : string + + return () => {} +>() => {} : () => void +} diff --git a/testdata/baselines/reference/submodule/compiler/arrayBindingPatternOmittedExpressions.types b/testdata/baselines/reference/submodule/compiler/arrayBindingPatternOmittedExpressions.types index bf498ea9ee..4ca6d9253a 100644 --- a/testdata/baselines/reference/submodule/compiler/arrayBindingPatternOmittedExpressions.types +++ b/testdata/baselines/reference/submodule/compiler/arrayBindingPatternOmittedExpressions.types @@ -24,7 +24,7 @@ var results: string[]; function f([, a, , b, , , , s, , , ] = results) { ->f : ([, a, , b, , , , s, , ]?: string[]) => void +>f : ([, a, , b, , , , s, , ,]?: string[]) => void >a : string >b : string >s : string diff --git a/testdata/baselines/reference/submodule/compiler/arrayBindingPatternOmittedExpressions.types.diff b/testdata/baselines/reference/submodule/compiler/arrayBindingPatternOmittedExpressions.types.diff deleted file mode 100644 index c362aea18a..0000000000 --- a/testdata/baselines/reference/submodule/compiler/arrayBindingPatternOmittedExpressions.types.diff +++ /dev/null @@ -1,11 +0,0 @@ ---- old.arrayBindingPatternOmittedExpressions.types -+++ new.arrayBindingPatternOmittedExpressions.types -@@= skipped -23, +23 lines =@@ - - - function f([, a, , b, , , , s, , , ] = results) { -->f : ([, a, , b, , , , s, , ,]?: string[]) => void -+>f : ([, a, , b, , , , s, , ]?: string[]) => void - >a : string - >b : string - >s : string \ No newline at end of file diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuring5.types b/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuring5.types index fdb6000c99..e10e77b942 100644 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuring5.types +++ b/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuring5.types @@ -2,7 +2,7 @@ === declarationEmitDestructuring5.ts === function baz([, z, , ]) { } ->baz : ([, z, ]: [any, any, any?]) => void +>baz : ([, z, ,]: [any, any, any?]) => void >z : any function foo([, b, ]: [any, any]): void { } @@ -10,11 +10,11 @@ function foo([, b, ]: [any, any]): void { } >b : any function bar([z, , , ]) { } ->bar : ([z, , ]: [any, any?, any?]) => void +>bar : ([z, , ,]: [any, any?, any?]) => void >z : any function bar1([z, , , ] = [1, 3, 4, 6, 7]) { } ->bar1 : ([z, , ]?: [number, number, number, number, number]) => void +>bar1 : ([z, , ,]?: [number, number, number, number, number]) => void >z : number >[1, 3, 4, 6, 7] : [number, number, number, number, number] >1 : 1 @@ -24,6 +24,6 @@ function bar1([z, , , ] = [1, 3, 4, 6, 7]) { } >7 : 7 function bar2([,,z, , , ]) { } ->bar2 : ([, , z, , ]: [any, any, any, any?, any?]) => void +>bar2 : ([, , z, , ,]: [any, any, any, any?, any?]) => void >z : any diff --git a/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuring5.types.diff b/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuring5.types.diff deleted file mode 100644 index f96c8c47b3..0000000000 --- a/testdata/baselines/reference/submodule/compiler/declarationEmitDestructuring5.types.diff +++ /dev/null @@ -1,32 +0,0 @@ ---- old.declarationEmitDestructuring5.types -+++ new.declarationEmitDestructuring5.types -@@= skipped -1, +1 lines =@@ - - === declarationEmitDestructuring5.ts === - function baz([, z, , ]) { } -->baz : ([, z, ,]: [any, any, any?]) => void -+>baz : ([, z, ]: [any, any, any?]) => void - >z : any - - function foo([, b, ]: [any, any]): void { } -@@= skipped -8, +8 lines =@@ - >b : any - - function bar([z, , , ]) { } -->bar : ([z, , ,]: [any, any?, any?]) => void -+>bar : ([z, , ]: [any, any?, any?]) => void - >z : any - - function bar1([z, , , ] = [1, 3, 4, 6, 7]) { } -->bar1 : ([z, , ,]?: [number, number, number, number, number]) => void -+>bar1 : ([z, , ]?: [number, number, number, number, number]) => void - >z : number - >[1, 3, 4, 6, 7] : [number, number, number, number, number] - >1 : 1 -@@= skipped -14, +14 lines =@@ - >7 : 7 - - function bar2([,,z, , , ]) { } -->bar2 : ([, , z, , ,]: [any, any, any, any?, any?]) => void -+>bar2 : ([, , z, , ]: [any, any, any, any?, any?]) => void - >z : any diff --git a/testdata/tests/cases/compiler/declarationEmitNoCrashOnCrossFileNode.ts b/testdata/tests/cases/compiler/declarationEmitNoCrashOnCrossFileNode.ts new file mode 100644 index 0000000000..10cfcf99fa --- /dev/null +++ b/testdata/tests/cases/compiler/declarationEmitNoCrashOnCrossFileNode.ts @@ -0,0 +1,16 @@ +// @declaration: true +// @declarationMap: true + +// @filename: /index.ts +import { foo } from './other'; +export class Foo { + public bar = foo(); +} +// @filename: /other.ts +/** + * Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eu aliquet lectus, nec rhoncus metus. Donec dapibus consectetur risus vitae porta. Aenean nisi neque, dignissim quis varius vel, volutpat vel tellus. Praesent lacinia molestie est, vel convallis odio ornare id. Pellentesque quis purus ante. Morbi a nisl justo. Etiam malesuada ipsum sem, fringilla rhoncus turpis ullamcorper et. Aenean laoreet, nisl id tempus pellentesque, elit elit congue felis, sit amet luctus nulla orci sit amet velit. Praesent non tincidunt nisi, at tempor eros. Quisque tincidunt euismod posuere. Ut blandit mauris elit, a porttitor orci aliquam ac. Duis imperdiet gravida ultrices. In. + */ + +export function foo(): ({ a, b }: { a: string, b: string }) => void { + return () => {} +} \ No newline at end of file