Skip to content

Commit c2e48e5

Browse files
authored
Fixed declaration emit issue related to a qualifier being reused cross-file (#58810)
1 parent 5628973 commit c2e48e5

File tree

5 files changed

+170
-8
lines changed

5 files changed

+170
-8
lines changed

src/compiler/checker.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8710,7 +8710,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
87108710
}
87118711
if (isJSDocTypeLiteral(node)) {
87128712
return factory.createTypeLiteralNode(map(node.jsDocPropertyTags, t => {
8713-
const name = isIdentifier(t.name) ? t.name : t.name.right;
8713+
const name = visitNode(isIdentifier(t.name) ? t.name : t.name.right, visitExistingNodeTreeSymbols, isIdentifier)!;
87148714
const typeViaParent = getTypeOfPropertyOfType(getTypeFromTypeNode(context, node), name.escapedText);
87158715
const overrideTypeNode = typeViaParent && t.typeExpression && getTypeFromTypeNode(context, t.typeExpression.type) !== typeViaParent ? typeToTypeNodeHelper(typeViaParent, context) : undefined;
87168716

@@ -8749,7 +8749,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
87498749
/*modifiers*/ undefined,
87508750
getEffectiveDotDotDotForParameter(p),
87518751
setTextRange(context, factory.createIdentifier(getNameForJSDocFunctionParameter(p, i)), p),
8752-
p.questionToken,
8752+
factory.cloneNode(p.questionToken),
87538753
visitNode(p.type, visitExistingNodeTreeSymbols, isTypeNode),
87548754
/*initializer*/ undefined,
87558755
)),
@@ -8764,7 +8764,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
87648764
/*modifiers*/ undefined,
87658765
getEffectiveDotDotDotForParameter(p),
87668766
setTextRange(context, factory.createIdentifier(getNameForJSDocFunctionParameter(p, i)), p),
8767-
p.questionToken,
8767+
factory.cloneNode(p.questionToken),
87688768
visitNode(p.type, visitExistingNodeTreeSymbols, isTypeNode),
87698769
/*initializer*/ undefined,
87708770
)),
@@ -8782,7 +8782,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
87828782
if (isTypeParameterDeclaration(node)) {
87838783
return factory.updateTypeParameterDeclaration(
87848784
node,
8785-
node.modifiers,
8785+
visitNodes(node.modifiers, visitExistingNodeTreeSymbols, isModifier),
87868786
setTextRange(context, typeParameterToName(getDeclaredTypeOfSymbol(getSymbolOfDeclaration(node)), context), node),
87878787
visitNode(node.constraint, visitExistingNodeTreeSymbols, isTypeNode),
87888788
visitNode(node.default, visitExistingNodeTreeSymbols, isTypeNode),
@@ -8823,8 +8823,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
88238823
return factory.updateImportTypeNode(
88248824
node,
88258825
factory.updateLiteralTypeNode(node.argument, rewriteModuleSpecifier(node, node.argument.literal)),
8826-
node.attributes,
8827-
node.qualifier,
8826+
visitNode(node.attributes, visitExistingNodeTreeSymbols, isImportAttributes),
8827+
visitNode(node.qualifier, visitExistingNodeTreeSymbols, isEntityName),
88288828
visitNodes(node.typeArguments, visitExistingNodeTreeSymbols, isTypeNode),
88298829
node.isTypeOf,
88308830
);
@@ -8903,9 +8903,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
89038903
parameterName = result;
89048904
}
89058905
else {
8906-
parameterName = node.parameterName;
8906+
parameterName = factory.cloneNode(node.parameterName);
89078907
}
8908-
return factory.updateTypePredicateNode(node, node.assertsModifier, parameterName, visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode));
8908+
return factory.updateTypePredicateNode(node, factory.cloneNode(node.assertsModifier), parameterName, visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode));
89098909
}
89108910

