Hi Greg, Thanks very much for the clear answer. This helps me a lot!
Best regards, Toni > On 23 Mar 2016, at 17:53, Greg Titus <g...@omnigroup.com> wrote: > > 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 <swift-dev@swift.org >> <mailto:swift-dev@swift.org>> 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 >> swift-dev@swift.org <mailto:swift-dev@swift.org> >> https://lists.swift.org/mailman/listinfo/swift-dev >
_______________________________________________ swift-dev mailing list swift-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-dev