Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions crates/oxc_linter/src/rules/typescript/array_type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1272,10 +1272,6 @@ const instance = new MyClass<number>(42);",
"type fooIntersection = Array<string & number>;",
Some(serde_json::json!([{"default":"array"}])),
),
("let x: Array;", Some(serde_json::json!([{"default":"array"}]))),
("let x: Array<>;", Some(serde_json::json!([{"default":"array"}]))),
("let x: Array;", Some(serde_json::json!([{"default":"array-simple"}]))),
("let x: Array<>;", Some(serde_json::json!([{"default":"array-simple"}]))),
(
"let x: Array<number> = [1] as number[];",
Some(serde_json::json!([{"default":"generic"}])),
Expand Down Expand Up @@ -1906,10 +1902,6 @@ export const test8 = testFn<Array<string>, number[]>([]);",
"type fooIntersection = (string & number)[];",
Some(serde_json::json!([{"default":"array"}])),
),
("let x: Array;", "let x: any[];", Some(serde_json::json!([{"default":"array"}]))),
("let x: Array<>;", "let x: any[];", Some(serde_json::json!([{"default":"array"}]))),
("let x: Array;", "let x: any[];", Some(serde_json::json!([{"default":"array-simple"}]))),
("let x: Array<>;", "let x: any[];", Some(serde_json::json!([{"default":"array-simple"}]))),
(
"let x: Array<number> = [1] as number[];",
"let x: Array<number> = [1] as Array<number>;",
Expand Down
28 changes: 0 additions & 28 deletions crates/oxc_linter/src/snapshots/typescript_array_type.snap
Original file line number Diff line number Diff line change
Expand Up @@ -541,34 +541,6 @@ source: crates/oxc_linter/src/tester.rs
╰────
help: Replace `Array<string & number>` with `(string & number)[]`.

⚠ typescript-eslint(array-type): Array type using 'Array<any>' is forbidden. Use 'any[]' instead.
╭─[array_type.ts:1:8]
1 │ let x: Array;
· ─────
╰────
help: Replace `Array` with `any[]`.

⚠ typescript-eslint(array-type): Array type using 'Array<any>' is forbidden. Use 'any[]' instead.
╭─[array_type.ts:1:8]
1 │ let x: Array<>;
· ───────
╰────
help: Replace `Array<>` with `any[]`.

⚠ typescript-eslint(array-type): Array type using 'Array<any>' is forbidden for simple types. Use 'any[]' instead.
╭─[array_type.ts:1:8]
1 │ let x: Array;
· ─────
╰────
help: Replace `Array` with `any[]`.

⚠ typescript-eslint(array-type): Array type using 'Array<any>' is forbidden for simple types. Use 'any[]' instead.
╭─[array_type.ts:1:8]
1 │ let x: Array<>;
· ───────
╰────
help: Replace `Array<>` with `any[]`.

⚠ typescript-eslint(array-type): Array type using 'number[]' is forbidden. Use 'Array<number>' instead.
╭─[array_type.ts:1:31]
1 │ let x: Array<number> = [1] as number[];
Expand Down
5 changes: 5 additions & 0 deletions crates/oxc_parser/src/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,11 @@ pub fn ts_empty_type_parameter_list(span: Span) -> OxcDiagnostic {
ts_error("1098", "Type parameter list cannot be empty.").with_label(span)
}

#[cold]
pub fn ts_empty_type_argument_list(span: Span) -> OxcDiagnostic {
ts_error("1099", "Type argument list cannot be empty.").with_label(span)
}

#[cold]
pub fn unexpected_super(span: Span) -> OxcDiagnostic {
OxcDiagnostic::error("'super' can only be used with function calls or in property accesses")
Expand Down
22 changes: 15 additions & 7 deletions crates/oxc_parser/src/ts/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -818,9 +818,11 @@ impl<'a> ParserImpl<'a> {
let (params, _) =
self.parse_delimited_list(Kind::RAngle, Kind::Comma, Self::parse_ts_type);
self.expect(Kind::RAngle);
return Some(
self.ast.alloc_ts_type_parameter_instantiation(self.end_span(span), params),
);
let span = self.end_span(span);
if params.is_empty() {
self.error(diagnostics::ts_empty_type_argument_list(span));
}
return Some(self.ast.alloc_ts_type_parameter_instantiation(span, params));
}
None
}
Expand All @@ -834,9 +836,11 @@ impl<'a> ParserImpl<'a> {
let (params, _) =
self.parse_delimited_list(Kind::RAngle, Kind::Comma, Self::parse_ts_type);
self.expect(Kind::RAngle);
return Some(
self.ast.alloc_ts_type_parameter_instantiation(self.end_span(span), params),
);
let span = self.end_span(span);
if params.is_empty() {
self.error(diagnostics::ts_empty_type_argument_list(span));
}
return Some(self.ast.alloc_ts_type_parameter_instantiation(span, params));
}
None
}
Expand All @@ -859,7 +863,11 @@ impl<'a> ParserImpl<'a> {
if !self.can_follow_type_arguments_in_expr() {
return self.unexpected();
}
self.ast.alloc_ts_type_parameter_instantiation(self.end_span(span), params)
let span = self.end_span(span);
if params.is_empty() {
self.error(diagnostics::ts_empty_type_argument_list(span));
}
self.ast.alloc_ts_type_parameter_instantiation(span, params)
}

