forked from OSchip/llvm-project
[clang-format] JS: don't treat is: as a type matcher
Summary: Clang-format is treating all occurences of `is` in js as type matchers. In some cases this is wrong, as it might be a dict key. Reviewers: mprobst Reviewed By: mprobst Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D54753 llvm-svn: 347307
This commit is contained in:
parent
f5e4f0af7b
commit
c1631019a8
|
@ -3113,8 +3113,21 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
|
|||
// Don't wrap between ":" and "!" of a strict prop init ("field!: type;").
|
||||
if (Left.is(tok::exclaim) && Right.is(tok::colon))
|
||||
return false;
|
||||
if (Right.is(Keywords.kw_is))
|
||||
return false;
|
||||
// Look for is type annotations like:
|
||||
// function f(): a is B { ... }
|
||||
// Do not break before is in these cases.
|
||||
if (Right.is(Keywords.kw_is)) {
|
||||
const FormatToken* Next = Right.getNextNonComment();
|
||||
// If `is` is followed by a colon, it's likely that it's a dict key, so
|
||||
// ignore it for this check.
|
||||
// For example this is common in Polymer:
|
||||
// Polymer({
|
||||
// is: 'name',
|
||||
// ...
|
||||
// });
|
||||
if (!Next || !Next->is(tok::colon))
|
||||
return false;
|
||||
}
|
||||
if (Left.is(Keywords.kw_in))
|
||||
return Style.BreakBeforeBinaryOperators == FormatStyle::BOS_None;
|
||||
if (Right.is(Keywords.kw_in))
|
||||
|
|
|
@ -1186,6 +1186,16 @@ TEST_F(FormatTestJS, WrapRespectsAutomaticSemicolonInsertion) {
|
|||
getGoogleJSStyleWithColumns(25));
|
||||
}
|
||||
|
||||
TEST_F(FormatTestJS, AddsIsTheDictKeyOnNewline) {
|
||||
// Do not confuse is, the dict key with is, the type matcher. Put is, the dict
|
||||
// key, on a newline.
|
||||
verifyFormat("Polymer({\n"
|
||||
" is: '', //\n"
|
||||
" rest: 1\n"
|
||||
"});",
|
||||
getGoogleJSStyleWithColumns(20));
|
||||
}
|
||||
|
||||
TEST_F(FormatTestJS, AutomaticSemicolonInsertionHeuristic) {
|
||||
verifyFormat("a\n"
|
||||
"b;",
|
||||
|
|
Loading…
Reference in New Issue