Developer forums (C::B DEVELOPMENT STRICTLY!) > CodeCompletion redesign
Tooltips/calltips showing wrong types
(1/1)
oBFusCATed:
Here is the simple example.
--- Code: ---#include <vector>
int main()
{
typedef std::vector<double> VEC;
VEC vec;
vec.push_back(1.5);
vec.push_back(2.5);
return 0;
}
--- End code ---
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.
ollydbg:
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:
--- Code: ---size_t NativeParserBase::ResolveExpression(TokenTree* tree,
std::queue<ParserComponent> components,
const TokenIdxSet& searchScope,
TokenIdxSet& result,
bool caseSense,
bool isPrefix)
--- End code ---
First, we know "vec" is a variable kind Token, and its type name is "VEC", this is done inside the function call:
--- Code: --- // 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);
--- End code ---
Later, we need to give some disiplay name of this Token.
--- Code: ---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();
}
--- End code ---
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()?
oBFusCATed:
Probably we should show something like "VEC vec, where VEC = std::vector<double>". But I don't know it this is possible. And what happens if the there are more typedefs.
Navigation
[0] Message Index
Go to full version