Mihaela Chirea - SAOC 2020 Milestone 2 Update 4 - Improving DMD as a Library
Mihaela Chirea
chireamihaela99 at gmail.com
Thu Nov 19 22:07:23 UTC 2020
Hello!
Here is the status of this project at the end of Milestone 2 of
#SAOC202.
Since the last update, I worked on adding location to the
StorageClassDeclaration[1] and UserAttributeDeclaration[2] nodes
(the only ones remaining if I didn't miss anything during the
last check). Doing this I noticed a few of issues with both these
nodes and a couple others and I need some advice on how to
proceed in this regard:
- The location should start at the first byte of the AST node to
preserve the context. Some nodes already had locations before I
started working on this project, but I noticed that not all of
them follow this rule. VarDeclaration and FuncDeclaration, for
example, start at the name of the variable/function, skipping the
type and the storage classes. As these locations are used for
errors, I was thinking of adding another variable to these
classes instead of replacing the value of this one.
- In the case of UserAttributeDeclaration, consecutive
expressions are all put into the same node. While the expressions
already have their location set, none contain the `@` symbol. In
a situation like `@uda1 @uda2 @uda3` moving this location just a
bit to the left wouldn't be a problem. However, `@(uda1, uda2,
uda3)` is represented in the exact same way by the parser: one
UserAttributeDeclaration node with 3 expressions. So who gets the
`@` in this case? My idea would be to set the start location of
UserAttributeDeclaration to the first `@` symbol in the group,
and, later, set the end location to wherever the last symbol is.
The problem with this approach is that all attributes, both
storage classes and user defined, can be applied on the same
variable/function, so the UserAttributeDeclaration range can
contain more than just user defined attributes.
- A StorageClassDeclaration node is not always created when
meeting a storage class. Most nodes have a StorageClass field
where this information is stored in the form of a ulong variable,
and therefore there is no node to attach its location to. For
example, `const a = 1;` generates a VarDeclaration node with the
location at `a` and the storage class with the const bit set.
Putting consecutive storage classes into the same node happens
here as well.
To deal with these situations, I need to know a bit more about
the desired usecases. What information should we be able to get
from these nodes?
For now, I will put these issues on hold. For the next milestone,
I will focus on:
- Adding the possibility of analyzing source code that is only in
memory
- Stopping the generation of TypeInfo nodes when not needed
- Adding end location where possible
I will get back to the start locations as soon as I find a
suitable solution.
The tasks planned for milestone 2 can be found here: [3]
[1]
https://github.com/AsterMiha/dmd/tree/StorageClassDeclarationLoc
[2] https://github.com/AsterMiha/dmd/tree/uadLoc
[3]
https://forum.dlang.org/post/kfcxcjauafpcrmfuajam@forum.dlang.org
More information about the Digitalmars-d
mailing list