Here is the simple example.
#include <vector>
int main()
{
typedef std::vector<double> VEC;
VEC vec;
vec.push_back(1.5);
vec.push_back(2.5);
return 0;
}
Problems:
1. Hover over vec on lines 6, 7 or 8 and you'll see "VEC<double> main::vec" in the tooltip. This is obviously wrong it should be VEC main::vec or std::vector<double> main::vec.
2. Place the cursor over 1.5 or 2.5 and press ctrl-shift space to show the call tip. You'll see something like void std::vector::push_back(const value_type &x). This is obviously incomplete. It should either be std::vector<double>::push_... or VEC::push_...
And the biggest problem is that we show two different things in two separate UI components.
There is no consistency in the results...
Any hints how this could be fixed?
I'm running rev 10085 on linux, gcc 4.8.4 is the selected compiler.
I debugged for a while inside the function std::vector<CodeCompletion::CCToken> CodeCompletion::GetTokenAt(int pos, cbEditor* ed, bool& WXUNUSED(allowCallTip)), and for the case "VEC vec;"
In the function:
size_t NativeParserBase::ResolveExpression(TokenTree* tree,
std::queue<ParserComponent> components,
const TokenIdxSet& searchScope,
TokenIdxSet& result,
bool caseSense,
bool isPrefix)
First, we know "vec" is a variable kind Token, and its type name is "VEC", this is done inside the function call:
// e.g. A.BB.CCC.DDDD|
if (components.empty()) // is the last component (DDDD)
GenerateResultSet(tree, searchText, initialScope, initialResult, caseSense, isPrefix);
else // case sensitive and full-match always (A / BB / CCC)
GenerateResultSet(tree, searchText, initialScope, initialResult, true, false);
Later, we need to give some disiplay name of this Token.
wxString Token::DisplayName() const
{
wxString result;
if (m_TokenKind == tkClass)
return result << _T("class ") << m_Name << m_BaseArgs << _T(" {...}");
else if (m_TokenKind == tkNamespace)
return result << _T("namespace ") << m_Name << _T(" {...}");
else if (m_TokenKind == tkEnum)
return result << _T("enum ") << m_Name << _T(" {...}");
else if (m_TokenKind == tkTypedef)
{
result << _T("typedef");
if (!m_FullType.IsEmpty())
result << _T(" ") << m_FullType;
if (result.Find('*', true) != wxNOT_FOUND)
{
result.RemoveLast();
return result << m_Name << _T(")") << GetFormattedArgs();
}
if (!m_TemplateArgument.IsEmpty())
result << m_TemplateArgument;
return result << _T(" ") << m_Name;
}
else if (m_TokenKind == tkMacroDef)
{
result << _T("#define ") << m_Name << GetFormattedArgs();
if (!m_FullType.IsEmpty())
result << _T(" ") << m_FullType;
return result;
}
// else
if (!m_FullType.IsEmpty())
result << m_FullType << m_TemplateArgument << _T(" ");
if (m_TokenKind == tkEnumerator)
return result << GetNamespace() << m_Name << _T("=") << GetFormattedArgs();
return result << GetNamespace() << m_Name << GetStrippedArgs();
}
The bad thing is that this Token's m_TemplateArgument = "<double>". So, we get the "VEC<double>...". Do need to always add this string inside DisplayName()?