diff --git a/crates/oxc_ast/src/ast_impl/js.rs b/crates/oxc_ast/src/ast_impl/js.rs index e39c488d59d9c..3360d7c2ecaa1 100644 --- a/crates/oxc_ast/src/ast_impl/js.rs +++ b/crates/oxc_ast/src/ast_impl/js.rs @@ -1298,6 +1298,12 @@ impl MethodDefinitionKind { } } +impl MethodDefinitionType { + pub fn is_abstract(&self) -> bool { + matches!(self, Self::TSAbstractMethodDefinition) + } +} + impl<'a> PrivateIdentifier<'a> { pub fn new(span: Span, name: Atom<'a>) -> Self { Self { span, name } diff --git a/crates/oxc_isolated_declarations/src/class.rs b/crates/oxc_isolated_declarations/src/class.rs index 792bbbca7bcce..6e668808d15b3 100644 --- a/crates/oxc_isolated_declarations/src/class.rs +++ b/crates/oxc_isolated_declarations/src/class.rs @@ -329,7 +329,7 @@ impl<'a> IsolatedDeclarations<'a> { match element { ClassElement::StaticBlock(_) => {} ClassElement::MethodDefinition(ref method) => { - if method.value.body.is_none() { + if !method.r#type.is_abstract() && method.value.body.is_none() { is_function_overloads = true; } else if is_function_overloads { // Skip implementation of function overloads diff --git a/crates/oxc_isolated_declarations/tests/fixtures/class.ts b/crates/oxc_isolated_declarations/tests/fixtures/class.ts index 2255754d7a8e4..f0f9579b28cc5 100644 --- a/crates/oxc_isolated_declarations/tests/fixtures/class.ts +++ b/crates/oxc_isolated_declarations/tests/fixtures/class.ts @@ -6,4 +6,10 @@ export class Bar { public constructor(a: number = 0) {} } -export class Zoo { foo(f: F): F { return f } } \ No newline at end of file +export class Zoo { foo(f: F): F { return f } } + +export abstract class Qux { + abstract foo(): void; + bar(): void {} + baz(): void {} +} \ No newline at end of file diff --git a/crates/oxc_isolated_declarations/tests/snapshots/class.snap b/crates/oxc_isolated_declarations/tests/snapshots/class.snap index bb684775b7b28..e0815c35192ab 100644 --- a/crates/oxc_isolated_declarations/tests/snapshots/class.snap +++ b/crates/oxc_isolated_declarations/tests/snapshots/class.snap @@ -13,3 +13,8 @@ export declare class Bar { export declare class Zoo { foo(f: F): F; } +export declare abstract class Qux { + abstract foo(): void; + bar(): void; + baz(): void; +}