Skip to content

Commit f6ac109

Browse files
authored
fix(49704): Code folding not working in file with simple syntax error (#49743)
* fix(49704): parse type arguments in super call expression * omit duplicate errors
1 parent 7f3ca9f commit f6ac109

File tree

7 files changed

+19
-3
lines changed

7 files changed

+19
-3
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30780,7 +30780,7 @@ namespace ts {
3078030780

3078130781
let typeArguments: NodeArray<TypeNode> | undefined;
3078230782

30783-
if (!isDecorator) {
30783+
if (!isDecorator && !isSuperCall(node)) {
3078430784
typeArguments = (node as CallExpression).typeArguments;
3078530785

3078630786
// We already perform checking on the type arguments on the class declaration itself.

src/compiler/parser.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5285,12 +5285,15 @@ namespace ts {
52855285

52865286
function parseSuperExpression(): MemberExpression {
52875287
const pos = getNodePos();
5288-
const expression = parseTokenNode<PrimaryExpression>();
5288+
let expression = parseTokenNode<MemberExpression>();
52895289
if (token() === SyntaxKind.LessThanToken) {
52905290
const startPos = getNodePos();
52915291
const typeArguments = tryParse(parseTypeArgumentsInExpression);
52925292
if (typeArguments !== undefined) {
52935293
parseErrorAt(startPos, getNodePos(), Diagnostics.super_may_not_use_type_arguments);
5294+
if (!isTemplateStartOfTaggedTemplate()) {
5295+
expression = factory.createExpressionWithTypeArguments(expression, typeArguments);
5296+
}
52945297
}
52955298
}
52965299

tests/baselines/reference/parserSuperExpression2.symbols

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ class C {
66
>M : Symbol(C.M, Decl(parserSuperExpression2.ts, 0, 9))
77

88
super<T>(0);
9+
>T : Symbol(T)
910
}
1011
}

tests/baselines/reference/superWithTypeArgument.symbols

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ class D<T> extends C {
1212
constructor() {
1313
super<T>();
1414
>super : Symbol(C, Decl(superWithTypeArgument.ts, 0, 0))
15+
>T : Symbol(T, Decl(superWithTypeArgument.ts, 4, 8))
1516
}
1617
}

tests/baselines/reference/superWithTypeArgument2.symbols

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class D<T> extends C<T> {
1919

2020
super<T>(x);
2121
>super : Symbol(C, Decl(superWithTypeArgument2.ts, 0, 0))
22+
>T : Symbol(T, Decl(superWithTypeArgument2.ts, 4, 8))
2223
>x : Symbol(x, Decl(superWithTypeArgument2.ts, 5, 16))
2324
}
2425
}

tests/baselines/reference/superWithTypeArgument3.symbols

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class D<T> extends C<T> {
2323
constructor() {
2424
super<T>();
2525
>super : Symbol(C, Decl(superWithTypeArgument3.ts, 0, 0))
26+
>T : Symbol(T, Decl(superWithTypeArgument3.ts, 5, 8))
2627
}
2728
bar() {
2829
>bar : Symbol(D.bar, Decl(superWithTypeArgument3.ts, 8, 5))

tests/cases/fourslash/getOutliningSpans.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,15 @@
114114
//// 2
115115
//// ]|]
116116
////)|];
117-
117+
////
118+
////class C<T>[| {
119+
//// foo: T;
120+
////}|]
121+
////
122+
////class D<T> extends C<T>[| {
123+
//// constructor(x)[| {
124+
//// super<T>(x);
125+
//// }|]
126+
////}|]
118127

119128
verify.outliningSpansInCurrentFile(test.ranges(), "code");

0 commit comments

Comments
 (0)