clang-format: [JS] do not collapse short classes.

Summary:
clang-format does not collapse short records, interfaces, unions, etc.,
but fails to do so if the record is preceded by certain modifiers
(export, default, abstract, declare). This change skips over all
modifiers, and thus handles all record definitions uniformly.

Before:
    export class Foo { bar: string; }
    class Baz {
      bam: string;
    }

After:
    export class Foo {
      bar: string;
    }
    class Baz {
      bam: string;
    }

Reviewers: djasper

Subscribers: klimek

Differential Revision: https://reviews.llvm.org/D40430

llvm-svn: 318976
This commit is contained in:
Martin Probst 2017-11-25 09:35:33 +00:00
parent e8e27ca866
commit c160cfaf66
2 changed files with 19 additions and 6 deletions

View File

@ -517,8 +517,13 @@ private:
} else if (Limit != 0 && !Line.startsWith(tok::kw_namespace) &&
!startsExternCBlock(Line)) {
// We don't merge short records.
FormatToken *RecordTok =
Line.First->is(tok::kw_typedef) ? Line.First->Next : Line.First;
FormatToken *RecordTok = Line.First;
// Skip record modifiers.
while (RecordTok->Next &&
RecordTok->isOneOf(tok::kw_typedef, tok::kw_export,
Keywords.kw_declare, Keywords.kw_abstract,
tok::kw_default))
RecordTok = RecordTok->Next;
if (RecordTok &&
RecordTok->isOneOf(tok::kw_class, tok::kw_union, tok::kw_struct,
Keywords.kw_interface))

View File

@ -1674,9 +1674,15 @@ TEST_F(FormatTestJS, Modules) {
" x: number;\n"
" y: string;\n"
"}");
verifyFormat("export class X { y: number; }");
verifyFormat("export abstract class X { y: number; }");
verifyFormat("export default class X { y: number }");
verifyFormat("export class X {\n"
" y: number;\n"
"}");
verifyFormat("export abstract class X {\n"
" y: number;\n"
"}");
verifyFormat("export default class X {\n"
" y: number\n"
"}");
verifyFormat("export default function() {\n return 1;\n}");
verifyFormat("export var x = 12;");
verifyFormat("class C {}\n"
@ -1698,7 +1704,9 @@ TEST_F(FormatTestJS, Modules) {
"];");
verifyFormat("export default [];");
verifyFormat("export default () => {};");
verifyFormat("export interface Foo { foo: number; }\n"
verifyFormat("export interface Foo {\n"
" foo: number;\n"
"}\n"
"export class Bar {\n"
" blah(): string {\n"
" return this.blah;\n"