Hi Toni,
What you are seeing is a side-effect of / workaround for the use of top-level
executable statements.
In general, at the top level of a source file you expect declarations (of
types, of functions, etc) and then statements will be inside those declarations
(the implementations of free functions or members, etc). Various portions of
the type checker and AST checker depend on these assumptions — that scanning
through the top-level parts of a source file will be all declarations, and
conversely, that every statement will be inside braces (e.g. “{}”) to control
scopes and so on.
When compiling in library-mode, this setup is always true. But when compiling
for playgrounds/tools/etc you can have executable statements at the top level.
In order to keep the expected invariants of declarations on top and statements
inside, top_level_code_decl is a declaration that contains a brace_stmt that
contains the parsed top-level executable statements.
And then finally, because you are declaring a variable “x” that ought to be
visible further down in the file, the var_decl, which would normally be in the
scope inside the braces in a ‘normal’ declaration is emitted at the top level
as well.
In short, the AST for this kind of thing is a bit weird looking in order to
preserve expected structure invariants of the tree.
Hope this helps!
- Greg
> On Mar 23, 2016, at 5:58 AM, Toni Suter via swift-dev <[email protected]>
> wrote:
>
> Hi,
>
> I am trying to understand the Swift AST by looking at output produced from
> swiftc -dump-ast <file>.
> Most of it makes sense to me, but there are some things that I don’t
> understand. For example, consider
> the following code:
>
> var x = 42
>
> This produces the following output:
>
> (source_file
> (top_level_code_decl
> (brace_stmt
> (pattern_binding_decl
> (pattern_named type='Int' 'x')
> (call_expr implicit type='Int' location=test.swift:1:9
> range=[test.swift:1:9 - line:1:9] nothrow
> (constructor_ref_call_expr implicit type='(_builtinIntegerLiteral:
> Int2048) -> Int' location=test.swift:1:9 range=[test.swift:1:9 - line:1:9]
> nothrow
> (declref_expr implicit type='Int.Type -> (_builtinIntegerLiteral:
> Int2048) -> Int' location=test.swift:1:9 range=[test.swift:1:9 - line:1:9]
> decl=Swift.(file).Int.init(_builtinIntegerLiteral:) specialized=no)
> (type_expr implicit type='Int.Type' location=test.swift:1:9
> range=[test.swift:1:9 - line:1:9] typerepr='Int'))
> (tuple_expr implicit type='(_builtinIntegerLiteral: Int2048)'
> location=test.swift:1:9 range=[test.swift:1:9 - line:1:9]
> names=_builtinIntegerLiteral
> (integer_literal_expr type='Int2048' location=test.swift:1:9
> range=[test.swift:1:9 - line:1:9] value=42))))
> ))
> (var_decl "x" type='Int' access=internal storage_kind=stored))
>
> Intuitively, I would have expected that the initializer is part of the
> var_decl. Also, why is there a brace_stmt involved?
> As far as I have seen, the term brace statement doesn’t appear anywhere in
> the Swift Language Reference. Is it the
> same as code-block
> <https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html#//apple_ref/swift/grammar/code-block>?
>
> Thanks in advance!
>
> Best regards,
> Toni
> _______________________________________________
> swift-dev mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-dev
_______________________________________________
swift-dev mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-dev