[IDE] Introduce CodeCompletionDeclKind enum to encapsulate a bit more info than the DeclKind (e.g. whether the function is an instance/static method).

Swift SVN r9635
This commit is contained in:
Argyrios Kyrtzidis
2013-10-24 04:33:51 +00:00
parent 3b676d2f55
commit 881e646632
2 changed files with 110 additions and 5 deletions

View File

@@ -11,6 +11,7 @@
//===----------------------------------------------------------------------===//
#include "swift/IDE/CodeCompletion.h"
#include "swift/AST/ASTVisitor.h"
#include "swift/AST/ASTWalker.h"
#include "swift/AST/LazyResolver.h"
#include "swift/AST/NameLookup.h"
@@ -162,6 +163,67 @@ void CodeCompletionString::dump() const {
print(llvm::errs());
}
namespace {
// FIXME: const visitor.
class CCDeclKindVisitor : public ASTVisitor<CCDeclKindVisitor,
CodeCompletionDeclKind, CodeCompletionDeclKind,
CodeCompletionDeclKind, CodeCompletionDeclKind > {
public:
CodeCompletionDeclKind visitFuncDecl(const FuncDecl *D);
CodeCompletionDeclKind visitVarDecl(const VarDecl *D);
CodeCompletionDeclKind visitExtensionDecl(const ExtensionDecl *D) {
llvm_unreachable("extension decls should not show up in completion results");
}
#define CCKIND_FOR(CLASS) \
CodeCompletionDeclKind visit##CLASS##Decl(const CLASS##Decl *) { \
return CodeCompletionDeclKind::CLASS; \
}
CCKIND_FOR(Class)
CCKIND_FOR(Struct)
CCKIND_FOR(Enum)
CCKIND_FOR(EnumElement)
CCKIND_FOR(Protocol)
CCKIND_FOR(TypeAlias)
CCKIND_FOR(Constructor)
CCKIND_FOR(Destructor)
CCKIND_FOR(Subscript)
#undef CCKIND_FOR
};
} // anonymous namespace
CodeCompletionDeclKind CCDeclKindVisitor::visitFuncDecl(const FuncDecl *D) {
const DeclContext *DC = D->getDeclContext();
if (isa<NominalTypeDecl>(DC) || isa<ExtensionDecl>(DC)) {
if (D->isStatic())
return CodeCompletionDeclKind::StaticMethod;
return CodeCompletionDeclKind::InstanceMethod;
}
if (D->isOperator())
return CodeCompletionDeclKind::OperatorFunction;
return CodeCompletionDeclKind::FreeFunction;
}
CodeCompletionDeclKind CCDeclKindVisitor::visitVarDecl(const VarDecl *D) {
const DeclContext *DC = D->getDeclContext();
if (isa<NominalTypeDecl>(DC)) {
// FIXME: Uncomment when static variables are implemented.
// if (D->isStatic())
// return CodeCompletionDeclKind::StaticVar;
return CodeCompletionDeclKind::InstanceVar;
}
if (DC->isLocalContext())
return CodeCompletionDeclKind::LocalVar;
return CodeCompletionDeclKind::GlobalVar;
}
CodeCompletionDeclKind
CodeCompletionResult::getCodeCompletionDeclKind(const Decl *D) {
return CCDeclKindVisitor().visit(const_cast<Decl*>(D));
}
void CodeCompletionResult::print(raw_ostream &OS) const {
switch (getKind()) {
case ResultKind::Declaration:
@@ -273,8 +335,27 @@ void CodeCompletionCache::getResults(
[](CodeCompletionResult *R) -> bool {
if (R->getKind() != CodeCompletionResult::Declaration)
return false;
return R->getAssociatedDeclKind() >= DeclKind::First_TypeDecl &&
R->getAssociatedDeclKind() <= DeclKind::Last_TypeDecl;
switch(R->getAssociatedDeclKind()) {
case CodeCompletionDeclKind::Class:
case CodeCompletionDeclKind::Struct:
case CodeCompletionDeclKind::Enum:
case CodeCompletionDeclKind::Protocol:
case CodeCompletionDeclKind::TypeAlias:
return true;
case CodeCompletionDeclKind::EnumElement:
case CodeCompletionDeclKind::Constructor:
case CodeCompletionDeclKind::Destructor:
case CodeCompletionDeclKind::Subscript:
case CodeCompletionDeclKind::StaticMethod:
case CodeCompletionDeclKind::InstanceMethod:
case CodeCompletionDeclKind::OperatorFunction:
case CodeCompletionDeclKind::FreeFunction:
case CodeCompletionDeclKind::StaticVar:
case CodeCompletionDeclKind::InstanceVar:
case CodeCompletionDeclKind::LocalVar:
case CodeCompletionDeclKind::GlobalVar:
return false;
}
});
} else {
Sink.Results.insert(Sink.Results.end(),