Code::Completion Rewrite
From Code::Blocks
Background
The current Code::Completion plug-in has some flaws, and is currently development frozen. The current plug-in lacks full support for:
- function and class templates
- default arguments in some cases
- some of the more complicated c++ mucky business
Current Effort
Structure
The current C::C is a monolithic library of features, which could be de-coupled and split up for use in multiple plugins, providing extra functionality and flexibility in the future. Therefore, I propose the C::C be broken up into the following components:
- Code::SymbolTable
- Provide a list of valid symbols in the workspace, along with relevant scope information
- Code::Completion
- Provide Auto-complete features
- Code::SymbolOutline
- Provide Symbol browser, find symbol, function jump features
- Code::Refactoring
- Provide code refactoring features
- Code::Documentation
- Provide automatic code generation features
Purpose Statement
Code::SymbolTable
Code::Completion
The current Code::Completion plugin is outdated, and needs a complete rewrite. The purpose of the Code::Completion plugin is thus:
- Provide a list of likely symbols in the current scope as possible solutions to the current symbol.
- Provide function tooltips
- Parameter list
- Relevant documentation
- Provide completion features for class constructors
- Provide completion features for initializer lists
Code::SymbolOutline
Code::Refactoring
Code::Documentation
Process
Code::SymbolTable
class symbol { string name; // name of the symbol int id; // Id of the symbol, should be unique in the project int file_id; // if od file where the symbol has been declared int filepos_begin; // Position where declaration of the symbol starts int filepos_end; // Position where declaration of the symbol ends int type; // Type of the symbol: macro / class / typedef / variable / function int modifiers; // Bitfield used to mark some estra properties of symbol like that it is static or inline int value_type_id; // Id of symbol which represents c++ type of current symbol (like type of variable or type of returned value from function) int extra_type_id; // Extra type used in some cases list children; // List of child elements of this symbol (members in class etc) list extra_lists[3]; // Some extra lists which can provide additional symbols depending on type of current // symbol - like list of base classes or list of template arguments, maybe we could give // more than 3 lists, but I didn't found any reason for that now. map extra_values; // int -> string map which can keep some extra data }
Code::Completion
- Generate a list of all valid symbols in the current scope
- Take global list from C::SymbolTable
- Add in local scope parsed on the fly
- Reduce that list to what is likely
- Show that list to the user in some fashion
- Insert the proper solution on user request
Code::SymbolOutline
Code::Refactoring
Code::Documentation
More complex cases of C::C usage
Here we can put some more complex examples of c++ code where C::C may fail. Symbols that may be hard to find should be marked in bold
1: Fetching type of operator call
#include <string> using namespace std; int main(int,char**) { ( string("first") + "second" + "third" ) . c_str(); return 0; }
2: Template classes
template<typename T> class Template { public: T& GetInstance() { return m_Instance; } private: T m_Instance; }; class Parameter { public: void PrintfText() { printf("Text"); } }; int main(int,char**) { Template<Parameter> Object; Object.GetInstance().PrintfText(); }