From 2436e7116bb1bda26d8b18b4b34a69a6b5d336d3 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Thu, 17 Sep 2009 21:32:03 +0000 Subject: Initial implementation of a code-completion interface in Clang. In essence, code completion is triggered by a magic "code completion" token produced by the lexer [*], which the parser recognizes at certain points in the grammar. The parser then calls into the Action object with the appropriate CodeCompletionXXX action. Sema implements the CodeCompletionXXX callbacks by performing minimal translation, then forwarding them to a CodeCompletionConsumer subclass, which uses the results of semantic analysis to provide code-completion results. At present, only a single, "printing" code completion consumer is available, for regression testing and debugging. However, the design is meant to permit other code-completion consumers. This initial commit contains two code-completion actions: one for member access, e.g., "x." or "p->", and one for nested-name-specifiers, e.g., "std::". More code-completion actions will follow, along with improved gathering of code-completion results for the various contexts. [*] In the current -code-completion-dump testing/debugging mode, the file is truncated at the completion point and EOF is translated into "code completion". llvm-svn: 82166 --- clang/lib/Sema/SemaCodeComplete.cpp | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 clang/lib/Sema/SemaCodeComplete.cpp (limited to 'clang/lib/Sema/SemaCodeComplete.cpp') diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp new file mode 100644 index 00000000000..2183cfad219 --- /dev/null +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -0,0 +1,45 @@ +//===---------------- SemaCodeComplete.cpp - Code Completion ----*- 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 the code-completion semantic actions. +// +//===----------------------------------------------------------------------===// +#include "Sema.h" +#include "clang/Sema/CodeCompleteConsumer.h" + +using namespace clang; + +/// \brief Set the code-completion consumer for semantic analysis. +void Sema::setCodeCompleteConsumer(CodeCompleteConsumer *CCC) { + assert(((CodeCompleter != 0) != (CCC != 0)) && + "Already set or cleared a code-completion consumer?"); + CodeCompleter = CCC; +} + +void Sema::CodeCompleteMemberReferenceExpr(Scope *S, ExprTy *BaseE, + SourceLocation OpLoc, + bool IsArrow) { + if (!BaseE || !CodeCompleter) + return; + + Expr *Base = static_cast(BaseE); + QualType BaseType = Base->getType(); + + CodeCompleter->CodeCompleteMemberReferenceExpr(S, BaseType, IsArrow); +} + +void Sema::CodeCompleteQualifiedId(Scope *S, const CXXScopeSpec &SS, + bool EnteringContext) { + if (!SS.getScopeRep() || !CodeCompleter) + return; + + CodeCompleter->CodeCompleteQualifiedId(S, + (NestedNameSpecifier *)SS.getScopeRep(), + EnteringContext); +} -- cgit v1.2.3