Prettier extends and implements when not fitting in same line (#3689)

* Added prettier layout for class extends and implements

* Added prettier layout for class extends and implements, fix with keeping it in online if it fits

* Added prettier layout for class extends and implements, fixed tests as a side change

* Extends implements comments in same line fix

* Extends implements comments in same line without ugly workaround

* added empty line to test typescript_class/extends_implements.ts

* If only one extends keep old behaviour

* Removed console logs
master
Thorben von Hacht 2018-01-12 21:31:51 -08:00 committed by Lucas Azzola
parent aa0437cc60
commit 1a1de60491
12 changed files with 222 additions and 38 deletions

View File

@ -3636,24 +3636,41 @@ function printClass(path, options, print) {
const partsGroup = []; const partsGroup = [];
if (n.superClass) { if (n.superClass) {
if (hasLeadingOwnLineComment(options.originalText, n.superClass)) {
parts.push(hardline);
} else {
parts.push(" ");
}
const printed = concat([ const printed = concat([
"extends ", "extends ",
path.call(print, "superClass"), path.call(print, "superClass"),
path.call(print, "superTypeParameters") path.call(print, "superTypeParameters")
]); ]);
// 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( parts.push(
concat([
" ",
path.call( path.call(
superClass => superClass =>
comments.printComments(superClass, () => printed, options), comments.printComments(superClass, () => printed, options),
"superClass" "superClass"
) )
])
); );
} else {
partsGroup.push(
group(
concat([
line,
path.call(
superClass =>
comments.printComments(superClass, () => printed, options),
"superClass"
)
])
)
);
}
} else if (n.extends && n.extends.length > 0) { } else if (n.extends && n.extends.length > 0) {
parts.push(" extends ", join(", ", path.map(print, "extends"))); parts.push(" extends ", join(", ", path.map(print, "extends")));
} }
@ -3662,7 +3679,14 @@ function printClass(path, options, print) {
partsGroup.push( partsGroup.push(
line, line,
"implements", "implements",
group(indent(join(concat([",", line]), path.map(print, "implements")))) group(
indent(
concat([
line,
join(concat([",", line]), path.map(print, "implements"))
])
)
)
); );
} }

View File

