From 0743f946710623cfb55d3ccdb2e89458adc60265 Mon Sep 17 00:00:00 2001 From: Dmitri Gribenko Date: Thu, 28 Jun 2012 01:38:21 +0000 Subject: [PATCH] Cleanup \brief comment. Since it is a single paragraph, no need to save newlines there. llvm-svn: 159325 --- clang/lib/AST/CommentBriefParser.cpp | 31 ++++++++++++++++++- .../Index/annotate-comments-unterminated.c | 4 +-- clang/test/Index/annotate-comments.cpp | 6 ++-- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/clang/lib/AST/CommentBriefParser.cpp b/clang/lib/AST/CommentBriefParser.cpp index f64730924615..4040a999249b 100644 --- a/clang/lib/AST/CommentBriefParser.cpp +++ b/clang/lib/AST/CommentBriefParser.cpp @@ -12,6 +12,34 @@ namespace clang { namespace comments { +namespace { +/// Convert all whitespace into spaces, remove leading and trailing spaces, +/// compress multiple spaces into one. +void cleanupBrief(std::string &S) { + bool PrevWasSpace = true; + std::string::iterator O = S.begin(); + for (std::string::iterator I = S.begin(), E = S.end(); + I != E; ++I) { + const char C = *I; + if (C == ' ' || C == '\n' || C == '\r' || + C == '\t' || C == '\v' || C == '\f') { + if (!PrevWasSpace) { + *O++ = ' '; + PrevWasSpace = true; + } + continue; + } else { + *O++ = C; + PrevWasSpace = false; + } + } + if (O != S.begin() && *(O - 1) == ' ') + --O; + + S.resize(O - S.begin()); +} +} // unnamed namespace + std::string BriefParser::Parse() { std::string Paragraph; bool InFirstParagraph = true; @@ -47,7 +75,7 @@ std::string BriefParser::Parse() { if (Tok.is(tok::newline)) { if (InFirstParagraph || InBrief) - Paragraph += '\n'; + Paragraph += ' '; ConsumeToken(); if (Tok.is(tok::newline)) { @@ -66,6 +94,7 @@ std::string BriefParser::Parse() { ConsumeToken(); } + cleanupBrief(Paragraph); return Paragraph; } diff --git a/clang/test/Index/annotate-comments-unterminated.c b/clang/test/Index/annotate-comments-unterminated.c index d72822a0938b..6bba911aac93 100644 --- a/clang/test/Index/annotate-comments-unterminated.c +++ b/clang/test/Index/annotate-comments-unterminated.c @@ -1,8 +1,8 @@ // RUN: c-index-test -test-load-source all %s | FileCheck %s // RUN: %clang_cc1 -fsyntax-only %s 2>&1 | FileCheck -check-prefix=ERR %s -// CHECK: annotate-comments-unterminated.c:9:5: VarDecl=x:{{.*}} RawComment=[/** Aaa. */]{{.*}} BriefComment=[ Aaa. \n] -// CHECK: annotate-comments-unterminated.c:11:5: VarDecl=y:{{.*}} RawComment=[/**< Bbb. */]{{.*}} BriefComment=[ Bbb. \n] +// CHECK: annotate-comments-unterminated.c:9:5: VarDecl=x:{{.*}} RawComment=[/** Aaa. */]{{.*}} BriefComment=[Aaa.] +// CHECK: annotate-comments-unterminated.c:11:5: VarDecl=y:{{.*}} RawComment=[/**< Bbb. */]{{.*}} BriefComment=[Bbb.] // CHECK-ERR: error: unterminated /** Aaa. */ diff --git a/clang/test/Index/annotate-comments.cpp b/clang/test/Index/annotate-comments.cpp index 59ffa88348a5..aa68defe9537 100644 --- a/clang/test/Index/annotate-comments.cpp +++ b/clang/test/Index/annotate-comments.cpp @@ -268,7 +268,7 @@ void isdoxy47(int); // CHECK: annotate-comments.cpp:163:7: FieldDecl=isdoxy42:{{.*}} isdoxy42 IS_DOXYGEN_SINGLE // CHECK: annotate-comments.cpp:176:6: FunctionDecl=isdoxy43:{{.*}} IS_DOXYGEN_START{{.*}} IS_DOXYGEN_END -// CHECK: annotate-comments.cpp:185:6: FunctionDecl=isdoxy44:{{.*}} BriefComment=[ IS_DOXYGEN_START Aaa bbb\n ccc.\n] -// CHECK: annotate-comments.cpp:195:6: FunctionDecl=isdoxy45:{{.*}} BriefComment=[\n Ddd eee.\n Fff.\n] -// CHECK: annotate-comments.cpp:204:6: FunctionDecl=isdoxy47:{{.*}} BriefComment=[ IS_DOXYGEN_START Aaa bbb\n ] +// CHECK: annotate-comments.cpp:185:6: FunctionDecl=isdoxy44:{{.*}} BriefComment=[IS_DOXYGEN_START Aaa bbb ccc.] +// CHECK: annotate-comments.cpp:195:6: FunctionDecl=isdoxy45:{{.*}} BriefComment=[Ddd eee. Fff.] +// CHECK: annotate-comments.cpp:204:6: FunctionDecl=isdoxy47:{{.*}} BriefComment=[IS_DOXYGEN_START Aaa bbb]