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