/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
#mixed_content  // f.c.MixedContent
    #assign  // f.c.Assignment
        - assignment target: "xs"  // String
        - assignment operator: "="  // String
        - assignment source: [...]  // f.c.ListLiteral
        - variable scope: "1"  // Integer
        - namespace: null  // Null
    #text  // f.c.TextBlock
        - content: "\n"  // String
    #list  // f.c.IteratorBlock
        - list source: x  // f.c.Identifier
        - target loop variable: "xs"  // String
        #text  // f.c.TextBlock
            - content: "    "  // String
        ${...}  // f.c.DollarVariable
            - content: x  // f.c.Identifier
        #text  // f.c.TextBlock
            - content: "\n"  // String
    #text  // f.c.TextBlock
        - content: "\n"  // String
    #assign  // f.c.Assignment
        - assignment target: "a"  // String
        - assignment operator: "="  // String
        - assignment source: 1  // f.c.NumberLiteral
        - variable scope: "1"  // Integer
        - namespace: null  // Null
    #assign  // f.c.Assignment
        - assignment target: "b"  // String
        - assignment operator: "="  // String
        - assignment source: 1  // f.c.NumberLiteral
        - variable scope: "1"  // Integer
        - namespace: null  // Null
    #text  // f.c.TextBlock
        - content: "\n"  // String
    @  // f.c.UnifiedCall
        - callee: b  // f.c.Identifier
        #text  // f.c.TextBlock
            - content: "    x\n"  // String
    #text  // f.c.TextBlock
        - content: "\n"  // String
    @  // f.c.UnifiedCall
        - callee: c  // f.c.Identifier
    #text  // f.c.TextBlock
        - content: "\n"  // String
    @  // f.c.UnifiedCall
        - callee: d  // f.c.Identifier
    #text  // f.c.TextBlock
        - content: "\na\n"  // String
    #--...--  // f.c.Comment
        - content: " comment "  // String
    #text  // f.c.TextBlock
        - content: "b"  // String
