diff options
author | Dmitri Gribenko <gribozavr@gmail.com> | 2012-07-11 21:38:39 +0000 |
---|---|---|
committer | Dmitri Gribenko <gribozavr@gmail.com> | 2012-07-11 21:38:39 +0000 |
commit | f26054f0fb53f65dbfbfc01954dc3b2028582cde (patch) | |
tree | 51e846b631a7c929833c43b321a0532d3b64bf45 /clang/lib/AST/CommentLexer.cpp | |
parent | a46ec4534d458f9cdb76f213ca3a42690296f21b (diff) | |
download | bcm5719-llvm-f26054f0fb53f65dbfbfc01954dc3b2028582cde.tar.gz bcm5719-llvm-f26054f0fb53f65dbfbfc01954dc3b2028582cde.zip |
Enable comment parsing and semantic analysis to emit diagnostics. A few
diagnostics implemented -- see testcases.
I created a new TableGen file for comment diagnostics,
DiagnosticCommentKinds.td, because comment diagnostics don't logically
fit into AST diagnostics file. But I don't feel strongly about it.
This also implements support for self-closing HTML tags in comment
lexer and parser (for example, <br />).
In order to issue precise diagnostics CommentSema needs to know the
declaration the comment is attached to. There is no easy way to find a decl by
comment, so we match comments and decls in lockstep: after parsing one
declgroup we check if we have any new, not yet attached comments. If we do --
then we do the usual comment-finding process.
It is interesting that this automatically handles trailing comments.
We pick up not only comments that precede the declaration, but also
comments that *follow* the declaration -- thanks to the lookahead in
the lexer: after parsing the declgroup we've consumed the semicolon
and looked ahead through comments.
Added -Wdocumentation-html flag for semantic HTML errors to allow the user to
disable only HTML warnings (but not HTML parse errors, which we emit as
warnings in -Wdocumentation).
llvm-svn: 160078
Diffstat (limited to 'clang/lib/AST/CommentLexer.cpp')
-rw-r--r-- | clang/lib/AST/CommentLexer.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/clang/lib/AST/CommentLexer.cpp b/clang/lib/AST/CommentLexer.cpp index 55cd409a9ca..1f4955d1cf2 100644 --- a/clang/lib/AST/CommentLexer.cpp +++ b/clang/lib/AST/CommentLexer.cpp @@ -509,7 +509,7 @@ void Lexer::setupAndLexHTMLOpenTag(Token &T) { const char C = *BufferPtr; if (BufferPtr != CommentEnd && - (C == '>' || isHTMLIdentifierStartingCharacter(C))) + (C == '>' || C == '/' || isHTMLIdentifierStartingCharacter(C))) State = LS_HTMLOpenTag; } @@ -546,6 +546,18 @@ void Lexer::lexHTMLOpenTag(Token &T) { formTokenWithChars(T, TokenPtr, tok::html_greater); State = LS_Normal; return; + case '/': + TokenPtr++; + if (TokenPtr != CommentEnd && *TokenPtr == '>') { + TokenPtr++; + formTokenWithChars(T, TokenPtr, tok::html_slash_greater); + } else { + StringRef Text(BufferPtr, TokenPtr - BufferPtr); + formTokenWithChars(T, TokenPtr, tok::text); + T.setText(Text); + } + State = LS_Normal; + return; } } |