diff options
author | Dmitri Gribenko <gribozavr@gmail.com> | 2012-08-24 00:05:30 +0000 |
---|---|---|
committer | Dmitri Gribenko <gribozavr@gmail.com> | 2012-08-24 00:05:30 +0000 |
commit | 70ff1091315c60fed68d7197c637ec8c588e67a1 (patch) | |
tree | 11360fbec3df11791d317d252785e4cda73e9dd5 /lib/AST/Comment.cpp | |
parent | 1ddbd89bb397988dd1a4e96d8d8c2c7705a2af75 (diff) |
Comment semantic analysis: treat function typedefs as functions so that one can
use \param and \returns in documentation.
Fixes PR13533.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@162507 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/Comment.cpp')
-rw-r--r-- | lib/AST/Comment.cpp | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/lib/AST/Comment.cpp b/lib/AST/Comment.cpp index 8a711f0c1f..2af3896156 100644 --- a/lib/AST/Comment.cpp +++ b/lib/AST/Comment.cpp @@ -240,7 +240,58 @@ void DeclInfo::fill() { case Decl::Namespace: Kind = NamespaceKind; break; - case Decl::Typedef: + case Decl::Typedef: { + Kind = TypedefKind; + // If this is a typedef to something we consider a function, extract + // arguments and return type. + const TypedefDecl *TD = cast<TypedefDecl>(ThisDecl); + const TypeSourceInfo *TSI = TD->getTypeSourceInfo(); + if (!TSI) + break; + TypeLoc TL = TSI->getTypeLoc().getUnqualifiedLoc(); + while (true) { + TL = TL.IgnoreParens(); + // Look through typedefs. + if (TypedefTypeLoc *TypedefTL = dyn_cast<TypedefTypeLoc>(&TL)) { + TSI = TypedefTL->getTypedefNameDecl()->getTypeSourceInfo(); + if (TSI) + break; + TL = TSI->getTypeLoc().getUnqualifiedLoc(); + continue; + } + // Look through qualified types. + if (QualifiedTypeLoc *QualifiedTL = dyn_cast<QualifiedTypeLoc>(&TL)) { + TL = QualifiedTL->getUnqualifiedLoc(); + continue; + } + // Look through pointer types. + if (PointerTypeLoc *PointerTL = dyn_cast<PointerTypeLoc>(&TL)) { + TL = PointerTL->getPointeeLoc().getUnqualifiedLoc(); + continue; + } + if (BlockPointerTypeLoc *BlockPointerTL = + dyn_cast<BlockPointerTypeLoc>(&TL)) { + TL = BlockPointerTL->getPointeeLoc().getUnqualifiedLoc(); + continue; + } + if (MemberPointerTypeLoc *MemberPointerTL = + dyn_cast<MemberPointerTypeLoc>(&TL)) { + TL = MemberPointerTL->getPointeeLoc().getUnqualifiedLoc(); + continue; + } + // Is this a typedef for a function type? + if (FunctionTypeLoc *FTL = dyn_cast<FunctionTypeLoc>(&TL)) { + Kind = FunctionKind; + ArrayRef<ParmVarDecl *> Params = FTL->getParams(); + ParamVars = ArrayRef<const ParmVarDecl *>(Params.data(), + Params.size()); + ResultType = FTL->getResultLoc().getType(); + break; + } + break; + } + break; + } case Decl::TypeAlias: Kind = TypedefKind; break; |