summaryrefslogtreecommitdiffstats
path: root/include/clang/AST/Comment.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/clang/AST/Comment.h')
-rw-r--r--include/clang/AST/Comment.h1142
1 files changed, 0 insertions, 1142 deletions
diff --git a/include/clang/AST/Comment.h b/include/clang/AST/Comment.h
deleted file mode 100644
index 94470cb..0000000
--- a/include/clang/AST/Comment.h
+++ /dev/null
@@ -1,1142 +0,0 @@
-//===--- Comment.h - Comment AST nodes --------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines comment AST nodes.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_AST_COMMENT_H
-#define LLVM_CLANG_AST_COMMENT_H
-
-#include "clang/AST/CommentCommandTraits.h"
-#include "clang/AST/DeclObjC.h"
-#include "clang/AST/Type.h"
-#include "clang/Basic/SourceLocation.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/StringRef.h"
-
-namespace clang {
-class Decl;
-class ParmVarDecl;
-class TemplateParameterList;
-
-namespace comments {
-class FullComment;
-
-/// Describes the syntax that was used in a documentation command.
-///
-/// Exact values of this enumeration are important because they used to select
-/// parts of diagnostic messages. Audit diagnostics before changing or adding
-/// a new value.
-enum CommandMarkerKind {
- /// Command started with a backslash character:
- /// \code
- /// \foo
- /// \endcode
- CMK_Backslash = 0,
-
- /// Command started with an 'at' character:
- /// \code
- /// @foo
- /// \endcode
- CMK_At = 1
-};
-
-/// Any part of the comment.
-/// Abstract class.
-class Comment {
-protected:
- /// Preferred location to show caret.
- SourceLocation Loc;
-
- /// Source range of this AST node.
- SourceRange Range;
-
- class CommentBitfields {
- friend class Comment;
-
- /// Type of this AST node.
- unsigned Kind : 8;
- };
- enum { NumCommentBits = 8 };
-
- class InlineContentCommentBitfields {
- friend class InlineContentComment;
-
- unsigned : NumCommentBits;
-
- /// True if there is a newline after this inline content node.
- /// (There is no separate AST node for a newline.)
- unsigned HasTrailingNewline : 1;
- };
- enum { NumInlineContentCommentBits = NumCommentBits + 1 };
-
- class TextCommentBitfields {
- friend class TextComment;
-
- unsigned : NumInlineContentCommentBits;
-
- /// True if \c IsWhitespace field contains a valid value.
- mutable unsigned IsWhitespaceValid : 1;
-
- /// True if this comment AST node contains only whitespace.
- mutable unsigned IsWhitespace : 1;
- };
- enum { NumTextCommentBits = NumInlineContentCommentBits + 2 };
-
- class InlineCommandCommentBitfields {
- friend class InlineCommandComment;
-
- unsigned : NumInlineContentCommentBits;
-
- unsigned RenderKind : 2;
- unsigned CommandID : CommandInfo::NumCommandIDBits;
- };
- enum { NumInlineCommandCommentBits = NumInlineContentCommentBits + 2 +
- CommandInfo::NumCommandIDBits };
-
- class HTMLTagCommentBitfields {
- friend class HTMLTagComment;
-
- unsigned : NumInlineContentCommentBits;
-
- /// True if we found that this tag is malformed in some way.
- unsigned IsMalformed : 1;
- };
- enum { NumHTMLTagCommentBits = NumInlineContentCommentBits + 1 };
-
- class HTMLStartTagCommentBitfields {
- friend class HTMLStartTagComment;
-
- unsigned : NumHTMLTagCommentBits;
-
- /// True if this tag is self-closing (e. g., <br />). This is based on tag
- /// spelling in comment (plain <br> would not set this flag).
- unsigned IsSelfClosing : 1;
- };
- enum { NumHTMLStartTagCommentBits = NumHTMLTagCommentBits + 1 };
-
- class ParagraphCommentBitfields {
- friend class ParagraphComment;
-
- unsigned : NumCommentBits;
-
- /// True if \c IsWhitespace field contains a valid value.
- mutable unsigned IsWhitespaceValid : 1;
-
- /// True if this comment AST node contains only whitespace.
- mutable unsigned IsWhitespace : 1;
- };
- enum { NumParagraphCommentBits = NumCommentBits + 2 };
-
- class BlockCommandCommentBitfields {
- friend class BlockCommandComment;
-
- unsigned : NumCommentBits;
-
- unsigned CommandID : CommandInfo::NumCommandIDBits;
-
- /// Describes the syntax that was used in a documentation command.
- /// Contains values from CommandMarkerKind enum.
- unsigned CommandMarker : 1;
- };
- enum { NumBlockCommandCommentBits = NumCommentBits +
- CommandInfo::NumCommandIDBits + 1 };
-
- class ParamCommandCommentBitfields {
- friend class ParamCommandComment;
-
- unsigned : NumBlockCommandCommentBits;
-
- /// Parameter passing direction, see ParamCommandComment::PassDirection.
- unsigned Direction : 2;
-
- /// True if direction was specified explicitly in the comment.
- unsigned IsDirectionExplicit : 1;
- };
- enum { NumParamCommandCommentBits = NumBlockCommandCommentBits + 3 };
-
- union {
- CommentBitfields CommentBits;
- InlineContentCommentBitfields InlineContentCommentBits;
- TextCommentBitfields TextCommentBits;
- InlineCommandCommentBitfields InlineCommandCommentBits;
- HTMLTagCommentBitfields HTMLTagCommentBits;
- HTMLStartTagCommentBitfields HTMLStartTagCommentBits;
- ParagraphCommentBitfields ParagraphCommentBits;
- BlockCommandCommentBitfields BlockCommandCommentBits;
- ParamCommandCommentBitfields ParamCommandCommentBits;
- };
-
- void setSourceRange(SourceRange SR) {
- Range = SR;
- }
-
- void setLocation(SourceLocation L) {
- Loc = L;
- }
-
-public:
- enum CommentKind {
- NoCommentKind = 0,
-#define COMMENT(CLASS, PARENT) CLASS##Kind,
-#define COMMENT_RANGE(BASE, FIRST, LAST) \
- First##BASE##Constant=FIRST##Kind, Last##BASE##Constant=LAST##Kind,
-#define LAST_COMMENT_RANGE(BASE, FIRST, LAST) \
- First##BASE##Constant=FIRST##Kind, Last##BASE##Constant=LAST##Kind
-#define ABSTRACT_COMMENT(COMMENT)
-#include "clang/AST/CommentNodes.inc"
- };
-
- Comment(CommentKind K,
- SourceLocation LocBegin,
- SourceLocation LocEnd) :
- Loc(LocBegin), Range(SourceRange(LocBegin, LocEnd)) {
- CommentBits.Kind = K;
- }
-
- CommentKind getCommentKind() const {
- return static_cast<CommentKind>(CommentBits.Kind);
- }
-
- const char *getCommentKindName() const;
-
- void dump() const;
- void dumpColor() const;
- void dump(const ASTContext &Context) const;
- void dump(raw_ostream &OS, const CommandTraits *Traits,
- const SourceManager *SM) const;
-
- SourceRange getSourceRange() const LLVM_READONLY { return Range; }
-
- SourceLocation getLocStart() const LLVM_READONLY {
- return Range.getBegin();
- }
-
- SourceLocation getLocEnd() const LLVM_READONLY {
- return Range.getEnd();
- }
-
- SourceLocation getLocation() const LLVM_READONLY { return Loc; }
-
- typedef Comment * const *child_iterator;
-
- child_iterator child_begin() const;
- child_iterator child_end() const;
-
- // TODO: const child iterator
-
- unsigned child_count() const {
- return child_end() - child_begin();
- }
-};
-
-/// Inline content (contained within a block).
-/// Abstract class.
-class InlineContentComment : public Comment {
-protected:
- InlineContentComment(CommentKind K,
- SourceLocation LocBegin,
- SourceLocation LocEnd) :
- Comment(K, LocBegin, LocEnd) {
- InlineContentCommentBits.HasTrailingNewline = 0;
- }
-
-public:
- static bool classof(const Comment *C) {
- return C->getCommentKind() >= FirstInlineContentCommentConstant &&
- C->getCommentKind() <= LastInlineContentCommentConstant;
- }
-
- void addTrailingNewline() {
- InlineContentCommentBits.HasTrailingNewline = 1;
- }
-
- bool hasTrailingNewline() const {
- return InlineContentCommentBits.HasTrailingNewline;
- }
-};
-
-/// Plain text.
-class TextComment : public InlineContentComment {
- StringRef Text;
-
-public:
- TextComment(SourceLocation LocBegin,
- SourceLocation LocEnd,
- StringRef Text) :
- InlineContentComment(TextCommentKind, LocBegin, LocEnd),
- Text(Text) {
- TextCommentBits.IsWhitespaceValid = false;
- }
-
- static bool classof(const Comment *C) {
- return C->getCommentKind() == TextCommentKind;
- }
-
- child_iterator child_begin() const { return nullptr; }
-
- child_iterator child_end() const { return nullptr; }
-
- StringRef getText() const LLVM_READONLY { return Text; }
-
- bool isWhitespace() const {
- if (TextCommentBits.IsWhitespaceValid)
- return TextCommentBits.IsWhitespace;
-
- TextCommentBits.IsWhitespace = isWhitespaceNoCache();
- TextCommentBits.IsWhitespaceValid = true;
- return TextCommentBits.IsWhitespace;
- }
-
-private:
- bool isWhitespaceNoCache() const;
-};
-
-/// A command with word-like arguments that is considered inline content.
-class InlineCommandComment : public InlineContentComment {
-public:
- struct Argument {
- SourceRange Range;
- StringRef Text;
-
- Argument(SourceRange Range, StringRef Text) : Range(Range), Text(Text) { }
- };
-
- /// The most appropriate rendering mode for this command, chosen on command
- /// semantics in Doxygen.
- enum RenderKind {
- RenderNormal,
- RenderBold,
- RenderMonospaced,
- RenderEmphasized
- };
-
-protected:
- /// Command arguments.
- ArrayRef<Argument> Args;
-
-public:
- InlineCommandComment(SourceLocation LocBegin,
- SourceLocation LocEnd,
- unsigned CommandID,
- RenderKind RK,
- ArrayRef<Argument> Args) :
- InlineContentComment(InlineCommandCommentKind, LocBegin, LocEnd),
- Args(Args) {
- InlineCommandCommentBits.RenderKind = RK;
- InlineCommandCommentBits.CommandID = CommandID;
- }
-
- static bool classof(const Comment *C) {
- return C->getCommentKind() == InlineCommandCommentKind;
- }
-
- child_iterator child_begin() const { return nullptr; }
-
- child_iterator child_end() const { return nullptr; }
-
- unsigned getCommandID() const {
- return InlineCommandCommentBits.CommandID;
- }
-
- StringRef getCommandName(const CommandTraits &Traits) const {
- return Traits.getCommandInfo(getCommandID())->Name;
- }
-
- SourceRange getCommandNameRange() const {
- return SourceRange(getLocStart().getLocWithOffset(-1),
- getLocEnd());
- }
-
- RenderKind getRenderKind() const {
- return static_cast<RenderKind>(InlineCommandCommentBits.RenderKind);
- }
-
- unsigned getNumArgs() const {
- return Args.size();
- }
-
- StringRef getArgText(unsigned Idx) const {
- return Args[Idx].Text;
- }
-
- SourceRange getArgRange(unsigned Idx) const {
- return Args[Idx].Range;
- }
-};
-
-/// Abstract class for opening and closing HTML tags. HTML tags are always
-/// treated as inline content (regardless HTML semantics).
-class HTMLTagComment : public InlineContentComment {
-protected:
- StringRef TagName;
- SourceRange TagNameRange;
-
- HTMLTagComment(CommentKind K,
- SourceLocation LocBegin,
- SourceLocation LocEnd,
- StringRef TagName,
- SourceLocation TagNameBegin,
- SourceLocation TagNameEnd) :
- InlineContentComment(K, LocBegin, LocEnd),
- TagName(TagName),
- TagNameRange(TagNameBegin, TagNameEnd) {
- setLocation(TagNameBegin);
- HTMLTagCommentBits.IsMalformed = 0;
- }
-
-public:
- static bool classof(const Comment *C) {
- return C->getCommentKind() >= FirstHTMLTagCommentConstant &&
- C->getCommentKind() <= LastHTMLTagCommentConstant;
- }
-
- StringRef getTagName() const LLVM_READONLY { return TagName; }
-
- SourceRange getTagNameSourceRange() const LLVM_READONLY {
- SourceLocation L = getLocation();
- return SourceRange(L.getLocWithOffset(1),
- L.getLocWithOffset(1 + TagName.size()));
- }
-
- bool isMalformed() const {
- return HTMLTagCommentBits.IsMalformed;
- }
-
- void setIsMalformed() {
- HTMLTagCommentBits.IsMalformed = 1;
- }
-};
-
-/// An opening HTML tag with attributes.
-class HTMLStartTagComment : public HTMLTagComment {
-public:
- class Attribute {
- public:
- SourceLocation NameLocBegin;
- StringRef Name;
-
- SourceLocation EqualsLoc;
-
- SourceRange ValueRange;
- StringRef Value;
-
- Attribute() { }
-
- Attribute(SourceLocation NameLocBegin, StringRef Name) :
- NameLocBegin(NameLocBegin), Name(Name),
- EqualsLoc(SourceLocation()),
- ValueRange(SourceRange()), Value(StringRef())
- { }
-
- Attribute(SourceLocation NameLocBegin, StringRef Name,
- SourceLocation EqualsLoc,
- SourceRange ValueRange, StringRef Value) :
- NameLocBegin(NameLocBegin), Name(Name),
- EqualsLoc(EqualsLoc),
- ValueRange(ValueRange), Value(Value)
- { }
-
- SourceLocation getNameLocEnd() const {
- return NameLocBegin.getLocWithOffset(Name.size());
- }
-
- SourceRange getNameRange() const {
- return SourceRange(NameLocBegin, getNameLocEnd());
- }
- };
-
-private:
- ArrayRef<Attribute> Attributes;
-
-public:
- HTMLStartTagComment(SourceLocation LocBegin,
- StringRef TagName) :
- HTMLTagComment(HTMLStartTagCommentKind,
- LocBegin, LocBegin.getLocWithOffset(1 + TagName.size()),
- TagName,
- LocBegin.getLocWithOffset(1),
- LocBegin.getLocWithOffset(1 + TagName.size())) {
- HTMLStartTagCommentBits.IsSelfClosing = false;
- }
-
- static bool classof(const Comment *C) {
- return C->getCommentKind() == HTMLStartTagCommentKind;
- }
-
- child_iterator child_begin() const { return nullptr; }
-
- child_iterator child_end() const { return nullptr; }
-
- unsigned getNumAttrs() const {
- return Attributes.size();
- }
-
- const Attribute &getAttr(unsigned Idx) const {
- return Attributes[Idx];
- }
-
- void setAttrs(ArrayRef<Attribute> Attrs) {
- Attributes = Attrs;
- if (!Attrs.empty()) {
- const Attribute &Attr = Attrs.back();
- SourceLocation L = Attr.ValueRange.getEnd();
- if (L.isValid())
- Range.setEnd(L);
- else {
- Range.setEnd(Attr.getNameLocEnd());
- }
- }
- }
-
- void setGreaterLoc(SourceLocation GreaterLoc) {
- Range.setEnd(GreaterLoc);
- }
-
- bool isSelfClosing() const {
- return HTMLStartTagCommentBits.IsSelfClosing;
- }
-
- void setSelfClosing() {
- HTMLStartTagCommentBits.IsSelfClosing = true;
- }
-};
-
-/// A closing HTML tag.
-class HTMLEndTagComment : public HTMLTagComment {
-public:
- HTMLEndTagComment(SourceLocation LocBegin,
- SourceLocation LocEnd,
- StringRef TagName) :
- HTMLTagComment(HTMLEndTagCommentKind,
- LocBegin, LocEnd,
- TagName,
- LocBegin.getLocWithOffset(2),
- LocBegin.getLocWithOffset(2 + TagName.size()))
- { }
-
- static bool classof(const Comment *C) {
- return C->getCommentKind() == HTMLEndTagCommentKind;
- }
-
- child_iterator child_begin() const { return nullptr; }
-
- child_iterator child_end() const { return nullptr; }
-};
-
-/// Block content (contains inline content).
-/// Abstract class.
-class BlockContentComment : public Comment {
-protected:
- BlockContentComment(CommentKind K,
- SourceLocation LocBegin,
- SourceLocation LocEnd) :
- Comment(K, LocBegin, LocEnd)
- { }
-
-public:
- static bool classof(const Comment *C) {
- return C->getCommentKind() >= FirstBlockContentCommentConstant &&
- C->getCommentKind() <= LastBlockContentCommentConstant;
- }
-};
-
-/// A single paragraph that contains inline content.
-class ParagraphComment : public BlockContentComment {
- ArrayRef<InlineContentComment *> Content;
-
-public:
- ParagraphComment(ArrayRef<InlineContentComment *> Content) :
- BlockContentComment(ParagraphCommentKind,
- SourceLocation(),
- SourceLocation()),
- Content(Content) {
- if (Content.empty()) {
- ParagraphCommentBits.IsWhitespace = true;
- ParagraphCommentBits.IsWhitespaceValid = true;
- return;
- }
-
- ParagraphCommentBits.IsWhitespaceValid = false;
-
- setSourceRange(SourceRange(Content.front()->getLocStart(),
- Content.back()->getLocEnd()));
- setLocation(Content.front()->getLocStart());
- }
-
- static bool classof(const Comment *C) {
- return C->getCommentKind() == ParagraphCommentKind;
- }
-
- child_iterator child_begin() const {
- return reinterpret_cast<child_iterator>(Content.begin());
- }
-
- child_iterator child_end() const {
- return reinterpret_cast<child_iterator>(Content.end());
- }
-
- bool isWhitespace() const {
- if (ParagraphCommentBits.IsWhitespaceValid)
- return ParagraphCommentBits.IsWhitespace;
-
- ParagraphCommentBits.IsWhitespace = isWhitespaceNoCache();
- ParagraphCommentBits.IsWhitespaceValid = true;
- return ParagraphCommentBits.IsWhitespace;
- }
-
-private:
- bool isWhitespaceNoCache() const;
-};
-
-/// A command that has zero or more word-like arguments (number of word-like
-/// arguments depends on command name) and a paragraph as an argument
-/// (e. g., \\brief).
-class BlockCommandComment : public BlockContentComment {
-public:
- struct Argument {
- SourceRange Range;
- StringRef Text;
-
- Argument() { }
- Argument(SourceRange Range, StringRef Text) : Range(Range), Text(Text) { }
- };
-
-protected:
- /// Word-like arguments.
- ArrayRef<Argument> Args;
-
- /// Paragraph argument.
- ParagraphComment *Paragraph;
-
- BlockCommandComment(CommentKind K,
- SourceLocation LocBegin,
- SourceLocation LocEnd,
- unsigned CommandID,
- CommandMarkerKind CommandMarker) :
- BlockContentComment(K, LocBegin, LocEnd),
- Paragraph(nullptr) {
- setLocation(getCommandNameBeginLoc());
- BlockCommandCommentBits.CommandID = CommandID;
- BlockCommandCommentBits.CommandMarker = CommandMarker;
- }
-
-public:
- BlockCommandComment(SourceLocation LocBegin,
- SourceLocation LocEnd,
- unsigned CommandID,
- CommandMarkerKind CommandMarker) :
- BlockContentComment(BlockCommandCommentKind, LocBegin, LocEnd),
- Paragraph(nullptr) {
- setLocation(getCommandNameBeginLoc());
- BlockCommandCommentBits.CommandID = CommandID;
- BlockCommandCommentBits.CommandMarker = CommandMarker;
- }
-
- static bool classof(const Comment *C) {
- return C->getCommentKind() >= FirstBlockCommandCommentConstant &&
- C->getCommentKind() <= LastBlockCommandCommentConstant;
- }
-
- child_iterator child_begin() const {
- return reinterpret_cast<child_iterator>(&Paragraph);
- }
-
- child_iterator child_end() const {
- return reinterpret_cast<child_iterator>(&Paragraph + 1);
- }
-
- unsigned getCommandID() const {
- return BlockCommandCommentBits.CommandID;
- }
-
- StringRef getCommandName(const CommandTraits &Traits) const {
- return Traits.getCommandInfo(getCommandID())->Name;
- }
-
- SourceLocation getCommandNameBeginLoc() const {
- return getLocStart().getLocWithOffset(1);
- }
-
- SourceRange getCommandNameRange(const CommandTraits &Traits) const {
- StringRef Name = getCommandName(Traits);
- return SourceRange(getCommandNameBeginLoc(),
- getLocStart().getLocWithOffset(1 + Name.size()));
- }
-
- unsigned getNumArgs() const {
- return Args.size();
- }
-
- StringRef getArgText(unsigned Idx) const {
- return Args[Idx].Text;
- }
-
- SourceRange getArgRange(unsigned Idx) const {
- return Args[Idx].Range;
- }
-
- void setArgs(ArrayRef<Argument> A) {
- Args = A;
- if (Args.size() > 0) {
- SourceLocation NewLocEnd = Args.back().Range.getEnd();
- if (NewLocEnd.isValid())
- setSourceRange(SourceRange(getLocStart(), NewLocEnd));
- }
- }
-
- ParagraphComment *getParagraph() const LLVM_READONLY {
- return Paragraph;
- }
-
- bool hasNonWhitespaceParagraph() const {
- return Paragraph && !Paragraph->isWhitespace();
- }
-
- void setParagraph(ParagraphComment *PC) {
- Paragraph = PC;
- SourceLocation NewLocEnd = PC->getLocEnd();
- if (NewLocEnd.isValid())
- setSourceRange(SourceRange(getLocStart(), NewLocEnd));
- }
-
- CommandMarkerKind getCommandMarker() const LLVM_READONLY {
- return static_cast<CommandMarkerKind>(
- BlockCommandCommentBits.CommandMarker);
- }
-};
-
-/// Doxygen \\param command.
-class ParamCommandComment : public BlockCommandComment {
-private:
- /// Parameter index in the function declaration.
- unsigned ParamIndex;
-
-public:
- enum : unsigned {
- InvalidParamIndex = ~0U,
- VarArgParamIndex = ~0U/*InvalidParamIndex*/ - 1U
- };
-
- ParamCommandComment(SourceLocation LocBegin,
- SourceLocation LocEnd,
- unsigned CommandID,
- CommandMarkerKind CommandMarker) :
- BlockCommandComment(ParamCommandCommentKind, LocBegin, LocEnd,
- CommandID, CommandMarker),
- ParamIndex(InvalidParamIndex) {
- ParamCommandCommentBits.Direction = In;
- ParamCommandCommentBits.IsDirectionExplicit = false;
- }
-
- static bool classof(const Comment *C) {
- return C->getCommentKind() == ParamCommandCommentKind;
- }
-
- enum PassDirection {
- In,
- Out,
- InOut
- };
-
- static const char *getDirectionAsString(PassDirection D);
-
- PassDirection getDirection() const LLVM_READONLY {
- return static_cast<PassDirection>(ParamCommandCommentBits.Direction);
- }
-
- bool isDirectionExplicit() const LLVM_READONLY {
- return ParamCommandCommentBits.IsDirectionExplicit;
- }
-
- void setDirection(PassDirection Direction, bool Explicit) {
- ParamCommandCommentBits.Direction = Direction;
- ParamCommandCommentBits.IsDirectionExplicit = Explicit;
- }
-
- bool hasParamName() const {
- return getNumArgs() > 0;
- }
-
- StringRef getParamName(const FullComment *FC) const;
-
- StringRef getParamNameAsWritten() const {
- return Args[0].Text;
- }
-
- SourceRange getParamNameRange() const {
- return Args[0].Range;
- }
-
- bool isParamIndexValid() const LLVM_READONLY {
- return ParamIndex != InvalidParamIndex;
- }
-
- bool isVarArgParam() const LLVM_READONLY {
- return ParamIndex == VarArgParamIndex;
- }
-
- void setIsVarArgParam() {
- ParamIndex = VarArgParamIndex;
- assert(isParamIndexValid());
- }
-
- unsigned getParamIndex() const LLVM_READONLY {
- assert(isParamIndexValid());
- assert(!isVarArgParam());
- return ParamIndex;
- }
-
- void setParamIndex(unsigned Index) {
- ParamIndex = Index;
- assert(isParamIndexValid());
- assert(!isVarArgParam());
- }
-};
-
-/// Doxygen \\tparam command, describes a template parameter.
-class TParamCommandComment : public BlockCommandComment {
-private:
- /// If this template parameter name was resolved (found in template parameter
- /// list), then this stores a list of position indexes in all template
- /// parameter lists.
- ///
- /// For example:
- /// \verbatim
- /// template<typename C, template<typename T> class TT>
- /// void test(TT<int> aaa);
- /// \endverbatim
- /// For C: Position = { 0 }
- /// For TT: Position = { 1 }
- /// For T: Position = { 1, 0 }
- ArrayRef<unsigned> Position;
-
-public:
- TParamCommandComment(SourceLocation LocBegin,
- SourceLocation LocEnd,
- unsigned CommandID,
- CommandMarkerKind CommandMarker) :
- BlockCommandComment(TParamCommandCommentKind, LocBegin, LocEnd, CommandID,
- CommandMarker)
- { }
-
- static bool classof(const Comment *C) {
- return C->getCommentKind() == TParamCommandCommentKind;
- }
-
- bool hasParamName() const {
- return getNumArgs() > 0;
- }
-
- StringRef getParamName(const FullComment *FC) const;
-
- StringRef getParamNameAsWritten() const {
- return Args[0].Text;
- }
-
- SourceRange getParamNameRange() const {
- return Args[0].Range;
- }
-
- bool isPositionValid() const LLVM_READONLY {
- return !Position.empty();
- }
-
- unsigned getDepth() const {
- assert(isPositionValid());
- return Position.size();
- }
-
- unsigned getIndex(unsigned Depth) const {
- assert(isPositionValid());
- return Position[Depth];
- }
-
- void setPosition(ArrayRef<unsigned> NewPosition) {
- Position = NewPosition;
- assert(isPositionValid());
- }
-};
-
-/// A line of text contained in a verbatim block.
-class VerbatimBlockLineComment : public Comment {
- StringRef Text;
-
-public:
- VerbatimBlockLineComment(SourceLocation LocBegin,
- StringRef Text) :
- Comment(VerbatimBlockLineCommentKind,
- LocBegin,
- LocBegin.getLocWithOffset(Text.size())),
- Text(Text)
- { }
-
- static bool classof(const Comment *C) {
- return C->getCommentKind() == VerbatimBlockLineCommentKind;
- }
-
- child_iterator child_begin() const { return nullptr; }
-
- child_iterator child_end() const { return nullptr; }
-
- StringRef getText() const LLVM_READONLY {
- return Text;
- }
-};
-
-/// A verbatim block command (e. g., preformatted code). Verbatim block has an
-/// opening and a closing command and contains multiple lines of text
-/// (VerbatimBlockLineComment nodes).
-class VerbatimBlockComment : public BlockCommandComment {
-protected:
- StringRef CloseName;
- SourceLocation CloseNameLocBegin;
- ArrayRef<VerbatimBlockLineComment *> Lines;
-
-public:
- VerbatimBlockComment(SourceLocation LocBegin,
- SourceLocation LocEnd,
- unsigned CommandID) :
- BlockCommandComment(VerbatimBlockCommentKind,
- LocBegin, LocEnd, CommandID,
- CMK_At) // FIXME: improve source fidelity.
- { }
-
- static bool classof(const Comment *C) {
- return C->getCommentKind() == VerbatimBlockCommentKind;
- }
-
- child_iterator child_begin() const {
- return reinterpret_cast<child_iterator>(Lines.begin());
- }
-
- child_iterator child_end() const {
- return reinterpret_cast<child_iterator>(Lines.end());
- }
-
- void setCloseName(StringRef Name, SourceLocation LocBegin) {
- CloseName = Name;
- CloseNameLocBegin = LocBegin;
- }
-
- void setLines(ArrayRef<VerbatimBlockLineComment *> L) {
- Lines = L;
- }
-
- StringRef getCloseName() const {
- return CloseName;
- }
-
- unsigned getNumLines() const {
- return Lines.size();
- }
-
- StringRef getText(unsigned LineIdx) const {
- return Lines[LineIdx]->getText();
- }
-};
-
-/// A verbatim line command. Verbatim line has an opening command, a single
-/// line of text (up to the newline after the opening command) and has no
-/// closing command.
-class VerbatimLineComment : public BlockCommandComment {
-protected:
- StringRef Text;
- SourceLocation TextBegin;
-
-public:
- VerbatimLineComment(SourceLocation LocBegin,
- SourceLocation LocEnd,
- unsigned CommandID,
- SourceLocation TextBegin,
- StringRef Text) :
- BlockCommandComment(VerbatimLineCommentKind,
- LocBegin, LocEnd,
- CommandID,
- CMK_At), // FIXME: improve source fidelity.
- Text(Text),
- TextBegin(TextBegin)
- { }
-
- static bool classof(const Comment *C) {
- return C->getCommentKind() == VerbatimLineCommentKind;
- }
-
- child_iterator child_begin() const { return nullptr; }
-
- child_iterator child_end() const { return nullptr; }
-
- StringRef getText() const {
- return Text;
- }
-
- SourceRange getTextRange() const {
- return SourceRange(TextBegin, getLocEnd());
- }
-};
-
-/// Information about the declaration, useful to clients of FullComment.
-struct DeclInfo {
- /// Declaration the comment is actually attached to (in the source).
- /// Should not be NULL.
- const Decl *CommentDecl;
-
- /// CurrentDecl is the declaration with which the FullComment is associated.
- ///
- /// It can be different from \c CommentDecl. It happens when we we decide
- /// that the comment originally attached to \c CommentDecl is fine for
- /// \c CurrentDecl too (for example, for a redeclaration or an overrider of
- /// \c CommentDecl).
- ///
- /// The information in the DeclInfo corresponds to CurrentDecl.
- const Decl *CurrentDecl;
-
- /// Parameters that can be referenced by \\param if \c CommentDecl is something
- /// that we consider a "function".
- ArrayRef<const ParmVarDecl *> ParamVars;
-
- /// Function return type if \c CommentDecl is something that we consider
- /// a "function".
- QualType ReturnType;
-
- /// Template parameters that can be referenced by \\tparam if \c CommentDecl is
- /// a template (\c IsTemplateDecl or \c IsTemplatePartialSpecialization is
- /// true).
- const TemplateParameterList *TemplateParameters;
-
- /// A simplified description of \c CommentDecl kind that should be good enough
- /// for documentation rendering purposes.
- enum DeclKind {
- /// Everything else not explicitly mentioned below.
- OtherKind,
-
- /// Something that we consider a "function":
- /// \li function,
- /// \li function template,
- /// \li function template specialization,
- /// \li member function,
- /// \li member function template,
- /// \li member function template specialization,
- /// \li ObjC method,
- /// \li a typedef for a function pointer, member function pointer,
- /// ObjC block.
- FunctionKind,
-
- /// Something that we consider a "class":
- /// \li class/struct,
- /// \li class template,
- /// \li class template (partial) specialization.
- ClassKind,
-
- /// Something that we consider a "variable":
- /// \li namespace scope variables;
- /// \li static and non-static class data members;
- /// \li enumerators.
- VariableKind,
-
- /// A C++ namespace.
- NamespaceKind,
-
- /// A C++ typedef-name (a 'typedef' decl specifier or alias-declaration),
- /// see \c TypedefNameDecl.
- TypedefKind,
-
- /// An enumeration or scoped enumeration.
- EnumKind
- };
-
- /// What kind of template specialization \c CommentDecl is.
- enum TemplateDeclKind {
- NotTemplate,
- Template,
- TemplateSpecialization,
- TemplatePartialSpecialization
- };
-
- /// If false, only \c CommentDecl is valid.
- unsigned IsFilled : 1;
-
- /// Simplified kind of \c CommentDecl, see \c DeclKind enum.
- unsigned Kind : 3;
-
- /// Is \c CommentDecl a template declaration.
- unsigned TemplateKind : 2;
-
- /// Is \c CommentDecl an ObjCMethodDecl.
- unsigned IsObjCMethod : 1;
-
- /// Is \c CommentDecl a non-static member function of C++ class or
- /// instance method of ObjC class.
- /// Can be true only if \c IsFunctionDecl is true.
- unsigned IsInstanceMethod : 1;
-
- /// Is \c CommentDecl a static member function of C++ class or
- /// class method of ObjC class.
- /// Can be true only if \c IsFunctionDecl is true.
- unsigned IsClassMethod : 1;
-
- void fill();
-
- DeclKind getKind() const LLVM_READONLY {
- return static_cast<DeclKind>(Kind);
- }
-
- TemplateDeclKind getTemplateKind() const LLVM_READONLY {
- return static_cast<TemplateDeclKind>(TemplateKind);
- }
-};
-
-/// A full comment attached to a declaration, contains block content.
-class FullComment : public Comment {
- ArrayRef<BlockContentComment *> Blocks;
- DeclInfo *ThisDeclInfo;
-
-public:
- FullComment(ArrayRef<BlockContentComment *> Blocks, DeclInfo *D) :
- Comment(FullCommentKind, SourceLocation(), SourceLocation()),
- Blocks(Blocks), ThisDeclInfo(D) {
- if (Blocks.empty())
- return;
-
- setSourceRange(SourceRange(Blocks.front()->getLocStart(),
- Blocks.back()->getLocEnd()));
- setLocation(Blocks.front()->getLocStart());
- }
-
- static bool classof(const Comment *C) {
- return C->getCommentKind() == FullCommentKind;
- }
-
- child_iterator child_begin() const {
- return reinterpret_cast<child_iterator>(Blocks.begin());
- }
-
- child_iterator child_end() const {
- return reinterpret_cast<child_iterator>(Blocks.end());
- }
-
- const Decl *getDecl() const LLVM_READONLY {
- return ThisDeclInfo->CommentDecl;
- }
-
- const DeclInfo *getDeclInfo() const LLVM_READONLY {
- if (!ThisDeclInfo->IsFilled)
- ThisDeclInfo->fill();
- return ThisDeclInfo;
- }
-
- ArrayRef<BlockContentComment *> getBlocks() const { return Blocks; }
-
-};
-} // end namespace comments
-} // end namespace clang
-
-#endif
-
OpenPOWER on IntegriCloud