DUChain and anonymous declarations

Denis Steckelmacher steckdenis at yahoo.fr
Thu Apr 10 11:02:12 UTC 2014


On 04/10/2014 12:28 PM, Sven Brauch wrote:
> First thing that comes to mind: What does ruby do? From what I understood
> Miquel solved the same problem, so it sounds like ruby has this already ;)
> Then, can you use the "store the declaration in the AST node temporarily"
> approach here maybe?

I have not yet found how Ruby handles that (if it does, because I've 
seen a comment saying that "a = -> { return 1 }" is unsupported).

> Inventing names for anonymous functions isn't that uncommon I guess, e.g. gcc
> does it too and you can see it in the compiler errors and backtraces. Also
> when you write f = function() { ... } the function isn't really anonymous any
> more ;)
> Can you maybe use something like the qualified-identifier of the left hand
> side expression (plus eventually a number if necessary) for the function name?
> Then I think it would even be okay (or desirable?) if it appears in the
> outline ...
> Can you just change the anonymous declaration's identifier as soon as it gets
> assigned to a variable?

Javascript likes corner cases, and the problem is that these corner 
cases are actually widely used:

function foo() {
     return function() { return 3; }

This function returns a new function, and the function returned really 
has no identifier (it doesn't get assigned to a variable). 
DeclarationBuilder still needs to build a FunctionType, and 
ExpressionVisitor still needs to see this type (to set the return type 
of foo).

There is also another potential use of anonymous declarations:

Item {
     id: foo
     property int bar: 3

Here, foo is an instance of an anonymous class inheriting Item and 
having a property named bar. The anonymous class needs to be identified 
in order to construct the type of foo.

> You can just create a declaration but not open it, I guess. But I'm not sure
> if that is a good idea.

The problem is that the declaration of anonymous functions must be 
"visible enough" for ExpressionVisitor to be able to find it. In fact, 
DeclarationBuilder does not need to declare anonymous functions, and my 
experimental branch does not do that. The only reason of why I need 
declarations is that ExpressionVisitor, given only a 
FunctionExpression*, must be able to find its type. As ExpressionVisitor 
is also used by the code completion model, I cannot store the type of 
anonymous functions outside the DUChain, the only thing (I think) that 
survives after DeclarationBuilder finishes its work.


More information about the KDevelop-devel mailing list