# Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
# Licensed under the MIT License:
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.


===========================================
Test annotations everywhere inside a struct
===========================================

struct TestNameAnnotation $Cxx.name("RenamedStruct") {
  union {
    badFieldName @0 :Bool $Cxx.name("goodFieldName");
    bar @1 :Int8;
  }

  enum BadlyNamedEnum $Cxx.name("RenamedEnum") {
    foo @0;
    bar @1;
    baz @2 $Cxx.name("qux");
  }

  anotherBadFieldName @2 :BadlyNamedEnum $Cxx.name("anotherGoodFieldName");

  struct NestedStruct $Cxx.name("RenamedNestedStruct") {
    badNestedFieldName @0 :Bool $Cxx.name("goodNestedFieldName");
    anotherBadNestedFieldName @1 :NestedStruct $Cxx.name("anotherGoodNestedFieldName");

    enum DeeplyNestedEnum $Cxx.name("RenamedDeeplyNestedEnum") {
      quux @0;
      corge @1;
      grault @2 $Cxx.name("garply");
    }
  }

  badlyNamedUnion :union $Cxx.name("renamedUnion") {
    badlyNamedGroup :group $Cxx.name("renamedGroup") {
      foo @3 :Void;
      bar @4 :Void;
    }
    baz @5 :NestedStruct $Cxx.name("qux");
  }
}

---

(message
      (statement
        (definition
          (struct
            (type_identifier)
            (annotation_identifier)
            (annotation_array
              (const_value
                (string
                  (string_fragment))))
            (field
              (union
                (union_field
                  (field_identifier)
                  (field_version)
                  (field_type
                    (primitive_type))
                  (annotation_identifier)
                  (annotation_array
                    (const_value
                      (string
                        (string_fragment)))))
                (union_field
                  (field_identifier)
                  (field_version)
                  (field_type
                    (primitive_type)))))
            (field
              (nested_enum
                (enum
                  (enum_identifier)
                  (annotation_identifier)
                  (annotation_array
                    (const_value
                      (string
                        (string_fragment))))
                  (enum_field
                    (enum_member)
                    (field_version))
                  (enum_field
                    (enum_member)
                    (field_version))
                  (enum_field
                    (enum_member)
                    (field_version)
                    (annotation_identifier)
                    (annotation_array
                      (const_value
                        (string
                          (string_fragment))))))))
            (field
              (field_identifier)
              (field_version)
              (field_type
                (custom_type
                  (type_identifier)))
              (annotation_identifier)
              (annotation_array
                (const_value
                  (string
                    (string_fragment)))))
            (field
              (nested_struct
                (struct
                  (type_identifier)
                  (annotation_identifier)
                  (annotation_array
                    (const_value
                      (string
                        (string_fragment))))
                  (field
                    (field_identifier)
                    (field_version)
                    (field_type
                      (primitive_type))
                    (annotation_identifier)
                    (annotation_array
                      (const_value
                        (string
                          (string_fragment)))))
                  (field
                    (field_identifier)
                    (field_version)
                    (field_type
                      (custom_type
                        (type_identifier)))
                    (annotation_identifier)
                    (annotation_array
                      (const_value
                        (string
                          (string_fragment)))))
                  (field
                    (nested_enum
                      (enum
                        (enum_identifier)
                        (annotation_identifier)
                        (annotation_array
                          (const_value
                            (string
                              (string_fragment))))
                        (enum_field
                          (enum_member)
                          (field_version))
                        (enum_field
                          (enum_member)
                          (field_version))
                        (enum_field
                          (enum_member)
                          (field_version)
                          (annotation_identifier)
                          (annotation_array
                            (const_value
                              (string
                                (string_fragment)))))))))))
            (field
              (union
                (type_identifier)
                (annotation_identifier)
                (annotation_array
                  (const_value
                    (string
                      (string_fragment))))
                (union_field
                  (group
                    (type_identifier)
                    (annotation_identifier)
                    (annotation_array
                      (const_value
                        (string
                          (string_fragment))))
                    (field
                      (field_identifier)
                      (field_version)
                      (field_type
                        (primitive_type)))
                    (field
                      (field_identifier)
                      (field_version)
                      (field_type
                        (primitive_type)))))
                (union_field
                  (field_identifier)
                  (field_version)
                  (field_type
                    (custom_type
                      (type_identifier)))
                  (annotation_identifier)
                  (annotation_array
                    (const_value
                      (string
                        (string_fragment)))))))))))
