================ @@ -56,26 +69,135 @@ class ReplCompletionConsumer : public CodeCompleteConsumer { std::shared_ptr<GlobalCodeCompletionAllocator> CCAllocator; CodeCompletionTUInfo CCTUInfo; std::vector<std::string> &Results; + ReplCodeCompletion &CC; +}; + +class CompletionContextHanndler { +protected: + CodeCompletionContext CCC; + std::vector<std::string> &Results; + +public: + CompletionContextHanndler(CodeCompletionContext CCC, + std::vector<std::string> &Results) + : CCC(CCC), Results(Results) {} + virtual void handleDeclaration(const CodeCompletionResult &Result) {} + virtual void handleKeyword(const CodeCompletionResult &Result) {} + virtual void handlePattern(const CodeCompletionResult &Result) {} + virtual void handleMacro(const CodeCompletionResult &Result) {} +}; + +class DotMemberAccessHandler : public CompletionContextHanndler { +public: + DotMemberAccessHandler(CodeCompletionContext CCC, + std::vector<std::string> &Results) + : CompletionContextHanndler(CCC, Results) {} + void handleDeclaration(const CodeCompletionResult &Result) override { + if (auto *ID = Result.Declaration->getIdentifier()) { + if (const auto *Fun = llvm::dyn_cast<CXXMethodDecl>(Result.Declaration)) { + if (Fun->getParent()->getCanonicalDecl() == + CCC.getBaseType()->getAsCXXRecordDecl()->getCanonicalDecl()) { + LLVM_DEBUG(llvm::dbgs() << "[In HandleCodeCompleteDOT] Name : " + << ID->getName() << "\n"); + Results.push_back(ID->getName().str()); + } + } + } + } +}; + +class DefaultAccessHandler : public CompletionContextHanndler { +private: + Sema &S; + +public: + DefaultAccessHandler(Sema &S, CodeCompletionContext CCC, + std::vector<std::string> &Results) + : CompletionContextHanndler(CCC, Results), S(S) {} + void handleDeclaration(const CodeCompletionResult &Result) override { + auto PreferredType = CCC.getPreferredType(); + if (!PreferredType.isNull()) { + if (auto *VD = dyn_cast<VarDecl>(Result.Declaration)) { + auto ArgumentType = VD->getType(); + if (PreferredType->isReferenceType()) { + QualType RT = + PreferredType->castAs<ReferenceType>()->getPointeeType(); + Sema::ReferenceConversions RefConv; + Sema::ReferenceCompareResult RefRelationship = + S.CompareReferenceRelationship(SourceLocation(), RT, ArgumentType, + &RefConv); + switch (RefRelationship) { + case Sema::Ref_Compatible: + case Sema::Ref_Related: + Results.push_back(VD->getName().str()); + break; + case Sema::Ref_Incompatible: + break; + } + } else if (S.Context.hasSameType(ArgumentType, PreferredType)) { + Results.push_back(VD->getName().str()); + } + } + } else + Results.push_back(Result.Declaration->getName().str()); + } + + void handleKeyword(const CodeCompletionResult &Result) override { + auto Prefix = S.getPreprocessor().getCodeCompletionFilter(); + // add keyword to the completion results only if we are in a type-aware + // situation. + if (!CCC.getBaseType().isNull() || !CCC.getPreferredType().isNull()) + return; + if (StringRef(Result.Keyword).startswith(Prefix)) + Results.push_back(Result.Keyword); + } }; void ReplCompletionConsumer::ProcessCodeCompleteResults( class Sema &S, CodeCompletionContext Context, CodeCompletionResult *InResults, unsigned NumResults) { - for (unsigned I = 0; I < NumResults; ++I) { + + // auto& a = S.Context.Idents.get("f1"); + // LLVM_DEBUG(llvm::dbgs() << "\n FFFFF111111 : " << a.getName() << "\n" ); ---------------- vgvassilev wrote:
```suggestion ``` https://github.com/llvm/llvm-project/pull/67349 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits