Skip to content

Commit 45edede

Browse files
authored
Merge pull request #332 from c42f/cjf/document-EXPR
Documentation for the EXPR data structure
2 parents e8b76b5 + e2b986a commit 45edede

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

src/spec.jl

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,53 @@ const AnonFuncOp = 14
4444
SignatureOfFunctionDefIsNotACall,
4545
MalformedMacroName)
4646

47+
"""
48+
`EXPR` represents Julia expressions overlaying a span of bytes in the source
49+
text. The full span starts at the first syntactically significant token and
50+
includes any trailing whitespace/comments.
51+
52+
Iterating or directly indexing `EXPR` results in a sequence of child `EXPR` in
53+
source order, including most syntax trivia but not including whitespace,
54+
comments and semicolons.
55+
56+
The fields of `EXPR` are:
57+
58+
* `head` represents the type of the expression
59+
- For internal tree nodes it usually matches the associated `Expr`'s head
60+
field. But not always because there's some additional heads, for example
61+
`:brackets` for grouping parentheses, `:globalrefdoc`, `:quotenode`, etc
62+
- For leaf nodes (ie, individual tokens), it's capitalized. Eg,
63+
`:INTEGER` for integer tokens, `:END` for `end`, `:LPAREN` for `[`,
64+
etc.
65+
- For syntactic operators such as `=` and `<:` (which have the operator
66+
itself as the expression head in normal `Expr`), the head is an `EXPR`.
67+
68+
* `args` are the significant subexpressions, in the order used by `Base.Expr`.
69+
For leaf nodes, this is `nothing`.
70+
71+
* `trivia` are any nontrivial tokens which are trivial after parsing.
72+
- This includes things like the parentheses in `(1 + 2)`, and the
73+
keywords in `begin x end`
74+
- Whitespace and comments are not included in `trivia`
75+
76+
* `fullspan` is the total number of bytes of text covered by this expression,
77+
including any trailing whitespace or comment trivia.
78+
79+
* `span` is the number of bytes of text covered by the syntactically
80+
relevant part of this expression (ie, not including trailing whitespace
81+
or comment trivia).
82+
83+
* `val` is the source text covered by `span`
84+
85+
* `parent` is the parent node in the expression tree, or `Nothing` for the root.
86+
87+
* `meta` contains metadata. This includes some ad-hoc information supplied by
88+
the parser. (But can also be used downstream in linting or static analysis.)
89+
90+
Whitespace, comments and semicolons are not represented explicitly. Rather,
91+
they're tacked onto the end of leaf tokens in `args` or `trivia`, in the last
92+
`fullspan-span` bytes of the token.
93+
"""
4794
mutable struct EXPR
4895
head::Union{Symbol,EXPR}
4996
args::Union{Nothing,Vector{EXPR}}

0 commit comments

Comments
 (0)