89118911
if (isTupleTypeNode(node) || isTypeLiteralNode(node) || isMappedTypeNode(node)) {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
//// [tests/cases/compiler/declarationEmitTopLevelNodeFromCrossFile2.ts] ////
2+
3+
//// [a.ts]
4+
import { boxedBox } from "./boxedBox";
5+
6+
export const _ = boxedBox;
7+
8+
// At index 83
9+
/**
10+
* wat
11+
*/
12+
13+
//// [boxedBox.d.ts]
14+
export declare const boxedBox: import("./box").Box<{
15+
boxed: import("./box").Box<number>;
16+
}>; // ^This is index 83 in this file
17+
18+
//// [box.d.ts]
19+
export declare class Box<T> {
20+
value: T;
21+
constructor(value: T);
22+
}
23+
export declare function box<T>(value: T): Box<T>;
24+
25+
//// [a.js]
26+
"use strict";
27+
Object.defineProperty(exports, "__esModule", { value: true });
28+
exports._ = void 0;
29+
var boxedBox_1 = require("./boxedBox");
30+
exports._ = boxedBox_1.boxedBox;
31+
// At index 83
32+
/**
33+
* wat
34+
*/
35+
36+
37+
//// [a.d.ts]
38+
export declare const _: import("./box").Box<{
39+
boxed: import("./box").Box<number>;
40+
}>;
41+
/**
42+
* wat
43+
*/
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
//// [tests/cases/compiler/declarationEmitTopLevelNodeFromCrossFile2.ts] ////
2+
3+
=== a.ts ===
4+
import { boxedBox } from "./boxedBox";
5+
>boxedBox : Symbol(boxedBox, Decl(a.ts, 0, 8))
6+
7+
export const _ = boxedBox;
8+
>_ : Symbol(_, Decl(a.ts, 2, 12))
9+
>boxedBox : Symbol(boxedBox, Decl(a.ts, 0, 8))
10+
11+
// At index 83
12+
/**
13+
* wat
14+
*/
15+
16+
=== boxedBox.d.ts ===
17+
export declare const boxedBox: import("./box").Box<{
18+
>boxedBox : Symbol(boxedBox, Decl(boxedBox.d.ts, 0, 20))
19+
>Box : Symbol(Box, Decl(box.d.ts, 0, 0))
20+
21+
boxed: import("./box").Box<number>;
22+
>boxed : Symbol(boxed, Decl(boxedBox.d.ts, 0, 52))
23+
>Box : Symbol(Box, Decl(box.d.ts, 0, 0))
24+
25+
}>; // ^This is index 83 in this file
26+
27+
=== box.d.ts ===
28+
export declare class Box<T> {
29+
>Box : Symbol(Box, Decl(box.d.ts, 0, 0))
30+
>T : Symbol(T, Decl(box.d.ts, 0, 25))
31+
32+
value: T;
33+
>value : Symbol(Box.value, Decl(box.d.ts, 0, 29))
34+
>T : Symbol(T, Decl(box.d.ts, 0, 25))
35+
36+
constructor(value: T);
37+
>value : Symbol(value, Decl(box.d.ts, 2, 16))
38+
>T : Symbol(T, Decl(box.d.ts, 0, 25))
39+
}
40+
export declare function box<T>(value: T): Box<T>;
41+
>box : Symbol(box, Decl(box.d.ts, 3, 1))
42+
>T : Symbol(T, Decl(box.d.ts, 4, 28))
43+
>value : Symbol(value, Decl(box.d.ts, 4, 31))
44+
>T : Symbol(T, Decl(box.d.ts, 4, 28))
45+
>Box : Symbol(Box, Decl(box.d.ts, 0, 0))
46+
>T : Symbol(T, Decl(box.d.ts, 4, 28))
47+
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//// [tests/cases/compiler/declarationEmitTopLevelNodeFromCrossFile2.ts] ////
2+
3+
=== a.ts ===
4+
import { boxedBox } from "./boxedBox";
5+
>boxedBox : import("box").Box<{ boxed: import("box").Box<number>; }>
6+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^
7+
8+
export const _ = boxedBox;
9+
>_ : import("box").Box<{ boxed: import("box").Box<number>; }>
10+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^
11+
>boxedBox : import("box").Box<{ boxed: import("box").Box<number>; }>
12+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^
13+
14+
// At index 83
15+
/**
16+
* wat
17+
*/
18+
19+
=== boxedBox.d.ts ===
20+
export declare const boxedBox: import("./box").Box<{
21+
>boxedBox : import("box").Box<{ boxed: import("./box").Box<number>; }>
22+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^
23+
24+
boxed: import("./box").Box<number>;
25+
>boxed : import("box").Box<number>
26+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
27+
28+
}>; // ^This is index 83 in this file
29+
30+
=== box.d.ts ===
31+
export declare class Box<T> {
32+
>Box : Box<T>
33+
> : ^^^^^^
34+
35+
value: T;
36+
>value : T
37+
> : ^
38+
39+
constructor(value: T);
40+
>value : T
41+
> : ^
42+
}
43+
export declare function box<T>(value: T): Box<T>;
44+
>box : <T>(value: T) => Box<T>
45+
> : ^ ^^ ^^ ^^^^^
46+
>value : T
47+
> : ^
48+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// @strict: true
2+
// @declaration: true
3+
4+
// @filename: a.ts
5+
import { boxedBox } from "./boxedBox";
6+
7+
export const _ = boxedBox;
8+
9+
// At index 83
10+
/**
11+
* wat
12+
*/
13+
14+
// @filename: boxedBox.d.ts
15+
export declare const boxedBox: import("./box").Box<{
16+
boxed: import("./box").Box<number>;
17+
}>; // ^This is index 83 in this file
18+
19+
// @filename: box.d.ts
20+
export declare class Box<T> {
21+
value: T;
22+
constructor(value: T);
23+
}
24+
export declare function box<T>(value: T): Box<T>;

0 commit comments

Comments
 (0)