Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(prettier/ts): better conformance #2721

Merged
merged 6 commits into from Mar 20, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions crates/oxc_prettier/src/format/class.rs
Expand Up @@ -12,6 +12,9 @@ use super::assignment::AssignmentLikeNode;

pub(super) fn print_class<'a>(p: &mut Prettier<'a>, class: &Class<'a>) -> Doc<'a> {
let mut parts = p.vec();
if class.modifiers.contains(ModifierKind::Abstract) {
parts.push(ss!("abstract "));
}
parts.push(ss!("class "));
if let Some(id) = &class.id {
parts.push(id.format(p));
Expand Down
12 changes: 12 additions & 0 deletions crates/oxc_prettier/src/format/function.rs
@@ -1,6 +1,7 @@
use oxc_ast::ast::*;

use crate::{
array,
doc::{Doc, DocBuilder},
format::function_parameters::should_group_function_parameters,
group, if_break, indent, softline, space, ss, Format, Prettier,
Expand Down Expand Up @@ -57,6 +58,10 @@ 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 matches!(method.r#type, MethodDefinitionType::TSAbstractMethodDefinition) {
parts.push(ss!("abstract "));
}

if method.r#static {
parts.push(ss!("static "));
}
Expand Down Expand Up @@ -94,10 +99,17 @@ fn print_method_value<'a>(p: &mut Prettier<'a>, function: &Function<'a>) -> Doc<
if should_group_parameters { group!(p, parameters_doc) } else { parameters_doc };
parts.push(group!(p, parameters_doc));

if let Some(ret_typ) = &function.return_type {
parts.push(array![p, ss!(": "), ret_typ.type_annotation.format(p)]);
}

if let Some(body) = &function.body {
parts.push(space!());
parts.push(body.format(p));
} else if p.options.semi {
parts.push(ss!(";"));
}

Doc::Array(parts)
}

Expand Down
104 changes: 97 additions & 7 deletions crates/oxc_prettier/src/format/mod.rs
Expand Up @@ -772,7 +772,7 @@ impl<'a> Format<'a> for TSVoidKeyword {

impl<'a> Format<'a> for TSArrayType<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
line!()
array![p, self.element_type.format(p), ss!("[]")]
}
}

Expand All @@ -784,7 +784,14 @@ impl<'a> Format<'a> for TSConditionalType<'a> {

impl<'a> Format<'a> for TSConstructorType<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
line!()
let mut parts = p.vec();
if self.r#abstract {
parts.push(ss!("abstract "));
}
parts.push(ss!("new "));
parts.push(self.params.format(p));
parts.push(array![p, ss!(" => "), self.return_type.type_annotation.format(p)]);
Doc::Array(parts)
}
}

Expand Down Expand Up @@ -897,7 +904,12 @@ impl<'a> Format<'a> for TSTypeQuery<'a> {

impl<'a> Format<'a> for TSTypeReference<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
line!()
let mut parts = p.vec();
parts.push(format!(p, self.type_name));
if let Some(params) = &self.type_parameters {
parts.push(format!(p, params));
}
Doc::Array(parts)
}
}

Expand All @@ -921,7 +933,22 @@ impl<'a> Format<'a> for JSDocUnknownType {

impl<'a> Format<'a> for TSInterfaceDeclaration<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
line!()
let mut parts = p.vec();
parts.push(ss!("interface "));
parts.push(format!(p, self.id));
parts.push(space!());
parts.push(ss!("{"));
if self.body.body.len() > 0 {
let mut indent_parts = p.vec();
for sig in &self.body.body {
indent_parts.extend(hardline!());
indent_parts.push(format!(p, sig));
}
parts.push(Doc::Indent(indent_parts));
parts.extend(hardline!());
}
parts.push(ss!("}"));
Doc::Array(parts)
}
}

Expand Down Expand Up @@ -969,7 +996,10 @@ impl<'a> Format<'a> for TSModuleReference<'a> {

impl<'a> Format<'a> for TSTypeName<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
line!()
match self {
TSTypeName::IdentifierReference(it) => format!(p, it),
TSTypeName::QualifiedName(it) => format!(p, it),
}
}
}

