From: Daniel Jasper Date: Wed, 18 Feb 2015 17:14:05 +0000 (+0000) Subject: clang-format: [JS] Support classes. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9d961664d98e216034f89ab90b2e02bc2dedcdfa;p=clang clang-format: [JS] Support classes. This adds support for JavaScript class definitions (again following TypeScript & AtScript style). This only required support for visibility modifiers in JS, everything else was already working. Patch by Martin Probst, thank you. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229701 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/UnwrappedLineFormatter.h b/lib/Format/UnwrappedLineFormatter.h index 5e0261210d..9b83b2733e 100644 --- a/lib/Format/UnwrappedLineFormatter.h +++ b/lib/Format/UnwrappedLineFormatter.h @@ -77,7 +77,8 @@ private: /// For example, 'public:' labels in classes are offset by 1 or 2 /// characters to the left from their level. int getIndentOffset(const FormatToken &RootToken) { - if (Style.Language == FormatStyle::LK_Java) + if (Style.Language == FormatStyle::LK_Java || + Style.Language == FormatStyle::LK_JavaScript) return 0; if (RootToken.isAccessSpecifier(false) || RootToken.isObjCAccessSpecifier()) return Style.AccessModifierOffset; diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp index 19e591b703..903884f7c1 100644 --- a/lib/Format/UnwrappedLineParser.cpp +++ b/lib/Format/UnwrappedLineParser.cpp @@ -693,7 +693,8 @@ void UnwrappedLineParser::parseStructuralElement() { case tok::kw_public: case tok::kw_protected: case tok::kw_private: - if (Style.Language == FormatStyle::LK_Java) + if (Style.Language == FormatStyle::LK_Java || + Style.Language == FormatStyle::LK_JavaScript) nextToken(); else parseAccessSpecifier(); @@ -823,13 +824,17 @@ void UnwrappedLineParser::parseStructuralElement() { break; } nextToken(); - if (Line->Tokens.size() == 1) { + if (Line->Tokens.size() == 1 && + // JS doesn't have macros, and within classes colons indicate fields, + // not labels. + (Style.Language != FormatStyle::LK_JavaScript || + !Line->MustBeDeclaration)) { if (FormatTok->Tok.is(tok::colon)) { parseLabel(); return; } // Recognize function-like macro usages without trailing semicolon as - // well as free-standing macrose like Q_OBJECT. + // well as free-standing macros like Q_OBJECT. bool FunctionLike = FormatTok->is(tok::l_paren); if (FunctionLike) parseParens(); diff --git a/unittests/Format/FormatTestJS.cpp b/unittests/Format/FormatTestJS.cpp index d5ce580f24..f062cbfaf2 100644 --- a/unittests/Format/FormatTestJS.cpp +++ b/unittests/Format/FormatTestJS.cpp @@ -500,5 +500,15 @@ TEST_F(FormatTestJS, TypeAnnotations) { verifyFormat("var x: P string>;"); } +TEST_F(FormatTestJS, ClassDeclarations) { + verifyFormat("class C {\n x: string = 12;\n}"); + verifyFormat("class C {\n x(): string => 12;\n}"); + verifyFormat("class C {\n ['x' + 2]: string = 12;\n}"); + verifyFormat("class C {\n private x: string = 12;\n}"); + verifyFormat("class C {\n private static x: string = 12;\n}"); + verifyFormat("class C {\n static x(): string { return 'asd'; }\n}"); + verifyFormat("class C extends P implements I {}"); +} + } // end namespace tooling } // end namespace clang