diff --git a/src/language-js/printer-estree.js b/src/language-js/printer-estree.js index 9dffed46..85b74ed5 100644 --- a/src/language-js/printer-estree.js +++ b/src/language-js/printer-estree.js @@ -3636,24 +3636,41 @@ function printClass(path, options, print) { const partsGroup = []; if (n.superClass) { - if (hasLeadingOwnLineComment(options.originalText, n.superClass)) { - parts.push(hardline); - } else { - parts.push(" "); - } - const printed = concat([ "extends ", path.call(print, "superClass"), path.call(print, "superTypeParameters") ]); - parts.push( - path.call( - superClass => - comments.printComments(superClass, () => printed, options), - "superClass" - ) - ); + // Keep old behaviour of extends in same line + // If there is only on extends and there are not comments + if ( + (!n.implements || n.implements.length === 0) && + (!n.superClass.comments || n.superClass.comments.length === 0) + ) { + parts.push( + concat([ + " ", + path.call( + superClass => + comments.printComments(superClass, () => printed, options), + "superClass" + ) + ]) + ); + } else { + partsGroup.push( + group( + concat([ + line, + path.call( + superClass => + comments.printComments(superClass, () => printed, options), + "superClass" + ) + ]) + ) + ); + } } else if (n.extends && n.extends.length > 0) { parts.push(" extends ", join(", ", path.map(print, "extends"))); } @@ -3661,8 +3678,15 @@ function printClass(path, options, print) { if (n["implements"] && n["implements"].length > 0) { partsGroup.push( line, - "implements ", - group(indent(join(concat([",", line]), path.map(print, "implements")))) + "implements", + group( + indent( + concat([ + line, + join(concat([",", line]), path.map(print, "implements")) + ]) + ) + ) ); } diff --git a/src/main/comments.js b/src/main/comments.js index 1c4787e5..5273a46a 100644 --- a/src/main/comments.js +++ b/src/main/comments.js @@ -976,6 +976,17 @@ function printTrailingComment(commentPath, print, options) { } const isBlock = util.isBlockComment(comment); + // We don't want the line to break + // when the parentParentNode is a ClassDeclaration/-Expression + // And the parentNode is in the superClass property + const parentNode = commentPath.getNode(1); + const parentParentNode = commentPath.getNode(2); + const isParentSuperClass = + parentParentNode && + (parentParentNode.type === "ClassDeclaration" || + parentParentNode.type === "ClassExpression") && + parentParentNode.superClass === parentNode; + if ( util.hasNewline(options.originalText, locStart(comment), { backwards: true @@ -1001,7 +1012,7 @@ function printTrailingComment(commentPath, print, options) { return lineSuffix( concat([hardline, isLineBeforeEmpty ? hardline : "", contents]) ); - } else if (isBlock) { + } else if (isBlock || isParentSuperClass) { // Trailing block comments never need a newline return concat([" ", contents]); } diff --git a/tests/class_comment/__snapshots__/jsfmt.spec.js.snap b/tests/class_comment/__snapshots__/jsfmt.spec.js.snap index 3216c3ee..f23ec50f 100644 --- a/tests/class_comment/__snapshots__/jsfmt.spec.js.snap +++ b/tests/class_comment/__snapshots__/jsfmt.spec.js.snap @@ -51,8 +51,8 @@ export class SnapshotLogger { } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class A // comment 1 -// comment 2 -extends B {} + // comment 2 + extends B {} class A extends B // comment1 // comment2 @@ -66,8 +66,8 @@ class A extends B /* a */ { class A /* a */ extends B {} (class A // comment 1 -// comment 2 -extends B {}); + // comment 2 + extends B {}); (class A extends B // comment1 // comment2 diff --git a/tests/classes/__snapshots__/jsfmt.spec.js.snap b/tests/classes/__snapshots__/jsfmt.spec.js.snap index 6c76fff6..30f3eff6 100644 --- a/tests/classes/__snapshots__/jsfmt.spec.js.snap +++ b/tests/classes/__snapshots__/jsfmt.spec.js.snap @@ -50,11 +50,9 @@ export class VisTimelineComponent2 implements AfterViewInit, OnChanges, OnDestroy, AndSomethingReallyReallyLong { } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class MyContractSelectionWidget extends React.Component< - void, - MyContractSelectionWidgetPropsType, - void -> implements SomethingLarge { +class MyContractSelectionWidget + extends React.Component + implements SomethingLarge { method() {} } @@ -65,7 +63,8 @@ class DisplayObject extends utils.EventEmitter implements interaction_InteractiveTarget {} class DisplayObject extends utils.EventEmitter - implements interaction_InteractiveTarget, + implements + interaction_InteractiveTarget, somethingElse_SomeOtherThing, somethingElseAgain_RunningOutOfNames {} @@ -84,7 +83,8 @@ class Foo extends Immutable.Record({ export class VisTimelineComponent implements AfterViewInit, OnChanges, OnDestroy {} export class VisTimelineComponent2 - implements AfterViewInit, + implements + AfterViewInit, OnChanges, OnDestroy, AndSomethingReallyReallyLong {} diff --git a/tests/flow/union/__snapshots__/jsfmt.spec.js.snap b/tests/flow/union/__snapshots__/jsfmt.spec.js.snap index 51587ffb..056241c2 100644 --- a/tests/flow/union/__snapshots__/jsfmt.spec.js.snap +++ b/tests/flow/union/__snapshots__/jsfmt.spec.js.snap @@ -29,19 +29,19 @@ export class PlusOp extends BinaryExpression { +export class MinusOp extends BinaryExpression { } -export class MulOp extends BinaryExpression { +export class MulOp extends BinaryExpression { } -export class DivOp extends BinaryExpression { +export class DivOp extends BinaryExpression { } -export class ModOp extends BinaryExpression { +export class ModOp extends BinaryExpression { } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -77,21 +77,29 @@ export class PlusOp extends BinaryExpression< > {} export class MinusOp extends BinaryExpression< + ArithmeticExpression, + ArithmeticExpression, ArithmeticExpression, ArithmeticExpression > {} export class MulOp extends BinaryExpression< + ArithmeticExpression, + ArithmeticExpression, ArithmeticExpression, ArithmeticExpression > {} export class DivOp extends BinaryExpression< + ArithmeticExpression, + ArithmeticExpression, ArithmeticExpression, ArithmeticExpression > {} export class ModOp extends BinaryExpression< + ArithmeticExpression, + ArithmeticExpression, ArithmeticExpression, ArithmeticExpression > {} diff --git a/tests/flow/union/blowup.js b/tests/flow/union/blowup.js index a480219d..96fdd9cb 100644 --- a/tests/flow/union/blowup.js +++ b/tests/flow/union/blowup.js @@ -26,18 +26,18 @@ export class PlusOp extends BinaryExpression { +export class MinusOp extends BinaryExpression { } -export class MulOp extends BinaryExpression { +export class MulOp extends BinaryExpression { } -export class DivOp extends BinaryExpression { +export class DivOp extends BinaryExpression { } -export class ModOp extends BinaryExpression { +export class ModOp extends BinaryExpression { } diff --git a/tests/interface/__snapshots__/jsfmt.spec.js.snap b/tests/interface/__snapshots__/jsfmt.spec.js.snap index c9b5219d..29530783 100644 --- a/tests/interface/__snapshots__/jsfmt.spec.js.snap +++ b/tests/interface/__snapshots__/jsfmt.spec.js.snap @@ -12,6 +12,10 @@ export class Environment2 extends GenericEnvironment< SomeType, AnotherType, YetAnotherType, + DifferentType1, + DifferentType2, + DifferentType3, + DifferentType4, > { m() {}; }; @@ -23,7 +27,11 @@ export interface Environment1 export class Environment2 extends GenericEnvironment< SomeType, AnotherType, - YetAnotherType + YetAnotherType, + DifferentType1, + DifferentType2, + DifferentType3, + DifferentType4 > { m() {} } diff --git a/tests/interface/break.js b/tests/interface/break.js index f6b33dfb..02e9e1e1 100644 --- a/tests/interface/break.js +++ b/tests/interface/break.js @@ -9,6 +9,10 @@ export class Environment2 extends GenericEnvironment< SomeType, AnotherType, YetAnotherType, + DifferentType1, + DifferentType2, + DifferentType3, + DifferentType4, > { m() {}; }; diff --git a/tests/typescript_as/__snapshots__/jsfmt.spec.js.snap b/tests/typescript_as/__snapshots__/jsfmt.spec.js.snap index 25d5bea9..73a1f83f 100644 --- a/tests/typescript_as/__snapshots__/jsfmt.spec.js.snap +++ b/tests/typescript_as/__snapshots__/jsfmt.spec.js.snap @@ -7,7 +7,7 @@ this.isTabActionBar((e.target || e.srcElement) as HTMLElement); 'current' in (props.pagination as Object) start + (yearSelectTotal as number) scrollTop > (visibilityHeight as number) -export default class Column extends (RcTable.Column as React.ComponentClass>) {} +export default class Column extends (RcTable.Column as React.ComponentClass,ColumnProps,ColumnProps,ColumnProps>) {} export abstract class MobxTypedForm extends (Form as { new (): any }) {} ({}) as {}; function*g() { @@ -38,6 +38,9 @@ this.isTabActionBar((e.target || e.srcElement) as HTMLElement); start + (yearSelectTotal as number); scrollTop > (visibilityHeight as number); export default class Column extends (RcTable.Column as React.ComponentClass< + ColumnProps, + ColumnProps, + ColumnProps, ColumnProps >) {} export abstract class MobxTypedForm extends (Form as { new (): any }) {} diff --git a/tests/typescript_as/as.js b/tests/typescript_as/as.js index b74f5f8a..1bedea90 100644 --- a/tests/typescript_as/as.js +++ b/tests/typescript_as/as.js @@ -4,7 +4,7 @@ this.isTabActionBar((e.target || e.srcElement) as HTMLElement); 'current' in (props.pagination as Object) start + (yearSelectTotal as number) scrollTop > (visibilityHeight as number) -export default class Column extends (RcTable.Column as React.ComponentClass>) {} +export default class Column extends (RcTable.Column as React.ComponentClass,ColumnProps,ColumnProps,ColumnProps>) {} export abstract class MobxTypedForm extends (Form as { new (): any }) {} ({}) as {}; function*g() { diff --git a/tests/typescript_class/__snapshots__/jsfmt.spec.js.snap b/tests/typescript_class/__snapshots__/jsfmt.spec.js.snap index adf74216..861224dd 100644 --- a/tests/typescript_class/__snapshots__/jsfmt.spec.js.snap +++ b/tests/typescript_class/__snapshots__/jsfmt.spec.js.snap @@ -28,6 +28,97 @@ class F<__T> {} `; +exports[`extends_implements.ts 1`] = ` +class Class extends AbstractClass implements Interface1, Interface2, Interface3, Interface4 {} + +class ExtendsAbstractClassAndImplementsInterfaces extends AbstractClass + implements Interface1, Interface2, Interface3, Interface4 {} + +class ExtendsAbstractClassAndImplementsInterfaces + extends AAAAAAAAAAAAAAbstractClass + implements Interface1, Interface2, Interface3, Interface4 {} + +class ExtendsAbstractClassAndImplementsInterfaces + extends AAAAAAAAAAAAAAbstractClass + implements + Interface1, + Interface2, + Interface3, + Interface4, + Interface5, + Interface6, + Interface7, + Interface8 {} + +class ExtendsAbstractClassAndImplementsInterfaces + extends AAAAAAAAAAAAAAbstractClass {} + +class ExtendsAbstractClassAndImplementsInterfaces + extends AAAAAAAAAAAAAAbstractClass + implements + Interface1, + Interface2, + Interface3, + Interface4, + Interface5, + Interface6, + Interface7, + Interface8 {} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class Class extends AbstractClass + implements Interface1, Interface2, Interface3, Interface4 {} + +class ExtendsAbstractClassAndImplementsInterfaces extends AbstractClass + implements Interface1, Interface2, Interface3, Interface4 {} + +class ExtendsAbstractClassAndImplementsInterfaces + extends AAAAAAAAAAAAAAbstractClass + implements Interface1, Interface2, Interface3, Interface4 {} + +class ExtendsAbstractClassAndImplementsInterfaces + extends AAAAAAAAAAAAAAbstractClass + implements + Interface1, + Interface2, + Interface3, + Interface4, + Interface5, + Interface6, + Interface7, + Interface8 {} + +class ExtendsAbstractClassAndImplementsInterfaces extends AAAAAAAAAAAAAAbstractClass< + Type1, + Type2, + Type3, + Type4, + Type5, + Type6, + Type7 +> {} + +class ExtendsAbstractClassAndImplementsInterfaces + extends AAAAAAAAAAAAAAbstractClass< + Type1, + Type2, + Type3, + Type4, + Type5, + Type6, + Type7 + > + implements + Interface1, + Interface2, + Interface3, + Interface4, + Interface5, + Interface6, + Interface7, + Interface8 {} + +`; + exports[`generics.ts 1`] = ` class implements Map {} diff --git a/tests/typescript_class/extends_implements.ts b/tests/typescript_class/extends_implements.ts new file mode 100644 index 00000000..0daed035 --- /dev/null +++ b/tests/typescript_class/extends_implements.ts @@ -0,0 +1,35 @@ +class Class extends AbstractClass implements Interface1, Interface2, Interface3, Interface4 {} + +class ExtendsAbstractClassAndImplementsInterfaces extends AbstractClass + implements Interface1, Interface2, Interface3, Interface4 {} + +class ExtendsAbstractClassAndImplementsInterfaces + extends AAAAAAAAAAAAAAbstractClass + implements Interface1, Interface2, Interface3, Interface4 {} + +class ExtendsAbstractClassAndImplementsInterfaces + extends AAAAAAAAAAAAAAbstractClass + implements + Interface1, + Interface2, + Interface3, + Interface4, + Interface5, + Interface6, + Interface7, + Interface8 {} + +class ExtendsAbstractClassAndImplementsInterfaces + extends AAAAAAAAAAAAAAbstractClass {} + +class ExtendsAbstractClassAndImplementsInterfaces + extends AAAAAAAAAAAAAAbstractClass + implements + Interface1, + Interface2, + Interface3, + Interface4, + Interface5, + Interface6, + Interface7, + Interface8 {}