diff --git a/crates/oxc_prettier/src/format/class.rs b/crates/oxc_prettier/src/format/class.rs index 060cbb2bd1edf..d602ef871fd55 100644 --- a/crates/oxc_prettier/src/format/class.rs +++ b/crates/oxc_prettier/src/format/class.rs @@ -11,6 +11,13 @@ use crate::{ pub(super) fn print_class<'a>(p: &mut Prettier<'a>, class: &Class<'a>) -> Doc<'a> { let mut parts = p.vec(); + + for decorator in &class.decorators { + parts.push(ss!("@")); + parts.push(decorator.expression.format(p)); + parts.extend(hardline!()); + } + if class.r#abstract { parts.push(ss!("abstract ")); } @@ -33,6 +40,25 @@ pub(super) fn print_class<'a>(p: &mut Prettier<'a>, class: &Class<'a>) -> Doc<'a parts.push(space!()); } + if let Some(implements) = &class.implements { + if implements.len() > 0 { + parts.push(ss!("implements ")); + + let mut print_comma = false; + for implementation in implements { + if print_comma { + parts.push(ss!(", ")); + } else { + print_comma = true; + } + + parts.push(implementation.format(p)); + } + + parts.push(space!()); + } + } + parts.push(class.body.format(p)); Doc::Array(parts) } @@ -126,7 +152,7 @@ impl<'a, 'b> ClassMemberish<'a, 'b> { fn is_readonly(&self) -> bool { match self { ClassMemberish::PropertyDefinition(property_definition) => property_definition.readonly, - ClassMemberish::AccessorProperty(_) => false, + ClassMemberish::AccessorProperty(_) => true, } } @@ -229,10 +255,6 @@ pub(super) fn print_class_property<'a>( parts.push(ss!("abstract ")); } - if matches!(node, ClassMemberish::AccessorProperty(_)) { - parts.push(ss!("readonly ")); - } - parts.push(node.format_key(p)); if node.is_optional() { diff --git a/crates/oxc_prettier/src/format/function.rs b/crates/oxc_prettier/src/format/function.rs index 8546005b0fc20..3cd0af5ff572e 100644 --- a/crates/oxc_prettier/src/format/function.rs +++ b/crates/oxc_prettier/src/format/function.rs @@ -58,6 +58,11 @@ pub(super) fn print_function<'a>( pub(super) fn print_method<'a>(p: &mut Prettier<'a>, method: &MethodDefinition<'a>) -> Doc<'a> { let mut parts = p.vec(); + if let Some(accessibility) = &method.accessibility { + parts.push(ss!(accessibility.as_str())); + parts.push(space!()); + } + if matches!(method.r#type, MethodDefinitionType::TSAbstractMethodDefinition) { parts.push(ss!("abstract ")); } diff --git a/crates/oxc_prettier/src/format/mod.rs b/crates/oxc_prettier/src/format/mod.rs index dcc3e80990211..084044972f25d 100644 --- a/crates/oxc_prettier/src/format/mod.rs +++ b/crates/oxc_prettier/src/format/mod.rs @@ -2340,6 +2340,20 @@ impl<'a> Format<'a> for ClassElement<'a> { } } +impl<'a> Format<'a> for TSClassImplements<'a> { + fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> { + let mut parts = p.vec(); + + parts.push(self.expression.format(p)); + + if let Some(type_parameters) = &self.type_parameters { + parts.push(type_parameters.format(p)); + } + + Doc::Array(parts) + } +} + impl<'a> Format<'a> for JSXIdentifier<'a> { fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> { line!() diff --git a/tasks/prettier_conformance/prettier.ts.snap.md b/tasks/prettier_conformance/prettier.ts.snap.md index f4db1f32a1a80..1316cc5d94b39 100644 --- a/tasks/prettier_conformance/prettier.ts.snap.md +++ b/tasks/prettier_conformance/prettier.ts.snap.md @@ -1,4 +1,4 @@ -ts compatibility: 107/526 (20.34%) +ts compatibility: 109/526 (20.72%) # Failed @@ -155,7 +155,6 @@ ts compatibility: 107/526 (20.34%) ### conformance/classes/classDeclarations/classAbstractKeyword * conformance/classes/classDeclarations/classAbstractKeyword/classAbstractClinterfaceAssignability.ts * conformance/classes/classDeclarations/classAbstractKeyword/classAbstractConstructorAssignability.ts -* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractCrashedOnce.ts * conformance/classes/classDeclarations/classAbstractKeyword/classAbstractFactoryFunction.ts * conformance/classes/classDeclarations/classAbstractKeyword/classAbstractImportInstantiation.ts * conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInAModule.ts @@ -368,7 +367,6 @@ ts compatibility: 107/526 (20.34%) ### decorators-ts * decorators-ts/accessor-decorator.ts * decorators-ts/angular.ts -* decorators-ts/class-decorator.ts * decorators-ts/method-decorator.ts * decorators-ts/mobx.ts * decorators-ts/multiple.ts