diff options
author | Nico Weber <nicolasweber@gmx.de> | 2014-11-10 16:30:02 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2014-11-10 16:30:02 +0000 |
commit | a644d7f39c22e918c1368169e508048b7860e32e (patch) | |
tree | 176aaa006ba6bfdb85fe406a84d9cb528e479211 | |
parent | 337f5b27adaa61395cba6af8fe1b2999dbc234fa (diff) | |
download | bcm5719-llvm-a644d7f39c22e918c1368169e508048b7860e32e.tar.gz bcm5719-llvm-a644d7f39c22e918c1368169e508048b7860e32e.zip |
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.
llvm-svn: 221607
-rw-r--r-- | clang/lib/Format/FormatToken.h | 3 | ||||
-rw-r--r-- | clang/lib/Format/TokenAnnotator.cpp | 3 | ||||
-rw-r--r-- | clang/unittests/Format/FormatTestJava.cpp | 16 |
3 files changed, 21 insertions, 1 deletions
diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h index c2cc3856024..0ef563b73a7 100644 --- a/clang/lib/Format/FormatToken.h +++ b/clang/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/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index d00e648706b..62ec93f3234 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/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/clang/unittests/Format/FormatTestJava.cpp b/clang/unittests/Format/FormatTestJava.cpp index c51566715dd..44a7910e989 100644 --- a/clang/unittests/Format/FormatTestJava.cpp +++ b/clang/unittests/Format/FormatTestJava.cpp @@ -87,6 +87,22 @@ TEST_F(FormatTestJava, ClassDeclarations) { " implements cccccccccccc {\n" "}", getStyleWithColumns(76)); + verifyFormat("interface SomeInterface<A> 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) { |