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:

  1. function and class templates
  2. default arguments in some cases
  3. 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

Code::Completion

  1. Generate a list of all valid symbols in the current scope
    1. Take global list from C::SymbolTable
    2. Add in local scope parsed on the fly
  2. Reduce that list to what is likely
  3. Show that list to the user in some fashion
  4. 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 comples 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();
}