From: Nico Weber Date: Mon, 10 Nov 2014 16:30:02 +0000 (+0000) Subject: clang-format: [Java] Never treat @interface as annotation. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ae1c3ef1cf20df7c8d7828364d5f0412042604e8;p=clang clang-format: [Java] Never treat @interface as annotation. '@' followed by any keyword can't be an annotation, but @interface is currently the only combination of '@' and a keyword that's allowed, so limit it to this case. `@interface Foo` without a leading `public` was misformatted prior to this patch. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221607 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/FormatToken.h b/lib/Format/FormatToken.h index c2cc385602..0ef563b73a 100644 --- a/lib/Format/FormatToken.h +++ b/lib/Format/FormatToken.h @@ -299,6 +299,7 @@ struct FormatToken { bool isNot(T Kind) const { return Tok.isNot(Kind); } + bool isNot(IdentifierInfo *II) const { return II != Tok.getIdentifierInfo(); } bool isStringLiteral() const { return tok::isStringLiteral(Tok.getKind()); } @@ -544,6 +545,7 @@ struct AdditionalKeywords { kw_extends = &IdentTable.get("extends"); kw_implements = &IdentTable.get("implements"); + kw_interface = &IdentTable.get("interface"); kw_synchronized = &IdentTable.get("synchronized"); kw_throws = &IdentTable.get("throws"); @@ -566,6 +568,7 @@ struct AdditionalKeywords { // Java keywords. IdentifierInfo *kw_extends; IdentifierInfo *kw_implements; + IdentifierInfo *kw_interface; IdentifierInfo *kw_synchronized; IdentifierInfo *kw_throws; diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index d00e648706..62ec93f323 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -842,7 +842,8 @@ private: // function declaration have been found. Current.Type = TT_TrailingAnnotation; } else if (Style.Language == FormatStyle::LK_Java && Current.Previous && - Current.Previous->is(tok::at)) { + Current.Previous->is(tok::at) && + Current.isNot(Keywords.kw_interface)) { const FormatToken& AtToken = *Current.Previous; if (!AtToken.Previous || AtToken.Previous->Type == TT_LeadingJavaAnnotation) diff --git a/unittests/Format/FormatTestJava.cpp b/unittests/Format/FormatTestJava.cpp index c51566715d..44a7910e98 100644 --- a/unittests/Format/FormatTestJava.cpp +++ b/unittests/Format/FormatTestJava.cpp @@ -87,6 +87,22 @@ TEST_F(FormatTestJava, ClassDeclarations) { " implements cccccccccccc {\n" "}", getStyleWithColumns(76)); + verifyFormat("interface SomeInterface extends Foo, Bar {\n" + " void doStuff(int theStuff);\n" + " void doMoreStuff(int moreStuff);\n" + "}"); + verifyFormat("public interface SomeInterface {\n" + " void doStuff(int theStuff);\n" + " void doMoreStuff(int moreStuff);\n" + "}"); + verifyFormat("@interface SomeInterface {\n" + " void doStuff(int theStuff);\n" + " void doMoreStuff(int moreStuff);\n" + "}"); + verifyFormat("public @interface SomeInterface {\n" + " void doStuff(int theStuff);\n" + " void doMoreStuff(int moreStuff);\n" + "}"); } TEST_F(FormatTestJava, EnumDeclarations) {