@@ -60,27 +60,36 @@ impl ESTree for ExpressionStatementDirective<'_, '_> {
6060 if (body !== null && body.type === 'TSModuleDeclaration') {
6161 let innerId = body.id;
6262 if (innerId.type === 'Identifier') {
63+ let start, end;
6364 id = {
6465 type: 'TSQualifiedName',
6566 left: id,
6667 right: innerId,
67- start: id.start,
68- end: innerId.end,
68+ start: start = id.start,
69+ end: end = innerId.end,
70+ ...(RANGE && { range: [start, end] }),
6971 };
7072 } else {
7173 // Replace `left` of innermost `TSQualifiedName` with a nested `TSQualifiedName` with `id` of
7274 // this module on left, and previous `left` of innermost `TSQualifiedName` on right
7375 while (true) {
74- innerId.start = id.start;
76+ if (RANGE) {
77+ innerId.start = innerId.range[0] = id.start;
78+ } else {
79+ innerId.start = id.start;
80+ }
7581 if (innerId.left.type === 'Identifier') break;
7682 innerId = innerId.left;
7783 }
84+
85+ let start, end;
7886 innerId.left = {
7987 type: 'TSQualifiedName',
8088 left: id,
8189 right: innerId.left,
82- start: id.start,
83- end: innerId.left.end,
90+ start: start = id.start,
91+ end: end = innerId.left.end,
92+ ...(RANGE && { range: [start, end] }),
8493 };
8594 id = body.id;
8695 }
@@ -89,8 +98,18 @@ impl ESTree for ExpressionStatementDirective<'_, '_> {
8998
9099 // Skip `body` field if `null`
91100 const node = body === null
92- ? { type: 'TSModuleDeclaration', id, kind, declare, global, start, end }
93- : { type: 'TSModuleDeclaration', id, body, kind, declare, global, start, end };
101+ ? {
102+ type: 'TSModuleDeclaration',
103+ id, kind, declare, global,
104+ start, end,
105+ ...(RANGE && { range: [start, end] })
106+ }
107+ : {
108+ type: 'TSModuleDeclaration',
109+ id, body, kind, declare, global,
110+ start, end,
111+ ...(RANGE && { range: [start, end] })
112+ };
94113 node
95114" ) ]
96115pub struct TSModuleDeclarationConverter < ' a , ' b > ( pub & ' b TSModuleDeclaration < ' a > ) ;
@@ -273,26 +292,30 @@ impl ESTree for TSMappedTypeConstraint<'_, '_> {
273292 let expression = DESER[TSTypeName](POS_OFFSET.expression);
274293 if (expression.type === 'TSQualifiedName') {
275294 let object = expression.left;
295+ let start, end;
276296 let parent = expression = {
277297 type: 'MemberExpression',
278298 object,
279299 property: expression.right,
280300 optional: false,
281301 computed: false,
282- start: expression.start,
283- end: expression.end,
302+ start: start = expression.start,
303+ end: end = expression.end,
304+ ...(RANGE && { range: [start, end] }),
284305 };
285306
286307 while (object.type === 'TSQualifiedName') {
287308 const { left } = object;
309+ let start, end;
288310 parent = parent.object = {
289311 type: 'MemberExpression',
290312 object: left,
291313 property: object.right,
292314 optional: false,
293315 computed: false,
294- start: object.start,
295- end: object.end,
316+ start: start = object.start,
317+ end: end = object.end,
318+ ...(RANGE && { range: [start, end] }),
296319 };
297320 object = left;
298321 }
@@ -415,11 +438,13 @@ impl ESTree for TSFunctionTypeParams<'_, '_> {
415438#[ estree( raw_deser = "
416439 let node = DESER[TSType](POS_OFFSET.type_annotation);
417440 if (preserveParens) {
441+ let start, end;
418442 node = {
419443 type: 'TSParenthesizedType',
420444 typeAnnotation: node,
421- start: DESER[u32]( POS_OFFSET.span.start ),
422- end: DESER[u32]( POS_OFFSET.span.end ),
445+ start: start = DESER[u32]( POS_OFFSET.span.start ),
446+ end: end = DESER[u32]( POS_OFFSET.span.end ),
447+ ...(RANGE && { range: [start, end] }),
423448 };
424449 }
425450 node
0 commit comments