Hi,
I like using the foreach statement in c++, provided with the c++11 standard:
list<string> strList;
for(string &str : strList)
{
cout << str << endl;
}
But now my problem is, that, in the for block, the variable "str" is unknown by the code completion, which can be quite annoying/confusing.
Is there anything that can be done to resolve this problem?
edit: I'm using the latest nightly build.
Thanks!
Koonschi
this is not purely a problem with the range based for loop, it is a problem with every declaration in the for(;;) construct, also in declarations in if() construct [I am not talking about the bodies/blocks of the for/if]
if(TxmlElement* problem = handle.FirstChildElement("test"))
{
/// ---> will not code complete on 'problem'
}
Some comments:
1, RemoveTemplateArgs is missing in header file, comments needed for this function.
2, // for loop heads look like this:
// ([init1 [, init2 ...] ] ; [cond1 [, cond2 ..]], [mod1 [, mod2 ..]])
should have the second ";" instead of ",".
BTW: It is the first time I see you use another instance (smallTokenizer) of Tokenizer class in Parserthread. :)
Here is my test code:
void f()
{
if(TxmlElement* problem = handle.FirstChildElement("test"))
{
/// ---> will not code complete on 'problem'
problem;
}
}
void f2()
{
if(TxmlElement* problem1 = handle.FirstChildElement("test"))
{
/// ---> will not code complete on 'problem'
problem1;
}
}
And I see the patch works very nice. I right click on "problem", and select find declaration, it goes to the correct position.
When I click on the "problem1", I see the temp Token "problem" is cleared, and new temp Token "problem1" is created.
Nice work, koonschi.
Well, it is the first time that I contribute to Code::Blocks, too Smiley I hope I did not break any rules by using it.
It seemed like the easiest thing to do though, as the expressions in parentheses are parsed as one single token. I did not want to mess around with that, as it's used for function parameters, too.
I hope this is the beginning of your contribution to C::B, welcome!!!!
It dose not break any rules. I have no objection to use another instance of Tokenizer class in Parserthread class.
Besize that, we have a function in Parserthread
bool ParserThread::GetBaseArgs(const wxString & args, wxString& baseArgs)
which translate a complex full function arguments to a simple arguments like:
void f(int a=1, float *p=0x777);
here, (int a=1, float *p=0x777) will be translated to (int a, float *p), I think here we also need a smallTokenizer. :), because sometimes, there are nested "()" in the function arguments, currently implementation of GetBaseArgs() does not work correctly about those nest parentheses.
Bug comes in the function: void ParserThread::HandleConditionalArguments()
Suppose I have a if condition below:
if(aaaaa>bbbbb && ccccc<ddddd)
When parsing, it will add a temporary token with the information below:
[debug]{m_FullType = "aaaaa&&", m_BaseType = "aaaaa", m_Name = "<", m_Args = "", m_BaseArgs = "", m_AncestorsString = "", m_FileIdx = 1, m_Line = 17, m_ImplFileIdx = 0, m_ImplLine = 0, m_ImplLineStart = 0, m_ImplLineEnd = 0, m_Scope = tsUndefined, m_TokenKind = tkVariable, m_IsOperator = false, m_IsLocal = false, m_IsTemp = true, m_IsConst = 186, m_Index = 501, m_ParentIndex = 500
[debug], m_Children = std::set with 0 elements, m_Ancestors = std::set with 0 elements, m_DirectAncestors = std::set with 0 elements, m_Descendants = std::set with 0 elements, m_Aliases = 0 count of wxArrayString, m_TemplateArgument = "", m_TemplateType = 0 count of wxArrayString, m_TemplateMap = std::map with 0 elements, m_TemplateAlias = "", m_UserData = 0x0, m_TokenTree = 0x3d31270, m_Ticket = 786}>>>>>>cb_gdb:
You see: m_Name is "<".
I think the logic to find a variable:
if (peek.empty())
{
if (!m_Str.empty())
{
.....
Token *newToken = DoAddToken(tkVariable, token, smallTokenizer.GetLineNumber());
Here, if peek is empty, and m_Str have some characters, but the token is “logic compare operators".