//===--- IndexSymbol.cpp --------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See http://swift.org/LICENSE.txt for license information // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// #include "swift/Index/IndexSymbol.h" #include "swift/AST/Decl.h" using namespace swift; using namespace swift::index; static SymbolKind getFuncSymbolKind(const FuncDecl *FD) { if (FD->isAccessor()) return SymbolKind::Accessor; if (auto *op = FD->getOperatorDecl()) { switch (op->getKind()) { case DeclKind::PrefixOperator: return SymbolKind::PrefixOperator; case DeclKind::PostfixOperator: return SymbolKind::PostfixOperator; case DeclKind::InfixOperator: return SymbolKind::InfixOperator; default: llvm_unreachable("unexpected operator kind"); } } if (FD->getDeclContext()->isTypeContext()) { if (FD->isStatic()) { if (FD->getCorrectStaticSpelling() == StaticSpellingKind::KeywordClass) return SymbolKind::ClassMethod; return SymbolKind::StaticMethod; } return SymbolKind::InstanceMethod; } return SymbolKind::Function; } static SymbolKind getVarSymbolKind(const VarDecl *VD) { auto *DC = VD->getDeclContext(); if (DC->isTypeContext()) { if (VD->isStatic()) { if (VD->getCorrectStaticSpelling() == StaticSpellingKind::KeywordClass) return SymbolKind::ClassProperty; return SymbolKind::StaticProperty; } return SymbolKind::InstanceProperty; } assert(!DC->isLocalContext() && "local variable seen while indexing"); return SymbolKind::Variable; } SymbolKind index::getSymbolKindForDecl(const Decl *D) { switch (D->getKind()) { case DeclKind::Enum: return SymbolKind::Enum; case DeclKind::Struct: return SymbolKind::Struct; case DeclKind::Class: return SymbolKind::Class; case DeclKind::Protocol: return SymbolKind::Protocol; case DeclKind::Extension: return SymbolKind::Extension; case DeclKind::TypeAlias: return SymbolKind::TypeAlias; case DeclKind::AssociatedType: return SymbolKind::AssociatedType; case DeclKind::GenericTypeParam: return SymbolKind::GenericTypeParam; case DeclKind::EnumElement: return SymbolKind::EnumElement; case DeclKind::Subscript: return SymbolKind::Subscript; case DeclKind::Constructor: return SymbolKind::Constructor; case DeclKind::Destructor: return SymbolKind::Destructor; case DeclKind::Param: llvm_unreachable("unexpected parameter seen while indexing"); case DeclKind::Func: return getFuncSymbolKind(cast(D)); case DeclKind::Var: return getVarSymbolKind(cast(D)); default: return SymbolKind::Unknown; } }