Expand Down Expand Up @@ -1245,7 +1275,7 @@ impl<'a> Format<'a> for Expression<'a> {
Self::ClassExpression(expr) => expr.format(p),
Self::JSXElement(el) => el.format(p),
Self::JSXFragment(fragment) => fragment.format(p),
Self::TSAsExpression(expr) => expr.expression.format(p),
Self::TSAsExpression(expr) => expr.format(p),
Self::TSSatisfiesExpression(expr) => expr.expression.format(p),
Self::TSTypeAssertion(expr) => expr.expression.format(p),
Self::TSNonNullExpression(expr) => expr.expression.format(p),
Expand Down Expand Up @@ -2175,12 +2205,17 @@ impl<'a> Format<'a> for PrivateIdentifier<'a> {

impl<'a> Format<'a> for BindingPattern<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
match self.kind {
let mut parts = p.vec();
parts.push(match self.kind {
BindingPatternKind::BindingIdentifier(ref ident) => ident.format(p),
BindingPatternKind::ObjectPattern(ref pattern) => pattern.format(p),
BindingPatternKind::ArrayPattern(ref pattern) => pattern.format(p),
BindingPatternKind::AssignmentPattern(ref pattern) => pattern.format(p),
});
if let Some(typ) = &self.type_annotation {
parts.push(array![p, ss!(": "), typ.type_annotation.format(p)]);
}
Doc::Array(parts)
}
}

Expand Down Expand Up @@ -2258,3 +2293,58 @@ impl<'a> Format<'a> for TSIndexSignature<'a> {
line!()
}
}

impl<'a> Format<'a> for TSPropertySignature<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
let mut parts = p.vec();
if self.readonly {
parts.push(ss!("readonly "));
}
parts.push(format!(p, self.key));
if let Some(ty) = &self.type_annotation {
if self.optional {
parts.push(ss!("?"));
}
parts.push(ss!(":"));
parts.push(space!());
parts.push(format!(p, ty.type_annotation));
}
Doc::Array(parts)
}
}

impl<'a> Format<'a> for TSCallSignatureDeclaration<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
line!()
}
}

impl<'a> Format<'a> for TSConstructSignatureDeclaration<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
line!()
}
}

impl<'a> Format<'a> for TSMethodSignature<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
line!()
}
}

impl<'a> Format<'a> for TSSignature<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
match self {
TSSignature::TSIndexSignature(it) => it.format(p),
TSSignature::TSPropertySignature(it) => it.format(p),
TSSignature::TSCallSignatureDeclaration(it) => it.format(p),
TSSignature::TSConstructSignatureDeclaration(it) => it.format(p),
TSSignature::TSMethodSignature(it) => it.format(p),
}
}
}

impl<'a> Format<'a> for TSAsExpression<'a> {
fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> {
array![p, format!(p, self.expression), ss!(" as "), format!(p, self.type_annotation)]
}
}
3 changes: 2 additions & 1 deletion tasks/prettier_conformance/prettier.js.snap.md
@@ -1,4 +1,4 @@
js compatibility: 264/586 (45.05%)
js compatibility: 265/588 (45.07%)

# Failed

Expand Down Expand Up @@ -265,6 +265,7 @@ js compatibility: 264/586 (45.05%)
### import-attributes
* import-attributes/empty.js
* import-attributes/keyword-detect.js
* import-attributes/quoted-keys.js

### label
* label/comment.js
Expand Down
40 changes: 1 addition & 39 deletions tasks/prettier_conformance/prettier.ts.snap.md
@@ -1,13 +1,7 @@
ts compatibility: 23/528 (4.36%)
ts compatibility: 48/527 (9.11%)

# Failed

### abstract-class
* abstract-class/export-default.ts

### abstract-construct-types
* abstract-construct-types/abstract-construct-types.ts

### abstract-property
* abstract-property/semicolon.ts

Expand Down Expand Up @@ -35,7 +29,6 @@ ts compatibility: 23/528 (4.36%)

### arrows
* arrows/arrow_function_expression.ts
* arrows/short_body.ts
* arrows/type_params.ts

