diff options
author | Alp Toker <alp@nuanti.com> | 2014-01-22 07:29:52 +0000 |
---|---|---|
committer | Alp Toker <alp@nuanti.com> | 2014-01-22 07:29:52 +0000 |
commit | a2794f9f363361f87a3538b90b78ff13381d5ce1 (patch) | |
tree | 5cc9768890e4532cd0625ba7ffbe54d2c35d5b35 /clang/lib/Sema/SemaCodeComplete.cpp | |
parent | 217c640ee85825f734ffce2ff6305e3e29003262 (diff) | |
download | bcm5719-llvm-a2794f9f363361f87a3538b90b78ff13381d5ce1.tar.gz bcm5719-llvm-a2794f9f363361f87a3538b90b78ff13381d5ce1.zip |
Introduce and use Decl::getAsFunction() to simplify templated function checks
Lift the getFunctionDecl() utility out of the parser into a general
Decl::getAsFunction() and use it to simplify other parts of the implementation.
Reduce isFunctionOrFunctionTemplate() to a simple type check that works the
same was as the other is* functions and move unwrapping of shadowed decls to
callers so it doesn't get run twice.
Shuffle around canSkipFunctionBody() to reduce virtual dispatch on ASTConsumer.
There's no need to query when we already know the body can't be skipped.
llvm-svn: 199794
Diffstat (limited to 'clang/lib/Sema/SemaCodeComplete.cpp')
-rw-r--r-- | clang/lib/Sema/SemaCodeComplete.cpp | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index 73a758db643..33909c73077 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -660,13 +660,10 @@ QualType clang::getDeclUsageType(ASTContext &C, const NamedDecl *ND) { return C.getObjCInterfaceType(Iface); QualType T; - if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) + if (const FunctionDecl *Function = ND->getAsFunction()) T = Function->getCallResultType(); else if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) T = Method->getSendResultType(); - else if (const FunctionTemplateDecl *FunTmpl = - dyn_cast<FunctionTemplateDecl>(ND)) - T = FunTmpl->getTemplatedDecl()->getCallResultType(); else if (const EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) T = C.getTypeDeclType(cast<EnumDecl>(Enumerator->getDeclContext())); else if (const ObjCPropertyDecl *Property = dyn_cast<ObjCPropertyDecl>(ND)) @@ -2066,14 +2063,11 @@ static void AddResultTypeChunk(ASTContext &Context, return; // Determine the type of the declaration (if it has a type). - QualType T; - if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) + QualType T; + if (const FunctionDecl *Function = ND->getAsFunction()) T = Function->getResultType(); else if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(ND)) T = Method->getResultType(); - else if (const FunctionTemplateDecl *FunTmpl = - dyn_cast<FunctionTemplateDecl>(ND)) - T = FunTmpl->getTemplatedDecl()->getResultType(); else if (const EnumConstantDecl *Enumerator = dyn_cast<EnumConstantDecl>(ND)) T = Context.getTypeDeclType(cast<TypeDecl>(Enumerator->getDeclContext())); else if (isa<UnresolvedUsingValueDecl>(ND)) { |