[kdev-qmljs] /: Register uses of declarations in the proper contexts

Denis Steckelmacher steckdenis at yahoo.fr
Wed Jul 9 11:58:31 UTC 2014


On 07/09/2014 11:39 AM, Milian Wolff wrote:
> Hey Denis,
>
> On Tuesday 08 July 2014 18:50:56 Denis Steckelmacher wrote:
>> Git commit 1cb1f6774841aaf7778a4b1e87fcf4396fcce0bb by Denis Steckelmacher.
>> Committed on 08/07/2014 at 18:46.
>> Pushed by dsteckelmacher into branch 'master'.
>>
>> Register uses of declarations in the proper contexts
>>
>> Use ContextBuilder::contextOnNode to open and close contexts as needed, so
>> that UseBuilder can register the uses in the correct contexts. This commit
>> also replaces DUContext* with DUContextPointer in ParseSession so that
>> deleted contexts don't crash KDevelop.
>>
>> As usual, when something is fixed in UseBuilder, some use counts have to
>> change in the unit tests. All the uses are now correct and no declaration
>> gets counted as an use.
>
> Are you sure that a declaration should _not_ be a use? Afaik in other
> languages, the declaration is also a use, but maybe I'm mistaken?
>
> Bye
>

UseBuilder registers uses for any identifier it encounters. Your remark 
made me wondering why "var a;" declares a but does not use it. In fact, 
I looked closely at the QMLJS AST and declarations always "hide" what 
they are declaring.

For instance, "var a;" is represented using a VariableDeclaration node, 
that has a name (a QStringRef, not a node, so UseBuilder does not see 
it) and an optional initializer. In "{a: 3}", a PropertyNameAndValue 
node is used. This node has a name (again a QStringRef, not a node) and 
an initializer.

I think that this is the cause of the behavior of UseBuilder. If 
declared identifiers don't appear in AST Identifier nodes, then 
UseBuilder cannot see them. Is it really a problem that declarations are 
not also uses?

 >  Anyhow, did you ensure that browsing through uses (e.g. "next use" 
action in the navigation menu) cycles properly through all uses, 
including the initial declaration?

I may have missed it but I don't have any "next use" in the navigation 
menu. I've verified that the declaration of a variable and all its uses 
are properly shown in "show uses":

Declaration:
   Line X: var a;
In Global:
   Line Y: a = 2;
   Line Z: console.log(a);
In do_something(...):
   Line W: a += b;


More information about the KDevelop-devel mailing list