SemaCodeComplete.cpp revision 374929f7e88f6c7a96382b3eb4201b721c418372
181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor//===---------------- SemaCodeComplete.cpp - Code Completion ----*- C++ -*-===// 281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// The LLVM Compiler Infrastructure 481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// This file is distributed under the University of Illinois Open Source 681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// License. See LICENSE.TXT for details. 781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor//===----------------------------------------------------------------------===// 981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 1081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// This file defines the code-completion semantic actions. 1181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor// 1281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor//===----------------------------------------------------------------------===// 1381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "Sema.h" 1481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor#include "clang/Sema/CodeCompleteConsumer.h" 1581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 1681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorusing namespace clang; 1781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 1881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor/// \brief Set the code-completion consumer for semantic analysis. 1981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid Sema::setCodeCompleteConsumer(CodeCompleteConsumer *CCC) { 2081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor assert(((CodeCompleter != 0) != (CCC != 0)) && 2181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor "Already set or cleared a code-completion consumer?"); 2281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor CodeCompleter = CCC; 2381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 2481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 2581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid Sema::CodeCompleteMemberReferenceExpr(Scope *S, ExprTy *BaseE, 2681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor SourceLocation OpLoc, 2781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool IsArrow) { 2881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!BaseE || !CodeCompleter) 2981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 3081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor Expr *Base = static_cast<Expr *>(BaseE); 3281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor QualType BaseType = Base->getType(); 3381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 3481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor CodeCompleter->CodeCompleteMemberReferenceExpr(S, BaseType, IsArrow); 3581b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 3681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 37374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregorvoid Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) { 38374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor if (!CodeCompleter) 39374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 40374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 41374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor TagDecl::TagKind TK; 42374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor switch ((DeclSpec::TST)TagSpec) { 43374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_enum: 44374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor TK = TagDecl::TK_enum; 45374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 46374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 47374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_union: 48374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor TK = TagDecl::TK_union; 49374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 50374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 51374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_struct: 52374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor TK = TagDecl::TK_struct; 53374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 54374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 55374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor case DeclSpec::TST_class: 56374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor TK = TagDecl::TK_class; 57374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor break; 58374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 59374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor default: 60374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor assert(false && "Unknown type specifier kind in CodeCompleteTag"); 61374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor return; 62374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor } 63374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor CodeCompleter->CodeCompleteTag(S, TK); 64374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor} 65374929f7e88f6c7a96382b3eb4201b721c418372Douglas Gregor 6681b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregorvoid Sema::CodeCompleteQualifiedId(Scope *S, const CXXScopeSpec &SS, 6781b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor bool EnteringContext) { 6881b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor if (!SS.getScopeRep() || !CodeCompleter) 6981b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor return; 7081b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor 7181b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor CodeCompleter->CodeCompleteQualifiedId(S, 7281b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor (NestedNameSpecifier *)SS.getScopeRep(), 7381b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor EnteringContext); 7481b747b7fcc91c2fba9a3183d8fac80adbfc1d3eDouglas Gregor} 75