digitalmars.D - Getting function's AST at compile-time
- Piotr Szturmaj (6/6) Sep 15 2013 I'm looking for something like __traits(getAST, fn). The AST should
- Jacob Carlborg (10/16) Sep 15 2013 I would love to have something like that. I've been thinking about that
- Kapps (8/14) Sep 16 2013 There was a pull request previously for a trait that would get
- Daniel N (21/27) Sep 16 2013 The compiler wouldn't even have to provide the original source,
- Tobias Pankrath (8/14) Sep 16 2013 Someone somewhere in this newsgroup mentioned that we need to
- deadalnix (11/17) Sep 16 2013 That is something I'd like to see, but it has 2 difficult
- Jacob Carlborg (5/13) Sep 16 2013 The AST returned does not need to have the same API as the AST used by
- deadalnix (3/20) Sep 16 2013 Sure, but it still need to be specified.
I'm looking for something like __traits(getAST, fn). The AST should represent only run-time (instantiated) code without any compile-time features. How hard it would be to implement this in the frontend? It would enable analysis of code at compile-time (without the need to modify the compiler).
Sep 15 2013
On 2013-09-16 00:59, Piotr Szturmaj wrote:I'm looking for something like __traits(getAST, fn). The AST should represent only run-time (instantiated) code without any compile-time features. How hard it would be to implement this in the frontend? It would enable analysis of code at compile-time (without the need to modify the compiler).I would love to have something like that. I've been thinking about that myself. It's fairly easy to add new things to __traits. Example, I added getUnitTests. But that just returned the functions representing the unit tests. Most traits today returns simple types, as strings, bools, tuples, symbols and so on. I would guess it's a lot more complicated to return a complete tree of classes/structs. I'm guessing these need to be defined in druntime as well. -- /Jacob Carlborg
Sep 15 2013
On Sunday, 15 September 2013 at 22:59:37 UTC, Piotr Szturmaj wrote:I'm looking for something like __traits(getAST, fn). The AST should represent only run-time (instantiated) code without any compile-time features. How hard it would be to implement this in the frontend? It would enable analysis of code at compile-time (without the need to modify the compiler).There was a pull request previously for a trait that would get the code of a function, but apparently there were issues with when the semantic stage was run and having things be transformed at that point. I don't remember the exact details, but the pull request goes into a bit more detail: https://github.com/D-Programming-Language/dmd/pull/953
Sep 16 2013
On Monday, 16 September 2013 at 07:07:01 UTC, Kapps wrote:There was a pull request previously for a trait that would get the code of a function, but apparently there were issues with when the semantic stage was run and having things be transformed at that point. I don't remember the exact details, but the pull request goes into a bit more detail: https://github.com/D-Programming-Language/dmd/pull/953The compiler wouldn't even have to provide the original source, only 2 offsets into the original file which then could be used to create a slice from an user owned "import(__FILE__)" buffer. I posted a very inefficient proof-of-concept hack a while ago when the original [] UDA syntax was used, now slightly updated for . http://dpaste.dzfl.pl/b6c7a95f The __LINE__ based approach is clearly not robust enough... but it allows prototyping as if (a very broken) .codeof was available today. I think a realistic first step would be to have a working ".codeof", instead of arguing how the perfect AST representation would look like. Once a robust way of getting the original code is available, it's easy to plugin the upcoming std.lex or any 3rd party software, like pegged to build AST:s. After people start using this feature a lot, it will be easier to define the next step. One way could be to have a 3rd param to codeof for the import(__FILE__)" buffer. __traits(codeof, buffer_2_slice, symbol)
Sep 16 2013
On Sunday, 15 September 2013 at 22:59:37 UTC, Piotr Szturmaj wrote:I'm looking for something like __traits(getAST, fn). The AST should represent only run-time (instantiated) code without any compile-time features. How hard it would be to implement this in the frontend? It would enable analysis of code at compile-time (without the need to modify the compiler).Someone somewhere in this newsgroup mentioned that we need to define the order in which compile time constructs are evaluated. This should be done before the addition of more compile time features. Can a function depend on it's own ast? What if two functions mutually depend on the ast of the other?
Sep 16 2013
On Sunday, 15 September 2013 at 22:59:37 UTC, Piotr Szturmaj wrote:I'm looking for something like __traits(getAST, fn). The AST should represent only run-time (instantiated) code without any compile-time features. How hard it would be to implement this in the frontend? It would enable analysis of code at compile-time (without the need to modify the compiler).That is something I'd like to see, but it has 2 difficult pitfalls : - Compile time feature aren't always well defined. What happen if the AST of the function you look for depends on the CTFE you are running ? Note that is can in very subtle manners. - It require to define the AST properly. And then, every change in the AST become a breaking change. That is really difficult, especially since we are reluctant to clean up some implementations quirks (some even consider them as feature).
Sep 16 2013
On 2013-09-16 10:05, deadalnix wrote:That is something I'd like to see, but it has 2 difficult pitfalls : - Compile time feature aren't always well defined. What happen if the AST of the function you look for depends on the CTFE you are running ? Note that is can in very subtle manners. - It require to define the AST properly. And then, every change in the AST become a breaking change. That is really difficult, especially since we are reluctant to clean up some implementations quirks (some even consider them as feature).The AST returned does not need to have the same API as the AST used by the compiler. -- /Jacob Carlborg
Sep 16 2013
On Monday, 16 September 2013 at 10:55:20 UTC, Jacob Carlborg wrote:On 2013-09-16 10:05, deadalnix wrote:Sure, but it still need to be specified.That is something I'd like to see, but it has 2 difficult pitfalls : - Compile time feature aren't always well defined. What happen if the AST of the function you look for depends on the CTFE you are running ? Note that is can in very subtle manners. - It require to define the AST properly. And then, every change in the AST become a breaking change. That is really difficult, especially since we are reluctant to clean up some implementations quirks (some even consider them as feature).The AST returned does not need to have the same API as the AST used by the compiler.
Sep 16 2013