diff options
Diffstat (limited to 'include/clang/Sema/CodeCompleteConsumer.h')
-rw-r--r-- | include/clang/Sema/CodeCompleteConsumer.h | 146 |
1 files changed, 121 insertions, 25 deletions
diff --git a/include/clang/Sema/CodeCompleteConsumer.h b/include/clang/Sema/CodeCompleteConsumer.h index 5b3522c..43ff686 100644 --- a/include/clang/Sema/CodeCompleteConsumer.h +++ b/include/clang/Sema/CodeCompleteConsumer.h @@ -14,6 +14,7 @@ #define LLVM_CLANG_SEMA_CODECOMPLETECONSUMER_H #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringRef.h" #include <memory> #include <string> @@ -43,6 +44,10 @@ public: /// \brief The different kinds of "chunks" that can occur within a code /// completion string. enum ChunkKind { + /// \brief The piece of text that the user is expected to type to + /// match the code-completion string, typically a keyword or the name of a + /// declarator or macro. + CK_TypedText, /// \brief A piece of text that should be placed in the buffer, e.g., /// parentheses or a comma in a function call. CK_Text, @@ -55,7 +60,29 @@ public: CK_Placeholder, /// \brief A piece of text that describes something about the result but /// should not be inserted into the buffer. - CK_Informative + CK_Informative, + /// \brief A piece of text that describes the parameter that corresponds + /// to the code-completion location within a function call, message send, + /// macro invocation, etc. + CK_CurrentParameter, + /// \brief A left parenthesis ('('). + CK_LeftParen, + /// \brief A right parenthesis (')'). + CK_RightParen, + /// \brief A left bracket ('['). + CK_LeftBracket, + /// \brief A right bracket (']'). + CK_RightBracket, + /// \brief A left brace ('{'). + CK_LeftBrace, + /// \brief A right brace ('}'). + CK_RightBrace, + /// \brief A left angle bracket ('<'). + CK_LeftAngle, + /// \brief A right angle bracket ('>'). + CK_RightAngle, + /// \brief A comma separator (','). + CK_Comma }; /// \brief One piece of the code completion string. @@ -66,7 +93,7 @@ public: union { /// \brief The text string associated with a CK_Text, CK_Placeholder, - /// or CK_Informative chunk. + /// CK_Informative, or CK_Comma chunk. /// The string is owned by the chunk and will be deallocated /// (with delete[]) when the chunk is destroyed. const char *Text; @@ -79,21 +106,22 @@ public: Chunk() : Kind(CK_Text), Text(0) { } - private: - Chunk(ChunkKind Kind, const char *Text); - - public: + Chunk(ChunkKind Kind, llvm::StringRef Text = ""); + /// \brief Create a new text chunk. - static Chunk CreateText(const char *Text); + static Chunk CreateText(llvm::StringRef Text); /// \brief Create a new optional chunk. static Chunk CreateOptional(std::auto_ptr<CodeCompletionString> Optional); /// \brief Create a new placeholder chunk. - static Chunk CreatePlaceholder(const char *Placeholder); + static Chunk CreatePlaceholder(llvm::StringRef Placeholder); /// \brief Create a new informative chunk. - static Chunk CreateInformative(const char *Informative); + static Chunk CreateInformative(llvm::StringRef Informative); + + /// \brief Create a new current-parameter chunk. + static Chunk CreateCurrentParameter(llvm::StringRef CurrentParameter); /// \brief Destroy this chunk, deallocating any memory it owns. void Destroy(); @@ -113,10 +141,28 @@ public: typedef llvm::SmallVector<Chunk, 4>::const_iterator iterator; iterator begin() const { return Chunks.begin(); } iterator end() const { return Chunks.end(); } + bool empty() const { return Chunks.empty(); } + unsigned size() const { return Chunks.size(); } + + Chunk &operator[](unsigned I) { + assert(I < size() && "Chunk index out-of-range"); + return Chunks[I]; + } + + const Chunk &operator[](unsigned I) const { + assert(I < size() && "Chunk index out-of-range"); + return Chunks[I]; + } + + /// \brief Add a new typed-text chunk. + /// The text string will be copied. + void AddTypedTextChunk(llvm::StringRef Text) { + Chunks.push_back(Chunk(CK_TypedText, Text)); + } /// \brief Add a new text chunk. /// The text string will be copied. - void AddTextChunk(const char *Text) { + void AddTextChunk(llvm::StringRef Text) { Chunks.push_back(Chunk::CreateText(Text)); } @@ -127,24 +173,46 @@ public: /// \brief Add a new placeholder chunk. /// The placeholder text will be copied. - void AddPlaceholderChunk(const char *Placeholder) { + void AddPlaceholderChunk(llvm::StringRef Placeholder) { Chunks.push_back(Chunk::CreatePlaceholder(Placeholder)); } /// \brief Add a new informative chunk. /// The text will be copied. - void AddInformativeChunk(const char *Text) { + void AddInformativeChunk(llvm::StringRef Text) { Chunks.push_back(Chunk::CreateInformative(Text)); } + + /// \brief Add a new current-parameter chunk. + /// The text will be copied. + void AddCurrentParameterChunk(llvm::StringRef CurrentParameter) { + Chunks.push_back(Chunk::CreateCurrentParameter(CurrentParameter)); + } + + /// \brief Add a new chunk. + void AddChunk(Chunk C) { Chunks.push_back(C); } /// \brief Retrieve a string representation of the code completion string, /// which is mainly useful for debugging. - std::string getAsString() const; + std::string getAsString() const; + + /// \brief Serialize this code-completion string to the given stream. + void Serialize(llvm::raw_ostream &OS) const; + + /// \brief Deserialize a code-completion string from the given string. + static CodeCompletionString *Deserialize(llvm::StringRef &Str); }; +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, + const CodeCompletionString &CCS); + /// \brief Abstract interface for a consumer of code-completion /// information. class CodeCompleteConsumer { +protected: + /// \brief Whether to include macros in the code-completion results. + bool IncludeMacros; + public: /// \brief Captures a result of code completion. struct Result { @@ -291,23 +359,32 @@ public: Sema &S) const; }; + CodeCompleteConsumer() : IncludeMacros(false) { } + + explicit CodeCompleteConsumer(bool IncludeMacros) + : IncludeMacros(IncludeMacros) { } + + /// \brief Whether the code-completion consumer wants to see macros. + bool includeMacros() const { return IncludeMacros; } + /// \brief Deregisters and destroys this code-completion consumer. virtual ~CodeCompleteConsumer(); /// \name Code-completion callbacks //@{ /// \brief Process the finalized code-completion results. - virtual void ProcessCodeCompleteResults(Result *Results, + virtual void ProcessCodeCompleteResults(Sema &S, Result *Results, unsigned NumResults) { } - - /// \brief Process the set of overload candidates. + + /// \param S the semantic-analyzer object for which code-completion is being + /// done. /// /// \param CurrentArg the index of the current argument. /// /// \param Candidates an array of overload candidates. /// /// \param NumCandidates the number of overload candidates - virtual void ProcessOverloadCandidates(unsigned CurrentArg, + virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg, OverloadCandidate *Candidates, unsigned NumCandidates) { } //@} @@ -316,24 +393,43 @@ public: /// \brief A simple code-completion consumer that prints the results it /// receives in a simple format. class PrintingCodeCompleteConsumer : public CodeCompleteConsumer { - /// \brief The semantic-analysis object to which this code-completion - /// consumer is attached. - Sema &SemaRef; - /// \brief The raw output stream. llvm::raw_ostream &OS; public: /// \brief Create a new printing code-completion consumer that prints its /// results to the given raw output stream. - PrintingCodeCompleteConsumer(Sema &S, llvm::raw_ostream &OS) - : SemaRef(S), OS(OS) { } + PrintingCodeCompleteConsumer(bool IncludeMacros, + llvm::raw_ostream &OS) + : CodeCompleteConsumer(IncludeMacros), OS(OS) { } + + /// \brief Prints the finalized code-completion results. + virtual void ProcessCodeCompleteResults(Sema &S, Result *Results, + unsigned NumResults); + + virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg, + OverloadCandidate *Candidates, + unsigned NumCandidates); +}; + +/// \brief A code-completion consumer that prints the results it receives +/// in a format that is parsable by the CIndex library. +class CIndexCodeCompleteConsumer : public CodeCompleteConsumer { + /// \brief The raw output stream. + llvm::raw_ostream &OS; + +public: + /// \brief Create a new CIndex code-completion consumer that prints its + /// results to the given raw output stream in a format readable to the CIndex + /// library. + CIndexCodeCompleteConsumer(bool IncludeMacros, llvm::raw_ostream &OS) + : CodeCompleteConsumer(IncludeMacros), OS(OS) { } /// \brief Prints the finalized code-completion results. - virtual void ProcessCodeCompleteResults(Result *Results, + virtual void ProcessCodeCompleteResults(Sema &S, Result *Results, unsigned NumResults); - virtual void ProcessOverloadCandidates(unsigned CurrentArg, + virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg, OverloadCandidate *Candidates, unsigned NumCandidates); }; |