### as
Expand All @@ -48,7 +41,6 @@ ts compatibility: 23/528 (4.36%)
* as/expression-statement.ts
* as/long-identifiers.ts
* as/nested-await-and-as.ts
* as/return.ts
* as/ternary.ts

### assert
Expand Down Expand Up @@ -85,20 +77,15 @@ ts compatibility: 23/528 (4.36%)
* cast/parenthesis.ts
* cast/tuple-and-record.ts

### catch-clause
* catch-clause/type-annotation.ts

### chain-expression
* chain-expression/test.ts
* chain-expression/test2.ts

### class
* class/abstract-method.ts
* class/constructor.ts
* class/declare-readonly-field-initializer-w-annotation.ts
* class/declare-readonly-field-initializer.ts
* class/dunder.ts
* class/duplicates-access-modifier.ts
* class/empty-method-body.ts
* class/extends_implements.ts
* class/generics.ts
Expand All @@ -121,7 +108,6 @@ ts compatibility: 23/528 (4.36%)
### comments
* comments/15707.ts
* comments/abstract_class.ts
* comments/abstract_methods.ts
* comments/after_jsx_generic.tsx
* comments/declare_function.ts
* comments/interface.ts
Expand All @@ -143,7 +129,6 @@ ts compatibility: 23/528 (4.36%)
* comments-2/last-arg.ts

### compiler
* compiler/ClassDeclaration22.ts
* compiler/anyIsAssignableToObject.ts
* compiler/castOfAwait.ts
* compiler/castParentheses.ts
Expand Down Expand Up @@ -181,28 +166,17 @@ ts compatibility: 23/528 (4.36%)
* conformance/classes/nestedClassDeclaration.ts

### conformance/classes/classDeclarations/classAbstractKeyword
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAssignabilityConstructorFunction.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractClinterfaceAssignability.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractConstructorAssignability.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractCrashedOnce.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractExtends.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractFactoryFunction.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractGeneric.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractImportInstantiation.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInAModule.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInheritance.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInstantiations1.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractInstantiations2.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMethodInNonAbstractClass.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractMixedWithModifiers.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractOverloads.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractOverrideWithAbstract.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractProperties.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractSingleLineDecl.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractSuperCalls.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractUsingAbstractMethod1.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractUsingAbstractMethods2.ts
* conformance/classes/classDeclarations/classAbstractKeyword/classAbstractWithInterface.ts

### conformance/classes/classDeclarations/classHeritageSpecification
Expand Down Expand Up @@ -263,16 +237,11 @@ ts compatibility: 23/528 (4.36%)

### conformance/types/any
* conformance/types/any/anyAsConstructor.ts
* conformance/types/any/anyAsFunctionCall.ts
* conformance/types/any/anyAsGenericFunctionCall.ts
* conformance/types/any/anyPropertyAccess.ts

### conformance/types/constKeyword
* conformance/types/constKeyword/constKeyword.ts

### conformance/types/constructorType
* conformance/types/constructorType/cunstructorType.ts

### conformance/types/enumDeclaration
* conformance/types/enumDeclaration/enumDeclaration.ts

Expand All @@ -289,9 +258,6 @@ ts compatibility: 23/528 (4.36%)
* conformance/types/functions/functionOverloadErrorsSyntax.ts
* conformance/types/functions/functionTypeTypeParameters.ts

### conformance/types/indexedAccesType
* conformance/types/indexedAccesType/indexedAccesType.ts

### conformance/types/interfaceDeclaration
* conformance/types/interfaceDeclaration/interfaceDeclaration.ts

Expand Down Expand Up @@ -341,9 +307,6 @@ ts compatibility: 23/528 (4.36%)
* conformance/types/tuple/wideningTuples4.ts
* conformance/types/tuple/wideningTuples7.ts

### conformance/types/tuple/emptyTuples
* conformance/types/tuple/emptyTuples/emptyTuplesTypeAssertion02.ts

### conformance/types/typeOperator
* conformance/types/typeOperator/typeOperator.ts

Expand Down Expand Up @@ -647,7 +610,6 @@ ts compatibility: 23/528 (4.36%)

### nosemi
* nosemi/index-signature.ts
* nosemi/interface.ts
* nosemi/type.ts

### optional-call
Expand Down