fn can_follow_type_arguments_in_expr(&mut self) -> bool {
Expand Down
1 change: 1 addition & 0 deletions tasks/coverage/misc/fail/oxc-13617-1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
foo<>()
1 change: 1 addition & 0 deletions tasks/coverage/misc/fail/oxc-13617-2.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
new Foo<>()
1 change: 1 addition & 0 deletions tasks/coverage/misc/fail/oxc-13617-3.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
class Foo {property: Bar<> = 1}
1 change: 1 addition & 0 deletions tasks/coverage/misc/fail/oxc-13617-4.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
const foo: Foo<> = 1
130 changes: 97 additions & 33 deletions tasks/coverage/snapshots/parser_babel.snap
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ commit: 41d96516
parser_babel Summary:
AST Parsed : 2407/2423 (99.34%)
Positive Passed: 2385/2423 (98.43%)
Negative Passed: 1649/1755 (93.96%)
Negative Passed: 1665/1755 (94.87%)
Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/core/categorized/invalid-startindex-and-startline-specified-without-startcolumn/input.js

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/core/categorized/startline-and-startcolumn-specified/input.js
Expand Down Expand Up @@ -158,38 +158,6 @@ Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/ty

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/regression/keyword-qualified-type-disallowed-babel-7/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-function/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-function-babel-7/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-interface-extends/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-interface-extends-babel-7/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-interface-implements/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-interface-implements-babel-7/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-new/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-new-babel-7/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-superclass/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-superclass-babel-7/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-tsx/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-tsx-babel-7/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-type-import/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-type-import-babel-7/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-type-ref/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-type-ref-babel-7/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/instantiation-expression-property-access/input.ts

Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/type-arguments/instantiation-expression-property-access-babel-7/input.ts
Expand Down Expand Up @@ -14203,6 +14171,102 @@ Expect to Parse: tasks/coverage/babel/packages/babel-parser/test/fixtures/typesc
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-function/input.ts:1:4]
1 │ foo<>()
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-function-babel-7/input.ts:1:4]
1 │ foo<>()
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-interface-extends/input.ts:1:22]
1 │ interface A extends B<> {}
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-interface-extends-babel-7/input.ts:1:22]
1 │ interface A extends B<> {}
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-interface-implements/input.ts:1:21]
1 │ class A implements B<> {}
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-interface-implements-babel-7/input.ts:1:21]
1 │ class A implements B<> {}
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-new/input.ts:1:6]
1 │ new A<>();
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-new-babel-7/input.ts:1:6]
1 │ new A<>();
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-superclass/input.ts:1:18]
1 │ class A extends B<> {}
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-superclass-babel-7/input.ts:1:18]
1 │ class A extends B<> {}
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-tsx/input.ts:1:14]
1 │ var a = <Comp<>></Comp>
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-tsx-babel-7/input.ts:1:14]
1 │ var a = <Comp<>></Comp>
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-type-import/input.ts:1:18]
1 │ let a: import("")<>;
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-type-import-babel-7/input.ts:1:18]
1 │ let a: import("")<>;
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-type-ref/input.ts:1:11]
1 │ let a: Foo<>;
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/empty-type-ref-babel-7/input.ts:1:11]
1 │ let a: Foo<>;
· ──
╰────

× Expected a semicolon or an implicit semicolon after a statement, but found none
╭─[babel/packages/babel-parser/test/fixtures/typescript/type-arguments/new-without-arguments-missing-semicolon/input.ts:1:9]
1 │ new A<T> if (0);
Expand Down
26 changes: 25 additions & 1 deletion tasks/coverage/snapshots/parser_misc.snap
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
parser_misc Summary:
AST Parsed : 49/49 (100.00%)
Positive Passed: 49/49 (100.00%)
Negative Passed: 86/86 (100.00%)
Negative Passed: 90/90 (100.00%)

× Cannot assign to 'arguments' in strict mode
╭─[misc/fail/arguments-eval.ts:1:10]
Expand Down Expand Up @@ -2833,6 +2833,30 @@ Negative Passed: 86/86 (100.00%)
17 │ };
╰────

× TS(1099): Type argument list cannot be empty.
╭─[misc/fail/oxc-13617-1.ts:1:4]
1 │ foo<>()
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[misc/fail/oxc-13617-2.ts:1:8]
1 │ new Foo<>()
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[misc/fail/oxc-13617-3.ts:1:25]
1 │ class Foo {property: Bar<> = 1}
· ──
╰────

× TS(1099): Type argument list cannot be empty.
╭─[misc/fail/oxc-13617-4.ts:1:15]
1 │ const foo: Foo<> = 1
· ──
╰────

× Unexpected token
╭─[misc/fail/oxc-169.js:2:1]
1 │ 1<(V=82<<t-j0<(V=$<LBI<(V=ut<I<(V=$<LBI<(V=uIV=82<<t-j0<(V=$<LBI<(V=ut<I<(V=$<LBI<(V<II>
Expand Down
Loading
Loading