DUChain and anonymous declarations

Sven Brauch svenbrauch at googlemail.com
Thu Apr 10 10:28:55 UTC 2014


On Thursday 10 April 2014 11:11:29 Denis Steckelmacher wrote:
> The variable assignment needs to know the type of the function
> expression. In order to infer this type, I run DeclarationBuilder on the
> function expression, then an ExpressionVisitor that will return the type
> of the expression. The problem is that ExpressionVisitor can only find
> the type of literals and identifiers. As the anonymous function has no
> name, ExpressionVisitor cannot use DUContext::getDeclarations to get
> back the FunctionType build by DeclarationBuilder.
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?

> A dirty solution for this problem, that I currently use and that gives
> good results, is to "invent" a name for anonymous functions. I do that
> by taking the address of the QmlJS::AST::Node representing the
> FunctionExpression, and by converting it into hexadecimal. This way,
> DeclarationBuilder can build a declaration for the function, set its
> return type when it encounters a return statement, and ExpressionVisitor
> can use this name to get back the type of the function expression.
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?

> I played with Declaration::setInSymbolTable, but I was unable to remove
> the hexadecimal name of the anonymous function from the Outline view.
> Moreover, the "function" keyword in now highlighted in purple (I had to
> choose a range for the declaration and I took the function keyword).
You can use a zero length range if necessary.

> Is
> it possible to hide a declaration from the rest of KDevelop, while
> keeping it available to ExpressionVisitor?
You can just create a declaration but not open it, I guess. But I'm not sure 
if that is a good idea.

Another approach would be to give the language plugin more control over what 
is considered a function declaration. That is the direction I think we need to 
move the duchain into long-term anyways: give the language plugins control 
over what data structures are used to represent certain elements in the code, 
instead of sticking the data structure (KDevelop::FunctionDeclaration) to what 
it means ("this is a function declaration in my language").


More information about the KDevelop-devel mailing list