summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Jasper <djasper@google.com>2012-12-04 13:02:32 +0000
committerDaniel Jasper <djasper@google.com>2012-12-04 13:02:32 +0000
commit8b5297117b19a241984a224f3b72406b508bc963 (patch)
tree2f32ad5fbddced0fca14ef42aa33aa39ee36091a
parente9bf349247bc2791c0774db5bcad9cca2b62c006 (diff)
downloadbcm5719-llvm-8b5297117b19a241984a224f3b72406b508bc963.tar.gz
bcm5719-llvm-8b5297117b19a241984a224f3b72406b508bc963.zip
Small fixes to unary operator recognition and handling of include
directives. llvm-svn: 169261
-rw-r--r--clang/lib/Format/Format.cpp26
-rw-r--r--clang/unittests/Format/FormatTest.cpp10
2 files changed, 30 insertions, 6 deletions
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index d11e223b53c..0383d01a311 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -21,6 +21,8 @@
#include "clang/Basic/SourceManager.h"
#include "clang/Lex/Lexer.h"
+#include <string>
+
namespace clang {
namespace format {
@@ -486,13 +488,11 @@ public:
Annotation.SpaceRequiredBefore = false;
} else if (Annotation.Type == TokenAnnotation::TT_UnaryOperator) {
Annotation.SpaceRequiredBefore =
- Line.Tokens[i - 1].Tok.isNot(tok::l_paren);
+ Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&
+ Line.Tokens[i - 1].Tok.isNot(tok::l_square);
} else if (Line.Tokens[i - 1].Tok.is(tok::greater) &&
Line.Tokens[i].Tok.is(tok::greater)) {
- if (Annotation.Type == TokenAnnotation::TT_TemplateOpener &&
- Annotations[i - 1].Type == TokenAnnotation::TT_TemplateOpener)
- Annotation.SpaceRequiredBefore = Style.SplitTemplateClosingGreater;
- else if (Annotation.Type == TokenAnnotation::TT_TemplateCloser &&
+ if (Annotation.Type == TokenAnnotation::TT_TemplateCloser &&
Annotations[i - 1].Type == TokenAnnotation::TT_TemplateCloser)
Annotation.SpaceRequiredBefore = Style.SplitTemplateClosingGreater;
else
@@ -505,6 +505,9 @@ public:
Annotations[i - 1].Type == TokenAnnotation::TT_TemplateCloser &&
Line.Tokens[i].Tok.is(tok::l_paren)) {
Annotation.SpaceRequiredBefore = false;
+ } else if (Line.Tokens[i].Tok.is(tok::less) &&
+ Line.Tokens[0].Tok.is(tok::hash)) {
+ Annotation.SpaceRequiredBefore = true;
} else {
Annotation.SpaceRequiredBefore =
spaceRequiredBetween(Line.Tokens[i - 1].Tok, Line.Tokens[i].Tok);
@@ -533,7 +536,7 @@ private:
if (Tok.Tok.is(tok::star) || Tok.Tok.is(tok::amp))
Annotation.Type = determineStarAmpUsage(i);
- else if (Tok.Tok.is(tok::minus) && Line.Tokens[i - 1].Tok.is(tok::equal))
+ else if (isUnaryOperator(i))
Annotation.Type = TokenAnnotation::TT_UnaryOperator;
else if (isBinaryOperator(Line.Tokens[i]))
Annotation.Type = TokenAnnotation::TT_BinaryOperator;
@@ -548,6 +551,17 @@ private:
}
}
+ bool isUnaryOperator(unsigned Index) {
+ const Token &Tok = Line.Tokens[Index].Tok;
+ if (Tok.isNot(tok::minus) && Tok.isNot(tok::plus))
+ return false;
+ const Token &PreviousTok = Line.Tokens[Index - 1].Tok;
+ if (PreviousTok.is(tok::equal) || PreviousTok.is(tok::l_paren) ||
+ PreviousTok.is(tok::comma) || PreviousTok.is(tok::l_square))
+ return true;
+ return Annotations[Index - 1].Type == TokenAnnotation::TT_BinaryOperator;
+ }
+
bool isBinaryOperator(const FormatToken &Tok) {
switch (Tok.Tok.getKind()) {
case tok::equal:
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index ca8df571ffe..f64ea4acd67 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -315,6 +315,9 @@ TEST_F(FormatTest, UnderstandsTemplateParameters) {
TEST_F(FormatTest, UndestandsUnaryOperators) {
verifyFormat("int a = -2;");
+ verifyFormat("f(-1, -2, -3);");
+ verifyFormat("a[-1] = 5;");
+ verifyFormat("int a = 5 + -2;");
}
TEST_F(FormatTest, UndestandsOverloadedOperators) {
@@ -333,6 +336,13 @@ TEST_F(FormatTest, UnderstandsUsesOfStar) {
// verifyFormat("int a = b * *c;");
}
+TEST_F(FormatTest, HandlesIncludeDirectives) {
+ EXPECT_EQ("#include <string>\n", format("#include <string>\n"));
+ EXPECT_EQ("#include \"a/b/string\"\n", format("#include \"a/b/string\"\n"));
+ EXPECT_EQ("#include \"string.h\"\n", format("#include \"string.h\"\n"));
+ EXPECT_EQ("#include \"string.h\"\n", format("#include \"string.h\"\n"));
+}
+
//TEST_F(FormatTest, IncorrectDerivedClass) {
// verifyFormat("public B {\n"
// "};");
OpenPOWER on IntegriCloud