@ -976,6 +976,17 @@ function printTrailingComment(commentPath, print, options) {
} }
const isBlock = util.isBlockComment(comment); 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 ( if (
util.hasNewline(options.originalText, locStart(comment), { util.hasNewline(options.originalText, locStart(comment), {
backwards: true backwards: true
@ -1001,7 +1012,7 @@ function printTrailingComment(commentPath, print, options) {
return lineSuffix( return lineSuffix(
concat([hardline, isLineBeforeEmpty ? hardline : "", contents]) concat([hardline, isLineBeforeEmpty ? hardline : "", contents])
); );
} else if (isBlock) { } else if (isBlock || isParentSuperClass) {
// Trailing block comments never need a newline // Trailing block comments never need a newline
return concat([" ", contents]); return concat([" ", contents]);
} }

View File

@ -50,11 +50,9 @@ export class VisTimelineComponent2
implements AfterViewInit, OnChanges, OnDestroy, AndSomethingReallyReallyLong { implements AfterViewInit, OnChanges, OnDestroy, AndSomethingReallyReallyLong {
} }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class MyContractSelectionWidget extends React.Component< class MyContractSelectionWidget
void, extends React.Component<void, MyContractSelectionWidgetPropsType, void>
MyContractSelectionWidgetPropsType, implements SomethingLarge {
void
> implements SomethingLarge {
method() {} method() {}
} }
@ -65,7 +63,8 @@ class DisplayObject extends utils.EventEmitter
implements interaction_InteractiveTarget {} implements interaction_InteractiveTarget {}
class DisplayObject extends utils.EventEmitter class DisplayObject extends utils.EventEmitter
implements interaction_InteractiveTarget, implements
interaction_InteractiveTarget,
somethingElse_SomeOtherThing, somethingElse_SomeOtherThing,
somethingElseAgain_RunningOutOfNames {} somethingElseAgain_RunningOutOfNames {}
@ -84,7 +83,8 @@ class Foo extends Immutable.Record({
export class VisTimelineComponent export class VisTimelineComponent
implements AfterViewInit, OnChanges, OnDestroy {} implements AfterViewInit, OnChanges, OnDestroy {}
export class VisTimelineComponent2 export class VisTimelineComponent2
implements AfterViewInit, implements
AfterViewInit,
OnChanges, OnChanges,
OnDestroy, OnDestroy,
AndSomethingReallyReallyLong {} AndSomethingReallyReallyLong {}

View File

@ -29,19 +29,19 @@ export class PlusOp extends BinaryExpression<ArithmeticExpression, ArithmeticExp
} }
export class MinusOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression> { export class MinusOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression, ArithmeticExpression, ArithmeticExpression> {
} }
export class MulOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression> { export class MulOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression, ArithmeticExpression, ArithmeticExpression> {
} }
export class DivOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression> { export class DivOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression, ArithmeticExpression, ArithmeticExpression> {
} }
export class ModOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression> { export class ModOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression, ArithmeticExpression, ArithmeticExpression> {
} }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -77,21 +77,29 @@ export class PlusOp extends BinaryExpression<
> {} > {}
export class MinusOp extends BinaryExpression< export class MinusOp extends BinaryExpression<
ArithmeticExpression,
ArithmeticExpression,
ArithmeticExpression, ArithmeticExpression,
ArithmeticExpression ArithmeticExpression
> {} > {}
export class MulOp extends BinaryExpression< export class MulOp extends BinaryExpression<
ArithmeticExpression,
ArithmeticExpression,
ArithmeticExpression, ArithmeticExpression,
ArithmeticExpression ArithmeticExpression
> {} > {}
export class DivOp extends BinaryExpression< export class DivOp extends BinaryExpression<
ArithmeticExpression,
ArithmeticExpression,
ArithmeticExpression, ArithmeticExpression,
ArithmeticExpression ArithmeticExpression
> {} > {}
export class ModOp extends BinaryExpression< export class ModOp extends BinaryExpression<
ArithmeticExpression,
ArithmeticExpression,
ArithmeticExpression, ArithmeticExpression,
ArithmeticExpression ArithmeticExpression
> {} > {}

View File

@ -26,18 +26,18 @@ export class PlusOp extends BinaryExpression<ArithmeticExpression, ArithmeticExp
} }
export class MinusOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression> { export class MinusOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression, ArithmeticExpression, ArithmeticExpression> {
} }
export class MulOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression> { export class MulOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression, ArithmeticExpression, ArithmeticExpression> {
} }
export class DivOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression> { export class DivOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression, ArithmeticExpression, ArithmeticExpression> {
} }
export class ModOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression> { export class ModOp extends BinaryExpression<ArithmeticExpression, ArithmeticExpression, ArithmeticExpression, ArithmeticExpression> {
} }

View File

@ -12,6 +12,10 @@ export class Environment2 extends GenericEnvironment<
SomeType, SomeType,
AnotherType, AnotherType,
YetAnotherType, YetAnotherType,
DifferentType1,
DifferentType2,
DifferentType3,
DifferentType4,
> { > {
m() {}; m() {};
}; };
@ -23,7 +27,11 @@ export interface Environment1
export class Environment2 extends GenericEnvironment< export class Environment2 extends GenericEnvironment<
SomeType, SomeType,
AnotherType, AnotherType,
YetAnotherType YetAnotherType,
DifferentType1,
DifferentType2,
DifferentType3,
DifferentType4
> { > {
m() {} m() {}
} }

View File

@ -9,6 +9,10 @@ export class Environment2 extends GenericEnvironment<
SomeType, SomeType,
AnotherType, AnotherType,
YetAnotherType, YetAnotherType,
DifferentType1,
DifferentType2,
DifferentType3,
DifferentType4,
> { > {
m() {}; m() {};
}; };

View File

@ -7,7 +7,7 @@ this.isTabActionBar((e.target || e.srcElement) as HTMLElement);
'current' in (props.pagination as Object) 'current' in (props.pagination as Object)
start + (yearSelectTotal as number) start + (yearSelectTotal as number)
scrollTop > (visibilityHeight as number) scrollTop > (visibilityHeight as number)
export default class Column<T> extends (RcTable.Column as React.ComponentClass<ColumnProps<T>>) {} export default class Column<T> extends (RcTable.Column as React.ComponentClass<ColumnProps<T>,ColumnProps<T>,ColumnProps<T>,ColumnProps<T>>) {}
export abstract class MobxTypedForm extends (Form as { new (): any }) {} export abstract class MobxTypedForm extends (Form as { new (): any }) {}
({}) as {}; ({}) as {};
function*g() { function*g() {
@ -38,6 +38,9 @@ this.isTabActionBar((e.target || e.srcElement) as HTMLElement);
start + (yearSelectTotal as number); start + (yearSelectTotal as number);
scrollTop > (visibilityHeight as number); scrollTop > (visibilityHeight as number);
export default class Column<T> extends (RcTable.Column as React.ComponentClass< export default class Column<T> extends (RcTable.Column as React.ComponentClass<
ColumnProps<T>,
ColumnProps<T>,
ColumnProps<T>,
ColumnProps<T> ColumnProps<T>
>) {} >) {}
export abstract class MobxTypedForm extends (Form as { new (): any }) {} export abstract class MobxTypedForm extends (Form as { new (): any }) {}

View File

@ -4,7 +4,7 @@ this.isTabActionBar((e.target || e.srcElement) as HTMLElement);
'current' in (props.pagination as Object) 'current' in (props.pagination as Object)
start + (yearSelectTotal as number) start + (yearSelectTotal as number)
scrollTop > (visibilityHeight as number) scrollTop > (visibilityHeight as number)
export default class Column<T> extends (RcTable.Column as React.ComponentClass<ColumnProps<T>>) {} export default class Column<T> extends (RcTable.Column as React.ComponentClass<ColumnProps<T>,ColumnProps<T>,ColumnProps<T>,ColumnProps<T>>) {}
export abstract class MobxTypedForm extends (Form as { new (): any }) {} export abstract class MobxTypedForm extends (Form as { new (): any }) {}
({}) as {}; ({}) as {};
function*g() { function*g() {

View File

@ -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<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 {}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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`] = ` exports[`generics.ts 1`] = `
class<T> implements Map<T> {} class<T> implements Map<T> {}

View File

@ -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<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 {}