forked from OSchip/llvm-project
clang-format: [JS] do not break after declare namespace.
See TypeScript grammar for tokens following 'declare': https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#A.10 llvm-svn: 286467
This commit is contained in:
parent
d784f20c13
commit
72fd75a0d1
|
@ -580,12 +580,14 @@ struct AdditionalKeywords {
|
|||
kw_as = &IdentTable.get("as");
|
||||
kw_async = &IdentTable.get("async");
|
||||
kw_await = &IdentTable.get("await");
|
||||
kw_declare = &IdentTable.get("declare");
|
||||
kw_finally = &IdentTable.get("finally");
|
||||
kw_from = &IdentTable.get("from");
|
||||
kw_function = &IdentTable.get("function");
|
||||
kw_import = &IdentTable.get("import");
|
||||
kw_is = &IdentTable.get("is");
|
||||
kw_let = &IdentTable.get("let");
|
||||
kw_module = &IdentTable.get("module");
|
||||
kw_type = &IdentTable.get("type");
|
||||
kw_var = &IdentTable.get("var");
|
||||
kw_yield = &IdentTable.get("yield");
|
||||
|
@ -632,12 +634,14 @@ struct AdditionalKeywords {
|
|||
IdentifierInfo *kw_as;
|
||||
IdentifierInfo *kw_async;
|
||||
IdentifierInfo *kw_await;
|
||||
IdentifierInfo *kw_declare;
|
||||
IdentifierInfo *kw_finally;
|
||||
IdentifierInfo *kw_from;
|
||||
IdentifierInfo *kw_function;
|
||||
IdentifierInfo *kw_import;
|
||||
IdentifierInfo *kw_is;
|
||||
IdentifierInfo *kw_let;
|
||||
IdentifierInfo *kw_module;
|
||||
IdentifierInfo *kw_type;
|
||||
IdentifierInfo *kw_var;
|
||||
IdentifierInfo *kw_yield;
|
||||
|
|
|
@ -2426,10 +2426,10 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
|
|||
} else if (Style.Language == FormatStyle::LK_JavaScript) {
|
||||
const FormatToken *NonComment = Right.getPreviousNonComment();
|
||||
if (Left.isOneOf(tok::kw_return, tok::kw_continue, tok::kw_break,
|
||||
tok::kw_throw) ||
|
||||
tok::kw_throw, Keywords.kw_module) ||
|
||||
(NonComment &&
|
||||
NonComment->isOneOf(tok::kw_return, tok::kw_continue, tok::kw_break,
|
||||
tok::kw_throw)))
|
||||
tok::kw_throw, Keywords.kw_module)))
|
||||
return false; // Otherwise a semicolon is inserted.
|
||||
if (Left.is(TT_JsFatArrow) && Right.is(tok::l_brace))
|
||||
return false;
|
||||
|
@ -2443,6 +2443,18 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
|
|||
return Style.BreakBeforeBinaryOperators != FormatStyle::BOS_None;
|
||||
if (Right.is(Keywords.kw_as))
|
||||
return false; // must not break before as in 'x as type' casts
|
||||
if (Left.is(Keywords.kw_declare) &&
|
||||
Right.isOneOf(Keywords.kw_module, tok::kw_namespace,
|
||||
Keywords.kw_function, tok::kw_class, tok::kw_enum,
|
||||
Keywords.kw_interface, Keywords.kw_type, Keywords.kw_var,
|
||||
Keywords.kw_let, tok::kw_const))
|
||||
// See grammar for 'declare' statements at:
|
||||
// https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#A.10
|
||||
return false;
|
||||
if (Left.isOneOf(Keywords.kw_module, tok::kw_namespace) &&
|
||||
Right.isOneOf(tok::identifier, tok::string_literal)) {
|
||||
return false; // must not break in "module foo { ...}"
|
||||
}
|
||||
}
|
||||
|
||||
if (Left.is(tok::at))
|
||||
|
|
|
@ -349,6 +349,37 @@ TEST_F(FormatTestJS, FormatsNamespaces) {
|
|||
"}\n");
|
||||
}
|
||||
|
||||
TEST_F(FormatTestJS, NamespacesMayNotWrap) {
|
||||
verifyFormat("declare namespace foobarbaz {\n"
|
||||
"}\n", getGoogleJSStyleWithColumns(18));
|
||||
verifyFormat("declare module foobarbaz {\n"
|
||||
"}\n", getGoogleJSStyleWithColumns(15));
|
||||
verifyFormat("namespace foobarbaz {\n"
|
||||
"}\n", getGoogleJSStyleWithColumns(10));
|
||||
verifyFormat("module foobarbaz {\n"
|
||||
"}\n", getGoogleJSStyleWithColumns(7));
|
||||
}
|
||||
|
||||
TEST_F(FormatTestJS, AmbientDeclarations) {
|
||||
FormatStyle NineCols = getGoogleJSStyleWithColumns(9);
|
||||
verifyFormat(
|
||||
"declare class\n"
|
||||
" X {}",
|
||||
NineCols);
|
||||
verifyFormat(
|
||||
"declare function\n"
|
||||
"x();", // TODO(martinprobst): should ideally be indented.
|
||||
NineCols);
|
||||
verifyFormat(
|
||||
"declare enum X {\n"
|
||||
"}",
|
||||
NineCols);
|
||||
verifyFormat(
|
||||
"declare let\n"
|
||||
" x: number;",
|
||||
NineCols);
|
||||
}
|
||||
|
||||
TEST_F(FormatTestJS, FormatsFreestandingFunctions) {
|
||||
verifyFormat("function outer1(a, b) {\n"
|
||||
" function inner1(a, b) {\n"
|
||||
|
|
Loading…
Reference in New Issue