From 4fa90b8c5bcda9b6bd7cb26a52dbe993a1d95941 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 8 May 2017 21:04:51 +0200 Subject: [PATCH] Bug 1341102: Revendor rust dependencies on a CLOSED TREE. r=red MozReview-Commit-ID: GrqpxUECOtt --HG-- rename : third_party/rust/bitflags/.cargo-checksum.json => third_party/rust/bitflags-0.7.0/.cargo-checksum.json rename : third_party/rust/bitflags/.travis.yml => third_party/rust/bitflags-0.7.0/.travis.yml rename : third_party/rust/bitflags/Cargo.toml => third_party/rust/bitflags-0.7.0/Cargo.toml rename : third_party/rust/dtoa/LICENSE-APACHE => third_party/rust/bitflags-0.7.0/LICENSE-APACHE rename : third_party/rust/serde_json/LICENSE-MIT => third_party/rust/bitflags-0.7.0/LICENSE-MIT rename : third_party/rust/bitflags/README.md => third_party/rust/bitflags-0.7.0/README.md rename : third_party/rust/bitflags/src/lib.rs => third_party/rust/bitflags-0.7.0/src/lib.rs rename : third_party/rust/itoa/LICENSE-APACHE => third_party/rust/syntex/LICENSE-APACHE rename : third_party/rust/serde_json/LICENSE-MIT => third_party/rust/syntex/LICENSE-MIT rename : third_party/rust/serde_json/LICENSE-APACHE => third_party/rust/syntex_errors/LICENSE-APACHE rename : third_party/rust/serde_json/LICENSE-MIT => third_party/rust/syntex_errors/LICENSE-MIT rename : third_party/rust/dtoa/LICENSE-APACHE => third_party/rust/syntex_pos/LICENSE-APACHE rename : third_party/rust/serde_json/LICENSE-MIT => third_party/rust/syntex_pos/LICENSE-MIT rename : third_party/rust/dtoa/LICENSE-APACHE => third_party/rust/syntex_syntax/LICENSE-APACHE rename : third_party/rust/serde_json/LICENSE-MIT => third_party/rust/syntex_syntax/LICENSE-MIT --- third_party/rust/aster/.cargo-checksum.json | 2 +- third_party/rust/aster/Cargo.toml | 6 +- third_party/rust/aster/src/expr.rs | 3 +- third_party/rust/aster/src/generics.rs | 7 +- third_party/rust/aster/src/item.rs | 4 +- third_party/rust/aster/src/pat.rs | 5 +- third_party/rust/aster/src/path.rs | 4 +- third_party/rust/aster/src/ty.rs | 95 +- third_party/rust/aster/src/ty_param.rs | 4 +- third_party/rust/aster/src/where_predicate.rs | 14 +- third_party/rust/bindgen/.cargo-checksum.json | 2 +- .../rust/bindgen/.github/ISSUE_TEMPLATE.md | 59 + third_party/rust/bindgen/.travis.yml | 26 +- third_party/rust/bindgen/CONTRIBUTING.md | 73 +- third_party/rust/bindgen/Cargo.toml | 30 +- third_party/rust/bindgen/README.md | 234 +- third_party/rust/bindgen/book/.gitignore | 1 + third_party/rust/bindgen/book/book.toml | 3 + third_party/rust/bindgen/book/src/SUMMARY.md | 20 + .../rust/bindgen/book/src/blacklisting.md | 26 + .../rust/bindgen/book/src/chapter_1.md | 1 + .../bindgen/book/src/command-line-usage.md | 27 + third_party/rust/bindgen/book/src/cpp.md | 27 + .../src/customizing-generated-bindings.md | 28 + .../rust/bindgen/book/src/introduction.md | 34 + .../rust/bindgen/book/src/library-usage.md | 22 + third_party/rust/bindgen/book/src/nocopy.md | 20 + third_party/rust/bindgen/book/src/opaque.md | 26 + .../rust/bindgen/book/src/replacing-types.md | 27 + .../rust/bindgen/book/src/requirements.md | 67 + .../rust/bindgen/book/src/tutorial-0.md | 12 + .../rust/bindgen/book/src/tutorial-1.md | 9 + .../rust/bindgen/book/src/tutorial-2.md | 20 + .../rust/bindgen/book/src/tutorial-3.md | 58 + .../rust/bindgen/book/src/tutorial-4.md | 57 + .../rust/bindgen/book/src/tutorial-5.md | 169 + .../rust/bindgen/book/src/tutorial-6.md | 13 + .../rust/bindgen/book/src/whitelisting.md | 31 + third_party/rust/bindgen/build.rs | 15 +- third_party/rust/bindgen/ci/assert-docs.sh | 2 +- third_party/rust/bindgen/ci/before_install.sh | 12 +- third_party/rust/bindgen/ci/deploy-book.sh | 33 + third_party/rust/bindgen/ci/test-book.sh | 10 + third_party/rust/bindgen/ci/test.sh | 7 +- .../rust/bindgen/example-graphviz-ir.png | Bin 0 -> 1343520 bytes .../bindgen/src/{chooser.rs => callbacks.rs} | 6 +- third_party/rust/bindgen/src/clang.rs | 149 +- third_party/rust/bindgen/src/codegen/error.rs | 41 + .../rust/bindgen/src/codegen/helpers.rs | 41 +- third_party/rust/bindgen/src/codegen/mod.rs | 1348 ++++--- .../rust/bindgen/src/codegen/struct_layout.rs | 63 +- .../rust/bindgen/src/extra_assertions.rs | 30 + third_party/rust/bindgen/src/ir/comp.rs | 286 +- third_party/rust/bindgen/src/ir/context.rs | 392 +- third_party/rust/bindgen/src/ir/dot.rs | 62 + third_party/rust/bindgen/src/ir/enum_ty.rs | 9 +- third_party/rust/bindgen/src/ir/function.rs | 154 +- third_party/rust/bindgen/src/ir/int.rs | 16 +- third_party/rust/bindgen/src/ir/item.rs | 650 ++-- third_party/rust/bindgen/src/ir/item_kind.rs | 27 +- third_party/rust/bindgen/src/ir/layout.rs | 17 +- third_party/rust/bindgen/src/ir/mod.rs | 2 + third_party/rust/bindgen/src/ir/module.rs | 13 + third_party/rust/bindgen/src/ir/named.rs | 547 ++- third_party/rust/bindgen/src/ir/objc.rs | 156 +- third_party/rust/bindgen/src/ir/template.rs | 343 ++ third_party/rust/bindgen/src/ir/traversal.rs | 136 +- third_party/rust/bindgen/src/ir/ty.rs | 1070 ++--- third_party/rust/bindgen/src/ir/var.rs | 40 +- third_party/rust/bindgen/src/lib.rs | 489 ++- third_party/rust/bindgen/src/log_stubs.rs | 6 +- third_party/rust/bindgen/src/main.rs | 8 +- third_party/rust/bindgen/src/options.rs | 58 +- third_party/rust/bindgen/src/parse.rs | 26 +- third_party/rust/bindgen/src/regex_set.rs | 9 + third_party/rust/bindgen/src/uses.rs | 7 +- .../bindgen/tests/headers/16-byte-alignment.h | 33 - .../tests/headers/381-decltype-alias.hpp | 7 - .../rust/bindgen/tests/headers/accessors.hpp | 46 - .../bindgen/tests/headers/annotation_hide.hpp | 16 - .../rust/bindgen/tests/headers/anon_enum.hpp | 10 - .../bindgen/tests/headers/anon_enum_trait.hpp | 22 - .../tests/headers/anon_enum_whitelist.h | 6 - .../rust/bindgen/tests/headers/anon_union.hpp | 20 - .../bindgen/tests/headers/arg_keyword.hpp | 1 - .../rust/bindgen/tests/headers/auto.hpp | 19 - .../bad-namespace-parenthood-inheritance.hpp | 15 - .../bindgen/tests/headers/base-to-derived.hpp | 19 - .../tests/headers/bitfield-enum-basic.hpp | 27 - .../bindgen/tests/headers/bitfield_align.h | 41 - .../tests/headers/bitfield_method_mangling.h | 5 - .../rust/bindgen/tests/headers/blocks.h | 3 - .../canonical_path_without_namespacing.hpp | 7 - .../rust/bindgen/tests/headers/class.hpp | 56 - .../bindgen/tests/headers/class_nested.hpp | 36 - .../tests/headers/class_no_members.hpp | 16 - .../bindgen/tests/headers/class_static.hpp | 7 - .../tests/headers/class_static_const.hpp | 8 - .../bindgen/tests/headers/class_use_as.hpp | 15 - .../bindgen/tests/headers/class_with_dtor.hpp | 13 - .../tests/headers/class_with_inner_struct.hpp | 43 - .../tests/headers/class_with_typedef.hpp | 22 - .../rust/bindgen/tests/headers/complex.h | 16 - .../bindgen/tests/headers/complex_global.h | 3 - .../tests/headers/const_array_fn_arg.h | 1 - .../rust/bindgen/tests/headers/const_bool.hpp | 9 - .../tests/headers/const_enum_unnamed.hpp | 9 - .../rust/bindgen/tests/headers/const_ptr.hpp | 3 - .../bindgen/tests/headers/const_resolved_ty.h | 3 - .../bindgen/tests/headers/const_tparam.hpp | 5 - .../bindgen/tests/headers/constant-evaluate.h | 19 - .../headers/constant-non-specialized-tp.hpp | 15 - .../tests/headers/constify-all-enums.h | 11 - .../bindgen/tests/headers/constify-enum.h | 13 - .../bindgen/tests/headers/constructor-tp.hpp | 26 - .../bindgen/tests/headers/constructors.hpp | 13 - .../bindgen/tests/headers/convert-floats.h | 9 - .../rust/bindgen/tests/headers/crtp.hpp | 12 - .../bindgen/tests/headers/dash_language.h | 6 - .../tests/headers/decl_extern_int_twice.h | 2 - .../bindgen/tests/headers/decl_ptr_to_array.h | 1 - .../tests/headers/disable-namespacing.hpp | 9 - .../duplicated-namespaces-definitions.hpp | 18 - .../tests/headers/duplicated-namespaces.hpp | 4 - .../headers/duplicated_constants_in_ns.hpp | 7 - .../rust/bindgen/tests/headers/elaborated.hpp | 5 - .../headers/empty_template_param_name.hpp | 6 - third_party/rust/bindgen/tests/headers/enum.h | 9 - .../rust/bindgen/tests/headers/enum_alias.hpp | 7 - .../headers/enum_and_vtable_mangling.hpp | 11 - .../rust/bindgen/tests/headers/enum_dupe.h | 4 - .../tests/headers/enum_explicit_type.hpp | 28 - .../headers/enum_in_template_with_typedef.hpp | 16 - .../bindgen/tests/headers/enum_negative.h | 4 - .../rust/bindgen/tests/headers/enum_packed.h | 14 - .../eval-variadic-template-parameter.hpp | 8 - .../rust/bindgen/tests/headers/extern.hpp | 3 - .../rust/bindgen/tests/headers/float128.hpp | 13 - .../headers/forward-declaration-autoptr.hpp | 10 - .../forward-inherit-struct-with-fields.hpp | 8 - .../tests/headers/forward-inherit-struct.hpp | 5 - .../forward_declared_complex_types.hpp | 16 - .../tests/headers/forward_declared_struct.h | 11 - .../rust/bindgen/tests/headers/func_proto.h | 1 - .../rust/bindgen/tests/headers/func_ptr.h | 1 - .../tests/headers/func_ptr_in_struct.h | 6 - .../tests/headers/func_with_array_arg.h | 1 - .../tests/headers/func_with_func_ptr_arg.h | 1 - .../tests/headers/in_class_typedef.hpp | 10 - .../tests/headers/inherit-namespaced.hpp | 4 - .../bindgen/tests/headers/inherit_named.hpp | 5 - .../bindgen/tests/headers/inherit_typedef.hpp | 5 - .../bindgen/tests/headers/inline-function.h | 6 - .../tests/headers/inline_namespace.hpp | 11 - .../headers/inline_namespace_conservative.hpp | 12 - .../headers/inline_namespace_whitelist.hpp | 7 - .../bindgen/tests/headers/inner_const.hpp | 6 - .../tests/headers/inner_template_self.hpp | 10 - .../rust/bindgen/tests/headers/int128_t.h | 7 - .../rust/bindgen/tests/headers/issue-358.hpp | 8 - .../rust/bindgen/tests/headers/issue-372.hpp | 16 - .../rust/bindgen/tests/headers/issue-410.hpp | 12 - .../rust/bindgen/tests/headers/issue-446.hpp | 11 - .../rust/bindgen/tests/headers/issue-447.hpp | 27 - .../rust/bindgen/tests/headers/issue-493.hpp | 47 - .../rust/bindgen/tests/headers/issue_311.hpp | 5 - .../rust/bindgen/tests/headers/issue_315.hpp | 2 - .../tests/headers/jsval_layout_opaque.hpp | 424 -- .../rust/bindgen/tests/headers/keywords.h | 49 - .../rust/bindgen/tests/headers/layout.h | 6 - .../rust/bindgen/tests/headers/layout_align.h | 20 - .../rust/bindgen/tests/headers/layout_arp.h | 52 - .../rust/bindgen/tests/headers/layout_array.h | 109 - .../tests/headers/layout_cmdline_token.h | 63 - .../bindgen/tests/headers/layout_eth_conf.h | 427 -- .../bindgen/tests/headers/layout_kni_mbuf.h | 32 - .../rust/bindgen/tests/headers/layout_mbuf.h | 187 - .../bindgen/tests/headers/macro-expr-basic.h | 14 - .../rust/bindgen/tests/headers/macro-redef.h | 5 - .../rust/bindgen/tests/headers/macro_const.h | 7 - .../tests/headers/maddness-is-avoidable.hpp | 9 - .../bindgen/tests/headers/method-mangling.hpp | 5 - .../tests/headers/module-whitelisted.hpp | 2 - .../bindgen/tests/headers/msvc-no-usr.hpp | 8 - .../multiple-inherit-empty-correct-layout.hpp | 3 - .../rust/bindgen/tests/headers/mutable.hpp | 14 - .../rust/bindgen/tests/headers/namespace.hpp | 47 - .../rust/bindgen/tests/headers/nested.hpp | 15 - .../bindgen/tests/headers/nested_vtable.hpp | 8 - .../tests/headers/nested_within_namespace.hpp | 15 - .../rust/bindgen/tests/headers/no-comments.h | 5 - .../bindgen/tests/headers/no-derive-debug.h | 15 - .../bindgen/tests/headers/no-derive-default.h | 15 - .../tests/headers/no-recursive-whitelisting.h | 7 - .../rust/bindgen/tests/headers/no-std.h | 5 - .../rust/bindgen/tests/headers/no_copy.hpp | 6 - .../tests/headers/nsStyleAutoArray.hpp | 57 - .../bindgen/tests/headers/objc_interface.h | 8 - .../tests/headers/objc_interface_type.h | 13 - .../rust/bindgen/tests/headers/objc_method.h | 11 - .../bindgen/tests/headers/only_bitfields.hpp | 5 - .../bindgen/tests/headers/opaque-tracing.hpp | 21 - .../tests/headers/opaque_in_struct.hpp | 10 - .../bindgen/tests/headers/opaque_pointer.hpp | 22 - .../bindgen/tests/headers/opaque_typedef.hpp | 17 - .../bindgen/tests/headers/overflowed_enum.hpp | 12 - .../bindgen/tests/headers/overloading.hpp | 9 - .../rust/bindgen/tests/headers/private.hpp | 21 - .../bindgen/tests/headers/public-dtor.hpp | 15 - .../bindgen/tests/headers/redeclaration.hpp | 7 - .../tests/headers/ref_argument_array.hpp | 6 - .../tests/headers/reparented_replacement.hpp | 16 - .../tests/headers/replace_template_alias.hpp | 23 - .../bindgen/tests/headers/replace_use.hpp | 15 - .../bindgen/tests/headers/replaces_double.hpp | 20 - .../headers/resolved_type_def_function.h | 2 - ...me_struct_name_in_different_namespaces.hpp | 12 - .../bindgen/tests/headers/size_t_template.hpp | 8 - ...truct_containing_forward_declared_struct.h | 7 - .../bindgen/tests/headers/struct_typedef.h | 15 - .../tests/headers/struct_typedef_ns.hpp | 21 - .../tests/headers/struct_with_anon_struct.h | 6 - .../headers/struct_with_anon_struct_array.h | 10 - .../headers/struct_with_anon_struct_pointer.h | 6 - .../tests/headers/struct_with_anon_union.h | 6 - .../headers/struct_with_anon_unnamed_struct.h | 6 - .../headers/struct_with_anon_unnamed_union.h | 6 - .../tests/headers/struct_with_bitfields.h | 13 - .../tests/headers/struct_with_derive_debug.h | 15 - .../tests/headers/struct_with_nesting.h | 17 - .../tests/headers/struct_with_packing.h | 4 - .../tests/headers/struct_with_struct.h | 6 - .../struct_with_typedef_template_arg.hpp | 4 - .../bindgen/tests/headers/template-fun-ty.hpp | 16 - .../rust/bindgen/tests/headers/template.hpp | 144 - .../bindgen/tests/headers/template_alias.hpp | 13 - .../tests/headers/template_alias_basic.hpp | 4 - .../headers/template_alias_namespace.hpp | 13 - .../template_partial_specification.hpp | 10 - .../template_typedef_transitive_param.hpp | 7 - .../tests/headers/template_typedefs.hpp | 8 - .../tests/headers/templateref_opaque.hpp | 11 - .../type-referenced-by-whitelisted-function.h | 7 - .../tests/headers/type_alias_empty.hpp | 10 - ...alias_partial_template_especialization.hpp | 7 - .../type_alias_template_specialized.hpp | 9 - .../headers/typedefd-array-as-function-arg.h | 3 - .../rust/bindgen/tests/headers/typeref.hpp | 28 - .../bindgen/tests/headers/union-in-ns.hpp | 5 - .../rust/bindgen/tests/headers/union_dtor.hpp | 5 - .../bindgen/tests/headers/union_fields.hpp | 5 - .../bindgen/tests/headers/union_template.hpp | 19 - .../tests/headers/union_with_anon_struct.h | 6 - .../headers/union_with_anon_struct_bitfield.h | 8 - .../tests/headers/union_with_anon_union.h | 6 - .../headers/union_with_anon_unnamed_struct.h | 9 - .../headers/union_with_anon_unnamed_union.h | 7 - .../tests/headers/union_with_big_member.h | 14 - .../tests/headers/union_with_nesting.h | 14 - .../rust/bindgen/tests/headers/unknown_attr.h | 6 - .../rust/bindgen/tests/headers/use-core.h | 13 - .../rust/bindgen/tests/headers/using.hpp | 11 - .../bindgen/tests/headers/var-tracing.hpp | 10 - .../bindgen/tests/headers/variadic-method.hpp | 6 - .../headers/variadic_template_function.hpp | 6 - .../rust/bindgen/tests/headers/vector.hpp | 3 - .../bindgen/tests/headers/virtual_dtor.hpp | 3 - .../tests/headers/virtual_inheritance.hpp | 16 - .../tests/headers/virtual_overloaded.hpp | 5 - .../tests/headers/vtable_recursive_sig.hpp | 11 - .../bindgen/tests/headers/weird_bitfields.hpp | 35 - .../tests/headers/what_is_going_on.hpp | 19 - .../headers/whitelist-namespaces-basic.hpp | 10 - .../tests/headers/whitelist-namespaces.hpp | 10 - .../bindgen/tests/headers/whitelist_basic.hpp | 16 - .../bindgen/tests/headers/whitelist_fix.hpp | 4 - .../bindgen/tests/headers/whitelist_vars.h | 4 - third_party/rust/bindgen/tests/tests.rs | 146 - .../rust/bindgen/tests/uses/.gitignore | 2 - .../rust/bitflags-0.7.0/.cargo-checksum.json | 1 + .../rust/{dtoa => bitflags-0.7.0}/.cargo-ok | 0 third_party/rust/bitflags-0.7.0/.gitignore | 2 + third_party/rust/bitflags-0.7.0/.travis.yml | 24 + third_party/rust/bitflags-0.7.0/Cargo.toml | 13 + .../{dtoa => bitflags-0.7.0}/LICENSE-APACHE | 0 .../LICENSE-MIT | 0 third_party/rust/bitflags-0.7.0/README.md | 24 + third_party/rust/bitflags-0.7.0/src/lib.rs | 808 ++++ .../rust/bitflags-0.7.0/tests/external.rs | 21 + .../bitflags-0.7.0/tests/external_no_std.rs | 22 + .../rust/bitflags/.cargo-checksum.json | 2 +- third_party/rust/bitflags/.travis.yml | 20 +- third_party/rust/bitflags/Cargo.toml | 6 +- third_party/rust/bitflags/README.md | 21 +- third_party/rust/bitflags/src/lib.rs | 48 +- .../rust/bitflags/tests/i128_bitflags.rs | 30 + .../rust/clang-sys/.cargo-checksum.json | 2 +- third_party/rust/clang-sys/.gitignore | 6 +- third_party/rust/clang-sys/.travis.yml | 50 +- third_party/rust/clang-sys/CHANGELOG.md | 400 +- third_party/rust/clang-sys/CONTRIBUTING.md | 21 +- third_party/rust/clang-sys/Cargo.toml | 97 +- third_party/rust/clang-sys/LICENSE.txt | 404 +- third_party/rust/clang-sys/README.md | 196 +- third_party/rust/clang-sys/appveyor.yml | 24 +- third_party/rust/clang-sys/build.rs | 643 +-- .../rust/clang-sys/ci/before_install.sh | 68 +- third_party/rust/clang-sys/ci/install.bat | 16 +- third_party/rust/clang-sys/ci/script.sh | 26 +- third_party/rust/clang-sys/ci/test_script.bat | 5 +- third_party/rust/clang-sys/clippy.toml | 2 +- third_party/rust/clang-sys/src/lib.rs | 3430 +++++++++-------- third_party/rust/clang-sys/src/link.rs | 369 +- third_party/rust/clang-sys/src/support.rs | 361 +- third_party/rust/clang-sys/tests/header.h | 12 +- third_party/rust/clang-sys/tests/lib.rs | 92 +- third_party/rust/dtoa/.cargo-checksum.json | 1 - third_party/rust/dtoa/.gitignore | 2 - third_party/rust/dtoa/.travis.yml | 6 - third_party/rust/dtoa/Cargo.toml | 9 - third_party/rust/dtoa/README.md | 69 - third_party/rust/dtoa/benches/bench.rs | 54 - third_party/rust/dtoa/performance.png | Bin 70571 -> 0 bytes third_party/rust/dtoa/src/diyfp.rs | 232 -- third_party/rust/dtoa/src/dtoa.rs | 479 --- third_party/rust/dtoa/src/lib.rs | 146 - third_party/rust/dtoa/tests/test.rs | 38 - third_party/rust/itoa/.cargo-checksum.json | 1 - third_party/rust/itoa/.cargo-ok | 0 third_party/rust/itoa/.gitignore | 2 - third_party/rust/itoa/.travis.yml | 6 - third_party/rust/itoa/Cargo.toml | 9 - third_party/rust/itoa/README.md | 70 - third_party/rust/itoa/benches/bench.rs | 52 - third_party/rust/itoa/performance.png | Bin 74625 -> 0 bytes third_party/rust/itoa/src/lib.rs | 101 - third_party/rust/itoa/tests/test.rs | 25 - .../rust/libloading/.cargo-checksum.json | 2 +- third_party/rust/libloading/.travis.yml | 2 +- third_party/rust/libloading/Cargo.toml | 5 +- third_party/rust/libloading/appveyor.yml | 8 +- third_party/rust/libloading/build.rs | 16 +- third_party/rust/libloading/src/changelog.rs | 19 + .../rust/libloading/src/os/unix/mod.rs | 3 +- .../rust/libloading/src/os/windows/mod.rs | 4 +- third_party/rust/libloading/src/util.rs | 12 + .../rust/libloading/tests/functions.rs | 29 +- third_party/rust/quasi/.cargo-checksum.json | 2 +- third_party/rust/quasi/Cargo.toml | 8 +- third_party/rust/quasi/src/lib.rs | 4 - .../rust/quasi_codegen/.cargo-checksum.json | 2 +- third_party/rust/quasi_codegen/Cargo.toml | 12 +- third_party/rust/quasi_codegen/src/lib.rs | 6 +- .../rust/serde_json/.cargo-checksum.json | 1 - third_party/rust/serde_json/.cargo-ok | 0 third_party/rust/serde_json/Cargo.toml | 28 - third_party/rust/serde_json/README.md | 252 -- third_party/rust/serde_json/src/de.rs | 1091 ------ third_party/rust/serde_json/src/error.rs | 273 -- third_party/rust/serde_json/src/lib.rs | 291 -- third_party/rust/serde_json/src/macros.rs | 259 -- third_party/rust/serde_json/src/map.rs | 775 ---- third_party/rust/serde_json/src/number.rs | 235 -- third_party/rust/serde_json/src/read.rs | 637 --- third_party/rust/serde_json/src/ser.rs | 1354 ------- third_party/rust/serde_json/src/value.rs | 2233 ----------- third_party/rust/syntex/.cargo-checksum.json | 2 +- third_party/rust/syntex/Cargo.toml | 8 +- .../rust/{itoa => syntex}/LICENSE-APACHE | 0 third_party/rust/{dtoa => syntex}/LICENSE-MIT | 2 +- third_party/rust/syntex/README.md | 88 + third_party/rust/syntex/src/registry.rs | 2 +- .../rust/syntex_errors/.cargo-checksum.json | 2 +- third_party/rust/syntex_errors/Cargo.toml | 16 +- .../LICENSE-APACHE | 0 .../rust/{itoa => syntex_errors}/LICENSE-MIT | 2 +- third_party/rust/syntex_errors/README.md | 88 + .../rust/syntex_errors/src/diagnostic.rs | 56 +- third_party/rust/syntex_errors/src/emitter.rs | 190 +- third_party/rust/syntex_errors/src/lib.rs | 5 +- third_party/rust/syntex_errors/src/snippet.rs | 36 + .../rust/syntex_pos/.cargo-checksum.json | 2 +- third_party/rust/syntex_pos/Cargo.toml | 7 +- third_party/rust/syntex_pos/LICENSE-APACHE | 201 + third_party/rust/syntex_pos/LICENSE-MIT | 25 + third_party/rust/syntex_pos/README.md | 88 + third_party/rust/syntex_pos/src/lib.rs | 2 +- .../rust/syntex_syntax/.cargo-checksum.json | 2 +- third_party/rust/syntex_syntax/Cargo.toml | 19 +- third_party/rust/syntex_syntax/LICENSE-APACHE | 201 + third_party/rust/syntex_syntax/LICENSE-MIT | 25 + third_party/rust/syntex_syntax/README.md | 88 + third_party/rust/syntex_syntax/src/abi.rs | 50 +- third_party/rust/syntex_syntax/src/ast.rs | 38 +- third_party/rust/syntex_syntax/src/attr.rs | 32 +- third_party/rust/syntex_syntax/src/codemap.rs | 17 - third_party/rust/syntex_syntax/src/config.rs | 69 +- .../rust/syntex_syntax/src/diagnostic_list.rs | 22 + .../rust/syntex_syntax/src/ext/base.rs | 4 +- .../rust/syntex_syntax/src/ext/build.rs | 42 +- .../rust/syntex_syntax/src/ext/expand.rs | 48 +- .../syntex_syntax/src/ext/proc_macro_shim.rs | 72 - .../rust/syntex_syntax/src/ext/quote.rs | 12 +- .../syntex_syntax/src/ext/tt/macro_parser.rs | 26 +- .../syntex_syntax/src/ext/tt/macro_rules.rs | 26 +- .../syntex_syntax/src/ext/tt/transcribe.rs | 98 +- .../rust/syntex_syntax/src/feature_gate.rs | 99 +- third_party/rust/syntex_syntax/src/fold.rs | 53 +- third_party/rust/syntex_syntax/src/json.rs | 22 +- third_party/rust/syntex_syntax/src/lib.rs | 8 +- .../syntex_syntax/src/parse/lexer/comments.rs | 14 +- .../rust/syntex_syntax/src/parse/lexer/mod.rs | 216 +- .../src/parse/lexer/tokentrees.rs | 134 + .../src/parse/lexer/unicode_chars.rs | 6 +- .../rust/syntex_syntax/src/parse/mod.rs | 24 +- .../rust/syntex_syntax/src/parse/parser.rs | 441 +-- .../rust/syntex_syntax/src/parse/token.rs | 6 + .../rust/syntex_syntax/src/print/pprust.rs | 50 +- third_party/rust/syntex_syntax/src/test.rs | 2 +- .../rust/syntex_syntax/src/test_snippet.rs | 388 ++ .../rust/syntex_syntax/src/tokenstream.rs | 872 +---- .../rust/syntex_syntax/src/util/rc_slice.rs | 50 + third_party/rust/syntex_syntax/src/visit.rs | 23 +- .../target_build_utils/.cargo-checksum.json | 1 - third_party/rust/target_build_utils/.cargo-ok | 0 .../rust/target_build_utils/.gitignore | 2 - .../rust/target_build_utils/.travis.yml | 21 - .../rust/target_build_utils/Cargo.toml | 20 - third_party/rust/target_build_utils/README.md | 54 - .../rust/target_build_utils/appveyor.yml | 20 - third_party/rust/target_build_utils/build.rs | 111 - .../rust/target_build_utils/src/changelog.rs | 46 - .../rust/target_build_utils/src/lib.rs | 561 --- .../src/my-great-target.json | 10 - toolkit/library/gtest/rust/Cargo.lock | 129 +- toolkit/library/rust/Cargo.lock | 129 +- 436 files changed, 12276 insertions(+), 20522 deletions(-) create mode 100644 third_party/rust/bindgen/.github/ISSUE_TEMPLATE.md create mode 100644 third_party/rust/bindgen/book/.gitignore create mode 100644 third_party/rust/bindgen/book/book.toml create mode 100644 third_party/rust/bindgen/book/src/SUMMARY.md create mode 100644 third_party/rust/bindgen/book/src/blacklisting.md create mode 100644 third_party/rust/bindgen/book/src/chapter_1.md create mode 100644 third_party/rust/bindgen/book/src/command-line-usage.md create mode 100644 third_party/rust/bindgen/book/src/cpp.md create mode 100644 third_party/rust/bindgen/book/src/customizing-generated-bindings.md create mode 100644 third_party/rust/bindgen/book/src/introduction.md create mode 100644 third_party/rust/bindgen/book/src/library-usage.md create mode 100644 third_party/rust/bindgen/book/src/nocopy.md create mode 100644 third_party/rust/bindgen/book/src/opaque.md create mode 100644 third_party/rust/bindgen/book/src/replacing-types.md create mode 100644 third_party/rust/bindgen/book/src/requirements.md create mode 100644 third_party/rust/bindgen/book/src/tutorial-0.md create mode 100644 third_party/rust/bindgen/book/src/tutorial-1.md create mode 100644 third_party/rust/bindgen/book/src/tutorial-2.md create mode 100644 third_party/rust/bindgen/book/src/tutorial-3.md create mode 100644 third_party/rust/bindgen/book/src/tutorial-4.md create mode 100644 third_party/rust/bindgen/book/src/tutorial-5.md create mode 100644 third_party/rust/bindgen/book/src/tutorial-6.md create mode 100644 third_party/rust/bindgen/book/src/whitelisting.md create mode 100755 third_party/rust/bindgen/ci/deploy-book.sh create mode 100755 third_party/rust/bindgen/ci/test-book.sh create mode 100644 third_party/rust/bindgen/example-graphviz-ir.png rename third_party/rust/bindgen/src/{chooser.rs => callbacks.rs} (85%) create mode 100644 third_party/rust/bindgen/src/codegen/error.rs create mode 100644 third_party/rust/bindgen/src/extra_assertions.rs create mode 100644 third_party/rust/bindgen/src/ir/dot.rs create mode 100644 third_party/rust/bindgen/src/ir/template.rs delete mode 100644 third_party/rust/bindgen/tests/headers/16-byte-alignment.h delete mode 100644 third_party/rust/bindgen/tests/headers/381-decltype-alias.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/accessors.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/annotation_hide.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/anon_enum.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/anon_enum_trait.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/anon_enum_whitelist.h delete mode 100644 third_party/rust/bindgen/tests/headers/anon_union.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/arg_keyword.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/auto.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/bad-namespace-parenthood-inheritance.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/base-to-derived.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/bitfield-enum-basic.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/bitfield_align.h delete mode 100644 third_party/rust/bindgen/tests/headers/bitfield_method_mangling.h delete mode 100644 third_party/rust/bindgen/tests/headers/blocks.h delete mode 100644 third_party/rust/bindgen/tests/headers/canonical_path_without_namespacing.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/class.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/class_nested.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/class_no_members.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/class_static.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/class_static_const.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/class_use_as.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/class_with_dtor.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/class_with_inner_struct.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/class_with_typedef.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/complex.h delete mode 100644 third_party/rust/bindgen/tests/headers/complex_global.h delete mode 100644 third_party/rust/bindgen/tests/headers/const_array_fn_arg.h delete mode 100644 third_party/rust/bindgen/tests/headers/const_bool.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/const_enum_unnamed.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/const_ptr.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/const_resolved_ty.h delete mode 100644 third_party/rust/bindgen/tests/headers/const_tparam.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/constant-evaluate.h delete mode 100644 third_party/rust/bindgen/tests/headers/constant-non-specialized-tp.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/constify-all-enums.h delete mode 100644 third_party/rust/bindgen/tests/headers/constify-enum.h delete mode 100644 third_party/rust/bindgen/tests/headers/constructor-tp.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/constructors.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/convert-floats.h delete mode 100644 third_party/rust/bindgen/tests/headers/crtp.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/dash_language.h delete mode 100644 third_party/rust/bindgen/tests/headers/decl_extern_int_twice.h delete mode 100644 third_party/rust/bindgen/tests/headers/decl_ptr_to_array.h delete mode 100644 third_party/rust/bindgen/tests/headers/disable-namespacing.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/duplicated-namespaces-definitions.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/duplicated-namespaces.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/duplicated_constants_in_ns.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/elaborated.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/empty_template_param_name.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/enum.h delete mode 100644 third_party/rust/bindgen/tests/headers/enum_alias.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/enum_and_vtable_mangling.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/enum_dupe.h delete mode 100644 third_party/rust/bindgen/tests/headers/enum_explicit_type.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/enum_in_template_with_typedef.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/enum_negative.h delete mode 100644 third_party/rust/bindgen/tests/headers/enum_packed.h delete mode 100644 third_party/rust/bindgen/tests/headers/eval-variadic-template-parameter.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/extern.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/float128.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/forward-declaration-autoptr.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/forward-inherit-struct-with-fields.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/forward-inherit-struct.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/forward_declared_complex_types.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/forward_declared_struct.h delete mode 100644 third_party/rust/bindgen/tests/headers/func_proto.h delete mode 100644 third_party/rust/bindgen/tests/headers/func_ptr.h delete mode 100644 third_party/rust/bindgen/tests/headers/func_ptr_in_struct.h delete mode 100644 third_party/rust/bindgen/tests/headers/func_with_array_arg.h delete mode 100644 third_party/rust/bindgen/tests/headers/func_with_func_ptr_arg.h delete mode 100644 third_party/rust/bindgen/tests/headers/in_class_typedef.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/inherit-namespaced.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/inherit_named.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/inherit_typedef.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/inline-function.h delete mode 100644 third_party/rust/bindgen/tests/headers/inline_namespace.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/inline_namespace_conservative.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/inline_namespace_whitelist.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/inner_const.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/inner_template_self.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/int128_t.h delete mode 100644 third_party/rust/bindgen/tests/headers/issue-358.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/issue-372.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/issue-410.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/issue-446.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/issue-447.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/issue-493.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/issue_311.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/issue_315.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/jsval_layout_opaque.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/keywords.h delete mode 100644 third_party/rust/bindgen/tests/headers/layout.h delete mode 100644 third_party/rust/bindgen/tests/headers/layout_align.h delete mode 100644 third_party/rust/bindgen/tests/headers/layout_arp.h delete mode 100644 third_party/rust/bindgen/tests/headers/layout_array.h delete mode 100644 third_party/rust/bindgen/tests/headers/layout_cmdline_token.h delete mode 100644 third_party/rust/bindgen/tests/headers/layout_eth_conf.h delete mode 100644 third_party/rust/bindgen/tests/headers/layout_kni_mbuf.h delete mode 100644 third_party/rust/bindgen/tests/headers/layout_mbuf.h delete mode 100644 third_party/rust/bindgen/tests/headers/macro-expr-basic.h delete mode 100644 third_party/rust/bindgen/tests/headers/macro-redef.h delete mode 100644 third_party/rust/bindgen/tests/headers/macro_const.h delete mode 100644 third_party/rust/bindgen/tests/headers/maddness-is-avoidable.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/method-mangling.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/module-whitelisted.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/msvc-no-usr.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/multiple-inherit-empty-correct-layout.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/mutable.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/namespace.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/nested.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/nested_vtable.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/nested_within_namespace.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/no-comments.h delete mode 100644 third_party/rust/bindgen/tests/headers/no-derive-debug.h delete mode 100644 third_party/rust/bindgen/tests/headers/no-derive-default.h delete mode 100644 third_party/rust/bindgen/tests/headers/no-recursive-whitelisting.h delete mode 100644 third_party/rust/bindgen/tests/headers/no-std.h delete mode 100644 third_party/rust/bindgen/tests/headers/no_copy.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/nsStyleAutoArray.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/objc_interface.h delete mode 100644 third_party/rust/bindgen/tests/headers/objc_interface_type.h delete mode 100644 third_party/rust/bindgen/tests/headers/objc_method.h delete mode 100644 third_party/rust/bindgen/tests/headers/only_bitfields.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/opaque-tracing.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/opaque_in_struct.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/opaque_pointer.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/opaque_typedef.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/overflowed_enum.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/overloading.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/private.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/public-dtor.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/redeclaration.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/ref_argument_array.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/reparented_replacement.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/replace_template_alias.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/replace_use.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/replaces_double.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/resolved_type_def_function.h delete mode 100644 third_party/rust/bindgen/tests/headers/same_struct_name_in_different_namespaces.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/size_t_template.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/struct_containing_forward_declared_struct.h delete mode 100644 third_party/rust/bindgen/tests/headers/struct_typedef.h delete mode 100644 third_party/rust/bindgen/tests/headers/struct_typedef_ns.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/struct_with_anon_struct.h delete mode 100644 third_party/rust/bindgen/tests/headers/struct_with_anon_struct_array.h delete mode 100644 third_party/rust/bindgen/tests/headers/struct_with_anon_struct_pointer.h delete mode 100644 third_party/rust/bindgen/tests/headers/struct_with_anon_union.h delete mode 100644 third_party/rust/bindgen/tests/headers/struct_with_anon_unnamed_struct.h delete mode 100644 third_party/rust/bindgen/tests/headers/struct_with_anon_unnamed_union.h delete mode 100644 third_party/rust/bindgen/tests/headers/struct_with_bitfields.h delete mode 100644 third_party/rust/bindgen/tests/headers/struct_with_derive_debug.h delete mode 100644 third_party/rust/bindgen/tests/headers/struct_with_nesting.h delete mode 100644 third_party/rust/bindgen/tests/headers/struct_with_packing.h delete mode 100644 third_party/rust/bindgen/tests/headers/struct_with_struct.h delete mode 100644 third_party/rust/bindgen/tests/headers/struct_with_typedef_template_arg.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/template-fun-ty.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/template.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/template_alias.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/template_alias_basic.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/template_alias_namespace.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/template_partial_specification.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/template_typedef_transitive_param.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/template_typedefs.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/templateref_opaque.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/type-referenced-by-whitelisted-function.h delete mode 100644 third_party/rust/bindgen/tests/headers/type_alias_empty.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/type_alias_partial_template_especialization.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/type_alias_template_specialized.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/typedefd-array-as-function-arg.h delete mode 100644 third_party/rust/bindgen/tests/headers/typeref.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/union-in-ns.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/union_dtor.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/union_fields.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/union_template.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/union_with_anon_struct.h delete mode 100644 third_party/rust/bindgen/tests/headers/union_with_anon_struct_bitfield.h delete mode 100644 third_party/rust/bindgen/tests/headers/union_with_anon_union.h delete mode 100644 third_party/rust/bindgen/tests/headers/union_with_anon_unnamed_struct.h delete mode 100644 third_party/rust/bindgen/tests/headers/union_with_anon_unnamed_union.h delete mode 100644 third_party/rust/bindgen/tests/headers/union_with_big_member.h delete mode 100644 third_party/rust/bindgen/tests/headers/union_with_nesting.h delete mode 100644 third_party/rust/bindgen/tests/headers/unknown_attr.h delete mode 100644 third_party/rust/bindgen/tests/headers/use-core.h delete mode 100644 third_party/rust/bindgen/tests/headers/using.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/var-tracing.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/variadic-method.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/variadic_template_function.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/vector.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/virtual_dtor.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/virtual_inheritance.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/virtual_overloaded.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/vtable_recursive_sig.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/weird_bitfields.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/what_is_going_on.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/whitelist-namespaces-basic.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/whitelist-namespaces.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/whitelist_basic.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/whitelist_fix.hpp delete mode 100644 third_party/rust/bindgen/tests/headers/whitelist_vars.h delete mode 100644 third_party/rust/bindgen/tests/tests.rs delete mode 100644 third_party/rust/bindgen/tests/uses/.gitignore create mode 100644 third_party/rust/bitflags-0.7.0/.cargo-checksum.json rename third_party/rust/{dtoa => bitflags-0.7.0}/.cargo-ok (100%) create mode 100644 third_party/rust/bitflags-0.7.0/.gitignore create mode 100644 third_party/rust/bitflags-0.7.0/.travis.yml create mode 100644 third_party/rust/bitflags-0.7.0/Cargo.toml rename third_party/rust/{dtoa => bitflags-0.7.0}/LICENSE-APACHE (100%) rename third_party/rust/{serde_json => bitflags-0.7.0}/LICENSE-MIT (100%) create mode 100644 third_party/rust/bitflags-0.7.0/README.md create mode 100644 third_party/rust/bitflags-0.7.0/src/lib.rs create mode 100644 third_party/rust/bitflags-0.7.0/tests/external.rs create mode 100644 third_party/rust/bitflags-0.7.0/tests/external_no_std.rs create mode 100644 third_party/rust/bitflags/tests/i128_bitflags.rs mode change 100755 => 100644 third_party/rust/clang-sys/ci/before_install.sh mode change 100755 => 100644 third_party/rust/clang-sys/ci/script.sh delete mode 100644 third_party/rust/dtoa/.cargo-checksum.json delete mode 100644 third_party/rust/dtoa/.gitignore delete mode 100644 third_party/rust/dtoa/.travis.yml delete mode 100644 third_party/rust/dtoa/Cargo.toml delete mode 100644 third_party/rust/dtoa/README.md delete mode 100644 third_party/rust/dtoa/benches/bench.rs delete mode 100644 third_party/rust/dtoa/performance.png delete mode 100644 third_party/rust/dtoa/src/diyfp.rs delete mode 100644 third_party/rust/dtoa/src/dtoa.rs delete mode 100644 third_party/rust/dtoa/src/lib.rs delete mode 100644 third_party/rust/dtoa/tests/test.rs delete mode 100644 third_party/rust/itoa/.cargo-checksum.json delete mode 100644 third_party/rust/itoa/.cargo-ok delete mode 100644 third_party/rust/itoa/.gitignore delete mode 100644 third_party/rust/itoa/.travis.yml delete mode 100644 third_party/rust/itoa/Cargo.toml delete mode 100644 third_party/rust/itoa/README.md delete mode 100644 third_party/rust/itoa/benches/bench.rs delete mode 100644 third_party/rust/itoa/performance.png delete mode 100644 third_party/rust/itoa/src/lib.rs delete mode 100644 third_party/rust/itoa/tests/test.rs delete mode 100644 third_party/rust/serde_json/.cargo-checksum.json delete mode 100644 third_party/rust/serde_json/.cargo-ok delete mode 100644 third_party/rust/serde_json/Cargo.toml delete mode 100644 third_party/rust/serde_json/README.md delete mode 100644 third_party/rust/serde_json/src/de.rs delete mode 100644 third_party/rust/serde_json/src/error.rs delete mode 100644 third_party/rust/serde_json/src/lib.rs delete mode 100644 third_party/rust/serde_json/src/macros.rs delete mode 100644 third_party/rust/serde_json/src/map.rs delete mode 100644 third_party/rust/serde_json/src/number.rs delete mode 100644 third_party/rust/serde_json/src/read.rs delete mode 100644 third_party/rust/serde_json/src/ser.rs delete mode 100644 third_party/rust/serde_json/src/value.rs rename third_party/rust/{itoa => syntex}/LICENSE-APACHE (100%) rename third_party/rust/{dtoa => syntex}/LICENSE-MIT (95%) create mode 100644 third_party/rust/syntex/README.md rename third_party/rust/{serde_json => syntex_errors}/LICENSE-APACHE (100%) rename third_party/rust/{itoa => syntex_errors}/LICENSE-MIT (95%) create mode 100644 third_party/rust/syntex_errors/README.md create mode 100644 third_party/rust/syntex_pos/LICENSE-APACHE create mode 100644 third_party/rust/syntex_pos/LICENSE-MIT create mode 100644 third_party/rust/syntex_pos/README.md create mode 100644 third_party/rust/syntex_syntax/LICENSE-APACHE create mode 100644 third_party/rust/syntex_syntax/LICENSE-MIT create mode 100644 third_party/rust/syntex_syntax/README.md delete mode 100644 third_party/rust/syntex_syntax/src/ext/proc_macro_shim.rs create mode 100644 third_party/rust/syntex_syntax/src/parse/lexer/tokentrees.rs create mode 100644 third_party/rust/syntex_syntax/src/util/rc_slice.rs delete mode 100644 third_party/rust/target_build_utils/.cargo-checksum.json delete mode 100644 third_party/rust/target_build_utils/.cargo-ok delete mode 100644 third_party/rust/target_build_utils/.gitignore delete mode 100644 third_party/rust/target_build_utils/.travis.yml delete mode 100644 third_party/rust/target_build_utils/Cargo.toml delete mode 100644 third_party/rust/target_build_utils/README.md delete mode 100644 third_party/rust/target_build_utils/appveyor.yml delete mode 100644 third_party/rust/target_build_utils/build.rs delete mode 100644 third_party/rust/target_build_utils/src/changelog.rs delete mode 100644 third_party/rust/target_build_utils/src/lib.rs delete mode 100644 third_party/rust/target_build_utils/src/my-great-target.json diff --git a/third_party/rust/aster/.cargo-checksum.json b/third_party/rust/aster/.cargo-checksum.json index 457dd2f633e4..633b9de1c535 100644 --- a/third_party/rust/aster/.cargo-checksum.json +++ b/third_party/rust/aster/.cargo-checksum.json @@ -1 +1 @@ -{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"a5b1192b97986381fc06f9e4c7b857867296efe0c585b3a7daff04c991b15e11","src/arm.rs":"83b6ba22ded921ae45e02888e879b2ae73d4659db53e6552675433c3c2e0ed21","src/attr.rs":"7c6d6ff66cfbfa23e5857192db1c7e97c3b2826f4434ea7bd5d4b1ded1fe8b5e","src/block.rs":"71e2268ba151b7ee60a2fe0b0b3a7cf3e2ce3bff4fb0ee260db70ad9b1cd8826","src/constant.rs":"471b0ffc52684733a598a43e08b1719bf6852c26eca74e7f5105f0f964543980","src/ctx.rs":"738213a64a96cfe3beba6d08d82d89d48dc384b37fe726621b324bac5c017859","src/expr.rs":"6e74fc51fe53dada39f4be3371562a015869f29cff37b186fc574aae703251ae","src/fn_decl.rs":"85c30d78942bb7cda0c6bddcf55f1a35b3581a99fb15e33f3abf2763b84f8073","src/generics.rs":"3d8198e7d1b8de295ed8ee5203e6676cbd588a2975ab09709abe51991fc16e21","src/ident.rs":"31ebf657a9c267e24e66ed5e83cc76056e8d2564a8f60883871490e414154223","src/invoke.rs":"03f52dd0b135e8ffcc52c3802cdf8d516ef4a53e393ce4bdd82ced19fd106b88","src/item.rs":"43dec8003165eefaddb7effc7c8664088661c992e96b550a0624ec04e380da9e","src/lib.rs":"64faae6667ed9702bd06fd942dc27e53b7dd484aabe15396ef3c212c0b255316","src/lifetime.rs":"1801727768d88328b816a6aafe92add956d2399a82e794ca2eeac47d5f5bd681","src/lit.rs":"5420333f97ab32d9f373336851c1791802ef73fa5f1bc5139288f503c28a1ba6","src/mac.rs":"ac9569bf0f87a043dcb31063a64cff405b7f6996efaa8d9059cbc4b18781e356","src/method.rs":"bce543c148022170decd0cff9af3b37781323bcdf0dc35e23beec5f200dbc549","src/pat.rs":"0c3c0cb22054d09a2b7df277e4c05023c079d655d54b66a6bf732d56d58971e0","src/path.rs":"6f3f4e4c6f26f01674ca91635516448318f69b94061ce5694eaac15428336b51","src/qpath.rs":"b01bfe2b391754d00f32b7691ae7d65d0d91d78d69c4dfa9250e34d27b5315cf","src/self_.rs":"565780ba85ba851675331cd60dbe8a43f5eb87c318f6cc3b11bb7ba77a0d53fa","src/stmt.rs":"99e577b1417ff66c3057454ca27266a19329c6896b0f36259dcbdba0ff0005fb","src/struct_field.rs":"189fa910e236fea815d85c6b4535a76e6e7151a9d113a806bb60c6a192c7042b","src/symbol.rs":"ecab71523e9a819e063ce4231520bb7b46ba2ac8f2e2212f4f4e189d2988792e","src/ty.rs":"8d698e030192cb85207a3a4b7505af31b457360946e502673ade99dbfb30c32e","src/ty_param.rs":"a89a656a01db3d710dfbf3248b75683734eaf24c329ea241b3e54f39c8fc278f","src/variant.rs":"7fed49d694e029c81b4b70095e00704f1c67ef6357d122157d305f85dd95a512","src/variant_data.rs":"346198e982a2549ed4942ac7c6581f222f6284392afd9c0898acbfa53f58ffd3","src/where_predicate.rs":"e1645a51d5c396055629bdd351a38204f5cf81b9e2c142798ed098df99712298"},"package":"2c9b49e42a449c0b79d8acb91db37621de0978064dca7d3288ddcf030123e5b3"} \ No newline at end of file +{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"687fdaee594caaf4e71f43436f1ad56ede33916858eda1dbd1996ead64e1434e","src/arm.rs":"83b6ba22ded921ae45e02888e879b2ae73d4659db53e6552675433c3c2e0ed21","src/attr.rs":"7c6d6ff66cfbfa23e5857192db1c7e97c3b2826f4434ea7bd5d4b1ded1fe8b5e","src/block.rs":"71e2268ba151b7ee60a2fe0b0b3a7cf3e2ce3bff4fb0ee260db70ad9b1cd8826","src/constant.rs":"471b0ffc52684733a598a43e08b1719bf6852c26eca74e7f5105f0f964543980","src/ctx.rs":"738213a64a96cfe3beba6d08d82d89d48dc384b37fe726621b324bac5c017859","src/expr.rs":"e3c1237d1631f32ca2459f9579cbe4ec5877952227527df4feb5694f303f6d95","src/fn_decl.rs":"85c30d78942bb7cda0c6bddcf55f1a35b3581a99fb15e33f3abf2763b84f8073","src/generics.rs":"0ee307fadb0922599d9f8b0be5b9eb6966a601b2792167fe881911efc5debcb1","src/ident.rs":"31ebf657a9c267e24e66ed5e83cc76056e8d2564a8f60883871490e414154223","src/invoke.rs":"03f52dd0b135e8ffcc52c3802cdf8d516ef4a53e393ce4bdd82ced19fd106b88","src/item.rs":"238d4e8ecef7c1d2a4104e6ff12a24bdf0a238c22e4ea6749dad12bd21febf33","src/lib.rs":"64faae6667ed9702bd06fd942dc27e53b7dd484aabe15396ef3c212c0b255316","src/lifetime.rs":"1801727768d88328b816a6aafe92add956d2399a82e794ca2eeac47d5f5bd681","src/lit.rs":"5420333f97ab32d9f373336851c1791802ef73fa5f1bc5139288f503c28a1ba6","src/mac.rs":"ac9569bf0f87a043dcb31063a64cff405b7f6996efaa8d9059cbc4b18781e356","src/method.rs":"bce543c148022170decd0cff9af3b37781323bcdf0dc35e23beec5f200dbc549","src/pat.rs":"39cc530a1b246e67c1e004fee1dcba9befe4264404d9a38ced3cb348a88b4c55","src/path.rs":"d5370cf1b134e564a636ce435213b3027b6e24ae42eb94c9806ec13e2b9a6045","src/qpath.rs":"b01bfe2b391754d00f32b7691ae7d65d0d91d78d69c4dfa9250e34d27b5315cf","src/self_.rs":"565780ba85ba851675331cd60dbe8a43f5eb87c318f6cc3b11bb7ba77a0d53fa","src/stmt.rs":"99e577b1417ff66c3057454ca27266a19329c6896b0f36259dcbdba0ff0005fb","src/struct_field.rs":"189fa910e236fea815d85c6b4535a76e6e7151a9d113a806bb60c6a192c7042b","src/symbol.rs":"ecab71523e9a819e063ce4231520bb7b46ba2ac8f2e2212f4f4e189d2988792e","src/ty.rs":"d79a6d58e008d520761e3a6c1a5dc7732fa62694680a23a2c07dc9ea44781f2e","src/ty_param.rs":"082adf61d2959ffe6880e85b6c0356a59529a52c1caee23f0403d33bf7b600c0","src/variant.rs":"7fed49d694e029c81b4b70095e00704f1c67ef6357d122157d305f85dd95a512","src/variant_data.rs":"346198e982a2549ed4942ac7c6581f222f6284392afd9c0898acbfa53f58ffd3","src/where_predicate.rs":"41bc54f94e9fdc89b1a86cb293fb2626b3fd3905666a7baa7b78d41baa18abfa"},"package":"4ccfdf7355d9db158df68f976ed030ab0f6578af811f5a7bb6dcf221ec24e0e0"} \ No newline at end of file diff --git a/third_party/rust/aster/Cargo.toml b/third_party/rust/aster/Cargo.toml index d48695231077..ef0ccbd7d4ba 100644 --- a/third_party/rust/aster/Cargo.toml +++ b/third_party/rust/aster/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aster" -version = "0.38.0" +version = "0.41.0" authors = ["Erick Tryzelaar "] license = "MIT/Apache-2.0" description = "A libsyntax ast builder" @@ -12,9 +12,9 @@ with-syntex = ["syntex_syntax"] unstable-testing = ["clippy", "compiletest_rs"] [dependencies] -syntex_syntax = { version = "^0.54.0", optional = true } +syntex_syntax = { version = "0.58", optional = true } clippy = { version = "0.*", optional = true } -compiletest_rs = { version = "^0.2.0", optional = true } +compiletest_rs = { version = "0.2", optional = true } [[test]] name = "test" diff --git a/third_party/rust/aster/src/expr.rs b/third_party/rust/aster/src/expr.rs index 49449543391c..4ced7a374698 100644 --- a/third_party/rust/aster/src/expr.rs +++ b/third_party/rust/aster/src/expr.rs @@ -1110,6 +1110,7 @@ impl Invoke> for ExprStructFieldBuilder expr: expr, span: self.builder.span, is_shorthand: false, + attrs: Vec::new().into(), }; self.builder.fields.push(field); self.builder @@ -1904,7 +1905,7 @@ impl>> ExprSliceBuilder } pub fn build(self) -> F::Result { - self.builder.build_expr_kind(ast::ExprKind::Vec(self.exprs)) + self.builder.build_expr_kind(ast::ExprKind::Array(self.exprs)) } } diff --git a/third_party/rust/aster/src/generics.rs b/third_party/rust/aster/src/generics.rs index 10cfffcb6372..8ecff20ec011 100644 --- a/third_party/rust/aster/src/generics.rs +++ b/third_party/rust/aster/src/generics.rs @@ -2,7 +2,6 @@ use std::iter::IntoIterator; use syntax::ast; use syntax::codemap::{DUMMY_SP, Span}; -use syntax::ptr::P; use ident::ToIdent; use invoke::{Invoke, Identity}; @@ -50,7 +49,7 @@ impl GenericsBuilder callback: callback, span: DUMMY_SP, lifetimes: generics.lifetimes, - ty_params: generics.ty_params.into_vec(), + ty_params: generics.ty_params, predicates: generics.where_clause.predicates, } } @@ -200,7 +199,7 @@ impl GenericsBuilder pub fn strip_ty_params(mut self) -> Self { for ty_param in &mut self.ty_params { - ty_param.bounds = P::new(); + ty_param.bounds = vec![]; } self } @@ -213,7 +212,7 @@ impl GenericsBuilder pub fn build(self) -> F::Result { self.callback.invoke(ast::Generics { lifetimes: self.lifetimes, - ty_params: P::from_vec(self.ty_params), + ty_params: self.ty_params, where_clause: ast::WhereClause { id: ast::DUMMY_NODE_ID, predicates: self.predicates, diff --git a/third_party/rust/aster/src/item.rs b/third_party/rust/aster/src/item.rs index 8dd1b4c41b7e..a03cdb9a7a34 100644 --- a/third_party/rust/aster/src/item.rs +++ b/third_party/rust/aster/src/item.rs @@ -909,7 +909,7 @@ impl ItemTraitBuilder self.builder.build_item_kind(self.id, ast::ItemKind::Trait( self.unsafety, self.generics, - P::from_vec(self.bounds), + self.bounds, self.items, )) } @@ -1123,7 +1123,7 @@ impl ItemTraitTypeBuilder pub fn build_option_ty(self, ty: Option>) -> F::Result { let bounds = P::from_vec(self.bounds); - let node = ast::TraitItemKind::Type(bounds, ty); + let node = ast::TraitItemKind::Type(bounds.into_vec(), ty); self.builder.build_item(node) } diff --git a/third_party/rust/aster/src/pat.rs b/third_party/rust/aster/src/pat.rs index ce74fe7bb419..31f68b1c33c0 100644 --- a/third_party/rust/aster/src/pat.rs +++ b/third_party/rust/aster/src/pat.rs @@ -121,7 +121,7 @@ impl PatBuilder } pub fn build_range(self, lhs: P, rhs: P) -> F::Result { - self.build_pat_kind(ast::PatKind::Range(lhs, rhs)) + self.build_pat_kind(ast::PatKind::Range(lhs, rhs, ast::RangeEnd::Included)) } pub fn range(self) -> ExprBuilder> { @@ -432,6 +432,7 @@ impl PatStructPathBuilder ident: id, pat: pat, is_shorthand: true, + attrs: Vec::new().into(), }) } @@ -446,6 +447,7 @@ impl PatStructPathBuilder ident: id, pat: pat, is_shorthand: true, + attrs: Vec::new().into(), }) } @@ -475,6 +477,7 @@ impl Invoke> for PatStructFieldBuilder ident: self.id, pat: pat, is_shorthand: false, + attrs: Vec::new().into(), }) } } diff --git a/third_party/rust/aster/src/path.rs b/third_party/rust/aster/src/path.rs index ab7d5d56fe6f..6906e9f203d7 100644 --- a/third_party/rust/aster/src/path.rs +++ b/third_party/rust/aster/src/path.rs @@ -314,8 +314,8 @@ impl PathSegmentBuilder } else { let data = ast::AngleBracketedParameterData { lifetimes: self.lifetimes, - types: P::from_vec(self.tys), - bindings: P::from_vec(self.bindings), + types: self.tys, + bindings: self.bindings, }; Some(P(ast::PathParameters::AngleBracketed(data))) diff --git a/third_party/rust/aster/src/ty.rs b/third_party/rust/aster/src/ty.rs index af688f24c7f1..9c3589c37b31 100644 --- a/third_party/rust/aster/src/ty.rs +++ b/third_party/rust/aster/src/ty.rs @@ -199,13 +199,6 @@ impl TyBuilder TyBuilder::with_callback(TyIteratorBuilder(self)).span(span) } - pub fn object_sum(self) -> TyBuilder> { - let span = self.span; - TyBuilder::with_callback(TyObjectSumBuilder { - builder: self, - }).span(span) - } - pub fn impl_trait(self) -> TyImplTraitTyBuilder { TyImplTraitTyBuilder { builder: self, bounds: Vec::new() } } @@ -454,91 +447,6 @@ impl Invoke> for TyIteratorBuilder ////////////////////////////////////////////////////////////////////////////// -pub struct TyObjectSumBuilder { - builder: TyBuilder, -} - -impl Invoke> for TyObjectSumBuilder - where F: Invoke>, -{ - type Result = TyObjectSumTyBuilder; - - fn invoke(self, ty: P) -> Self::Result { - TyObjectSumTyBuilder { - builder: self.builder, - ty: ty, - bounds: Vec::new(), - } - } -} - -pub struct TyObjectSumTyBuilder { - builder: TyBuilder, - ty: P, - bounds: Vec, -} - -impl TyObjectSumTyBuilder - where F: Invoke>, -{ - pub fn with_bounds(mut self, iter: I) -> Self - where I: Iterator, - { - self.bounds.extend(iter); - self - } - - pub fn with_bound(mut self, bound: ast::TyParamBound) -> Self { - self.bounds.push(bound); - self - } - - pub fn bound(self) -> TyParamBoundBuilder { - TyParamBoundBuilder::with_callback(self) - } - - pub fn with_generics(self, generics: ast::Generics) -> Self { - self.with_lifetimes( - generics.lifetimes.into_iter() - .map(|def| def.lifetime) - ) - } - - pub fn with_lifetimes(mut self, lifetimes: I) -> Self - where I: Iterator, - L: IntoLifetime, - { - for lifetime in lifetimes { - self = self.lifetime(lifetime); - } - - self - } - - pub fn lifetime(self, lifetime: L) -> Self - where L: IntoLifetime, - { - self.bound().lifetime(lifetime) - } - - pub fn build(self) -> F::Result { - let bounds = P::from_vec(self.bounds); - self.builder.build_ty_kind(ast::TyKind::ObjectSum(self.ty, bounds)) - } -} - -impl Invoke for TyObjectSumTyBuilder - where F: Invoke>, -{ - type Result = Self; - - fn invoke(self, bound: ast::TyParamBound) -> Self { - self.with_bound(bound) - } -} - -////////////////////////////////////////////////////////////////////////////// - pub struct TyImplTraitTyBuilder { builder: TyBuilder, bounds: Vec, @@ -588,8 +496,7 @@ impl TyImplTraitTyBuilder } pub fn build(self) -> F::Result { - let bounds = P::from_vec(self.bounds); - self.builder.build_ty_kind(ast::TyKind::ImplTrait(bounds)) + self.builder.build_ty_kind(ast::TyKind::ImplTrait(self.bounds)) } } diff --git a/third_party/rust/aster/src/ty_param.rs b/third_party/rust/aster/src/ty_param.rs index 74290d323cd3..ad83e57ca1c9 100644 --- a/third_party/rust/aster/src/ty_param.rs +++ b/third_party/rust/aster/src/ty_param.rs @@ -51,7 +51,7 @@ impl TyParamBuilder callback: callback, span: ty_param.span, id: ty_param.ident, - bounds: ty_param.bounds.into_vec(), + bounds: ty_param.bounds, default: ty_param.default, } } @@ -104,7 +104,7 @@ impl TyParamBuilder attrs: ast::ThinVec::new(), ident: self.id, id: ast::DUMMY_NODE_ID, - bounds: P::from_vec(self.bounds), + bounds: self.bounds, default: self.default, span: self.span, }) diff --git a/third_party/rust/aster/src/where_predicate.rs b/third_party/rust/aster/src/where_predicate.rs index e7bcf1e28ed3..0726d7c70f0c 100644 --- a/third_party/rust/aster/src/where_predicate.rs +++ b/third_party/rust/aster/src/where_predicate.rs @@ -53,13 +53,13 @@ impl WherePredicateBuilder } } - pub fn eq

(self, path: P) -> WhereEqPredicateBuilder + pub fn eq

(self, p: P) -> WhereEqPredicateBuilder where P: IntoPath, { WhereEqPredicateBuilder { callback: self.callback, span: self.span, - path: path.into_path(), + lhs: TyBuilder::new().build_path(p.into_path()), } } } @@ -240,7 +240,7 @@ impl WhereBoundPredicateTyBoundsBuilder span: self.span, bound_lifetimes: self.bound_lifetimes, bounded_ty: self.ty, - bounds: P::from_vec(self.bounds), + bounds: self.bounds, }; self.callback.invoke(ast::WherePredicate::BoundPredicate(predicate)) @@ -302,7 +302,7 @@ impl WhereRegionPredicateBuilder pub struct WhereEqPredicateBuilder { callback: F, span: Span, - path: ast::Path, + lhs: P, } impl WhereEqPredicateBuilder @@ -314,13 +314,13 @@ impl WhereEqPredicateBuilder } pub fn build_ty(self, ty: P) -> F::Result { - let WhereEqPredicateBuilder { callback, span, path } = self; + let WhereEqPredicateBuilder { callback, span, lhs } = self; let predicate = ast::WhereEqPredicate { id: ast::DUMMY_NODE_ID, span: span, - path: path, - ty: ty, + lhs_ty: lhs, + rhs_ty: ty, }; callback.invoke(ast::WherePredicate::EqPredicate(predicate)) diff --git a/third_party/rust/bindgen/.cargo-checksum.json b/third_party/rust/bindgen/.cargo-checksum.json index 637bc9f5d7ed..38e4b66d5910 100644 --- a/third_party/rust/bindgen/.cargo-checksum.json +++ b/third_party/rust/bindgen/.cargo-checksum.json @@ -1 +1 @@ -{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f83c74c38844f7e2adaf3f030f24945cf0f22e027b0bbf13fffb0057d6bf7ebf",".travis.yml":"4f88383d548759360597a231194c9b6cf7608797d3abce7ac62ce79280c025f4","CONTRIBUTING.md":"cce77105e6e440bd3a3a10598574874f969bbe6f00ddccfd263232c44b74593e","Cargo.toml":"d9f3acb1457cd69904bd23258be7294d208993e3caaf1724630ce191810cde83","LICENSE":"1d2e4bdb9d94ab020e9550136cae9ec73fc699c3c96a9d98078c542e9b93d294","README.md":"b169983c6ae5ffdc4bafe2ac4e8cb0e945f2cb0d3ba99600febf18e481cb5734","build.rs":"e6ad8262fd49449da3ff4328a911521c05a31e363475147e22f1b4cd9b72cc06","ci/assert-docs.sh":"48b0077b1bafba9a5fee4e19725e468a190445c79264cf9168308404a42d087a","ci/assert-no-diff.sh":"af208c40d412e2bce82ae9b4a4e52cae4ae0b4beef9f93eb825bf5d5346a70b2","ci/assert-rustfmt.sh":"b9c810e86ea6d71bce1d6bf8d896839cfe2c198338e042ebc744b75e83af1126","ci/before_install.sh":"4a3e31f387d55858fd8db2c88fea4167dbfc086ad59f81820da7665a80c893fa","ci/test.sh":"6b0beb98294af2cbeeefe22554b305df035574b8b01ff07bb3ff1cefc26260dc","rustfmt.toml":"c4f3b593bdd634590df22aaf7b0872244d5c2169aacd0274a05e4aca4708a8d3","src/chooser.rs":"6736ddc28567c8a31cc7b9508f45c2adb19ea69eac3e5a9a65a71d39cf46c534","src/clang.rs":"bcf5f88669276e70814d31ffcbda6c0baa9826c63459ef3af4cb64717973c10b","src/codegen/helpers.rs":"910ba3d539437ef5559aba45a98b0251bf483d7481f6220c63aba2320f1d3fa0","src/codegen/mod.rs":"12c79aaaab2fe577414c95f726710bd21c6a208b90437cfbfebc84a0929772b0","src/codegen/struct_layout.rs":"d471f0119fcf24f38e85a8491825c3196c5caf0df363209aa369bf934d34d796","src/ir/annotations.rs":"887ad7beaa43eddd60337b67951a109c2e7f51cb8e757b35cad45f744b7ba919","src/ir/comp.rs":"12a4cebdeac91ae40a1c6c32b56cd63e5a65f3cd24cfcc9f559e1ece5b1cb3e2","src/ir/context.rs":"9267d36fdc463009493acf3211063212ee741db8c347c09da9d24b4dcb23f785","src/ir/derive.rs":"8706a8e3c4ccd2135d0eb9ec8c0e02008609604bce42cad2974f3ca7d2ca7d91","src/ir/enum_ty.rs":"83b74b9ba9b9ad3269792f74eba9c1358cf259f4be65417e4b4e19507f1251cb","src/ir/function.rs":"b026f935fe56aa997547412663a192227ae4bcdf2d41563efeef09154e5e910a","src/ir/int.rs":"dd467b79a642f8ab90b1316981e3ea7f29e697b7fa0f4d88c33b3a8f0f48bf4e","src/ir/item.rs":"8650d88b72ce5c7e87e2b3b3526a5b1752131ece0a6258f3ab75b9e121adf0f7","src/ir/item_kind.rs":"cc4acf0328dd94e2cfc81c3f1d4ab2549c66a934ad59fd647738c7e618b78c11","src/ir/layout.rs":"83f1b5dea286281e3c3eb0d8b7a665f17b224d8355f52f32ba3145a5c41bb4ad","src/ir/mod.rs":"27888851ee092c36158e2dccc90858cee7d9285dd9b3dd521cfa16eb19a74a1e","src/ir/module.rs":"405af067b6947499952caa6b0d09ede8b7adf0e81c66ba284ad3b19aafcfbac4","src/ir/named.rs":"0dc9a82a7017716a78d29e81eaf271ead8540b433de62129f86107105ea8566d","src/ir/objc.rs":"3987c7211ccd0480e33879405301da1ff5de814eefb8c2627a1c888540d81df8","src/ir/traversal.rs":"1d23d5c64a4b208e95bbefa5f922e7554590e22ca249b0678b88c04dfb1dcc24","src/ir/ty.rs":"8c7378be1375512de5390626e916c12709fa6d64c15dbb376ab4eb17f4ef4cab","src/ir/var.rs":"34bfdeca239723ed962d5aae89738af1c364cb7fff03ead19f088fc2bf4e8288","src/lib.rs":"c1febb40fa715ed68edb3364ed8ec647915b295cd9b93300042ca92bdf195905","src/log_stubs.rs":"e1e52b0b03397de90995afd5ddefc77e99eced2968c2203a393003435dbc436b","src/main.rs":"3ebe9d8dbcaf981ef8f84b5616f74ca9c9e55a1d6aad94d86546d3444cc44ab0","src/options.rs":"b9e33f4b8a1d5cea456bbaaa1e4ee54930426c6312ec4ece9f07c0a573bb94d3","src/parse.rs":"e7ea915a836e52d8d79043afebd0c694a7c44b0cfc530d2601d242febb00ee4c","src/regex_set.rs":"bb77bf0afea3e00d8174b98fe915b3dfd921859a4360077f39722a63582b6da3","src/uses.rs":"872c23f4cf2ae8e51b558853caaafa79eff0eb12a2981243612fbaeba855e48f","tests/headers/16-byte-alignment.h":"00d82adc7f58a875da5f2be2d3d5104e30528e2c6781f268c0eb912d0b152f94","tests/headers/381-decltype-alias.hpp":"c956638f898232c46bd75851ba9d6937b8586a907dca947f64c64bc216d18cbf","tests/headers/accessors.hpp":"7300e99f0bdf614af462a6e9c0bbdd01d5f2053c96bcfe19d55e3f9a078cbe0d","tests/headers/annotation_hide.hpp":"128644863239b73c5ac0c18aeaeb3f3a791feac10b53ff15d044bb83f0789b61","tests/headers/anon_enum.hpp":"dd5bf5a3959b73eef283c861b72e391961b37378ff130247ef62807a6973446d","tests/headers/anon_enum_trait.hpp":"2275f9c070ed690ec48947779fea0d8f7102121abcd3a80865869090310fac90","tests/headers/anon_enum_whitelist.h":"723fc9f71a353b6b40c5c418c8d1ac7d064f2eb160e204e8a7d3e41092a063e7","tests/headers/anon_union.hpp":"67ec069c869a293225e4d70fb8736c00439da092a551e4e5d674454a51763e8d","tests/headers/arg_keyword.hpp":"e100654db2124fb95d3dd139f4972f1f4b3a295bf5a8a48d374a43266a687325","tests/headers/auto.hpp":"612feab94728cf4c8e99aa8564afbed9be4aa4229b682e3da98eea43c6aee604","tests/headers/bad-namespace-parenthood-inheritance.hpp":"afb9098bc986809839817e5c3e9b58807d3998a110873910690b3107b738b774","tests/headers/base-to-derived.hpp":"82225b95e38cff09cea3d2f553cd336d854285dd20f20f75c023ecd00823cbf1","tests/headers/bitfield-enum-basic.hpp":"9a46e1ab84a5b1fa166f8bf7d6385c322a970d244ecf39656606a5e3a4d90e01","tests/headers/bitfield_align.h":"df403e1c2496acdf42a3be669043a1f70d0ab3e47ed5ce4f5dad983973499192","tests/headers/bitfield_method_mangling.h":"ae54e014be753a5a38f7b878120cf98ee051693a167283256a55307fc4eb07fd","tests/headers/blocks.h":"9a66d2119f8d08a9788f341a6abcdbe94aa1ae76936141cb5b89b4fe77f4e284","tests/headers/canonical_path_without_namespacing.hpp":"78e7937a13dd17fa8f2467bf226540ed8e04ec721d98c327636616d3be0610fc","tests/headers/class.hpp":"9f21fb226eebc789f50a06123c4abb2886130f00b658eecb7c6c95a2b561855b","tests/headers/class_nested.hpp":"6363341c6d4ce7ebe3f1d188c02c61a139e2f28508ece4e537912b52ee5d6e1f","tests/headers/class_no_members.hpp":"c466313e6157f567e62fa1323dd4243bdc9ee3bf94ef43f599f5ba612e074961","tests/headers/class_static.hpp":"8bdd7d3b31722cba32af72b7a5d469b43ef69ee710fc80127de8262364ac8ab6","tests/headers/class_static_const.hpp":"cf7860a7f1649300a1ae4e294847187cb4a01c4b7d4108cc9dd8b37780d137b5","tests/headers/class_use_as.hpp":"c9f8816493461046fcafc494c6a51a6c7871f65f5ecb1bae6cf5c6a45d83635c","tests/headers/class_with_dtor.hpp":"1ff087a703278628f7954f93d58e72e5f421540936ea341035d244e1a98ae503","tests/headers/class_with_inner_struct.hpp":"4191f3bd5dfb778aff73beccd4e3fa5a578bf9b825e90114379cf6fb1fbfc676","tests/headers/class_with_typedef.hpp":"697bb7a0f2b0dac7e5552b5567bd13e90e707e14a5901cf32bec9642ba991bf9","tests/headers/complex.h":"470b172b3980c57bb1bbe2df9562083749716b7345fd1543a715c101f38e6964","tests/headers/complex_global.h":"e8d9de67b33a73120ffa3ef676e24def347834f2567e75fa967da8917ca05e5f","tests/headers/const_array_fn_arg.h":"66c97fb3dead550a6eb69d449a90df0b84e3daf0f7e260e3c23fe9bce54199b4","tests/headers/const_bool.hpp":"e147050b90b28f261640dc9e19819b9166f943dfce3a1101a71066f8a13230d6","tests/headers/const_enum_unnamed.hpp":"e5dd66225fc721943dd8706f930ba9dc04c9e9a535c9d2b70215e563eb23359c","tests/headers/const_ptr.hpp":"f55a4a914bf4cde1c9be63a99ea58acd3a4d6b722b9d6b4d570de91aa90a861d","tests/headers/const_resolved_ty.h":"572c999b6224bdb34fe807d75f27b49c9ca5d737150bbdbc18a4fdfa4c00ad1c","tests/headers/const_tparam.hpp":"32101adfd9b408ed29ebe330219cb66da199d194c54397cf0a6a51bf40d5770b","tests/headers/constant-evaluate.h":"f1f3dd8a07f7e45ad46ae1801406b989f3d731294149520675ddf4a7dd262766","tests/headers/constant-non-specialized-tp.hpp":"48cdc56a5689e1c7d8ba2bbc0f606b3f7a9b179d35b461d2afc3c41398b69c7e","tests/headers/constify-all-enums.h":"e6756535ff5ff68c122a0c40e621a61c968e6870128d9002d77a0f59d373aa3d","tests/headers/constify-enum.h":"f6fc217be7558f4cd25c6f7b7286f99e5124596364fcf0167133fcbf66377292","tests/headers/constructor-tp.hpp":"4d7e4e7f8642e2341679c84bc36eb609fd257b5475ad5ca216ffee974297e94f","tests/headers/constructors.hpp":"5ee56a7b05b71dc55bb9dfbf8816b5045142dc22f1c6d286319a6d4653a4984d","tests/headers/convert-floats.h":"b771a2ee9ed87b132494315b7a48449f783d903e96583a7642e61785b60d576e","tests/headers/crtp.hpp":"5ad7d00d2cbf243a89a8935eab5ab2997d7e828cbd54a5699a56064a37656152","tests/headers/dash_language.h":"acccf995806466b4f7ed7e4ef454ca1c8e849011a2bf52e5825a29ea52e01133","tests/headers/decl_extern_int_twice.h":"6ed5703307ac0712871a0e2e4cab19ebf26e3114e06b495274031376ae4027aa","tests/headers/decl_ptr_to_array.h":"76157bc1b4650bbec96ae52d672d42b71d0d0a16dbf9edc24b9e19d3e9d0ee52","tests/headers/disable-namespacing.hpp":"35e390e7aa60d675b2fa6a1737a48688fdcb05c7d2dc5506a5cd1d00a64bced6","tests/headers/duplicated-namespaces-definitions.hpp":"2940fc83895551c01969bb23432df847443fca306e26d9fb1bca8483887a3d23","tests/headers/duplicated-namespaces.hpp":"18b9fbbdbdea4952aaf0e308a95ba9453b92dc2b7e0c28e2175d8d9fc4db3c10","tests/headers/duplicated_constants_in_ns.hpp":"c3d2950b1e105c8c6ddd419999d20352ffd7d0ded0243cf14e1651dbf87adf42","tests/headers/elaborated.hpp":"d818eb9d298fc296fd35ef50e1b10658a66327748ba568c2b3e1e88e52651391","tests/headers/empty_template_param_name.hpp":"c9364c8a071bceecc0d6e4a764193a5cd653f688e9fbf543fff57b4263f0305c","tests/headers/enum.h":"513c9462f908150540fd4c31cf486c4e855b8b690786b02aa62ec86f969b637b","tests/headers/enum_alias.hpp":"684150ee62e3a1c9deb169c76bf32ac907751fc667d0a8ce8c2715371021c03f","tests/headers/enum_and_vtable_mangling.hpp":"dcfebe04ad23eb146f43ce3912aceb3170dff62552808cb7ce069946dc7868b4","tests/headers/enum_dupe.h":"d8c3ccd7155412ba5cc1cd37e0ae0005ca8460e570f5a8d8d7318615f19c264c","tests/headers/enum_explicit_type.hpp":"6295f549659449d977d451d6c07046af23309e8ac7d8be40c335f2fe79f897e1","tests/headers/enum_in_template_with_typedef.hpp":"6a1c37c7464b6ceb3916893698420cd339e55be17bf546381d5a4e020921c148","tests/headers/enum_negative.h":"9ddbe83fab84947ad2b8292a722ac7f5c3e1bfd1d1ad1ce08434ddee52f0e338","tests/headers/enum_packed.h":"1c8b49061675f9cf83c429eccc63725631883832d7e5ab30554accc6db7dc09b","tests/headers/eval-variadic-template-parameter.hpp":"d9190b6b7f96f678206c328161617d847e53b7356833c7ca32fc7ed4dddf6dee","tests/headers/extern.hpp":"68f1eba8b60316cd8bf52731a5dd29c84559342e7b66daffe6b769dc98f837ec","tests/headers/float128.hpp":"f0a676919df69373828a2a32f10b3b22a6c978c08864099603b10ddf444c26b7","tests/headers/forward-declaration-autoptr.hpp":"8c808baeac1af6c9e3efe0ee78d9ca76580502c713621e3f6ad2f298f0808bd8","tests/headers/forward-inherit-struct-with-fields.hpp":"3d63ec1d66bb080c4617fa945890cf70cf02f2af7b190e6a28fcf196fc8ea1f6","tests/headers/forward-inherit-struct.hpp":"c3869d51ecae6ff5ee6bd5d6f9710be60f93aea09e73d9b97a6c9068eb94e4de","tests/headers/forward_declared_complex_types.hpp":"deba01c271881fb324170c78ed26d37904cf6da0185b1d4472a9e3354be024ae","tests/headers/forward_declared_struct.h":"e31acf91e4d112e31bcba7040f2a1366853b442c52b9b04a40c73e0f2903bfe2","tests/headers/func_proto.h":"bf9519b408ee057b71bf72ad4ce910a5b75a15ae8daf12f536b65f9f9478c461","tests/headers/func_ptr.h":"9723273d527c1be57d6517cf8123e424225cd9d25a801f42618395ab5258d2fa","tests/headers/func_ptr_in_struct.h":"ce517145afed4eb8f9d14233248bc479a88a2fdcc52dc23029c498aa306f129c","tests/headers/func_with_array_arg.h":"1f6fff4283d90e96ba44dc7c64a778ad5e725fbf8167f04697bca20176eb6d2d","tests/headers/func_with_func_ptr_arg.h":"938475e53aafa207ebef7f4a84a9ec009d8dc4fa258fcab446318f5b0f1cc07b","tests/headers/in_class_typedef.hpp":"3bdc8ad6b9013b993dccec2d1bdec69801062fb41e251790bb5f93d89a562bd0","tests/headers/inherit-namespaced.hpp":"7636ac3a56620b20a8991b1a6d228fda174cbab02ddfb3117163700d8514fa55","tests/headers/inherit_named.hpp":"3fec93dcb2359d9acfb284acc39f7050362d8ecf05d828eb20eeb81d96f98f3c","tests/headers/inherit_typedef.hpp":"3ca1a4993c29282a18a0ba72186f3297ae26efa32cf22d05c1613fc799c9c466","tests/headers/inline-function.h":"028efdd98df34a85d9631357e95e7a6809ef6e8206ab3c00ad5181ca88826aed","tests/headers/inline_namespace.hpp":"ac8c6091fe3611877918ddfcf8a02934497ea4291c91ade237206f67fafd5cfe","tests/headers/inline_namespace_conservative.hpp":"820857eac505fc4bb3e5ba76d8cfc358d84b737ddbf99a2938522ee0fd59fba7","tests/headers/inline_namespace_whitelist.hpp":"6372a42e6c419d7e096b6fad3636d4076080951b6078120fa954869fa40c7b15","tests/headers/inner_const.hpp":"7325eb025bf4923ef4f8df164037d9398895b36107a1ed444bdcc5b419a56747","tests/headers/inner_template_self.hpp":"3a356ef1a1fefe9ec891bfdd9f2341b8094246caa2bf9fb321a6b061069f84ac","tests/headers/int128_t.h":"f460a6823e171a42be7bdcc6d7212b2821b01b8b887e3055fc6484a59f050789","tests/headers/issue-358.hpp":"4abe91b5721875d99c4102b174400b1ad365ea82f7367a6266c5e6dc21e26bbc","tests/headers/issue-372.hpp":"9ecf1029c04e3ec7462416a422172360c0a3ed5eb99a1536bafb5e3264ce23e9","tests/headers/issue-410.hpp":"dff6dbf8763017d35ab103ce15c19c9aa3ce61253dda7b8e313238b30214be68","tests/headers/issue-446.hpp":"3ddcc501769ce71548744c7de130df8088865bac33a8c7e4c0e4080db8c6227d","tests/headers/issue-447.hpp":"e96fe1ee3215196413903c0d2e63b53352c8d83077f661edf5dc5b257b2cb0fa","tests/headers/issue-493.hpp":"52f7dd68a1f93b71162b84edbde86ee60e37f500438b68e0dba31b43d4a5964c","tests/headers/issue_311.hpp":"b25e14cfa72cd5425f2cadfc0868d2bcacf6ac4c019945a840d19d7bb1811a67","tests/headers/issue_315.hpp":"6ebb5e7aeded8cf9b63f25478445432f8c76af731f7d587cff9932167fd32a75","tests/headers/jsval_layout_opaque.hpp":"5a82a83ee9e27d67641ad2805d616ea02a9828c4ab31aac9a08710f6b9f70b87","tests/headers/keywords.h":"9782ce81a46a25744ffbcf1970c0944f7230b9967085c3181ee3085ca7b2b2f0","tests/headers/layout.h":"cc1a48bfd90af7568e06c10726ba7686b553697cd26e3b5457e1e7171d4d826c","tests/headers/layout_align.h":"5008a958de96670dc72ea6922664487bfc0bdcd31b4bfdedcd005db2884f242b","tests/headers/layout_arp.h":"42decc3f72dd4b444a6b46cdb83ab9656a989a68bf7330c045b22a876dd00d87","tests/headers/layout_array.h":"d2f59d29d766cc22afd42a25e28cf9f307c42ee4d61504215a7e2c41bb0fc5b8","tests/headers/layout_cmdline_token.h":"3721c4a9104febc0d91141fae968ad059eb1df6a5811efe4234d4f3a9b8c6c3d","tests/headers/layout_eth_conf.h":"ade0ec6aa2a176ea4b9e112cbdfeeff57519f9e260a4287753e472659a5f31af","tests/headers/layout_kni_mbuf.h":"e18e7e16ac669207268529f5114e810ab748d4133ac073970dd306692ef36a44","tests/headers/layout_mbuf.h":"55084b56acfc91c3bbc8c70e7cf0883f41f2b9a956f2ca824f042191f323409b","tests/headers/macro-expr-basic.h":"bce59cdefb620457295199dd7b2839e1e397292d9bab10d54b5360b0574b17d6","tests/headers/macro-redef.h":"a5b95e2b26425119c567f45bfc3ad7d298c2efcad0132e9a9bfc3078dd0c4bcf","tests/headers/macro_const.h":"ec5c8d2009ad818c0fc242f76eaa8d3562633c50e50c0444fe293b3f8ed10ef0","tests/headers/maddness-is-avoidable.hpp":"8ba98872bf4292d014729e7b8248e750412a75cebdf2edbb684173aa0db7cf87","tests/headers/method-mangling.hpp":"b7ffe0e3b002bc032fab6b7785b03e635c0595bbc03d73fae4164611473dae2a","tests/headers/module-whitelisted.hpp":"a88e2a3e2f0f3edb205e60f9b08f4b1f7e017c15dc12e0541697006ba947025b","tests/headers/msvc-no-usr.hpp":"2b11fc139685e78a11bc224967360cb06f768b09e033a8be01d97002587383d9","tests/headers/multiple-inherit-empty-correct-layout.hpp":"7559184da00f812c7679bc5a863e5720447bd2b38a42310a2ec3114f405398a0","tests/headers/mutable.hpp":"cb85dc019dcf866ebf4e092d5c6ace509957c64c18eb48ccfb7b47116bc06c2c","tests/headers/namespace.hpp":"c0417b68013beb38ce781e385d0c7125b895d75e27a07ea6f05209050b9b5a19","tests/headers/nested.hpp":"0f56cd4d50004a75d8b54226f631db939ad918b7e68d48d4ebaaaab7dffc5eb4","tests/headers/nested_vtable.hpp":"c1a7f59161dda9429ccd146407a3899a27b1749c2feb4edf5537fe912f7f423d","tests/headers/nested_within_namespace.hpp":"841c9aae50dc4303e468878514939562870dabb94da909c82fa19bb2a35d1bfe","tests/headers/no-comments.h":"6dc35a97a702a99f43ac716dc6879137600b7f88961deaa7a148de505b3c2b4f","tests/headers/no-derive-debug.h":"7ffe15044735b63b36d0c1128f1c96f6fcc3a8e9e606e0aa020690cf5d8e0399","tests/headers/no-derive-default.h":"6b46fcd9ab3dd78309e748f231f92f3ff4d08f1b43e3960160e49548c0e6ff2f","tests/headers/no-recursive-whitelisting.h":"5153922c341e809cab973c5def7c503dc9c69d28275e0a30255fdbcc51c4210a","tests/headers/no-std.h":"3b7b5fabdf51588a48f11ff8a6961b652b4251125db45a32fd743a973ed929f4","tests/headers/no_copy.hpp":"b07c1dbc2f70aced75cee5421e78a1501cf6193508169c966394d86521b5c6bc","tests/headers/nsStyleAutoArray.hpp":"a80160e314377d8d5083165e9fd42e2e5ca31b211afca51b4b0e761f41e40824","tests/headers/objc_interface.h":"5a6ebe82a544b81e9dc75b9e11f03b8b5044758c0c2d0e43dfb0900602544f24","tests/headers/objc_interface_type.h":"b9831168069a724518c5a3c972271a8e82e9c74ea2f993ae9974a18c4a89ec5a","tests/headers/objc_method.h":"82a1b5786d5dc14f2d556c705e11fea4fe60f701e6a5de8f25baedae43a96542","tests/headers/only_bitfields.hpp":"bc9e1be2d946e5ac4116fa000c55fcbece500e98425404fc9d3b0cb9726ff7ba","tests/headers/opaque-tracing.hpp":"bf3326089c275be21b336cd4fb7ee5456d89c8444265daf49c3c5440b30f4264","tests/headers/opaque_in_struct.hpp":"31907f11d4b2d6fab2871b0d3314d2a3f5ebff5acae37f1071b5efd8090f8d58","tests/headers/opaque_pointer.hpp":"a7f97c2e2a6ef6433eba296b62d176568daa1383201631dbbcf081775b7a747e","tests/headers/opaque_typedef.hpp":"204404343f0050f8028678555ab6624777c678ce69ddbb9f54552011ea4e1a38","tests/headers/overflowed_enum.hpp":"0d927f0366546eb6459e5c81fcdd497ae8ba113ddc039af79847f0a05281a835","tests/headers/overloading.hpp":"2f0e0f44a6b1a7c4a72ab9e33863568ee7d24d2a271a701739aeac82c2d1ecc9","tests/headers/private.hpp":"2eae7fa2dd83fe3607e291746b3025b1e4265a0e1e584013fbea41fdfbd91725","tests/headers/public-dtor.hpp":"ed884a9c93569d1ad98c0af942dfc5f65e7cc67f579b2d1e6f940f25d4864f7c","tests/headers/redeclaration.hpp":"e9fc6785054ac6f6d4574f1846aefe933b09e26d398bd4cb47dad4ab8fb524ff","tests/headers/ref_argument_array.hpp":"c70b8b9ca935e2c9d0e78075f66220b33960fc4244c642d35cfcbe3c585e4371","tests/headers/reparented_replacement.hpp":"4f7a9cf64897155795abb0a55be2fde6512ff2108d7b3fd2495194efb2e1ca43","tests/headers/replace_template_alias.hpp":"982e0d2b7e6b9a7df1aa34d89df2520cc5d6b2b9c16f56c1369fe0ca3a88cb18","tests/headers/replace_use.hpp":"5bac44653be912b5af5062cfc4561e30cfcb7f91d321f8a6285656e2893cc349","tests/headers/replaces_double.hpp":"be76785b1742d8c2ae7011b230dd11e3c9d1b3b8218c2a76e4fe73c2870b5e80","tests/headers/resolved_type_def_function.h":"e080509e0cea0eb09262113b0f90d147928ffdd9a7cd9c3158628f5df5ecb426","tests/headers/same_struct_name_in_different_namespaces.hpp":"90a923bf707ef9de241cefba6397c088b6ffbad5ca7c997c4460af3876fedd04","tests/headers/size_t_template.hpp":"7e73bedf712c9f4b80f6e7f5e1411b91e01a3ea47bf2d261550ca785aae0c912","tests/headers/struct_containing_forward_declared_struct.h":"c66f635e39ee5b8fda94e9499b2fd682181ab819728ac268aa2ec40b62ac0e13","tests/headers/struct_typedef.h":"1ce4615befe234708d5beeb28efcaded42946849d16ef2b83af585ff8f86cb1d","tests/headers/struct_typedef_ns.hpp":"c912e88db616f57d9662d6223387ae996925dcec05edc48d87137cffc03b1094","tests/headers/struct_with_anon_struct.h":"4ce9c56a41b2fde0ae0062e5c87315dd69adc3ef79575b267256f47a9bd531b1","tests/headers/struct_with_anon_struct_array.h":"cb13830919d4039fd8a64b5aa972c05c21f5bd5d1f8722aa865bcd394f9f3c0c","tests/headers/struct_with_anon_struct_pointer.h":"4e0b669af481100125bd0bf1a4e17bd9ee1e03fb6cc8ee36875d71ecf6d63adb","tests/headers/struct_with_anon_union.h":"542567e8d54e51f43eb6699503d857fe5177ecd51b6ad5d5667a4992aa438f28","tests/headers/struct_with_anon_unnamed_struct.h":"0ae74d3b11fc64b30fed7f217f0cc51488c93b88a62755628699affdeeb8f5ef","tests/headers/struct_with_anon_unnamed_union.h":"71c9fa48a80fa5ee3714f76eb4faacae096f30ccaacbe51e8099760abf601aa9","tests/headers/struct_with_bitfields.h":"f8faa67dc47a88b0bd0b45d42ea170a714a67f0ef90b6f2e4870006bb499fd21","tests/headers/struct_with_derive_debug.h":"c4afb2aa9ae08b2e55270118f162cb611f011a64fa5b37e87aba7efd6a515a9b","tests/headers/struct_with_nesting.h":"695cdad138a59713aeee75050a8cf6f19bc1c16af7c49bb65e7a1fd6924e549a","tests/headers/struct_with_packing.h":"409c1b58233f45f65d4c6dc9bc233feea13549630b7267a320635fff0afce563","tests/headers/struct_with_struct.h":"f1d2c84e45396a4f5c16dbdd2db59d8bd4004d24e9287387bf55d532c7e4820e","tests/headers/struct_with_typedef_template_arg.hpp":"a620d87c5138d8b24842cddf906a00b2c74a95ee68d67d3b25a993264704f62d","tests/headers/template-fun-ty.hpp":"c0724925f55650d20f1feda29cb5f10758000a4ff5ea8629f45cd90442b5e651","tests/headers/template.hpp":"92517022906ea22b58f8edc58f4b2cf438e586c8b34b9b24f5a93f509fe6c45d","tests/headers/template_alias.hpp":"1df4a71f910aca9e6971927d48927baa777782e8a24c3880a68f97af41bb17d3","tests/headers/template_alias_basic.hpp":"676cb84ef33cd1ea7c0d4490304cb5f8d26f792035970aec6a81a1bed5fbdbc7","tests/headers/template_alias_namespace.hpp":"49e66046de03ffa6c00713cf184f80eb5182284b43bfa4457bc8657e2504ebc6","tests/headers/template_partial_specification.hpp":"d3a95aab8062961864e0709ba013ab8d631c21af88aff9f93df8c2217f4c61a2","tests/headers/template_typedef_transitive_param.hpp":"6c6ff83e79eb8c882f6fc8340ae3e21727205dbea882e9f7092ed1127775967d","tests/headers/template_typedefs.hpp":"12b5892aadbe8529e7fdecf2956f9e276824818ba6f3fbbde41cc5c7e628337a","tests/headers/templateref_opaque.hpp":"6ea0675c05821e4cd023e6541d8e33d6e762e1b30e55b1aa4f81360dcd93d324","tests/headers/type-referenced-by-whitelisted-function.h":"40ea5086de6ca2219c18db7b32846614737405eea8a3c3d70b198f1b1475d281","tests/headers/type_alias_empty.hpp":"f28175e7b5b843bbb35fe6214f0834ce9c8e6d0da52432cea252e2ed9a1c7d3c","tests/headers/type_alias_partial_template_especialization.hpp":"8c21d219cca03735d2a94bc0b9e9ecbee781d8c1655bd9caf7bedd51a6b77e95","tests/headers/type_alias_template_specialized.hpp":"15ceec92f8ccbacae71d7c8b59ecd8d81347cbcd0b4e0ed4366f17bdbbe95f1d","tests/headers/typedefd-array-as-function-arg.h":"7069fbb775a6b8af548ed0de2d24f3e2e35e10ebf8eed3c8841a220f58efa10b","tests/headers/typeref.hpp":"e314362ebff945a823b4a65bcd4931aaee3f93bc50baa57771da15fbf36c0b58","tests/headers/union-in-ns.hpp":"adb1d203918accd7177e55dd97ee64d1e908403c1e5c8c8f9ba4af5f50d6e522","tests/headers/union_dtor.hpp":"4ce6c54758690778348f84f8a876b8d0bb9cfecec95668147f815bb13d57d801","tests/headers/union_fields.hpp":"4f91a0013e39abbe0e10667f72ae902441ac2f1d9245c79ae182ae606794ceba","tests/headers/union_template.hpp":"142a263ee4db89573dade811057b0e5a4e0deae61c6859612068ebb5edd05503","tests/headers/union_with_anon_struct.h":"201c566f923d41e2b9cbc788f22d084e480d73ae1be9eed7096f1bac2870a034","tests/headers/union_with_anon_struct_bitfield.h":"2a7396f341ec34fa82f4705b3867d8546cbf8d2e62e790a70169bd807a70c8cb","tests/headers/union_with_anon_union.h":"5634be743d250fbfdacfc07a3bfc3b4d7659e8e201d0801e2d956aa0e1350a7e","tests/headers/union_with_anon_unnamed_struct.h":"5df9ec8170a3f712757a1000cc6f6883b95506dcaf8c94c59f03c7f26d3cc2df","tests/headers/union_with_anon_unnamed_union.h":"563f09841597a93f956a75db20261b8a9d290d88a385be343c6bc4cff6ecd66d","tests/headers/union_with_big_member.h":"d4622757fea8ff6ff7fb67de83e0e2511b078d3a74769bb847dfe1459317e5fe","tests/headers/union_with_nesting.h":"8e800c0fc5449d2317b51ec8a3e39e7680b7b0f29d00fe917e6c9d6da3854f0a","tests/headers/unknown_attr.h":"e03caf82b34e86a4a6ba71b5cc76581a92cf80173b3a1cbff7ec83758574bd31","tests/headers/use-core.h":"a518997b6c1dd33dbc092ec376b44d5b5e34270ee37ebcfe26a7229d24e3a75e","tests/headers/using.hpp":"5021a2a1ff4eaa6dabf5dd914a71357562d4a81573d2680342a3b193e9951496","tests/headers/var-tracing.hpp":"8b93ed99969a7a32ed1e49c52df77eee4ef077db758c0f58666c46efddff3adf","tests/headers/variadic-method.hpp":"9947eda68dfb6ddcd59b558f2fcdb2356bea27cfa9f22c6a46114ee937fb88b9","tests/headers/variadic_template_function.hpp":"232d2112a60f18e5704b64df573e814f91e45dd4d7be14d8b00a11ef436ee042","tests/headers/vector.hpp":"0a80c8886beaa6a9fc83e6652be26be1e6b23e1db006111a45b2c8a7f98e7dd1","tests/headers/virtual_dtor.hpp":"b1a3928a25c62d51d394e2192f91e250298c0357330241609103329f43185ae7","tests/headers/virtual_inheritance.hpp":"d92e8a26a939e9a7d575f3af0caf3081a30b3409f6f320432e13719cb7ddbad1","tests/headers/virtual_overloaded.hpp":"fea58d5f4a1814f7907e0066d1019e334ae0798454448eb825fb3f81dafd1a8d","tests/headers/vtable_recursive_sig.hpp":"5aae5edd330622207e6a803ad880b421d1530aa81fd57b8e10fe7faca186bd01","tests/headers/weird_bitfields.hpp":"86d0c0ddd64f812874889f21c395df49001bd91b114613c650806d46da0063b9","tests/headers/what_is_going_on.hpp":"8a7ccdcab365c12f176114a223da9aba83ecf6c98f349a56b74579bd0d9128ee","tests/headers/whitelist-namespaces-basic.hpp":"fae14a96e1d7fc9a32972d182869f0e64ff098ab7a9596bfdfd1ab14c7eb3950","tests/headers/whitelist-namespaces.hpp":"22c965df52d5641a16588eb8d718f523ba7fb16fed2f0a13847abcd78786af9a","tests/headers/whitelist_basic.hpp":"f63a40850cbf2cae91e804f89df184bfc352e222e6256c3c7055950d0c5d0fe9","tests/headers/whitelist_fix.hpp":"19f34cbdd375a43709fb73786814eccc5510ec902d5d645d7550dd4e70c5d9e0","tests/headers/whitelist_vars.h":"926f3437b49cb7434a0c9964a60182a4fd4ab29c25217621ee3510ab5e9ad282","tests/tests.rs":"868cd68740b6f4738595fa4e6578b49f1caced17cc278523a6ac724d8eee2af8","tests/uses/.gitignore":"377f40a9357416f0d0063605ea555bf4c876bf0adeec4e5093654c9427efe7d6"},"package":"facc480c409c373db3c870e377ce223e5e07d979efc2604691dc6f583e8ded0f"} \ No newline at end of file +{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".github/ISSUE_TEMPLATE.md":"0e894c174dc24acfc0a20439f7c0d700fcc2fc81b4c1aea00a259c3dc7ab44fb",".gitignore":"f83c74c38844f7e2adaf3f030f24945cf0f22e027b0bbf13fffb0057d6bf7ebf",".travis.yml":"5cb7111daf589d0379e3cd7c799cec2e6408f310765be81db549a1808cde6046","CONTRIBUTING.md":"113197274ed6ca925acf05330d9bae11141bc8e2ab11ae497697fa04df76f33e","Cargo.toml":"97d885f9d0c56c18dd53585b7bf81250423ea9f35e29b363bf467ac7d202050b","LICENSE":"1d2e4bdb9d94ab020e9550136cae9ec73fc699c3c96a9d98078c542e9b93d294","README.md":"a9de10e2422217cb41cac812694eedc82c2c429d18721af05a38f4593d56347c","book/.gitignore":"3c4dbff9eeda9410a0b9eb423472981db8997d666388b4cd2424700c3974d64b","book/book.toml":"dbf931141036d1d0eb02b326f7f5d7867dd9a8f0fc49b66b8fd97e9873c08e44","book/src/SUMMARY.md":"7bb880df58bbe6e4a6f103ce4fe4835e6499b2005db1b621d5c6ee26982a6f64","book/src/blacklisting.md":"a68424cc3643e06e83c5ea4efd5eb501dc64229ff9f4286b9a210a2376c20a9b","book/src/chapter_1.md":"cac4f4a3609ec22eb519b0e07d1d1bdc15ac3d741f29f9b97280f700b96ded66","book/src/command-line-usage.md":"9e3ae32cb5d893f1a93fc539149950bacdf43a18c694169fa45dfe8080617403","book/src/cpp.md":"6dab1a9997d2f30b69ba78c19ddefe48b7033a3ec247b573dba96b6be047e582","book/src/customizing-generated-bindings.md":"0363ca69719c5e24d624ac3adfef71445896d3ed2b7bb3689c7905e47bdd9cdd","book/src/introduction.md":"b6b0cdcf67ad428f53b667449e309712c617b80fade6afcf598bc58dc6bf58fa","book/src/library-usage.md":"62565cf21a6b07a9de9a3f525427e75aa0f05350a1f546ed428c8a6c40cf850c","book/src/nocopy.md":"615f9b2ae474adf32ddf49e2f29f019f857db0fbb3232ed30df3960edd9f3406","book/src/opaque.md":"d6a5d6b7dfad4e8e1f7a1307f57a0a4b723032970bbae0e1290e1ab81e08b21a","book/src/replacing-types.md":"f406f7135299cd4e67a017237a6a9acbe936aa48f37b7f52be2769c90537b73f","book/src/requirements.md":"23c71db101ccce73b46a0273fa81bc4cb1f2271499fb15f7c7befd8c95ec3bbe","book/src/tutorial-0.md":"4f46c7f76056231f8c4dc7e21dc06d7adad44b4e25a44c46c821684df023bd24","book/src/tutorial-1.md":"e6e6bb4dbdcf968d516a2da039a57f6153a21bd67167d709dc2abc6614372b1e","book/src/tutorial-2.md":"f6c9cf4ea8e38628c15dedc0ee7f60055a2aa841e95f972465d2932bb71878ad","book/src/tutorial-3.md":"112eb7ae1a1194cd82890ca3301beb309b0fa5f1ca2942db5af25f2654b06b1b","book/src/tutorial-4.md":"840edccb116f59229a2132041b5ec532f903ca90ec9904a3d1b6847779e62a66","book/src/tutorial-5.md":"45a3034e2ad8d701a8cc5d2e5e34fb427486f1ebddeff3a91a9567a1b3b668d8","book/src/tutorial-6.md":"e92a5188366108495dc1e989a1ed77c31a71b09b4c3e48936c9445b49bcc466b","book/src/whitelisting.md":"b6913e3fc43d28f504331afe4ccc3607caad9aa88d4cb627a86bdc1e72ea0175","build.rs":"e19f3db33a88f9217acef718eda6fcb6bf33949297c9f2b2bf444ce32b279a4e","ci/assert-docs.sh":"5d8ba2280bb03b9d975d2290cf9ec8f1344dafa61a3f5e2ace763019502e4e92","ci/assert-no-diff.sh":"af208c40d412e2bce82ae9b4a4e52cae4ae0b4beef9f93eb825bf5d5346a70b2","ci/assert-rustfmt.sh":"b9c810e86ea6d71bce1d6bf8d896839cfe2c198338e042ebc744b75e83af1126","ci/before_install.sh":"51409851cf4e1dee27735461e77247c599e023259c3a57e82fa044f284ca8e87","ci/deploy-book.sh":"2dc27d6252ed0f9e5e9fd5729f6087d20c6f0901ae2a470e3436f1c324623455","ci/test-book.sh":"3b8892a6c4e1f840349d2cfadff5a5e5b7ddf28b4b11e9cafd92cfe9c8d6d8c6","ci/test.sh":"495d4d0dcb8251a6be866c7e2bd090dcb63534103926c455159a5d4a097440a7","example-graphviz-ir.png":"e1122ab33b4c80e8c9c0cf8abea404c1192f9b2eef97f5766e86103cc95d5e01","rustfmt.toml":"c4f3b593bdd634590df22aaf7b0872244d5c2169aacd0274a05e4aca4708a8d3","src/callbacks.rs":"e0d36d30adac8a4eaab64f0a9df0ab29026fcd5f5c5588bdeb2ad762e4c024ad","src/clang.rs":"b160cd41a0b80aa204c85c6fd8800d31887529ef21a21d08e32585b71ee55576","src/codegen/error.rs":"2613af1d833377fd4a70719f4a09951d9d45dc9227827b9a2a938a1bcaaea2dd","src/codegen/helpers.rs":"4bbb92c587e881466ac4d343ada69f4a7a8edea8c484cf142664dade7c150acc","src/codegen/mod.rs":"04763dc3186085d431f5e093d1ef874113c64e49082221b856e655170c26f185","src/codegen/struct_layout.rs":"c485bed7bc4e0f02cd0a5e15b5d30d7756a90ffec0417f0202ad56ddb078561f","src/extra_assertions.rs":"449549c4a7a50c3f0b06332452b2fb6c9b23f31ca8e5e1656fe6c7f21e8ef7fa","src/ir/annotations.rs":"887ad7beaa43eddd60337b67951a109c2e7f51cb8e757b35cad45f744b7ba919","src/ir/comp.rs":"d674a06f569a807f57ce659dac9145ad3a02008ad895119e3b6d0869f1797b96","src/ir/context.rs":"7b6011adacb6abe2ac5ae8155d6a67d72bbf0546d1e73b00aee62856a75c4809","src/ir/derive.rs":"8706a8e3c4ccd2135d0eb9ec8c0e02008609604bce42cad2974f3ca7d2ca7d91","src/ir/dot.rs":"412da1e6ec7259c73266c437b7d5ee898d3116c00be2edbd8a69dc847c444d94","src/ir/enum_ty.rs":"cb552126907501e78a8c98a2d107c825842a45ab3fad8b656bdaf9925d0cdfd9","src/ir/function.rs":"b86146b0a3e8089d92c86ac9695b508cdeda4d0cc8f2937a131ea627dc151acd","src/ir/int.rs":"b7bc19668ca6c7c084a3f8d1e07d5a980ee49c0c9a8882c3e72baab4ea7fa403","src/ir/item.rs":"5df3c6d331b09773555f853b7d935303470d9e9b4f4f37ce3de28347d0494619","src/ir/item_kind.rs":"64b8b5bede6dfe950ceb15da1aabf888707eeb5883df9213f05ee47797bfb84f","src/ir/layout.rs":"9676218f0f25769573eb4ba848b7a8030501fc08c28b40f13a21e4fa5ee44d4e","src/ir/mod.rs":"74631e1006639aaf13e8b251efef9788b9e80b55df5b8b1fb2c484845450a196","src/ir/module.rs":"7bd8273e7001ca3d2f084e4374e21eb9f13f087bbd901849cf617e75fb712050","src/ir/named.rs":"ac96cb1a9f4ae3e9fa6494b3d97d8f30acffa180838f8ddd1392a7c168352c2d","src/ir/objc.rs":"353be93027d74ad102ac3b0ef8754dd1258a400dcf7d361fa224fdf1ab973c56","src/ir/template.rs":"f46ff043ea41c6ada2bcbfad3b2ce953f8289f6c77f7e81121b1ab5fcb47a6af","src/ir/traversal.rs":"02f25e1cad8f8630408a5b08aa5cc1d2dc97301455ef0fbb349f9f21d1334f2a","src/ir/ty.rs":"091a25e98d8bbaccc764cd1f2698493ed87128994de1f07e2fed272e81715958","src/ir/var.rs":"8d81a8227709dbe879f9aa39b7cd6c99870d1f68cd1113be03fa34a580eef43f","src/lib.rs":"1792da94ef7939832193da76722f311047d8c6c6e7248cb355bd30ae6ec956b8","src/log_stubs.rs":"6dfdd908b7c6453da416cf232893768f9480e551ca4add0858ef88bf71ee6ceb","src/main.rs":"fdd6a6810806fa40e6bb6001be691eeaad5439ebc462ccf1d779d20ac63d6fad","src/options.rs":"c8af158043a61a90bb11005aad9515e852a89cf758322faed2dd3ec8faa641f2","src/parse.rs":"6d88e1dcdb4e99f4f65629ce205c14e18097773bc938973f8e3849ba3bda4f79","src/regex_set.rs":"6c46877238c338e1fc6a35a8983db21f0711c979e44310975f60ad73a50fdbbc","src/uses.rs":"b46a9b540c39d23fa1c22c8b5325d00486348a2aec2464deada524a6b96ebec2"},"package":"21a1de90068c1e58dd31b71daab70e1a1e54212b43cc6c4714e7c8acefb28992"} \ No newline at end of file diff --git a/third_party/rust/bindgen/.github/ISSUE_TEMPLATE.md b/third_party/rust/bindgen/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000000..33b65a200f69 --- /dev/null +++ b/third_party/rust/bindgen/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,59 @@ +### Input C/C++ Header + +```C++ +// Insert your (minimal) C/C++ header here. +``` + +### Bindgen Invokation + + + +```Rust +bindgen::Builder::default() + .header("input.h") + .generate() + .unwrap() +``` + +or + +``` +$ bindgen input.h --whatever --flags +``` + +### Actual Results + +``` +Insert panic message and backtrace (set the `RUST_BACKTRACE=1` env var) here. +``` + +and/or + +```rust +// Insert the (incorrect/buggy) generated bindings here +``` + +and/or + +``` +Insert compilation errors generated when compiling the bindings with rustc here +``` + +### Expected Results + + + +### `RUST_LOG=bindgen` Output + +

+ +``` +Insert debug logging when running bindgen with the `RUST_LOG=bindgen` environment +variable set. +``` + +
diff --git a/third_party/rust/bindgen/.travis.yml b/third_party/rust/bindgen/.travis.yml index ba5ec867c2d4..f66c7d368434 100644 --- a/third_party/rust/bindgen/.travis.yml +++ b/third_party/rust/bindgen/.travis.yml @@ -9,14 +9,24 @@ addons: os: - linux - - osx rust: - stable env: - - CARGO_TARGET_DIR=/tmp/bindgen LLVM_VERSION=3.8 BINDGEN_FEATURES=testing_only_llvm_stable - - CARGO_TARGET_DIR=/tmp/bindgen LLVM_VERSION=3.9 BINDGEN_FEATURES= + global: + - CARGO_TARGET_DIR=/tmp/bindgen + matrix: + - LLVM_VERSION=3.7.1 BINDGEN_FEATURES=testing_only_llvm_stable + - LLVM_VERSION=3.8.1 BINDGEN_FEATURES=testing_only_llvm_stable + - LLVM_VERSION=3.9.0 BINDGEN_FEATURES= + - LLVM_VERSION=4.0.0 BINDGEN_FEATURES= + +matrix: + fast_finish: true + allow_failures: + - env: LLVM_VERSION=4.0.0 BINDGEN_FEATURES= + - env: LLVM_VERSION=3.7.1 BINDGEN_FEATURES=testing_only_llvm_stable cache: directories: @@ -25,9 +35,17 @@ cache: before_install: . ./ci/before_install.sh script: - - ./ci/assert-rustfmt.sh + # - ./ci/assert-rustfmt.sh - BINDGEN_FEATURES="$BINDGEN_FEATURES" ./ci/assert-docs.sh - BINDGEN_FEATURES="$BINDGEN_FEATURES" ./ci/test.sh + - ./ci/test-book.sh + +after_success: + - test "$TRAVIS_PULL_REQUEST" == "false" && + test "$TRAVIS_BRANCH" == "master" && + test "$BINDGEN_FEATURES" == "" && + test "$LLVM_VERSION" == "3.9.0" && + ./ci/deploy-book.sh notifications: webhooks: http://build.servo.org:54856/travis diff --git a/third_party/rust/bindgen/CONTRIBUTING.md b/third_party/rust/bindgen/CONTRIBUTING.md index 8c34710713de..1d78497e6a8d 100644 --- a/third_party/rust/bindgen/CONTRIBUTING.md +++ b/third_party/rust/bindgen/CONTRIBUTING.md @@ -15,8 +15,8 @@ out to us in a GitHub issue, or stop by - [Overview](#overview) - [Running All Tests](#running-all-tests) - [Authoring New Tests](#authoring-new-tests) -- [Generating Graphviz Dot File](#generating-graphviz-dot-file) - [Automatic code formatting](#automatic-code-formatting) +- [Generating Graphviz Dot Files](#generating-graphviz-dot-files) - [Debug Logging](#debug-logging) - [Using `creduce` to Minimize Test Cases](#using-creduce-to-minimize-test-cases) - [Isolating Your Test Case](#isolating-your-test-case) @@ -65,12 +65,12 @@ $ export LD_LIBRARY_PATH=path/to/clang-3.9/lib # for Linux $ export DYLD_LIBRARY_PATH=path/to/clang-3.9/lib # for macOS ``` -Additionally, you may want to build and test with the `docs_` feature to ensure -that you aren't forgetting to document types and functions. CI will catch it if -you forget, but the turn around will be a lot slower ;) +Additionally, you may want to build and test with the `testing_only_docs` +feature to ensure that you aren't forgetting to document types and functions. CI +will catch it if you forget, but the turn around will be a lot slower ;) ``` -$ cargo build --features docs_ +$ cargo build --features testing_only_docs ``` ## Testing @@ -94,6 +94,17 @@ Run `cargo test` to compare generated Rust bindings to the expectations. $ cargo test [--all-features] ``` +### Running a Single Test + +To generate bindings for a single test header, compile the bindings, and run the +layout assertion tests for those bindings, use the `tests/test-one.sh` +script. It supports fuzzy searching for test headers. For example, to test +`tests/headers/what_is_going_on.hpp`, execute this command: + +``` +$ ./tests/test-one.sh going +``` + ### Authoring New Tests To add a new test header to the suite, simply put it in the `tests/headers` @@ -113,27 +124,6 @@ Then verify the new Rust bindings compile and pass some basic tests: $ cargo test -p tests_expectations ``` -## Generating Graphviz Dot Files - -We have a special thing which will help you debug your codegen context if something -will go wrong. It will generate a [`graphviz`](http://graphviz.org/pdf/dotguide.pdf) -dot file and then you can create a PNG from it with `graphviz` tool in your OS. - -Here is an example how it could be done: - -``` -$ cargo run -- example.hpp --emit-ir-graphviz output.dot -``` - -It will generate your graphviz dot file and then you will need tog -create a PNG from it with `graphviz`. - -Something like this: - -``` -$ dot -Tpng output.dot -o output.png -``` - ## Automatic code formatting We use [`rustfmt`](https://github.com/rust-lang-nursery/rustfmt) to enforce a @@ -157,6 +147,37 @@ $ cargo fmt The code style is described in the `rustfmt.toml` file in top level of the repo. +## Generating Graphviz Dot Files + +We can generate [Graphviz](http://graphviz.org/pdf/dotguide.pdf) dot files from +our internal representation of a C/C++ input header, and then you can create a +PNG or PDF from it with Graphviz's `dot` program. This is very useful when +debugging bindgen! + +First, make sure you have Graphviz and `dot` installed: + +``` +$ brew install graphviz # OS X +$ sudo dnf install graphviz # Fedora +$ # Etc... +``` + +Then, use the `--emit-ir-graphviz` flag to generate a `dot` file from our IR: + +``` +$ cargo run -- example.hpp --emit-ir-graphviz output.dot +``` + +Finally, convert the `dot` file to an image: + +``` +$ dot -Tpng output.dot -o output.png +``` + +The final result will look something like this: + +[![An example graphviz rendering of our IR](./example-graphviz-ir.png)](./example-graphviz-ir.png) + ## Debug Logging To help debug what `bindgen` is doing, you can define the environment variable diff --git a/third_party/rust/bindgen/Cargo.toml b/third_party/rust/bindgen/Cargo.toml index a9521be50780..5dd3c9e446ca 100644 --- a/third_party/rust/bindgen/Cargo.toml +++ b/third_party/rust/bindgen/Cargo.toml @@ -13,10 +13,14 @@ name = "bindgen" readme = "README.md" repository = "https://github.com/servo/rust-bindgen" documentation = "https://docs.rs/bindgen" -version = "0.22.0" +version = "0.24.0" build = "build.rs" -exclude = ["tests/headers", "tests/expectations", "bindgen-integration", "ci"] +exclude = [ + "bindgen-integration", + "ci", + "tests/**", +] [badges] travis-ci = { repository = "servo/rust-bindgen" } @@ -27,6 +31,7 @@ path = "src/lib.rs" [[bin]] name = "bindgen" path = "src/main.rs" +doc = false [dev-dependencies] diff = "0.1" @@ -34,22 +39,21 @@ clap = "2" shlex = "0.1" [build-dependencies] -quasi_codegen = "0.29" +quasi_codegen = "0.32" [dependencies] cexpr = "0.2" cfg-if = "0.1.0" -clang-sys = { version = "0.14", features = ["runtime", "clang_3_9"] } +clang-sys = { version = "0.16.0", features = ["runtime", "clang_3_9"] } lazy_static = "0.2.1" -rustc-serialize = "0.3.19" -syntex_syntax = "0.54" +syntex_syntax = "0.58" regex = "0.2" # This kinda sucks: https://github.com/rust-lang/cargo/issues/1982 clap = "2" [dependencies.aster] features = ["with-syntex"] -version = "0.38" +version = "0.41" [dependencies.env_logger] optional = true @@ -61,13 +65,15 @@ version = "0.3" [dependencies.quasi] features = ["with-syntex"] -version = "0.29" +version = "0.32" [features] -assert_no_dangling_items = [] default = ["logging"] -testing_only_llvm_stable = [] logging = ["env_logger", "log"] static = [] -# This feature only exists for CI -- don't use it! -docs_ = [] + +# These features only exist for CI testing -- don't use them if you're not hacking +# on bindgen! +testing_only_docs = [] +testing_only_extra_assertions = [] +testing_only_llvm_stable = [] diff --git a/third_party/rust/bindgen/README.md b/third_party/rust/bindgen/README.md index f1a85cecb72b..055ac7a7f79b 100644 --- a/third_party/rust/bindgen/README.md +++ b/third_party/rust/bindgen/README.md @@ -1,227 +1,45 @@ # `bindgen` -Automatically generates Rust FFI bindings to C and C++ libraries. +**`bindgen` automatically generates Rust FFI bindings to C and C++ libraries.** - - +For example, given the C header `cool.h`: +```c +typedef struct CoolStruct { + int x; + int y; +} CoolStruct; -- [Usage](#usage) - - [Requirements](#requirements) - - [Installing Clang 3.9](#installing-clang-39) - - [Windows](#windows) - - [OSX](#osx) - - [Debian-based Linuxes](#debian-based-linuxes) - - [Arch](#arch) - - [From source](#from-source) - - [Library usage with `build.rs`](#library-usage-with-buildrs) - - [`build.rs` Tutorial](#buildrs-tutorial) - - [Simple Example: `./bindgen-integration`](#simple-example-bindgen-integration) - - [Real World Example: Stylo](#real-world-example-stylo) - - [Command Line Usage](#command-line-usage) - - [C++](#c) - - [Annotations](#annotations) - - [`opaque`](#opaque) - - [`hide`](#hide) - - [`replaces`](#replaces) - - [`nocopy`](#nocopy) - - - -## Usage - -### Requirements - -It is recommended to use Clang 3.9 or greater, however `bindgen` can run with -older Clangs with some features disabled. - -#### Installing Clang 3.9 - -##### Windows - -Download and install the official pre-built binary from -[LLVM download page](http://releases.llvm.org/download.html). - -##### OSX - -If you use Homebrew: - -``` -$ brew install llvm +void cool_function(int i, char c, CoolStruct* cs); ``` -If you use MacPorts: - -``` -$ port install clang-3.9 -``` - -##### Debian-based Linuxes - -``` -# apt-get install llvm-3.9-dev libclang-3.9-dev -``` - -Ubuntu 16.10 provides the necessary packages directly. If you are using older -version of Ubuntu or other Debian-based distros, you may need to add the LLVM -repos to get version 3.9. See http://apt.llvm.org/. - -##### Arch - -``` -# pacman -S clang -``` - -##### From source - -If your package manager doesn't yet offer Clang 3.9, you'll need to build from -source. For that, follow the instructions -[here](http://clang.llvm.org/get_started.html). - -Those instructions list optional steps. For bindgen: - -* Checkout and build clang -* Checkout and build the extra-clang-tools -* Checkout and build the compiler-rt -* You do not need to checkout or build libcxx - -### Library usage with `build.rs` - -💡 This is the recommended way to use `bindgen`. 💡 - -#### `build.rs` Tutorial - -[Here is a step-by-step tutorial for generating FFI bindings to the `bzip2` C library.][tutorial] - -[tutorial]: http://fitzgeraldnick.com/2016/12/14/using-libbindgen-in-build-rs.html - -#### Simple Example: `./bindgen-integration` - -The [`./bindgen-integration`][integration] directory has an example crate that -generates FFI bindings in `build.rs` and can be used a template for new -projects. - -[integration]: ./bindgen-integration - -#### Real World Example: Stylo - -A real world example is [the Stylo build script][stylo-script] used for -integrating Servo's layout system into Gecko. - -[stylo-script]: https://github.com/servo/servo/blob/master/components/style/build_gecko.rs - -In `Cargo.toml`: - -```toml -[package] -# ... -build = "build.rs" - -[build-dependencies] -bindgen = "0.20" -``` - -In `build.rs`: +`bindgen` produces Rust FFI code allowing you to call into the `cool` library's +functions and use its types: ```rust -extern crate bindgen; +/* automatically generated by rust-bindgen */ -use std::env; -use std::path::Path; +#[repr(C)] +pub struct CoolStruct { + pub x: ::std::os::raw::c_int, + pub y: ::std::os::raw::c_int, +} -fn main() { - let out_dir = env::var("OUT_DIR").unwrap(); - let _ = bindgen::builder() - .header("example.h") - .use_core() - .generate().unwrap() - .write_to_file(Path::new(&out_dir).join("example.rs")); +extern "C" { + pub fn cool_function(i: ::std::os::raw::c_int, + c: ::std::os::raw::c_char, + cs: *mut CoolStruct); } ``` -In `src/main.rs`: +## Users Guide -```rust -include!(concat!(env!("OUT_DIR"), "/example.rs")); -``` +[📚 Read the `bindgen` users guide here! 📚](https://servo.github.io/rust-bindgen) -### Command Line Usage +## API Reference -``` -$ cargo install bindgen -``` +[API reference documentation is on docs.rs](https://docs.rs/bindgen) -There are a few options documented when running `bindgen --help`. Bindgen is installed to `~/.cargo/bin`. You have to add that directory to your path to use `bindgen`. +## Contributing -### C++ - -`bindgen` can handle most C++ features, but not all of them (C++ is hard!) - -Notable C++ features that are unsupported or only partially supported: - -* Partial template specialization -* Traits templates -* SFINAE -* Instantiating new template specializations - -When passing in header files, the file will automatically be treated as C++ if -it ends in ``.hpp``. If it doesn't, ``-x c++`` can be used to force C++ mode. - -You must use whitelisting when working with C++ to avoid pulling in all of the -`std::*` types, some of which `bindgen` cannot handle. Additionally, you may -want to blacklist other types that `bindgen` stumbles on, or make `bindgen` -treat certain types as opaque. - -### Annotations - -The translation of classes, structs, enums, and typedefs can be adjusted using -annotations. Annotations are specifically formatted html tags inside doxygen -style comments. - -#### `opaque` - -The `opaque` annotation instructs bindgen to ignore all fields defined in -a struct/class. - -```cpp -///
-``` - -#### `hide` - -The `hide` annotation instructs bindgen to ignore the struct/class/field/enum -completely. - -```cpp -///
-``` - -#### `replaces` - -The `replaces` annotation can be used to use a type as a replacement for other -(presumably more complex) type. This is used in Stylo to generate bindings for -structures that for multiple reasons are too complex for bindgen to understand. - -For example, in a C++ header: - -```cpp -/** - *
- */ -template -class nsTArray_Simple { - T* mBuffer; -public: - // The existence of a destructor here prevents bindgen from deriving the Clone - // trait via a simple memory copy. - ~nsTArray_Simple() {}; -}; -``` - -That way, after code generation, the bindings for the `nsTArray` type are -the ones that would be generated for `nsTArray_Simple`. - -#### `nocopy` - -The `nocopy` annotation is used to prevent bindgen to autoderive the `Copy` -and `Clone` traits for a type. +[See `CONTRIBUTING.md` for hacking on `bindgen`!](./CONTRIBUTING.md) diff --git a/third_party/rust/bindgen/book/.gitignore b/third_party/rust/bindgen/book/.gitignore new file mode 100644 index 000000000000..7585238efedf --- /dev/null +++ b/third_party/rust/bindgen/book/.gitignore @@ -0,0 +1 @@ +book diff --git a/third_party/rust/bindgen/book/book.toml b/third_party/rust/bindgen/book/book.toml new file mode 100644 index 000000000000..e94e304621b5 --- /dev/null +++ b/third_party/rust/bindgen/book/book.toml @@ -0,0 +1,3 @@ +title = "The `bindgen` User Guide" +author = "The Servo project developers" +description = "`bindgen` automatically generates Rust FFI bindings to C and C++ libraries." diff --git a/third_party/rust/bindgen/book/src/SUMMARY.md b/third_party/rust/bindgen/book/src/SUMMARY.md new file mode 100644 index 000000000000..1a1818f804bc --- /dev/null +++ b/third_party/rust/bindgen/book/src/SUMMARY.md @@ -0,0 +1,20 @@ +# Summary + +- [Introduction](./introduction.md) +- [Requirements](./requirements.md) +- [Library Usage with `build.rs`](./library-usage.md) + - [Tutorial](./tutorial-0.md) + - [Add `bindgen` as a Build Dependency](./tutorial-1.md) + - [Create a `wrapper.h` Header](./tutorial-2.md) + - [Create a `build.rs` File](./tutorial-3.md) + - [Include the Generated Bindings in `src/lib.rs`](./tutorial-4.md) + - [Write a Sanity Test](./tutorial-5.md) + - [Publish Your Crate!](./tutorial-6.md) +- [Command Line Usage](./command-line-usage.md) +- [Customizing the Generated Bindings](./customizing-generated-bindings.md) + - [Whitelisting](./whitelisting.md) + - [Blacklisting](./blacklisting.md) + - [Treating a Type as an Opaque Blob of Bytes](./opaque.md) + - [Replacing One Type with Another](./replacing-types.md) + - [Preventing the Derivation of `Copy` and `Clone`](./nocopy.md) +- [Generating Bindings to C++](./cpp.md) diff --git a/third_party/rust/bindgen/book/src/blacklisting.md b/third_party/rust/bindgen/book/src/blacklisting.md new file mode 100644 index 000000000000..990947abaf3d --- /dev/null +++ b/third_party/rust/bindgen/book/src/blacklisting.md @@ -0,0 +1,26 @@ +# Blacklisting + +If you need to provide your own custom translation of some type (for example, +because you need to wrap one of its fields in an `UnsafeCell`), you can +explicitly blacklist generation of its definition. Uses of the blacklisted type +will still appear in other types' definitions. (If you don't want the type to +appear in the bindings at +all, [make it opaque](./opaque.html) instead of +blacklisting it.) + +### Library + +* [`bindgen::Builder::hide_type`](https://docs.rs/bindgen/0.23.1/bindgen/struct.Builder.html#method.hide_type) + +### Command Line + +* `--blacklist-type ` + +### Annotations + +```cpp +///
+class Foo { + // ... +}; +``` diff --git a/third_party/rust/bindgen/book/src/chapter_1.md b/third_party/rust/bindgen/book/src/chapter_1.md new file mode 100644 index 000000000000..b743fda35469 --- /dev/null +++ b/third_party/rust/bindgen/book/src/chapter_1.md @@ -0,0 +1 @@ +# Chapter 1 diff --git a/third_party/rust/bindgen/book/src/command-line-usage.md b/third_party/rust/bindgen/book/src/command-line-usage.md new file mode 100644 index 000000000000..d90eb442b874 --- /dev/null +++ b/third_party/rust/bindgen/book/src/command-line-usage.md @@ -0,0 +1,27 @@ +# Command Line Usage + +Install the `bindgen` executable with `cargo`: + +```bash +$ cargo install bindgen +``` + +The `bindgen` executable is installed to `~/.cargo/bin`. You have to add that +directory to your `$PATH` to use `bindgen`. + +`bindgen` takes the path to an input C or C++ header file, and optionally an +output file path for the generated bindings. If the output file path is not +supplied, the bindings are printed to `stdout`. + +If we wanted to generated Rust FFI bindings from a C header named `input.h` and +put them in the `bindings.rs` file, we would invoke `bindgen` like this: + +```bash +$ bindgen input.h -o bindings.rs +``` + +For more details, pass the `--help` flag: + +```bash +$ bindgen --help +``` diff --git a/third_party/rust/bindgen/book/src/cpp.md b/third_party/rust/bindgen/book/src/cpp.md new file mode 100644 index 000000000000..e0fbecb7526a --- /dev/null +++ b/third_party/rust/bindgen/book/src/cpp.md @@ -0,0 +1,27 @@ +# Generating Bindings to C++ + +`bindgen` can handle a surprising number of C++ features, but not all of +them. When `bindgen` can't translate some C++ construct into Rust, it usually +comes down to one of two things: + +1. Rust has no equivalent language feature +2. C++ is *hard!* + +Notable C++ features that are unsupported or only partially supported, and for +which `bindgen` *should* generate opaque blobs whenever it finds an occurrence +of them in a type it is generating bindings for: + +* Template specialization +* Partial template specialization +* Traits templates +* SFINAE + +When passing in header files, the file will automatically be treated as C++ if +it ends in `.hpp`. If it doesn't, adding `-x=c++` clang args can be used to +force C++ mode. You probably also want to use `-std=c++14` or similar clang args +as well. + +You pretty much **must** use [whitelisting](./whitelisting.html) when working +with C++ to avoid pulling in all of the `std::*` types, many of which `bindgen` +cannot handle. Additionally, you may want to mark other types +as [opaque](./opaque.html) that `bindgen` stumbles on. diff --git a/third_party/rust/bindgen/book/src/customizing-generated-bindings.md b/third_party/rust/bindgen/book/src/customizing-generated-bindings.md new file mode 100644 index 000000000000..aaaaebea6a81 --- /dev/null +++ b/third_party/rust/bindgen/book/src/customizing-generated-bindings.md @@ -0,0 +1,28 @@ +# Customizing the Generated Bindings + +The translation of classes, structs, enums, and typedefs can be adjusted in a +few ways: + +1. By using the `bindgen::Builder`'s configuration methods, when using `bindgen` + as a library. + +2. By passing extra flags and options to the `bindgen` executable. + +3. By adding an annotation comment to the C/C++ source code. Annotations are + specially formatted HTML tags inside doxygen style comments: + + * For single line comments: + ```c + ///
+ ``` + + * For multi-line comments: + ```c + /** + *
+ */ + ``` + +We'll leave the nitty-gritty details to +the [docs.rs API reference](https://docs.rs/bindgen) and `bindgen --help`, but +provide higher level concept documentation here. diff --git a/third_party/rust/bindgen/book/src/introduction.md b/third_party/rust/bindgen/book/src/introduction.md new file mode 100644 index 000000000000..4c5fbd49accf --- /dev/null +++ b/third_party/rust/bindgen/book/src/introduction.md @@ -0,0 +1,34 @@ +# Introduction + +**[`bindgen`](https://github.com/servo/rust-bindgen) automatically generates Rust +FFI bindings to C and C++ libraries.** + +For example, given the C header `cool.h`: + +```c +typedef struct CoolStruct { + int x; + int y; +} CoolStruct; + +void cool_function(int i, char c, CoolStruct* cs); +``` + +`bindgen` produces Rust FFI code allowing you to call into the `cool` library's +functions and use its types: + +```rust +/* automatically generated by rust-bindgen */ + +#[repr(C)] +pub struct CoolStruct { + pub x: ::std::os::raw::c_int, + pub y: ::std::os::raw::c_int, +} + +extern "C" { + pub fn cool_function(i: ::std::os::raw::c_int, + c: ::std::os::raw::c_char, + cs: *mut CoolStruct); +} +``` diff --git a/third_party/rust/bindgen/book/src/library-usage.md b/third_party/rust/bindgen/book/src/library-usage.md new file mode 100644 index 000000000000..35b53fe437c2 --- /dev/null +++ b/third_party/rust/bindgen/book/src/library-usage.md @@ -0,0 +1,22 @@ +# Library Usage with `build.rs` + +💡 This is the recommended way to use `bindgen`. 💡 + +Often times C and C++ headers will have platform- and architecture-specific +`#ifdef`s that affect the shape of the Rust FFI bindings we need to create to +interface Rust code with the outside world. By using `bindgen` as a library +inside your `build.rs`, you can generate bindings for the current target +on-the-fly. Otherwise, you would need to generate and maintain +`x86_64-unknown-linux-gnu-bindings.rs`, `x86_64-apple-darwin-bindings.rs`, +etc... separate bindings files for each of your supported targets, which can be +a huge pain. The downside is that everyone building your crate also needs +`libclang` available to run `bindgen`. + +## Library API Documentation + +[📚 There is complete API reference documentation on docs.rs 📚](https://docs.rs/bindgen) + +## Tutorial + +The next section contains a detailed, step-by-step tutorial for using `bindgen` +as a library inside `build.rs`. diff --git a/third_party/rust/bindgen/book/src/nocopy.md b/third_party/rust/bindgen/book/src/nocopy.md new file mode 100644 index 000000000000..893f0932b641 --- /dev/null +++ b/third_party/rust/bindgen/book/src/nocopy.md @@ -0,0 +1,20 @@ +# Preventing the Derivation of `Copy` and `Clone` + +`bindgen` will attempt to derive the `Copy` and `Clone` traits on a best-effort +basis. Sometimes, it might not understand that although adding `#[derive(Copy, +Clone)]` to a translated type definition will compile, it still shouldn't do +that for reasons it can't know. In these cases, the `nocopy` annotation can be +used to prevent bindgen to autoderive the `Copy` and `Clone` traits for a type. + +```c +/** + * Although bindgen can't know, this struct is not safe to move because pthread + * mutexes can't move in memory! + * + *
+ */ +struct MyMutexWrapper { + pthread_mutex_t raw; + // ... +}; +``` diff --git a/third_party/rust/bindgen/book/src/opaque.md b/third_party/rust/bindgen/book/src/opaque.md new file mode 100644 index 000000000000..e1bf600cecc5 --- /dev/null +++ b/third_party/rust/bindgen/book/src/opaque.md @@ -0,0 +1,26 @@ +# Treating a Type as an Opaque Blob of Bytes + +Sometimes a type definition is simply not translatable to Rust, for example it +uses +[C++'s SFINAE](https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error) for +which Rust has no equivalent. In these cases, it is best to treat all +occurrences of the type as an opaque blob of bytes with a size and +alignment. `bindgen` will attempt to detect such cases and do this +automatically, but other times it needs some explicit help from you. + +### Library + +* [`bindgen::Builder::opaque_type`](https://docs.rs/bindgen/0.23.1/bindgen/struct.Builder.html#method.opaque_type) + +### Command Line + +* `--opaque-type ` + +### Annotation + +```cpp +///
+class Foo { + // ... +}; +``` diff --git a/third_party/rust/bindgen/book/src/replacing-types.md b/third_party/rust/bindgen/book/src/replacing-types.md new file mode 100644 index 000000000000..7426d2ea558a --- /dev/null +++ b/third_party/rust/bindgen/book/src/replacing-types.md @@ -0,0 +1,27 @@ +# Replacing One Type with Another + +The `replaces` annotation can be used to use a type as a replacement for other +(presumably more complex) type. This is used in Stylo to generate bindings for +structures that for multiple reasons are too complex for bindgen to understand. + +For example, in a C++ header: + +```cpp +/** + *
+ */ +template +class nsTArray_Simple { + T* mBuffer; +public: + // The existence of a destructor here prevents bindgen from deriving the Clone + // trait via a simple memory copy. + ~nsTArray_Simple() {}; +}; +``` + +That way, after code generation, the bindings for the `nsTArray` type are +the ones that would be generated for `nsTArray_Simple`. + +Replacing is only available as an annotation. To replace a C or C++ definition +with a Rust definition, use [blacklisting](./blacklisting.html). diff --git a/third_party/rust/bindgen/book/src/requirements.md b/third_party/rust/bindgen/book/src/requirements.md new file mode 100644 index 000000000000..82da9991443c --- /dev/null +++ b/third_party/rust/bindgen/book/src/requirements.md @@ -0,0 +1,67 @@ +# Requirements + +This page lists the requirements for running `bindgen` and how to get them. + +## Clang + +`bindgen` leverages `libclang` to preprocess, parse, and type check C and C++ +header files. + +It is recommended to use Clang 3.9 or greater, however `bindgen` can run with +older Clangs with some features disabled. + +* **If you are generating bindings to C,** 3.7 and 3.8 will probably work OK for +you. + +* **If you are generating bindings to C++,** you almost definitely want 3.9 or +greater. + +### Installing Clang 3.9 + +#### Windows + +Download and install the official pre-built binary from +[LLVM download page](http://releases.llvm.org/download.html). + +#### macOS + +If you use Homebrew: + +```bash +$ brew install llvm@3.9 +``` + +If you use MacPorts: + +```bash +$ port install clang-3.9 +``` + +#### Debian-based Linuxes + +```bash +# apt-get install llvm-3.9-dev libclang-3.9-dev clang-3.9 +``` + +Ubuntu 16.10 provides the necessary packages directly. If you are using older +version of Ubuntu or other Debian-based distros, you may need to add the LLVM +repos to get version 3.9. See http://apt.llvm.org/. + +#### Arch + +```bash +# pacman -S clang +``` + +#### From source + +If your package manager doesn't yet offer Clang 3.9, you'll need to build from +source. For that, follow the +instructions [here](http://clang.llvm.org/get_started.html). + +Those instructions list optional steps. For `bindgen`: + +* Checkout and build clang +* Checkout and build the extra-clang-tools +* You do not need to checkout or build compiler-rt +* You do not need to checkout or build libcxx diff --git a/third_party/rust/bindgen/book/src/tutorial-0.md b/third_party/rust/bindgen/book/src/tutorial-0.md new file mode 100644 index 000000000000..adb843082063 --- /dev/null +++ b/third_party/rust/bindgen/book/src/tutorial-0.md @@ -0,0 +1,12 @@ +# Tutorial + +The following tutorial is adapted from [this blog post][tutorial]. + +What follows is a whirlwind introductory tutorial to using `bindgen` from inside +`build.rs`. We'll generate bindings to `bzip2` (which is available on most +systems) on-the-fly. + +[**TL;DR?** The full tutorial code is available here.][example] + +[tutorial]: http://fitzgeraldnick.com/2016/12/14/using-libbindgen-in-build-rs.html +[example]: https://github.com/fitzgen/libbindgen-tutorial-bzip2-sys diff --git a/third_party/rust/bindgen/book/src/tutorial-1.md b/third_party/rust/bindgen/book/src/tutorial-1.md new file mode 100644 index 000000000000..1b109506166a --- /dev/null +++ b/third_party/rust/bindgen/book/src/tutorial-1.md @@ -0,0 +1,9 @@ +# Add `bindgen` as a Build Dependency + +Declare a build-time dependency on `bindgen` by adding it to the +`[build-dependencies]` section of our crate's `Cargo.toml` metadata file: + +```toml +[build-dependencies] +bindgen = "0.23" +``` diff --git a/third_party/rust/bindgen/book/src/tutorial-2.md b/third_party/rust/bindgen/book/src/tutorial-2.md new file mode 100644 index 000000000000..e1e88811b01d --- /dev/null +++ b/third_party/rust/bindgen/book/src/tutorial-2.md @@ -0,0 +1,20 @@ +# Create a `wrapper.h` Header + +The `wrapper.h` file will include all the various headers containing +declarations of structs and functions we would like bindings for. In the +particular case of `bzip2`, this is pretty easy since the entire public API is +contained in a single header. For a project like [SpiderMonkey][spidermonkey], +where the public API is split across multiple header files and grouped by +functionality, we'd want to include all those headers we want to bind to in this +single `wrapper.h` entry point for `bindgen`. + +Here is our `wrapper.h`: + +```c +#include +``` + +This is also where we would add any [replacement types](./replacing-types.html), +if we were using some. + +[spidermonkey]: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/How_to_embed_the_JavaScript_engine diff --git a/third_party/rust/bindgen/book/src/tutorial-3.md b/third_party/rust/bindgen/book/src/tutorial-3.md new file mode 100644 index 000000000000..7c081a4d3dfd --- /dev/null +++ b/third_party/rust/bindgen/book/src/tutorial-3.md @@ -0,0 +1,58 @@ +# Create a `build.rs` File + +First, we have to tell `cargo` that we have a `build.rs` script by adding +another line to the `Cargo.toml`: + +```toml +[package] +build = "build.rs" +``` + +Second, we create the `build.rs` file in our crate's root. This file is compiled +and executed before the rest of the crate is built, and can be used to generate +code at compile time. And of course in our case, we will be generating Rust FFI +bindings to `bzip2` at compile time. The resulting bindings will be written to +`$OUT_DIR/bindings.rs` where `$OUT_DIR` is chosen by `cargo` and is something +like `./target/debug/build/libbindgen-tutorial-bzip2-sys-afc7747d7eafd720/out/`. + +```rust,ignore +extern crate bindgen; + +use std::env; +use std::path::PathBuf; + +fn main() { + // Tell cargo to tell rustc to link the system bzip2 + // shared library. + println!("cargo:rustc-link-lib=bz2"); + + // The bindgen::Builder is the main entry point + // to bindgen, and lets you build up options for + // the resulting bindings. + let bindings = bindgen::Builder::default() + // Do not generate unstable Rust code that + // requires a nightly rustc and enabling + // unstable features. + .no_unstable_rust() + // The input header we would like to generate + // bindings for. + .header("wrapper.h") + // Finish the builder and generate the bindings. + .generate() + // Unwrap the Result and panic on failure. + .expect("Unable to generate bindings"); + + // Write the bindings to the $OUT_DIR/bindings.rs file. + let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); + bindings + .write_to_file(out_path.join("bindings.rs")) + .expect("Couldn't write bindings!"); +} +``` + +Now, when we run `cargo build`, our bindings to `bzip2` are generated on the +fly! + +[There's more info about `build.rs` files in the crates.io documentation.][build-rs] + +[build-rs]: http://doc.crates.io/build-script.html diff --git a/third_party/rust/bindgen/book/src/tutorial-4.md b/third_party/rust/bindgen/book/src/tutorial-4.md new file mode 100644 index 000000000000..42aa92fd0019 --- /dev/null +++ b/third_party/rust/bindgen/book/src/tutorial-4.md @@ -0,0 +1,57 @@ +# Include the Generated Bindings in `src/lib.rs` + +We can use the `include!` macro to dump our generated bindings right into our +crate's main entry point, `src/lib.rs`: + +```rust,ignore +#![allow(non_upper_case_globals)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] + +include!(concat!(env!("OUT_DIR"), "/bindings.rs")); +``` + +Because `bzip2`'s symbols do not follow Rust's style conventions, we suppress a +bunch of warnings with a few `#![allow(...)]` pragmas. + +We can run `cargo build` again to check that the bindings themselves compile: + +```bash +$ cargo build + Compiling libbindgen-tutorial-bzip2-sys v0.1.0 + Finished debug [unoptimized + debuginfo] target(s) in 62.8 secs +``` + +And we can run `cargo test` to verify that the layout, size, and alignment of +our generated Rust FFI structs match what `bindgen` thinks they should be: + +```bash +$ cargo test + Compiling libbindgen-tutorial-bzip2-sys v0.1.0 + Finished debug [unoptimized + debuginfo] target(s) in 0.0 secs + Running target/debug/deps/bzip2_sys-10413fc2af207810 + +running 14 tests +test bindgen_test_layout___darwin_pthread_handler_rec ... ok +test bindgen_test_layout___sFILE ... ok +test bindgen_test_layout___sbuf ... ok +test bindgen_test_layout__bindgen_ty_1 ... ok +test bindgen_test_layout__bindgen_ty_2 ... ok +test bindgen_test_layout__opaque_pthread_attr_t ... ok +test bindgen_test_layout__opaque_pthread_cond_t ... ok +test bindgen_test_layout__opaque_pthread_mutex_t ... ok +test bindgen_test_layout__opaque_pthread_condattr_t ... ok +test bindgen_test_layout__opaque_pthread_mutexattr_t ... ok +test bindgen_test_layout__opaque_pthread_once_t ... ok +test bindgen_test_layout__opaque_pthread_rwlock_t ... ok +test bindgen_test_layout__opaque_pthread_rwlockattr_t ... ok +test bindgen_test_layout__opaque_pthread_t ... ok + +test result: ok. 14 passed; 0 failed; 0 ignored; 0 measured + + Doc-tests libbindgen-tutorial-bzip2-sys + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured +``` diff --git a/third_party/rust/bindgen/book/src/tutorial-5.md b/third_party/rust/bindgen/book/src/tutorial-5.md new file mode 100644 index 000000000000..7ff5ffb920e7 --- /dev/null +++ b/third_party/rust/bindgen/book/src/tutorial-5.md @@ -0,0 +1,169 @@ +# Write a Sanity Test + +Finally, to tie everything together, let's write a sanity test that round trips +some text through compression and decompression, and then asserts that it came +back out the same as it went in. This is a little wordy using the raw FFI +bindings, but hopefully we wouldn't usually ask people to do this, we'd provide +a nice Rust-y API on top of the raw FFI bindings for them. However, since this +is for testing the bindings directly, our sanity test will use the bindings +directly. + +The test data I'm round tripping are some Futurama quotes I got off the internet +and put in the `futurama-quotes.txt` file, which is read into a `&'static str` +at compile time via the `include_str!("../futurama-quotes.txt")` macro +invocation. + +Without further ado, here is the test, which should be appended to the bottom of +our `src/lib.rs` file: + +```rust +#[cfg(test)] +mod tests { + use super::*; + use std::mem; + + #[test] + fn round_trip_compression_decompression() { + unsafe { + let input = include_str!("../futurama-quotes.txt").as_bytes(); + let mut compressed_output: Vec = vec![0; input.len()]; + let mut decompressed_output: Vec = vec![0; input.len()]; + + // Construct a compression stream. + let mut stream: bz_stream = mem::zeroed(); + let result = BZ2_bzCompressInit(&mut stream as *mut _, + 1, // 1 x 100000 block size + 4, // verbosity (4 = most verbose) + 0); // default work factor + match result { + r if r == (BZ_CONFIG_ERROR as _) => panic!("BZ_CONFIG_ERROR"), + r if r == (BZ_PARAM_ERROR as _) => panic!("BZ_PARAM_ERROR"), + r if r == (BZ_MEM_ERROR as _) => panic!("BZ_MEM_ERROR"), + r if r == (BZ_OK as _) => {}, + r => panic!("Unknown return value = {}", r), + } + + // Compress `input` into `compressed_output`. + stream.next_in = input.as_ptr() as *mut _; + stream.avail_in = input.len() as _; + stream.next_out = compressed_output.as_mut_ptr() as *mut _; + stream.avail_out = compressed_output.len() as _; + let result = BZ2_bzCompress(&mut stream as *mut _, BZ_FINISH as _); + match result { + r if r == (BZ_RUN_OK as _) => panic!("BZ_RUN_OK"), + r if r == (BZ_FLUSH_OK as _) => panic!("BZ_FLUSH_OK"), + r if r == (BZ_FINISH_OK as _) => panic!("BZ_FINISH_OK"), + r if r == (BZ_SEQUENCE_ERROR as _) => panic!("BZ_SEQUENCE_ERROR"), + r if r == (BZ_STREAM_END as _) => {}, + r => panic!("Unknown return value = {}", r), + } + + // Finish the compression stream. + let result = BZ2_bzCompressEnd(&mut stream as *mut _); + match result { + r if r == (BZ_PARAM_ERROR as _) => panic!(BZ_PARAM_ERROR), + r if r == (BZ_OK as _) => {}, + r => panic!("Unknown return value = {}", r), + } + + // Construct a decompression stream. + let mut stream: bz_stream = mem::zeroed(); + let result = BZ2_bzDecompressInit(&mut stream as *mut _, + 4, // verbosity (4 = most verbose) + 0); // default small factor + match result { + r if r == (BZ_CONFIG_ERROR as _) => panic!("BZ_CONFIG_ERROR"), + r if r == (BZ_PARAM_ERROR as _) => panic!("BZ_PARAM_ERROR"), + r if r == (BZ_MEM_ERROR as _) => panic!("BZ_MEM_ERROR"), + r if r == (BZ_OK as _) => {}, + r => panic!("Unknown return value = {}", r), + } + + // Decompress `compressed_output` into `decompressed_output`. + stream.next_in = compressed_output.as_ptr() as *mut _; + stream.avail_in = compressed_output.len() as _; + stream.next_out = decompressed_output.as_mut_ptr() as *mut _; + stream.avail_out = decompressed_output.len() as _; + let result = BZ2_bzDecompress(&mut stream as *mut _); + match result { + r if r == (BZ_PARAM_ERROR as _) => panic!("BZ_PARAM_ERROR"), + r if r == (BZ_DATA_ERROR as _) => panic!("BZ_DATA_ERROR"), + r if r == (BZ_DATA_ERROR_MAGIC as _) => panic!("BZ_DATA_ERROR"), + r if r == (BZ_MEM_ERROR as _) => panic!("BZ_MEM_ERROR"), + r if r == (BZ_OK as _) => panic!("BZ_OK"), + r if r == (BZ_STREAM_END as _) => {}, + r => panic!("Unknown return value = {}", r), + } + + // Close the decompression stream. + let result = BZ2_bzDecompressEnd(&mut stream as *mut _); + match result { + r if r == (BZ_PARAM_ERROR as _) => panic!("BZ_PARAM_ERROR"), + r if r == (BZ_OK as _) => {}, + r => panic!("Unknown return value = {}", r), + } + + assert_eq!(input, &decompressed_output[..]); + } + } +} +``` + +Now let's run `cargo test` again and verify that everying is linking and binding +properly! + +```bash +$ cargo test + Compiling libbindgen-tutorial-bzip2-sys v0.1.0 + Finished debug [unoptimized + debuginfo] target(s) in 0.54 secs + Running target/debug/deps/libbindgen_tutorial_bzip2_sys-1c5626bbc4401c3a + +running 15 tests +test bindgen_test_layout___darwin_pthread_handler_rec ... ok +test bindgen_test_layout___sFILE ... ok +test bindgen_test_layout___sbuf ... ok +test bindgen_test_layout__bindgen_ty_1 ... ok +test bindgen_test_layout__bindgen_ty_2 ... ok +test bindgen_test_layout__opaque_pthread_attr_t ... ok +test bindgen_test_layout__opaque_pthread_cond_t ... ok +test bindgen_test_layout__opaque_pthread_condattr_t ... ok +test bindgen_test_layout__opaque_pthread_mutex_t ... ok +test bindgen_test_layout__opaque_pthread_mutexattr_t ... ok +test bindgen_test_layout__opaque_pthread_once_t ... ok +test bindgen_test_layout__opaque_pthread_rwlock_t ... ok +test bindgen_test_layout__opaque_pthread_rwlockattr_t ... ok +test bindgen_test_layout__opaque_pthread_t ... ok + block 1: crc = 0x47bfca17, combined CRC = 0x47bfca17, size = 2857 + bucket sorting ... + depth 1 has 2849 unresolved strings + depth 2 has 2702 unresolved strings + depth 4 has 1508 unresolved strings + depth 8 has 538 unresolved strings + depth 16 has 148 unresolved strings + depth 32 has 0 unresolved strings + reconstructing block ... + 2857 in block, 2221 after MTF & 1-2 coding, 61+2 syms in use + initial group 5, [0 .. 1], has 570 syms (25.7%) + initial group 4, [2 .. 2], has 256 syms (11.5%) + initial group 3, [3 .. 6], has 554 syms (24.9%) + initial group 2, [7 .. 12], has 372 syms (16.7%) + initial group 1, [13 .. 62], has 469 syms (21.1%) + pass 1: size is 2743, grp uses are 13 6 15 0 11 + pass 2: size is 1216, grp uses are 13 7 15 0 10 + pass 3: size is 1214, grp uses are 13 8 14 0 10 + pass 4: size is 1213, grp uses are 13 9 13 0 10 + bytes: mapping 19, selectors 17, code lengths 79, codes 1213 + final combined CRC = 0x47bfca17 + + [1: huff+mtf rt+rld {0x47bfca17, 0x47bfca17}] + combined CRCs: stored = 0x47bfca17, computed = 0x47bfca17 +test tests::round_trip_compression_decompression ... ok + +test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured + + Doc-tests libbindgen-tutorial-bzip2-sys + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured +``` diff --git a/third_party/rust/bindgen/book/src/tutorial-6.md b/third_party/rust/bindgen/book/src/tutorial-6.md new file mode 100644 index 000000000000..366be42140ca --- /dev/null +++ b/third_party/rust/bindgen/book/src/tutorial-6.md @@ -0,0 +1,13 @@ +# Publish Your Crate! + +That's it! Now we can publish our crate on crates.io and we can write a nice, +Rust-y API wrapping the raw FFI bindings in a safe interface. However, there is +already a [`bzip2-sys`][bz-sys] crate providing raw FFI bindings, and there is +already a [`bzip2`][bz] crate providing a nice, safe, Rust-y API on top of the +bindings, so we have nothing left to do here! + +Check out the [full code on Github!][example] + +[bz-sys]: https://crates.io/crates/bzip2-sys +[bz]: https://crates.io/crates/bzip2 +[example]: https://github.com/fitzgen/libbindgen-tutorial-bzip2-sys diff --git a/third_party/rust/bindgen/book/src/whitelisting.md b/third_party/rust/bindgen/book/src/whitelisting.md new file mode 100644 index 000000000000..1b3eeaf65716 --- /dev/null +++ b/third_party/rust/bindgen/book/src/whitelisting.md @@ -0,0 +1,31 @@ +# Whitelisting + +Whitelisting allows us to be precise about which type, function, and global +variable definitions `bindgen` generates bindings for. By default, if we don't +specify any whitelisting rules, everything is considered whitelisted. This may +not be desirable because of either + +* the generated bindings contain a lot of extra defintions we don't plan on using, or +* the header file contains C++ features for which Rust does not have a + corresponding form (such as partial template specialization), and we would + like to avoid these definitions + +If we specify whitelisting rules, then `bindgen` will only generate bindings to +types, functions, and global variables that match the whitelisting rules, or are +transitively used by a definition that matches them. + +### Library + +* [`bindgen::Builder::whitelisted_type`](https://docs.rs/bindgen/0.23.1/bindgen/struct.Builder.html#method.whitelisted_type) +* [`bindgen::Builder::whitelisted_function`](https://docs.rs/bindgen/0.23.1/bindgen/struct.Builder.html#method.whitelisted_function) +* [`bindgen::Builder::whitelisted_var`](https://docs.rs/bindgen/0.23.1/bindgen/struct.Builder.html#method.whitelisted_function) + +### Command Line + +* `--whitelist-type ` +* `--whitelist-function ` +* `--whitelist-var ` + +### Annotations + +None. diff --git a/third_party/rust/bindgen/build.rs b/third_party/rust/bindgen/build.rs index 4e99c77949fb..bda91e28ac6f 100644 --- a/third_party/rust/bindgen/build.rs +++ b/third_party/rust/bindgen/build.rs @@ -10,6 +10,7 @@ mod codegen { quasi_codegen::expand(&src, &dst).unwrap(); println!("cargo:rerun-if-changed=src/codegen/mod.rs"); + println!("cargo:rerun-if-changed=src/codegen/error.rs"); println!("cargo:rerun-if-changed=src/codegen/helpers.rs"); println!("cargo:rerun-if-changed=src/codegen/struct_layout.rs"); } @@ -27,13 +28,19 @@ mod testgen { let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); let mut dst = File::create(Path::new(&out_dir).join("tests.rs")).unwrap(); - println!("cargo:rerun-if-changed=tests/headers"); let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()); let headers_dir = manifest_dir.join("tests").join("headers"); - let entries = fs::read_dir(headers_dir) - .expect("Couldn't read headers dir") - .map(|result| result.expect("Couldn't read header file")); + let headers = match fs::read_dir(headers_dir) { + Ok(dir) => dir, + // We may not have headers directory after packaging. + Err(..) => return, + }; + + let entries = + headers.map(|result| result.expect("Couldn't read header file")); + + println!("cargo:rerun-if-changed=tests/headers"); for entry in entries { match entry.path().extension().and_then(OsStr::to_str) { diff --git a/third_party/rust/bindgen/ci/assert-docs.sh b/third_party/rust/bindgen/ci/assert-docs.sh index aa4b90ac0486..d5757403ecdb 100755 --- a/third_party/rust/bindgen/ci/assert-docs.sh +++ b/third_party/rust/bindgen/ci/assert-docs.sh @@ -3,4 +3,4 @@ set -xeu cd "$(dirname "$0")/.." -cargo build --features "$BINDGEN_FEATURES docs_" +cargo build --features "$BINDGEN_FEATURES testing_only_docs" diff --git a/third_party/rust/bindgen/ci/before_install.sh b/third_party/rust/bindgen/ci/before_install.sh index ebe4f4fb9412..719c4efe505f 100644 --- a/third_party/rust/bindgen/ci/before_install.sh +++ b/third_party/rust/bindgen/ci/before_install.sh @@ -1,4 +1,4 @@ -set -e +set -ex pushd ~ # Workaround for Travis CI macOS bug (https://github.com/travis-ci/travis-ci/issues/6307) @@ -6,16 +6,8 @@ if [ "${TRAVIS_OS_NAME}" == "osx" ]; then rvm get head || true fi -function llvm_version_triple() { - if [ "$1" == "3.8" ]; then - echo "3.8.0" - elif [ "$1" == "3.9" ]; then - echo "3.9.0" - fi -} - function llvm_download() { - export LLVM_VERSION_TRIPLE=`llvm_version_triple ${LLVM_VERSION}` + export LLVM_VERSION_TRIPLE="${LLVM_VERSION}" export LLVM=clang+llvm-${LLVM_VERSION_TRIPLE}-x86_64-$1 wget http://llvm.org/releases/${LLVM_VERSION_TRIPLE}/${LLVM}.tar.xz diff --git a/third_party/rust/bindgen/ci/deploy-book.sh b/third_party/rust/bindgen/ci/deploy-book.sh new file mode 100755 index 000000000000..0c2a2b5ff94b --- /dev/null +++ b/third_party/rust/bindgen/ci/deploy-book.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +set -xeu +cd "$(dirname "$0")/../book" + +# Ensure mdbook is installed. +cargo install mdbook || true +export PATH="$PATH:~/.cargo/bin" + +# Get the git revision we are on. +rev=$(git rev-parse --short HEAD) + +# Build the users guide book and go into the built book's directory. +rm -rf ./book +mdbook build +cd ./book + +# Make the built book directory a new git repo, fetch upstream, make a new +# commit on gh-pages, and push it upstream. + +git init +git config user.name "Travis CI" +git config user.email "builds@travis-ci.org" + +git remote add upstream "https://$GH_TOKEN@github.com/servo/rust-bindgen.git" +git fetch upstream +git reset upstream/gh-pages + +touch . + +git add -A . +git commit -m "Rebuild users guide at ${rev}" +git push upstream HEAD:gh-pages diff --git a/third_party/rust/bindgen/ci/test-book.sh b/third_party/rust/bindgen/ci/test-book.sh new file mode 100755 index 000000000000..30b233180fe0 --- /dev/null +++ b/third_party/rust/bindgen/ci/test-book.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -xeu +cd "$(dirname "$0")/../book" + +cargo install mdbook || true +export PATH="$PATH:~/.cargo/bin" + +mdbook build +mdbook test diff --git a/third_party/rust/bindgen/ci/test.sh b/third_party/rust/bindgen/ci/test.sh index 9bfccfd8f125..f14b7b968762 100755 --- a/third_party/rust/bindgen/ci/test.sh +++ b/third_party/rust/bindgen/ci/test.sh @@ -6,10 +6,13 @@ cd "$(dirname "$0")/.." # Regenerate the test headers' bindings in debug and release modes, and assert # that we always get the expected generated bindings. -cargo test --features "$BINDGEN_FEATURES assert_no_dangling_items" +cargo test --features "$BINDGEN_FEATURES" ./ci/assert-no-diff.sh -cargo test --release --features "$BINDGEN_FEATURES assert_no_dangling_items" +cargo test --features "$BINDGEN_FEATURES testing_only_extra_assertions" +./ci/assert-no-diff.sh + +cargo test --release --features "$BINDGEN_FEATURES testing_only_extra_assertions" ./ci/assert-no-diff.sh # Now test the expectations' size and alignment tests. diff --git a/third_party/rust/bindgen/example-graphviz-ir.png b/third_party/rust/bindgen/example-graphviz-ir.png new file mode 100644 index 0000000000000000000000000000000000000000..1e554a83ee3b8ac08cd3da05841a0381539b4db2 GIT binary patch literal 1343520 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%0AY|Mxp`r~~{G>V@v|)MW>l1Bav$x}axb8>{n5Of* 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
sG6HEg9nW&3SqG$$5HjNQ!)a{^Avx6}y4m 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 z

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%0AnE8bbD z?@0n`!v`Qs-(MX16j~)9hL_eW`c|R?txT{MU(*3;f1%I-2aI%=(U`KrFZiSwri|o2=Tr^I1AfmTVLc8#ZKhY6hIB6 z3l5bw)*cZbQA2}qN{&hlVtsH_c7#YX=}yrn+zvg>n4BW#O%936M?!>%H0#p=PictZV7m=b(2D;^}=c;nN~T zR2WA`K>zG(OQtZUY7y`OfEq7B(RsGUhw&W6(lVI#o|6I6TecWwKGz?3WuZwsTn=cZ zKCN~jFjDUOY#9`dLf3__*QaG)@sma*1TaWXJQj~?!T>e7la7_NcB|j}7xXOH2t8wm zyy@@2V7XOZw|E@N4UH5^3sr8#TH}FzXb-I9?O%ZQ_mF=WvD0CR%vPZov?eOs5WMJ3 zY4-JAq!dKxgz8)erH;3Jy7I7}&cOOeh0y&36~9b3RQ#*-wuA24dKMU(*(fY7EKKf& zVjYU)PD}U?clooP3;Q^~vXMS*~v;8^%`JJ#m$J%QJ5!PFeD6jbzBy->}Iq zN5GxBO~RDtvK4OjhIuon6zIYfeKh+ahR{Cb%b{f3PjS%aKF3Pc1rSW=XL$Q-feDS| zK-}~)$_oUPIJ#n?mgy5{JZt>uk#0qmlUmN`L*sq+_r5Ikhmt2BsAlZWu3o!=T?6GJ8@`{z(b*-&wkZMUtnw3@GHi zsKWVhkmv;>czAk25x*i;ORss4wf(puZ4+ZU%}SDpD^~Mm31~wLeCMr@V5usm@$XF) zF;e74p#a1BwvON%E^$LT!sMs7^CtaAmxg*&l9WqgX46KOe%D#6UpY8_D~M>xXLq9G z3EU@FU8XY+S`mkWzTf|^Ysd;IO}EbNeCK{5e) zUiP)M37*!6<97y~T>J|$^z>z`yD4%PZBq|7?T;0(2g4|EWgNbycT498sx5)+lj*zv z;FDNPsy50#e81WA%YRU|oVc5zw=n{Gi`Dfq6Yf-}zJkXp>4Iv09s7vsYlYvpughZie;W)1X%ko5?S{!Cha|C!V2?%!*K@uB=M>}q> zGln%>ey?vK{6{|^TvmH5#RMyx-QIl!i3Py_#Y`T@TtG3!x4^cu!bR(Xm~LVY6Yk^& zkf+Q9n1U{Qup=%MW8&@=K5U?WxdY6Ax}b9vF5!F;VaT2ixg{RaZGOYm>sp`8d=Dg9 zQOJICA9B3NCMxOfwZd$`wtlqGzFBfD#Cxhki=JhVcrtF64V?b;>y_Hs|MmiSim6|P zA@2kb#l8@nq2<@Q;~;q#ld6gOW>&!?SJQa<)RD)v#zqF`0w2}z3@|;!*2t=kq{V*x zi0jA*C72T@Ln3=TX}NcHJY1w&X?_&fVM6+@xnerB(`= zm)~7})EycXkGsx?o*6<|KK8srqbp?fbJ)Ej$-NP93iG2?Z%=Cb*#Xg^0K9r!-t3wv z=2d3IJkSJc_L-u2xQ)7kcgLmdY7AWp0uFwWFk^P#+c=5`)VXZk(UXFogiB@sAnRGG zhe!}1DIam(pSMkhZ~OILS(VBbrcJ1-S0u@ZN;;?otrtn}3T!OXjiPd{0agb_TANL{ zu=+Bts5J>B?pOAft+Vh?9$0;IQ(6@MYS38!yg1woD9qBwU5YgQ&6=F7^J@elfp3?3 zW59Le1xYfpt#%`YG>6b8{^Qq(5r*UIk4E=R7TRAO9Wiva{K+D&Km$+_V~-#{P;%K1 z9IdCPPnD_TS(}yV&r(P2Kq?7pMHQ}?D_yyFT2c?67JM(5cv12O#?}xIYli*K^d5z< zxO$c#LH|1lw0>K2ho^CWD)=@2ZX$?%;1l0WUB=-U{P$d&OGT|?W zFh=;We>l%`m=S?$aPO~qnP*Pg7HMPAzYF@8pBuEb1~}DbF#6kgHVBb$?nET)vKbC) zE>o%#M5ez)f5X}OLDW^(J|693d%q5x05+0fy0qji3=l2qT8*WwfwXu4Qej^7U%of% z^yT^ESy!CoNm$eQk!@U$;o})eX9FmCAWgM!EWJTIok#ckRMw!IDoV#d&;^6bjk)>> zO}UBBz_ox#?KX(4#QSBQ0{

  • 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 D(ZL&nuKQN}OUq#&WZ4$P+- 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

    g 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 ^^*Ev5SA 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

    lM{E+0HNlmH7zR;uef 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

    p?yIGv9`k_V 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


    cg!<7vbG#b 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
    */ - int mBothAccessors; - /**
    */ - int mUnsafeAccessors; - /**
    */ - int mImmutableAccessor; -}; - -/**
    */ -struct AllAccessors { - int mBothAccessors; - int mAlsoBothAccessors; -}; - -/**
    */ -struct AllUnsafeAccessors { - int mBothAccessors; - int mAlsoBothAccessors; -}; - -/**
    */ -struct ContradictAccessors { - int mBothAccessors; - /**
    */ - int mNoAccessors; - /**
    */ - int mUnsafeAccessors; - /**
    */ - int mImmutableAccessor; -}; - -/**
    */ -struct Replacing { - int mAccessor; -}; - -struct Replaced { - int noOp; -}; - -/**
    */ -struct Wrapper { - Replaced mReplaced; -}; diff --git a/third_party/rust/bindgen/tests/headers/annotation_hide.hpp b/third_party/rust/bindgen/tests/headers/annotation_hide.hpp deleted file mode 100644 index 3c82c9a2ed93..000000000000 --- a/third_party/rust/bindgen/tests/headers/annotation_hide.hpp +++ /dev/null @@ -1,16 +0,0 @@ - -/** - *
    - */ -struct C; - -/** - *
    - */ -struct D { - int a; -}; - -struct NotAnnotated { - int f; -}; diff --git a/third_party/rust/bindgen/tests/headers/anon_enum.hpp b/third_party/rust/bindgen/tests/headers/anon_enum.hpp deleted file mode 100644 index 1961fe6cf7c2..000000000000 --- a/third_party/rust/bindgen/tests/headers/anon_enum.hpp +++ /dev/null @@ -1,10 +0,0 @@ -struct Test { - int foo; - float bar; - enum { T_NONE }; -}; - -typedef enum { - Foo, - Bar, -} Baz; diff --git a/third_party/rust/bindgen/tests/headers/anon_enum_trait.hpp b/third_party/rust/bindgen/tests/headers/anon_enum_trait.hpp deleted file mode 100644 index e1ec394c303a..000000000000 --- a/third_party/rust/bindgen/tests/headers/anon_enum_trait.hpp +++ /dev/null @@ -1,22 +0,0 @@ - -template -class DataType { -public: - typedef _Tp value_type; - typedef value_type work_type; - typedef value_type channel_type; - typedef value_type vec_type; - enum { generic_type = 1, - depth = -1, - channels = 1, - fmt = 0, - type = -1, - }; -}; - -struct Foo { - enum { - Bar = 0, - Baz = 0, - }; -}; diff --git a/third_party/rust/bindgen/tests/headers/anon_enum_whitelist.h b/third_party/rust/bindgen/tests/headers/anon_enum_whitelist.h deleted file mode 100644 index 15cda6b1e722..000000000000 --- a/third_party/rust/bindgen/tests/headers/anon_enum_whitelist.h +++ /dev/null @@ -1,6 +0,0 @@ -// bindgen-flags: --whitelist-var NODE_.* - -enum { - NODE_FLAG_FOO, - NODE_FLAG_BAR, -}; diff --git a/third_party/rust/bindgen/tests/headers/anon_union.hpp b/third_party/rust/bindgen/tests/headers/anon_union.hpp deleted file mode 100644 index 126f6a6ee333..000000000000 --- a/third_party/rust/bindgen/tests/headers/anon_union.hpp +++ /dev/null @@ -1,20 +0,0 @@ -template -struct TErrorResult { - enum UnionState { - HasMessage, - HasException, - }; - int mResult; - struct Message; - struct DOMExceptionInfo; - union { - Message* mMessage; - DOMExceptionInfo* mDOMExceptionInfo; - }; - - bool mMightHaveUnreported; - UnionState mUnionState; -}; - -struct ErrorResult : public TErrorResult { -}; diff --git a/third_party/rust/bindgen/tests/headers/arg_keyword.hpp b/third_party/rust/bindgen/tests/headers/arg_keyword.hpp deleted file mode 100644 index 9f0af85030b5..000000000000 --- a/third_party/rust/bindgen/tests/headers/arg_keyword.hpp +++ /dev/null @@ -1 +0,0 @@ -void foo(const char* type); diff --git a/third_party/rust/bindgen/tests/headers/auto.hpp b/third_party/rust/bindgen/tests/headers/auto.hpp deleted file mode 100644 index b5f6d5f3604f..000000000000 --- a/third_party/rust/bindgen/tests/headers/auto.hpp +++ /dev/null @@ -1,19 +0,0 @@ -// bindgen-flags: -- -std=c++14 -// bindgen-unstable - -class Foo { - static constexpr auto kFoo = 2 == 2; -}; - -template -class Bar { - static const constexpr auto kBar = T(1); -}; - -template auto Test1() { - return T(1); -} - -auto Test2() { - return Test1(); -} diff --git a/third_party/rust/bindgen/tests/headers/bad-namespace-parenthood-inheritance.hpp b/third_party/rust/bindgen/tests/headers/bad-namespace-parenthood-inheritance.hpp deleted file mode 100644 index ce21a40158a1..000000000000 --- a/third_party/rust/bindgen/tests/headers/bad-namespace-parenthood-inheritance.hpp +++ /dev/null @@ -1,15 +0,0 @@ -namespace std -{ - template < typename > struct char_traits; -} -namespace __gnu_cxx -{ - template < typename > struct char_traits; -} -namespace std -{ - template < class _CharT > struct char_traits:__gnu_cxx::char_traits < - _CharT > - { - }; -} diff --git a/third_party/rust/bindgen/tests/headers/base-to-derived.hpp b/third_party/rust/bindgen/tests/headers/base-to-derived.hpp deleted file mode 100644 index ea31e0f25887..000000000000 --- a/third_party/rust/bindgen/tests/headers/base-to-derived.hpp +++ /dev/null @@ -1,19 +0,0 @@ -// bindgen-flags: -- -std=c++11 - -struct false_type {}; - -template -struct __is_base_to_derived_ref; - -template -struct __is_base_to_derived_ref<_From, _To, true> -{ - typedef _To type; - - static constexpr bool value = type::value; -}; - -template -struct __is_base_to_derived_ref<_From, _To, false> -: public false_type -{ }; diff --git a/third_party/rust/bindgen/tests/headers/bitfield-enum-basic.hpp b/third_party/rust/bindgen/tests/headers/bitfield-enum-basic.hpp deleted file mode 100644 index 364bebf2d2c0..000000000000 --- a/third_party/rust/bindgen/tests/headers/bitfield-enum-basic.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// bindgen-flags: --bitfield-enum "Foo|Buz|NS_.*|DUMMY_.*" -- -std=c++11 - -enum Foo { - Bar = 1 << 1, - Baz = 1 << 2, - Duplicated = 1 << 2, - Negative = -3, -}; - -enum class Buz : signed char { - Bar = 1 << 1, - Baz = 1 << 2, - Duplicated = 1 << 2, - Negative = -3, -}; - -enum { - NS_FOO = 1 << 0, - NS_BAR = 1 << 1, -}; - -class Dummy { - enum { - DUMMY_FOO = 1 << 0, - DUMMY_BAR = 1 << 1, - }; -}; diff --git a/third_party/rust/bindgen/tests/headers/bitfield_align.h b/third_party/rust/bindgen/tests/headers/bitfield_align.h deleted file mode 100644 index 82b5309937be..000000000000 --- a/third_party/rust/bindgen/tests/headers/bitfield_align.h +++ /dev/null @@ -1,41 +0,0 @@ -struct A { - unsigned char x; - unsigned b1 : 1; - unsigned b2 : 1; - unsigned b3 : 1; - unsigned b4 : 1; - unsigned b5 : 1; - unsigned b6 : 1; - unsigned b7 : 1; - unsigned b8 : 1; - unsigned b9 : 1; - unsigned b10 : 1; - unsigned char y; -}; - -struct B { - unsigned foo : 31; - unsigned char bar : 1; -}; - -struct C { - unsigned char x; - unsigned b1 : 1; - unsigned b2 : 1; - unsigned baz; -}; - -struct Date1 { - unsigned short nWeekDay : 3; // 0..7 (3 bits) - unsigned short nMonthDay : 6; // 0..31 (6 bits) - unsigned short nMonth : 5; // 0..12 (5 bits) - unsigned short nYear : 8; // 0..100 (8 bits) -}; - -struct Date2 { - unsigned short nWeekDay : 3; // 0..7 (3 bits) - unsigned short nMonthDay : 6; // 0..31 (6 bits) - unsigned short nMonth : 5; // 0..12 (5 bits) - unsigned short nYear : 8; // 0..100 (8 bits) - unsigned char byte; -}; diff --git a/third_party/rust/bindgen/tests/headers/bitfield_method_mangling.h b/third_party/rust/bindgen/tests/headers/bitfield_method_mangling.h deleted file mode 100644 index 257648ee78a5..000000000000 --- a/third_party/rust/bindgen/tests/headers/bitfield_method_mangling.h +++ /dev/null @@ -1,5 +0,0 @@ -typedef struct -{ - unsigned int pad3: 24; - unsigned int type: 8; -} mach_msg_type_descriptor_t; diff --git a/third_party/rust/bindgen/tests/headers/blocks.h b/third_party/rust/bindgen/tests/headers/blocks.h deleted file mode 100644 index 80420e6e45a1..000000000000 --- a/third_party/rust/bindgen/tests/headers/blocks.h +++ /dev/null @@ -1,3 +0,0 @@ -// bindgen-flags: -- -fblocks - -void atexit_b(void (^)(void)); diff --git a/third_party/rust/bindgen/tests/headers/canonical_path_without_namespacing.hpp b/third_party/rust/bindgen/tests/headers/canonical_path_without_namespacing.hpp deleted file mode 100644 index 92e85842848a..000000000000 --- a/third_party/rust/bindgen/tests/headers/canonical_path_without_namespacing.hpp +++ /dev/null @@ -1,7 +0,0 @@ -// bindgen-flags: --disable-name-namespacing - -namespace foo { - struct Bar {}; -} - -void baz(foo::Bar*); diff --git a/third_party/rust/bindgen/tests/headers/class.hpp b/third_party/rust/bindgen/tests/headers/class.hpp deleted file mode 100644 index 1de164710dff..000000000000 --- a/third_party/rust/bindgen/tests/headers/class.hpp +++ /dev/null @@ -1,56 +0,0 @@ -class C { - int a; - // More than rust limits (32) - char big_array[33]; -}; - -class C_with_zero_length_array { - int a; - // More than rust limits (32) - char big_array[33]; - char zero_length_array[0]; -}; - -class C_with_incomplete_array { - int a; - // More than rust limits (32) - char big_array[33]; - char incomplete_array[]; -}; - -class C_with_zero_length_array_and_incomplete_array { - int a; - // More than rust limits (32) - char big_array[33]; - char zero_length_array[0]; - char incomplete_array[]; -}; - -class WithDtor { - int b; - - ~WithDtor() {} -}; - -class IncompleteArrayNonCopiable { - void* whatever; - C incomplete_array[]; -}; - -union Union { - float d; - int i; -}; - -class WithUnion { - Union data; -}; - -class RealAbstractionWithTonsOfMethods { - void foo(); -public: - void bar() const; - void bar(); - void bar(int foo); - static void sta(); -}; diff --git a/third_party/rust/bindgen/tests/headers/class_nested.hpp b/third_party/rust/bindgen/tests/headers/class_nested.hpp deleted file mode 100644 index ccf2f8954e57..000000000000 --- a/third_party/rust/bindgen/tests/headers/class_nested.hpp +++ /dev/null @@ -1,36 +0,0 @@ -class A { -public: - int member_a; - class B { - int member_b; - }; - - class C; - - template - class D { - T foo; - }; -}; - -class A::C { - int baz; -}; - -A::B var; -A::D baz; - -class D { - A::B member; -}; - -template -class Templated { - T member; - - class Templated_inner { - public: - T* member_ptr; - void get() {} - }; -}; diff --git a/third_party/rust/bindgen/tests/headers/class_no_members.hpp b/third_party/rust/bindgen/tests/headers/class_no_members.hpp deleted file mode 100644 index a448355866ca..000000000000 --- a/third_party/rust/bindgen/tests/headers/class_no_members.hpp +++ /dev/null @@ -1,16 +0,0 @@ -// bindgen-flags: -- -std=c++11 - -class whatever { -}; - -class whatever_child: public whatever { -}; - -class whatever_child_with_member: public whatever { -public: - int m_member; -}; - -static_assert(sizeof(whatever) == 1, "Testing!"); -static_assert(sizeof(whatever_child) == 1, "Testing!"); -static_assert(sizeof(whatever_child_with_member) == 4, "Testing!"); diff --git a/third_party/rust/bindgen/tests/headers/class_static.hpp b/third_party/rust/bindgen/tests/headers/class_static.hpp deleted file mode 100644 index 21ab232139f0..000000000000 --- a/third_party/rust/bindgen/tests/headers/class_static.hpp +++ /dev/null @@ -1,7 +0,0 @@ -class MyClass { -public: - static const int* example; - static const int* example_check_no_collision; -}; - -static const int* example_check_no_collision; diff --git a/third_party/rust/bindgen/tests/headers/class_static_const.hpp b/third_party/rust/bindgen/tests/headers/class_static_const.hpp deleted file mode 100644 index 150afe8bd317..000000000000 --- a/third_party/rust/bindgen/tests/headers/class_static_const.hpp +++ /dev/null @@ -1,8 +0,0 @@ -using int32_t = int; -typedef unsigned int uint32_t; - -class A { - static const int a = 0; - static const int32_t b = 077; - static const uint32_t c = 0xff; -}; diff --git a/third_party/rust/bindgen/tests/headers/class_use_as.hpp b/third_party/rust/bindgen/tests/headers/class_use_as.hpp deleted file mode 100644 index a4e36ded1889..000000000000 --- a/third_party/rust/bindgen/tests/headers/class_use_as.hpp +++ /dev/null @@ -1,15 +0,0 @@ - -/** - *
    - */ -struct whatever_replacement { - int replacement; -}; - -struct whatever { - int b; -}; - -struct container { - whatever c; -}; diff --git a/third_party/rust/bindgen/tests/headers/class_with_dtor.hpp b/third_party/rust/bindgen/tests/headers/class_with_dtor.hpp deleted file mode 100644 index b9bf74e1ac4c..000000000000 --- a/third_party/rust/bindgen/tests/headers/class_with_dtor.hpp +++ /dev/null @@ -1,13 +0,0 @@ - - -template -class HandleWithDtor { - T* ptr; - ~HandleWithDtor() {} -}; - -typedef HandleWithDtor HandleValue; - -class WithoutDtor { - HandleValue shouldBeWithDtor; -}; diff --git a/third_party/rust/bindgen/tests/headers/class_with_inner_struct.hpp b/third_party/rust/bindgen/tests/headers/class_with_inner_struct.hpp deleted file mode 100644 index ec729fe66c8c..000000000000 --- a/third_party/rust/bindgen/tests/headers/class_with_inner_struct.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// bindgen-flags: -- -std=c++11 - -class A { - unsigned c; - struct Segment { int begin, end; }; - union { - int f; - } named_union; - union { - int d; - }; -}; - -class B { - unsigned d; - struct Segment { int begin, end; }; -}; - - -enum class StepSyntax { - Keyword, // step-start and step-end - FunctionalWithoutKeyword, // steps(...) - FunctionalWithStartKeyword, // steps(..., start) - FunctionalWithEndKeyword, // steps(..., end) -}; - -class C { - unsigned d; - union { - struct { - float mX1; - float mY1; - float mX2; - float mY2; - } mFunc; - struct { - StepSyntax mStepSyntax; - unsigned int mSteps; - }; - }; - // To ensure it doesn't collide - struct Segment { int begin, end; }; -}; diff --git a/third_party/rust/bindgen/tests/headers/class_with_typedef.hpp b/third_party/rust/bindgen/tests/headers/class_with_typedef.hpp deleted file mode 100644 index 8707cffefb30..000000000000 --- a/third_party/rust/bindgen/tests/headers/class_with_typedef.hpp +++ /dev/null @@ -1,22 +0,0 @@ -typedef int AnotherInt; - -class C { -public: - typedef int MyInt; - typedef const char* Lookup; - MyInt c; - MyInt* ptr; - MyInt arr[10]; - AnotherInt d; - AnotherInt* other_ptr; - - void method(MyInt c); - void methodRef(MyInt& c); - void complexMethodRef(Lookup& c); - void anotherMethod(AnotherInt c); -}; - -class D: public C { -public: - MyInt* ptr; -}; diff --git a/third_party/rust/bindgen/tests/headers/complex.h b/third_party/rust/bindgen/tests/headers/complex.h deleted file mode 100644 index 04877a4ee4f1..000000000000 --- a/third_party/rust/bindgen/tests/headers/complex.h +++ /dev/null @@ -1,16 +0,0 @@ - -#define COMPLEX_TEST(ty_, name_) \ - struct Test##name_ { \ - ty_ _Complex mMember; \ - \ - }; \ - struct Test##name_##Ptr { \ - ty_ _Complex* mMember; \ - }; - -COMPLEX_TEST(double, Double) -COMPLEX_TEST(float, Float) - -// FIXME: 128-byte-aligned in some machines -// which we can't support right now in Rust. -// COMPLEX_TEST(long double, LongDouble) diff --git a/third_party/rust/bindgen/tests/headers/complex_global.h b/third_party/rust/bindgen/tests/headers/complex_global.h deleted file mode 100644 index d9f9fb0163b2..000000000000 --- a/third_party/rust/bindgen/tests/headers/complex_global.h +++ /dev/null @@ -1,3 +0,0 @@ -float _Complex globalValueFloat; -double _Complex globalValueDouble; -long double _Complex globalValueLongDouble; diff --git a/third_party/rust/bindgen/tests/headers/const_array_fn_arg.h b/third_party/rust/bindgen/tests/headers/const_array_fn_arg.h deleted file mode 100644 index ebe22861371d..000000000000 --- a/third_party/rust/bindgen/tests/headers/const_array_fn_arg.h +++ /dev/null @@ -1 +0,0 @@ -void f(const int a[]); diff --git a/third_party/rust/bindgen/tests/headers/const_bool.hpp b/third_party/rust/bindgen/tests/headers/const_bool.hpp deleted file mode 100644 index 633a7c90778a..000000000000 --- a/third_party/rust/bindgen/tests/headers/const_bool.hpp +++ /dev/null @@ -1,9 +0,0 @@ -// bindgen-unstable - -const bool k = true; -struct A { - static const bool k = false; -}; - -typedef bool foo; -const foo k2 = true; diff --git a/third_party/rust/bindgen/tests/headers/const_enum_unnamed.hpp b/third_party/rust/bindgen/tests/headers/const_enum_unnamed.hpp deleted file mode 100644 index eb139434ce0a..000000000000 --- a/third_party/rust/bindgen/tests/headers/const_enum_unnamed.hpp +++ /dev/null @@ -1,9 +0,0 @@ - -enum { - FOO_BAR, - FOO_BAZ, -}; - -class Foo { - enum { FOO_BAR = 10 }; -}; diff --git a/third_party/rust/bindgen/tests/headers/const_ptr.hpp b/third_party/rust/bindgen/tests/headers/const_ptr.hpp deleted file mode 100644 index 66744f8beba8..000000000000 --- a/third_party/rust/bindgen/tests/headers/const_ptr.hpp +++ /dev/null @@ -1,3 +0,0 @@ -extern "C" { - void foo(const void* bar); -} diff --git a/third_party/rust/bindgen/tests/headers/const_resolved_ty.h b/third_party/rust/bindgen/tests/headers/const_resolved_ty.h deleted file mode 100644 index 2521e61c0408..000000000000 --- a/third_party/rust/bindgen/tests/headers/const_resolved_ty.h +++ /dev/null @@ -1,3 +0,0 @@ -typedef unsigned char uint8_t; - -void foo(const uint8_t* foo); diff --git a/third_party/rust/bindgen/tests/headers/const_tparam.hpp b/third_party/rust/bindgen/tests/headers/const_tparam.hpp deleted file mode 100644 index 05f26e4a1e52..000000000000 --- a/third_party/rust/bindgen/tests/headers/const_tparam.hpp +++ /dev/null @@ -1,5 +0,0 @@ -template -class C { - const T* const foo; - const T* bar; -}; diff --git a/third_party/rust/bindgen/tests/headers/constant-evaluate.h b/third_party/rust/bindgen/tests/headers/constant-evaluate.h deleted file mode 100644 index f9f1fa669f24..000000000000 --- a/third_party/rust/bindgen/tests/headers/constant-evaluate.h +++ /dev/null @@ -1,19 +0,0 @@ -// bindgen-unstable - -enum { - foo = 4, - bar = 8, -}; - -typedef unsigned long long EasyToOverflow; -const EasyToOverflow k = 0x80000000; - -const EasyToOverflow k_expr = 1ULL << 60; - -const long long BAZ = (1 << foo) | bar; -const double fuzz = (1 + 50.0f); -const char BAZZ = '5'; -const char WAT = '\0'; - -const char* bytestring = "Foo"; -const char* NOT_UTF8 = "\xf0\x28\x8c\x28"; diff --git a/third_party/rust/bindgen/tests/headers/constant-non-specialized-tp.hpp b/third_party/rust/bindgen/tests/headers/constant-non-specialized-tp.hpp deleted file mode 100644 index 539c28870bc1..000000000000 --- a/third_party/rust/bindgen/tests/headers/constant-non-specialized-tp.hpp +++ /dev/null @@ -1,15 +0,0 @@ -// bindgen-flags: -- -std=c++11 - -// This test ensure we protect ourselves from an LLVM crash. - -template -struct Test { - static constexpr bool x[] = {Args::x...}; -}; - -template -struct Outer { - struct Inner { - static constexpr int value[] = { T::value... }; - }; -}; diff --git a/third_party/rust/bindgen/tests/headers/constify-all-enums.h b/third_party/rust/bindgen/tests/headers/constify-all-enums.h deleted file mode 100644 index 7138bf20189b..000000000000 --- a/third_party/rust/bindgen/tests/headers/constify-all-enums.h +++ /dev/null @@ -1,11 +0,0 @@ -// bindgen-flags: --constified-enum foo - -enum foo { - THIS, - SHOULD_BE, - A_CONSTANT, -}; - -struct bar { - enum foo this_should_work; -}; diff --git a/third_party/rust/bindgen/tests/headers/constify-enum.h b/third_party/rust/bindgen/tests/headers/constify-enum.h deleted file mode 100644 index a5b4052c7895..000000000000 --- a/third_party/rust/bindgen/tests/headers/constify-enum.h +++ /dev/null @@ -1,13 +0,0 @@ - -enum nsCSSPropertyID { - eCSSProperty_a, - eCSSProperty_b, - - eCSSProperty_COUNT, /**<
    */ - eCSSProperty_COUNT_DUMMY2 = eCSSProperty_COUNT - 1, /**<
    */ - - eCSSPropertyAlias_aa, - eCSSPropertyAlias_bb, - - eCSSProperty_COUNT_unexistingVariantValue, /**<
    */ -}; diff --git a/third_party/rust/bindgen/tests/headers/constructor-tp.hpp b/third_party/rust/bindgen/tests/headers/constructor-tp.hpp deleted file mode 100644 index 6e55ea78527a..000000000000 --- a/third_party/rust/bindgen/tests/headers/constructor-tp.hpp +++ /dev/null @@ -1,26 +0,0 @@ - -template -class Foo { -public: - Foo(); - - void doBaz(); -}; - -template -inline void -Foo::doBaz() { -} - -class Bar { -public: - Bar(); -}; - -template -Foo::Foo() { -} - -inline -Bar::Bar() { -} diff --git a/third_party/rust/bindgen/tests/headers/constructors.hpp b/third_party/rust/bindgen/tests/headers/constructors.hpp deleted file mode 100644 index d4174889172d..000000000000 --- a/third_party/rust/bindgen/tests/headers/constructors.hpp +++ /dev/null @@ -1,13 +0,0 @@ - -class TestOverload { - // This one shouldnt' be generated. - TestOverload(); -public: - TestOverload(int); - TestOverload(double); -}; - -class TestPublicNoArgs { -public: - TestPublicNoArgs(); -}; diff --git a/third_party/rust/bindgen/tests/headers/convert-floats.h b/third_party/rust/bindgen/tests/headers/convert-floats.h deleted file mode 100644 index 08d9fe0bd2d9..000000000000 --- a/third_party/rust/bindgen/tests/headers/convert-floats.h +++ /dev/null @@ -1,9 +0,0 @@ -// bindgen-flags: --no-convert-floats - -struct foo { - float bar, baz; - double bazz; - long double* bazzz; - float _Complex complexFloat; - double _Complex complexDouble; -}; diff --git a/third_party/rust/bindgen/tests/headers/crtp.hpp b/third_party/rust/bindgen/tests/headers/crtp.hpp deleted file mode 100644 index a5477c54ba37..000000000000 --- a/third_party/rust/bindgen/tests/headers/crtp.hpp +++ /dev/null @@ -1,12 +0,0 @@ -template -class Base {}; - -class Derived : public Base {}; - -template -class BaseWithDestructor { - ~BaseWithDestructor(); -}; - -class DerivedFromBaseWithDestructor : - public BaseWithDestructor {}; diff --git a/third_party/rust/bindgen/tests/headers/dash_language.h b/third_party/rust/bindgen/tests/headers/dash_language.h deleted file mode 100644 index 4c8bb58dd715..000000000000 --- a/third_party/rust/bindgen/tests/headers/dash_language.h +++ /dev/null @@ -1,6 +0,0 @@ -// bindgen-flags: -- -x c++ --std=c++11 - -template -struct Foo { - int bar; -}; diff --git a/third_party/rust/bindgen/tests/headers/decl_extern_int_twice.h b/third_party/rust/bindgen/tests/headers/decl_extern_int_twice.h deleted file mode 100644 index 06f80e871516..000000000000 --- a/third_party/rust/bindgen/tests/headers/decl_extern_int_twice.h +++ /dev/null @@ -1,2 +0,0 @@ -extern int foo; -extern int foo; diff --git a/third_party/rust/bindgen/tests/headers/decl_ptr_to_array.h b/third_party/rust/bindgen/tests/headers/decl_ptr_to_array.h deleted file mode 100644 index 3222cbd4cf6f..000000000000 --- a/third_party/rust/bindgen/tests/headers/decl_ptr_to_array.h +++ /dev/null @@ -1 +0,0 @@ -int (*foo)[1]; diff --git a/third_party/rust/bindgen/tests/headers/disable-namespacing.hpp b/third_party/rust/bindgen/tests/headers/disable-namespacing.hpp deleted file mode 100644 index 11191361c018..000000000000 --- a/third_party/rust/bindgen/tests/headers/disable-namespacing.hpp +++ /dev/null @@ -1,9 +0,0 @@ -// bindgen-flags: --disable-name-namespacing - -namespace foo { -namespace bar { - -typedef int Baz; - -} -} diff --git a/third_party/rust/bindgen/tests/headers/duplicated-namespaces-definitions.hpp b/third_party/rust/bindgen/tests/headers/duplicated-namespaces-definitions.hpp deleted file mode 100644 index 7c8888def2cd..000000000000 --- a/third_party/rust/bindgen/tests/headers/duplicated-namespaces-definitions.hpp +++ /dev/null @@ -1,18 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces - -namespace foo { - class Bar; -} - -namespace bar { - struct Foo { - foo::Bar* ptr; - }; -}; - -namespace foo { - class Bar { - int foo; - bool baz; - }; -} diff --git a/third_party/rust/bindgen/tests/headers/duplicated-namespaces.hpp b/third_party/rust/bindgen/tests/headers/duplicated-namespaces.hpp deleted file mode 100644 index 10e1933f4328..000000000000 --- a/third_party/rust/bindgen/tests/headers/duplicated-namespaces.hpp +++ /dev/null @@ -1,4 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces - -namespace std {} -namespace std {} diff --git a/third_party/rust/bindgen/tests/headers/duplicated_constants_in_ns.hpp b/third_party/rust/bindgen/tests/headers/duplicated_constants_in_ns.hpp deleted file mode 100644 index bb343641073f..000000000000 --- a/third_party/rust/bindgen/tests/headers/duplicated_constants_in_ns.hpp +++ /dev/null @@ -1,7 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces -namespace foo { - const int FOO = 4; -} -namespace bar { - const int FOO = 5; -} diff --git a/third_party/rust/bindgen/tests/headers/elaborated.hpp b/third_party/rust/bindgen/tests/headers/elaborated.hpp deleted file mode 100644 index 4bfbff23ddc8..000000000000 --- a/third_party/rust/bindgen/tests/headers/elaborated.hpp +++ /dev/null @@ -1,5 +0,0 @@ -namespace whatever { - typedef int whatever_t; -} - -void something(const whatever::whatever_t *wat); diff --git a/third_party/rust/bindgen/tests/headers/empty_template_param_name.hpp b/third_party/rust/bindgen/tests/headers/empty_template_param_name.hpp deleted file mode 100644 index 0e9f3c341f21..000000000000 --- a/third_party/rust/bindgen/tests/headers/empty_template_param_name.hpp +++ /dev/null @@ -1,6 +0,0 @@ -// bindgen-flags: -- -std=c++11 - -template using __void_t = void; - -template> - struct __iterator_traits { }; diff --git a/third_party/rust/bindgen/tests/headers/enum.h b/third_party/rust/bindgen/tests/headers/enum.h deleted file mode 100644 index f2d301e70e3f..000000000000 --- a/third_party/rust/bindgen/tests/headers/enum.h +++ /dev/null @@ -1,9 +0,0 @@ -enum Foo { - Bar = 0, - Qux -}; - -enum Neg { - MinusOne = -1, - One = 1, -}; diff --git a/third_party/rust/bindgen/tests/headers/enum_alias.hpp b/third_party/rust/bindgen/tests/headers/enum_alias.hpp deleted file mode 100644 index 658f8fde9ad5..000000000000 --- a/third_party/rust/bindgen/tests/headers/enum_alias.hpp +++ /dev/null @@ -1,7 +0,0 @@ -// bindgen-flags: -- -std=c++11 - -typedef unsigned char uint8_t; - -enum Bar : uint8_t { - VAL -}; diff --git a/third_party/rust/bindgen/tests/headers/enum_and_vtable_mangling.hpp b/third_party/rust/bindgen/tests/headers/enum_and_vtable_mangling.hpp deleted file mode 100644 index 3abd6a292dec..000000000000 --- a/third_party/rust/bindgen/tests/headers/enum_and_vtable_mangling.hpp +++ /dev/null @@ -1,11 +0,0 @@ - -enum { - match, - whatever_else, -}; - -class C { - int i; -public: - virtual void match() { }; -}; diff --git a/third_party/rust/bindgen/tests/headers/enum_dupe.h b/third_party/rust/bindgen/tests/headers/enum_dupe.h deleted file mode 100644 index 6d3591d5cb5c..000000000000 --- a/third_party/rust/bindgen/tests/headers/enum_dupe.h +++ /dev/null @@ -1,4 +0,0 @@ -enum Foo { - Bar = 1, - Dupe = 1 -}; diff --git a/third_party/rust/bindgen/tests/headers/enum_explicit_type.hpp b/third_party/rust/bindgen/tests/headers/enum_explicit_type.hpp deleted file mode 100644 index 78eadd403264..000000000000 --- a/third_party/rust/bindgen/tests/headers/enum_explicit_type.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// bindgen-flags: -- -std=c++11 - -enum Foo: unsigned char { - Bar = 0, - Qux -}; - -enum Neg: char { - MinusOne = -1, - One = 1, -}; - -enum Bigger: unsigned short { - Much = 255, - Larger -}; - -enum MuchLong: long { - MuchLow = -4294967296, -}; - -enum MuchLongLong: long long { - I64_MIN = 1ll << 63, -}; - -enum MuchULongLong: unsigned long long { - MuchHigh = 4294967296, -}; diff --git a/third_party/rust/bindgen/tests/headers/enum_in_template_with_typedef.hpp b/third_party/rust/bindgen/tests/headers/enum_in_template_with_typedef.hpp deleted file mode 100644 index ac19b7813cae..000000000000 --- a/third_party/rust/bindgen/tests/headers/enum_in_template_with_typedef.hpp +++ /dev/null @@ -1,16 +0,0 @@ -// bindgen-flags: -- -std=c++11 - -namespace std { - template class fbstring_core; -} - -typedef unsigned char uint8_t; -namespace std { - template class fbstring_core { - typedef uint8_t category_type; - enum Category : category_type { - Foo = 1, - Bar = 4, - }; - }; -} diff --git a/third_party/rust/bindgen/tests/headers/enum_negative.h b/third_party/rust/bindgen/tests/headers/enum_negative.h deleted file mode 100644 index 6cbdfe044e2e..000000000000 --- a/third_party/rust/bindgen/tests/headers/enum_negative.h +++ /dev/null @@ -1,4 +0,0 @@ -enum Foo { - Bar = -2, - Qux = 1, -}; diff --git a/third_party/rust/bindgen/tests/headers/enum_packed.h b/third_party/rust/bindgen/tests/headers/enum_packed.h deleted file mode 100644 index 8654d110fda1..000000000000 --- a/third_party/rust/bindgen/tests/headers/enum_packed.h +++ /dev/null @@ -1,14 +0,0 @@ -enum __attribute__((packed)) Foo { - Bar = 0, - Qux -}; - -enum __attribute__((packed)) Neg { - MinusOne = -1, - One = 1, -}; - -enum __attribute__((packed)) Bigger { - Much = 255, - Larger -}; diff --git a/third_party/rust/bindgen/tests/headers/eval-variadic-template-parameter.hpp b/third_party/rust/bindgen/tests/headers/eval-variadic-template-parameter.hpp deleted file mode 100644 index 0a9e51c1e3d9..000000000000 --- a/third_party/rust/bindgen/tests/headers/eval-variadic-template-parameter.hpp +++ /dev/null @@ -1,8 +0,0 @@ -// bindgen-flags: -- -std=c++11 - -template -struct B { - // Can't generate anything meaningful in Rust for this, but we shouldn't - // trigger an assertion inside Clang. - static const long c = sizeof...(T); -}; diff --git a/third_party/rust/bindgen/tests/headers/extern.hpp b/third_party/rust/bindgen/tests/headers/extern.hpp deleted file mode 100644 index 0779e0381e0c..000000000000 --- a/third_party/rust/bindgen/tests/headers/extern.hpp +++ /dev/null @@ -1,3 +0,0 @@ -extern "C" { -#include "func_proto.h" -} diff --git a/third_party/rust/bindgen/tests/headers/float128.hpp b/third_party/rust/bindgen/tests/headers/float128.hpp deleted file mode 100644 index f554e88e1a0f..000000000000 --- a/third_party/rust/bindgen/tests/headers/float128.hpp +++ /dev/null @@ -1,13 +0,0 @@ -// FIXME: libclang < 3.9 does not expose `__float128` in its interface, so this -// test will fail. Once we remove support for `--features llvm_stable` and -// require libclang >= 3.9, we can reenable this test. -// -// static __float128 global = 1.0; - -// FIXME: We have no way to get 128 bit aligned structs in Rust at the moment, -// and therefore the generated layout tests for this struct will fail. When we -// can enforce 128 bit alignment, we can re-enable this test. -// -// struct A { -// __float128 f; -// }; diff --git a/third_party/rust/bindgen/tests/headers/forward-declaration-autoptr.hpp b/third_party/rust/bindgen/tests/headers/forward-declaration-autoptr.hpp deleted file mode 100644 index a26c1cd2ebdc..000000000000 --- a/third_party/rust/bindgen/tests/headers/forward-declaration-autoptr.hpp +++ /dev/null @@ -1,10 +0,0 @@ -class Foo; - -template -struct RefPtr { - T* m_inner; -}; - -struct Bar { - RefPtr m_member; -}; diff --git a/third_party/rust/bindgen/tests/headers/forward-inherit-struct-with-fields.hpp b/third_party/rust/bindgen/tests/headers/forward-inherit-struct-with-fields.hpp deleted file mode 100644 index 437fff5d627b..000000000000 --- a/third_party/rust/bindgen/tests/headers/forward-inherit-struct-with-fields.hpp +++ /dev/null @@ -1,8 +0,0 @@ -template class Rooted; -namespace js { - template class RootedBase { - T* foo; - Rooted* next; - }; -} -template class Rooted : js::RootedBase {}; diff --git a/third_party/rust/bindgen/tests/headers/forward-inherit-struct.hpp b/third_party/rust/bindgen/tests/headers/forward-inherit-struct.hpp deleted file mode 100644 index ac7aef5ee088..000000000000 --- a/third_party/rust/bindgen/tests/headers/forward-inherit-struct.hpp +++ /dev/null @@ -1,5 +0,0 @@ -template class Rooted; -namespace js { - template class RootedBase {}; -} -template class Rooted : js::RootedBase {}; diff --git a/third_party/rust/bindgen/tests/headers/forward_declared_complex_types.hpp b/third_party/rust/bindgen/tests/headers/forward_declared_complex_types.hpp deleted file mode 100644 index ffc779adec2d..000000000000 --- a/third_party/rust/bindgen/tests/headers/forward_declared_complex_types.hpp +++ /dev/null @@ -1,16 +0,0 @@ -struct Foo_empty {}; -struct Foo; - -struct Bar { - Foo *f; -}; - -void baz_struct(Foo* f); - -union Union; - -void baz_union(Union* u); - -class Quux; - -void baz_class(Quux* q); diff --git a/third_party/rust/bindgen/tests/headers/forward_declared_struct.h b/third_party/rust/bindgen/tests/headers/forward_declared_struct.h deleted file mode 100644 index 2a69450c1835..000000000000 --- a/third_party/rust/bindgen/tests/headers/forward_declared_struct.h +++ /dev/null @@ -1,11 +0,0 @@ -struct a; - -struct a { - int b; -}; - -struct c { - int d; -}; - -struct c; \ No newline at end of file diff --git a/third_party/rust/bindgen/tests/headers/func_proto.h b/third_party/rust/bindgen/tests/headers/func_proto.h deleted file mode 100644 index 51139ca92834..000000000000 --- a/third_party/rust/bindgen/tests/headers/func_proto.h +++ /dev/null @@ -1 +0,0 @@ -typedef int foo(int bar); diff --git a/third_party/rust/bindgen/tests/headers/func_ptr.h b/third_party/rust/bindgen/tests/headers/func_ptr.h deleted file mode 100644 index a4662f3d39ac..000000000000 --- a/third_party/rust/bindgen/tests/headers/func_ptr.h +++ /dev/null @@ -1 +0,0 @@ -int (*foo) (int x, int y); diff --git a/third_party/rust/bindgen/tests/headers/func_ptr_in_struct.h b/third_party/rust/bindgen/tests/headers/func_ptr_in_struct.h deleted file mode 100644 index 988db5b36b2c..000000000000 --- a/third_party/rust/bindgen/tests/headers/func_ptr_in_struct.h +++ /dev/null @@ -1,6 +0,0 @@ - -enum baz; - -struct Foo { - enum baz (*bar) (int x, int y); -}; diff --git a/third_party/rust/bindgen/tests/headers/func_with_array_arg.h b/third_party/rust/bindgen/tests/headers/func_with_array_arg.h deleted file mode 100644 index 1b81702bd9a1..000000000000 --- a/third_party/rust/bindgen/tests/headers/func_with_array_arg.h +++ /dev/null @@ -1 +0,0 @@ -void f(int x[2]); diff --git a/third_party/rust/bindgen/tests/headers/func_with_func_ptr_arg.h b/third_party/rust/bindgen/tests/headers/func_with_func_ptr_arg.h deleted file mode 100644 index 629c84ab901d..000000000000 --- a/third_party/rust/bindgen/tests/headers/func_with_func_ptr_arg.h +++ /dev/null @@ -1 +0,0 @@ -void foo(void (*bar)()); diff --git a/third_party/rust/bindgen/tests/headers/in_class_typedef.hpp b/third_party/rust/bindgen/tests/headers/in_class_typedef.hpp deleted file mode 100644 index dda7472ddb34..000000000000 --- a/third_party/rust/bindgen/tests/headers/in_class_typedef.hpp +++ /dev/null @@ -1,10 +0,0 @@ - -template -class Foo { - typedef T elem_type; - typedef T* ptr_type; - - typedef struct Bar { - int x, y; - } Bar; -}; diff --git a/third_party/rust/bindgen/tests/headers/inherit-namespaced.hpp b/third_party/rust/bindgen/tests/headers/inherit-namespaced.hpp deleted file mode 100644 index 61eafd5a576c..000000000000 --- a/third_party/rust/bindgen/tests/headers/inherit-namespaced.hpp +++ /dev/null @@ -1,4 +0,0 @@ -namespace js { - template class RootedBase {}; -} -template class Rooted : js::RootedBase {}; diff --git a/third_party/rust/bindgen/tests/headers/inherit_named.hpp b/third_party/rust/bindgen/tests/headers/inherit_named.hpp deleted file mode 100644 index 9881d1b6a594..000000000000 --- a/third_party/rust/bindgen/tests/headers/inherit_named.hpp +++ /dev/null @@ -1,5 +0,0 @@ -template -class Wohoo {}; - -template -class Weeee : public T {}; diff --git a/third_party/rust/bindgen/tests/headers/inherit_typedef.hpp b/third_party/rust/bindgen/tests/headers/inherit_typedef.hpp deleted file mode 100644 index 8d699e826cdb..000000000000 --- a/third_party/rust/bindgen/tests/headers/inherit_typedef.hpp +++ /dev/null @@ -1,5 +0,0 @@ -struct Foo {}; - -typedef Foo TypedefedFoo; - -struct Bar: public TypedefedFoo {}; diff --git a/third_party/rust/bindgen/tests/headers/inline-function.h b/third_party/rust/bindgen/tests/headers/inline-function.h deleted file mode 100644 index 02cb7c08ab7f..000000000000 --- a/third_party/rust/bindgen/tests/headers/inline-function.h +++ /dev/null @@ -1,6 +0,0 @@ -// bindgen-unstable - -/** The point of this test is to _not_ generate these functions. */ - -inline static int myadd(const int x, const int y) { return x + y; } -static int mysub(const int x, const int y) { return x - y; } diff --git a/third_party/rust/bindgen/tests/headers/inline_namespace.hpp b/third_party/rust/bindgen/tests/headers/inline_namespace.hpp deleted file mode 100644 index 2ccf8ab0e2c2..000000000000 --- a/third_party/rust/bindgen/tests/headers/inline_namespace.hpp +++ /dev/null @@ -1,11 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces -- -std=c++11 - -namespace foo { - inline namespace bar { - using Ty = int; - }; -}; - -class Bar { - foo::Ty baz; -}; diff --git a/third_party/rust/bindgen/tests/headers/inline_namespace_conservative.hpp b/third_party/rust/bindgen/tests/headers/inline_namespace_conservative.hpp deleted file mode 100644 index 50068a2e0a9f..000000000000 --- a/third_party/rust/bindgen/tests/headers/inline_namespace_conservative.hpp +++ /dev/null @@ -1,12 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces --conservative-inline-namespaces -- -std=c++11 - -namespace foo { - inline namespace bar { - using Ty = int; - }; - using Ty = long long; -}; - -class Bar { - foo::bar::Ty baz; -}; diff --git a/third_party/rust/bindgen/tests/headers/inline_namespace_whitelist.hpp b/third_party/rust/bindgen/tests/headers/inline_namespace_whitelist.hpp deleted file mode 100644 index 30047bbec168..000000000000 --- a/third_party/rust/bindgen/tests/headers/inline_namespace_whitelist.hpp +++ /dev/null @@ -1,7 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces --whitelist-type=std::string -- -std=c++11 - -namespace std { - inline namespace bar { - using string = const char*; - }; -}; diff --git a/third_party/rust/bindgen/tests/headers/inner_const.hpp b/third_party/rust/bindgen/tests/headers/inner_const.hpp deleted file mode 100644 index 25c2e603a6f6..000000000000 --- a/third_party/rust/bindgen/tests/headers/inner_const.hpp +++ /dev/null @@ -1,6 +0,0 @@ - -class Foo { - static int BOO; - static Foo whatever; - int bar; -}; diff --git a/third_party/rust/bindgen/tests/headers/inner_template_self.hpp b/third_party/rust/bindgen/tests/headers/inner_template_self.hpp deleted file mode 100644 index 1ae5af06d577..000000000000 --- a/third_party/rust/bindgen/tests/headers/inner_template_self.hpp +++ /dev/null @@ -1,10 +0,0 @@ - -template -class LinkedList { - LinkedList* next; - LinkedList* prev; -}; - -class InstantiateIt { - LinkedList m_list; -}; diff --git a/third_party/rust/bindgen/tests/headers/int128_t.h b/third_party/rust/bindgen/tests/headers/int128_t.h deleted file mode 100644 index eece252c9395..000000000000 --- a/third_party/rust/bindgen/tests/headers/int128_t.h +++ /dev/null @@ -1,7 +0,0 @@ -/** - * FIXME: Uncomment this once we can generate the proper alignment for the type, - * i.e., when we use u128/i128. -struct Foo { - __int128 foo; -}; - */ diff --git a/third_party/rust/bindgen/tests/headers/issue-358.hpp b/third_party/rust/bindgen/tests/headers/issue-358.hpp deleted file mode 100644 index b14521b73b4f..000000000000 --- a/third_party/rust/bindgen/tests/headers/issue-358.hpp +++ /dev/null @@ -1,8 +0,0 @@ -// bindgen-flags: -- -std=c++11 -namespace JS { -template class PersistentRooted; -} -template class a { a *b; }; -namespace JS { -template class PersistentRooted : a> {}; -} diff --git a/third_party/rust/bindgen/tests/headers/issue-372.hpp b/third_party/rust/bindgen/tests/headers/issue-372.hpp deleted file mode 100644 index a072f061271d..000000000000 --- a/third_party/rust/bindgen/tests/headers/issue-372.hpp +++ /dev/null @@ -1,16 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces -template class c { a e[b]; }; -class d; -template class C { c h; }; -class i { - i *j; - i *k; - bool l; -}; -class d { - i m; -}; -enum n { o, p, q, r, s, t, b, ae, e, ag, ah, ai }; -class F { - C w; -}; diff --git a/third_party/rust/bindgen/tests/headers/issue-410.hpp b/third_party/rust/bindgen/tests/headers/issue-410.hpp deleted file mode 100644 index a7a834cfc4ce..000000000000 --- a/third_party/rust/bindgen/tests/headers/issue-410.hpp +++ /dev/null @@ -1,12 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces --whitelist-type JS::Value - -namespace JS { -class Value; -} -typedef enum {} JSWhyMagic; -namespace JS { -class Value { -public: - void a(JSWhyMagic); -}; -} diff --git a/third_party/rust/bindgen/tests/headers/issue-446.hpp b/third_party/rust/bindgen/tests/headers/issue-446.hpp deleted file mode 100644 index 2e09c2745b27..000000000000 --- a/third_party/rust/bindgen/tests/headers/issue-446.hpp +++ /dev/null @@ -1,11 +0,0 @@ -// bindgen-flags: -- -std=c++14 - -template -class List { - List *next; -}; - -template -class PersistentRooted { - List> root_list; -}; diff --git a/third_party/rust/bindgen/tests/headers/issue-447.hpp b/third_party/rust/bindgen/tests/headers/issue-447.hpp deleted file mode 100644 index 017838c42fc1..000000000000 --- a/third_party/rust/bindgen/tests/headers/issue-447.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces --whitelist-type JSAutoCompartment -- -std=c++11 - -namespace mozilla { - template class a {}; - namespace detail { - class GuardObjectNotifier {}; - struct b; - } - class c { - typedef detail::b d; - }; -} -namespace js { - class D { - mozilla::a e; - }; -} -struct f { - js::D g; -}; -namespace js { - struct ContextFriendFields : f {}; -} -class JSAutoCompartment { -public: - JSAutoCompartment(mozilla::detail::GuardObjectNotifier); -}; diff --git a/third_party/rust/bindgen/tests/headers/issue-493.hpp b/third_party/rust/bindgen/tests/headers/issue-493.hpp deleted file mode 100644 index 975ef5ceea8b..000000000000 --- a/third_party/rust/bindgen/tests/headers/issue-493.hpp +++ /dev/null @@ -1,47 +0,0 @@ -template -class basic_string -{ -public: - typedef unsigned long long size_type; - typedef char value_type; - typedef value_type * pointer; - - struct __long - { - size_type __cap_; - size_type __size_; - pointer __data_; - }; - - enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ? - (sizeof(__long) - 1)/sizeof(value_type) : 2}; - - struct __short - { - union - { - unsigned char __size_; - value_type __lx; - }; - value_type __data_[__min_cap]; - }; - - union __ulx{__long __lx; __short __lxx;}; - - enum {__n_words = sizeof(__ulx) / sizeof(size_type)}; - - struct __raw - { - size_type __words[__n_words]; - }; - - struct __rep - { - union - { - __long __l; - __short __s; - __raw __r; - }; - }; -}; \ No newline at end of file diff --git a/third_party/rust/bindgen/tests/headers/issue_311.hpp b/third_party/rust/bindgen/tests/headers/issue_311.hpp deleted file mode 100644 index a8d7fd997d9e..000000000000 --- a/third_party/rust/bindgen/tests/headers/issue_311.hpp +++ /dev/null @@ -1,5 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces - -struct jsval_layout { - struct {}; -}; diff --git a/third_party/rust/bindgen/tests/headers/issue_315.hpp b/third_party/rust/bindgen/tests/headers/issue_315.hpp deleted file mode 100644 index e58cb5e335a7..000000000000 --- a/third_party/rust/bindgen/tests/headers/issue_315.hpp +++ /dev/null @@ -1,2 +0,0 @@ -///
    -template using b = a; diff --git a/third_party/rust/bindgen/tests/headers/jsval_layout_opaque.hpp b/third_party/rust/bindgen/tests/headers/jsval_layout_opaque.hpp deleted file mode 100644 index 85c5be63c4e2..000000000000 --- a/third_party/rust/bindgen/tests/headers/jsval_layout_opaque.hpp +++ /dev/null @@ -1,424 +0,0 @@ -// bindgen-flags: --no-unstable-rust -- -std=c++11 - -/** - * These typedefs are hacky, but keep our tests consistent across 64-bit - * platforms, otherwise the id's change and our CI is unhappy. - */ -typedef unsigned char uint8_t; -typedef int int32_t; -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; -typedef unsigned long long size_t; -typedef unsigned long long uintptr_t; - - -#define JS_PUNBOX64 -#define IS_LITTLE_ENDIAN - -/* - * Try to get jsvals 64-bit aligned. We could almost assert that all values are - * aligned, but MSVC and GCC occasionally break alignment. - */ -#if defined(__GNUC__) || defined(__xlc__) || defined(__xlC__) -# define JSVAL_ALIGNMENT __attribute__((aligned (8))) -#elif defined(_MSC_VER) - /* - * Structs can be aligned with MSVC, but not if they are used as parameters, - * so we just don't try to align. - */ -# define JSVAL_ALIGNMENT -#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# define JSVAL_ALIGNMENT -#elif defined(__HP_cc) || defined(__HP_aCC) -# define JSVAL_ALIGNMENT -#endif - -#if defined(JS_PUNBOX64) -# define JSVAL_TAG_SHIFT 47 -#endif - -/* - * We try to use enums so that printing a jsval_layout in the debugger shows - * nice symbolic type tags, however we can only do this when we can force the - * underlying type of the enum to be the desired size. - */ -#if !defined(__SUNPRO_CC) && !defined(__xlC__) - -#if defined(_MSC_VER) -# define JS_ENUM_HEADER(id, type) enum id : type -# define JS_ENUM_FOOTER(id) -#else -# define JS_ENUM_HEADER(id, type) enum id -# define JS_ENUM_FOOTER(id) __attribute__((packed)) -#endif - -/* Remember to propagate changes to the C defines below. */ -JS_ENUM_HEADER(JSValueType, uint8_t) -{ - JSVAL_TYPE_DOUBLE = 0x00, - JSVAL_TYPE_INT32 = 0x01, - JSVAL_TYPE_UNDEFINED = 0x02, - JSVAL_TYPE_BOOLEAN = 0x03, - JSVAL_TYPE_MAGIC = 0x04, - JSVAL_TYPE_STRING = 0x05, - JSVAL_TYPE_SYMBOL = 0x06, - JSVAL_TYPE_NULL = 0x07, - JSVAL_TYPE_OBJECT = 0x08, - - /* These never appear in a jsval; they are only provided as an out-of-band value. */ - JSVAL_TYPE_UNKNOWN = 0x20, - JSVAL_TYPE_MISSING = 0x21 -} JS_ENUM_FOOTER(JSValueType); - -static_assert(sizeof(JSValueType) == 1, - "compiler typed enum support is apparently buggy"); - -#if defined(JS_NUNBOX32) - -/* Remember to propagate changes to the C defines below. */ -JS_ENUM_HEADER(JSValueTag, uint32_t) -{ - JSVAL_TAG_CLEAR = 0xFFFFFF80, - JSVAL_TAG_INT32 = JSVAL_TAG_CLEAR | JSVAL_TYPE_INT32, - JSVAL_TAG_UNDEFINED = JSVAL_TAG_CLEAR | JSVAL_TYPE_UNDEFINED, - JSVAL_TAG_STRING = JSVAL_TAG_CLEAR | JSVAL_TYPE_STRING, - JSVAL_TAG_SYMBOL = JSVAL_TAG_CLEAR | JSVAL_TYPE_SYMBOL, - JSVAL_TAG_BOOLEAN = JSVAL_TAG_CLEAR | JSVAL_TYPE_BOOLEAN, - JSVAL_TAG_MAGIC = JSVAL_TAG_CLEAR | JSVAL_TYPE_MAGIC, - JSVAL_TAG_NULL = JSVAL_TAG_CLEAR | JSVAL_TYPE_NULL, - JSVAL_TAG_OBJECT = JSVAL_TAG_CLEAR | JSVAL_TYPE_OBJECT -} JS_ENUM_FOOTER(JSValueTag); - -static_assert(sizeof(JSValueTag) == sizeof(uint32_t), - "compiler typed enum support is apparently buggy"); - -#elif defined(JS_PUNBOX64) - -/* Remember to propagate changes to the C defines below. */ -JS_ENUM_HEADER(JSValueTag, uint32_t) -{ - JSVAL_TAG_MAX_DOUBLE = 0x1FFF0, - JSVAL_TAG_INT32 = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_INT32, - JSVAL_TAG_UNDEFINED = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_UNDEFINED, - JSVAL_TAG_STRING = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_STRING, - JSVAL_TAG_SYMBOL = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_SYMBOL, - JSVAL_TAG_BOOLEAN = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_BOOLEAN, - JSVAL_TAG_MAGIC = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_MAGIC, - JSVAL_TAG_NULL = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_NULL, - JSVAL_TAG_OBJECT = JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_OBJECT -} JS_ENUM_FOOTER(JSValueTag); - -static_assert(sizeof(JSValueTag) == sizeof(uint32_t), - "compiler typed enum support is apparently buggy"); - -JS_ENUM_HEADER(JSValueShiftedTag, uint64_t) -{ - JSVAL_SHIFTED_TAG_MAX_DOUBLE = ((((uint64_t)JSVAL_TAG_MAX_DOUBLE) << JSVAL_TAG_SHIFT) | 0xFFFFFFFF), - JSVAL_SHIFTED_TAG_INT32 = (((uint64_t)JSVAL_TAG_INT32) << JSVAL_TAG_SHIFT), - JSVAL_SHIFTED_TAG_UNDEFINED = (((uint64_t)JSVAL_TAG_UNDEFINED) << JSVAL_TAG_SHIFT), - JSVAL_SHIFTED_TAG_STRING = (((uint64_t)JSVAL_TAG_STRING) << JSVAL_TAG_SHIFT), - JSVAL_SHIFTED_TAG_SYMBOL = (((uint64_t)JSVAL_TAG_SYMBOL) << JSVAL_TAG_SHIFT), - JSVAL_SHIFTED_TAG_BOOLEAN = (((uint64_t)JSVAL_TAG_BOOLEAN) << JSVAL_TAG_SHIFT), - JSVAL_SHIFTED_TAG_MAGIC = (((uint64_t)JSVAL_TAG_MAGIC) << JSVAL_TAG_SHIFT), - JSVAL_SHIFTED_TAG_NULL = (((uint64_t)JSVAL_TAG_NULL) << JSVAL_TAG_SHIFT), - JSVAL_SHIFTED_TAG_OBJECT = (((uint64_t)JSVAL_TAG_OBJECT) << JSVAL_TAG_SHIFT) -} JS_ENUM_FOOTER(JSValueShiftedTag); - -static_assert(sizeof(JSValueShiftedTag) == sizeof(uint64_t), - "compiler typed enum support is apparently buggy"); - -#endif - -/* - * All our supported compilers implement C++11 |enum Foo : T| syntax, so don't - * expose these macros. (This macro exists *only* because gcc bug 51242 - * makes bit-fields of - * typed enums trigger a warning that can't be turned off. Don't expose it - * beyond this file!) - */ -#undef JS_ENUM_HEADER -#undef JS_ENUM_FOOTER - -#else /* !defined(__SUNPRO_CC) && !defined(__xlC__) */ - -typedef uint8_t JSValueType; -#define JSVAL_TYPE_DOUBLE ((uint8_t)0x00) -#define JSVAL_TYPE_INT32 ((uint8_t)0x01) -#define JSVAL_TYPE_UNDEFINED ((uint8_t)0x02) -#define JSVAL_TYPE_BOOLEAN ((uint8_t)0x03) -#define JSVAL_TYPE_MAGIC ((uint8_t)0x04) -#define JSVAL_TYPE_STRING ((uint8_t)0x05) -#define JSVAL_TYPE_SYMBOL ((uint8_t)0x06) -#define JSVAL_TYPE_NULL ((uint8_t)0x07) -#define JSVAL_TYPE_OBJECT ((uint8_t)0x08) -#define JSVAL_TYPE_UNKNOWN ((uint8_t)0x20) - -#if defined(JS_NUNBOX32) - -typedef uint32_t JSValueTag; -#define JSVAL_TAG_CLEAR ((uint32_t)(0xFFFFFF80)) -#define JSVAL_TAG_INT32 ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_INT32)) -#define JSVAL_TAG_UNDEFINED ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_UNDEFINED)) -#define JSVAL_TAG_STRING ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_STRING)) -#define JSVAL_TAG_SYMBOL ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_SYMBOL)) -#define JSVAL_TAG_BOOLEAN ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_BOOLEAN)) -#define JSVAL_TAG_MAGIC ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_MAGIC)) -#define JSVAL_TAG_NULL ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_NULL)) -#define JSVAL_TAG_OBJECT ((uint32_t)(JSVAL_TAG_CLEAR | JSVAL_TYPE_OBJECT)) - -#elif defined(JS_PUNBOX64) - -typedef uint32_t JSValueTag; -#define JSVAL_TAG_MAX_DOUBLE ((uint32_t)(0x1FFF0)) -#define JSVAL_TAG_INT32 (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_INT32) -#define JSVAL_TAG_UNDEFINED (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_UNDEFINED) -#define JSVAL_TAG_STRING (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_STRING) -#define JSVAL_TAG_SYMBOL (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_SYMBOL) -#define JSVAL_TAG_BOOLEAN (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_BOOLEAN) -#define JSVAL_TAG_MAGIC (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_MAGIC) -#define JSVAL_TAG_NULL (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_NULL) -#define JSVAL_TAG_OBJECT (uint32_t)(JSVAL_TAG_MAX_DOUBLE | JSVAL_TYPE_OBJECT) - -typedef uint64_t JSValueShiftedTag; -#define JSVAL_SHIFTED_TAG_MAX_DOUBLE ((((uint64_t)JSVAL_TAG_MAX_DOUBLE) << JSVAL_TAG_SHIFT) | 0xFFFFFFFF) -#define JSVAL_SHIFTED_TAG_INT32 (((uint64_t)JSVAL_TAG_INT32) << JSVAL_TAG_SHIFT) -#define JSVAL_SHIFTED_TAG_UNDEFINED (((uint64_t)JSVAL_TAG_UNDEFINED) << JSVAL_TAG_SHIFT) -#define JSVAL_SHIFTED_TAG_STRING (((uint64_t)JSVAL_TAG_STRING) << JSVAL_TAG_SHIFT) -#define JSVAL_SHIFTED_TAG_SYMBOL (((uint64_t)JSVAL_TAG_SYMBOL) << JSVAL_TAG_SHIFT) -#define JSVAL_SHIFTED_TAG_BOOLEAN (((uint64_t)JSVAL_TAG_BOOLEAN) << JSVAL_TAG_SHIFT) -#define JSVAL_SHIFTED_TAG_MAGIC (((uint64_t)JSVAL_TAG_MAGIC) << JSVAL_TAG_SHIFT) -#define JSVAL_SHIFTED_TAG_NULL (((uint64_t)JSVAL_TAG_NULL) << JSVAL_TAG_SHIFT) -#define JSVAL_SHIFTED_TAG_OBJECT (((uint64_t)JSVAL_TAG_OBJECT) << JSVAL_TAG_SHIFT) - -#endif /* JS_PUNBOX64 */ -#endif /* !defined(__SUNPRO_CC) && !defined(__xlC__) */ - -#if defined(JS_NUNBOX32) - -#define JSVAL_TYPE_TO_TAG(type) ((JSValueTag)(JSVAL_TAG_CLEAR | (type))) - -#define JSVAL_LOWER_INCL_TAG_OF_OBJ_OR_NULL_SET JSVAL_TAG_NULL -#define JSVAL_UPPER_EXCL_TAG_OF_PRIMITIVE_SET JSVAL_TAG_OBJECT -#define JSVAL_UPPER_INCL_TAG_OF_NUMBER_SET JSVAL_TAG_INT32 -#define JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET JSVAL_TAG_STRING - -#elif defined(JS_PUNBOX64) - -#define JSVAL_PAYLOAD_MASK 0x00007FFFFFFFFFFFLL -#define JSVAL_TAG_MASK 0xFFFF800000000000LL -#define JSVAL_TYPE_TO_TAG(type) ((JSValueTag)(JSVAL_TAG_MAX_DOUBLE | (type))) -#define JSVAL_TYPE_TO_SHIFTED_TAG(type) (((uint64_t)JSVAL_TYPE_TO_TAG(type)) << JSVAL_TAG_SHIFT) - -#define JSVAL_LOWER_INCL_TAG_OF_OBJ_OR_NULL_SET JSVAL_TAG_NULL -#define JSVAL_UPPER_EXCL_TAG_OF_PRIMITIVE_SET JSVAL_TAG_OBJECT -#define JSVAL_UPPER_INCL_TAG_OF_NUMBER_SET JSVAL_TAG_INT32 -#define JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET JSVAL_TAG_STRING - -#define JSVAL_LOWER_INCL_SHIFTED_TAG_OF_OBJ_OR_NULL_SET JSVAL_SHIFTED_TAG_NULL -#define JSVAL_UPPER_EXCL_SHIFTED_TAG_OF_PRIMITIVE_SET JSVAL_SHIFTED_TAG_OBJECT -#define JSVAL_UPPER_EXCL_SHIFTED_TAG_OF_NUMBER_SET JSVAL_SHIFTED_TAG_UNDEFINED -#define JSVAL_LOWER_INCL_SHIFTED_TAG_OF_GCTHING_SET JSVAL_SHIFTED_TAG_STRING - -#endif /* JS_PUNBOX64 */ - -typedef enum JSWhyMagic -{ - /** a hole in a native object's elements */ - JS_ELEMENTS_HOLE, - - /** there is not a pending iterator value */ - JS_NO_ITER_VALUE, - - /** exception value thrown when closing a generator */ - JS_GENERATOR_CLOSING, - - /** compiler sentinel value */ - JS_NO_CONSTANT, - - /** used in debug builds to catch tracing errors */ - JS_THIS_POISON, - - /** used in debug builds to catch tracing errors */ - JS_ARG_POISON, - - /** an empty subnode in the AST serializer */ - JS_SERIALIZE_NO_NODE, - - /** lazy arguments value on the stack */ - JS_LAZY_ARGUMENTS, - - /** optimized-away 'arguments' value */ - JS_OPTIMIZED_ARGUMENTS, - - /** magic value passed to natives to indicate construction */ - JS_IS_CONSTRUCTING, - - /** arguments.callee has been overwritten */ - JS_OVERWRITTEN_CALLEE, - - /** value of static block object slot */ - JS_BLOCK_NEEDS_CLONE, - - /** see class js::HashableValue */ - JS_HASH_KEY_EMPTY, - - /** error while running Ion code */ - JS_ION_ERROR, - - /** missing recover instruction result */ - JS_ION_BAILOUT, - - /** optimized out slot */ - JS_OPTIMIZED_OUT, - - /** uninitialized lexical bindings that produce ReferenceError on touch. */ - JS_UNINITIALIZED_LEXICAL, - - /** for local use */ - JS_GENERIC_MAGIC, - - JS_WHY_MAGIC_COUNT -} JSWhyMagic; - -#if defined(IS_LITTLE_ENDIAN) -# if defined(JS_NUNBOX32) -typedef union jsval_layout -{ - uint64_t asBits; - struct { - union { - int32_t i32; - uint32_t u32; - uint32_t boo; // Don't use |bool| -- it must be four bytes. - JSString* str; - JS::Symbol* sym; - JSObject* obj; - js::gc::Cell* cell; - void* ptr; - JSWhyMagic why; - size_t word; - uintptr_t uintptr; - } payload; - JSValueTag tag; - } s; - double asDouble; - void* asPtr; -} JSVAL_ALIGNMENT jsval_layout; -# elif defined(JS_PUNBOX64) -typedef union jsval_layout -{ - uint64_t asBits; -#if !defined(_WIN64) - /* MSVC does not pack these correctly :-( */ - struct { - uint64_t payload47 : 47; - JSValueTag tag : 17; - } debugView; -#endif - struct { - union { - int32_t i32; - uint32_t u32; - JSWhyMagic why; - } payload; - } s; - double asDouble; - void* asPtr; - size_t asWord; - uintptr_t asUIntPtr; -} JSVAL_ALIGNMENT jsval_layout; -# endif /* JS_PUNBOX64 */ -#else /* defined(IS_LITTLE_ENDIAN) */ -# if defined(JS_NUNBOX32) -typedef union jsval_layout -{ - uint64_t asBits; - struct { - JSValueTag tag; - union { - int32_t i32; - uint32_t u32; - uint32_t boo; // Don't use |bool| -- it must be four bytes. - JSString* str; - JS::Symbol* sym; - JSObject* obj; - js::gc::Cell* cell; - void* ptr; - JSWhyMagic why; - size_t word; - uintptr_t uintptr; - } payload; - } s; - double asDouble; - void* asPtr; -} JSVAL_ALIGNMENT jsval_layout; -# elif defined(JS_PUNBOX64) -typedef union jsval_layout -{ - uint64_t asBits; - struct { - JSValueTag tag : 17; - uint64_t payload47 : 47; - } debugView; - struct { - uint32_t padding; - union { - int32_t i32; - uint32_t u32; - JSWhyMagic why; - } payload; - } s; - double asDouble; - void* asPtr; - size_t asWord; - uintptr_t asUIntPtr; -} JSVAL_ALIGNMENT jsval_layout; -# endif /* JS_PUNBOX64 */ -#endif /* defined(IS_LITTLE_ENDIAN) */ - -/* - * For codesize purposes on some platforms, it's important that the - * compiler know that JS::Values constructed from constant values can be - * folded to constant bit patterns at compile time, rather than - * constructed at runtime. Doing this requires a fair amount of C++11 - * features, which are not supported on all of our compilers. Set up - * some defines and helper macros in an attempt to confine the ugliness - * here, rather than scattering it all about the file. The important - * features are: - * - * - constexpr; - * - defaulted functions; - * - C99-style designated initializers. - */ -#if defined(__clang__) -# if __has_feature(cxx_constexpr) && __has_feature(cxx_defaulted_functions) -# define JS_VALUE_IS_CONSTEXPR -# endif -#elif defined(__GNUC__) -/* - * We need 4.5 for defaulted functions, 4.6 for constexpr, 4.7 because 4.6 - * doesn't understand |(X) { .field = ... }| syntax, and 4.7.3 because - * versions prior to that have bugs in the C++ front-end that cause crashes. - */ -# if MOZ_GCC_VERSION_AT_LEAST(4, 7, 3) -# define JS_VALUE_IS_CONSTEXPR -# endif -#endif - -#if defined(JS_VALUE_IS_CONSTEXPR) -# define JS_RETURN_LAYOUT_FROM_BITS(BITS) \ - return (jsval_layout) { .asBits = (BITS) } -# define JS_VALUE_CONSTEXPR MOZ_CONSTEXPR -# define JS_VALUE_CONSTEXPR_VAR MOZ_CONSTEXPR_VAR -#else -# define JS_RETURN_LAYOUT_FROM_BITS(BITS) \ - jsval_layout l; \ - l.asBits = (BITS); \ - return l; -# define JS_VALUE_CONSTEXPR -# define JS_VALUE_CONSTEXPR_VAR const -#endif - -struct Value { - jsval_layout data; -}; diff --git a/third_party/rust/bindgen/tests/headers/keywords.h b/third_party/rust/bindgen/tests/headers/keywords.h deleted file mode 100644 index 8699ce5f2220..000000000000 --- a/third_party/rust/bindgen/tests/headers/keywords.h +++ /dev/null @@ -1,49 +0,0 @@ -int u8; -int u16; -int u32; -int u64; -int i8; -int i16; -int i32; -int i64; -int f32; -int f64; -int usize; -int isize; -int as; -int box; -int crate; -int false; -int fn; -int impl; -int in; -int let; -int loop; -int match; -int mod; -int move; -int mut; -int pub; -int ref; -int self; -int Self; -int super; -int trait; -int true; -int type; -int unsafe; -int use; -int where; -int abstract; -int alignof; -int become; -int final; -int macro; -int offsetof; -int override; -int priv; -int proc; -int pure; -int unsized; -int virtual; -int yield; diff --git a/third_party/rust/bindgen/tests/headers/layout.h b/third_party/rust/bindgen/tests/headers/layout.h deleted file mode 100644 index d1822a04decb..000000000000 --- a/third_party/rust/bindgen/tests/headers/layout.h +++ /dev/null @@ -1,6 +0,0 @@ -struct header -{ - char proto; - unsigned int size __attribute__ ((packed)); - unsigned char data[] __attribute__ ((aligned(8))); -} __attribute__ ((aligned, packed)); \ No newline at end of file diff --git a/third_party/rust/bindgen/tests/headers/layout_align.h b/third_party/rust/bindgen/tests/headers/layout_align.h deleted file mode 100644 index 0201877e7928..000000000000 --- a/third_party/rust/bindgen/tests/headers/layout_align.h +++ /dev/null @@ -1,20 +0,0 @@ -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; - -struct rte_kni_fifo { - volatile unsigned write; /**< Next position to be written*/ - volatile unsigned read; /**< Next position to be read */ - unsigned len; /**< Circular buffer length */ - unsigned elem_size; /**< Pointer size - for 32/64 bit OS */ - void *volatile buffer[]; /**< The buffer contains mbuf pointers */ -}; - -__extension__ -struct rte_eth_link { - uint32_t link_speed; /**< ETH_SPEED_NUM_ */ - uint16_t link_duplex : 1; /**< ETH_LINK_[HALF/FULL]_DUPLEX */ - uint16_t link_autoneg : 1; /**< ETH_LINK_SPEED_[AUTONEG/FIXED] */ - uint16_t link_status : 1; /**< ETH_LINK_[DOWN/UP] */ -} __attribute__((aligned(8))); /**< aligned for atomic64 read/write */ \ No newline at end of file diff --git a/third_party/rust/bindgen/tests/headers/layout_arp.h b/third_party/rust/bindgen/tests/headers/layout_arp.h deleted file mode 100644 index 8682cbe0eee6..000000000000 --- a/third_party/rust/bindgen/tests/headers/layout_arp.h +++ /dev/null @@ -1,52 +0,0 @@ -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; - -#define ETHER_ADDR_LEN 6 /**< Length of Ethernet address. */ - -/** - * Ethernet address: - * A universally administered address is uniquely assigned to a device by its - * manufacturer. The first three octets (in transmission order) contain the - * Organizationally Unique Identifier (OUI). The following three (MAC-48 and - * EUI-48) octets are assigned by that organization with the only constraint - * of uniqueness. - * A locally administered address is assigned to a device by a network - * administrator and does not contain OUIs. - * See http://standards.ieee.org/regauth/groupmac/tutorial.html - */ -struct ether_addr { - uint8_t addr_bytes[ETHER_ADDR_LEN]; /**< Addr bytes in tx order */ -} __attribute__((__packed__)); - -/** - * ARP header IPv4 payload. - */ -struct arp_ipv4 { - struct ether_addr arp_sha; /**< sender hardware address */ - uint32_t arp_sip; /**< sender IP address */ - struct ether_addr arp_tha; /**< target hardware address */ - uint32_t arp_tip; /**< target IP address */ -} __attribute__((__packed__)); - -/** - * ARP header. - */ -struct arp_hdr { - uint16_t arp_hrd; /* format of hardware address */ -#define ARP_HRD_ETHER 1 /* ARP Ethernet address format */ - - uint16_t arp_pro; /* format of protocol address */ - uint8_t arp_hln; /* length of hardware address */ - uint8_t arp_pln; /* length of protocol address */ - uint16_t arp_op; /* ARP opcode (command) */ -#define ARP_OP_REQUEST 1 /* request to resolve address */ -#define ARP_OP_REPLY 2 /* response to previous request */ -#define ARP_OP_REVREQUEST 3 /* request proto addr given hardware */ -#define ARP_OP_REVREPLY 4 /* response giving protocol address */ -#define ARP_OP_INVREQUEST 8 /* request to identify peer */ -#define ARP_OP_INVREPLY 9 /* response identifying peer */ - - struct arp_ipv4 arp_data; -} __attribute__((__packed__)); \ No newline at end of file diff --git a/third_party/rust/bindgen/tests/headers/layout_array.h b/third_party/rust/bindgen/tests/headers/layout_array.h deleted file mode 100644 index 4b99e0ed4250..000000000000 --- a/third_party/rust/bindgen/tests/headers/layout_array.h +++ /dev/null @@ -1,109 +0,0 @@ -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; - -typedef long long size_t; - -#define RTE_CACHE_LINE_SIZE 64 - -/** - * Force alignment - */ -#define __rte_aligned(a) __attribute__((__aligned__(a))) - -/** - * Force alignment to cache line. - */ -#define __rte_cache_aligned __rte_aligned(RTE_CACHE_LINE_SIZE) - -#define RTE_MEMPOOL_OPS_NAMESIZE 32 /**< Max length of ops struct name. */ - -/** - * Prototype for implementation specific data provisioning function. - * - * The function should provide the implementation specific memory for - * for use by the other mempool ops functions in a given mempool ops struct. - * E.g. the default ops provides an instance of the rte_ring for this purpose. - * it will most likely point to a different type of data structure, and - * will be transparent to the application programmer. - * This function should set mp->pool_data. - */ -typedef int (*rte_mempool_alloc_t)(struct rte_mempool *mp); - -/** - * Free the opaque private data pointed to by mp->pool_data pointer. - */ -typedef void (*rte_mempool_free_t)(struct rte_mempool *mp); - -/** - * Enqueue an object into the external pool. - */ -typedef int (*rte_mempool_enqueue_t)(struct rte_mempool *mp, - void * const *obj_table, unsigned int n); - -/** - * Dequeue an object from the external pool. - */ -typedef int (*rte_mempool_dequeue_t)(struct rte_mempool *mp, - void **obj_table, unsigned int n); - -/** - * Return the number of available objects in the external pool. - */ -typedef unsigned (*rte_mempool_get_count)(const struct rte_mempool *mp); -/** Structure defining mempool operations structure */ -struct rte_mempool_ops { - char name[RTE_MEMPOOL_OPS_NAMESIZE]; /**< Name of mempool ops struct. */ - rte_mempool_alloc_t alloc; /**< Allocate private data. */ - rte_mempool_free_t free; /**< Free the external pool. */ - rte_mempool_enqueue_t enqueue; /**< Enqueue an object. */ - rte_mempool_dequeue_t dequeue; /**< Dequeue an object. */ - rte_mempool_get_count get_count; /**< Get qty of available objs. */ -} __rte_cache_aligned; - -#define RTE_MEMPOOL_MAX_OPS_IDX 16 /**< Max registered ops structs */ - -/** - * The rte_spinlock_t type. - */ -typedef struct { - volatile int locked; /**< lock status 0 = unlocked, 1 = locked */ -} rte_spinlock_t; - -/** - * Structure storing the table of registered ops structs, each of which contain - * the function pointers for the mempool ops functions. - * Each process has its own storage for this ops struct array so that - * the mempools can be shared across primary and secondary processes. - * The indices used to access the array are valid across processes, whereas - * any function pointers stored directly in the mempool struct would not be. - * This results in us simply having "ops_index" in the mempool struct. - */ -struct rte_mempool_ops_table { - rte_spinlock_t sl; /**< Spinlock for add/delete. */ - uint32_t num_ops; /**< Number of used ops structs in the table. */ - /** - * Storage for all possible ops structs. - */ - struct rte_mempool_ops ops[RTE_MEMPOOL_MAX_OPS_IDX]; -} __rte_cache_aligned; - - -/* Number of free lists per heap, grouped by size. */ -#define RTE_HEAP_NUM_FREELISTS 13 - -#define LIST_HEAD(name, type) \ -struct name { \ - struct type *lh_first; /* first element */ \ -} - -/** - * Structure to hold malloc heap - */ -struct malloc_heap { - rte_spinlock_t lock; - LIST_HEAD(, malloc_elem) free_head[RTE_HEAP_NUM_FREELISTS]; - unsigned alloc_count; - size_t total_size; -} __rte_cache_aligned; diff --git a/third_party/rust/bindgen/tests/headers/layout_cmdline_token.h b/third_party/rust/bindgen/tests/headers/layout_cmdline_token.h deleted file mode 100644 index 34ebd017de37..000000000000 --- a/third_party/rust/bindgen/tests/headers/layout_cmdline_token.h +++ /dev/null @@ -1,63 +0,0 @@ - -/** - * Stores a pointer to the ops struct, and the offset: the place to - * write the parsed result in the destination structure. - */ -struct cmdline_token_hdr { - struct cmdline_token_ops *ops; - unsigned int offset; -}; -typedef struct cmdline_token_hdr cmdline_parse_token_hdr_t; - -/** - * A token is defined by this structure. - * - * parse() takes the token as first argument, then the source buffer - * starting at the token we want to parse. The 3rd arg is a pointer - * where we store the parsed data (as binary). It returns the number of - * parsed chars on success and a negative value on error. - * - * complete_get_nb() returns the number of possible values for this - * token if completion is possible. If it is NULL or if it returns 0, - * no completion is possible. - * - * complete_get_elt() copy in dstbuf (the size is specified in the - * parameter) the i-th possible completion for this token. returns 0 - * on success or and a negative value on error. - * - * get_help() fills the dstbuf with the help for the token. It returns - * -1 on error and 0 on success. - */ -struct cmdline_token_ops { - /** parse(token ptr, buf, res pts, buf len) */ - int (*parse)(cmdline_parse_token_hdr_t *, const char *, void *, - unsigned int); - /** return the num of possible choices for this token */ - int (*complete_get_nb)(cmdline_parse_token_hdr_t *); - /** return the elt x for this token (token, idx, dstbuf, size) */ - int (*complete_get_elt)(cmdline_parse_token_hdr_t *, int, char *, - unsigned int); - /** get help for this token (token, dstbuf, size) */ - int (*get_help)(cmdline_parse_token_hdr_t *, char *, unsigned int); -}; - -enum cmdline_numtype { - UINT8 = 0, - UINT16, - UINT32, - UINT64, - INT8, - INT16, - INT32, - INT64 -}; - -struct cmdline_token_num_data { - enum cmdline_numtype type; -}; - -struct cmdline_token_num { - struct cmdline_token_hdr hdr; - struct cmdline_token_num_data num_data; -}; -typedef struct cmdline_token_num cmdline_parse_token_num_t; \ No newline at end of file diff --git a/third_party/rust/bindgen/tests/headers/layout_eth_conf.h b/third_party/rust/bindgen/tests/headers/layout_eth_conf.h deleted file mode 100644 index a742ee5f99c9..000000000000 --- a/third_party/rust/bindgen/tests/headers/layout_eth_conf.h +++ /dev/null @@ -1,427 +0,0 @@ -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; - -/** - * Simple flags are used for rte_eth_conf.rxmode.mq_mode. - */ -#define ETH_MQ_RX_RSS_FLAG 0x1 -#define ETH_MQ_RX_DCB_FLAG 0x2 -#define ETH_MQ_RX_VMDQ_FLAG 0x4 - -/* Definitions used for VMDQ and DCB functionality */ -#define ETH_VMDQ_MAX_VLAN_FILTERS 64 /**< Maximum nb. of VMDQ vlan filters. */ -#define ETH_DCB_NUM_USER_PRIORITIES 8 /**< Maximum nb. of DCB priorities. */ -#define ETH_VMDQ_DCB_NUM_QUEUES 128 /**< Maximum nb. of VMDQ DCB queues. */ -#define ETH_DCB_NUM_QUEUES 128 /**< Maximum nb. of DCB queues. */ - -/** - * A set of values to identify what method is to be used to route - * packets to multiple queues. - */ -enum rte_eth_rx_mq_mode { - /** None of DCB,RSS or VMDQ mode */ - ETH_MQ_RX_NONE = 0, - - /** For RX side, only RSS is on */ - ETH_MQ_RX_RSS = ETH_MQ_RX_RSS_FLAG, - /** For RX side,only DCB is on. */ - ETH_MQ_RX_DCB = ETH_MQ_RX_DCB_FLAG, - /** Both DCB and RSS enable */ - ETH_MQ_RX_DCB_RSS = ETH_MQ_RX_RSS_FLAG | ETH_MQ_RX_DCB_FLAG, - - /** Only VMDQ, no RSS nor DCB */ - ETH_MQ_RX_VMDQ_ONLY = ETH_MQ_RX_VMDQ_FLAG, - /** RSS mode with VMDQ */ - ETH_MQ_RX_VMDQ_RSS = ETH_MQ_RX_RSS_FLAG | ETH_MQ_RX_VMDQ_FLAG, - /** Use VMDQ+DCB to route traffic to queues */ - ETH_MQ_RX_VMDQ_DCB = ETH_MQ_RX_VMDQ_FLAG | ETH_MQ_RX_DCB_FLAG, - /** Enable both VMDQ and DCB in VMDq */ - ETH_MQ_RX_VMDQ_DCB_RSS = ETH_MQ_RX_RSS_FLAG | ETH_MQ_RX_DCB_FLAG | - ETH_MQ_RX_VMDQ_FLAG, -}; - -/** - * A structure used to configure the RX features of an Ethernet port. - */ -struct rte_eth_rxmode { - /** The multi-queue packet distribution mode to be used, e.g. RSS. */ - enum rte_eth_rx_mq_mode mq_mode; - uint32_t max_rx_pkt_len; /**< Only used if jumbo_frame enabled. */ - uint16_t split_hdr_size; /**< hdr buf size (header_split enabled).*/ - __extension__ - uint16_t header_split : 1, /**< Header Split enable. */ - hw_ip_checksum : 1, /**< IP/UDP/TCP checksum offload enable. */ - hw_vlan_filter : 1, /**< VLAN filter enable. */ - hw_vlan_strip : 1, /**< VLAN strip enable. */ - hw_vlan_extend : 1, /**< Extended VLAN enable. */ - jumbo_frame : 1, /**< Jumbo Frame Receipt enable. */ - hw_strip_crc : 1, /**< Enable CRC stripping by hardware. */ - enable_scatter : 1, /**< Enable scatter packets rx handler */ - enable_lro : 1; /**< Enable LRO */ -}; - -/** - * A set of values to identify what method is to be used to transmit - * packets using multi-TCs. - */ -enum rte_eth_tx_mq_mode { - ETH_MQ_TX_NONE = 0, /**< It is in neither DCB nor VT mode. */ - ETH_MQ_TX_DCB, /**< For TX side,only DCB is on. */ - ETH_MQ_TX_VMDQ_DCB, /**< For TX side,both DCB and VT is on. */ - ETH_MQ_TX_VMDQ_ONLY, /**< Only VT on, no DCB */ -}; - -/** - * A structure used to configure the TX features of an Ethernet port. - */ -struct rte_eth_txmode { - enum rte_eth_tx_mq_mode mq_mode; /**< TX multi-queues mode. */ - - /* For i40e specifically */ - uint16_t pvid; - __extension__ - uint8_t hw_vlan_reject_tagged : 1, - /**< If set, reject sending out tagged pkts */ - hw_vlan_reject_untagged : 1, - /**< If set, reject sending out untagged pkts */ - hw_vlan_insert_pvid : 1; - /**< If set, enable port based VLAN insertion */ -}; - -/** - * A structure used to configure the Receive Side Scaling (RSS) feature - * of an Ethernet port. - * If not NULL, the *rss_key* pointer of the *rss_conf* structure points - * to an array holding the RSS key to use for hashing specific header - * fields of received packets. The length of this array should be indicated - * by *rss_key_len* below. Otherwise, a default random hash key is used by - * the device driver. - * - * The *rss_key_len* field of the *rss_conf* structure indicates the length - * in bytes of the array pointed by *rss_key*. To be compatible, this length - * will be checked in i40e only. Others assume 40 bytes to be used as before. - * - * The *rss_hf* field of the *rss_conf* structure indicates the different - * types of IPv4/IPv6 packets to which the RSS hashing must be applied. - * Supplying an *rss_hf* equal to zero disables the RSS feature. - */ -struct rte_eth_rss_conf { - uint8_t *rss_key; /**< If not NULL, 40-byte hash key. */ - uint8_t rss_key_len; /**< hash key length in bytes. */ - uint64_t rss_hf; /**< Hash functions to apply - see below. */ -}; - -/** - * This enum indicates the possible number of traffic classes - * in DCB configratioins - */ -enum rte_eth_nb_tcs { - ETH_4_TCS = 4, /**< 4 TCs with DCB. */ - ETH_8_TCS = 8 /**< 8 TCs with DCB. */ -}; - -/** - * This enum indicates the possible number of queue pools - * in VMDQ configurations. - */ -enum rte_eth_nb_pools { - ETH_8_POOLS = 8, /**< 8 VMDq pools. */ - ETH_16_POOLS = 16, /**< 16 VMDq pools. */ - ETH_32_POOLS = 32, /**< 32 VMDq pools. */ - ETH_64_POOLS = 64 /**< 64 VMDq pools. */ -}; - -/** - * A structure used to configure the VMDQ+DCB feature - * of an Ethernet port. - * - * Using this feature, packets are routed to a pool of queues, based - * on the vlan id in the vlan tag, and then to a specific queue within - * that pool, using the user priority vlan tag field. - * - * A default pool may be used, if desired, to route all traffic which - * does not match the vlan filter rules. - */ -struct rte_eth_vmdq_dcb_conf { - enum rte_eth_nb_pools nb_queue_pools; /**< With DCB, 16 or 32 pools */ - uint8_t enable_default_pool; /**< If non-zero, use a default pool */ - uint8_t default_pool; /**< The default pool, if applicable */ - uint8_t nb_pool_maps; /**< We can have up to 64 filters/mappings */ - struct { - uint16_t vlan_id; /**< The vlan id of the received frame */ - uint64_t pools; /**< Bitmask of pools for packet rx */ - } pool_map[ETH_VMDQ_MAX_VLAN_FILTERS]; /**< VMDq vlan pool maps. */ - uint8_t dcb_tc[ETH_DCB_NUM_USER_PRIORITIES]; - /**< Selects a queue in a pool */ -}; - -/* This structure may be extended in future. */ -struct rte_eth_dcb_rx_conf { - enum rte_eth_nb_tcs nb_tcs; /**< Possible DCB TCs, 4 or 8 TCs */ - /** Traffic class each UP mapped to. */ - uint8_t dcb_tc[ETH_DCB_NUM_USER_PRIORITIES]; -}; - -struct rte_eth_vmdq_dcb_tx_conf { - enum rte_eth_nb_pools nb_queue_pools; /**< With DCB, 16 or 32 pools. */ - /** Traffic class each UP mapped to. */ - uint8_t dcb_tc[ETH_DCB_NUM_USER_PRIORITIES]; -}; - -struct rte_eth_dcb_tx_conf { - enum rte_eth_nb_tcs nb_tcs; /**< Possible DCB TCs, 4 or 8 TCs. */ - /** Traffic class each UP mapped to. */ - uint8_t dcb_tc[ETH_DCB_NUM_USER_PRIORITIES]; -}; - -struct rte_eth_vmdq_tx_conf { - enum rte_eth_nb_pools nb_queue_pools; /**< VMDq mode, 64 pools. */ -}; - -struct rte_eth_vmdq_rx_conf { - enum rte_eth_nb_pools nb_queue_pools; /**< VMDq only mode, 8 or 64 pools */ - uint8_t enable_default_pool; /**< If non-zero, use a default pool */ - uint8_t default_pool; /**< The default pool, if applicable */ - uint8_t enable_loop_back; /**< Enable VT loop back */ - uint8_t nb_pool_maps; /**< We can have up to 64 filters/mappings */ - uint32_t rx_mode; /**< Flags from ETH_VMDQ_ACCEPT_* */ - struct { - uint16_t vlan_id; /**< The vlan id of the received frame */ - uint64_t pools; /**< Bitmask of pools for packet rx */ - } pool_map[ETH_VMDQ_MAX_VLAN_FILTERS]; /**< VMDq vlan pool maps. */ -}; - -/** - * Flow Director setting modes: none, signature or perfect. - */ -enum rte_fdir_mode { - RTE_FDIR_MODE_NONE = 0, /**< Disable FDIR support. */ - RTE_FDIR_MODE_SIGNATURE, /**< Enable FDIR signature filter mode. */ - RTE_FDIR_MODE_PERFECT, /**< Enable FDIR perfect filter mode. */ - RTE_FDIR_MODE_PERFECT_MAC_VLAN, /**< Enable FDIR filter mode - MAC VLAN. */ - RTE_FDIR_MODE_PERFECT_TUNNEL, /**< Enable FDIR filter mode - tunnel. */ -}; - -/** - * Memory space that can be configured to store Flow Director filters - * in the board memory. - */ -enum rte_fdir_pballoc_type { - RTE_FDIR_PBALLOC_64K = 0, /**< 64k. */ - RTE_FDIR_PBALLOC_128K, /**< 128k. */ - RTE_FDIR_PBALLOC_256K, /**< 256k. */ -}; - -/** - * Select report mode of FDIR hash information in RX descriptors. - */ -enum rte_fdir_status_mode { - RTE_FDIR_NO_REPORT_STATUS = 0, /**< Never report FDIR hash. */ - RTE_FDIR_REPORT_STATUS, /**< Only report FDIR hash for matching pkts. */ - RTE_FDIR_REPORT_STATUS_ALWAYS, /**< Always report FDIR hash. */ -}; - -/** - * A structure used to define the input for IPV4 flow - */ -struct rte_eth_ipv4_flow { - uint32_t src_ip; /**< IPv4 source address in big endian. */ - uint32_t dst_ip; /**< IPv4 destination address in big endian. */ - uint8_t tos; /**< Type of service to match. */ - uint8_t ttl; /**< Time to live to match. */ - uint8_t proto; /**< Protocol, next header in big endian. */ -}; - -/** - * A structure used to define the input for IPV6 flow - */ -struct rte_eth_ipv6_flow { - uint32_t src_ip[4]; /**< IPv6 source address in big endian. */ - uint32_t dst_ip[4]; /**< IPv6 destination address in big endian. */ - uint8_t tc; /**< Traffic class to match. */ - uint8_t proto; /**< Protocol, next header to match. */ - uint8_t hop_limits; /**< Hop limits to match. */ -}; - -/** - * A structure used to configure FDIR masks that are used by the device - * to match the various fields of RX packet headers. - */ -struct rte_eth_fdir_masks { - uint16_t vlan_tci_mask; /**< Bit mask for vlan_tci in big endian */ - /** Bit mask for ipv4 flow in big endian. */ - struct rte_eth_ipv4_flow ipv4_mask; - /** Bit maks for ipv6 flow in big endian. */ - struct rte_eth_ipv6_flow ipv6_mask; - /** Bit mask for L4 source port in big endian. */ - uint16_t src_port_mask; - /** Bit mask for L4 destination port in big endian. */ - uint16_t dst_port_mask; - /** 6 bit mask for proper 6 bytes of Mac address, bit 0 matches the - first byte on the wire */ - uint8_t mac_addr_byte_mask; - /** Bit mask for tunnel ID in big endian. */ - uint32_t tunnel_id_mask; - uint8_t tunnel_type_mask; /**< 1 - Match tunnel type, - 0 - Ignore tunnel type. */ -}; - -/** - * Payload type - */ -enum rte_eth_payload_type { - RTE_ETH_PAYLOAD_UNKNOWN = 0, - RTE_ETH_RAW_PAYLOAD, - RTE_ETH_L2_PAYLOAD, - RTE_ETH_L3_PAYLOAD, - RTE_ETH_L4_PAYLOAD, - RTE_ETH_PAYLOAD_MAX = 8, -}; - -#define RTE_ETH_FDIR_MAX_FLEXLEN 16 /**< Max length of flexbytes. */ -#define RTE_ETH_INSET_SIZE_MAX 128 /**< Max length of input set. */ - -/** - * A structure used to select bytes extracted from the protocol layers to - * flexible payload for filter - */ -struct rte_eth_flex_payload_cfg { - enum rte_eth_payload_type type; /**< Payload type */ - uint16_t src_offset[RTE_ETH_FDIR_MAX_FLEXLEN]; - /**< Offset in bytes from the beginning of packet's payload - src_offset[i] indicates the flexbyte i's offset in original - packet payload. This value should be less than - flex_payload_limit in struct rte_eth_fdir_info.*/ -}; - -/** - * A structure used to define FDIR masks for flexible payload - * for each flow type - */ -struct rte_eth_fdir_flex_mask { - uint16_t flow_type; - uint8_t mask[RTE_ETH_FDIR_MAX_FLEXLEN]; - /**< Mask for the whole flexible payload */ -}; - - -/* - * A packet can be identified by hardware as different flow types. Different - * NIC hardwares may support different flow types. - * Basically, the NIC hardware identifies the flow type as deep protocol as - * possible, and exclusively. For example, if a packet is identified as - * 'RTE_ETH_FLOW_NONFRAG_IPV4_TCP', it will not be any of other flow types, - * though it is an actual IPV4 packet. - * Note that the flow types are used to define RSS offload types in - * rte_ethdev.h. - */ -#define RTE_ETH_FLOW_UNKNOWN 0 -#define RTE_ETH_FLOW_RAW 1 -#define RTE_ETH_FLOW_IPV4 2 -#define RTE_ETH_FLOW_FRAG_IPV4 3 -#define RTE_ETH_FLOW_NONFRAG_IPV4_TCP 4 -#define RTE_ETH_FLOW_NONFRAG_IPV4_UDP 5 -#define RTE_ETH_FLOW_NONFRAG_IPV4_SCTP 6 -#define RTE_ETH_FLOW_NONFRAG_IPV4_OTHER 7 -#define RTE_ETH_FLOW_IPV6 8 -#define RTE_ETH_FLOW_FRAG_IPV6 9 -#define RTE_ETH_FLOW_NONFRAG_IPV6_TCP 10 -#define RTE_ETH_FLOW_NONFRAG_IPV6_UDP 11 -#define RTE_ETH_FLOW_NONFRAG_IPV6_SCTP 12 -#define RTE_ETH_FLOW_NONFRAG_IPV6_OTHER 13 -#define RTE_ETH_FLOW_L2_PAYLOAD 14 -#define RTE_ETH_FLOW_IPV6_EX 15 -#define RTE_ETH_FLOW_IPV6_TCP_EX 16 -#define RTE_ETH_FLOW_IPV6_UDP_EX 17 -#define RTE_ETH_FLOW_PORT 18 - /**< Consider device port number as a flow differentiator */ -#define RTE_ETH_FLOW_VXLAN 19 /**< VXLAN protocol based flow */ -#define RTE_ETH_FLOW_GENEVE 20 /**< GENEVE protocol based flow */ -#define RTE_ETH_FLOW_NVGRE 21 /**< NVGRE protocol based flow */ -#define RTE_ETH_FLOW_MAX 22 - -/** - * A structure used to define all flexible payload related setting - * include flex payload and flex mask - */ -struct rte_eth_fdir_flex_conf { - uint16_t nb_payloads; /**< The number of following payload cfg */ - uint16_t nb_flexmasks; /**< The number of following mask */ - struct rte_eth_flex_payload_cfg flex_set[RTE_ETH_PAYLOAD_MAX]; - /**< Flex payload configuration for each payload type */ - struct rte_eth_fdir_flex_mask flex_mask[RTE_ETH_FLOW_MAX]; - /**< Flex mask configuration for each flow type */ -}; - -/** - * A structure used to configure the Flow Director (FDIR) feature - * of an Ethernet port. - * - * If mode is RTE_FDIR_DISABLE, the pballoc value is ignored. - */ -struct rte_fdir_conf { - enum rte_fdir_mode mode; /**< Flow Director mode. */ - enum rte_fdir_pballoc_type pballoc; /**< Space for FDIR filters. */ - enum rte_fdir_status_mode status; /**< How to report FDIR hash. */ - /** RX queue of packets matching a "drop" filter in perfect mode. */ - uint8_t drop_queue; - struct rte_eth_fdir_masks mask; - struct rte_eth_fdir_flex_conf flex_conf; - /**< Flex payload configuration. */ -}; - -/** - * A structure used to enable/disable specific device interrupts. - */ -struct rte_intr_conf { - /** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */ - uint16_t lsc; - /** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */ - uint16_t rxq; -}; - -/** - * A structure used to configure an Ethernet port. - * Depending upon the RX multi-queue mode, extra advanced - * configuration settings may be needed. - */ -struct rte_eth_conf { - uint32_t link_speeds; /**< bitmap of ETH_LINK_SPEED_XXX of speeds to be - used. ETH_LINK_SPEED_FIXED disables link - autonegotiation, and a unique speed shall be - set. Otherwise, the bitmap defines the set of - speeds to be advertised. If the special value - ETH_LINK_SPEED_AUTONEG (0) is used, all speeds - supported are advertised. */ - struct rte_eth_rxmode rxmode; /**< Port RX configuration. */ - struct rte_eth_txmode txmode; /**< Port TX configuration. */ - uint32_t lpbk_mode; /**< Loopback operation mode. By default the value - is 0, meaning the loopback mode is disabled. - Read the datasheet of given ethernet controller - for details. The possible values of this field - are defined in implementation of each driver. */ - struct { - struct rte_eth_rss_conf rss_conf; /**< Port RSS configuration */ - struct rte_eth_vmdq_dcb_conf vmdq_dcb_conf; - /**< Port vmdq+dcb configuration. */ - struct rte_eth_dcb_rx_conf dcb_rx_conf; - /**< Port dcb RX configuration. */ - struct rte_eth_vmdq_rx_conf vmdq_rx_conf; - /**< Port vmdq RX configuration. */ - } rx_adv_conf; /**< Port RX filtering configuration (union). */ - union { - struct rte_eth_vmdq_dcb_tx_conf vmdq_dcb_tx_conf; - /**< Port vmdq+dcb TX configuration. */ - struct rte_eth_dcb_tx_conf dcb_tx_conf; - /**< Port dcb TX configuration. */ - struct rte_eth_vmdq_tx_conf vmdq_tx_conf; - /**< Port vmdq TX configuration. */ - } tx_adv_conf; /**< Port TX DCB configuration (union). */ - /** Currently,Priority Flow Control(PFC) are supported,if DCB with PFC - is needed,and the variable must be set ETH_DCB_PFC_SUPPORT. */ - uint32_t dcb_capability_en; - struct rte_fdir_conf fdir_conf; /**< FDIR configuration. */ - struct rte_intr_conf intr_conf; /**< Interrupt mode configuration. */ -}; \ No newline at end of file diff --git a/third_party/rust/bindgen/tests/headers/layout_kni_mbuf.h b/third_party/rust/bindgen/tests/headers/layout_kni_mbuf.h deleted file mode 100644 index ff161144a37a..000000000000 --- a/third_party/rust/bindgen/tests/headers/layout_kni_mbuf.h +++ /dev/null @@ -1,32 +0,0 @@ - -#define RTE_CACHE_LINE_MIN_SIZE 64 /**< Minimum Cache line size. */ - -#define RTE_CACHE_LINE_SIZE 64 - -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; - -/* - * The kernel image of the rte_mbuf struct, with only the relevant fields. - * Padding is necessary to assure the offsets of these fields - */ -struct rte_kni_mbuf { - void *buf_addr __attribute__((__aligned__(RTE_CACHE_LINE_SIZE))); - uint64_t buf_physaddr; - char pad0[2]; - uint16_t data_off; /**< Start address of data in segment buffer. */ - char pad1[2]; - uint8_t nb_segs; /**< Number of segments. */ - char pad4[1]; - uint64_t ol_flags; /**< Offload features. */ - char pad2[4]; - uint32_t pkt_len; /**< Total pkt len: sum of all segment data_len. */ - uint16_t data_len; /**< Amount of data in segment buffer. */ - - /* fields on second cache line */ - char pad3[8] __attribute__((__aligned__(RTE_CACHE_LINE_MIN_SIZE))); - void *pool; - void *next; -}; diff --git a/third_party/rust/bindgen/tests/headers/layout_mbuf.h b/third_party/rust/bindgen/tests/headers/layout_mbuf.h deleted file mode 100644 index dc1c1b242bf7..000000000000 --- a/third_party/rust/bindgen/tests/headers/layout_mbuf.h +++ /dev/null @@ -1,187 +0,0 @@ - -#define RTE_CACHE_LINE_MIN_SIZE 64 /**< Minimum Cache line size. */ - -#define RTE_CACHE_LINE_SIZE 64 - -typedef char int8_t; -typedef short int16_t; -typedef int int32_t; -typedef long long int64_t; - -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; - -typedef uint64_t phys_addr_t; - -/** - * Force alignment - */ -#define __rte_aligned(a) __attribute__((__aligned__(a))) - -/** - * Force alignment to cache line. - */ -#define __rte_cache_aligned __rte_aligned(RTE_CACHE_LINE_SIZE) - -/** - * Force minimum cache line alignment. - */ -#define __rte_cache_min_aligned __rte_aligned(RTE_CACHE_LINE_MIN_SIZE) - -/* define a set of marker types that can be used to refer to set points in the - * mbuf */ -__extension__ -typedef void *MARKER[0]; /**< generic marker for a point in a structure */ -__extension__ -typedef uint8_t MARKER8[0]; /**< generic marker with 1B alignment */ -__extension__ -typedef uint64_t MARKER64[0]; /**< marker that allows us to overwrite 8 bytes - * with a single assignment */ - -/** C extension macro for environments lacking C11 features. */ -#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L -#define RTE_STD_C11 __extension__ -#else -#define RTE_STD_C11 -#endif - -/** - * The atomic counter structure. - */ -typedef struct { - volatile int16_t cnt; /**< An internal counter value. */ -} rte_atomic16_t; - -/** - * The generic rte_mbuf, containing a packet mbuf. - */ -struct rte_mbuf { - MARKER cacheline0; - - void *buf_addr; /**< Virtual address of segment buffer. */ - phys_addr_t buf_physaddr; /**< Physical address of segment buffer. */ - - uint16_t buf_len; /**< Length of segment buffer. */ - - /* next 6 bytes are initialised on RX descriptor rearm */ - MARKER8 rearm_data; - uint16_t data_off; - - /** - * 16-bit Reference counter. - * It should only be accessed using the following functions: - * rte_mbuf_refcnt_update(), rte_mbuf_refcnt_read(), and - * rte_mbuf_refcnt_set(). The functionality of these functions (atomic, - * or non-atomic) is controlled by the CONFIG_RTE_MBUF_REFCNT_ATOMIC - * config option. - */ - RTE_STD_C11 - union { - rte_atomic16_t refcnt_atomic; /**< Atomically accessed refcnt */ - uint16_t refcnt; /**< Non-atomically accessed refcnt */ - }; - uint8_t nb_segs; /**< Number of segments. */ - uint8_t port; /**< Input port. */ - - uint64_t ol_flags; /**< Offload features. */ - - /* remaining bytes are set on RX when pulling packet from descriptor */ - MARKER rx_descriptor_fields1; - - /* - * The packet type, which is the combination of outer/inner L2, L3, L4 - * and tunnel types. The packet_type is about data really present in the - * mbuf. Example: if vlan stripping is enabled, a received vlan packet - * would have RTE_PTYPE_L2_ETHER and not RTE_PTYPE_L2_VLAN because the - * vlan is stripped from the data. - */ - RTE_STD_C11 - union { - uint32_t packet_type; /**< L2/L3/L4 and tunnel information. */ - struct { - uint32_t l2_type:4; /**< (Outer) L2 type. */ - uint32_t l3_type:4; /**< (Outer) L3 type. */ - uint32_t l4_type:4; /**< (Outer) L4 type. */ - uint32_t tun_type:4; /**< Tunnel type. */ - uint32_t inner_l2_type:4; /**< Inner L2 type. */ - uint32_t inner_l3_type:4; /**< Inner L3 type. */ - uint32_t inner_l4_type:4; /**< Inner L4 type. */ - }; - }; - - uint32_t pkt_len; /**< Total pkt len: sum of all segments. */ - uint16_t data_len; /**< Amount of data in segment buffer. */ - /** VLAN TCI (CPU order), valid if PKT_RX_VLAN_STRIPPED is set. */ - uint16_t vlan_tci; - - union { - uint32_t rss; /**< RSS hash result if RSS enabled */ - struct { - RTE_STD_C11 - union { - struct { - uint16_t hash; - uint16_t id; - }; - uint32_t lo; - /**< Second 4 flexible bytes */ - }; - uint32_t hi; - /**< First 4 flexible bytes or FD ID, dependent on - PKT_RX_FDIR_* flag in ol_flags. */ - } fdir; /**< Filter identifier if FDIR enabled */ - struct { - uint32_t lo; - uint32_t hi; - } sched; /**< Hierarchical scheduler */ - uint32_t usr; /**< User defined tags. See rte_distributor_process() */ - } hash; /**< hash information */ - - uint32_t seqn; /**< Sequence number. See also rte_reorder_insert() */ - - /** Outer VLAN TCI (CPU order), valid if PKT_RX_QINQ_STRIPPED is set. */ - uint16_t vlan_tci_outer; - - /* second cache line - fields only used in slow path or on TX */ - MARKER cacheline1 __rte_cache_min_aligned; - - RTE_STD_C11 - union { - void *userdata; /**< Can be used for external metadata */ - uint64_t udata64; /**< Allow 8-byte userdata on 32-bit */ - }; - - struct rte_mempool *pool; /**< Pool from which mbuf was allocated. */ - struct rte_mbuf *next; /**< Next segment of scattered packet. */ - - /* fields to support TX offloads */ - RTE_STD_C11 - union { - uint64_t tx_offload; /**< combined for easy fetch */ - __extension__ - struct { - uint64_t l2_len:7; - /**< L2 (MAC) Header Length for non-tunneling pkt. - * Outer_L4_len + ... + Inner_L2_len for tunneling pkt. - */ - uint64_t l3_len:9; /**< L3 (IP) Header Length. */ - uint64_t l4_len:8; /**< L4 (TCP/UDP) Header Length. */ - uint64_t tso_segsz:16; /**< TCP TSO segment size */ - - /* fields for TX offloading of tunnels */ - uint64_t outer_l3_len:9; /**< Outer L3 (IP) Hdr Length. */ - uint64_t outer_l2_len:7; /**< Outer L2 (MAC) Hdr Length. */ - - /* uint64_t unused:8; */ - }; - }; - - /** Size of the application private data. In case of an indirect - * mbuf, it stores the direct mbuf private data size. */ - uint16_t priv_size; - - /** Timesync flags for use with IEEE1588. */ - uint16_t timesync; -} __rte_cache_aligned; \ No newline at end of file diff --git a/third_party/rust/bindgen/tests/headers/macro-expr-basic.h b/third_party/rust/bindgen/tests/headers/macro-expr-basic.h deleted file mode 100644 index d2de7fdf491c..000000000000 --- a/third_party/rust/bindgen/tests/headers/macro-expr-basic.h +++ /dev/null @@ -1,14 +0,0 @@ -#define FOO 1 -#define BAR 4 -#define BAZ (FOO + BAR) - -#define MIN (1 << 63) - -#define BARR (1 << 0) -#define BAZZ ((1 << 1) + BAZ) -#define I_RAN_OUT_OF_DUMB_NAMES (BARR | BAZZ) - -/* I haz a comment */ -#define HAZ_A_COMMENT BARR - -#define HAZ_A_COMMENT_INSIDE (/* comment for real */ BARR + FOO) diff --git a/third_party/rust/bindgen/tests/headers/macro-redef.h b/third_party/rust/bindgen/tests/headers/macro-redef.h deleted file mode 100644 index 0180d2ab09a0..000000000000 --- a/third_party/rust/bindgen/tests/headers/macro-redef.h +++ /dev/null @@ -1,5 +0,0 @@ -#define FOO 4 -#define BAR (1 + FOO) -#undef FOO -#define FOO 5 -#define BAZ (1 + FOO) diff --git a/third_party/rust/bindgen/tests/headers/macro_const.h b/third_party/rust/bindgen/tests/headers/macro_const.h deleted file mode 100644 index c28a3f6bc875..000000000000 --- a/third_party/rust/bindgen/tests/headers/macro_const.h +++ /dev/null @@ -1,7 +0,0 @@ -#define foo "bar" -#define CHAR 'b' -#define CHARR '\0' -#define FLOAT 5.09f -#define FLOAT_EXPR (5 / 1000.0f) - -#define INVALID_UTF8 "\xf0\x28\x8c\x28" diff --git a/third_party/rust/bindgen/tests/headers/maddness-is-avoidable.hpp b/third_party/rust/bindgen/tests/headers/maddness-is-avoidable.hpp deleted file mode 100644 index 46d7495ead17..000000000000 --- a/third_party/rust/bindgen/tests/headers/maddness-is-avoidable.hpp +++ /dev/null @@ -1,9 +0,0 @@ -// bindgen-flags: --blacklist-type RefPtr_Proxy_member_function - -template -class RefPtr { - template - class Proxy { - typedef R (T::*member_function)(Args...); - }; -}; diff --git a/third_party/rust/bindgen/tests/headers/method-mangling.hpp b/third_party/rust/bindgen/tests/headers/method-mangling.hpp deleted file mode 100644 index 0dac497569f0..000000000000 --- a/third_party/rust/bindgen/tests/headers/method-mangling.hpp +++ /dev/null @@ -1,5 +0,0 @@ - -class Foo { -public: - int type(); -}; diff --git a/third_party/rust/bindgen/tests/headers/module-whitelisted.hpp b/third_party/rust/bindgen/tests/headers/module-whitelisted.hpp deleted file mode 100644 index f41e874edd8d..000000000000 --- a/third_party/rust/bindgen/tests/headers/module-whitelisted.hpp +++ /dev/null @@ -1,2 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces -struct Test {}; diff --git a/third_party/rust/bindgen/tests/headers/msvc-no-usr.hpp b/third_party/rust/bindgen/tests/headers/msvc-no-usr.hpp deleted file mode 100644 index b15e49f52dc5..000000000000 --- a/third_party/rust/bindgen/tests/headers/msvc-no-usr.hpp +++ /dev/null @@ -1,8 +0,0 @@ - -typedef unsigned long long size_t; - -class A { - const size_t foo; - - A() : foo(5) {} -}; diff --git a/third_party/rust/bindgen/tests/headers/multiple-inherit-empty-correct-layout.hpp b/third_party/rust/bindgen/tests/headers/multiple-inherit-empty-correct-layout.hpp deleted file mode 100644 index 1e2b133a0a35..000000000000 --- a/third_party/rust/bindgen/tests/headers/multiple-inherit-empty-correct-layout.hpp +++ /dev/null @@ -1,3 +0,0 @@ -struct Foo {}; -struct Bar {}; -struct Baz : public Foo, public Bar {}; diff --git a/third_party/rust/bindgen/tests/headers/mutable.hpp b/third_party/rust/bindgen/tests/headers/mutable.hpp deleted file mode 100644 index b61a10310141..000000000000 --- a/third_party/rust/bindgen/tests/headers/mutable.hpp +++ /dev/null @@ -1,14 +0,0 @@ -class C { - mutable int m_member; - int m_other; -}; - -class NonCopiable { - mutable int m_member; - - ~NonCopiable() {}; -}; - -class NonCopiableWithNonCopiableMutableMember { - mutable NonCopiable m_member; -}; diff --git a/third_party/rust/bindgen/tests/headers/namespace.hpp b/third_party/rust/bindgen/tests/headers/namespace.hpp deleted file mode 100644 index 657885399888..000000000000 --- a/third_party/rust/bindgen/tests/headers/namespace.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces - -void top_level(); - -namespace whatever { - typedef int whatever_int_t; - - void in_whatever(); -} - -namespace { - namespace empty {} - - void foo(); - struct A { - whatever::whatever_int_t b; - public: - int lets_hope_this_works(); - }; -} - -template -class C: public A { - T m_c; - T* m_c_ptr; - T m_c_arr[10]; -}; - - -template<> -class C; - - -namespace w { - typedef unsigned int whatever_int_t; - - template - class D { - C m_c; - }; - - whatever_int_t heh(); // this should return w::whatever_int_t, and not whatever::whatever_int_t - - C foo(); - - C barr(); // <- This is the problematic one -} diff --git a/third_party/rust/bindgen/tests/headers/nested.hpp b/third_party/rust/bindgen/tests/headers/nested.hpp deleted file mode 100644 index 299e1768d267..000000000000 --- a/third_party/rust/bindgen/tests/headers/nested.hpp +++ /dev/null @@ -1,15 +0,0 @@ - -class Calc { - int w; -}; - -class Test { -public: - struct Size; - friend struct Size; - struct Size { - struct Dimension : public Calc { - }; - Dimension mWidth, mHeight; - }; -}; diff --git a/third_party/rust/bindgen/tests/headers/nested_vtable.hpp b/third_party/rust/bindgen/tests/headers/nested_vtable.hpp deleted file mode 100644 index 87d6ce1f22d7..000000000000 --- a/third_party/rust/bindgen/tests/headers/nested_vtable.hpp +++ /dev/null @@ -1,8 +0,0 @@ -class nsISupports { -public: - virtual nsISupports* QueryInterface(); -}; - -class nsIRunnable : public nsISupports {}; - -class Runnable : public nsIRunnable {}; diff --git a/third_party/rust/bindgen/tests/headers/nested_within_namespace.hpp b/third_party/rust/bindgen/tests/headers/nested_within_namespace.hpp deleted file mode 100644 index a9b7c1ec6a63..000000000000 --- a/third_party/rust/bindgen/tests/headers/nested_within_namespace.hpp +++ /dev/null @@ -1,15 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces - -namespace foo { - class Bar { - int foo; - - class Baz { - int foo; - }; - }; - - class Baz { - int baz; - }; -} diff --git a/third_party/rust/bindgen/tests/headers/no-comments.h b/third_party/rust/bindgen/tests/headers/no-comments.h deleted file mode 100644 index 1ddb1a3b1f32..000000000000 --- a/third_party/rust/bindgen/tests/headers/no-comments.h +++ /dev/null @@ -1,5 +0,0 @@ -// bindgen-flags: --no-doc-comments - -struct Foo { - int s; /*!< Including this will prevent rustc for compiling it */ -}; diff --git a/third_party/rust/bindgen/tests/headers/no-derive-debug.h b/third_party/rust/bindgen/tests/headers/no-derive-debug.h deleted file mode 100644 index c780d2d8f835..000000000000 --- a/third_party/rust/bindgen/tests/headers/no-derive-debug.h +++ /dev/null @@ -1,15 +0,0 @@ -// bindgen-flags: --no-derive-debug --blacklist-type foo --raw-line "#[repr(C)] #[derive(Copy, Clone, Default)] pub struct foo { bar: ::std::os::raw::c_int, }" - -struct foo { - int bar; -}; - -/** - * bar should compile. It will normally derive debug, but our blacklist of foo - * and replacement for another type that doesn't implement it would prevent it - * from building if --no-derive-debug didn't work. - */ -struct bar { - struct foo foo; - int baz; -}; diff --git a/third_party/rust/bindgen/tests/headers/no-derive-default.h b/third_party/rust/bindgen/tests/headers/no-derive-default.h deleted file mode 100644 index 207b93b62f53..000000000000 --- a/third_party/rust/bindgen/tests/headers/no-derive-default.h +++ /dev/null @@ -1,15 +0,0 @@ -// bindgen-flags: --no-derive-default --blacklist-type foo --raw-line "#[repr(C)] #[derive(Copy, Clone, Debug)] pub struct foo { bar: ::std::os::raw::c_int, }" - -struct foo { - int bar; -}; - -/** - * bar should compile. It will normally derive default, but our blacklist of foo - * and replacement for another type that doesn't implement it would prevent it - * from building if --no-derive-default didn't work. - */ -struct bar { - struct foo foo; - int baz; -}; diff --git a/third_party/rust/bindgen/tests/headers/no-recursive-whitelisting.h b/third_party/rust/bindgen/tests/headers/no-recursive-whitelisting.h deleted file mode 100644 index 1d805d93013f..000000000000 --- a/third_party/rust/bindgen/tests/headers/no-recursive-whitelisting.h +++ /dev/null @@ -1,7 +0,0 @@ -// bindgen-flags: --no-recursive-whitelist --whitelist-type "Foo" --raw-line "pub enum Bar {}" - -struct Bar; - -struct Foo { - struct Bar* baz; -}; diff --git a/third_party/rust/bindgen/tests/headers/no-std.h b/third_party/rust/bindgen/tests/headers/no-std.h deleted file mode 100644 index 7bee9657f860..000000000000 --- a/third_party/rust/bindgen/tests/headers/no-std.h +++ /dev/null @@ -1,5 +0,0 @@ -// bindgen-flags: --ctypes-prefix "libc" --use-core --raw-line "#![no_std]" --raw-line "mod libc { pub type c_int = i32; pub enum c_void {} }" -struct foo { - int a, b; - void* bar; -}; diff --git a/third_party/rust/bindgen/tests/headers/no_copy.hpp b/third_party/rust/bindgen/tests/headers/no_copy.hpp deleted file mode 100644 index 349e428e0292..000000000000 --- a/third_party/rust/bindgen/tests/headers/no_copy.hpp +++ /dev/null @@ -1,6 +0,0 @@ - -/**
    */ -template -class CopiableButWait { - int whatever; -}; diff --git a/third_party/rust/bindgen/tests/headers/nsStyleAutoArray.hpp b/third_party/rust/bindgen/tests/headers/nsStyleAutoArray.hpp deleted file mode 100644 index 950152c0fd0a..000000000000 --- a/third_party/rust/bindgen/tests/headers/nsStyleAutoArray.hpp +++ /dev/null @@ -1,57 +0,0 @@ - -template -class nsTArray { - T* mBuff; -}; - -template -class nsStyleAutoArray -{ -public: - // This constructor places a single element in mFirstElement. - enum WithSingleInitialElement { WITH_SINGLE_INITIAL_ELEMENT }; - explicit nsStyleAutoArray(WithSingleInitialElement) {} - nsStyleAutoArray(const nsStyleAutoArray& aOther) { *this = aOther; } - nsStyleAutoArray& operator=(const nsStyleAutoArray& aOther) { - mFirstElement = aOther.mFirstElement; - mOtherElements = aOther.mOtherElements; - return *this; - } - - bool operator==(const nsStyleAutoArray& aOther) const { - return Length() == aOther.Length() && - mFirstElement == aOther.mFirstElement && - mOtherElements == aOther.mOtherElements; - } - bool operator!=(const nsStyleAutoArray& aOther) const { - return !(*this == aOther); - } - - unsigned long Length() const { - return mOtherElements.Length() + 1; - } - const T& operator[](unsigned long aIndex) const { - return aIndex == 0 ? mFirstElement : mOtherElements[aIndex - 1]; - } - T& operator[](unsigned long aIndex) { - return aIndex == 0 ? mFirstElement : mOtherElements[aIndex - 1]; - } - - void EnsureLengthAtLeast(unsigned long aMinLen) { - if (aMinLen > 0) { - mOtherElements.EnsureLengthAtLeast(aMinLen - 1); - } - } - - void SetLengthNonZero(unsigned long aNewLen) { - mOtherElements.SetLength(aNewLen - 1); - } - - void TruncateLengthNonZero(unsigned long aNewLen) { - mOtherElements.TruncateLength(aNewLen - 1); - } - -private: - T mFirstElement; - nsTArray mOtherElements; -}; diff --git a/third_party/rust/bindgen/tests/headers/objc_interface.h b/third_party/rust/bindgen/tests/headers/objc_interface.h deleted file mode 100644 index af84bf925a85..000000000000 --- a/third_party/rust/bindgen/tests/headers/objc_interface.h +++ /dev/null @@ -1,8 +0,0 @@ -// bindgen-flags: --objc-extern-crate -- -x objective-c -// bindgen-osx-only - -@interface Foo -@end - -@protocol bar -@end diff --git a/third_party/rust/bindgen/tests/headers/objc_interface_type.h b/third_party/rust/bindgen/tests/headers/objc_interface_type.h deleted file mode 100644 index 31d33664c1f1..000000000000 --- a/third_party/rust/bindgen/tests/headers/objc_interface_type.h +++ /dev/null @@ -1,13 +0,0 @@ -// bindgen-flags: --objc-extern-crate -- -x objective-c -// bindgen-osx-only - -@interface Foo -@end - -struct FooStruct { - Foo *foo; -}; - -void fooFunc(Foo *foo); - -static const Foo *kFoo; diff --git a/third_party/rust/bindgen/tests/headers/objc_method.h b/third_party/rust/bindgen/tests/headers/objc_method.h deleted file mode 100644 index 7a22e8e44ec8..000000000000 --- a/third_party/rust/bindgen/tests/headers/objc_method.h +++ /dev/null @@ -1,11 +0,0 @@ -// bindgen-flags: --objc-extern-crate -- -x objective-c -// bindgen-osx-only - -@interface Foo -- (void)method; -- (void)methodWithInt:(int)foo; -- (void)methodWithFoo:(Foo*)foo; -- (int)methodReturningInt; -- (Foo*)methodReturningFoo; -- (void)methodWithArg1:(int)intvalue andArg2:(char*)ptr andArg3:(float)floatvalue; -@end diff --git a/third_party/rust/bindgen/tests/headers/only_bitfields.hpp b/third_party/rust/bindgen/tests/headers/only_bitfields.hpp deleted file mode 100644 index 84db0586ecb2..000000000000 --- a/third_party/rust/bindgen/tests/headers/only_bitfields.hpp +++ /dev/null @@ -1,5 +0,0 @@ -// bindgen-flags: --no-unstable-rust -class C { - bool a: 1; - bool b: 7; -}; diff --git a/third_party/rust/bindgen/tests/headers/opaque-tracing.hpp b/third_party/rust/bindgen/tests/headers/opaque-tracing.hpp deleted file mode 100644 index 7356245e554b..000000000000 --- a/third_party/rust/bindgen/tests/headers/opaque-tracing.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// bindgen-flags: --opaque-type=.* --whitelist-function=foo - -class Container; - -// The whitelist tracing should reach the Container type, even though it's -// marked as opaque. -void foo(Container* c); - -template -class Wat { - T foo; -}; - -class OtherOpaque { - int bar; -}; - -class Container { - Wat bar; - OtherOpaque baz; -}; diff --git a/third_party/rust/bindgen/tests/headers/opaque_in_struct.hpp b/third_party/rust/bindgen/tests/headers/opaque_in_struct.hpp deleted file mode 100644 index 3cffeb200a59..000000000000 --- a/third_party/rust/bindgen/tests/headers/opaque_in_struct.hpp +++ /dev/null @@ -1,10 +0,0 @@ - - -/**
    */ -typedef struct opaque { - int waht; -} opaque; - -struct container { - opaque contained; -}; diff --git a/third_party/rust/bindgen/tests/headers/opaque_pointer.hpp b/third_party/rust/bindgen/tests/headers/opaque_pointer.hpp deleted file mode 100644 index 53f8ce1fa836..000000000000 --- a/third_party/rust/bindgen/tests/headers/opaque_pointer.hpp +++ /dev/null @@ -1,22 +0,0 @@ - -/** - *
    - */ -struct OtherOpaque { - int c; -}; - -/** - *
    - */ -template -struct Opaque { - T whatever; -}; - -struct WithOpaquePtr { - Opaque* whatever; - Opaque other; - OtherOpaque t; -}; - diff --git a/third_party/rust/bindgen/tests/headers/opaque_typedef.hpp b/third_party/rust/bindgen/tests/headers/opaque_typedef.hpp deleted file mode 100644 index 25640738571e..000000000000 --- a/third_party/rust/bindgen/tests/headers/opaque_typedef.hpp +++ /dev/null @@ -1,17 +0,0 @@ -// bindgen-flags: -- -std=c++11 -template -class RandomTemplate; - -template -class Wat; - -template -class Wat3; - -template<> -class Wat3<3>; - -/**
    */ -typedef RandomTemplate ShouldBeOpaque; - -typedef RandomTemplate ShouldNotBeOpaque; diff --git a/third_party/rust/bindgen/tests/headers/overflowed_enum.hpp b/third_party/rust/bindgen/tests/headers/overflowed_enum.hpp deleted file mode 100644 index 1f2075a57fda..000000000000 --- a/third_party/rust/bindgen/tests/headers/overflowed_enum.hpp +++ /dev/null @@ -1,12 +0,0 @@ -// bindgen-flags: -- -std=c++11 -Wno-narrowing - -enum Foo { - BAP_ARM = 0x93fcb9, - BAP_X86 = 0xb67eed, - BAP_X86_64 = 0xba7b274f, -}; - -enum Bar: unsigned short { - One = 1, - Big = 65538, -}; diff --git a/third_party/rust/bindgen/tests/headers/overloading.hpp b/third_party/rust/bindgen/tests/headers/overloading.hpp deleted file mode 100644 index 3c2b04875b9f..000000000000 --- a/third_party/rust/bindgen/tests/headers/overloading.hpp +++ /dev/null @@ -1,9 +0,0 @@ -extern bool Evaluate(char r); -extern bool Evaluate(int x, int y); - -namespace foo { - extern void MyFunction(); -} -namespace bar { - extern void MyFunction(); -} diff --git a/third_party/rust/bindgen/tests/headers/private.hpp b/third_party/rust/bindgen/tests/headers/private.hpp deleted file mode 100644 index c0f3ce7f508e..000000000000 --- a/third_party/rust/bindgen/tests/headers/private.hpp +++ /dev/null @@ -1,21 +0,0 @@ - -struct HasPrivate { - int mNotPrivate; - /**
    */ - int mIsPrivate; -}; - - -/**
    */ -struct VeryPrivate { - int mIsPrivate; - int mIsAlsoPrivate; -}; - - -/**
    */ -struct ContradictPrivate { - /**
    */ - int mNotPrivate; - int mIsPrivate; -}; diff --git a/third_party/rust/bindgen/tests/headers/public-dtor.hpp b/third_party/rust/bindgen/tests/headers/public-dtor.hpp deleted file mode 100644 index 5d4fb592a1a8..000000000000 --- a/third_party/rust/bindgen/tests/headers/public-dtor.hpp +++ /dev/null @@ -1,15 +0,0 @@ - - -namespace cv { -class String { -public: - ~String(); -}; - - -inline -String::~String() -{ -} - -} diff --git a/third_party/rust/bindgen/tests/headers/redeclaration.hpp b/third_party/rust/bindgen/tests/headers/redeclaration.hpp deleted file mode 100644 index d536b158b484..000000000000 --- a/third_party/rust/bindgen/tests/headers/redeclaration.hpp +++ /dev/null @@ -1,7 +0,0 @@ -extern "C" { - void foo(); -} - -extern "C" { - void foo(); -} diff --git a/third_party/rust/bindgen/tests/headers/ref_argument_array.hpp b/third_party/rust/bindgen/tests/headers/ref_argument_array.hpp deleted file mode 100644 index dc73fd629325..000000000000 --- a/third_party/rust/bindgen/tests/headers/ref_argument_array.hpp +++ /dev/null @@ -1,6 +0,0 @@ - -#define NSID_LENGTH 10 -class nsID { -public: - virtual void ToProvidedString(char (&aDest)[NSID_LENGTH]) = 0; -}; diff --git a/third_party/rust/bindgen/tests/headers/reparented_replacement.hpp b/third_party/rust/bindgen/tests/headers/reparented_replacement.hpp deleted file mode 100644 index 4ac2bf03c8f2..000000000000 --- a/third_party/rust/bindgen/tests/headers/reparented_replacement.hpp +++ /dev/null @@ -1,16 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces - -namespace foo { - struct Bar { - int baz; - }; -} - -namespace bar { - ///
    - struct Bar_Replacement { - int bazz; - }; -}; - -typedef foo::Bar ReferencesBar; diff --git a/third_party/rust/bindgen/tests/headers/replace_template_alias.hpp b/third_party/rust/bindgen/tests/headers/replace_template_alias.hpp deleted file mode 100644 index c325b5a38eea..000000000000 --- a/third_party/rust/bindgen/tests/headers/replace_template_alias.hpp +++ /dev/null @@ -1,23 +0,0 @@ -// bindgen-flags: -- --std=c++14 - -namespace JS { -namespace detail { - -/// Notice how this doesn't use T. -template -using MaybeWrapped = int; - -} - -template -class Rooted { - detail::MaybeWrapped ptr; -}; - -} - -/// But the replacement type does use T! -/// -///
    -template -using replaces_MaybeWrapped = T; diff --git a/third_party/rust/bindgen/tests/headers/replace_use.hpp b/third_party/rust/bindgen/tests/headers/replace_use.hpp deleted file mode 100644 index de44eb19cc0c..000000000000 --- a/third_party/rust/bindgen/tests/headers/replace_use.hpp +++ /dev/null @@ -1,15 +0,0 @@ -template -struct nsTArray { - int x; -}; -/** - *
    - */ -template -struct nsTArray_Simple { - unsigned int y; -}; - -struct Test { - nsTArray a; -}; diff --git a/third_party/rust/bindgen/tests/headers/replaces_double.hpp b/third_party/rust/bindgen/tests/headers/replaces_double.hpp deleted file mode 100644 index 1a78b0d92b87..000000000000 --- a/third_party/rust/bindgen/tests/headers/replaces_double.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// bindgen-flags: --blacklist-type Wrapper -- --std=c++11 - -template -struct Wrapper { - struct Wrapped { - T t; - }; - using Type = Wrapped; -}; - -template -class Rooted { - using MaybeWrapped = typename Wrapper::Type; - MaybeWrapped ptr; - - /** - *
    - */ - using MaybeWrapped_simple = T; -}; diff --git a/third_party/rust/bindgen/tests/headers/resolved_type_def_function.h b/third_party/rust/bindgen/tests/headers/resolved_type_def_function.h deleted file mode 100644 index 139b8c3e85ce..000000000000 --- a/third_party/rust/bindgen/tests/headers/resolved_type_def_function.h +++ /dev/null @@ -1,2 +0,0 @@ -typedef void (FuncType) (); -extern FuncType Func; \ No newline at end of file diff --git a/third_party/rust/bindgen/tests/headers/same_struct_name_in_different_namespaces.hpp b/third_party/rust/bindgen/tests/headers/same_struct_name_in_different_namespaces.hpp deleted file mode 100644 index fe6858458fff..000000000000 --- a/third_party/rust/bindgen/tests/headers/same_struct_name_in_different_namespaces.hpp +++ /dev/null @@ -1,12 +0,0 @@ -namespace JS { - - struct Zone; - - namespace shadow { - - struct Zone { - int x; - int y; - }; - } -} diff --git a/third_party/rust/bindgen/tests/headers/size_t_template.hpp b/third_party/rust/bindgen/tests/headers/size_t_template.hpp deleted file mode 100644 index 6045c698b6d5..000000000000 --- a/third_party/rust/bindgen/tests/headers/size_t_template.hpp +++ /dev/null @@ -1,8 +0,0 @@ -template -class Array { - T inner[N]; -}; - -class C { - Array arr; -}; diff --git a/third_party/rust/bindgen/tests/headers/struct_containing_forward_declared_struct.h b/third_party/rust/bindgen/tests/headers/struct_containing_forward_declared_struct.h deleted file mode 100644 index d38aca2fc71e..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_containing_forward_declared_struct.h +++ /dev/null @@ -1,7 +0,0 @@ -struct a { - struct b* val_a; -}; - -struct b { - int val_b; -}; diff --git a/third_party/rust/bindgen/tests/headers/struct_typedef.h b/third_party/rust/bindgen/tests/headers/struct_typedef.h deleted file mode 100644 index fdce9a721dd2..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_typedef.h +++ /dev/null @@ -1,15 +0,0 @@ -typedef struct { - _Bool has_name; -} typedef_named_struct; - -typedef struct { - void *no_name; -} *struct_ptr_t, **struct_ptr_ptr_t; - -typedef enum { - ENUM_HAS_NAME=1 -} typedef_named_enum; - -typedef enum { - ENUM_IS_ANON -} *enum_ptr_t, **enum_ptr_ptr_t; diff --git a/third_party/rust/bindgen/tests/headers/struct_typedef_ns.hpp b/third_party/rust/bindgen/tests/headers/struct_typedef_ns.hpp deleted file mode 100644 index bc89eb2be30f..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_typedef_ns.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces - -namespace whatever { - typedef struct { - int foo; - } typedef_struct; - - typedef enum { - BAR=1 - } typedef_enum; -} - -namespace { - typedef struct { - int foo; - } typedef_struct; - - typedef enum { - BAR=1 - } typedef_enum; -} diff --git a/third_party/rust/bindgen/tests/headers/struct_with_anon_struct.h b/third_party/rust/bindgen/tests/headers/struct_with_anon_struct.h deleted file mode 100644 index 1617d7a8dc4e..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_with_anon_struct.h +++ /dev/null @@ -1,6 +0,0 @@ -struct foo { - struct { - int a; - int b; - } bar; -}; diff --git a/third_party/rust/bindgen/tests/headers/struct_with_anon_struct_array.h b/third_party/rust/bindgen/tests/headers/struct_with_anon_struct_array.h deleted file mode 100644 index 9ea977e8d79c..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_with_anon_struct_array.h +++ /dev/null @@ -1,10 +0,0 @@ -struct foo { - struct { - int a; - int b; - } bar[2]; - struct { - int a; - int b; - } baz[2][3][4]; -}; diff --git a/third_party/rust/bindgen/tests/headers/struct_with_anon_struct_pointer.h b/third_party/rust/bindgen/tests/headers/struct_with_anon_struct_pointer.h deleted file mode 100644 index 0c486d84f56c..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_with_anon_struct_pointer.h +++ /dev/null @@ -1,6 +0,0 @@ -struct foo { - struct { - int a; - int b; - } *bar; -}; diff --git a/third_party/rust/bindgen/tests/headers/struct_with_anon_union.h b/third_party/rust/bindgen/tests/headers/struct_with_anon_union.h deleted file mode 100644 index 3a92b940724b..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_with_anon_union.h +++ /dev/null @@ -1,6 +0,0 @@ -struct foo { - union { - unsigned int a; - unsigned short b; - } bar; -}; diff --git a/third_party/rust/bindgen/tests/headers/struct_with_anon_unnamed_struct.h b/third_party/rust/bindgen/tests/headers/struct_with_anon_unnamed_struct.h deleted file mode 100644 index f8ac4225999c..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_with_anon_unnamed_struct.h +++ /dev/null @@ -1,6 +0,0 @@ -struct foo { - struct { - unsigned int a; - unsigned int b; - }; -}; diff --git a/third_party/rust/bindgen/tests/headers/struct_with_anon_unnamed_union.h b/third_party/rust/bindgen/tests/headers/struct_with_anon_unnamed_union.h deleted file mode 100644 index 7158e727c659..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_with_anon_unnamed_union.h +++ /dev/null @@ -1,6 +0,0 @@ -struct foo { - union { - unsigned int a; - unsigned short b; - }; -}; diff --git a/third_party/rust/bindgen/tests/headers/struct_with_bitfields.h b/third_party/rust/bindgen/tests/headers/struct_with_bitfields.h deleted file mode 100644 index 107fb136961e..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_with_bitfields.h +++ /dev/null @@ -1,13 +0,0 @@ -// bindgen-flags: --no-unstable-rust -struct bitfield { - unsigned short - a :1, - b :1, - c :1, - :1, - :2, - d :2; - int e; - unsigned int f : 2; - unsigned int g : 32; -}; diff --git a/third_party/rust/bindgen/tests/headers/struct_with_derive_debug.h b/third_party/rust/bindgen/tests/headers/struct_with_derive_debug.h deleted file mode 100644 index 98ba1b3d605f..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_with_derive_debug.h +++ /dev/null @@ -1,15 +0,0 @@ -struct LittleArray { - int a[32]; -}; - -struct BigArray{ - int a[33]; -}; - -struct WithLittleArray { - struct LittleArray a; -}; - -struct WithBigArray { - struct BigArray a; -}; diff --git a/third_party/rust/bindgen/tests/headers/struct_with_nesting.h b/third_party/rust/bindgen/tests/headers/struct_with_nesting.h deleted file mode 100644 index 9d7fa176270e..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_with_nesting.h +++ /dev/null @@ -1,17 +0,0 @@ -struct foo { - unsigned int a; - union { - unsigned int b; - struct { - unsigned short c1; - unsigned short c2; - }; - - struct { - unsigned char d1; - unsigned char d2; - unsigned char d3; - unsigned char d4; - }; - }; -}; diff --git a/third_party/rust/bindgen/tests/headers/struct_with_packing.h b/third_party/rust/bindgen/tests/headers/struct_with_packing.h deleted file mode 100644 index 1b9fe131938a..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_with_packing.h +++ /dev/null @@ -1,4 +0,0 @@ -struct a { - char b; - short c; -} __attribute__((packed)); diff --git a/third_party/rust/bindgen/tests/headers/struct_with_struct.h b/third_party/rust/bindgen/tests/headers/struct_with_struct.h deleted file mode 100644 index 78b1cc81c662..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_with_struct.h +++ /dev/null @@ -1,6 +0,0 @@ -struct foo { - struct { - unsigned int x; - unsigned int y; - } bar; -}; diff --git a/third_party/rust/bindgen/tests/headers/struct_with_typedef_template_arg.hpp b/third_party/rust/bindgen/tests/headers/struct_with_typedef_template_arg.hpp deleted file mode 100644 index 7fed21ab181c..000000000000 --- a/third_party/rust/bindgen/tests/headers/struct_with_typedef_template_arg.hpp +++ /dev/null @@ -1,4 +0,0 @@ -template -struct Proxy { - typedef void (*foo)(T* bar); -}; diff --git a/third_party/rust/bindgen/tests/headers/template-fun-ty.hpp b/third_party/rust/bindgen/tests/headers/template-fun-ty.hpp deleted file mode 100644 index 1e8e1c25f74e..000000000000 --- a/third_party/rust/bindgen/tests/headers/template-fun-ty.hpp +++ /dev/null @@ -1,16 +0,0 @@ -template -class Foo -{ - typedef T (FunctionPtr)(); -}; - -template -class RefPtr { - template - class Proxy { - typedef R (T::*member_function)(Args...); - }; -}; - -template -using Returner = T(*)(); diff --git a/third_party/rust/bindgen/tests/headers/template.hpp b/third_party/rust/bindgen/tests/headers/template.hpp deleted file mode 100644 index c13643c3981f..000000000000 --- a/third_party/rust/bindgen/tests/headers/template.hpp +++ /dev/null @@ -1,144 +0,0 @@ -template class Foo { - T m_member; - T* m_member_ptr; - T m_member_arr[1]; -}; - -void bar(Foo foo); - -template -class D { - typedef Foo MyFoo; - - MyFoo m_foo; - - template - class U { - MyFoo m_nested_foo; - Z m_baz; - }; -}; - -template -class Rooted { - T* prev; - Rooted* next; - T ptr; -}; - -class RootedContainer { - Rooted root; -}; - -template -class WithDtor; - -typedef WithDtor WithDtorIntFwd; - -template -class WithDtor { - T member; - ~WithDtor() {} -}; - -class PODButContainsDtor { - WithDtorIntFwd member; -}; - - -/**
    */ -template -class Opaque { - T member; -}; - -class POD { - Opaque opaque_member; -}; - -/** - *
    - */ -template -class Nested { - T* buff; -}; - -template -class NestedBase { - T* buff; -}; - -template -class NestedReplaced: public NestedBase { -}; - -template -class Incomplete; - -template -class NestedContainer { - T c; -private: - NestedReplaced nested; - Incomplete inc; -}; - -template -class Incomplete { - T d; -}; - -class Untemplated {}; - -template -class Templated { - Untemplated m_untemplated; -}; - -/** - * If the replacement doesn't happen at the parse level the container would be - * copy and the replacement wouldn't, so this wouldn't compile. - * - *
    - */ -template -class ReplacedWithDestructor { - T* buff; - ~ReplacedWithDestructor() {}; -}; - -template -class ReplacedWithoutDestructor { - T* buff; -}; - -template -class ReplacedWithoutDestructorFwd; - -template -class ShouldNotBeCopiable { - ReplacedWithoutDestructor m_member; -}; - -template -class ShouldNotBeCopiableAsWell { - ReplacedWithoutDestructorFwd m_member; -}; - -/** - * If the replacement doesn't happen at the parse level the container would be - * copy and the replacement wouldn't, so this wouldn't compile. - * - *
    - */ -template -class ReplacedWithDestructorDeclaredAfter { - T* buff; - ~ReplacedWithDestructorDeclaredAfter() {}; -}; - -template -class TemplateWithVar { - static T var = 0; -}; diff --git a/third_party/rust/bindgen/tests/headers/template_alias.hpp b/third_party/rust/bindgen/tests/headers/template_alias.hpp deleted file mode 100644 index 646d9f40fd5d..000000000000 --- a/third_party/rust/bindgen/tests/headers/template_alias.hpp +++ /dev/null @@ -1,13 +0,0 @@ -// bindgen-flags: -- -std=c++14 - -namespace JS { -namespace detail { - template - using Wrapped = T; -} - -template -struct Rooted { - detail::Wrapped ptr; -}; -} diff --git a/third_party/rust/bindgen/tests/headers/template_alias_basic.hpp b/third_party/rust/bindgen/tests/headers/template_alias_basic.hpp deleted file mode 100644 index 964f6e27f607..000000000000 --- a/third_party/rust/bindgen/tests/headers/template_alias_basic.hpp +++ /dev/null @@ -1,4 +0,0 @@ -// bindgen-flags: -- -std=c++11 - -template -using Wrapped = T; diff --git a/third_party/rust/bindgen/tests/headers/template_alias_namespace.hpp b/third_party/rust/bindgen/tests/headers/template_alias_namespace.hpp deleted file mode 100644 index bd6371663af0..000000000000 --- a/third_party/rust/bindgen/tests/headers/template_alias_namespace.hpp +++ /dev/null @@ -1,13 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces -- -std=c++14 - -namespace JS { -namespace detail { - template - using Wrapped = T; -} - -template -struct Rooted { - detail::Wrapped ptr; -}; -} diff --git a/third_party/rust/bindgen/tests/headers/template_partial_specification.hpp b/third_party/rust/bindgen/tests/headers/template_partial_specification.hpp deleted file mode 100644 index fe1be6586852..000000000000 --- a/third_party/rust/bindgen/tests/headers/template_partial_specification.hpp +++ /dev/null @@ -1,10 +0,0 @@ -// bindgen-flags: -- --target=x86_64-pc-win32 - -template -struct nsRunnableMethodTraits; - -template -struct nsRunnableMethodTraits -{ - static const bool can_cancel = Cancelable; -}; diff --git a/third_party/rust/bindgen/tests/headers/template_typedef_transitive_param.hpp b/third_party/rust/bindgen/tests/headers/template_typedef_transitive_param.hpp deleted file mode 100644 index 2269ac369ede..000000000000 --- a/third_party/rust/bindgen/tests/headers/template_typedef_transitive_param.hpp +++ /dev/null @@ -1,7 +0,0 @@ -template -struct Wrapper { - struct Wrapped { - T t; - }; - using Type = Wrapped; -}; diff --git a/third_party/rust/bindgen/tests/headers/template_typedefs.hpp b/third_party/rust/bindgen/tests/headers/template_typedefs.hpp deleted file mode 100644 index 5e13dcd837c2..000000000000 --- a/third_party/rust/bindgen/tests/headers/template_typedefs.hpp +++ /dev/null @@ -1,8 +0,0 @@ -typedef void (*foo)(int); - -template -class Foo { - typedef T Char; - typedef Char* FooPtrTypedef; - typedef bool (*nsCOMArrayEnumFunc)(T* aElement, void* aData); -}; diff --git a/third_party/rust/bindgen/tests/headers/templateref_opaque.hpp b/third_party/rust/bindgen/tests/headers/templateref_opaque.hpp deleted file mode 100644 index ca154c34c94f..000000000000 --- a/third_party/rust/bindgen/tests/headers/templateref_opaque.hpp +++ /dev/null @@ -1,11 +0,0 @@ - -namespace detail { -template -struct PointerType { - typedef T* Type; -}; -} -template -class UniquePtr { - typedef typename detail::PointerType Pointer; -}; diff --git a/third_party/rust/bindgen/tests/headers/type-referenced-by-whitelisted-function.h b/third_party/rust/bindgen/tests/headers/type-referenced-by-whitelisted-function.h deleted file mode 100644 index 86b0030300bd..000000000000 --- a/third_party/rust/bindgen/tests/headers/type-referenced-by-whitelisted-function.h +++ /dev/null @@ -1,7 +0,0 @@ -// bindgen-flags: --whitelist-function dl_iterate_phdr - -struct dl_phdr_info { - int x; -}; - -int dl_iterate_phdr(struct dl_phdr_info *); diff --git a/third_party/rust/bindgen/tests/headers/type_alias_empty.hpp b/third_party/rust/bindgen/tests/headers/type_alias_empty.hpp deleted file mode 100644 index f0760c8ffd31..000000000000 --- a/third_party/rust/bindgen/tests/headers/type_alias_empty.hpp +++ /dev/null @@ -1,10 +0,0 @@ -// bindgen-flags: --whitelist-type bool_constant -- -std=c++11 - -// NB: The --whitelist-type is done to trigger the traversal of the types on -// codegen in order to trigger #67. - -template -struct integral_constant {}; - -template -using bool_constant = integral_constant; diff --git a/third_party/rust/bindgen/tests/headers/type_alias_partial_template_especialization.hpp b/third_party/rust/bindgen/tests/headers/type_alias_partial_template_especialization.hpp deleted file mode 100644 index dfc36786c491..000000000000 --- a/third_party/rust/bindgen/tests/headers/type_alias_partial_template_especialization.hpp +++ /dev/null @@ -1,7 +0,0 @@ -// bindgen-flags: -- -std=c++14 -template using MaybeWrapped = A; - -template -class Rooted { - MaybeWrapped ptr; -}; diff --git a/third_party/rust/bindgen/tests/headers/type_alias_template_specialized.hpp b/third_party/rust/bindgen/tests/headers/type_alias_template_specialized.hpp deleted file mode 100644 index a2d32b56a145..000000000000 --- a/third_party/rust/bindgen/tests/headers/type_alias_template_specialized.hpp +++ /dev/null @@ -1,9 +0,0 @@ -// bindgen-flags: --whitelist-type Rooted -- -std=c++14 - -template using MaybeWrapped = a; -class Rooted { - MaybeWrapped ptr; -}; - -///
    -template using replaces_MaybeWrapped = a; diff --git a/third_party/rust/bindgen/tests/headers/typedefd-array-as-function-arg.h b/third_party/rust/bindgen/tests/headers/typedefd-array-as-function-arg.h deleted file mode 100644 index 937905918c16..000000000000 --- a/third_party/rust/bindgen/tests/headers/typedefd-array-as-function-arg.h +++ /dev/null @@ -1,3 +0,0 @@ -// foo.h -typedef float myVector3[3]; -void modifyVectorFunc(myVector3 v); diff --git a/third_party/rust/bindgen/tests/headers/typeref.hpp b/third_party/rust/bindgen/tests/headers/typeref.hpp deleted file mode 100644 index b94c98ef6b6d..000000000000 --- a/third_party/rust/bindgen/tests/headers/typeref.hpp +++ /dev/null @@ -1,28 +0,0 @@ -struct nsFoo; - -namespace mozilla { - -struct FragmentOrURL { bool mIsLocalRef; }; -struct Position { }; - -} // namespace mozilla - -class Bar { - nsFoo* mFoo; -}; - -namespace mozilla { - -template -struct StyleShapeSource { - union { - Position* mPosition; - FragmentOrURL* mFragmentOrURL; - }; -}; - -} // namespace mozilla - -struct nsFoo { - mozilla::StyleShapeSource mBar; -}; diff --git a/third_party/rust/bindgen/tests/headers/union-in-ns.hpp b/third_party/rust/bindgen/tests/headers/union-in-ns.hpp deleted file mode 100644 index 68b8f72d6eb0..000000000000 --- a/third_party/rust/bindgen/tests/headers/union-in-ns.hpp +++ /dev/null @@ -1,5 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces - -union bar { - int baz; -}; diff --git a/third_party/rust/bindgen/tests/headers/union_dtor.hpp b/third_party/rust/bindgen/tests/headers/union_dtor.hpp deleted file mode 100644 index 399dc89db608..000000000000 --- a/third_party/rust/bindgen/tests/headers/union_dtor.hpp +++ /dev/null @@ -1,5 +0,0 @@ -union UnionWithDtor { - ~UnionWithDtor(); - int mFoo; - void* mBar; -}; diff --git a/third_party/rust/bindgen/tests/headers/union_fields.hpp b/third_party/rust/bindgen/tests/headers/union_fields.hpp deleted file mode 100644 index aec3a7fdf429..000000000000 --- a/third_party/rust/bindgen/tests/headers/union_fields.hpp +++ /dev/null @@ -1,5 +0,0 @@ -typedef union { - int mInt; - float mFloat; - void* mPointer; -} nsStyleUnion; diff --git a/third_party/rust/bindgen/tests/headers/union_template.hpp b/third_party/rust/bindgen/tests/headers/union_template.hpp deleted file mode 100644 index 0d0a9bb31dda..000000000000 --- a/third_party/rust/bindgen/tests/headers/union_template.hpp +++ /dev/null @@ -1,19 +0,0 @@ -template -struct NastyStruct { - bool mIsSome; - union { - void* mFoo; - unsigned long mDummy; - } mStorage; - - union { - short wat; - int* wut; - }; -}; - -template -union Whatever { - void* mTPtr; - int mInt; -}; diff --git a/third_party/rust/bindgen/tests/headers/union_with_anon_struct.h b/third_party/rust/bindgen/tests/headers/union_with_anon_struct.h deleted file mode 100644 index 7f8dec953f45..000000000000 --- a/third_party/rust/bindgen/tests/headers/union_with_anon_struct.h +++ /dev/null @@ -1,6 +0,0 @@ -union foo { - struct { - unsigned int a; - unsigned int b; - } bar; -}; diff --git a/third_party/rust/bindgen/tests/headers/union_with_anon_struct_bitfield.h b/third_party/rust/bindgen/tests/headers/union_with_anon_struct_bitfield.h deleted file mode 100644 index 24c7dce8491f..000000000000 --- a/third_party/rust/bindgen/tests/headers/union_with_anon_struct_bitfield.h +++ /dev/null @@ -1,8 +0,0 @@ -// bindgen-flags: --no-unstable-rust -union foo { - int a; - struct { - int b : 7; - int c : 25; - }; -}; diff --git a/third_party/rust/bindgen/tests/headers/union_with_anon_union.h b/third_party/rust/bindgen/tests/headers/union_with_anon_union.h deleted file mode 100644 index 212431b8950e..000000000000 --- a/third_party/rust/bindgen/tests/headers/union_with_anon_union.h +++ /dev/null @@ -1,6 +0,0 @@ -union foo { - union { - unsigned int a; - unsigned short b; - } bar; -}; diff --git a/third_party/rust/bindgen/tests/headers/union_with_anon_unnamed_struct.h b/third_party/rust/bindgen/tests/headers/union_with_anon_unnamed_struct.h deleted file mode 100644 index 79558049edbd..000000000000 --- a/third_party/rust/bindgen/tests/headers/union_with_anon_unnamed_struct.h +++ /dev/null @@ -1,9 +0,0 @@ -union pixel { - unsigned int rgba; - struct { - unsigned char r; - unsigned char g; - unsigned char b; - unsigned char a; - }; -}; diff --git a/third_party/rust/bindgen/tests/headers/union_with_anon_unnamed_union.h b/third_party/rust/bindgen/tests/headers/union_with_anon_unnamed_union.h deleted file mode 100644 index 7580771ae0a3..000000000000 --- a/third_party/rust/bindgen/tests/headers/union_with_anon_unnamed_union.h +++ /dev/null @@ -1,7 +0,0 @@ -union foo { - unsigned int a; - union { - unsigned short b; - unsigned char c; - }; -}; diff --git a/third_party/rust/bindgen/tests/headers/union_with_big_member.h b/third_party/rust/bindgen/tests/headers/union_with_big_member.h deleted file mode 100644 index 6347d6cad3e5..000000000000 --- a/third_party/rust/bindgen/tests/headers/union_with_big_member.h +++ /dev/null @@ -1,14 +0,0 @@ -union WithBigArray { - int a; - int b[33]; -}; - -union WithBigArray2 { - int a; - char b[33]; -}; - -union WithBigMember { - int a; - union WithBigArray b; -}; diff --git a/third_party/rust/bindgen/tests/headers/union_with_nesting.h b/third_party/rust/bindgen/tests/headers/union_with_nesting.h deleted file mode 100644 index cd907d57f28d..000000000000 --- a/third_party/rust/bindgen/tests/headers/union_with_nesting.h +++ /dev/null @@ -1,14 +0,0 @@ -union foo { - unsigned int a; - struct { - union { - unsigned short b1; - unsigned short b2; - }; - - union { - unsigned short c1; - unsigned short c2; - }; - }; -}; diff --git a/third_party/rust/bindgen/tests/headers/unknown_attr.h b/third_party/rust/bindgen/tests/headers/unknown_attr.h deleted file mode 100644 index 1e89fb14dd4d..000000000000 --- a/third_party/rust/bindgen/tests/headers/unknown_attr.h +++ /dev/null @@ -1,6 +0,0 @@ -typedef struct { - long long __clang_max_align_nonce1 - __attribute__((__aligned__(__alignof__(long long)))); - long long __clang_max_align_nonce2 - __attribute__((__aligned__(__alignof__(long double)))); -} max_align_t; diff --git a/third_party/rust/bindgen/tests/headers/use-core.h b/third_party/rust/bindgen/tests/headers/use-core.h deleted file mode 100644 index 0e8a8d6e5d69..000000000000 --- a/third_party/rust/bindgen/tests/headers/use-core.h +++ /dev/null @@ -1,13 +0,0 @@ -// bindgen-flags: --use-core --raw-line "extern crate core;" - -struct foo { - int a, b; - void* bar; -}; - -union { - int bar; - long baz; -} bazz; - -typedef void (*fooFunction)(int bar); diff --git a/third_party/rust/bindgen/tests/headers/using.hpp b/third_party/rust/bindgen/tests/headers/using.hpp deleted file mode 100644 index ba07b9c8a45a..000000000000 --- a/third_party/rust/bindgen/tests/headers/using.hpp +++ /dev/null @@ -1,11 +0,0 @@ -// bindgen-flags: -- -std=c++11 - -template -class Point { - T x; - T y; -}; - -typedef Point IntPoint2D; - -using IntVec2D = Point; diff --git a/third_party/rust/bindgen/tests/headers/var-tracing.hpp b/third_party/rust/bindgen/tests/headers/var-tracing.hpp deleted file mode 100644 index 0d0b0ccac23a..000000000000 --- a/third_party/rust/bindgen/tests/headers/var-tracing.hpp +++ /dev/null @@ -1,10 +0,0 @@ -// bindgen-flags: --whitelist-type Baz - -struct Bar { - const int m_baz; - Bar(int baz); -}; - -class Baz { - static const Bar FOO[]; -}; diff --git a/third_party/rust/bindgen/tests/headers/variadic-method.hpp b/third_party/rust/bindgen/tests/headers/variadic-method.hpp deleted file mode 100644 index 78a8eb45b5c1..000000000000 --- a/third_party/rust/bindgen/tests/headers/variadic-method.hpp +++ /dev/null @@ -1,6 +0,0 @@ - -void foo(const char* fmt, ...); - -struct Bar { - void foo(const char* fmt, ...); -}; diff --git a/third_party/rust/bindgen/tests/headers/variadic_template_function.hpp b/third_party/rust/bindgen/tests/headers/variadic_template_function.hpp deleted file mode 100644 index 4942d8f02425..000000000000 --- a/third_party/rust/bindgen/tests/headers/variadic_template_function.hpp +++ /dev/null @@ -1,6 +0,0 @@ - -template -class VariadicFunctionObject { -public: - int add_em_up(T count,...); -}; diff --git a/third_party/rust/bindgen/tests/headers/vector.hpp b/third_party/rust/bindgen/tests/headers/vector.hpp deleted file mode 100644 index 4707f77f46b8..000000000000 --- a/third_party/rust/bindgen/tests/headers/vector.hpp +++ /dev/null @@ -1,3 +0,0 @@ -struct foo { - __attribute__((__vector_size__(1 * sizeof(long long)))) long long mMember; -}; diff --git a/third_party/rust/bindgen/tests/headers/virtual_dtor.hpp b/third_party/rust/bindgen/tests/headers/virtual_dtor.hpp deleted file mode 100644 index c35dcab12dac..000000000000 --- a/third_party/rust/bindgen/tests/headers/virtual_dtor.hpp +++ /dev/null @@ -1,3 +0,0 @@ -struct nsSlots { - virtual ~nsSlots(); -}; diff --git a/third_party/rust/bindgen/tests/headers/virtual_inheritance.hpp b/third_party/rust/bindgen/tests/headers/virtual_inheritance.hpp deleted file mode 100644 index 5198c51e2720..000000000000 --- a/third_party/rust/bindgen/tests/headers/virtual_inheritance.hpp +++ /dev/null @@ -1,16 +0,0 @@ - -class A { - int foo; -}; - -class B: public virtual A { - int bar; -}; - -class C: public virtual A { - int baz; -}; - -class D: public C, public B { - int bazz; -}; diff --git a/third_party/rust/bindgen/tests/headers/virtual_overloaded.hpp b/third_party/rust/bindgen/tests/headers/virtual_overloaded.hpp deleted file mode 100644 index 8aea8a19f5ee..000000000000 --- a/third_party/rust/bindgen/tests/headers/virtual_overloaded.hpp +++ /dev/null @@ -1,5 +0,0 @@ -class C { -public: - virtual void do_thing(char) { }; - virtual void do_thing(int) { }; -}; diff --git a/third_party/rust/bindgen/tests/headers/vtable_recursive_sig.hpp b/third_party/rust/bindgen/tests/headers/vtable_recursive_sig.hpp deleted file mode 100644 index 8729be00e6fa..000000000000 --- a/third_party/rust/bindgen/tests/headers/vtable_recursive_sig.hpp +++ /dev/null @@ -1,11 +0,0 @@ -// bindgen-flags: -- -std=c++11 - -class Derived; -class Base { -public: - virtual Derived* AsDerived() { return nullptr; } -}; - -class Derived final : public Base { - virtual Derived* AsDerived() override { return this; } -}; diff --git a/third_party/rust/bindgen/tests/headers/weird_bitfields.hpp b/third_party/rust/bindgen/tests/headers/weird_bitfields.hpp deleted file mode 100644 index 755681c1b134..000000000000 --- a/third_party/rust/bindgen/tests/headers/weird_bitfields.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// bindgen-flags: --no-unstable-rust -// You can guess where this is taken from... -enum nsStyleSVGOpacitySource { - eStyleSVGOpacitySource_Normal, - eStyleSVGOpacitySource_ContextFillOpacity, - eStyleSVGOpacitySource_ContextStrokeOpacity -}; - -class Weird { - unsigned int mStrokeDasharrayLength; - unsigned int bitTest: 16; - unsigned int bitTest2: 15; - unsigned char mClipRule; // [inherited] - unsigned char mColorInterpolation; // [inherited] see nsStyleConsts.h - unsigned char mColorInterpolationFilters; // [inherited] see nsStyleConsts.h - unsigned char mFillRule; // [inherited] see nsStyleConsts.h - unsigned char mImageRendering; // [inherited] see nsStyleConsts.h - unsigned char mPaintOrder; // [inherited] see nsStyleConsts.h - unsigned char mShapeRendering; // [inherited] see nsStyleConsts.h - unsigned char mStrokeLinecap; // [inherited] see nsStyleConsts.h - unsigned char mStrokeLinejoin; // [inherited] see nsStyleConsts.h - unsigned char mTextAnchor; // [inherited] see nsStyleConsts.h - unsigned char mTextRendering; // [inherited] see nsStyleConsts.h - - // In SVG glyphs, whether we inherit fill or stroke opacity from the outer - // text object. - // Use 3 bits to avoid signedness problems in MSVC. - nsStyleSVGOpacitySource mFillOpacitySource : 3; - nsStyleSVGOpacitySource mStrokeOpacitySource : 3; - - // SVG glyph outer object inheritance for other properties - bool mStrokeDasharrayFromObject : 1; - bool mStrokeDashoffsetFromObject : 1; - bool mStrokeWidthFromObject : 1; -}; diff --git a/third_party/rust/bindgen/tests/headers/what_is_going_on.hpp b/third_party/rust/bindgen/tests/headers/what_is_going_on.hpp deleted file mode 100644 index 078c1ad5aa26..000000000000 --- a/third_party/rust/bindgen/tests/headers/what_is_going_on.hpp +++ /dev/null @@ -1,19 +0,0 @@ - -struct UnknownUnits {}; -typedef float Float; - -template -struct PointTyped { - F x; - F y; - - static PointTyped FromUnknownPoint(const PointTyped& aPoint) { - return PointTyped(aPoint.x, aPoint.y); - } - - PointTyped ToUnknownPoint() const { - return PointTyped(this->x, this->y); - } -}; - -typedef PointTyped IntPoint; diff --git a/third_party/rust/bindgen/tests/headers/whitelist-namespaces-basic.hpp b/third_party/rust/bindgen/tests/headers/whitelist-namespaces-basic.hpp deleted file mode 100644 index 2eaa87403e7f..000000000000 --- a/third_party/rust/bindgen/tests/headers/whitelist-namespaces-basic.hpp +++ /dev/null @@ -1,10 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces --whitelist-type outer::inner::Helper - -namespace outer { - namespace inner { - struct Helper {}; - } - struct Test { - inner::Helper helper; - }; -} diff --git a/third_party/rust/bindgen/tests/headers/whitelist-namespaces.hpp b/third_party/rust/bindgen/tests/headers/whitelist-namespaces.hpp deleted file mode 100644 index d34cbe9430f6..000000000000 --- a/third_party/rust/bindgen/tests/headers/whitelist-namespaces.hpp +++ /dev/null @@ -1,10 +0,0 @@ -// bindgen-flags: --enable-cxx-namespaces --whitelist-type '.*' - -namespace outer { - namespace inner { - struct Helper {}; - } - struct Test { - inner::Helper helper; - }; -} diff --git a/third_party/rust/bindgen/tests/headers/whitelist_basic.hpp b/third_party/rust/bindgen/tests/headers/whitelist_basic.hpp deleted file mode 100644 index 8424f75a8e81..000000000000 --- a/third_party/rust/bindgen/tests/headers/whitelist_basic.hpp +++ /dev/null @@ -1,16 +0,0 @@ -// bindgen-flags: --whitelist-type WhitelistMe - -template -class WhitelistMe { - class Inner { - T bar; - }; - - int foo; - Inner bar; -}; - -struct DontWhitelistMe { - void* foo; - double _Complex noComplexGenerated; -}; diff --git a/third_party/rust/bindgen/tests/headers/whitelist_fix.hpp b/third_party/rust/bindgen/tests/headers/whitelist_fix.hpp deleted file mode 100644 index d0abda540d87..000000000000 --- a/third_party/rust/bindgen/tests/headers/whitelist_fix.hpp +++ /dev/null @@ -1,4 +0,0 @@ -// bindgen-flags: --whitelist-function 'Servo_.*' --blacklist-type Test --raw-line "pub enum Test {}" - -struct Test {}; -extern "C" void Servo_Test(Test* a); diff --git a/third_party/rust/bindgen/tests/headers/whitelist_vars.h b/third_party/rust/bindgen/tests/headers/whitelist_vars.h deleted file mode 100644 index 07fa2815e78b..000000000000 --- a/third_party/rust/bindgen/tests/headers/whitelist_vars.h +++ /dev/null @@ -1,4 +0,0 @@ -#define NONE 0 -#define FOO 5 -#define FOOB -2 -#define FOOBAR (-10) diff --git a/third_party/rust/bindgen/tests/tests.rs b/third_party/rust/bindgen/tests/tests.rs deleted file mode 100644 index 6b69e0d42cda..000000000000 --- a/third_party/rust/bindgen/tests/tests.rs +++ /dev/null @@ -1,146 +0,0 @@ -extern crate clap; -extern crate diff; -extern crate bindgen; -extern crate shlex; - -use bindgen::Builder; -use std::fs; -use std::io::{BufRead, BufReader, Error, ErrorKind, Read, Write}; -use std::path::PathBuf; - -#[path="../src/options.rs"] -mod options; -use options::builder_from_flags; - -fn compare_generated_header(header: &PathBuf, - builder: Builder) - -> Result<(), Error> { - let file_name = try!(header.file_name() - .ok_or(Error::new(ErrorKind::Other, "spawn_bindgen expects a file"))); - - let mut expected = PathBuf::from(header); - expected.pop(); - expected.pop(); - expected.push("expectations"); - expected.push("tests"); - expected.push(file_name); - expected.set_extension("rs"); - - // We skip the generate() error here so we get a full diff below - let output = match builder.generate() { - Ok(bindings) => bindings.to_string(), - Err(_) => "".to_string(), - }; - - let mut buffer = String::new(); - { - if let Ok(expected_file) = fs::File::open(&expected) { - try!(BufReader::new(expected_file).read_to_string(&mut buffer)); - } - } - - if output == buffer { - if !output.is_empty() { - return Ok(()); - } - return Err(Error::new(ErrorKind::Other, - "Something's gone really wrong!")); - } - - println!("diff expected generated"); - println!("--- expected: {:?}", expected); - println!("+++ generated from: {:?}", header); - - for diff in diff::lines(&buffer, &output) { - match diff { - diff::Result::Left(l) => println!("-{}", l), - diff::Result::Both(l, _) => println!(" {}", l), - diff::Result::Right(r) => println!("+{}", r), - } - } - - // Override the diff. - { - let mut expected_file = try!(fs::File::create(&expected)); - try!(expected_file.write_all(output.as_bytes())); - } - - Err(Error::new(ErrorKind::Other, "Header and binding differ!")) -} - -fn create_bindgen_builder(header: &PathBuf) -> Result, Error> { - let source = try!(fs::File::open(header)); - let reader = BufReader::new(source); - - // Scoop up bindgen-flags from test header - let mut flags = Vec::with_capacity(2); - - for line in reader.lines().take(3) { - let line = try!(line); - if line.contains("bindgen-flags: ") { - let extra_flags = line.split("bindgen-flags: ") - .last() - .and_then(shlex::split) - .unwrap(); - flags.extend(extra_flags.into_iter()); - } else if line.contains("bindgen-unstable") && - cfg!(feature = "testing_only_llvm_stable") { - return Ok(None); - } else if line.contains("bindgen-osx-only") { - let prepend_flags = ["--raw-line", "#![cfg(target_os=\"macos\")]"]; - flags = prepend_flags.into_iter() - .map(ToString::to_string) - .chain(flags) - .collect(); - } - } - - // Fool builder_from_flags() into believing it has real env::args_os... - // - add "bindgen" as executable name 0th element - // - add header filename as 1st element - // - prepend raw lines so they're in the right order for expected output - // - append the test header's bindgen flags - let header_str = try!(header.to_str() - .ok_or(Error::new(ErrorKind::Other, "Invalid header file name"))); - - let prepend = ["bindgen", - "--with-derive-default", - header_str, - "--raw-line", - "", - "--raw-line", - "#![allow(non_snake_case)]", - "--raw-line", - ""]; - - let args = prepend.into_iter() - .map(ToString::to_string) - .chain(flags.into_iter()); - - builder_from_flags(args) - .map(|(builder, _, _)| Some(builder.no_unstable_rust())) -} - -macro_rules! test_header { - ($function:ident, $header:expr) => ( - #[test] - fn $function() { - let header = PathBuf::from($header); - let result = create_bindgen_builder(&header) - .and_then(|builder| { - if let Some(builder) = builder { - compare_generated_header(&header, builder) - } else { - Ok(()) - } - }); - - if let Err(err) = result { - panic!("{}", err); - } - } - ) -} - -// This file is generated by build.rs -include!(concat!(env!("OUT_DIR"), "/tests.rs")); diff --git a/third_party/rust/bindgen/tests/uses/.gitignore b/third_party/rust/bindgen/tests/uses/.gitignore deleted file mode 100644 index 40d7cb4cc13a..000000000000 --- a/third_party/rust/bindgen/tests/uses/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.c -*.cpp diff --git a/third_party/rust/bitflags-0.7.0/.cargo-checksum.json b/third_party/rust/bitflags-0.7.0/.cargo-checksum.json new file mode 100644 index 000000000000..c2012b545406 --- /dev/null +++ b/third_party/rust/bitflags-0.7.0/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"c1e953ee360e77de57f7b02f1b7880bd6a3dc22d1a69e953c2ac2c52cc52d247",".travis.yml":"2b615144d3f4b2e63ba6ec435cc18df7d76354aa07c2a02d6c707028cc448784","Cargo.toml":"db8c2e9ea912c5f3d2d89cf4cf936c448300e356b0fb533db8875923cb135256","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"8cfbc986af45867d9e620188af2392320fe6e0d9536753ba415c94ab522f5fb5","src/lib.rs":"618ce383bb219725363fba174fc66beb4874d9682e5da953f9e3e9cb3f786d5f","tests/external.rs":"546e549ec831876a5dc272bd0537adc9e9886c6da54656c825e7bffc079e2c74","tests/external_no_std.rs":"48929f5109aabc156442d5ae2ab07b4bce5d648488bf49dba725f6ab23bcb48a"},"package":"aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"} \ No newline at end of file diff --git a/third_party/rust/dtoa/.cargo-ok b/third_party/rust/bitflags-0.7.0/.cargo-ok similarity index 100% rename from third_party/rust/dtoa/.cargo-ok rename to third_party/rust/bitflags-0.7.0/.cargo-ok diff --git a/third_party/rust/bitflags-0.7.0/.gitignore b/third_party/rust/bitflags-0.7.0/.gitignore new file mode 100644 index 000000000000..4fffb2f89cbd --- /dev/null +++ b/third_party/rust/bitflags-0.7.0/.gitignore @@ -0,0 +1,2 @@ +/target +/Cargo.lock diff --git a/third_party/rust/bitflags-0.7.0/.travis.yml b/third_party/rust/bitflags-0.7.0/.travis.yml new file mode 100644 index 000000000000..60344466a177 --- /dev/null +++ b/third_party/rust/bitflags-0.7.0/.travis.yml @@ -0,0 +1,24 @@ +language: rust +rust: + - stable + - beta + - nightly +sudo: false +script: + - cargo build --verbose + - cargo test --verbose + - cargo doc +after_success: | + [ $TRAVIS_BRANCH = master ] && + [ $TRAVIS_PULL_REQUEST = false ] && + [ $TRAVIS_RUST_VERSION = nightly ] && + echo '' > target/doc/index.html && + pip install ghp-import --user $USER && + $HOME/.local/bin/ghp-import -n target/doc && + git push -qf https://${TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages +env: + global: + secure: d+l63TtlF6cfFVDGauYRexgx4lBww4ORqqK4Vt75nWbiCbjZYsKXbcTUdhAr193nIVGiNW50A8SekM01F3EngHwHwr6u5kFleOggm+HA0kkBVeX+k2A4WCVVfYI+gth+zk99WaF8h46MA0evhx6FYDoqeyl9oqmVifI4kaqhMwc= +notifications: + email: + on_success: never diff --git a/third_party/rust/bitflags-0.7.0/Cargo.toml b/third_party/rust/bitflags-0.7.0/Cargo.toml new file mode 100644 index 000000000000..042497e9caf7 --- /dev/null +++ b/third_party/rust/bitflags-0.7.0/Cargo.toml @@ -0,0 +1,13 @@ +[package] + +name = "bitflags" +version = "0.7.0" +authors = ["The Rust Project Developers"] +license = "MIT/Apache-2.0" +readme = "README.md" +repository = "https://github.com/rust-lang/bitflags" +homepage = "https://github.com/rust-lang/bitflags" +documentation = "https://doc.rust-lang.org/bitflags" +description = """ +A macro to generate structures which behave like bitflags. +""" diff --git a/third_party/rust/dtoa/LICENSE-APACHE b/third_party/rust/bitflags-0.7.0/LICENSE-APACHE similarity index 100% rename from third_party/rust/dtoa/LICENSE-APACHE rename to third_party/rust/bitflags-0.7.0/LICENSE-APACHE diff --git a/third_party/rust/serde_json/LICENSE-MIT b/third_party/rust/bitflags-0.7.0/LICENSE-MIT similarity index 100% rename from third_party/rust/serde_json/LICENSE-MIT rename to third_party/rust/bitflags-0.7.0/LICENSE-MIT diff --git a/third_party/rust/bitflags-0.7.0/README.md b/third_party/rust/bitflags-0.7.0/README.md new file mode 100644 index 000000000000..3edd8a361ef4 --- /dev/null +++ b/third_party/rust/bitflags-0.7.0/README.md @@ -0,0 +1,24 @@ +bitflags +======== + +A Rust macro to generate structures which behave like a set of bitflags + +[![Build Status](https://travis-ci.org/rust-lang-nursery/bitflags.svg?branch=master)](https://travis-ci.org/rust-lang-nursery/bitflags) + +[Documentation](https://doc.rust-lang.org/bitflags) + +## Usage + +Add this to your `Cargo.toml`: + +```toml +[dependencies] +bitflags = "0.6" +``` + +and this to your crate root: + +```rust +#[macro_use] +extern crate bitflags; +``` diff --git a/third_party/rust/bitflags-0.7.0/src/lib.rs b/third_party/rust/bitflags-0.7.0/src/lib.rs new file mode 100644 index 000000000000..698799dab2ea --- /dev/null +++ b/third_party/rust/bitflags-0.7.0/src/lib.rs @@ -0,0 +1,808 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! A typesafe bitmask flag generator. + +#![no_std] + +#[cfg(test)] +#[macro_use] +extern crate std; + +// Re-export libstd/libcore using an alias so that the macros can work in no_std +// crates while remaining compatible with normal crates. +#[allow(private_in_public)] +#[doc(hidden)] +pub use core as __core; + +/// The `bitflags!` macro generates a `struct` that holds a set of C-style +/// bitmask flags. It is useful for creating typesafe wrappers for C APIs. +/// +/// The flags should only be defined for integer types, otherwise unexpected +/// type errors may occur at compile time. +/// +/// # Example +/// +/// ```{.rust} +/// #[macro_use] +/// extern crate bitflags; +/// +/// bitflags! { +/// flags Flags: u32 { +/// const FLAG_A = 0b00000001, +/// const FLAG_B = 0b00000010, +/// const FLAG_C = 0b00000100, +/// const FLAG_ABC = FLAG_A.bits +/// | FLAG_B.bits +/// | FLAG_C.bits, +/// } +/// } +/// +/// fn main() { +/// let e1 = FLAG_A | FLAG_C; +/// let e2 = FLAG_B | FLAG_C; +/// assert_eq!((e1 | e2), FLAG_ABC); // union +/// assert_eq!((e1 & e2), FLAG_C); // intersection +/// assert_eq!((e1 - e2), FLAG_A); // set difference +/// assert_eq!(!e2, FLAG_A); // set complement +/// } +/// ``` +/// +/// The generated `struct`s can also be extended with type and trait +/// implementations: +/// +/// ```{.rust} +/// #[macro_use] +/// extern crate bitflags; +/// +/// use std::fmt; +/// +/// bitflags! { +/// flags Flags: u32 { +/// const FLAG_A = 0b00000001, +/// const FLAG_B = 0b00000010, +/// } +/// } +/// +/// impl Flags { +/// pub fn clear(&mut self) { +/// self.bits = 0; // The `bits` field can be accessed from within the +/// // same module where the `bitflags!` macro was invoked. +/// } +/// } +/// +/// impl fmt::Display for Flags { +/// fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { +/// write!(f, "hi!") +/// } +/// } +/// +/// fn main() { +/// let mut flags = FLAG_A | FLAG_B; +/// flags.clear(); +/// assert!(flags.is_empty()); +/// assert_eq!(format!("{}", flags), "hi!"); +/// assert_eq!(format!("{:?}", FLAG_A | FLAG_B), "FLAG_A | FLAG_B"); +/// assert_eq!(format!("{:?}", FLAG_B), "FLAG_B"); +/// } +/// ``` +/// +/// # Visibility +/// +/// The generated struct and its associated flag constants are not exported +/// out of the current module by default. A definition can be exported out of +/// the current module by adding `pub` before `flags`: +/// +/// ```{.rust},ignore +/// #[macro_use] +/// extern crate bitflags; +/// +/// mod example { +/// bitflags! { +/// pub flags Flags1: u32 { +/// const FLAG_A = 0b00000001, +/// } +/// } +/// bitflags! { +/// flags Flags2: u32 { +/// const FLAG_B = 0b00000010, +/// } +/// } +/// } +/// +/// fn main() { +/// let flag1 = example::FLAG_A; +/// let flag2 = example::FLAG_B; // error: const `FLAG_B` is private +/// } +/// ``` +/// +/// # Attributes +/// +/// Attributes can be attached to the generated `struct` by placing them +/// before the `flags` keyword. +/// +/// # Trait implementations +/// +/// The `Copy`, `Clone`, `PartialEq`, `Eq`, `PartialOrd`, `Ord` and `Hash` +/// traits automatically derived for the `struct` using the `derive` attribute. +/// Additional traits can be derived by providing an explicit `derive` +/// attribute on `flags`. +/// +/// The `Extend` and `FromIterator` traits are implemented for the `struct`, +/// too: `Extend` adds the union of the instances of the `struct` iterated over, +/// while `FromIterator` calculates the union. +/// +/// The `Debug` trait is also implemented by displaying the bits value of the +/// internal struct. +/// +/// ## Operators +/// +/// The following operator traits are implemented for the generated `struct`: +/// +/// - `BitOr` and `BitOrAssign`: union +/// - `BitAnd` and `BitAndAssign`: intersection +/// - `BitXor` and `BitXorAssign`: toggle +/// - `Sub` and `SubAssign`: set difference +/// - `Not`: set complement +/// +/// As long as the assignment operators are unstable rust feature they are only +/// available with the crate feature `assignment_ops` enabled. +/// +/// # Methods +/// +/// The following methods are defined for the generated `struct`: +/// +/// - `empty`: an empty set of flags +/// - `all`: the set of all flags +/// - `bits`: the raw value of the flags currently stored +/// - `from_bits`: convert from underlying bit representation, unless that +/// representation contains bits that do not correspond to a flag +/// - `from_bits_truncate`: convert from underlying bit representation, dropping +/// any bits that do not correspond to flags +/// - `is_empty`: `true` if no flags are currently stored +/// - `is_all`: `true` if all flags are currently set +/// - `intersects`: `true` if there are flags common to both `self` and `other` +/// - `contains`: `true` all of the flags in `other` are contained within `self` +/// - `insert`: inserts the specified flags in-place +/// - `remove`: removes the specified flags in-place +/// - `toggle`: the specified flags will be inserted if not present, and removed +/// if they are. +#[macro_export] +macro_rules! bitflags { + ($(#[$attr:meta])* pub flags $BitFlags:ident: $T:ty { + $($(#[$Flag_attr:meta])* const $Flag:ident = $value:expr),+ + }) => { + #[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash)] + $(#[$attr])* + pub struct $BitFlags { + bits: $T, + } + + $($(#[$Flag_attr])* pub const $Flag: $BitFlags = $BitFlags { bits: $value };)+ + + bitflags! { + @_impl flags $BitFlags: $T { + $($(#[$Flag_attr])* const $Flag = $value),+ + } + } + }; + ($(#[$attr:meta])* flags $BitFlags:ident: $T:ty { + $($(#[$Flag_attr:meta])* const $Flag:ident = $value:expr),+ + }) => { + #[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash)] + $(#[$attr])* + struct $BitFlags { + bits: $T, + } + + $($(#[$Flag_attr])* const $Flag: $BitFlags = $BitFlags { bits: $value };)+ + + bitflags! { + @_impl flags $BitFlags: $T { + $($(#[$Flag_attr])* const $Flag = $value),+ + } + } + }; + (@_impl flags $BitFlags:ident: $T:ty { + $($(#[$Flag_attr:meta])* const $Flag:ident = $value:expr),+ + }) => { + impl $crate::__core::fmt::Debug for $BitFlags { + fn fmt(&self, f: &mut $crate::__core::fmt::Formatter) -> $crate::__core::fmt::Result { + // This convoluted approach is to handle #[cfg]-based flag + // omission correctly. Some of the $Flag variants may not be + // defined in this module so we create an inner module which + // defines *all* flags to the value of 0. We then create a + // second inner module that defines all of the flags with #[cfg] + // to their real values. Afterwards the glob will import + // variants from the second inner module, shadowing all + // defined variants, leaving only the undefined ones with the + // bit value of 0. + #[allow(dead_code)] + #[allow(unused_assignments)] + mod dummy { + // We can't use the real $BitFlags struct because it may be + // private, which prevents us from using it to define + // public constants. + pub struct $BitFlags { + bits: u64, + } + mod real_flags { + use super::$BitFlags; + $($(#[$Flag_attr])* pub const $Flag: $BitFlags = $BitFlags { + bits: super::super::$Flag.bits as u64 + };)+ + } + // Now we define the "undefined" versions of the flags. + // This way, all the names exist, even if some are #[cfg]ed + // out. + $(const $Flag: $BitFlags = $BitFlags { bits: 0 };)+ + + #[inline] + pub fn fmt(self_: u64, + f: &mut $crate::__core::fmt::Formatter) + -> $crate::__core::fmt::Result { + // Now we import the real values for the flags. + // Only ones that are #[cfg]ed out will be 0. + use self::real_flags::*; + + let mut first = true; + $( + // $Flag.bits == 0 means that $Flag doesn't exist + if $Flag.bits != 0 && self_ & $Flag.bits as u64 == $Flag.bits as u64 { + if !first { + try!(f.write_str(" | ")); + } + first = false; + try!(f.write_str(stringify!($Flag))); + } + )+ + Ok(()) + } + } + dummy::fmt(self.bits as u64, f) + } + } + + #[allow(dead_code)] + impl $BitFlags { + /// Returns an empty set of flags. + #[inline] + pub fn empty() -> $BitFlags { + $BitFlags { bits: 0 } + } + + /// Returns the set containing all flags. + #[inline] + pub fn all() -> $BitFlags { + // See above `dummy` module for why this approach is taken. + #[allow(dead_code)] + mod dummy { + pub struct $BitFlags { + bits: u64, + } + mod real_flags { + use super::$BitFlags; + $($(#[$Flag_attr])* pub const $Flag: $BitFlags = $BitFlags { + bits: super::super::$Flag.bits as u64 + };)+ + } + $(const $Flag: $BitFlags = $BitFlags { bits: 0 };)+ + + #[inline] + pub fn all() -> u64 { + use self::real_flags::*; + $($Flag.bits)|+ + } + } + $BitFlags { bits: dummy::all() as $T } + } + + /// Returns the raw value of the flags currently stored. + #[inline] + pub fn bits(&self) -> $T { + self.bits + } + + /// Convert from underlying bit representation, unless that + /// representation contains bits that do not correspond to a flag. + #[inline] + pub fn from_bits(bits: $T) -> $crate::__core::option::Option<$BitFlags> { + if (bits & !$BitFlags::all().bits()) == 0 { + $crate::__core::option::Option::Some($BitFlags { bits: bits }) + } else { + $crate::__core::option::Option::None + } + } + + /// Convert from underlying bit representation, dropping any bits + /// that do not correspond to flags. + #[inline] + pub fn from_bits_truncate(bits: $T) -> $BitFlags { + $BitFlags { bits: bits } & $BitFlags::all() + } + + /// Returns `true` if no flags are currently stored. + #[inline] + pub fn is_empty(&self) -> bool { + *self == $BitFlags::empty() + } + + /// Returns `true` if all flags are currently set. + #[inline] + pub fn is_all(&self) -> bool { + *self == $BitFlags::all() + } + + /// Returns `true` if there are flags common to both `self` and `other`. + #[inline] + pub fn intersects(&self, other: $BitFlags) -> bool { + !(*self & other).is_empty() + } + + /// Returns `true` all of the flags in `other` are contained within `self`. + #[inline] + pub fn contains(&self, other: $BitFlags) -> bool { + (*self & other) == other + } + + /// Inserts the specified flags in-place. + #[inline] + pub fn insert(&mut self, other: $BitFlags) { + self.bits |= other.bits; + } + + /// Removes the specified flags in-place. + #[inline] + pub fn remove(&mut self, other: $BitFlags) { + self.bits &= !other.bits; + } + + /// Toggles the specified flags in-place. + #[inline] + pub fn toggle(&mut self, other: $BitFlags) { + self.bits ^= other.bits; + } + } + + impl $crate::__core::ops::BitOr for $BitFlags { + type Output = $BitFlags; + + /// Returns the union of the two sets of flags. + #[inline] + fn bitor(self, other: $BitFlags) -> $BitFlags { + $BitFlags { bits: self.bits | other.bits } + } + } + + impl $crate::__core::ops::BitOrAssign for $BitFlags { + + /// Adds the set of flags. + #[inline] + fn bitor_assign(&mut self, other: $BitFlags) { + self.bits |= other.bits; + } + } + + impl $crate::__core::ops::BitXor for $BitFlags { + type Output = $BitFlags; + + /// Returns the left flags, but with all the right flags toggled. + #[inline] + fn bitxor(self, other: $BitFlags) -> $BitFlags { + $BitFlags { bits: self.bits ^ other.bits } + } + } + + impl $crate::__core::ops::BitXorAssign for $BitFlags { + + /// Toggles the set of flags. + #[inline] + fn bitxor_assign(&mut self, other: $BitFlags) { + self.bits ^= other.bits; + } + } + + impl $crate::__core::ops::BitAnd for $BitFlags { + type Output = $BitFlags; + + /// Returns the intersection between the two sets of flags. + #[inline] + fn bitand(self, other: $BitFlags) -> $BitFlags { + $BitFlags { bits: self.bits & other.bits } + } + } + + impl $crate::__core::ops::BitAndAssign for $BitFlags { + + /// Disables all flags disabled in the set. + #[inline] + fn bitand_assign(&mut self, other: $BitFlags) { + self.bits &= other.bits; + } + } + + impl $crate::__core::ops::Sub for $BitFlags { + type Output = $BitFlags; + + /// Returns the set difference of the two sets of flags. + #[inline] + fn sub(self, other: $BitFlags) -> $BitFlags { + $BitFlags { bits: self.bits & !other.bits } + } + } + + impl $crate::__core::ops::SubAssign for $BitFlags { + + /// Disables all flags enabled in the set. + #[inline] + fn sub_assign(&mut self, other: $BitFlags) { + self.bits &= !other.bits; + } + } + + impl $crate::__core::ops::Not for $BitFlags { + type Output = $BitFlags; + + /// Returns the complement of this set of flags. + #[inline] + fn not(self) -> $BitFlags { + $BitFlags { bits: !self.bits } & $BitFlags::all() + } + } + + impl $crate::__core::iter::Extend<$BitFlags> for $BitFlags { + fn extend>(&mut self, iterator: T) { + for item in iterator { + self.insert(item) + } + } + } + + impl $crate::__core::iter::FromIterator<$BitFlags> for $BitFlags { + fn from_iter>(iterator: T) -> $BitFlags { + let mut result = Self::empty(); + result.extend(iterator); + result + } + } + }; + ($(#[$attr:meta])* pub flags $BitFlags:ident: $T:ty { + $($(#[$Flag_attr:meta])* const $Flag:ident = $value:expr),+, + }) => { + bitflags! { + $(#[$attr])* + pub flags $BitFlags: $T { + $($(#[$Flag_attr])* const $Flag = $value),+ + } + } + }; + ($(#[$attr:meta])* flags $BitFlags:ident: $T:ty { + $($(#[$Flag_attr:meta])* const $Flag:ident = $value:expr),+, + }) => { + bitflags! { + $(#[$attr])* + flags $BitFlags: $T { + $($(#[$Flag_attr])* const $Flag = $value),+ + } + } + }; +} + +#[cfg(test)] +#[allow(non_upper_case_globals, dead_code)] +mod tests { + use std::hash::{SipHasher, Hash, Hasher}; + + bitflags! { + #[doc = "> The first principle is that you must not fool yourself — and"] + #[doc = "> you are the easiest person to fool."] + #[doc = "> "] + #[doc = "> - Richard Feynman"] + flags Flags: u32 { + const FlagA = 0b00000001, + #[doc = " macros are way better at generating code than trans is"] + const FlagB = 0b00000010, + const FlagC = 0b00000100, + #[doc = "* cmr bed"] + #[doc = "* strcat table"] + #[doc = " wait what?"] + const FlagABC = FlagA.bits + | FlagB.bits + | FlagC.bits, + } + } + + bitflags! { + flags _CfgFlags: u32 { + #[cfg(windows)] + const _CfgA = 0b01, + #[cfg(unix)] + const _CfgB = 0b01, + #[cfg(windows)] + const _CfgC = _CfgA.bits | 0b10, + } + } + + bitflags! { + flags AnotherSetOfFlags: i8 { + const AnotherFlag = -1_i8, + } + } + + #[test] + fn test_bits(){ + assert_eq!(Flags::empty().bits(), 0b00000000); + assert_eq!(FlagA.bits(), 0b00000001); + assert_eq!(FlagABC.bits(), 0b00000111); + + assert_eq!(AnotherSetOfFlags::empty().bits(), 0b00); + assert_eq!(AnotherFlag.bits(), !0_i8); + } + + #[test] + fn test_from_bits() { + assert_eq!(Flags::from_bits(0), Some(Flags::empty())); + assert_eq!(Flags::from_bits(0b1), Some(FlagA)); + assert_eq!(Flags::from_bits(0b10), Some(FlagB)); + assert_eq!(Flags::from_bits(0b11), Some(FlagA | FlagB)); + assert_eq!(Flags::from_bits(0b1000), None); + + assert_eq!(AnotherSetOfFlags::from_bits(!0_i8), Some(AnotherFlag)); + } + + #[test] + fn test_from_bits_truncate() { + assert_eq!(Flags::from_bits_truncate(0), Flags::empty()); + assert_eq!(Flags::from_bits_truncate(0b1), FlagA); + assert_eq!(Flags::from_bits_truncate(0b10), FlagB); + assert_eq!(Flags::from_bits_truncate(0b11), (FlagA | FlagB)); + assert_eq!(Flags::from_bits_truncate(0b1000), Flags::empty()); + assert_eq!(Flags::from_bits_truncate(0b1001), FlagA); + + assert_eq!(AnotherSetOfFlags::from_bits_truncate(0_i8), AnotherSetOfFlags::empty()); + } + + #[test] + fn test_is_empty(){ + assert!(Flags::empty().is_empty()); + assert!(!FlagA.is_empty()); + assert!(!FlagABC.is_empty()); + + assert!(!AnotherFlag.is_empty()); + } + + #[test] + fn test_is_all() { + assert!(Flags::all().is_all()); + assert!(!FlagA.is_all()); + assert!(FlagABC.is_all()); + + assert!(AnotherFlag.is_all()); + } + + #[test] + fn test_two_empties_do_not_intersect() { + let e1 = Flags::empty(); + let e2 = Flags::empty(); + assert!(!e1.intersects(e2)); + + assert!(AnotherFlag.intersects(AnotherFlag)); + } + + #[test] + fn test_empty_does_not_intersect_with_full() { + let e1 = Flags::empty(); + let e2 = FlagABC; + assert!(!e1.intersects(e2)); + } + + #[test] + fn test_disjoint_intersects() { + let e1 = FlagA; + let e2 = FlagB; + assert!(!e1.intersects(e2)); + } + + #[test] + fn test_overlapping_intersects() { + let e1 = FlagA; + let e2 = FlagA | FlagB; + assert!(e1.intersects(e2)); + } + + #[test] + fn test_contains() { + let e1 = FlagA; + let e2 = FlagA | FlagB; + assert!(!e1.contains(e2)); + assert!(e2.contains(e1)); + assert!(FlagABC.contains(e2)); + + assert!(AnotherFlag.contains(AnotherFlag)); + } + + #[test] + fn test_insert(){ + let mut e1 = FlagA; + let e2 = FlagA | FlagB; + e1.insert(e2); + assert_eq!(e1, e2); + + let mut e3 = AnotherSetOfFlags::empty(); + e3.insert(AnotherFlag); + assert_eq!(e3, AnotherFlag); + } + + #[test] + fn test_remove(){ + let mut e1 = FlagA | FlagB; + let e2 = FlagA | FlagC; + e1.remove(e2); + assert_eq!(e1, FlagB); + + let mut e3 = AnotherFlag; + e3.remove(AnotherFlag); + assert_eq!(e3, AnotherSetOfFlags::empty()); + } + + #[test] + fn test_operators() { + let e1 = FlagA | FlagC; + let e2 = FlagB | FlagC; + assert_eq!((e1 | e2), FlagABC); // union + assert_eq!((e1 & e2), FlagC); // intersection + assert_eq!((e1 - e2), FlagA); // set difference + assert_eq!(!e2, FlagA); // set complement + assert_eq!(e1 ^ e2, FlagA | FlagB); // toggle + let mut e3 = e1; + e3.toggle(e2); + assert_eq!(e3, FlagA | FlagB); + + let mut m4 = AnotherSetOfFlags::empty(); + m4.toggle(AnotherSetOfFlags::empty()); + assert_eq!(m4, AnotherSetOfFlags::empty()); + } + + #[test] + fn test_assignment_operators() { + let mut m1 = Flags::empty(); + let e1 = FlagA | FlagC; + // union + m1 |= FlagA; + assert_eq!(m1, FlagA); + // intersection + m1 &= e1; + assert_eq!(m1, FlagA); + // set difference + m1 -= m1; + assert_eq!(m1, Flags::empty()); + // toggle + m1 ^= e1; + assert_eq!(m1, e1); + } + + #[test] + fn test_extend() { + let mut flags; + + flags = Flags::empty(); + flags.extend([].iter().cloned()); + assert_eq!(flags, Flags::empty()); + + flags = Flags::empty(); + flags.extend([FlagA, FlagB].iter().cloned()); + assert_eq!(flags, FlagA | FlagB); + + flags = FlagA; + flags.extend([FlagA, FlagB].iter().cloned()); + assert_eq!(flags, FlagA | FlagB); + + flags = FlagB; + flags.extend([FlagA, FlagABC].iter().cloned()); + assert_eq!(flags, FlagABC); + } + + #[test] + fn test_from_iterator() { + assert_eq!([].iter().cloned().collect::(), Flags::empty()); + assert_eq!([FlagA, FlagB].iter().cloned().collect::(), FlagA | FlagB); + assert_eq!([FlagA, FlagABC].iter().cloned().collect::(), FlagABC); + } + + #[test] + fn test_lt() { + let mut a = Flags::empty(); + let mut b = Flags::empty(); + + assert!(!(a < b) && !(b < a)); + b = FlagB; + assert!(a < b); + a = FlagC; + assert!(!(a < b) && b < a); + b = FlagC | FlagB; + assert!(a < b); + } + + #[test] + fn test_ord() { + let mut a = Flags::empty(); + let mut b = Flags::empty(); + + assert!(a <= b && a >= b); + a = FlagA; + assert!(a > b && a >= b); + assert!(b < a && b <= a); + b = FlagB; + assert!(b > a && b >= a); + assert!(a < b && a <= b); + } + + fn hash(t: &T) -> u64 { + let mut s = SipHasher::new_with_keys(0, 0); + t.hash(&mut s); + s.finish() + } + + #[test] + fn test_hash() { + let mut x = Flags::empty(); + let mut y = Flags::empty(); + assert_eq!(hash(&x), hash(&y)); + x = Flags::all(); + y = FlagABC; + assert_eq!(hash(&x), hash(&y)); + } + + #[test] + fn test_debug() { + assert_eq!(format!("{:?}", FlagA | FlagB), "FlagA | FlagB"); + assert_eq!(format!("{:?}", FlagABC), "FlagA | FlagB | FlagC | FlagABC"); + } + + mod submodule { + bitflags! { + pub flags PublicFlags: i8 { + const FlagX = 0, + } + } + bitflags! { + flags PrivateFlags: i8 { + const FlagY = 0, + } + } + + #[test] + fn test_private() { + let _ = FlagY; + } + } + + #[test] + fn test_public() { + let _ = submodule::FlagX; + } + + mod t1 { + mod foo { + pub type Bar = i32; + } + + bitflags! { + /// baz + flags Flags: foo::Bar { + const A = 0b00000001, + #[cfg(foo)] + const B = 0b00000010, + #[cfg(foo)] + const C = 0b00000010, + } + } + } +} diff --git a/third_party/rust/bitflags-0.7.0/tests/external.rs b/third_party/rust/bitflags-0.7.0/tests/external.rs new file mode 100644 index 000000000000..0f0c7f665fbc --- /dev/null +++ b/third_party/rust/bitflags-0.7.0/tests/external.rs @@ -0,0 +1,21 @@ +#![allow(dead_code)] + +#[macro_use] +extern crate bitflags; + +bitflags! { + /// baz + flags Flags: u32 { + const A = 0b00000001, + #[doc = "bar"] + const B = 0b00000010, + const C = 0b00000100, + #[doc = "foo"] + const ABC = A.bits | B.bits | C.bits, + } +} + +#[test] +fn smoke() { + assert_eq!(ABC, A | B | C); +} diff --git a/third_party/rust/bitflags-0.7.0/tests/external_no_std.rs b/third_party/rust/bitflags-0.7.0/tests/external_no_std.rs new file mode 100644 index 000000000000..46526fd71298 --- /dev/null +++ b/third_party/rust/bitflags-0.7.0/tests/external_no_std.rs @@ -0,0 +1,22 @@ +#![allow(dead_code)] +#![no_std] + +#[macro_use] +extern crate bitflags; + +bitflags! { + /// baz + flags Flags: u32 { + const A = 0b00000001, + #[doc = "bar"] + const B = 0b00000010, + const C = 0b00000100, + #[doc = "foo"] + const ABC = A.bits | B.bits | C.bits, + } +} + +#[test] +fn smoke() { + assert_eq!(ABC, A | B | C); +} diff --git a/third_party/rust/bitflags/.cargo-checksum.json b/third_party/rust/bitflags/.cargo-checksum.json index c2012b545406..ed28f4db8f11 100644 --- a/third_party/rust/bitflags/.cargo-checksum.json +++ b/third_party/rust/bitflags/.cargo-checksum.json @@ -1 +1 @@ -{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"c1e953ee360e77de57f7b02f1b7880bd6a3dc22d1a69e953c2ac2c52cc52d247",".travis.yml":"2b615144d3f4b2e63ba6ec435cc18df7d76354aa07c2a02d6c707028cc448784","Cargo.toml":"db8c2e9ea912c5f3d2d89cf4cf936c448300e356b0fb533db8875923cb135256","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"8cfbc986af45867d9e620188af2392320fe6e0d9536753ba415c94ab522f5fb5","src/lib.rs":"618ce383bb219725363fba174fc66beb4874d9682e5da953f9e3e9cb3f786d5f","tests/external.rs":"546e549ec831876a5dc272bd0537adc9e9886c6da54656c825e7bffc079e2c74","tests/external_no_std.rs":"48929f5109aabc156442d5ae2ab07b4bce5d648488bf49dba725f6ab23bcb48a"},"package":"aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"} \ No newline at end of file +{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"c1e953ee360e77de57f7b02f1b7880bd6a3dc22d1a69e953c2ac2c52cc52d247",".travis.yml":"793de473e858941a0d41e0c4e114373bca6b822737cdcf5ff8f36238a9b51837","Cargo.toml":"98d1298b1d79ccc587957062cf1c56712f68ee2796bed5f39c8d334133d9c562","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"1cce1c9c1fe2cf40ec1c6a0384f8cc2f0c5c40ece4acfedd64330ed95ef74e44","src/lib.rs":"006a631d800f713e2ffc74e33f65fd47505eec1b047c109e180905a9dcb7e973","tests/external.rs":"546e549ec831876a5dc272bd0537adc9e9886c6da54656c825e7bffc079e2c74","tests/external_no_std.rs":"48929f5109aabc156442d5ae2ab07b4bce5d648488bf49dba725f6ab23bcb48a","tests/i128_bitflags.rs":"fb1bf9e01f528478539c52de94e82a96b2639dc271ea242fea6ebb32dcb0f99e"},"package":"1370e9fc2a6ae53aea8b7a5110edbd08836ed87c88736dfabccade1c2b44bff4"} \ No newline at end of file diff --git a/third_party/rust/bitflags/.travis.yml b/third_party/rust/bitflags/.travis.yml index 60344466a177..7b5ed188b559 100644 --- a/third_party/rust/bitflags/.travis.yml +++ b/third_party/rust/bitflags/.travis.yml @@ -4,21 +4,21 @@ rust: - beta - nightly sudo: false +before_script: + - pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH script: - cargo build --verbose - cargo test --verbose - - cargo doc -after_success: | - [ $TRAVIS_BRANCH = master ] && - [ $TRAVIS_PULL_REQUEST = false ] && - [ $TRAVIS_RUST_VERSION = nightly ] && - echo '' > target/doc/index.html && - pip install ghp-import --user $USER && - $HOME/.local/bin/ghp-import -n target/doc && - git push -qf https://${TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages + - travis-cargo --only nightly test + - cargo doc --no-deps +after_success: + - travis-cargo --only nightly doc-upload env: global: - secure: d+l63TtlF6cfFVDGauYRexgx4lBww4ORqqK4Vt75nWbiCbjZYsKXbcTUdhAr193nIVGiNW50A8SekM01F3EngHwHwr6u5kFleOggm+HA0kkBVeX+k2A4WCVVfYI+gth+zk99WaF8h46MA0evhx6FYDoqeyl9oqmVifI4kaqhMwc= + secure: "DoZ8g8iPs+X3xEEucke0Ae02JbkQ1qd1SSv/L2aQqxULmREtRcbzRauhiT+ToQO5Ft1Lul8uck14nPfs4gMr/O3jFFBhEBVpSlbkJx7eNL3kwUdp95UNroA8I43xPN/nccJaHDN6TMTD3+uajTQTje2SyzOQP+1gvdKg17kguvE=" + + + notifications: email: on_success: never diff --git a/third_party/rust/bitflags/Cargo.toml b/third_party/rust/bitflags/Cargo.toml index 042497e9caf7..cae2088ac893 100644 --- a/third_party/rust/bitflags/Cargo.toml +++ b/third_party/rust/bitflags/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "bitflags" -version = "0.7.0" +version = "0.8.2" authors = ["The Rust Project Developers"] license = "MIT/Apache-2.0" readme = "README.md" @@ -11,3 +11,7 @@ documentation = "https://doc.rust-lang.org/bitflags" description = """ A macro to generate structures which behave like bitflags. """ + +[features] +i128 = [] +unstable = ["i128"] diff --git a/third_party/rust/bitflags/README.md b/third_party/rust/bitflags/README.md index 3edd8a361ef4..ed4226413013 100644 --- a/third_party/rust/bitflags/README.md +++ b/third_party/rust/bitflags/README.md @@ -13,7 +13,7 @@ Add this to your `Cargo.toml`: ```toml [dependencies] -bitflags = "0.6" +bitflags = "0.7" ``` and this to your crate root: @@ -22,3 +22,22 @@ and this to your crate root: #[macro_use] extern crate bitflags; ``` + +## 128-bit integer bitflags (nightly only) + +Add this to your `Cargo.toml`: + +```toml +[dependencies.bitflags] +version = "0.7" +features = ["i128"] +``` + +and this to your crate root: + +```rust +#![feature(i128_type)] + +#[macro_use] +extern crate bitflags; +``` diff --git a/third_party/rust/bitflags/src/lib.rs b/third_party/rust/bitflags/src/lib.rs index 698799dab2ea..0d256ee0c980 100644 --- a/third_party/rust/bitflags/src/lib.rs +++ b/third_party/rust/bitflags/src/lib.rs @@ -12,6 +12,13 @@ #![no_std] +#![cfg_attr(feature = "i128", feature(i128_type))] + +// When compiled for the rustc compiler itself we want to make sure that this is +// an unstable crate. +#![cfg_attr(rustbuild, feature(staged_api))] +#![cfg_attr(rustbuild, unstable(feature = "rustc_private", issue = "27812"))] + #[cfg(test)] #[macro_use] extern crate std; @@ -22,6 +29,11 @@ extern crate std; #[doc(hidden)] pub use core as __core; +#[cfg(feature = "i128")] +pub type __BitFlagsWidth = u128; +#[cfg(not(feature = "i128"))] +pub type __BitFlagsWidth = u64; + /// The `bitflags!` macro generates a `struct` that holds a set of C-style /// bitmask flags. It is useful for creating typesafe wrappers for C APIs. /// @@ -231,12 +243,12 @@ macro_rules! bitflags { // private, which prevents us from using it to define // public constants. pub struct $BitFlags { - bits: u64, + bits: $crate::__BitFlagsWidth, } mod real_flags { use super::$BitFlags; $($(#[$Flag_attr])* pub const $Flag: $BitFlags = $BitFlags { - bits: super::super::$Flag.bits as u64 + bits: super::super::$Flag.bits as $crate::__BitFlagsWidth };)+ } // Now we define the "undefined" versions of the flags. @@ -245,7 +257,7 @@ macro_rules! bitflags { $(const $Flag: $BitFlags = $BitFlags { bits: 0 };)+ #[inline] - pub fn fmt(self_: u64, + pub fn fmt(self_: $crate::__BitFlagsWidth, f: &mut $crate::__core::fmt::Formatter) -> $crate::__core::fmt::Result { // Now we import the real values for the flags. @@ -255,7 +267,8 @@ macro_rules! bitflags { let mut first = true; $( // $Flag.bits == 0 means that $Flag doesn't exist - if $Flag.bits != 0 && self_ & $Flag.bits as u64 == $Flag.bits as u64 { + if $Flag.bits != 0 && self_ & $Flag.bits as $crate::__BitFlagsWidth == + $Flag.bits as $crate::__BitFlagsWidth { if !first { try!(f.write_str(" | ")); } @@ -266,7 +279,7 @@ macro_rules! bitflags { Ok(()) } } - dummy::fmt(self.bits as u64, f) + dummy::fmt(self.bits as $crate::__BitFlagsWidth, f) } } @@ -285,18 +298,18 @@ macro_rules! bitflags { #[allow(dead_code)] mod dummy { pub struct $BitFlags { - bits: u64, + bits: $crate::__BitFlagsWidth, } mod real_flags { use super::$BitFlags; $($(#[$Flag_attr])* pub const $Flag: $BitFlags = $BitFlags { - bits: super::super::$Flag.bits as u64 + bits: super::super::$Flag.bits as $crate::__BitFlagsWidth };)+ } $(const $Flag: $BitFlags = $BitFlags { bits: 0 };)+ #[inline] - pub fn all() -> u64 { + pub fn all() -> $crate::__BitFlagsWidth { use self::real_flags::*; $($Flag.bits)|+ } @@ -369,6 +382,16 @@ macro_rules! bitflags { pub fn toggle(&mut self, other: $BitFlags) { self.bits ^= other.bits; } + + /// Inserts or removes the specified flags depending on the passed value. + #[inline] + pub fn set(&mut self, other: $BitFlags, value: bool) { + if value { + self.insert(other); + } else { + self.remove(other); + } + } } impl $crate::__core::ops::BitOr for $BitFlags { @@ -670,6 +693,15 @@ mod tests { assert_eq!(m4, AnotherSetOfFlags::empty()); } + #[test] + fn test_set() { + let mut e1 = FlagA | FlagC; + e1.set(FlagB, true); + e1.set(FlagC, false); + + assert_eq!(e1, FlagA | FlagB); + } + #[test] fn test_assignment_operators() { let mut m1 = Flags::empty(); diff --git a/third_party/rust/bitflags/tests/i128_bitflags.rs b/third_party/rust/bitflags/tests/i128_bitflags.rs new file mode 100644 index 000000000000..9a1f03e75b50 --- /dev/null +++ b/third_party/rust/bitflags/tests/i128_bitflags.rs @@ -0,0 +1,30 @@ +#![allow(dead_code, unused_imports)] +#![cfg_attr(feature = "i128", feature(i128_type))] + +#[macro_use] +extern crate bitflags; + +#[cfg(feature = "i128")] +bitflags! { + /// baz + flags Flags128: u128 { + const A = 0x0000_0000_0000_0000_0000_0000_0000_0001, + const B = 0x0000_0000_0000_1000_0000_0000_0000_0000, + const C = 0x8000_0000_0000_0000_0000_0000_0000_0000, + const ABC = A.bits | B.bits | C.bits, + } +} + +#[cfg(feature = "i128")] +#[test] +fn test_i128_bitflags() { + assert_eq!(ABC, A | B | C); + assert_eq!(A.bits, 0x0000_0000_0000_0000_0000_0000_0000_0001); + assert_eq!(B.bits, 0x0000_0000_0000_1000_0000_0000_0000_0000); + assert_eq!(C.bits, 0x8000_0000_0000_0000_0000_0000_0000_0000); + assert_eq!(ABC.bits, 0x8000_0000_0000_1000_0000_0000_0000_0001); + assert_eq!(format!("{:?}", A), "A"); + assert_eq!(format!("{:?}", B), "B"); + assert_eq!(format!("{:?}", C), "C"); + assert_eq!(format!("{:?}", ABC), "A | B | C | ABC"); +} diff --git a/third_party/rust/clang-sys/.cargo-checksum.json b/third_party/rust/clang-sys/.cargo-checksum.json index 15578646e999..e6001df6e80f 100644 --- a/third_party/rust/clang-sys/.cargo-checksum.json +++ b/third_party/rust/clang-sys/.cargo-checksum.json @@ -1 +1 @@ -{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"09cd366a44271073e57584376fd326da166664cd8ff303c2839b63a330557c73",".travis.yml":"0e15437c62f94132e2126b56341c415464f7dc02a35cc0794d8abcc24a2e9585","CHANGELOG.md":"82d4c95ae6437044f9b27f7c6c27d5cc8231bd1e64dda6b8864425b4324d493b","CONTRIBUTING.md":"51b266af19f050c21549e2ae17445397d9d81eec30bc82490c01a69e288883e6","Cargo.toml":"f2da29e9faaae07ab6129fbd259e8d0d313d3a889eaf829c7e7fbef30b65d562","LICENSE.txt":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","README.md":"2a21a5fcc9bde7e34984f7d2c65e3fa7c49dcb064944418a58fc77d0ef1f311f","appveyor.yml":"612ad2e0be15a8d339fb8be2fc6ac317d5e6da84886f0f322af399bb1bc28591","build.rs":"804982dacd98f85c0b64d85cb4e96e4f4789a1522e6443674447a1359d6f3e9a","ci/before_install.sh":"025b6b7ac157ea43ab602bf770740929ee45aa6bf6832674c06356c380640230","ci/install.bat":"a81cc40ad9f75fd8448f0f15536c426352ad8ad6809eaf564925b709c458aade","ci/script.sh":"1bb1cd29bd9635cc126cdcbd6c02f3500620a231a86726bf2165a4b74baaf433","ci/test_script.bat":"6240fb92d8d70126deedcf38cab49a31e5fc5364a3b13e7d4bb3e4654b352446","clippy.toml":"acef14b9acffa18d1069ae08a4e8fe824a614f91b0bc71a6b1c68e4d885397e6","src/lib.rs":"08d988d984de02b1c8549687a9670fd3a835796a558ee07a1d0997b9e35bb6a5","src/link.rs":"2f4b9fadc4d565702aa3ef9bc4a9945cd6b68a1e7bd7d0daf74067a4cc624b60","src/support.rs":"7a3e6dc0eef55766dd4818fadf4fd5be69e0e1d8dab9681ca21da179aaeb1f5f","tests/header.h":"b1cf564b21d76db78529d1934e1481a5f0452fdedc6e32954608293c310498b6","tests/lib.rs":"9225ffcaa892a3901c0dce9f8190421db8fb17651499b4de765b87f08daaf5b2"},"package":"4f98f0715ff67f27ca6a2f8f0ffc2a56f8edbc7acd57489c29eadc3a15c4eafe"} \ No newline at end of file +{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"a9f9f46afd7635a8a47b385e8cb022832fe5e33f629e6f38da39ce19695b5fd5",".travis.yml":"7767a93c49d1762848d6f89dedc8b2e01a8c3795a37b358af8b791b94be42780","CHANGELOG.md":"4e419eab7bb022a75a3b56d20f08d1a6d2d7b334b7c769ddedf119c76e975715","CONTRIBUTING.md":"012c061cd6bc131e2da12a64fb479af1dbd126d754a23e799edbc1e75f1022ba","Cargo.toml":"fa622cdc43562639b210964ff743abeab65d7f5f05759e067bf20e08db2afc43","LICENSE.txt":"3ddf9be5c28fe27dad143a5dc76eea25222ad1dd68934a047064e56ed2fa40c5","README.md":"91a447ed0693ec5b7deb54880c38fd64e4b85b2576a0f6410d28f088478e7791","appveyor.yml":"6c1afedc3368e4a0079c062d95d05f76d822f94d34fa8b513866ceb4271f94b6","build.rs":"80a58cef847798788ea84a51f56f058cc6ae850892a0b1b1c99425beec611d25","ci/before_install.sh":"b190ecd9a1b3df18c544ce4f5a821a0c76504cc7291a5d5f04fe1b75904c3368","ci/install.bat":"47d2da7ae74e2577a126bbde61d286529e1d9082c42e17833e7cfa46226f0b65","ci/script.sh":"52db533df970f1b44c0b2663f3bfac4476f2150e94fc392b2bab4145325f418b","ci/test_script.bat":"901609adc59dab2730e16dd374d0351d6406e7559fe4d86ddd9a857ad9c84d2a","clippy.toml":"fcf54943ba571514b244cc098ce08671b4117167733e8107e799d533a12a2195","src/lib.rs":"96e997af6dc44530437175251884765461511a67bbb14bd3c5a994b5f9a82b47","src/link.rs":"d0e21e29e137c1c20747ad8428dadc6ed1e7cc62c5fd14cc229138daa26b3fb4","src/support.rs":"a1b919bdda41ca6f3be986aa882314fed8a1a27fcd975b796bf961d3a4b701d9","tests/header.h":"1b15a686d1c06561960045a26c25a34d840f26c8246f2f5e630f993b69c7492c","tests/lib.rs":"c258811d230506cd420ddef3c83c91de64d6cbbd4b61d1f6e1816924ab1c7a73"},"package":"5f4f6aa0c4cfa318cd4d2940afae57e48b94d44d3aced603501df24f3c2a414f"} \ No newline at end of file diff --git a/third_party/rust/clang-sys/.gitignore b/third_party/rust/clang-sys/.gitignore index d84cd72e174f..9d5be29523e4 100644 --- a/third_party/rust/clang-sys/.gitignore +++ b/third_party/rust/clang-sys/.gitignore @@ -1,3 +1,3 @@ -target/ - -Cargo.lock +target/ + +Cargo.lock diff --git a/third_party/rust/clang-sys/.travis.yml b/third_party/rust/clang-sys/.travis.yml index 94266aa220ec..38e0ac080f7a 100644 --- a/third_party/rust/clang-sys/.travis.yml +++ b/third_party/rust/clang-sys/.travis.yml @@ -1,22 +1,28 @@ -language: rust - -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - gcc-5 - -os: - - linux - - osx - -rust: stable - -env: - - LLVM_VERSION=3.5 CLANG_VERSION=clang_3_5 - - LLVM_VERSION=3.9 CLANG_VERSION=clang_3_9 - -before_install: . ./ci/before_install.sh - -script: . ./ci/script.sh +language: rust + +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-5 + +os: + - linux + - osx + +rust: stable + +env: + - LLVM_VERSION=3.5 CLANG_VERSION=clang_3_5 + - LLVM_VERSION=4.0 CLANG_VERSION=clang_4_0 + +# FIXME: I have no idea why this build is failing. +matrix: + allow_failures: + - os: osx + env: LLVM_VERSION=4.0 CLANG_VERSION=clang_4_0 + +before_install: . ./ci/before_install.sh + +script: . ./ci/script.sh diff --git a/third_party/rust/clang-sys/CHANGELOG.md b/third_party/rust/clang-sys/CHANGELOG.md index e7af3b4c6444..a540443077a4 100644 --- a/third_party/rust/clang-sys/CHANGELOG.md +++ b/third_party/rust/clang-sys/CHANGELOG.md @@ -1,187 +1,213 @@ -## [0.14.0] - 2017-01-30 - -### Changed -- Changed all enum types from tuple structs to raw integers to avoid - [segmentation faults](https://github.com/rust-lang/rust/issues/39394) on some platforms - -## [0.13.0] - 2017-01-29 - -### Changed -- Changed all opaque pointers types from tuple structs to raw pointers to avoid - [segmentation faults](https://github.com/rust-lang/rust/issues/39394) on some platforms - -## [0.12.0] - 2016-12-13 - -### Changed -- Altered the runtime linking API to allow for testing the presence of functions - -## [0.11.1] - 2016-12-07 - -### Added -- Added support for linking to Clang on Windows from unofficial LLVM sources such as MSYS and MinGW - -## [0.11.0] - 2016-10-07 - -### Changed -- Changed all enums from Rust enums to typed constants to avoid - [undefined behavior](https://github.com/KyleMayes/clang-sys/issues/42) - -## [0.10.1] - 2016-08-21 - -### Changed -- Changed static linking on FreeBSD and OS X to link against `libc++` instead of `libstd++` - -## [0.10.0] - 2016-08-01 - -### Changed -- Added `runtime` Cargo feature that links to `libclang` shared library at runtime -- Added `from_raw` method to `CXTypeLayoutError` enum -- Added implementations of `Deref` for opaque FFI structs -- Changed `Default` implementations for structs to zero out the struct - -## [0.9.0] - 2016-07-21 - -### Added -- Added documentation bindings - -## [0.8.1] - 2016-07-20 - -### Changed -- Added `CLANG_PATH` environment variable for providing a path to `clang` executable -- Added usage of `llvm-config` to search for `clang` -- Added usage of `xcodebuild` to search for `clang` on OS X - -## [0.8.0] - 2016-07-18 - -### Added -- Added support for `clang` 3.9.x - -### Changed -- Bumped `libc` version to `0.2.14` - -### Fixed -- Fixed `LIBCLANG_PATH` usage on Windows to search both the `bin` and `lib` directories -- Fixed search path parsing on OS X -- Fixed search path parsing on Windows -- Fixed default search path ordering on OS X - -## [0.7.2] - 2016-06-17 - -### Fixed -- Fixed finding of `clang` executables when system has executables matching `clang-*` - (e.g., `clang-format`) - -## [0.7.1] - 2016-06-10 - -### Changed -- Bumped `libc` version to `0.2.12` - -### Fixed -- Fixed finding of `clang` executables suffixed by their version (e.g., `clang-3.5`) - -## [0.7.0] - 2016-05-31 - -### Changed -- Changed `Clang` struct `version` field type to `Option` - -## [0.6.0] - 2016-05-26 - -### Added -- Added `support` module - -### Fixed -- Fixed `libclang` linking on FreeBSD -- Fixed `libclang` linking on Windows with the MSVC toolchain -- Improved `libclang` static linking - -## [0.5.4] - 20160-5-19 - -### Changed -- Added implementations of `Default` for FFI structs - -## [0.5.3] - 2016-05-17 - -### Changed -- Bumped `bitflags` version to `0.7.0` - -## [0.5.2] - 2016-05-12 - -### Fixed -- Fixed `libclang` static linking - -## [0.5.1] - 2016-05-10 - -### Fixed -- Fixed `libclang` linking on OS X -- Fixed `libclang` linking on Windows - -## [0.5.0] - 2016-05-10 - -### Removed -- Removed `rustc_version` dependency -- Removed support for `LIBCLANG_STATIC` environment variable - -### Changed -- Bumped `bitflags` version to `0.6.0` -- Bumped `libc` version to `0.2.11` -- Improved `libclang` search path -- Improved `libclang` static linking - -## [0.4.2] - 2016-04-20 - -### Changed -- Bumped `libc` version to `0.2.10` - -## [0.4.1] - 2016-04-02 - -### Changed -- Bumped `libc` version to `0.2.9` -- Bumped `rustc_version` version to `0.1.7` - -## [0.4.0] - 2016-03-28 - -### Removed -- Removed support for `clang` 3.4.x - -## [0.3.1] - 2016-03-21 - -### Added -- Added support for finding `libclang` - -## [0.3.0] - 2016-03-16 - -### Removed -- Removed build system types and functions - -### Added -- Added support for `clang` 3.4.x - -### Changed -- Bumped `bitflags` version to `0.5.0` -- Bumped `libc` version to `0.2.8` - -## [0.2.1] - 2016-02-13 - -### Changed -- Simplified internal usage of conditional compilation -- Bumped `bitflags` version to `0.4.0` -- Bumped `libc` version to `0.2.7` -- Bumped `rustc_version` version to `0.1.6` - -## [0.2.0] - 2016-02-12 - -### Added -- Added support for `clang` 3.8.x - -## [0.1.2] - 2015-12-29 - -### Added -- Added derivations of `Debug` for FFI structs - -## [0.1.1] - 2015-12-26 - -### Added -- Added derivations of `PartialOrd` and `Ord` for FFI enums - -## [0.1.0] - 2015-12-22 -- Initial release +## [0.16.0] - 2017-05-02 + +### Changed +- Bumped `libloading` version to `0.4.0` + +## [0.15.2] - 2017-04-28 + +### Fixed +- Fixed finding of `libclang.so.1` on Linux + +## [0.15.1] - 2017-03-29 + +### Fixed +- Fixed static linking when libraries are in [different directories](https://github.com/KyleMayes/clang-sys/issues/50) + +## [0.15.0] - 2017-03-13 + +### Added +- Added support for `clang` 4.0.x + +### Changed +- Changed functions in the `Functions` struct to be `unsafe` (`runtime` feature only) +- Changed `Clang::find` method to ignore directories and non-executable files +- Changed `Clang::find` to skip dynamic libraries for an incorrect architecture on FreeBSD and Linux +- Bumped `bitflags` version to `0.7.0` + +## [0.14.0] - 2017-01-30 + +### Changed +- Changed all enum types from tuple structs to raw integers to avoid + [segmentation faults](https://github.com/rust-lang/rust/issues/39394) on some platforms + +## [0.13.0] - 2017-01-29 + +### Changed +- Changed all opaque pointers types from tuple structs to raw pointers to avoid + [segmentation faults](https://github.com/rust-lang/rust/issues/39394) on some platforms + +## [0.12.0] - 2016-12-13 + +### Changed +- Altered the runtime linking API to allow for testing the presence of functions + +## [0.11.1] - 2016-12-07 + +### Added +- Added support for linking to Clang on Windows from unofficial LLVM sources such as MSYS and MinGW + +## [0.11.0] - 2016-10-07 + +### Changed +- Changed all enums from Rust enums to typed constants to avoid + [undefined behavior](https://github.com/KyleMayes/clang-sys/issues/42) + +## [0.10.1] - 2016-08-21 + +### Changed +- Changed static linking on FreeBSD and OS X to link against `libc++` instead of `libstd++` + +## [0.10.0] - 2016-08-01 + +### Changed +- Added `runtime` Cargo feature that links to `libclang` shared library at runtime +- Added `from_raw` method to `CXTypeLayoutError` enum +- Added implementations of `Deref` for opaque FFI structs +- Changed `Default` implementations for structs to zero out the struct + +## [0.9.0] - 2016-07-21 + +### Added +- Added documentation bindings + +## [0.8.1] - 2016-07-20 + +### Changed +- Added `CLANG_PATH` environment variable for providing a path to `clang` executable +- Added usage of `llvm-config` to search for `clang` +- Added usage of `xcodebuild` to search for `clang` on OS X + +## [0.8.0] - 2016-07-18 + +### Added +- Added support for `clang` 3.9.x + +### Changed +- Bumped `libc` version to `0.2.14` + +### Fixed +- Fixed `LIBCLANG_PATH` usage on Windows to search both the `bin` and `lib` directories +- Fixed search path parsing on OS X +- Fixed search path parsing on Windows +- Fixed default search path ordering on OS X + +## [0.7.2] - 2016-06-17 + +### Fixed +- Fixed finding of `clang` executables when system has executables matching `clang-*` + (e.g., `clang-format`) + +## [0.7.1] - 2016-06-10 + +### Changed +- Bumped `libc` version to `0.2.12` + +### Fixed +- Fixed finding of `clang` executables suffixed by their version (e.g., `clang-3.5`) + +## [0.7.0] - 2016-05-31 + +### Changed +- Changed `Clang` struct `version` field type to `Option` + +## [0.6.0] - 2016-05-26 + +### Added +- Added `support` module + +### Fixed +- Fixed `libclang` linking on FreeBSD +- Fixed `libclang` linking on Windows with the MSVC toolchain +- Improved `libclang` static linking + +## [0.5.4] - 20160-5-19 + +### Changed +- Added implementations of `Default` for FFI structs + +## [0.5.3] - 2016-05-17 + +### Changed +- Bumped `bitflags` version to `0.7.0` + +## [0.5.2] - 2016-05-12 + +### Fixed +- Fixed `libclang` static linking + +## [0.5.1] - 2016-05-10 + +### Fixed +- Fixed `libclang` linking on OS X +- Fixed `libclang` linking on Windows + +## [0.5.0] - 2016-05-10 + +### Removed +- Removed `rustc_version` dependency +- Removed support for `LIBCLANG_STATIC` environment variable + +### Changed +- Bumped `bitflags` version to `0.6.0` +- Bumped `libc` version to `0.2.11` +- Improved `libclang` search path +- Improved `libclang` static linking + +## [0.4.2] - 2016-04-20 + +### Changed +- Bumped `libc` version to `0.2.10` + +## [0.4.1] - 2016-04-02 + +### Changed +- Bumped `libc` version to `0.2.9` +- Bumped `rustc_version` version to `0.1.7` + +## [0.4.0] - 2016-03-28 + +### Removed +- Removed support for `clang` 3.4.x + +## [0.3.1] - 2016-03-21 + +### Added +- Added support for finding `libclang` + +## [0.3.0] - 2016-03-16 + +### Removed +- Removed build system types and functions + +### Added +- Added support for `clang` 3.4.x + +### Changed +- Bumped `bitflags` version to `0.5.0` +- Bumped `libc` version to `0.2.8` + +## [0.2.1] - 2016-02-13 + +### Changed +- Simplified internal usage of conditional compilation +- Bumped `bitflags` version to `0.4.0` +- Bumped `libc` version to `0.2.7` +- Bumped `rustc_version` version to `0.1.6` + +## [0.2.0] - 2016-02-12 + +### Added +- Added support for `clang` 3.8.x + +## [0.1.2] - 2015-12-29 + +### Added +- Added derivations of `Debug` for FFI structs + +## [0.1.1] - 2015-12-26 + +### Added +- Added derivations of `PartialOrd` and `Ord` for FFI enums + +## [0.1.0] - 2015-12-22 +- Initial release diff --git a/third_party/rust/clang-sys/CONTRIBUTING.md b/third_party/rust/clang-sys/CONTRIBUTING.md index 185af054c538..e45fa0b8179f 100644 --- a/third_party/rust/clang-sys/CONTRIBUTING.md +++ b/third_party/rust/clang-sys/CONTRIBUTING.md @@ -1,14 +1,7 @@ -Contributing to clang-sys -========================= - -Issues ------- - -Please include the output of `rustc --version --verbose` in your issue. - -Pull Requests -------------- - -If you are intending to make a pull request, please make your changes in a branch that originated -from the `development` branch, not the `master` branch. Then, make your pull request against the -`development` branch. +# Contributing to clang-sys + +## Pull Requests + +If you are intending to make a pull request, please make your changes in a branch that originated +from the `development` branch, not the `master` branch. Then, make your pull request against the +`development` branch. diff --git a/third_party/rust/clang-sys/Cargo.toml b/third_party/rust/clang-sys/Cargo.toml index af52c33ec084..3ff8078dbd6f 100644 --- a/third_party/rust/clang-sys/Cargo.toml +++ b/third_party/rust/clang-sys/Cargo.toml @@ -1,48 +1,49 @@ -[package] - -name = "clang-sys" -authors = ["Kyle Mayes "] - -version = "0.14.0" - -readme = "README.md" -license = "Apache-2.0" - -description = "Rust bindings for libclang." - -documentation = "https://kylemayes.github.io/clang-sys/3_5/clang_sys" -repository = "https://github.com/KyleMayes/clang-sys" - -build = "build.rs" - -[features] - -clang_3_5 = [] -clang_3_6 = ["gte_clang_3_6"] -clang_3_7 = ["gte_clang_3_6", "gte_clang_3_7"] -clang_3_8 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8"] -clang_3_9 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9"] - -gte_clang_3_6 = [] -gte_clang_3_7 = [] -gte_clang_3_8 = [] -gte_clang_3_9 = [] - -runtime = ["lazy_static", "libloading"] -static = [] - -[dependencies] - -bitflags = "0.7.0" -glob = "0.2.11" -lazy_static = { version = "0.2.1", optional = true } -libc = "0.2.14" -libloading = { version = "0.3.0", optional = true } - -clippy = { version = "0.0.*", optional = true } - -[build-dependencies] - -glob = "0.2.11" - -clippy = { version = "0.0.*", optional = true } +[package] + +name = "clang-sys" +authors = ["Kyle Mayes "] + +version = "0.16.0" + +readme = "README.md" +license = "Apache-2.0" + +description = "Rust bindings for libclang." + +documentation = "https://kylemayes.github.io/clang-sys/3_5/clang_sys" +repository = "https://github.com/KyleMayes/clang-sys" + +build = "build.rs" + +[features] + +clang_3_5 = [] +clang_3_6 = ["gte_clang_3_6"] +clang_3_7 = ["gte_clang_3_6", "gte_clang_3_7"] +clang_3_8 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8"] +clang_3_9 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9"] +clang_4_0 = ["gte_clang_3_6", "gte_clang_3_7", "gte_clang_3_8", "gte_clang_3_9", "gte_clang_4_0"] + +gte_clang_3_6 = [] +gte_clang_3_7 = [] +gte_clang_3_8 = [] +gte_clang_3_9 = [] +gte_clang_4_0 = [] + +runtime = ["libloading"] +static = [] + +[dependencies] + +bitflags = "0.8.0" +glob = "0.2.11" +libc = "0.2.14" +libloading = { version = "0.4.0", optional = true } + +clippy = { version = "0.0.*", optional = true } + +[build-dependencies] + +glob = "0.2.11" + +clippy = { version = "0.0.*", optional = true } diff --git a/third_party/rust/clang-sys/LICENSE.txt b/third_party/rust/clang-sys/LICENSE.txt index d64569567334..75b52484ea47 100644 --- a/third_party/rust/clang-sys/LICENSE.txt +++ b/third_party/rust/clang-sys/LICENSE.txt @@ -1,202 +1,202 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed 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. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. diff --git a/third_party/rust/clang-sys/README.md b/third_party/rust/clang-sys/README.md index 2ba1d192b0eb..d05e61ed261e 100644 --- a/third_party/rust/clang-sys/README.md +++ b/third_party/rust/clang-sys/README.md @@ -1,96 +1,100 @@ -# clang-sys - -[![crates.io](https://img.shields.io/crates/v/clang-sys.svg)](https://crates.io/crates/clang-sys) -[![Travis CI](https://travis-ci.org/KyleMayes/clang-sys.svg?branch=master)](https://travis-ci.org/KyleMayes/clang-sys) -[![AppVeyor](https://ci.appveyor.com/api/projects/status/7tv5mjyg55rof356/branch/master?svg=true)](https://ci.appveyor.com/project/KyleMayes/clang-sys-vtvy5/branch/master) - -Rust bindings for `libclang`. - -If you are interested in a Rust wrapper for these bindings, see -[clang-rs](https://github.com/KyleMayes/clang-rs). - -Supported on the stable, beta, and nightly Rust channels. - -Released under the Apache License 2.0. - -## Supported Versions - -To target a version of `libclang`, enable one of the following Cargo features: - -* `clang_3_5` - requires `libclang` 3.5 or later - ([Documentation](https://kylemayes.github.io/clang-sys/3_5/clang_sys)) -* `clang_3_6` - requires `libclang` 3.6 or later - ([Documentation](https://kylemayes.github.io/clang-sys/3_6/clang_sys)) -* `clang_3_7` - requires `libclang` 3.7 or later - ([Documentation](https://kylemayes.github.io/clang-sys/3_7/clang_sys)) -* `clang_3_8` - requires `libclang` 3.8 or later - ([Documentation](https://kylemayes.github.io/clang-sys/3_8/clang_sys)) -* `clang_3_9` - requires `libclang` 3.9 or later - ([Documentation](https://kylemayes.github.io/clang-sys/3_9/clang_sys)) - -If you do not enable one of these features, the API provided by `libclang` 3.5 will be available by -default. - -## Dependencies - -By default, this crate will attempt to link to `libclang` dynamically. In this case, this crate -depends on the `libclang` shared library (`libclang.so` on Linux, `libclang.dylib` on OS X, -`libclang.dll` on Windows). If you want to link to `libclang` statically instead, enable the -`static` Cargo feature. In this case, this crate depends on the LLVM and Clang static libraries. If -you don't want to link to `libclang` at compiletime but instead want to load it at runtime, enable -the `runtime` Cargo feature. - -These libraries can be either be installed as a part of Clang or downloaded -[here](http://llvm.org/releases/download.html). - -**Note:** Installing `libclang` through a package manager might install the `libclang` shared -library as something like `libclang.so.1` instead of `libclang.so`. In this case, you need to make a -symbolic link from the versioned shared library to `libclang.so`. - -**Note:** The downloads for LLVM and Clang 3.8 and later do not include the `libclang.a` static -library. This means you cannot link to any of these versions of `libclang` statically unless you -build it from source. - -## Environment Variables - -The following environment variables, if set, are used by this crate to find the required libraries -and executables: - -* `LLVM_CONFIG_PATH` **(compile time)** - provides a path to an `llvm-config` executable -* `LIBCLANG_PATH` **(compile time)** - provides a path to a directory containing a `libclang` shared - library -* `LIBCLANG_STATIC_PATH` **(compile time)** - provides a path to a directory containing LLVM and - Clang static libraries -* `CLANG_PATH` **(run time)** - provides a path to a `clang` executable - -## Linking - -### Dynamic - -First, the `libclang` shared library will be searched for in the directory provided by the -`LIBCLANG_PATH` environment variable if it was set. If this fails, the directory returned by -`llvm-config --libdir` will be searched. If neither of these approaches is successful, a list of -likely directories will be searched (e.g., `/usr/local/lib` on Linux). - -On Linux, running an executable that has been dynamically linked to `libclang` may require you to -add a path to `libclang.so` to the `LD_LIBRARY_PATH` environment variable. The same is true on OS -X, except the `DYLD_LIBRARY_PATH` environment variable is used instead. - -On Windows, running an executable that has been dynamically linked to `libclang` requires that -`libclang.dll` can be found by the executable at runtime. See -[here](https://msdn.microsoft.com/en-us/library/7d83bc18.aspx) for more information. - -### Static - -The availability of `llvm-config` is not optional for static linking. Ensure that an instance of -this executable can be found on your system's path or set the `LLVM_CONFIG_PATH` environment -variable. The required LLVM and Clang static libraries will be searched for in the same way as the -shared library is searched for, except the `LIBCLANG_STATIC_PATH` environment variable is used in -place of the `LIBCLANG_PATH` environment variable. - -### Runtime - -The `clang_sys::load` function is used to load a `libclang` shared library for use in the thread in -which it is called. The `clang_sys::unload` function will unload the `libclang` shared library. -`clang_sys::load` searches for a `libclang` shared library in the same way one is searched for when -linking to `libclang` dynamically at compiletime. +# clang-sys + +[![crates.io](https://img.shields.io/crates/v/clang-sys.svg)](https://crates.io/crates/clang-sys) +[![Travis CI](https://travis-ci.org/KyleMayes/clang-sys.svg?branch=master)](https://travis-ci.org/KyleMayes/clang-sys) +[![AppVeyor](https://ci.appveyor.com/api/projects/status/7tv5mjyg55rof356/branch/master?svg=true)](https://ci.appveyor.com/project/KyleMayes/clang-sys-vtvy5/branch/master) + +Rust bindings for `libclang`. + +If you are interested in a Rust wrapper for these bindings, see +[clang-rs](https://github.com/KyleMayes/clang-rs). + +Supported on the stable, beta, and nightly Rust channels. + +Released under the Apache License 2.0. + +See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on contributing to this repository. + +## Supported Versions + +To target a version of `libclang`, enable one of the following Cargo features: + +* `clang_3_5` - requires `libclang` 3.5 or later + ([Documentation](https://kylemayes.github.io/clang-sys/3_5/clang_sys)) +* `clang_3_6` - requires `libclang` 3.6 or later + ([Documentation](https://kylemayes.github.io/clang-sys/3_6/clang_sys)) +* `clang_3_7` - requires `libclang` 3.7 or later + ([Documentation](https://kylemayes.github.io/clang-sys/3_7/clang_sys)) +* `clang_3_8` - requires `libclang` 3.8 or later + ([Documentation](https://kylemayes.github.io/clang-sys/3_8/clang_sys)) +* `clang_3_9` - requires `libclang` 3.9 or later + ([Documentation](https://kylemayes.github.io/clang-sys/3_9/clang_sys)) +* `clang_4_0` - requires `libclang` 4.0 or later + ([Documentation](https://kylemayes.github.io/clang-sys/4_0/clang_sys)) + +If you do not enable one of these features, the API provided by `libclang` 3.5 will be available by +default. + +## Dependencies + +By default, this crate will attempt to link to `libclang` dynamically. In this case, this crate +depends on the `libclang` shared library (`libclang.so` on Linux, `libclang.dylib` on OS X, +`libclang.dll` on Windows). If you want to link to `libclang` statically instead, enable the +`static` Cargo feature. In this case, this crate depends on the LLVM and Clang static libraries. If +you don't want to link to `libclang` at compiletime but instead want to load it at runtime, enable +the `runtime` Cargo feature. + +These libraries can be either be installed as a part of Clang or downloaded +[here](http://llvm.org/releases/download.html). + +**Note:** Installing `libclang` through a package manager might install the `libclang` shared +library as something like `libclang.so.1` instead of `libclang.so`. In this case, you need to make a +symbolic link from the versioned shared library to `libclang.so`. + +**Note:** The downloads for LLVM and Clang 3.8 and later do not include the `libclang.a` static +library. This means you cannot link to any of these versions of `libclang` statically unless you +build it from source. + +## Environment Variables + +The following environment variables, if set, are used by this crate to find the required libraries +and executables: + +* `LLVM_CONFIG_PATH` **(compile time)** - provides a path to an `llvm-config` executable +* `LIBCLANG_PATH` **(compile time)** - provides a path to a directory containing a `libclang` shared + library +* `LIBCLANG_STATIC_PATH` **(compile time)** - provides a path to a directory containing LLVM and + Clang static libraries +* `CLANG_PATH` **(run time)** - provides a path to a `clang` executable + +## Linking + +### Dynamic + +First, the `libclang` shared library will be searched for in the directory provided by the +`LIBCLANG_PATH` environment variable if it was set. If this fails, the directory returned by +`llvm-config --libdir` will be searched. If neither of these approaches is successful, a list of +likely directories will be searched (e.g., `/usr/local/lib` on Linux). + +On Linux, running an executable that has been dynamically linked to `libclang` may require you to +add a path to `libclang.so` to the `LD_LIBRARY_PATH` environment variable. The same is true on OS +X, except the `DYLD_LIBRARY_PATH` environment variable is used instead. + +On Windows, running an executable that has been dynamically linked to `libclang` requires that +`libclang.dll` can be found by the executable at runtime. See +[here](https://msdn.microsoft.com/en-us/library/7d83bc18.aspx) for more information. + +### Static + +The availability of `llvm-config` is not optional for static linking. Ensure that an instance of +this executable can be found on your system's path or set the `LLVM_CONFIG_PATH` environment +variable. The required LLVM and Clang static libraries will be searched for in the same way as the +shared library is searched for, except the `LIBCLANG_STATIC_PATH` environment variable is used in +place of the `LIBCLANG_PATH` environment variable. + +### Runtime + +The `clang_sys::load` function is used to load a `libclang` shared library for use in the thread in +which it is called. The `clang_sys::unload` function will unload the `libclang` shared library. +`clang_sys::load` searches for a `libclang` shared library in the same way one is searched for when +linking to `libclang` dynamically at compiletime. diff --git a/third_party/rust/clang-sys/appveyor.yml b/third_party/rust/clang-sys/appveyor.yml index a0b1c05508d1..4ed3cfc215e5 100644 --- a/third_party/rust/clang-sys/appveyor.yml +++ b/third_party/rust/clang-sys/appveyor.yml @@ -1,12 +1,12 @@ -environment: - matrix: - - LLVM_VERSION: 3.9 - CLANG_VERSION: clang_3_9 - -install: - - .\ci\install.bat - -build: false - -test_script: - - .\ci\test_script.bat +environment: + matrix: + - LLVM_VERSION: 4.0.0 + CLANG_VERSION: clang_4_0 + +install: + - .\ci\install.bat + +build: false + +test_script: + - .\ci\test_script.bat diff --git a/third_party/rust/clang-sys/build.rs b/third_party/rust/clang-sys/build.rs index ba0a733b223d..d994aafced0b 100644 --- a/third_party/rust/clang-sys/build.rs +++ b/third_party/rust/clang-sys/build.rs @@ -1,288 +1,355 @@ -// Copyright 2016 Kyle Mayes -// -// Licensed 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. - -//! Finds and links to the required `libclang` libraries. - -#![cfg_attr(feature="clippy", feature(plugin))] -#![cfg_attr(feature="clippy", plugin(clippy))] -#![cfg_attr(feature="clippy", warn(clippy))] - -extern crate glob; - -use std::env; -use std::fs; -use std::path::{Path, PathBuf}; -use std::process::{Command}; - -use glob::{MatchOptions}; - -// Environment variables: -// -// * LLVM_CONFIG_PATH - provides a path to an `llvm-config` executable -// * LIBCLANG_PATH - provides a path to a directory containing a `libclang` shared library -// * LIBCLANG_STATIC_PATH - provides a path to a directory containing LLVM and Clang static libraries - -/// Returns a path to one of the supplied files if such a file can be found in the supplied directory. -fn contains>(directory: D, files: &[String]) -> Option { - files.iter().map(|file| directory.as_ref().join(file)).find(|file| file.exists()) -} - -/// Runs a console command, returning the output if the command was successfully executed. -fn run(command: &str, arguments: &[&str]) -> Option { - Command::new(command).args(arguments).output().map(|o| { - String::from_utf8_lossy(&o.stdout).into_owned() - }).ok() -} - -/// Runs `llvm-config`, returning the output if the command was successfully executed. -fn run_llvm_config(arguments: &[&str]) -> Option { - run(&env::var("LLVM_CONFIG_PATH").unwrap_or("llvm-config".into()), arguments) -} - -/// Backup search directory globs for FreeBSD and Linux. -const SEARCH_LINUX: &'static [&'static str] = &[ - "/usr/lib*", - "/usr/lib*/*", - "/usr/lib*/*/*", - "/usr/local/lib*", - "/usr/local/lib*/*", - "/usr/local/lib*/*/*", - "/usr/local/llvm*/lib", -]; - -/// Backup search directory globs for OS X. -const SEARCH_OSX: &'static [&'static str] = &[ - "/usr/local/opt/llvm*/lib", - "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib", - "/Library/Developer/CommandLineTools/usr/lib", - "/usr/local/opt/llvm*/lib/llvm*/lib", -]; - -/// Backup search directory globs for Windows. -const SEARCH_WINDOWS: &'static [&'static str] = &[ - "C:\\LLVM\\lib", - "C:\\Program Files*\\LLVM\\lib", - "C:\\MSYS*\\MinGW*\\lib", -]; - -/// Searches for a library, returning the directory it can be found in if the search was successful. -fn find(files: &[String], env: &str) -> Result { - /// Searches the supplied directory and, on Windows, any relevant sibling directories. - macro_rules! search_directory { - ($directory:ident) => { - if let Some(file) = contains(&$directory, files) { - return Ok(file); - } - - // On Windows, `libclang.dll` is usually found in the LLVM `bin` directory while - // `libclang.lib` is usually found in the LLVM `lib` directory. To keep things - // consistent with other platforms, only LLVM `lib` directories are included in the - // backup search directory globs so we need to search the LLVM `bin` directory here. - if cfg!(target_os="windows") && $directory.ends_with("lib") { - let sibling = $directory.parent().unwrap().join("bin"); - if let Some(file) = contains(&sibling, files) { - return Ok(file); - } - } - } - } - - // Search the directory provided by the relevant environment variable if it is set. - if let Ok(directory) = env::var(env).map(|d| Path::new(&d).to_path_buf()) { - search_directory!(directory); - } - - // Search the `bin` and `lib` subdirectories in the directory returned by - // `llvm-config --prefix` if `llvm-config` is available. - if let Some(output) = run_llvm_config(&["--prefix"]) { - let directory = Path::new(output.lines().next().unwrap()).to_path_buf(); - let bin = directory.join("bin"); - if let Some(file) = contains(&bin, files) { - return Ok(file); - } - let lib = directory.join("lib"); - if let Some(file) = contains(&lib, files) { - return Ok(file); - } - } - - // Search the backup directories. - let search = if cfg!(any(target_os="freebsd", target_os="linux")) { - SEARCH_LINUX - } else if cfg!(target_os="macos") { - SEARCH_OSX - } else if cfg!(target_os="windows") { - SEARCH_WINDOWS - } else { - &[] - }; - for pattern in search { - let mut options = MatchOptions::new(); - options.case_sensitive = false; - options.require_literal_separator = true; - if let Ok(paths) = glob::glob_with(pattern, &options) { - for path in paths.filter_map(Result::ok).filter(|p| p.is_dir()) { - search_directory!(path); - } - } - } - - let message = format!( - "couldn't find any of {}, set the {} environment variable to a path where one of these \ - files can be found", - files.iter().map(|f| format!("'{}'", f)).collect::>().join(", "), - env, - ); - Err(message) -} - -/// Searches for a `libclang` shared library, returning the path to such a shared library if the -/// search was successful. -pub fn find_shared_library() -> Result { - let mut files = vec![]; - if cfg!(target_os="windows") { - // The official LLVM build uses `libclang.dll` on Windows instead of `clang.dll`. However, - // unofficial builds such as MinGW use `clang.dll`. - files.push("libclang.dll".into()); - } - files.push(format!("{}clang{}", env::consts::DLL_PREFIX, env::consts::DLL_SUFFIX)); - find(&files, "LIBCLANG_PATH") -} - -/// Returns the name of an LLVM or Clang library from a path to such a library. -fn get_library_name(path: &Path) -> Option { - path.file_stem().map(|l| l.to_string_lossy()[3..].into()) -} - -/// Returns the LLVM libraries required to link to `libclang` statically. -fn get_llvm_libraries() -> Vec { - run_llvm_config(&["--libs"]).expect( - "couldn't execute `llvm-config --libs`, set the LLVM_CONFIG_PATH environment variable to a \ - path to an `llvm-config` executable" - ).split_whitespace().filter_map(|p| { - // Depending on the version of `llvm-config` in use, listed libraries may be in one of two - // forms, a full path to the library or simply prefixed with `-l`. - if p.starts_with("-l") { - Some(p[2..].into()) - } else { - get_library_name(Path::new(p)) - } - }).collect() -} - -/// Clang libraries required to link to `libclang` 3.5 and later statically. -const CLANG_LIBRARIES: &'static [&'static str] = &[ - "clang", - "clangAST", - "clangAnalysis", - "clangBasic", - "clangDriver", - "clangEdit", - "clangFrontend", - "clangIndex", - "clangLex", - "clangParse", - "clangRewrite", - "clangSema", - "clangSerialization", -]; - -/// Returns the Clang libraries required to link to `libclang` statically. -fn get_clang_libraries>(directory: P) -> Vec { - let pattern = directory.as_ref().join("libclang*.a").to_string_lossy().to_string(); - if let Ok(libraries) = glob::glob(&pattern) { - libraries.filter_map(|l| l.ok().and_then(|l| get_library_name(&l))).collect() - } else { - CLANG_LIBRARIES.iter().map(|l| l.to_string()).collect() - } -} - -/// Find and link to `libclang` statically. -#[cfg_attr(feature="runtime", allow(dead_code))] -fn link_static() { - let file = find(&["libclang.a".into()], "LIBCLANG_STATIC_PATH").unwrap(); - let directory = file.parent().unwrap(); - print!("cargo:rustc-flags="); - - // Specify required LLVM and Clang static libraries. - print!("-L {} ", directory.display()); - for library in get_llvm_libraries() { - print!("-l static={} ", library); - } - for library in get_clang_libraries(&directory) { - print!("-l static={} ", library); - } - - // Specify required system libraries. - if cfg!(target_os="freebsd") { - println!("-l ffi -l ncursesw -l c++ -l z"); - } else if cfg!(target_os="linux") { - println!("-l ffi -l ncursesw -l stdc++ -l z"); - } else if cfg!(target_os="macos") { - println!("-l ffi -l ncurses -l c++ -l z"); - } else { - panic!("unsupported operating system for static linking"); - } -} - -/// Find and link to `libclang` dynamically. -#[cfg_attr(feature="runtime", allow(dead_code))] -fn link_dynamic() { - let file = find_shared_library().unwrap(); - let directory = file.parent().unwrap(); - println!("cargo:rustc-link-search={}", directory.display()); - - if cfg!(all(target_os="windows", target_env="msvc")) { - // Find the `libclang` stub static library required for the MSVC toolchain. - let libdir = if !directory.ends_with("bin") { - directory.to_owned() - } else { - directory.parent().unwrap().join("lib") - }; - if libdir.join("libclang.lib").exists() { - println!("cargo:rustc-link-search={}", libdir.display()); - } else if libdir.join("libclang.dll.a").exists() { - // MSYS and MinGW use `libclang.dll.a` instead of `libclang.lib`. It is linkable with - // the MSVC linker, but Rust doesn't recognize the `.a` suffix, so we need to copy it - // with a different name. - // - // FIXME: Maybe we can just hardlink or symlink it? - let out = env::var("OUT_DIR").unwrap(); - fs::copy(libdir.join("libclang.dll.a"), Path::new(&out).join("libclang.lib")).unwrap(); - println!("cargo:rustc-link-search=native={}", out); - } else { - panic!( - "using '{}', so 'libclang.lib' or 'libclang.dll.a' must be available in {}", - file.display(), - libdir.display(), - ); - } - println!("cargo:rustc-link-lib=dylib=libclang"); - } else { - println!("cargo:rustc-link-lib=dylib=clang"); - } -} - -#[cfg_attr(feature="runtime", allow(dead_code))] -fn main() { - if cfg!(feature="runtime") { - if cfg!(feature="static") { - panic!("`runtime` and `static` features can't be combined"); - } - } else if cfg!(feature="static") { - link_static(); - } else { - link_dynamic(); - } -} +// Copyright 2016 Kyle Mayes +// +// Licensed 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. + +//! Finds the required `libclang` libraries and links to them. +//! +//! # Environment Variables +//! +//! This build script can make use of several environment variables to help it find the required +//! static or dynamic libraries. +//! +//! * LLVM_CONFIG_PATH - provides a path to an `llvm-config` executable +//! * LIBCLANG_PATH - provides a path to a directory containing a `libclang` shared library +//! * LIBCLANG_STATIC_PATH - provides a path to a directory containing LLVM and Clang static libraries + +#![allow(unused_attributes)] + +#![cfg_attr(feature="clippy", feature(plugin))] +#![cfg_attr(feature="clippy", plugin(clippy))] +#![cfg_attr(feature="clippy", warn(clippy))] + +extern crate glob; + +use std::env; +use std::fs::{self, File}; +use std::io::{Read}; +use std::path::{Path, PathBuf}; +use std::process::{Command}; + +use glob::{MatchOptions}; + +/// Returns a path to one of the supplied files if such a file can be found in the supplied directory. +fn contains>(directory: D, files: &[String]) -> Option { + files.iter().map(|file| directory.as_ref().join(file)).find(|file| file.exists()) +} + +/// Runs a console command, returning the output if the command was successfully executed. +fn run(command: &str, arguments: &[&str]) -> Option { + Command::new(command).args(arguments).output().map(|o| { + String::from_utf8_lossy(&o.stdout).into_owned() + }).ok() +} + +/// Runs `llvm-config`, returning the output if the command was successfully executed. +fn run_llvm_config(arguments: &[&str]) -> Result { + match run(&env::var("LLVM_CONFIG_PATH").unwrap_or_else(|_| "llvm-config".into()), arguments) { + Some(output) => Ok(output), + None => { + let message = format!( + "couldn't execute `llvm-config {}`, set the LLVM_CONFIG_PATH environment variable \ + to a path to a valid `llvm-config` executable", + arguments.join(" "), + ); + Err(message) + }, + } +} + +/// Backup search directory globs for FreeBSD and Linux. +const SEARCH_LINUX: &'static [&'static str] = &[ + "/usr/lib*", + "/usr/lib*/*", + "/usr/lib*/*/*", + "/usr/local/lib*", + "/usr/local/lib*/*", + "/usr/local/lib*/*/*", + "/usr/local/llvm*/lib", +]; + +/// Backup search directory globs for OS X. +const SEARCH_OSX: &'static [&'static str] = &[ + "/usr/local/opt/llvm*/lib", + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib", + "/Library/Developer/CommandLineTools/usr/lib", + "/usr/local/opt/llvm*/lib/llvm*/lib", +]; + +/// Backup search directory globs for Windows. +const SEARCH_WINDOWS: &'static [&'static str] = &[ + "C:\\LLVM\\lib", + "C:\\Program Files*\\LLVM\\lib", + "C:\\MSYS*\\MinGW*\\lib", +]; + +/// Indicates the type of library being searched for. +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +enum Library { + Dynamic, + Static, +} + +impl Library { + /// Checks whether the supplied file is a valid library for the architecture. + fn check(&self, file: &PathBuf) -> Result<(), String> { + if cfg!(any(target_os="freebsd", target_os="linux")) { + if *self == Library::Static { + return Ok(()); + } + let mut file = try!(File::open(file).map_err(|e| e.to_string())); + let mut elf = [0; 5]; + try!(file.read_exact(&mut elf).map_err(|e| e.to_string())); + if elf[..4] != [127, 69, 76, 70] { + return Err("invalid ELF header".into()); + } + if cfg!(target_pointer_width="32") && elf[4] != 1 { + return Err("invalid ELF class (64-bit)".into()); + } + if cfg!(target_pointer_width="64") && elf[4] != 2 { + return Err("invalid ELF class (32-bit)".into()); + } + Ok(()) + } else { + Ok(()) + } + } +} + +/// Searches for a library, returning the directory it can be found in if the search was successful. +fn find(library: Library, files: &[String], env: &str) -> Result { + let mut skipped = vec![]; + + /// Attempts to return the supplied file. + macro_rules! try_file { + ($file:expr) => ({ + match library.check(&$file) { + Ok(_) => return Ok($file), + Err(message) => skipped.push(format!("({}: {})", $file.display(), message)), + } + }); + } + + /// Searches the supplied directory and, on Windows, any relevant sibling directories. + macro_rules! search_directory { + ($directory:ident) => { + if let Some(file) = contains(&$directory, files) { + try_file!(file); + } + + // On Windows, `libclang.dll` is usually found in the LLVM `bin` directory while + // `libclang.lib` is usually found in the LLVM `lib` directory. To keep things + // consistent with other platforms, only LLVM `lib` directories are included in the + // backup search directory globs so we need to search the LLVM `bin` directory here. + if cfg!(target_os="windows") && $directory.ends_with("lib") { + let sibling = $directory.parent().unwrap().join("bin"); + if let Some(file) = contains(&sibling, files) { + try_file!(file); + } + } + } + } + + // Search the directory provided by the relevant environment variable if it is set. + if let Ok(directory) = env::var(env).map(|d| Path::new(&d).to_path_buf()) { + search_directory!(directory); + } + + // Search the `bin` and `lib` subdirectories in the directory returned by + // `llvm-config --prefix` if `llvm-config` is available. + if let Ok(output) = run_llvm_config(&["--prefix"]) { + let directory = Path::new(output.lines().next().unwrap()).to_path_buf(); + let bin = directory.join("bin"); + if let Some(file) = contains(&bin, files) { + try_file!(file); + } + let lib = directory.join("lib"); + if let Some(file) = contains(&lib, files) { + try_file!(file); + } + } + + // Search the backup directories. + let search = if cfg!(any(target_os="freebsd", target_os="linux")) { + SEARCH_LINUX + } else if cfg!(target_os="macos") { + SEARCH_OSX + } else if cfg!(target_os="windows") { + SEARCH_WINDOWS + } else { + &[] + }; + for pattern in search { + let mut options = MatchOptions::new(); + options.case_sensitive = false; + options.require_literal_separator = true; + if let Ok(paths) = glob::glob_with(pattern, &options) { + for path in paths.filter_map(Result::ok).filter(|p| p.is_dir()) { + search_directory!(path); + } + } + } + + let message = format!( + "couldn't find any of [{}], set the {} environment variable to a path where one of these \ + files can be found (skipped: [{}])", + files.iter().map(|f| format!("'{}'", f)).collect::>().join(", "), + env, + skipped.join(", "), + ); + Err(message) +} + +/// Searches for a `libclang` shared library, returning the path to such a shared library if the +/// search was successful. +pub fn find_shared_library() -> Result { + let mut files = vec![format!("{}clang{}", env::consts::DLL_PREFIX, env::consts::DLL_SUFFIX)]; + if cfg!(target_os="linux") { + // Some Linux distributions don't create a `libclang.so` symlink. + // + // FIXME: We should improve our detection and selection of versioned libraries. + files.push("libclang.so.1".into()); + } + if cfg!(target_os="windows") { + // The official LLVM build uses `libclang.dll` on Windows instead of `clang.dll`. However, + // unofficial builds such as MinGW use `clang.dll`. + files.push("libclang.dll".into()); + } + find(Library::Dynamic, &files, "LIBCLANG_PATH") +} + +/// Returns the name of an LLVM or Clang library from a path to such a library. +fn get_library_name(path: &Path) -> Option { + path.file_stem().map(|l| l.to_string_lossy()[3..].into()) +} + +/// Returns the LLVM libraries required to link to `libclang` statically. +fn get_llvm_libraries() -> Vec { + run_llvm_config(&["--libs"]).unwrap().split_whitespace().filter_map(|p| { + // Depending on the version of `llvm-config` in use, listed libraries may be in one of two + // forms, a full path to the library or simply prefixed with `-l`. + if p.starts_with("-l") { + Some(p[2..].into()) + } else { + get_library_name(Path::new(p)) + } + }).collect() +} + +/// Clang libraries required to link to `libclang` 3.5 and later statically. +const CLANG_LIBRARIES: &'static [&'static str] = &[ + "clang", + "clangAST", + "clangAnalysis", + "clangBasic", + "clangDriver", + "clangEdit", + "clangFrontend", + "clangIndex", + "clangLex", + "clangParse", + "clangRewrite", + "clangSema", + "clangSerialization", +]; + +/// Returns the Clang libraries required to link to `libclang` statically. +fn get_clang_libraries>(directory: P) -> Vec { + let pattern = directory.as_ref().join("libclang*.a").to_string_lossy().to_string(); + if let Ok(libraries) = glob::glob(&pattern) { + libraries.filter_map(|l| l.ok().and_then(|l| get_library_name(&l))).collect() + } else { + CLANG_LIBRARIES.iter().map(|l| l.to_string()).collect() + } +} + +/// Find and link to `libclang` statically. +#[cfg_attr(feature="runtime", allow(dead_code))] +fn link_static() { + let file = find(Library::Static, &["libclang.a".into()], "LIBCLANG_STATIC_PATH").unwrap(); + let directory = file.parent().unwrap(); + print!("cargo:rustc-flags="); + + // Specify required Clang static libraries. + print!("-L {} ", directory.display()); + for library in get_clang_libraries(directory) { + print!("-l static={} ", library); + } + + // Specify required LLVM static libraries. + print!("-L {} ", run_llvm_config(&["--libdir"]).unwrap().trim_right()); + for library in get_llvm_libraries() { + print!("-l static={} ", library); + } + + // Specify required system libraries. + if cfg!(target_os="freebsd") { + println!("-l ffi -l ncursesw -l c++ -l z"); + } else if cfg!(target_os="linux") { + println!("-l ffi -l ncursesw -l stdc++ -l z"); + } else if cfg!(target_os="macos") { + println!("-l ffi -l ncurses -l c++ -l z"); + } else { + panic!("unsupported operating system for static linking"); + } +} + +/// Find and link to `libclang` dynamically. +#[cfg_attr(feature="runtime", allow(dead_code))] +fn link_dynamic() { + let file = find_shared_library().unwrap(); + let directory = file.parent().unwrap(); + println!("cargo:rustc-link-search={}", directory.display()); + + if cfg!(all(target_os="windows", target_env="msvc")) { + // Find the `libclang` stub static library required for the MSVC toolchain. + let libdir = if !directory.ends_with("bin") { + directory.to_owned() + } else { + directory.parent().unwrap().join("lib") + }; + if libdir.join("libclang.lib").exists() { + println!("cargo:rustc-link-search={}", libdir.display()); + } else if libdir.join("libclang.dll.a").exists() { + // MSYS and MinGW use `libclang.dll.a` instead of `libclang.lib`. It is linkable with + // the MSVC linker, but Rust doesn't recognize the `.a` suffix, so we need to copy it + // with a different name. + // + // FIXME: Maybe we can just hardlink or symlink it? + let out = env::var("OUT_DIR").unwrap(); + fs::copy(libdir.join("libclang.dll.a"), Path::new(&out).join("libclang.lib")).unwrap(); + println!("cargo:rustc-link-search=native={}", out); + } else { + panic!( + "using '{}', so 'libclang.lib' or 'libclang.dll.a' must be available in {}", + file.display(), + libdir.display(), + ); + } + println!("cargo:rustc-link-lib=dylib=libclang"); + } else { + println!("cargo:rustc-link-lib=dylib=clang"); + } +} + +#[cfg_attr(feature="runtime", allow(dead_code))] +fn main() { + if cfg!(feature="runtime") { + if cfg!(feature="static") { + panic!("`runtime` and `static` features can't be combined"); + } + } else if cfg!(feature="static") { + link_static(); + } else { + link_dynamic(); + } +} diff --git a/third_party/rust/clang-sys/ci/before_install.sh b/third_party/rust/clang-sys/ci/before_install.sh old mode 100755 new mode 100644 index da4166ed4e8f..aece19b09402 --- a/third_party/rust/clang-sys/ci/before_install.sh +++ b/third_party/rust/clang-sys/ci/before_install.sh @@ -1,32 +1,36 @@ -set -e - -function llvm_version_triple() { - if [ "$1" == "3.5" ]; then - echo "3.5.2" - elif [ "$1" == "3.6" ]; then - echo "3.6.2" - elif [ "$1" == "3.7" ]; then - echo "3.7.1" - elif [ "$1" == "3.8" ]; then - echo "3.8.1" - elif [ "$1" == "3.9" ]; then - echo "3.9.0" - fi -} - -function llvm_download() { - export LLVM_VERSION_TRIPLE=`llvm_version_triple ${LLVM_VERSION}` - export LLVM=clang+llvm-${LLVM_VERSION_TRIPLE}-x86_64-$1 - - wget http://llvm.org/releases/${LLVM_VERSION_TRIPLE}/${LLVM}.tar.xz - mkdir llvm - tar -xf ${LLVM}.tar.xz -C llvm --strip-components=1 - - export LLVM_CONFIG_PATH=`pwd`/llvm/bin/llvm-config -} - -if [ "${TRAVIS_OS_NAME}" == "linux" ]; then - llvm_download linux-gnu-ubuntu-14.04 -else - llvm_download apple-darwin -fi +set -e + +function llvm_version_triple() { + if [ "$1" == "3.5" ]; then + echo "3.5.2" + elif [ "$1" == "3.6" ]; then + echo "3.6.2" + elif [ "$1" == "3.7" ]; then + echo "3.7.1" + elif [ "$1" == "3.8" ]; then + echo "3.8.1" + elif [ "$1" == "3.9" ]; then + echo "3.9.0" + elif [ "$1" == "4.0" ]; then + echo "4.0.0" + fi +} + +function llvm_download() { + export LLVM_VERSION_TRIPLE=`llvm_version_triple ${LLVM_VERSION}` + export LLVM=clang+llvm-${LLVM_VERSION_TRIPLE}-x86_64-$1 + + wget http://llvm.org/releases/${LLVM_VERSION_TRIPLE}/${LLVM}.tar.xz + mkdir llvm + tar xf ${LLVM}.tar.xz -C llvm --strip-components=1 + + export LLVM_CONFIG_PATH=`pwd`/llvm/bin/llvm-config +} + +if [ "${TRAVIS_OS_NAME}" == "linux" ]; then + llvm_download linux-gnu-ubuntu-14.04 + export LD_LIBRARY_PATH=`pwd`/llvm/lib:$LD_LIBRARY_PATH +else + llvm_download apple-darwin + export DYLD_LIBRARY_PATH=`pwd`/llvm/lib:$DYLD_LIBRARY_PATH +fi diff --git a/third_party/rust/clang-sys/ci/install.bat b/third_party/rust/clang-sys/ci/install.bat index 07d72c6e952f..9f4c65146fdf 100644 --- a/third_party/rust/clang-sys/ci/install.bat +++ b/third_party/rust/clang-sys/ci/install.bat @@ -1,8 +1,8 @@ -curl -sSf https://static.rust-lang.org/dist/rust-1.10.0-i686-pc-windows-msvc.exe -o rust.exe -rust.exe /VERYSILENT /NORESTART /DIR="C:\Rust" -set PATH=%PATH%;C:\Rust\bin - -curl -sSf http://llvm.org/releases/%LLVM_VERSION%.0/LLVM-%LLVM_VERSION%.0-win32.exe -o LLVM.exe -7z x LLVM.exe -oC:\LLVM -set PATH=%PATH%;C:\LLVM\bin -set LIBCLANG_PATH=C:\LLVM\bin +curl -sSf https://static.rust-lang.org/dist/rust-1.10.0-i686-pc-windows-msvc.exe -o rust.exe +rust.exe /VERYSILENT /NORESTART /DIR="C:\Rust" +set PATH=%PATH%;C:\Rust\bin + +curl -sSf http://releases.llvm.org/%LLVM_VERSION%/LLVM-%LLVM_VERSION%-win32.exe -o LLVM.exe +7z x LLVM.exe -oC:\LLVM +set PATH=%PATH%;C:\LLVM\bin +set LIBCLANG_PATH=C:\LLVM\bin diff --git a/third_party/rust/clang-sys/ci/script.sh b/third_party/rust/clang-sys/ci/script.sh old mode 100755 new mode 100644 index 47ca43994b6f..1d7d902dc7fc --- a/third_party/rust/clang-sys/ci/script.sh +++ b/third_party/rust/clang-sys/ci/script.sh @@ -1,13 +1,13 @@ -if [ "${TRAVIS_OS_NAME}" == "osx" ]; then - rvm get head || true -fi - -set -e - -RUST_BACKTRACE=1 cargo test --verbose --features $CLANG_VERSION -- --nocapture - -if [ "${CLANG_VERSION}" \< "clang_3_7" ]; then - RUST_BACKTRACE=1 cargo test --verbose --features "$CLANG_VERSION static" -- --nocapture -fi - -RUST_BACKTRACE=1 cargo test --verbose --features "$CLANG_VERSION runtime" -- --nocapture +if [ "${TRAVIS_OS_NAME}" == "osx" ]; then + rvm get head || true +fi + +set -e + +RUST_BACKTRACE=1 cargo test --verbose --features $CLANG_VERSION -- --nocapture + +if [ "${CLANG_VERSION}" \< "clang_3_7" ]; then + RUST_BACKTRACE=1 cargo test --verbose --features "$CLANG_VERSION static" -- --nocapture +fi + +RUST_BACKTRACE=1 cargo test --verbose --features "$CLANG_VERSION runtime" -- --nocapture diff --git a/third_party/rust/clang-sys/ci/test_script.bat b/third_party/rust/clang-sys/ci/test_script.bat index 62eed5e0a2a2..6f0f513afe35 100644 --- a/third_party/rust/clang-sys/ci/test_script.bat +++ b/third_party/rust/clang-sys/ci/test_script.bat @@ -1,3 +1,2 @@ -set RUST_BACKTRACE=1 -cargo test --verbose --features %CLANG_VERSION% -- --nocapture -cargo test --verbose --features "%CLANG_VERSION% runtime" -- --nocapture +set RUST_BACKTRACE=1 +cargo test --verbose --features %CLANG_VERSION% -- --nocapture diff --git a/third_party/rust/clang-sys/clippy.toml b/third_party/rust/clang-sys/clippy.toml index 006bfc40b946..6f41284e1073 100644 --- a/third_party/rust/clang-sys/clippy.toml +++ b/third_party/rust/clang-sys/clippy.toml @@ -1 +1 @@ -doc-valid-idents = ["FreeBSD"] +doc-valid-idents = ["FreeBSD"] diff --git a/third_party/rust/clang-sys/src/lib.rs b/third_party/rust/clang-sys/src/lib.rs index 02de4e7b823a..26883ca6549d 100644 --- a/third_party/rust/clang-sys/src/lib.rs +++ b/third_party/rust/clang-sys/src/lib.rs @@ -1,1700 +1,1730 @@ -// Copyright 2016 Kyle Mayes -// -// Licensed 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. - -//! Rust bindings for `libclang`. -//! -//! ## Supported Versions -//! -//! * 3.5 - [Documentation](https://kylemayes.github.io/clang-sys/3_5/clang_sys) -//! * 3.6 - [Documentation](https://kylemayes.github.io/clang-sys/3_6/clang_sys) -//! * 3.7 - [Documentation](https://kylemayes.github.io/clang-sys/3_7/clang_sys) -//! * 3.8 - [Documentation](https://kylemayes.github.io/clang-sys/3_8/clang_sys) -//! * 3.9 - [Documentation](https://kylemayes.github.io/clang-sys/3_9/clang_sys) - -#![allow(non_camel_case_types, non_snake_case, non_upper_case_globals)] - -#![cfg_attr(feature="clippy", feature(plugin))] -#![cfg_attr(feature="clippy", plugin(clippy))] -#![cfg_attr(feature="clippy", warn(clippy))] - -#[macro_use] -extern crate bitflags; -#[cfg(feature="runtime")] -#[macro_use] -extern crate lazy_static; - -extern crate glob; -extern crate libc; -#[cfg(feature="runtime")] -extern crate libloading; - -pub mod support; - -#[macro_use] -mod link; - -use std::mem; - -use libc::{c_char, c_int, c_longlong, c_uint, c_ulong, c_ulonglong, c_void, time_t}; - -pub type CXClientData = *mut c_void; -pub type CXCursorVisitor = extern fn(CXCursor, CXCursor, CXClientData) -> CXChildVisitResult; -#[cfg(feature="gte_clang_3_7")] -pub type CXFieldVisitor = extern fn(CXCursor, CXClientData) -> CXVisitorResult; -pub type CXInclusionVisitor = extern fn(CXFile, *mut CXSourceLocation, c_uint, CXClientData); - -//================================================ -// Macros -//================================================ - -// cenum! ________________________________________ - -/// Defines a type-safe C enum as a series of constants. -macro_rules! cenum { - ($(#[$meta:meta])* enum $name:ident { - $($(#[$vmeta:meta])* const $variant:ident = $value:expr), +, - }) => ( - pub type $name = c_int; - - $($(#[$vmeta])* pub const $variant: $name = $value;)+ - ); -} - -// default! ______________________________________ - -/// Implements a zeroing implementation of `Default` for the supplied type. -macro_rules! default { - (#[$meta:meta] $ty:ty) => { - #[$meta] - impl Default for $ty { - fn default() -> $ty { - unsafe { mem::zeroed() } - } - } - }; - - ($ty:ty) => { - impl Default for $ty { - fn default() -> $ty { - unsafe { mem::zeroed() } - } - } - }; -} - -//================================================ -// Enums -//================================================ - -cenum! { - enum CXAvailabilityKind { - const CXAvailability_Available = 0, - const CXAvailability_Deprecated = 1, - const CXAvailability_NotAvailable = 2, - const CXAvailability_NotAccessible = 3, - } -} - -cenum! { - enum CXCallingConv { - const CXCallingConv_Default = 0, - const CXCallingConv_C = 1, - const CXCallingConv_X86StdCall = 2, - const CXCallingConv_X86FastCall = 3, - const CXCallingConv_X86ThisCall = 4, - const CXCallingConv_X86Pascal = 5, - const CXCallingConv_AAPCS = 6, - const CXCallingConv_AAPCS_VFP = 7, - const CXCallingConv_IntelOclBicc = 9, - const CXCallingConv_X86_64Win64 = 10, - const CXCallingConv_X86_64SysV = 11, - /// Only produced by `libclang` 3.6 and later. - const CXCallingConv_X86VectorCall = 12, - /// Only produced by `libclang` 3.9 and later. - const CXCallingConv_Swift = 13, - /// Only produced by `libclang` 3.9 and later. - const CXCallingConv_PreserveMost = 14, - /// Only produced by `libclang` 3.9 and later. - const CXCallingConv_PreserveAll = 15, - const CXCallingConv_Invalid = 100, - const CXCallingConv_Unexposed = 200, - } -} - -cenum! { - enum CXChildVisitResult { - const CXChildVisit_Break = 0, - const CXChildVisit_Continue = 1, - const CXChildVisit_Recurse = 2, - } -} - -cenum! { - enum CXCommentInlineCommandRenderKind { - const CXCommentInlineCommandRenderKind_Normal = 0, - const CXCommentInlineCommandRenderKind_Bold = 1, - const CXCommentInlineCommandRenderKind_Monospaced = 2, - const CXCommentInlineCommandRenderKind_Emphasized = 3, - } -} - -cenum! { - enum CXCommentKind { - const CXComment_Null = 0, - const CXComment_Text = 1, - const CXComment_InlineCommand = 2, - const CXComment_HTMLStartTag = 3, - const CXComment_HTMLEndTag = 4, - const CXComment_Paragraph = 5, - const CXComment_BlockCommand = 6, - const CXComment_ParamCommand = 7, - const CXComment_TParamCommand = 8, - const CXComment_VerbatimBlockCommand = 9, - const CXComment_VerbatimBlockLine = 10, - const CXComment_VerbatimLine = 11, - const CXComment_FullComment = 12, - } -} - -cenum! { - enum CXCommentParamPassDirection { - const CXCommentParamPassDirection_In = 0, - const CXCommentParamPassDirection_Out = 1, - const CXCommentParamPassDirection_InOut = 2, - } -} - -cenum! { - enum CXCompilationDatabase_Error { - const CXCompilationDatabase_NoError = 0, - const CXCompilationDatabase_CanNotLoadDatabase = 1, - } -} - -cenum! { - enum CXCompletionChunkKind { - const CXCompletionChunk_Optional = 0, - const CXCompletionChunk_TypedText = 1, - const CXCompletionChunk_Text = 2, - const CXCompletionChunk_Placeholder = 3, - const CXCompletionChunk_Informative = 4, - const CXCompletionChunk_CurrentParameter = 5, - const CXCompletionChunk_LeftParen = 6, - const CXCompletionChunk_RightParen = 7, - const CXCompletionChunk_LeftBracket = 8, - const CXCompletionChunk_RightBracket = 9, - const CXCompletionChunk_LeftBrace = 10, - const CXCompletionChunk_RightBrace = 11, - const CXCompletionChunk_LeftAngle = 12, - const CXCompletionChunk_RightAngle = 13, - const CXCompletionChunk_Comma = 14, - const CXCompletionChunk_ResultType = 15, - const CXCompletionChunk_Colon = 16, - const CXCompletionChunk_SemiColon = 17, - const CXCompletionChunk_Equal = 18, - const CXCompletionChunk_HorizontalSpace = 19, - const CXCompletionChunk_VerticalSpace = 20, - } -} - -cenum! { - enum CXCursorKind { - const CXCursor_UnexposedDecl = 1, - const CXCursor_StructDecl = 2, - const CXCursor_UnionDecl = 3, - const CXCursor_ClassDecl = 4, - const CXCursor_EnumDecl = 5, - const CXCursor_FieldDecl = 6, - const CXCursor_EnumConstantDecl = 7, - const CXCursor_FunctionDecl = 8, - const CXCursor_VarDecl = 9, - const CXCursor_ParmDecl = 10, - const CXCursor_ObjCInterfaceDecl = 11, - const CXCursor_ObjCCategoryDecl = 12, - const CXCursor_ObjCProtocolDecl = 13, - const CXCursor_ObjCPropertyDecl = 14, - const CXCursor_ObjCIvarDecl = 15, - const CXCursor_ObjCInstanceMethodDecl = 16, - const CXCursor_ObjCClassMethodDecl = 17, - const CXCursor_ObjCImplementationDecl = 18, - const CXCursor_ObjCCategoryImplDecl = 19, - const CXCursor_TypedefDecl = 20, - const CXCursor_CXXMethod = 21, - const CXCursor_Namespace = 22, - const CXCursor_LinkageSpec = 23, - const CXCursor_Constructor = 24, - const CXCursor_Destructor = 25, - const CXCursor_ConversionFunction = 26, - const CXCursor_TemplateTypeParameter = 27, - const CXCursor_NonTypeTemplateParameter = 28, - const CXCursor_TemplateTemplateParameter = 29, - const CXCursor_FunctionTemplate = 30, - const CXCursor_ClassTemplate = 31, - const CXCursor_ClassTemplatePartialSpecialization = 32, - const CXCursor_NamespaceAlias = 33, - const CXCursor_UsingDirective = 34, - const CXCursor_UsingDeclaration = 35, - const CXCursor_TypeAliasDecl = 36, - const CXCursor_ObjCSynthesizeDecl = 37, - const CXCursor_ObjCDynamicDecl = 38, - const CXCursor_CXXAccessSpecifier = 39, - const CXCursor_ObjCSuperClassRef = 40, - const CXCursor_ObjCProtocolRef = 41, - const CXCursor_ObjCClassRef = 42, - const CXCursor_TypeRef = 43, - const CXCursor_CXXBaseSpecifier = 44, - const CXCursor_TemplateRef = 45, - const CXCursor_NamespaceRef = 46, - const CXCursor_MemberRef = 47, - const CXCursor_LabelRef = 48, - const CXCursor_OverloadedDeclRef = 49, - const CXCursor_VariableRef = 50, - const CXCursor_InvalidFile = 70, - const CXCursor_NoDeclFound = 71, - const CXCursor_NotImplemented = 72, - const CXCursor_InvalidCode = 73, - const CXCursor_UnexposedExpr = 100, - const CXCursor_DeclRefExpr = 101, - const CXCursor_MemberRefExpr = 102, - const CXCursor_CallExpr = 103, - const CXCursor_ObjCMessageExpr = 104, - const CXCursor_BlockExpr = 105, - const CXCursor_IntegerLiteral = 106, - const CXCursor_FloatingLiteral = 107, - const CXCursor_ImaginaryLiteral = 108, - const CXCursor_StringLiteral = 109, - const CXCursor_CharacterLiteral = 110, - const CXCursor_ParenExpr = 111, - const CXCursor_UnaryOperator = 112, - const CXCursor_ArraySubscriptExpr = 113, - const CXCursor_BinaryOperator = 114, - const CXCursor_CompoundAssignOperator = 115, - const CXCursor_ConditionalOperator = 116, - const CXCursor_CStyleCastExpr = 117, - const CXCursor_CompoundLiteralExpr = 118, - const CXCursor_InitListExpr = 119, - const CXCursor_AddrLabelExpr = 120, - const CXCursor_StmtExpr = 121, - const CXCursor_GenericSelectionExpr = 122, - const CXCursor_GNUNullExpr = 123, - const CXCursor_CXXStaticCastExpr = 124, - const CXCursor_CXXDynamicCastExpr = 125, - const CXCursor_CXXReinterpretCastExpr = 126, - const CXCursor_CXXConstCastExpr = 127, - const CXCursor_CXXFunctionalCastExpr = 128, - const CXCursor_CXXTypeidExpr = 129, - const CXCursor_CXXBoolLiteralExpr = 130, - const CXCursor_CXXNullPtrLiteralExpr = 131, - const CXCursor_CXXThisExpr = 132, - const CXCursor_CXXThrowExpr = 133, - const CXCursor_CXXNewExpr = 134, - const CXCursor_CXXDeleteExpr = 135, - const CXCursor_UnaryExpr = 136, - const CXCursor_ObjCStringLiteral = 137, - const CXCursor_ObjCEncodeExpr = 138, - const CXCursor_ObjCSelectorExpr = 139, - const CXCursor_ObjCProtocolExpr = 140, - const CXCursor_ObjCBridgedCastExpr = 141, - const CXCursor_PackExpansionExpr = 142, - const CXCursor_SizeOfPackExpr = 143, - const CXCursor_LambdaExpr = 144, - const CXCursor_ObjCBoolLiteralExpr = 145, - const CXCursor_ObjCSelfExpr = 146, - /// Only produced by `libclang` 3.8 and later. - const CXCursor_OMPArraySectionExpr = 147, - /// Only produced by `libclang` 3.9 and later. - const CXCursor_ObjCAvailabilityCheckExpr = 148, - const CXCursor_UnexposedStmt = 200, - const CXCursor_LabelStmt = 201, - const CXCursor_CompoundStmt = 202, - const CXCursor_CaseStmt = 203, - const CXCursor_DefaultStmt = 204, - const CXCursor_IfStmt = 205, - const CXCursor_SwitchStmt = 206, - const CXCursor_WhileStmt = 207, - const CXCursor_DoStmt = 208, - const CXCursor_ForStmt = 209, - const CXCursor_GotoStmt = 210, - const CXCursor_IndirectGotoStmt = 211, - const CXCursor_ContinueStmt = 212, - const CXCursor_BreakStmt = 213, - const CXCursor_ReturnStmt = 214, - /// Duplicate of `CXCursor_GccAsmStmt`. - const CXCursor_AsmStmt = 215, - const CXCursor_ObjCAtTryStmt = 216, - const CXCursor_ObjCAtCatchStmt = 217, - const CXCursor_ObjCAtFinallyStmt = 218, - const CXCursor_ObjCAtThrowStmt = 219, - const CXCursor_ObjCAtSynchronizedStmt = 220, - const CXCursor_ObjCAutoreleasePoolStmt = 221, - const CXCursor_ObjCForCollectionStmt = 222, - const CXCursor_CXXCatchStmt = 223, - const CXCursor_CXXTryStmt = 224, - const CXCursor_CXXForRangeStmt = 225, - const CXCursor_SEHTryStmt = 226, - const CXCursor_SEHExceptStmt = 227, - const CXCursor_SEHFinallyStmt = 228, - const CXCursor_MSAsmStmt = 229, - const CXCursor_NullStmt = 230, - const CXCursor_DeclStmt = 231, - const CXCursor_OMPParallelDirective = 232, - const CXCursor_OMPSimdDirective = 233, - const CXCursor_OMPForDirective = 234, - const CXCursor_OMPSectionsDirective = 235, - const CXCursor_OMPSectionDirective = 236, - const CXCursor_OMPSingleDirective = 237, - const CXCursor_OMPParallelForDirective = 238, - const CXCursor_OMPParallelSectionsDirective = 239, - const CXCursor_OMPTaskDirective = 240, - const CXCursor_OMPMasterDirective = 241, - const CXCursor_OMPCriticalDirective = 242, - const CXCursor_OMPTaskyieldDirective = 243, - const CXCursor_OMPBarrierDirective = 244, - const CXCursor_OMPTaskwaitDirective = 245, - const CXCursor_OMPFlushDirective = 246, - const CXCursor_SEHLeaveStmt = 247, - /// Only produced by `libclang` 3.6 and later. - const CXCursor_OMPOrderedDirective = 248, - /// Only produced by `libclang` 3.6 and later. - const CXCursor_OMPAtomicDirective = 249, - /// Only produced by `libclang` 3.6 and later. - const CXCursor_OMPForSimdDirective = 250, - /// Only produced by `libclang` 3.6 and later. - const CXCursor_OMPParallelForSimdDirective = 251, - /// Only produced by `libclang` 3.6 and later. - const CXCursor_OMPTargetDirective = 252, - /// Only produced by `libclang` 3.6 and later. - const CXCursor_OMPTeamsDirective = 253, - /// Only produced by `libclang` 3.7 and later. - const CXCursor_OMPTaskgroupDirective = 254, - /// Only produced by `libclang` 3.7 and later. - const CXCursor_OMPCancellationPointDirective = 255, - /// Only produced by `libclang` 3.7 and later. - const CXCursor_OMPCancelDirective = 256, - /// Only produced by `libclang` 3.8 and later. - const CXCursor_OMPTargetDataDirective = 257, - /// Only produced by `libclang` 3.8 and later. - const CXCursor_OMPTaskLoopDirective = 258, - /// Only produced by `libclang` 3.8 and later. - const CXCursor_OMPTaskLoopSimdDirective = 259, - /// Only produced by `libclang` 3.8 and later. - const CXCursor_OMPDistributeDirective = 260, - /// Only produced by `libclang` 3.9 and later. - const CXCursor_OMPTargetEnterDataDirective = 261, - /// Only produced by `libclang` 3.9 and later. - const CXCursor_OMPTargetExitDataDirective = 262, - /// Only produced by `libclang` 3.9 and later. - const CXCursor_OMPTargetParallelDirective = 263, - /// Only produced by `libclang` 3.9 and later. - const CXCursor_OMPTargetParallelForDirective = 264, - /// Only produced by `libclang` 3.9 and later. - const CXCursor_OMPTargetUpdateDirective = 265, - /// Only produced by `libclang` 3.9 and later. - const CXCursor_OMPDistributeParallelForDirective = 266, - /// Only produced by `libclang` 3.9 and later. - const CXCursor_OMPDistributeParallelForSimdDirective = 267, - /// Only produced by `libclang` 3.9 and later. - const CXCursor_OMPDistributeSimdDirective = 268, - /// Only produced by `libclang` 3.9 and later. - const CXCursor_OMPTargetParallelForSimdDirective = 269, - const CXCursor_TranslationUnit = 300, - const CXCursor_UnexposedAttr = 400, - const CXCursor_IBActionAttr = 401, - const CXCursor_IBOutletAttr = 402, - const CXCursor_IBOutletCollectionAttr = 403, - const CXCursor_CXXFinalAttr = 404, - const CXCursor_CXXOverrideAttr = 405, - const CXCursor_AnnotateAttr = 406, - const CXCursor_AsmLabelAttr = 407, - const CXCursor_PackedAttr = 408, - const CXCursor_PureAttr = 409, - const CXCursor_ConstAttr = 410, - const CXCursor_NoDuplicateAttr = 411, - const CXCursor_CUDAConstantAttr = 412, - const CXCursor_CUDADeviceAttr = 413, - const CXCursor_CUDAGlobalAttr = 414, - const CXCursor_CUDAHostAttr = 415, - /// Only produced by `libclang` 3.6 and later. - const CXCursor_CUDASharedAttr = 416, - /// Only produced by `libclang` 3.8 and later. - const CXCursor_VisibilityAttr = 417, - /// Only produced by `libclang` 3.8 and later. - const CXCursor_DLLExport = 418, - /// Only produced by `libclang` 3.8 and later. - const CXCursor_DLLImport = 419, - const CXCursor_PreprocessingDirective = 500, - const CXCursor_MacroDefinition = 501, - /// Duplicate of `CXCursor_MacroInstantiation`. - const CXCursor_MacroExpansion = 502, - const CXCursor_InclusionDirective = 503, - const CXCursor_ModuleImportDecl = 600, - /// Only produced by `libclang` 3.8 and later. - const CXCursor_TypeAliasTemplateDecl = 601, - /// Only produced by `libclang` 3.9 and later. - const CXCursor_StaticAssert = 602, - /// Only produced by `libclang` 3.7 and later. - const CXCursor_OverloadCandidate = 700, - } -} - -cenum! { - enum CXDiagnosticSeverity { - const CXDiagnostic_Ignored = 0, - const CXDiagnostic_Note = 1, - const CXDiagnostic_Warning = 2, - const CXDiagnostic_Error = 3, - const CXDiagnostic_Fatal = 4, - } -} - -cenum! { - enum CXErrorCode { - const CXError_Success = 0, - const CXError_Failure = 1, - const CXError_Crashed = 2, - const CXError_InvalidArguments = 3, - const CXError_ASTReadError = 4, - } -} - -cenum! { - enum CXEvalResultKind { - const CXEval_UnExposed = 0, - const CXEval_Int = 1 , - const CXEval_Float = 2, - const CXEval_ObjCStrLiteral = 3, - const CXEval_StrLiteral = 4, - const CXEval_CFStr = 5, - const CXEval_Other = 6, - } -} - -cenum! { - enum CXIdxAttrKind { - const CXIdxAttr_Unexposed = 0, - const CXIdxAttr_IBAction = 1, - const CXIdxAttr_IBOutlet = 2, - const CXIdxAttr_IBOutletCollection = 3, - } -} - -cenum! { - enum CXIdxEntityCXXTemplateKind { - const CXIdxEntity_NonTemplate = 0, - const CXIdxEntity_Template = 1, - const CXIdxEntity_TemplatePartialSpecialization = 2, - const CXIdxEntity_TemplateSpecialization = 3, - } -} - -cenum! { - enum CXIdxEntityKind { - const CXIdxEntity_Unexposed = 0, - const CXIdxEntity_Typedef = 1, - const CXIdxEntity_Function = 2, - const CXIdxEntity_Variable = 3, - const CXIdxEntity_Field = 4, - const CXIdxEntity_EnumConstant = 5, - const CXIdxEntity_ObjCClass = 6, - const CXIdxEntity_ObjCProtocol = 7, - const CXIdxEntity_ObjCCategory = 8, - const CXIdxEntity_ObjCInstanceMethod = 9, - const CXIdxEntity_ObjCClassMethod = 10, - const CXIdxEntity_ObjCProperty = 11, - const CXIdxEntity_ObjCIvar = 12, - const CXIdxEntity_Enum = 13, - const CXIdxEntity_Struct = 14, - const CXIdxEntity_Union = 15, - const CXIdxEntity_CXXClass = 16, - const CXIdxEntity_CXXNamespace = 17, - const CXIdxEntity_CXXNamespaceAlias = 18, - const CXIdxEntity_CXXStaticVariable = 19, - const CXIdxEntity_CXXStaticMethod = 20, - const CXIdxEntity_CXXInstanceMethod = 21, - const CXIdxEntity_CXXConstructor = 22, - const CXIdxEntity_CXXDestructor = 23, - const CXIdxEntity_CXXConversionFunction = 24, - const CXIdxEntity_CXXTypeAlias = 25, - const CXIdxEntity_CXXInterface = 26, - } -} - -cenum! { - enum CXIdxEntityLanguage { - const CXIdxEntityLang_None = 0, - const CXIdxEntityLang_C = 1, - const CXIdxEntityLang_ObjC = 2, - const CXIdxEntityLang_CXX = 3, - } -} - -cenum! { - enum CXIdxEntityRefKind { - const CXIdxEntityRef_Direct = 1, - const CXIdxEntityRef_Implicit = 2, - } -} - -cenum! { - enum CXIdxObjCContainerKind { - const CXIdxObjCContainer_ForwardRef = 0, - const CXIdxObjCContainer_Interface = 1, - const CXIdxObjCContainer_Implementation = 2, - } -} - -cenum! { - enum CXLanguageKind { - const CXLanguage_Invalid = 0, - const CXLanguage_C = 1, - const CXLanguage_ObjC = 2, - const CXLanguage_CPlusPlus = 3, - } -} - -cenum! { - enum CXLinkageKind { - const CXLinkage_Invalid = 0, - const CXLinkage_NoLinkage = 1, - const CXLinkage_Internal = 2, - const CXLinkage_UniqueExternal = 3, - const CXLinkage_External = 4, - } -} - -cenum! { - enum CXLoadDiag_Error { - const CXLoadDiag_None = 0, - const CXLoadDiag_Unknown = 1, - const CXLoadDiag_CannotLoad = 2, - const CXLoadDiag_InvalidFile = 3, - } -} - -cenum! { - enum CXRefQualifierKind { - const CXRefQualifier_None = 0, - const CXRefQualifier_LValue = 1, - const CXRefQualifier_RValue = 2, - } -} - -cenum! { - enum CXResult { - const CXResult_Success = 0, - const CXResult_Invalid = 1, - const CXResult_VisitBreak = 2, - } -} - -cenum! { - enum CXSaveError { - const CXSaveError_None = 0, - const CXSaveError_Unknown = 1, - const CXSaveError_TranslationErrors = 2, - const CXSaveError_InvalidTU = 3, - } -} - -cenum! { - enum CXTUResourceUsageKind { - const CXTUResourceUsage_AST = 1, - const CXTUResourceUsage_Identifiers = 2, - const CXTUResourceUsage_Selectors = 3, - const CXTUResourceUsage_GlobalCompletionResults = 4, - const CXTUResourceUsage_SourceManagerContentCache = 5, - const CXTUResourceUsage_AST_SideTables = 6, - const CXTUResourceUsage_SourceManager_Membuffer_Malloc = 7, - const CXTUResourceUsage_SourceManager_Membuffer_MMap = 8, - const CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc = 9, - const CXTUResourceUsage_ExternalASTSource_Membuffer_MMap = 10, - const CXTUResourceUsage_Preprocessor = 11, - const CXTUResourceUsage_PreprocessingRecord = 12, - const CXTUResourceUsage_SourceManager_DataStructures = 13, - const CXTUResourceUsage_Preprocessor_HeaderSearch = 14, - } -} - -cenum! { - #[cfg(feature="gte_clang_3_6")] - enum CXTemplateArgumentKind { - const CXTemplateArgumentKind_Null = 0, - const CXTemplateArgumentKind_Type = 1, - const CXTemplateArgumentKind_Declaration = 2, - const CXTemplateArgumentKind_NullPtr = 3, - const CXTemplateArgumentKind_Integral = 4, - const CXTemplateArgumentKind_Template = 5, - const CXTemplateArgumentKind_TemplateExpansion = 6, - const CXTemplateArgumentKind_Expression = 7, - const CXTemplateArgumentKind_Pack = 8, - const CXTemplateArgumentKind_Invalid = 9, - } -} - -cenum! { - enum CXTokenKind { - const CXToken_Punctuation = 0, - const CXToken_Keyword = 1, - const CXToken_Identifier = 2, - const CXToken_Literal = 3, - const CXToken_Comment = 4, - } -} - -cenum! { - enum CXTypeKind { - const CXType_Invalid = 0, - const CXType_Unexposed = 1, - const CXType_Void = 2, - const CXType_Bool = 3, - const CXType_Char_U = 4, - const CXType_UChar = 5, - const CXType_Char16 = 6, - const CXType_Char32 = 7, - const CXType_UShort = 8, - const CXType_UInt = 9, - const CXType_ULong = 10, - const CXType_ULongLong = 11, - const CXType_UInt128 = 12, - const CXType_Char_S = 13, - const CXType_SChar = 14, - const CXType_WChar = 15, - const CXType_Short = 16, - const CXType_Int = 17, - const CXType_Long = 18, - const CXType_LongLong = 19, - const CXType_Int128 = 20, - const CXType_Float = 21, - const CXType_Double = 22, - const CXType_LongDouble = 23, - const CXType_NullPtr = 24, - const CXType_Overload = 25, - const CXType_Dependent = 26, - const CXType_ObjCId = 27, - const CXType_ObjCClass = 28, - const CXType_ObjCSel = 29, - /// Only produced by `libclang` 3.9 and later. - const CXType_Float128 = 30, - const CXType_Complex = 100, - const CXType_Pointer = 101, - const CXType_BlockPointer = 102, - const CXType_LValueReference = 103, - const CXType_RValueReference = 104, - const CXType_Record = 105, - const CXType_Enum = 106, - const CXType_Typedef = 107, - const CXType_ObjCInterface = 108, - const CXType_ObjCObjectPointer = 109, - const CXType_FunctionNoProto = 110, - const CXType_FunctionProto = 111, - const CXType_ConstantArray = 112, - const CXType_Vector = 113, - const CXType_IncompleteArray = 114, - const CXType_VariableArray = 115, - const CXType_DependentSizedArray = 116, - const CXType_MemberPointer = 117, - /// Only produced by `libclang` 3.8 and later. - const CXType_Auto = 118, - /// Only produced by `libclang` 3.9 and later. - const CXType_Elaborated = 119, - } -} - -cenum! { - enum CXTypeLayoutError { - const CXTypeLayoutError_Invalid = -1, - const CXTypeLayoutError_Incomplete = -2, - const CXTypeLayoutError_Dependent = -3, - const CXTypeLayoutError_NotConstantSize = -4, - const CXTypeLayoutError_InvalidFieldName = -5, - } -} - -cenum! { - #[cfg(feature="gte_clang_3_8")] - enum CXVisibilityKind { - const CXVisibility_Invalid = 0, - const CXVisibility_Hidden = 1, - const CXVisibility_Protected = 2, - const CXVisibility_Default = 3, - } -} - -cenum! { - enum CXVisitorResult { - const CXVisit_Break = 0, - const CXVisit_Continue = 1, - } -} - -cenum! { - enum CX_CXXAccessSpecifier { - const CX_CXXInvalidAccessSpecifier = 0, - const CX_CXXPublic = 1, - const CX_CXXProtected = 2, - const CX_CXXPrivate = 3, - } -} - -cenum! { - #[cfg(feature="gte_clang_3_6")] - enum CX_StorageClass { - const CX_SC_Invalid = 0, - const CX_SC_None = 1, - const CX_SC_Extern = 2, - const CX_SC_Static = 3, - const CX_SC_PrivateExtern = 4, - const CX_SC_OpenCLWorkGroupLocal = 5, - const CX_SC_Auto = 6, - const CX_SC_Register = 7, - } -} - -//================================================ -// Flags -//================================================ - -bitflags! { - #[repr(C)] - pub flags CXCodeComplete_Flags: c_uint { - const CXCodeComplete_IncludeMacros = 1, - const CXCodeComplete_IncludeCodePatterns = 2, - const CXCodeComplete_IncludeBriefComments = 4, - } -} - -bitflags! { - #[repr(C)] - pub flags CXCompletionContext: c_uint { - const CXCompletionContext_Unexposed = 0, - const CXCompletionContext_AnyType = 1, - const CXCompletionContext_AnyValue = 2, - const CXCompletionContext_ObjCObjectValue = 4, - const CXCompletionContext_ObjCSelectorValue = 8, - const CXCompletionContext_CXXClassTypeValue = 16, - const CXCompletionContext_DotMemberAccess = 32, - const CXCompletionContext_ArrowMemberAccess = 64, - const CXCompletionContext_ObjCPropertyAccess = 128, - const CXCompletionContext_EnumTag = 256, - const CXCompletionContext_UnionTag = 512, - const CXCompletionContext_StructTag = 1024, - const CXCompletionContext_ClassTag = 2048, - const CXCompletionContext_Namespace = 4096, - const CXCompletionContext_NestedNameSpecifier = 8192, - const CXCompletionContext_ObjCInterface = 16384, - const CXCompletionContext_ObjCProtocol = 32768, - const CXCompletionContext_ObjCCategory = 65536, - const CXCompletionContext_ObjCInstanceMessage = 131072, - const CXCompletionContext_ObjCClassMessage = 262144, - const CXCompletionContext_ObjCSelectorName = 524288, - const CXCompletionContext_MacroName = 1048576, - const CXCompletionContext_NaturalLanguage = 2097152, - const CXCompletionContext_Unknown = 4194303, - } -} - -bitflags! { - #[repr(C)] - pub flags CXDiagnosticDisplayOptions: c_uint { - const CXDiagnostic_DisplaySourceLocation = 1, - const CXDiagnostic_DisplayColumn = 2, - const CXDiagnostic_DisplaySourceRanges = 4, - const CXDiagnostic_DisplayOption = 8, - const CXDiagnostic_DisplayCategoryId = 16, - const CXDiagnostic_DisplayCategoryName = 32, - } -} - -bitflags! { - #[repr(C)] - pub flags CXGlobalOptFlags: c_uint { - const CXGlobalOpt_None = 0, - const CXGlobalOpt_ThreadBackgroundPriorityForIndexing = 1, - const CXGlobalOpt_ThreadBackgroundPriorityForEditing = 2, - const CXGlobalOpt_ThreadBackgroundPriorityForAll = 3, - } -} - -bitflags! { - #[repr(C)] - pub flags CXIdxDeclInfoFlags: c_uint { - const CXIdxDeclFlag_Skipped = 1, - } -} - -bitflags! { - #[repr(C)] - pub flags CXIndexOptFlags: c_uint { - const CXIndexOptNone = 0, - const CXIndexOptSuppressRedundantRefs = 1, - const CXIndexOptIndexFunctionLocalSymbols = 2, - const CXIndexOptIndexImplicitTemplateInstantiations = 4, - const CXIndexOptSuppressWarnings = 8, - const CXIndexOptSkipParsedBodiesInSession = 16, - } -} - -bitflags! { - #[repr(C)] - pub flags CXNameRefFlags: c_uint { - const CXNameRange_WantQualifier = 1, - const CXNameRange_WantTemplateArgs = 2, - const CXNameRange_WantSinglePiece = 4 - } -} - -bitflags! { - #[repr(C)] - pub flags CXObjCDeclQualifierKind: c_uint { - const CXObjCDeclQualifier_None = 0, - const CXObjCDeclQualifier_In = 1, - const CXObjCDeclQualifier_Inout = 2, - const CXObjCDeclQualifier_Out = 4, - const CXObjCDeclQualifier_Bycopy = 8, - const CXObjCDeclQualifier_Byref = 16, - const CXObjCDeclQualifier_Oneway = 32, - } -} - -bitflags! { - #[repr(C)] - pub flags CXObjCPropertyAttrKind: c_uint { - const CXObjCPropertyAttr_noattr = 0, - const CXObjCPropertyAttr_readonly = 1, - const CXObjCPropertyAttr_getter = 2, - const CXObjCPropertyAttr_assign = 4, - const CXObjCPropertyAttr_readwrite = 8, - const CXObjCPropertyAttr_retain = 16, - const CXObjCPropertyAttr_copy = 32, - const CXObjCPropertyAttr_nonatomic = 64, - const CXObjCPropertyAttr_setter = 128, - const CXObjCPropertyAttr_atomic = 256, - const CXObjCPropertyAttr_weak = 512, - const CXObjCPropertyAttr_strong = 1024, - const CXObjCPropertyAttr_unsafe_unretained = 2048, - #[cfg(feature="gte_clang_3_9")] - const CXObjCPropertyAttr_class = 4096, - } -} - -bitflags! { - #[repr(C)] - pub flags CXReparse_Flags: c_uint { - const CXReparse_None = 0, - } -} - -bitflags! { - #[repr(C)] - pub flags CXSaveTranslationUnit_Flags: c_uint { - const CXSaveTranslationUnit_None = 0, - } -} - -bitflags! { - #[repr(C)] - pub flags CXTranslationUnit_Flags: c_uint { - const CXTranslationUnit_None = 0, - const CXTranslationUnit_DetailedPreprocessingRecord = 1, - const CXTranslationUnit_Incomplete = 2, - const CXTranslationUnit_PrecompiledPreamble = 4, - const CXTranslationUnit_CacheCompletionResults = 8, - const CXTranslationUnit_ForSerialization = 16, - const CXTranslationUnit_CXXChainedPCH = 32, - const CXTranslationUnit_SkipFunctionBodies = 64, - const CXTranslationUnit_IncludeBriefCommentsInCodeCompletion = 128, - #[cfg(feature="gte_clang_3_8")] - const CXTranslationUnit_CreatePreambleOnFirstParse = 256, - #[cfg(feature="gte_clang_3_9")] - const CXTranslationUnit_KeepGoing = 512, - } -} - -//================================================ -// Structs -//================================================ - -// Opaque ________________________________________ - -macro_rules! opaque { ($name:ident) => (pub type $name = *mut c_void;); } - -opaque!(CXCompilationDatabase); -opaque!(CXCompileCommand); -opaque!(CXCompileCommands); -opaque!(CXCompletionString); -opaque!(CXCursorSet); -opaque!(CXDiagnostic); -opaque!(CXDiagnosticSet); -#[cfg(feature="gte_clang_3_9")] -opaque!(CXEvalResult); -opaque!(CXFile); -opaque!(CXIdxClientASTFile); -opaque!(CXIdxClientContainer); -opaque!(CXIdxClientEntity); -opaque!(CXIdxClientFile); -opaque!(CXIndex); -opaque!(CXIndexAction); -opaque!(CXModule); -opaque!(CXRemapping); -opaque!(CXTranslationUnit); - -// Transparent ___________________________________ - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXCodeCompleteResults { - pub Results: *mut CXCompletionResult, - pub NumResults: c_uint, -} - -default!(CXCodeCompleteResults); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXComment { - pub ASTNode: *const c_void, - pub TranslationUnit: CXTranslationUnit, -} - -default!(CXComment); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXCompletionResult { - pub CursorKind: CXCursorKind, - pub CompletionString: CXCompletionString, -} - -default!(CXCompletionResult); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXCursor { - pub kind: CXCursorKind, - pub xdata: c_int, - pub data: [*const c_void; 3], -} - -default!(CXCursor); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXCursorAndRangeVisitor { - pub context: *mut c_void, - pub visit: extern fn(*mut c_void, CXCursor, CXSourceRange) -> CXVisitorResult, -} - -default!(CXCursorAndRangeVisitor); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXFileUniqueID { - pub data: [c_ulonglong; 3], -} - -default!(CXFileUniqueID); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxAttrInfo { - pub kind: CXIdxAttrKind, - pub cursor: CXCursor, - pub loc: CXIdxLoc, -} - -default!(CXIdxAttrInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxBaseClassInfo { - pub base: *const CXIdxEntityInfo, - pub cursor: CXCursor, - pub loc: CXIdxLoc, -} - -default!(CXIdxBaseClassInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxCXXClassDeclInfo { - pub declInfo: *const CXIdxDeclInfo, - pub bases: *const *const CXIdxBaseClassInfo, - pub numBases: c_uint, -} - -default!(CXIdxCXXClassDeclInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxContainerInfo { - pub cursor: CXCursor, -} - -default!(CXIdxContainerInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxDeclInfo { - pub entityInfo: *const CXIdxEntityInfo, - pub cursor: CXCursor, - pub loc: CXIdxLoc, - pub semanticContainer: *const CXIdxContainerInfo, - pub lexicalContainer: *const CXIdxContainerInfo, - pub isRedeclaration: c_int, - pub isDefinition: c_int, - pub isContainer: c_int, - pub declAsContainer: *const CXIdxContainerInfo, - pub isImplicit: c_int, - pub attributes: *const *const CXIdxAttrInfo, - pub numAttributes: c_uint, - pub flags: c_uint, -} - -default!(CXIdxDeclInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxEntityInfo { - pub kind: CXIdxEntityKind, - pub templateKind: CXIdxEntityCXXTemplateKind, - pub lang: CXIdxEntityLanguage, - pub name: *const c_char, - pub USR: *const c_char, - pub cursor: CXCursor, - pub attributes: *const *const CXIdxAttrInfo, - pub numAttributes: c_uint, -} - -default!(CXIdxEntityInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxEntityRefInfo { - pub kind: CXIdxEntityRefKind, - pub cursor: CXCursor, - pub loc: CXIdxLoc, - pub referencedEntity: *const CXIdxEntityInfo, - pub parentEntity: *const CXIdxEntityInfo, - pub container: *const CXIdxContainerInfo, -} - -default!(CXIdxEntityRefInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxIBOutletCollectionAttrInfo { - pub attrInfo: *const CXIdxAttrInfo, - pub objcClass: *const CXIdxEntityInfo, - pub classCursor: CXCursor, - pub classLoc: CXIdxLoc, -} - -default!(CXIdxIBOutletCollectionAttrInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxImportedASTFileInfo { - pub file: CXFile, - pub module: CXModule, - pub loc: CXIdxLoc, - pub isImplicit: c_int, -} - -default!(CXIdxImportedASTFileInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxIncludedFileInfo { - pub hashLoc: CXIdxLoc, - pub filename: *const c_char, - pub file: CXFile, - pub isImport: c_int, - pub isAngled: c_int, - pub isModuleImport: c_int, -} - -default!(CXIdxIncludedFileInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxLoc { - pub ptr_data: [*mut c_void; 2], - pub int_data: c_uint, -} - -default!(CXIdxLoc); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxObjCCategoryDeclInfo { - pub containerInfo: *const CXIdxObjCContainerDeclInfo, - pub objcClass: *const CXIdxEntityInfo, - pub classCursor: CXCursor, - pub classLoc: CXIdxLoc, - pub protocols: *const CXIdxObjCProtocolRefListInfo, -} - -default!(CXIdxObjCCategoryDeclInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxObjCContainerDeclInfo { - pub declInfo: *const CXIdxDeclInfo, - pub kind: CXIdxObjCContainerKind, -} - -default!(CXIdxObjCContainerDeclInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxObjCInterfaceDeclInfo { - pub containerInfo: *const CXIdxObjCContainerDeclInfo, - pub superInfo: *const CXIdxBaseClassInfo, - pub protocols: *const CXIdxObjCProtocolRefListInfo, -} - -default!(CXIdxObjCInterfaceDeclInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxObjCPropertyDeclInfo { - pub declInfo: *const CXIdxDeclInfo, - pub getter: *const CXIdxEntityInfo, - pub setter: *const CXIdxEntityInfo, -} - -default!(CXIdxObjCPropertyDeclInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxObjCProtocolRefInfo { - pub protocol: *const CXIdxEntityInfo, - pub cursor: CXCursor, - pub loc: CXIdxLoc, -} - -default!(CXIdxObjCProtocolRefInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXIdxObjCProtocolRefListInfo { - pub protocols: *const *const CXIdxObjCProtocolRefInfo, - pub numProtocols: c_uint, -} - -default!(CXIdxObjCProtocolRefListInfo); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXPlatformAvailability { - pub Platform: CXString, - pub Introduced: CXVersion, - pub Deprecated: CXVersion, - pub Obsoleted: CXVersion, - pub Unavailable: c_int, - pub Message: CXString, -} - -default!(CXPlatformAvailability); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXSourceLocation { - pub ptr_data: [*const c_void; 2], - pub int_data: c_uint, -} - -default!(CXSourceLocation); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXSourceRange { - pub ptr_data: [*const c_void; 2], - pub begin_int_data: c_uint, - pub end_int_data: c_uint, -} - -default!(CXSourceRange); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXSourceRangeList { - pub count: c_uint, - pub ranges: *mut CXSourceRange, -} - -default!(CXSourceRangeList); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXString { - pub data: *const c_void, - pub private_flags: c_uint, -} - -default!(CXString); - -#[cfg(feature="gte_clang_3_8")] -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXStringSet { - pub Strings: *mut CXString, - pub Count: c_uint, -} - -default!(#[cfg(feature="gte_clang_3_8")] CXStringSet); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXTUResourceUsage { - pub data: *mut c_void, - pub numEntries: c_uint, - pub entries: *mut CXTUResourceUsageEntry, -} - -default!(CXTUResourceUsage); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXTUResourceUsageEntry { - pub kind: CXTUResourceUsageKind, - pub amount: c_ulong, -} - -default!(CXTUResourceUsageEntry); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXToken { - pub int_data: [c_uint; 4], - pub ptr_data: *mut c_void, -} - -default!(CXToken); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXType { - pub kind: CXTypeKind, - pub data: [*mut c_void; 2], -} - -default!(CXType); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXUnsavedFile { - pub Filename: *const c_char, - pub Contents: *const c_char, - pub Length: c_ulong, -} - -default!(CXUnsavedFile); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct CXVersion { - pub Major: c_int, - pub Minor: c_int, - pub Subminor: c_int, -} - -default!(CXVersion); - -#[derive(Copy, Clone, Debug)] -#[repr(C)] -pub struct IndexerCallbacks { - pub abortQuery: extern fn(CXClientData, *mut c_void) -> c_int, - pub diagnostic: extern fn(CXClientData, CXDiagnosticSet, *mut c_void), - pub enteredMainFile: extern fn(CXClientData, CXFile, *mut c_void) -> CXIdxClientFile, - pub ppIncludedFile: extern fn(CXClientData, *const CXIdxIncludedFileInfo) -> CXIdxClientFile, - pub importedASTFile: extern fn(CXClientData, *const CXIdxImportedASTFileInfo) -> CXIdxClientASTFile, - pub startedTranslationUnit: extern fn(CXClientData, *mut c_void) -> CXIdxClientContainer, - pub indexDeclaration: extern fn(CXClientData, *const CXIdxDeclInfo), - pub indexEntityReference: extern fn(CXClientData, *const CXIdxEntityRefInfo), -} - -default!(IndexerCallbacks); - -//================================================ -// Functions -//================================================ - -link! { - pub fn clang_CXCursorSet_contains(set: CXCursorSet, cursor: CXCursor) -> c_uint; - pub fn clang_CXCursorSet_insert(set: CXCursorSet, cursor: CXCursor) -> c_uint; - pub fn clang_CXIndex_getGlobalOptions(index: CXIndex) -> CXGlobalOptFlags; - pub fn clang_CXIndex_setGlobalOptions(index: CXIndex, flags: CXGlobalOptFlags); - #[cfg(feature="gte_clang_3_9")] - pub fn clang_CXXConstructor_isConvertingConstructor(cursor: CXCursor) -> c_uint; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_CXXConstructor_isCopyConstructor(cursor: CXCursor) -> c_uint; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_CXXConstructor_isDefaultConstructor(cursor: CXCursor) -> c_uint; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_CXXConstructor_isMoveConstructor(cursor: CXCursor) -> c_uint; - #[cfg(feature="gte_clang_3_8")] - pub fn clang_CXXField_isMutable(cursor: CXCursor) -> c_uint; - pub fn clang_CXXMethod_isConst(cursor: CXCursor) -> c_uint; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_CXXMethod_isDefaulted(cursor: CXCursor) -> c_uint; - pub fn clang_CXXMethod_isPureVirtual(cursor: CXCursor) -> c_uint; - pub fn clang_CXXMethod_isStatic(cursor: CXCursor) -> c_uint; - pub fn clang_CXXMethod_isVirtual(cursor: CXCursor) -> c_uint; - pub fn clang_CompilationDatabase_dispose(database: CXCompilationDatabase); - pub fn clang_CompilationDatabase_fromDirectory(directory: *const c_char, error: *mut CXCompilationDatabase_Error) -> CXCompilationDatabase; - pub fn clang_CompilationDatabase_getAllCompileCommands(database: CXCompilationDatabase) -> CXCompileCommands; - pub fn clang_CompilationDatabase_getCompileCommands(database: CXCompilationDatabase, filename: *const c_char) -> CXCompileCommands; - pub fn clang_CompileCommand_getArg(command: CXCompileCommand, index: c_uint) -> CXString; - pub fn clang_CompileCommand_getDirectory(command: CXCompileCommand) -> CXString; - #[cfg(feature="gte_clang_3_8")] - pub fn clang_CompileCommand_getFilename(command: CXCompileCommand) -> CXString; - #[cfg(feature="gte_clang_3_8")] - pub fn clang_CompileCommand_getMappedSourceContent(command: CXCompileCommand, index: c_uint) -> CXString; - #[cfg(feature="gte_clang_3_8")] - pub fn clang_CompileCommand_getMappedSourcePath(command: CXCompileCommand, index: c_uint) -> CXString; - pub fn clang_CompileCommand_getNumArgs(command: CXCompileCommand) -> c_uint; - pub fn clang_CompileCommands_dispose(command: CXCompileCommands); - pub fn clang_CompileCommands_getCommand(command: CXCompileCommands, index: c_uint) -> CXCompileCommand; - pub fn clang_CompileCommands_getSize(command: CXCompileCommands) -> c_uint; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_Cursor_Evaluate(cursor: CXCursor) -> CXEvalResult; - pub fn clang_Cursor_getArgument(cursor: CXCursor, index: c_uint) -> CXCursor; - pub fn clang_Cursor_getBriefCommentText(cursor: CXCursor) -> CXString; - #[cfg(feature="gte_clang_3_8")] - pub fn clang_Cursor_getCXXManglings(cursor: CXCursor) -> *mut CXStringSet; - pub fn clang_Cursor_getCommentRange(cursor: CXCursor) -> CXSourceRange; - #[cfg(feature="gte_clang_3_6")] - pub fn clang_Cursor_getMangling(cursor: CXCursor) -> CXString; - pub fn clang_Cursor_getModule(cursor: CXCursor) -> CXModule; - pub fn clang_Cursor_getNumArguments(cursor: CXCursor) -> c_int; - #[cfg(feature="gte_clang_3_6")] - pub fn clang_Cursor_getNumTemplateArguments(cursor: CXCursor) -> c_int; - pub fn clang_Cursor_getObjCDeclQualifiers(cursor: CXCursor) -> CXObjCDeclQualifierKind; - pub fn clang_Cursor_getObjCPropertyAttributes(cursor: CXCursor, reserved: c_uint) -> CXObjCPropertyAttrKind; - pub fn clang_Cursor_getObjCSelectorIndex(cursor: CXCursor) -> c_int; - #[cfg(feature="gte_clang_3_7")] - pub fn clang_Cursor_getOffsetOfField(cursor: CXCursor) -> c_longlong; - pub fn clang_Cursor_getRawCommentText(cursor: CXCursor) -> CXString; - pub fn clang_Cursor_getReceiverType(cursor: CXCursor) -> CXType; - pub fn clang_Cursor_getSpellingNameRange(cursor: CXCursor, index: c_uint, reserved: c_uint) -> CXSourceRange; - #[cfg(feature="gte_clang_3_6")] - pub fn clang_Cursor_getStorageClass(cursor: CXCursor) -> CX_StorageClass; - #[cfg(feature="gte_clang_3_6")] - pub fn clang_Cursor_getTemplateArgumentKind(cursor: CXCursor, index: c_uint) -> CXTemplateArgumentKind; - #[cfg(feature="gte_clang_3_6")] - pub fn clang_Cursor_getTemplateArgumentType(cursor: CXCursor, index: c_uint) -> CXType; - #[cfg(feature="gte_clang_3_6")] - pub fn clang_Cursor_getTemplateArgumentUnsignedValue(cursor: CXCursor, index: c_uint) -> c_ulonglong; - #[cfg(feature="gte_clang_3_6")] - pub fn clang_Cursor_getTemplateArgumentValue(cursor: CXCursor, index: c_uint) -> c_longlong; - pub fn clang_Cursor_getTranslationUnit(cursor: CXCursor) -> CXTranslationUnit; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_Cursor_hasAttrs(cursor: CXCursor) -> c_uint; - #[cfg(feature="gte_clang_3_7")] - pub fn clang_Cursor_isAnonymous(cursor: CXCursor) -> c_uint; - pub fn clang_Cursor_isBitField(cursor: CXCursor) -> c_uint; - pub fn clang_Cursor_isDynamicCall(cursor: CXCursor) -> c_int; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_Cursor_isFunctionInlined(cursor: CXCursor) -> c_uint; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_Cursor_isMacroBuiltin(cursor: CXCursor) -> c_uint; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_Cursor_isMacroFunctionLike(cursor: CXCursor) -> c_uint; - pub fn clang_Cursor_isNull(cursor: CXCursor) -> c_int; - pub fn clang_Cursor_isObjCOptional(cursor: CXCursor) -> c_uint; - pub fn clang_Cursor_isVariadic(cursor: CXCursor) -> c_uint; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_EvalResult_dispose(result: CXEvalResult); - #[cfg(feature="gte_clang_3_9")] - pub fn clang_EvalResult_getAsDouble(result: CXEvalResult) -> libc::c_double; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_EvalResult_getAsInt(result: CXEvalResult) -> c_int; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_EvalResult_getAsStr(result: CXEvalResult) -> *const c_char; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_EvalResult_getKind(result: CXEvalResult) -> CXEvalResultKind; - #[cfg(feature="gte_clang_3_6")] - pub fn clang_File_isEqual(left: CXFile, right: CXFile) -> c_int; - pub fn clang_IndexAction_create(index: CXIndex) -> CXIndexAction; - pub fn clang_IndexAction_dispose(index: CXIndexAction); - pub fn clang_Location_isFromMainFile(location: CXSourceLocation) -> c_int; - pub fn clang_Location_isInSystemHeader(location: CXSourceLocation) -> c_int; - pub fn clang_Module_getASTFile(module: CXModule) -> CXFile; - pub fn clang_Module_getFullName(module: CXModule) -> CXString; - pub fn clang_Module_getName(module: CXModule) -> CXString; - pub fn clang_Module_getNumTopLevelHeaders(tu: CXTranslationUnit, module: CXModule) -> c_uint; - pub fn clang_Module_getParent(module: CXModule) -> CXModule; - pub fn clang_Module_getTopLevelHeader(tu: CXTranslationUnit, module: CXModule, index: c_uint) -> CXFile; - pub fn clang_Module_isSystem(module: CXModule) -> c_int; - pub fn clang_Range_isNull(range: CXSourceRange) -> c_int; - pub fn clang_Type_getAlignOf(type_: CXType) -> c_longlong; - pub fn clang_Type_getCXXRefQualifier(type_: CXType) -> CXRefQualifierKind; - pub fn clang_Type_getClassType(type_: CXType) -> CXType; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_Type_getNamedType(type_: CXType) -> CXType; - pub fn clang_Type_getNumTemplateArguments(type_: CXType) -> c_int; - #[cfg(feature="gte_clang_3_9")] - pub fn clang_Type_getObjCEncoding(type_: CXType) -> CXString; - pub fn clang_Type_getOffsetOf(type_: CXType, field: *const c_char) -> c_longlong; - pub fn clang_Type_getSizeOf(type_: CXType) -> c_longlong; - pub fn clang_Type_getTemplateArgumentAsType(type_: CXType, index: c_uint) -> CXType; - #[cfg(feature="gte_clang_3_7")] - pub fn clang_Type_visitFields(type_: CXType, visitor: CXFieldVisitor, data: CXClientData) -> CXVisitorResult; - pub fn clang_annotateTokens(tu: CXTranslationUnit, tokens: *mut CXToken, n_tokens: c_uint, cursors: *mut CXCursor); - pub fn clang_codeCompleteAt(tu: CXTranslationUnit, file: *const c_char, line: c_uint, column: c_uint, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, flags: CXCodeComplete_Flags) -> *mut CXCodeCompleteResults; - pub fn clang_codeCompleteGetContainerKind(results: *mut CXCodeCompleteResults, incomplete: *mut c_uint) -> CXCursorKind; - pub fn clang_codeCompleteGetContainerUSR(results: *mut CXCodeCompleteResults) -> CXString; - pub fn clang_codeCompleteGetContexts(results: *mut CXCodeCompleteResults) -> c_ulonglong; - pub fn clang_codeCompleteGetDiagnostic(results: *mut CXCodeCompleteResults, index: c_uint) -> CXDiagnostic; - pub fn clang_codeCompleteGetNumDiagnostics(results: *mut CXCodeCompleteResults) -> c_uint; - pub fn clang_codeCompleteGetObjCSelector(results: *mut CXCodeCompleteResults) -> CXString; - pub fn clang_constructUSR_ObjCCategory(class: *const c_char, category: *const c_char) -> CXString; - pub fn clang_constructUSR_ObjCClass(class: *const c_char) -> CXString; - pub fn clang_constructUSR_ObjCIvar(name: *const c_char, usr: CXString) -> CXString; - pub fn clang_constructUSR_ObjCMethod(name: *const c_char, instance: c_uint, usr: CXString) -> CXString; - pub fn clang_constructUSR_ObjCProperty(property: *const c_char, usr: CXString) -> CXString; - pub fn clang_constructUSR_ObjCProtocol(protocol: *const c_char) -> CXString; - pub fn clang_createCXCursorSet() -> CXCursorSet; - pub fn clang_createIndex(exclude: c_int, display: c_int) -> CXIndex; - pub fn clang_createTranslationUnit(index: CXIndex, file: *const c_char) -> CXTranslationUnit; - pub fn clang_createTranslationUnit2(index: CXIndex, file: *const c_char, tu: *mut CXTranslationUnit) -> CXErrorCode; - pub fn clang_createTranslationUnitFromSourceFile(index: CXIndex, file: *const c_char, n_arguments: c_int, arguments: *const *const c_char, n_unsaved: c_uint, unsaved: *mut CXUnsavedFile) -> CXTranslationUnit; - pub fn clang_defaultCodeCompleteOptions() -> CXCodeComplete_Flags; - pub fn clang_defaultDiagnosticDisplayOptions() -> CXDiagnosticDisplayOptions; - pub fn clang_defaultEditingTranslationUnitOptions() -> CXTranslationUnit_Flags; - pub fn clang_defaultReparseOptions(tu: CXTranslationUnit) -> CXReparse_Flags; - pub fn clang_defaultSaveOptions(tu: CXTranslationUnit) -> CXSaveTranslationUnit_Flags; - pub fn clang_disposeCXCursorSet(set: CXCursorSet); - pub fn clang_disposeCXPlatformAvailability(availability: *mut CXPlatformAvailability); - pub fn clang_disposeCXTUResourceUsage(usage: CXTUResourceUsage); - pub fn clang_disposeCodeCompleteResults(results: *mut CXCodeCompleteResults); - pub fn clang_disposeDiagnostic(diagnostic: CXDiagnostic); - pub fn clang_disposeDiagnosticSet(diagnostic: CXDiagnosticSet); - pub fn clang_disposeIndex(index: CXIndex); - pub fn clang_disposeOverriddenCursors(cursors: *mut CXCursor); - pub fn clang_disposeSourceRangeList(list: *mut CXSourceRangeList); - pub fn clang_disposeString(string: CXString); - #[cfg(feature="gte_clang_3_8")] - pub fn clang_disposeStringSet(set: *mut CXStringSet); - pub fn clang_disposeTokens(tu: CXTranslationUnit, tokens: *mut CXToken, n_tokens: c_uint); - pub fn clang_disposeTranslationUnit(tu: CXTranslationUnit); - pub fn clang_enableStackTraces(); - pub fn clang_equalCursors(left: CXCursor, right: CXCursor) -> c_uint; - pub fn clang_equalLocations(left: CXSourceLocation, right: CXSourceLocation) -> c_uint; - pub fn clang_equalRanges(left: CXSourceRange, right: CXSourceRange) -> c_uint; - pub fn clang_equalTypes(left: CXType, right: CXType) -> c_uint; - pub fn clang_executeOnThread(function: extern fn(*mut c_void), data: *mut c_void, stack: c_uint); - pub fn clang_findIncludesInFile(tu: CXTranslationUnit, file: CXFile, cursor: CXCursorAndRangeVisitor) -> CXResult; - pub fn clang_findReferencesInFile(cursor: CXCursor, file: CXFile, visitor: CXCursorAndRangeVisitor) -> CXResult; - pub fn clang_formatDiagnostic(diagnostic: CXDiagnostic, flags: CXDiagnosticDisplayOptions) -> CXString; - #[cfg(feature="gte_clang_3_7")] - pub fn clang_free(buffer: *mut c_void); - pub fn clang_getArgType(type_: CXType, index: c_uint) -> CXType; - pub fn clang_getArrayElementType(type_: CXType) -> CXType; - pub fn clang_getArraySize(type_: CXType) -> c_longlong; - pub fn clang_getCString(string: CXString) -> *const c_char; - pub fn clang_getCXTUResourceUsage(tu: CXTranslationUnit) -> CXTUResourceUsage; - pub fn clang_getCXXAccessSpecifier(cursor: CXCursor) -> CX_CXXAccessSpecifier; - pub fn clang_getCanonicalCursor(cursor: CXCursor) -> CXCursor; - pub fn clang_getCanonicalType(type_: CXType) -> CXType; - pub fn clang_getChildDiagnostics(diagnostic: CXDiagnostic) -> CXDiagnosticSet; - pub fn clang_getClangVersion() -> CXString; - pub fn clang_getCompletionAnnotation(string: CXCompletionString, index: c_uint) -> CXString; - pub fn clang_getCompletionAvailability(string: CXCompletionString) -> CXAvailabilityKind; - pub fn clang_getCompletionBriefComment(string: CXCompletionString) -> CXString; - pub fn clang_getCompletionChunkCompletionString(string: CXCompletionString, index: c_uint) -> CXCompletionString; - pub fn clang_getCompletionChunkKind(string: CXCompletionString, index: c_uint) -> CXCompletionChunkKind; - pub fn clang_getCompletionChunkText(string: CXCompletionString, index: c_uint) -> CXString; - pub fn clang_getCompletionNumAnnotations(string: CXCompletionString) -> c_uint; - pub fn clang_getCompletionParent(string: CXCompletionString, kind: *mut CXCursorKind) -> CXString; - pub fn clang_getCompletionPriority(string: CXCompletionString) -> c_uint; - pub fn clang_getCursor(tu: CXTranslationUnit, location: CXSourceLocation) -> CXCursor; - pub fn clang_getCursorAvailability(cursor: CXCursor) -> CXAvailabilityKind; - pub fn clang_getCursorCompletionString(cursor: CXCursor) -> CXCompletionString; - pub fn clang_getCursorDefinition(cursor: CXCursor) -> CXCursor; - pub fn clang_getCursorDisplayName(cursor: CXCursor) -> CXString; - pub fn clang_getCursorExtent(cursor: CXCursor) -> CXSourceRange; - pub fn clang_getCursorKind(cursor: CXCursor) -> CXCursorKind; - pub fn clang_getCursorKindSpelling(kind: CXCursorKind) -> CXString; - pub fn clang_getCursorLanguage(cursor: CXCursor) -> CXLanguageKind; - pub fn clang_getCursorLexicalParent(cursor: CXCursor) -> CXCursor; - pub fn clang_getCursorLinkage(cursor: CXCursor) -> CXLinkageKind; - pub fn clang_getCursorLocation(cursor: CXCursor) -> CXSourceLocation; - pub fn clang_getCursorPlatformAvailability(cursor: CXCursor, deprecated: *mut c_int, deprecated_message: *mut CXString, unavailable: *mut c_int, unavailable_message: *mut CXString, availability: *mut CXPlatformAvailability, n_availability: c_int) -> c_int; - pub fn clang_getCursorReferenceNameRange(cursor: CXCursor, flags: CXNameRefFlags, index: c_uint) -> CXSourceRange; - pub fn clang_getCursorReferenced(cursor: CXCursor) -> CXCursor; - pub fn clang_getCursorResultType(cursor: CXCursor) -> CXType; - pub fn clang_getCursorSemanticParent(cursor: CXCursor) -> CXCursor; - pub fn clang_getCursorSpelling(cursor: CXCursor) -> CXString; - pub fn clang_getCursorType(cursor: CXCursor) -> CXType; - pub fn clang_getCursorUSR(cursor: CXCursor) -> CXString; - #[cfg(feature="gte_clang_3_8")] - pub fn clang_getCursorVisibility(cursor: CXCursor) -> CXVisibilityKind; - pub fn clang_getDeclObjCTypeEncoding(cursor: CXCursor) -> CXString; - pub fn clang_getDefinitionSpellingAndExtent(cursor: CXCursor, start: *mut *const c_char, end: *mut *const c_char, start_line: *mut c_uint, start_column: *mut c_uint, end_line: *mut c_uint, end_column: *mut c_uint); - pub fn clang_getDiagnostic(tu: CXTranslationUnit, index: c_uint) -> CXDiagnostic; - pub fn clang_getDiagnosticCategory(diagnostic: CXDiagnostic) -> c_uint; - pub fn clang_getDiagnosticCategoryName(category: c_uint) -> CXString; - pub fn clang_getDiagnosticCategoryText(diagnostic: CXDiagnostic) -> CXString; - pub fn clang_getDiagnosticFixIt(diagnostic: CXDiagnostic, index: c_uint, range: *mut CXSourceRange) -> CXString; - pub fn clang_getDiagnosticInSet(diagnostic: CXDiagnosticSet, index: c_uint) -> CXDiagnostic; - pub fn clang_getDiagnosticLocation(diagnostic: CXDiagnostic) -> CXSourceLocation; - pub fn clang_getDiagnosticNumFixIts(diagnostic: CXDiagnostic) -> c_uint; - pub fn clang_getDiagnosticNumRanges(diagnostic: CXDiagnostic) -> c_uint; - pub fn clang_getDiagnosticOption(diagnostic: CXDiagnostic, option: *mut CXString) -> CXString; - pub fn clang_getDiagnosticRange(diagnostic: CXDiagnostic, index: c_uint) -> CXSourceRange; - pub fn clang_getDiagnosticSetFromTU(tu: CXTranslationUnit) -> CXDiagnosticSet; - pub fn clang_getDiagnosticSeverity(diagnostic: CXDiagnostic) -> CXDiagnosticSeverity; - pub fn clang_getDiagnosticSpelling(diagnostic: CXDiagnostic) -> CXString; - pub fn clang_getElementType(type_: CXType) -> CXType; - pub fn clang_getEnumConstantDeclUnsignedValue(cursor: CXCursor) -> c_ulonglong; - pub fn clang_getEnumConstantDeclValue(cursor: CXCursor) -> c_longlong; - pub fn clang_getEnumDeclIntegerType(cursor: CXCursor) -> CXType; - pub fn clang_getExpansionLocation(location: CXSourceLocation, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint); - pub fn clang_getFieldDeclBitWidth(cursor: CXCursor) -> c_int; - pub fn clang_getFile(tu: CXTranslationUnit, file: *const c_char) -> CXFile; - pub fn clang_getFileLocation(location: CXSourceLocation, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint); - pub fn clang_getFileName(file: CXFile) -> CXString; - pub fn clang_getFileTime(file: CXFile) -> time_t; - pub fn clang_getFileUniqueID(file: CXFile, id: *mut CXFileUniqueID) -> c_int; - pub fn clang_getFunctionTypeCallingConv(type_: CXType) -> CXCallingConv; - pub fn clang_getIBOutletCollectionType(cursor: CXCursor) -> CXType; - pub fn clang_getIncludedFile(cursor: CXCursor) -> CXFile; - pub fn clang_getInclusions(tu: CXTranslationUnit, visitor: CXInclusionVisitor, data: CXClientData); - pub fn clang_getInstantiationLocation(location: CXSourceLocation, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint); - pub fn clang_getLocation(tu: CXTranslationUnit, file: CXFile, line: c_uint, column: c_uint) -> CXSourceLocation; - pub fn clang_getLocationForOffset(tu: CXTranslationUnit, file: CXFile, offset: c_uint) -> CXSourceLocation; - pub fn clang_getModuleForFile(tu: CXTranslationUnit, file: CXFile) -> CXModule; - pub fn clang_getNullCursor() -> CXCursor; - pub fn clang_getNullLocation() -> CXSourceLocation; - pub fn clang_getNullRange() -> CXSourceRange; - pub fn clang_getNumArgTypes(type_: CXType) -> c_int; - pub fn clang_getNumCompletionChunks(string: CXCompletionString) -> c_uint; - pub fn clang_getNumDiagnostics(tu: CXTranslationUnit) -> c_uint; - pub fn clang_getNumDiagnosticsInSet(diagnostic: CXDiagnosticSet) -> c_uint; - pub fn clang_getNumElements(type_: CXType) -> c_longlong; - pub fn clang_getNumOverloadedDecls(cursor: CXCursor) -> c_uint; - pub fn clang_getOverloadedDecl(cursor: CXCursor, index: c_uint) -> CXCursor; - pub fn clang_getOverriddenCursors(cursor: CXCursor, cursors: *mut *mut CXCursor, n_cursors: *mut c_uint); - pub fn clang_getPointeeType(type_: CXType) -> CXType; - pub fn clang_getPresumedLocation(location: CXSourceLocation, file: *mut CXString, line: *mut c_uint, column: *mut c_uint); - pub fn clang_getRange(start: CXSourceLocation, end: CXSourceLocation) -> CXSourceRange; - pub fn clang_getRangeEnd(range: CXSourceRange) -> CXSourceLocation; - pub fn clang_getRangeStart(range: CXSourceRange) -> CXSourceLocation; - pub fn clang_getRemappings(file: *const c_char) -> CXRemapping; - pub fn clang_getRemappingsFromFileList(files: *mut *const c_char, n_files: c_uint) -> CXRemapping; - pub fn clang_getResultType(type_: CXType) -> CXType; - pub fn clang_getSkippedRanges(tu: CXTranslationUnit, file: CXFile) -> *mut CXSourceRangeList; - pub fn clang_getSpecializedCursorTemplate(cursor: CXCursor) -> CXCursor; - pub fn clang_getSpellingLocation(location: CXSourceLocation, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint); - pub fn clang_getTUResourceUsageName(kind: CXTUResourceUsageKind) -> *const c_char; - pub fn clang_getTemplateCursorKind(cursor: CXCursor) -> CXCursorKind; - pub fn clang_getTokenExtent(tu: CXTranslationUnit, token: CXToken) -> CXSourceRange; - pub fn clang_getTokenKind(token: CXToken) -> CXTokenKind; - pub fn clang_getTokenLocation(tu: CXTranslationUnit, token: CXToken) -> CXSourceLocation; - pub fn clang_getTokenSpelling(tu: CXTranslationUnit, token: CXToken) -> CXString; - pub fn clang_getTranslationUnitCursor(tu: CXTranslationUnit) -> CXCursor; - pub fn clang_getTranslationUnitSpelling(tu: CXTranslationUnit) -> CXString; - pub fn clang_getTypeDeclaration(type_: CXType) -> CXCursor; - pub fn clang_getTypeKindSpelling(type_: CXTypeKind) -> CXString; - pub fn clang_getTypeSpelling(type_: CXType) -> CXString; - pub fn clang_getTypedefDeclUnderlyingType(cursor: CXCursor) -> CXType; - pub fn clang_hashCursor(cursor: CXCursor) -> c_uint; - pub fn clang_indexLoc_getCXSourceLocation(location: CXIdxLoc) -> CXSourceLocation; - pub fn clang_indexLoc_getFileLocation(location: CXIdxLoc, index_file: *mut CXIdxClientFile, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint); - pub fn clang_indexSourceFile(index: CXIndexAction, data: CXClientData, callbacks: *mut IndexerCallbacks, n_callbacks: c_uint, index_flags: CXIndexOptFlags, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, tu: *mut CXTranslationUnit, tu_flags: CXTranslationUnit_Flags) -> CXErrorCode; - #[cfg(feature="gte_clang_3_8")] - pub fn clang_indexSourceFileFullArgv(index: CXIndexAction, data: CXClientData, callbacks: *mut IndexerCallbacks, n_callbacks: c_uint, index_flags: CXIndexOptFlags, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, tu: *mut CXTranslationUnit, tu_flags: CXTranslationUnit_Flags) -> CXErrorCode; - pub fn clang_indexTranslationUnit(index: CXIndexAction, data: CXClientData, callbacks: *mut IndexerCallbacks, n_callbacks: c_uint, flags: CXIndexOptFlags, tu: CXTranslationUnit) -> c_int; - pub fn clang_index_getCXXClassDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxCXXClassDeclInfo; - pub fn clang_index_getClientContainer(info: *const CXIdxContainerInfo) -> CXIdxClientContainer; - pub fn clang_index_getClientEntity(info: *const CXIdxEntityInfo) -> CXIdxClientEntity; - pub fn clang_index_getIBOutletCollectionAttrInfo(info: *const CXIdxAttrInfo) -> *const CXIdxIBOutletCollectionAttrInfo; - pub fn clang_index_getObjCCategoryDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCCategoryDeclInfo; - pub fn clang_index_getObjCContainerDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCContainerDeclInfo; - pub fn clang_index_getObjCInterfaceDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCInterfaceDeclInfo; - pub fn clang_index_getObjCPropertyDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCPropertyDeclInfo; - pub fn clang_index_getObjCProtocolRefListInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCProtocolRefListInfo; - pub fn clang_index_isEntityObjCContainerKind(info: CXIdxEntityKind) -> c_int; - pub fn clang_index_setClientContainer(info: *const CXIdxContainerInfo, container: CXIdxClientContainer); - pub fn clang_index_setClientEntity(info: *const CXIdxEntityInfo, entity: CXIdxClientEntity); - pub fn clang_isAttribute(kind: CXCursorKind) -> c_uint; - pub fn clang_isConstQualifiedType(type_: CXType) -> c_uint; - pub fn clang_isCursorDefinition(cursor: CXCursor) -> c_uint; - pub fn clang_isDeclaration(kind: CXCursorKind) -> c_uint; - pub fn clang_isExpression(kind: CXCursorKind) -> c_uint; - pub fn clang_isFileMultipleIncludeGuarded(tu: CXTranslationUnit, file: CXFile) -> c_uint; - pub fn clang_isFunctionTypeVariadic(type_: CXType) -> c_uint; - pub fn clang_isInvalid(kind: CXCursorKind) -> c_uint; - pub fn clang_isPODType(type_: CXType) -> c_uint; - pub fn clang_isPreprocessing(kind: CXCursorKind) -> c_uint; - pub fn clang_isReference(kind: CXCursorKind) -> c_uint; - pub fn clang_isRestrictQualifiedType(type_: CXType) -> c_uint; - pub fn clang_isStatement(kind: CXCursorKind) -> c_uint; - pub fn clang_isTranslationUnit(kind: CXCursorKind) -> c_uint; - pub fn clang_isUnexposed(kind: CXCursorKind) -> c_uint; - pub fn clang_isVirtualBase(cursor: CXCursor) -> c_uint; - pub fn clang_isVolatileQualifiedType(type_: CXType) -> c_uint; - pub fn clang_loadDiagnostics(file: *const c_char, error: *mut CXLoadDiag_Error, message: *mut CXString) -> CXDiagnosticSet; - pub fn clang_parseTranslationUnit(index: CXIndex, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, flags: CXTranslationUnit_Flags) -> CXTranslationUnit; - pub fn clang_parseTranslationUnit2(index: CXIndex, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, flags: CXTranslationUnit_Flags, tu: *mut CXTranslationUnit) -> CXErrorCode; - #[cfg(feature="gte_clang_3_8")] - pub fn clang_parseTranslationUnit2FullArgv(index: CXIndex, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, flags: CXTranslationUnit_Flags, tu: *mut CXTranslationUnit) -> CXErrorCode; - pub fn clang_remap_dispose(remapping: CXRemapping); - pub fn clang_remap_getFilenames(remapping: CXRemapping, index: c_uint, original: *mut CXString, transformed: *mut CXString); - pub fn clang_remap_getNumFiles(remapping: CXRemapping) -> c_uint; - pub fn clang_reparseTranslationUnit(tu: CXTranslationUnit, n_unsaved: c_uint, unsaved: *mut CXUnsavedFile, flags: CXReparse_Flags) -> CXErrorCode; - pub fn clang_saveTranslationUnit(tu: CXTranslationUnit, file: *const c_char, options: CXSaveTranslationUnit_Flags) -> CXSaveError; - pub fn clang_sortCodeCompletionResults(results: *mut CXCompletionResult, n_results: c_uint); - pub fn clang_toggleCrashRecovery(recovery: c_uint); - pub fn clang_tokenize(tu: CXTranslationUnit, range: CXSourceRange, tokens: *mut *mut CXToken, n_tokens: *mut c_uint); - pub fn clang_visitChildren(cursor: CXCursor, visitor: CXCursorVisitor, data: CXClientData) -> c_uint; - - // Documentation - pub fn clang_BlockCommandComment_getArgText(comment: CXComment, index: c_uint) -> CXString; - pub fn clang_BlockCommandComment_getCommandName(comment: CXComment) -> CXString; - pub fn clang_BlockCommandComment_getNumArgs(comment: CXComment) -> c_uint; - pub fn clang_BlockCommandComment_getParagraph(comment: CXComment) -> CXComment; - pub fn clang_Comment_getChild(comment: CXComment, index: c_uint) -> CXComment; - pub fn clang_Comment_getKind(comment: CXComment) -> CXCommentKind; - pub fn clang_Comment_getNumChildren(comment: CXComment) -> c_uint; - pub fn clang_Comment_isWhitespace(comment: CXComment) -> c_uint; - pub fn clang_Cursor_getParsedComment(C: CXCursor) -> CXComment; - pub fn clang_FullComment_getAsHTML(comment: CXComment) -> CXString; - pub fn clang_FullComment_getAsXML(comment: CXComment) -> CXString; - pub fn clang_HTMLStartTagComment_isSelfClosing(comment: CXComment) -> c_uint; - pub fn clang_HTMLStartTag_getAttrName(comment: CXComment, index: c_uint) -> CXString; - pub fn clang_HTMLStartTag_getAttrValue(comment: CXComment, index: c_uint) -> CXString; - pub fn clang_HTMLStartTag_getNumAttrs(comment: CXComment) -> c_uint; - pub fn clang_HTMLTagComment_getAsString(comment: CXComment) -> CXString; - pub fn clang_HTMLTagComment_getTagName(comment: CXComment) -> CXString; - pub fn clang_InlineCommandComment_getArgText(comment: CXComment, index: c_uint) -> CXString; - pub fn clang_InlineCommandComment_getCommandName(comment: CXComment) -> CXString; - pub fn clang_InlineCommandComment_getNumArgs(comment: CXComment) -> c_uint; - pub fn clang_InlineCommandComment_getRenderKind(comment: CXComment) -> CXCommentInlineCommandRenderKind; - pub fn clang_InlineContentComment_hasTrailingNewline(comment: CXComment) -> c_uint; - pub fn clang_ParamCommandComment_getDirection(comment: CXComment) -> CXCommentParamPassDirection; - pub fn clang_ParamCommandComment_getParamIndex(comment: CXComment) -> c_uint; - pub fn clang_ParamCommandComment_getParamName(comment: CXComment) -> CXString; - pub fn clang_ParamCommandComment_isDirectionExplicit(comment: CXComment) -> c_uint; - pub fn clang_ParamCommandComment_isParamIndexValid(comment: CXComment) -> c_uint; - pub fn clang_TParamCommandComment_getDepth(comment: CXComment) -> c_uint; - pub fn clang_TParamCommandComment_getIndex(comment: CXComment, depth: c_uint) -> c_uint; - pub fn clang_TParamCommandComment_getParamName(comment: CXComment) -> CXString; - pub fn clang_TParamCommandComment_isParamPositionValid(comment: CXComment) -> c_uint; - pub fn clang_TextComment_getText(comment: CXComment) -> CXString; - pub fn clang_VerbatimBlockLineComment_getText(comment: CXComment) -> CXString; - pub fn clang_VerbatimLineComment_getText(comment: CXComment) -> CXString; -} +// Copyright 2016 Kyle Mayes +// +// Licensed 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. + +//! Rust bindings for `libclang`. +//! +//! ## Supported Versions +//! +//! * 3.5 - [Documentation](https://kylemayes.github.io/clang-sys/3_5/clang_sys) +//! * 3.6 - [Documentation](https://kylemayes.github.io/clang-sys/3_6/clang_sys) +//! * 3.7 - [Documentation](https://kylemayes.github.io/clang-sys/3_7/clang_sys) +//! * 3.8 - [Documentation](https://kylemayes.github.io/clang-sys/3_8/clang_sys) +//! * 3.9 - [Documentation](https://kylemayes.github.io/clang-sys/3_9/clang_sys) +//! * 4.0 - [Documentation](https://kylemayes.github.io/clang-sys/4_0/clang_sys) + +#![allow(non_camel_case_types, non_snake_case, non_upper_case_globals)] + +#![cfg_attr(feature="clippy", feature(plugin))] +#![cfg_attr(feature="clippy", plugin(clippy))] +#![cfg_attr(feature="clippy", warn(clippy))] + +#[macro_use] +extern crate bitflags; + +extern crate glob; +extern crate libc; +#[cfg(feature="runtime")] +extern crate libloading; + +pub mod support; + +#[macro_use] +mod link; + +use std::mem; + +use libc::{c_char, c_int, c_longlong, c_uint, c_ulong, c_ulonglong, c_void, time_t}; + +pub type CXClientData = *mut c_void; +pub type CXCursorVisitor = extern fn(CXCursor, CXCursor, CXClientData) -> CXChildVisitResult; +#[cfg(feature="gte_clang_3_7")] +pub type CXFieldVisitor = extern fn(CXCursor, CXClientData) -> CXVisitorResult; +pub type CXInclusionVisitor = extern fn(CXFile, *mut CXSourceLocation, c_uint, CXClientData); + +//================================================ +// Macros +//================================================ + +// cenum! ________________________________________ + +/// Defines a C enum as a series of constants. +macro_rules! cenum { + ($(#[$meta:meta])* enum $name:ident { + $($(#[$vmeta:meta])* const $variant:ident = $value:expr), +, + }) => ( + pub type $name = c_int; + + $($(#[$vmeta])* pub const $variant: $name = $value;)+ + ); +} + +// default! ______________________________________ + +/// Implements a zeroing implementation of `Default` for the supplied type. +macro_rules! default { + (#[$meta:meta] $ty:ty) => { + #[$meta] + impl Default for $ty { + fn default() -> $ty { + unsafe { mem::zeroed() } + } + } + }; + + ($ty:ty) => { + impl Default for $ty { + fn default() -> $ty { + unsafe { mem::zeroed() } + } + } + }; +} + +//================================================ +// Enums +//================================================ + +cenum! { + enum CXAvailabilityKind { + const CXAvailability_Available = 0, + const CXAvailability_Deprecated = 1, + const CXAvailability_NotAvailable = 2, + const CXAvailability_NotAccessible = 3, + } +} + +cenum! { + enum CXCallingConv { + const CXCallingConv_Default = 0, + const CXCallingConv_C = 1, + const CXCallingConv_X86StdCall = 2, + const CXCallingConv_X86FastCall = 3, + const CXCallingConv_X86ThisCall = 4, + const CXCallingConv_X86Pascal = 5, + const CXCallingConv_AAPCS = 6, + const CXCallingConv_AAPCS_VFP = 7, + /// Only produced by `libclang` 4.0 and later. + const CXCallingConv_X86RegCall = 8, + const CXCallingConv_IntelOclBicc = 9, + const CXCallingConv_X86_64Win64 = 10, + const CXCallingConv_X86_64SysV = 11, + /// Only produced by `libclang` 3.6 and later. + const CXCallingConv_X86VectorCall = 12, + /// Only produced by `libclang` 3.9 and later. + const CXCallingConv_Swift = 13, + /// Only produced by `libclang` 3.9 and later. + const CXCallingConv_PreserveMost = 14, + /// Only produced by `libclang` 3.9 and later. + const CXCallingConv_PreserveAll = 15, + const CXCallingConv_Invalid = 100, + const CXCallingConv_Unexposed = 200, + } +} + +cenum! { + enum CXChildVisitResult { + const CXChildVisit_Break = 0, + const CXChildVisit_Continue = 1, + const CXChildVisit_Recurse = 2, + } +} + +cenum! { + enum CXCommentInlineCommandRenderKind { + const CXCommentInlineCommandRenderKind_Normal = 0, + const CXCommentInlineCommandRenderKind_Bold = 1, + const CXCommentInlineCommandRenderKind_Monospaced = 2, + const CXCommentInlineCommandRenderKind_Emphasized = 3, + } +} + +cenum! { + enum CXCommentKind { + const CXComment_Null = 0, + const CXComment_Text = 1, + const CXComment_InlineCommand = 2, + const CXComment_HTMLStartTag = 3, + const CXComment_HTMLEndTag = 4, + const CXComment_Paragraph = 5, + const CXComment_BlockCommand = 6, + const CXComment_ParamCommand = 7, + const CXComment_TParamCommand = 8, + const CXComment_VerbatimBlockCommand = 9, + const CXComment_VerbatimBlockLine = 10, + const CXComment_VerbatimLine = 11, + const CXComment_FullComment = 12, + } +} + +cenum! { + enum CXCommentParamPassDirection { + const CXCommentParamPassDirection_In = 0, + const CXCommentParamPassDirection_Out = 1, + const CXCommentParamPassDirection_InOut = 2, + } +} + +cenum! { + enum CXCompilationDatabase_Error { + const CXCompilationDatabase_NoError = 0, + const CXCompilationDatabase_CanNotLoadDatabase = 1, + } +} + +cenum! { + enum CXCompletionChunkKind { + const CXCompletionChunk_Optional = 0, + const CXCompletionChunk_TypedText = 1, + const CXCompletionChunk_Text = 2, + const CXCompletionChunk_Placeholder = 3, + const CXCompletionChunk_Informative = 4, + const CXCompletionChunk_CurrentParameter = 5, + const CXCompletionChunk_LeftParen = 6, + const CXCompletionChunk_RightParen = 7, + const CXCompletionChunk_LeftBracket = 8, + const CXCompletionChunk_RightBracket = 9, + const CXCompletionChunk_LeftBrace = 10, + const CXCompletionChunk_RightBrace = 11, + const CXCompletionChunk_LeftAngle = 12, + const CXCompletionChunk_RightAngle = 13, + const CXCompletionChunk_Comma = 14, + const CXCompletionChunk_ResultType = 15, + const CXCompletionChunk_Colon = 16, + const CXCompletionChunk_SemiColon = 17, + const CXCompletionChunk_Equal = 18, + const CXCompletionChunk_HorizontalSpace = 19, + const CXCompletionChunk_VerticalSpace = 20, + } +} + +cenum! { + enum CXCursorKind { + const CXCursor_UnexposedDecl = 1, + const CXCursor_StructDecl = 2, + const CXCursor_UnionDecl = 3, + const CXCursor_ClassDecl = 4, + const CXCursor_EnumDecl = 5, + const CXCursor_FieldDecl = 6, + const CXCursor_EnumConstantDecl = 7, + const CXCursor_FunctionDecl = 8, + const CXCursor_VarDecl = 9, + const CXCursor_ParmDecl = 10, + const CXCursor_ObjCInterfaceDecl = 11, + const CXCursor_ObjCCategoryDecl = 12, + const CXCursor_ObjCProtocolDecl = 13, + const CXCursor_ObjCPropertyDecl = 14, + const CXCursor_ObjCIvarDecl = 15, + const CXCursor_ObjCInstanceMethodDecl = 16, + const CXCursor_ObjCClassMethodDecl = 17, + const CXCursor_ObjCImplementationDecl = 18, + const CXCursor_ObjCCategoryImplDecl = 19, + const CXCursor_TypedefDecl = 20, + const CXCursor_CXXMethod = 21, + const CXCursor_Namespace = 22, + const CXCursor_LinkageSpec = 23, + const CXCursor_Constructor = 24, + const CXCursor_Destructor = 25, + const CXCursor_ConversionFunction = 26, + const CXCursor_TemplateTypeParameter = 27, + const CXCursor_NonTypeTemplateParameter = 28, + const CXCursor_TemplateTemplateParameter = 29, + const CXCursor_FunctionTemplate = 30, + const CXCursor_ClassTemplate = 31, + const CXCursor_ClassTemplatePartialSpecialization = 32, + const CXCursor_NamespaceAlias = 33, + const CXCursor_UsingDirective = 34, + const CXCursor_UsingDeclaration = 35, + const CXCursor_TypeAliasDecl = 36, + const CXCursor_ObjCSynthesizeDecl = 37, + const CXCursor_ObjCDynamicDecl = 38, + const CXCursor_CXXAccessSpecifier = 39, + const CXCursor_ObjCSuperClassRef = 40, + const CXCursor_ObjCProtocolRef = 41, + const CXCursor_ObjCClassRef = 42, + const CXCursor_TypeRef = 43, + const CXCursor_CXXBaseSpecifier = 44, + const CXCursor_TemplateRef = 45, + const CXCursor_NamespaceRef = 46, + const CXCursor_MemberRef = 47, + const CXCursor_LabelRef = 48, + const CXCursor_OverloadedDeclRef = 49, + const CXCursor_VariableRef = 50, + const CXCursor_InvalidFile = 70, + const CXCursor_NoDeclFound = 71, + const CXCursor_NotImplemented = 72, + const CXCursor_InvalidCode = 73, + const CXCursor_UnexposedExpr = 100, + const CXCursor_DeclRefExpr = 101, + const CXCursor_MemberRefExpr = 102, + const CXCursor_CallExpr = 103, + const CXCursor_ObjCMessageExpr = 104, + const CXCursor_BlockExpr = 105, + const CXCursor_IntegerLiteral = 106, + const CXCursor_FloatingLiteral = 107, + const CXCursor_ImaginaryLiteral = 108, + const CXCursor_StringLiteral = 109, + const CXCursor_CharacterLiteral = 110, + const CXCursor_ParenExpr = 111, + const CXCursor_UnaryOperator = 112, + const CXCursor_ArraySubscriptExpr = 113, + const CXCursor_BinaryOperator = 114, + const CXCursor_CompoundAssignOperator = 115, + const CXCursor_ConditionalOperator = 116, + const CXCursor_CStyleCastExpr = 117, + const CXCursor_CompoundLiteralExpr = 118, + const CXCursor_InitListExpr = 119, + const CXCursor_AddrLabelExpr = 120, + const CXCursor_StmtExpr = 121, + const CXCursor_GenericSelectionExpr = 122, + const CXCursor_GNUNullExpr = 123, + const CXCursor_CXXStaticCastExpr = 124, + const CXCursor_CXXDynamicCastExpr = 125, + const CXCursor_CXXReinterpretCastExpr = 126, + const CXCursor_CXXConstCastExpr = 127, + const CXCursor_CXXFunctionalCastExpr = 128, + const CXCursor_CXXTypeidExpr = 129, + const CXCursor_CXXBoolLiteralExpr = 130, + const CXCursor_CXXNullPtrLiteralExpr = 131, + const CXCursor_CXXThisExpr = 132, + const CXCursor_CXXThrowExpr = 133, + const CXCursor_CXXNewExpr = 134, + const CXCursor_CXXDeleteExpr = 135, + const CXCursor_UnaryExpr = 136, + const CXCursor_ObjCStringLiteral = 137, + const CXCursor_ObjCEncodeExpr = 138, + const CXCursor_ObjCSelectorExpr = 139, + const CXCursor_ObjCProtocolExpr = 140, + const CXCursor_ObjCBridgedCastExpr = 141, + const CXCursor_PackExpansionExpr = 142, + const CXCursor_SizeOfPackExpr = 143, + const CXCursor_LambdaExpr = 144, + const CXCursor_ObjCBoolLiteralExpr = 145, + const CXCursor_ObjCSelfExpr = 146, + /// Only produced by `libclang` 3.8 and later. + const CXCursor_OMPArraySectionExpr = 147, + /// Only produced by `libclang` 3.9 and later. + const CXCursor_ObjCAvailabilityCheckExpr = 148, + const CXCursor_UnexposedStmt = 200, + const CXCursor_LabelStmt = 201, + const CXCursor_CompoundStmt = 202, + const CXCursor_CaseStmt = 203, + const CXCursor_DefaultStmt = 204, + const CXCursor_IfStmt = 205, + const CXCursor_SwitchStmt = 206, + const CXCursor_WhileStmt = 207, + const CXCursor_DoStmt = 208, + const CXCursor_ForStmt = 209, + const CXCursor_GotoStmt = 210, + const CXCursor_IndirectGotoStmt = 211, + const CXCursor_ContinueStmt = 212, + const CXCursor_BreakStmt = 213, + const CXCursor_ReturnStmt = 214, + /// Duplicate of `CXCursor_GccAsmStmt`. + const CXCursor_AsmStmt = 215, + const CXCursor_ObjCAtTryStmt = 216, + const CXCursor_ObjCAtCatchStmt = 217, + const CXCursor_ObjCAtFinallyStmt = 218, + const CXCursor_ObjCAtThrowStmt = 219, + const CXCursor_ObjCAtSynchronizedStmt = 220, + const CXCursor_ObjCAutoreleasePoolStmt = 221, + const CXCursor_ObjCForCollectionStmt = 222, + const CXCursor_CXXCatchStmt = 223, + const CXCursor_CXXTryStmt = 224, + const CXCursor_CXXForRangeStmt = 225, + const CXCursor_SEHTryStmt = 226, + const CXCursor_SEHExceptStmt = 227, + const CXCursor_SEHFinallyStmt = 228, + const CXCursor_MSAsmStmt = 229, + const CXCursor_NullStmt = 230, + const CXCursor_DeclStmt = 231, + const CXCursor_OMPParallelDirective = 232, + const CXCursor_OMPSimdDirective = 233, + const CXCursor_OMPForDirective = 234, + const CXCursor_OMPSectionsDirective = 235, + const CXCursor_OMPSectionDirective = 236, + const CXCursor_OMPSingleDirective = 237, + const CXCursor_OMPParallelForDirective = 238, + const CXCursor_OMPParallelSectionsDirective = 239, + const CXCursor_OMPTaskDirective = 240, + const CXCursor_OMPMasterDirective = 241, + const CXCursor_OMPCriticalDirective = 242, + const CXCursor_OMPTaskyieldDirective = 243, + const CXCursor_OMPBarrierDirective = 244, + const CXCursor_OMPTaskwaitDirective = 245, + const CXCursor_OMPFlushDirective = 246, + const CXCursor_SEHLeaveStmt = 247, + /// Only produced by `libclang` 3.6 and later. + const CXCursor_OMPOrderedDirective = 248, + /// Only produced by `libclang` 3.6 and later. + const CXCursor_OMPAtomicDirective = 249, + /// Only produced by `libclang` 3.6 and later. + const CXCursor_OMPForSimdDirective = 250, + /// Only produced by `libclang` 3.6 and later. + const CXCursor_OMPParallelForSimdDirective = 251, + /// Only produced by `libclang` 3.6 and later. + const CXCursor_OMPTargetDirective = 252, + /// Only produced by `libclang` 3.6 and later. + const CXCursor_OMPTeamsDirective = 253, + /// Only produced by `libclang` 3.7 and later. + const CXCursor_OMPTaskgroupDirective = 254, + /// Only produced by `libclang` 3.7 and later. + const CXCursor_OMPCancellationPointDirective = 255, + /// Only produced by `libclang` 3.7 and later. + const CXCursor_OMPCancelDirective = 256, + /// Only produced by `libclang` 3.8 and later. + const CXCursor_OMPTargetDataDirective = 257, + /// Only produced by `libclang` 3.8 and later. + const CXCursor_OMPTaskLoopDirective = 258, + /// Only produced by `libclang` 3.8 and later. + const CXCursor_OMPTaskLoopSimdDirective = 259, + /// Only produced by `libclang` 3.8 and later. + const CXCursor_OMPDistributeDirective = 260, + /// Only produced by `libclang` 3.9 and later. + const CXCursor_OMPTargetEnterDataDirective = 261, + /// Only produced by `libclang` 3.9 and later. + const CXCursor_OMPTargetExitDataDirective = 262, + /// Only produced by `libclang` 3.9 and later. + const CXCursor_OMPTargetParallelDirective = 263, + /// Only produced by `libclang` 3.9 and later. + const CXCursor_OMPTargetParallelForDirective = 264, + /// Only produced by `libclang` 3.9 and later. + const CXCursor_OMPTargetUpdateDirective = 265, + /// Only produced by `libclang` 3.9 and later. + const CXCursor_OMPDistributeParallelForDirective = 266, + /// Only produced by `libclang` 3.9 and later. + const CXCursor_OMPDistributeParallelForSimdDirective = 267, + /// Only produced by `libclang` 3.9 and later. + const CXCursor_OMPDistributeSimdDirective = 268, + /// Only produced by `libclang` 3.9 and later. + const CXCursor_OMPTargetParallelForSimdDirective = 269, + /// Only produced by `libclang` 4.0 and later. + const CXCursor_OMPTargetSimdDirective = 270, + /// Only produced by `libclang` 4.0 and later. + const CXCursor_OMPTeamsDistributeDirective = 271, + /// Only produced by `libclang` 4.0 and later. + const CXCursor_OMPTeamsDistributeSimdDirective = 272, + /// Only produced by `libclang` 4.0 and later. + const CXCursor_OMPTeamsDistributeParallelForSimdDirective = 273, + /// Only produced by `libclang` 4.0 and later. + const CXCursor_OMPTeamsDistributeParallelForDirective = 274, + /// Only produced by `libclang` 4.0 and later. + const CXCursor_OMPTargetTeamsDirective = 275, + /// Only produced by `libclang` 4.0 and later. + const CXCursor_OMPTargetTeamsDistributeDirective = 276, + /// Only produced by `libclang` 4.0 and later. + const CXCursor_OMPTargetTeamsDistributeParallelForDirective = 277, + /// Only produced by `libclang` 4.0 and later. + const CXCursor_OMPTargetTeamsDistributeParallelForSimdDirective = 278, + /// Only producer by `libclang` 4.0 and later. + const CXCursor_OMPTargetTeamsDistributeSimdDirective = 279, + const CXCursor_TranslationUnit = 300, + const CXCursor_UnexposedAttr = 400, + const CXCursor_IBActionAttr = 401, + const CXCursor_IBOutletAttr = 402, + const CXCursor_IBOutletCollectionAttr = 403, + const CXCursor_CXXFinalAttr = 404, + const CXCursor_CXXOverrideAttr = 405, + const CXCursor_AnnotateAttr = 406, + const CXCursor_AsmLabelAttr = 407, + const CXCursor_PackedAttr = 408, + const CXCursor_PureAttr = 409, + const CXCursor_ConstAttr = 410, + const CXCursor_NoDuplicateAttr = 411, + const CXCursor_CUDAConstantAttr = 412, + const CXCursor_CUDADeviceAttr = 413, + const CXCursor_CUDAGlobalAttr = 414, + const CXCursor_CUDAHostAttr = 415, + /// Only produced by `libclang` 3.6 and later. + const CXCursor_CUDASharedAttr = 416, + /// Only produced by `libclang` 3.8 and later. + const CXCursor_VisibilityAttr = 417, + /// Only produced by `libclang` 3.8 and later. + const CXCursor_DLLExport = 418, + /// Only produced by `libclang` 3.8 and later. + const CXCursor_DLLImport = 419, + const CXCursor_PreprocessingDirective = 500, + const CXCursor_MacroDefinition = 501, + /// Duplicate of `CXCursor_MacroInstantiation`. + const CXCursor_MacroExpansion = 502, + const CXCursor_InclusionDirective = 503, + const CXCursor_ModuleImportDecl = 600, + /// Only produced by `libclang` 3.8 and later. + const CXCursor_TypeAliasTemplateDecl = 601, + /// Only produced by `libclang` 3.9 and later. + const CXCursor_StaticAssert = 602, + /// Only produced by `libclang` 4.0 and later. + const CXCursor_FriendDecl = 603, + /// Only produced by `libclang` 3.7 and later. + const CXCursor_OverloadCandidate = 700, + } +} + +cenum! { + enum CXDiagnosticSeverity { + const CXDiagnostic_Ignored = 0, + const CXDiagnostic_Note = 1, + const CXDiagnostic_Warning = 2, + const CXDiagnostic_Error = 3, + const CXDiagnostic_Fatal = 4, + } +} + +cenum! { + enum CXErrorCode { + const CXError_Success = 0, + const CXError_Failure = 1, + const CXError_Crashed = 2, + const CXError_InvalidArguments = 3, + const CXError_ASTReadError = 4, + } +} + +cenum! { + enum CXEvalResultKind { + const CXEval_UnExposed = 0, + const CXEval_Int = 1 , + const CXEval_Float = 2, + const CXEval_ObjCStrLiteral = 3, + const CXEval_StrLiteral = 4, + const CXEval_CFStr = 5, + const CXEval_Other = 6, + } +} + +cenum! { + enum CXIdxAttrKind { + const CXIdxAttr_Unexposed = 0, + const CXIdxAttr_IBAction = 1, + const CXIdxAttr_IBOutlet = 2, + const CXIdxAttr_IBOutletCollection = 3, + } +} + +cenum! { + enum CXIdxEntityCXXTemplateKind { + const CXIdxEntity_NonTemplate = 0, + const CXIdxEntity_Template = 1, + const CXIdxEntity_TemplatePartialSpecialization = 2, + const CXIdxEntity_TemplateSpecialization = 3, + } +} + +cenum! { + enum CXIdxEntityKind { + const CXIdxEntity_Unexposed = 0, + const CXIdxEntity_Typedef = 1, + const CXIdxEntity_Function = 2, + const CXIdxEntity_Variable = 3, + const CXIdxEntity_Field = 4, + const CXIdxEntity_EnumConstant = 5, + const CXIdxEntity_ObjCClass = 6, + const CXIdxEntity_ObjCProtocol = 7, + const CXIdxEntity_ObjCCategory = 8, + const CXIdxEntity_ObjCInstanceMethod = 9, + const CXIdxEntity_ObjCClassMethod = 10, + const CXIdxEntity_ObjCProperty = 11, + const CXIdxEntity_ObjCIvar = 12, + const CXIdxEntity_Enum = 13, + const CXIdxEntity_Struct = 14, + const CXIdxEntity_Union = 15, + const CXIdxEntity_CXXClass = 16, + const CXIdxEntity_CXXNamespace = 17, + const CXIdxEntity_CXXNamespaceAlias = 18, + const CXIdxEntity_CXXStaticVariable = 19, + const CXIdxEntity_CXXStaticMethod = 20, + const CXIdxEntity_CXXInstanceMethod = 21, + const CXIdxEntity_CXXConstructor = 22, + const CXIdxEntity_CXXDestructor = 23, + const CXIdxEntity_CXXConversionFunction = 24, + const CXIdxEntity_CXXTypeAlias = 25, + const CXIdxEntity_CXXInterface = 26, + } +} + +cenum! { + enum CXIdxEntityLanguage { + const CXIdxEntityLang_None = 0, + const CXIdxEntityLang_C = 1, + const CXIdxEntityLang_ObjC = 2, + const CXIdxEntityLang_CXX = 3, + } +} + +cenum! { + enum CXIdxEntityRefKind { + const CXIdxEntityRef_Direct = 1, + const CXIdxEntityRef_Implicit = 2, + } +} + +cenum! { + enum CXIdxObjCContainerKind { + const CXIdxObjCContainer_ForwardRef = 0, + const CXIdxObjCContainer_Interface = 1, + const CXIdxObjCContainer_Implementation = 2, + } +} + +cenum! { + enum CXLanguageKind { + const CXLanguage_Invalid = 0, + const CXLanguage_C = 1, + const CXLanguage_ObjC = 2, + const CXLanguage_CPlusPlus = 3, + } +} + +cenum! { + enum CXLinkageKind { + const CXLinkage_Invalid = 0, + const CXLinkage_NoLinkage = 1, + const CXLinkage_Internal = 2, + const CXLinkage_UniqueExternal = 3, + const CXLinkage_External = 4, + } +} + +cenum! { + enum CXLoadDiag_Error { + const CXLoadDiag_None = 0, + const CXLoadDiag_Unknown = 1, + const CXLoadDiag_CannotLoad = 2, + const CXLoadDiag_InvalidFile = 3, + } +} + +cenum! { + enum CXRefQualifierKind { + const CXRefQualifier_None = 0, + const CXRefQualifier_LValue = 1, + const CXRefQualifier_RValue = 2, + } +} + +cenum! { + enum CXResult { + const CXResult_Success = 0, + const CXResult_Invalid = 1, + const CXResult_VisitBreak = 2, + } +} + +cenum! { + enum CXSaveError { + const CXSaveError_None = 0, + const CXSaveError_Unknown = 1, + const CXSaveError_TranslationErrors = 2, + const CXSaveError_InvalidTU = 3, + } +} + +cenum! { + enum CXTUResourceUsageKind { + const CXTUResourceUsage_AST = 1, + const CXTUResourceUsage_Identifiers = 2, + const CXTUResourceUsage_Selectors = 3, + const CXTUResourceUsage_GlobalCompletionResults = 4, + const CXTUResourceUsage_SourceManagerContentCache = 5, + const CXTUResourceUsage_AST_SideTables = 6, + const CXTUResourceUsage_SourceManager_Membuffer_Malloc = 7, + const CXTUResourceUsage_SourceManager_Membuffer_MMap = 8, + const CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc = 9, + const CXTUResourceUsage_ExternalASTSource_Membuffer_MMap = 10, + const CXTUResourceUsage_Preprocessor = 11, + const CXTUResourceUsage_PreprocessingRecord = 12, + const CXTUResourceUsage_SourceManager_DataStructures = 13, + const CXTUResourceUsage_Preprocessor_HeaderSearch = 14, + } +} + +cenum! { + #[cfg(feature="gte_clang_3_6")] + enum CXTemplateArgumentKind { + const CXTemplateArgumentKind_Null = 0, + const CXTemplateArgumentKind_Type = 1, + const CXTemplateArgumentKind_Declaration = 2, + const CXTemplateArgumentKind_NullPtr = 3, + const CXTemplateArgumentKind_Integral = 4, + const CXTemplateArgumentKind_Template = 5, + const CXTemplateArgumentKind_TemplateExpansion = 6, + const CXTemplateArgumentKind_Expression = 7, + const CXTemplateArgumentKind_Pack = 8, + const CXTemplateArgumentKind_Invalid = 9, + } +} + +cenum! { + enum CXTokenKind { + const CXToken_Punctuation = 0, + const CXToken_Keyword = 1, + const CXToken_Identifier = 2, + const CXToken_Literal = 3, + const CXToken_Comment = 4, + } +} + +cenum! { + enum CXTypeKind { + const CXType_Invalid = 0, + const CXType_Unexposed = 1, + const CXType_Void = 2, + const CXType_Bool = 3, + const CXType_Char_U = 4, + const CXType_UChar = 5, + const CXType_Char16 = 6, + const CXType_Char32 = 7, + const CXType_UShort = 8, + const CXType_UInt = 9, + const CXType_ULong = 10, + const CXType_ULongLong = 11, + const CXType_UInt128 = 12, + const CXType_Char_S = 13, + const CXType_SChar = 14, + const CXType_WChar = 15, + const CXType_Short = 16, + const CXType_Int = 17, + const CXType_Long = 18, + const CXType_LongLong = 19, + const CXType_Int128 = 20, + const CXType_Float = 21, + const CXType_Double = 22, + const CXType_LongDouble = 23, + const CXType_NullPtr = 24, + const CXType_Overload = 25, + const CXType_Dependent = 26, + const CXType_ObjCId = 27, + const CXType_ObjCClass = 28, + const CXType_ObjCSel = 29, + /// Only produced by `libclang` 3.9 and later. + const CXType_Float128 = 30, + const CXType_Complex = 100, + const CXType_Pointer = 101, + const CXType_BlockPointer = 102, + const CXType_LValueReference = 103, + const CXType_RValueReference = 104, + const CXType_Record = 105, + const CXType_Enum = 106, + const CXType_Typedef = 107, + const CXType_ObjCInterface = 108, + const CXType_ObjCObjectPointer = 109, + const CXType_FunctionNoProto = 110, + const CXType_FunctionProto = 111, + const CXType_ConstantArray = 112, + const CXType_Vector = 113, + const CXType_IncompleteArray = 114, + const CXType_VariableArray = 115, + const CXType_DependentSizedArray = 116, + const CXType_MemberPointer = 117, + /// Only produced by `libclang` 3.8 and later. + const CXType_Auto = 118, + /// Only produced by `libclang` 3.9 and later. + const CXType_Elaborated = 119, + } +} + +cenum! { + enum CXTypeLayoutError { + const CXTypeLayoutError_Invalid = -1, + const CXTypeLayoutError_Incomplete = -2, + const CXTypeLayoutError_Dependent = -3, + const CXTypeLayoutError_NotConstantSize = -4, + const CXTypeLayoutError_InvalidFieldName = -5, + } +} + +cenum! { + #[cfg(feature="gte_clang_3_8")] + enum CXVisibilityKind { + const CXVisibility_Invalid = 0, + const CXVisibility_Hidden = 1, + const CXVisibility_Protected = 2, + const CXVisibility_Default = 3, + } +} + +cenum! { + enum CXVisitorResult { + const CXVisit_Break = 0, + const CXVisit_Continue = 1, + } +} + +cenum! { + enum CX_CXXAccessSpecifier { + const CX_CXXInvalidAccessSpecifier = 0, + const CX_CXXPublic = 1, + const CX_CXXProtected = 2, + const CX_CXXPrivate = 3, + } +} + +cenum! { + #[cfg(feature="gte_clang_3_6")] + enum CX_StorageClass { + const CX_SC_Invalid = 0, + const CX_SC_None = 1, + const CX_SC_Extern = 2, + const CX_SC_Static = 3, + const CX_SC_PrivateExtern = 4, + const CX_SC_OpenCLWorkGroupLocal = 5, + const CX_SC_Auto = 6, + const CX_SC_Register = 7, + } +} + +//================================================ +// Flags +//================================================ + +bitflags! { + #[repr(C)] + pub flags CXCodeComplete_Flags: c_uint { + const CXCodeComplete_IncludeMacros = 1, + const CXCodeComplete_IncludeCodePatterns = 2, + const CXCodeComplete_IncludeBriefComments = 4, + } +} + +bitflags! { + #[repr(C)] + pub flags CXCompletionContext: c_uint { + const CXCompletionContext_Unexposed = 0, + const CXCompletionContext_AnyType = 1, + const CXCompletionContext_AnyValue = 2, + const CXCompletionContext_ObjCObjectValue = 4, + const CXCompletionContext_ObjCSelectorValue = 8, + const CXCompletionContext_CXXClassTypeValue = 16, + const CXCompletionContext_DotMemberAccess = 32, + const CXCompletionContext_ArrowMemberAccess = 64, + const CXCompletionContext_ObjCPropertyAccess = 128, + const CXCompletionContext_EnumTag = 256, + const CXCompletionContext_UnionTag = 512, + const CXCompletionContext_StructTag = 1024, + const CXCompletionContext_ClassTag = 2048, + const CXCompletionContext_Namespace = 4096, + const CXCompletionContext_NestedNameSpecifier = 8192, + const CXCompletionContext_ObjCInterface = 16384, + const CXCompletionContext_ObjCProtocol = 32768, + const CXCompletionContext_ObjCCategory = 65536, + const CXCompletionContext_ObjCInstanceMessage = 131072, + const CXCompletionContext_ObjCClassMessage = 262144, + const CXCompletionContext_ObjCSelectorName = 524288, + const CXCompletionContext_MacroName = 1048576, + const CXCompletionContext_NaturalLanguage = 2097152, + const CXCompletionContext_Unknown = 4194303, + } +} + +bitflags! { + #[repr(C)] + pub flags CXDiagnosticDisplayOptions: c_uint { + const CXDiagnostic_DisplaySourceLocation = 1, + const CXDiagnostic_DisplayColumn = 2, + const CXDiagnostic_DisplaySourceRanges = 4, + const CXDiagnostic_DisplayOption = 8, + const CXDiagnostic_DisplayCategoryId = 16, + const CXDiagnostic_DisplayCategoryName = 32, + } +} + +bitflags! { + #[repr(C)] + pub flags CXGlobalOptFlags: c_uint { + const CXGlobalOpt_None = 0, + const CXGlobalOpt_ThreadBackgroundPriorityForIndexing = 1, + const CXGlobalOpt_ThreadBackgroundPriorityForEditing = 2, + const CXGlobalOpt_ThreadBackgroundPriorityForAll = 3, + } +} + +bitflags! { + #[repr(C)] + pub flags CXIdxDeclInfoFlags: c_uint { + const CXIdxDeclFlag_Skipped = 1, + } +} + +bitflags! { + #[repr(C)] + pub flags CXIndexOptFlags: c_uint { + const CXIndexOptNone = 0, + const CXIndexOptSuppressRedundantRefs = 1, + const CXIndexOptIndexFunctionLocalSymbols = 2, + const CXIndexOptIndexImplicitTemplateInstantiations = 4, + const CXIndexOptSuppressWarnings = 8, + const CXIndexOptSkipParsedBodiesInSession = 16, + } +} + +bitflags! { + #[repr(C)] + pub flags CXNameRefFlags: c_uint { + const CXNameRange_WantQualifier = 1, + const CXNameRange_WantTemplateArgs = 2, + const CXNameRange_WantSinglePiece = 4 + } +} + +bitflags! { + #[repr(C)] + pub flags CXObjCDeclQualifierKind: c_uint { + const CXObjCDeclQualifier_None = 0, + const CXObjCDeclQualifier_In = 1, + const CXObjCDeclQualifier_Inout = 2, + const CXObjCDeclQualifier_Out = 4, + const CXObjCDeclQualifier_Bycopy = 8, + const CXObjCDeclQualifier_Byref = 16, + const CXObjCDeclQualifier_Oneway = 32, + } +} + +bitflags! { + #[repr(C)] + pub flags CXObjCPropertyAttrKind: c_uint { + const CXObjCPropertyAttr_noattr = 0, + const CXObjCPropertyAttr_readonly = 1, + const CXObjCPropertyAttr_getter = 2, + const CXObjCPropertyAttr_assign = 4, + const CXObjCPropertyAttr_readwrite = 8, + const CXObjCPropertyAttr_retain = 16, + const CXObjCPropertyAttr_copy = 32, + const CXObjCPropertyAttr_nonatomic = 64, + const CXObjCPropertyAttr_setter = 128, + const CXObjCPropertyAttr_atomic = 256, + const CXObjCPropertyAttr_weak = 512, + const CXObjCPropertyAttr_strong = 1024, + const CXObjCPropertyAttr_unsafe_unretained = 2048, + #[cfg(feature="gte_clang_3_9")] + const CXObjCPropertyAttr_class = 4096, + } +} + +bitflags! { + #[repr(C)] + pub flags CXReparse_Flags: c_uint { + const CXReparse_None = 0, + } +} + +bitflags! { + #[repr(C)] + pub flags CXSaveTranslationUnit_Flags: c_uint { + const CXSaveTranslationUnit_None = 0, + } +} + +bitflags! { + #[repr(C)] + pub flags CXTranslationUnit_Flags: c_uint { + const CXTranslationUnit_None = 0, + const CXTranslationUnit_DetailedPreprocessingRecord = 1, + const CXTranslationUnit_Incomplete = 2, + const CXTranslationUnit_PrecompiledPreamble = 4, + const CXTranslationUnit_CacheCompletionResults = 8, + const CXTranslationUnit_ForSerialization = 16, + const CXTranslationUnit_CXXChainedPCH = 32, + const CXTranslationUnit_SkipFunctionBodies = 64, + const CXTranslationUnit_IncludeBriefCommentsInCodeCompletion = 128, + #[cfg(feature="gte_clang_3_8")] + const CXTranslationUnit_CreatePreambleOnFirstParse = 256, + #[cfg(feature="gte_clang_3_9")] + const CXTranslationUnit_KeepGoing = 512, + } +} + +//================================================ +// Structs +//================================================ + +// Opaque ________________________________________ + +macro_rules! opaque { ($name:ident) => (pub type $name = *mut c_void;); } + +opaque!(CXCompilationDatabase); +opaque!(CXCompileCommand); +opaque!(CXCompileCommands); +opaque!(CXCompletionString); +opaque!(CXCursorSet); +opaque!(CXDiagnostic); +opaque!(CXDiagnosticSet); +#[cfg(feature="gte_clang_3_9")] +opaque!(CXEvalResult); +opaque!(CXFile); +opaque!(CXIdxClientASTFile); +opaque!(CXIdxClientContainer); +opaque!(CXIdxClientEntity); +opaque!(CXIdxClientFile); +opaque!(CXIndex); +opaque!(CXIndexAction); +opaque!(CXModule); +opaque!(CXRemapping); +opaque!(CXTranslationUnit); + +// Transparent ___________________________________ + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXCodeCompleteResults { + pub Results: *mut CXCompletionResult, + pub NumResults: c_uint, +} + +default!(CXCodeCompleteResults); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXComment { + pub ASTNode: *const c_void, + pub TranslationUnit: CXTranslationUnit, +} + +default!(CXComment); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXCompletionResult { + pub CursorKind: CXCursorKind, + pub CompletionString: CXCompletionString, +} + +default!(CXCompletionResult); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXCursor { + pub kind: CXCursorKind, + pub xdata: c_int, + pub data: [*const c_void; 3], +} + +default!(CXCursor); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXCursorAndRangeVisitor { + pub context: *mut c_void, + pub visit: extern fn(*mut c_void, CXCursor, CXSourceRange) -> CXVisitorResult, +} + +default!(CXCursorAndRangeVisitor); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXFileUniqueID { + pub data: [c_ulonglong; 3], +} + +default!(CXFileUniqueID); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxAttrInfo { + pub kind: CXIdxAttrKind, + pub cursor: CXCursor, + pub loc: CXIdxLoc, +} + +default!(CXIdxAttrInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxBaseClassInfo { + pub base: *const CXIdxEntityInfo, + pub cursor: CXCursor, + pub loc: CXIdxLoc, +} + +default!(CXIdxBaseClassInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxCXXClassDeclInfo { + pub declInfo: *const CXIdxDeclInfo, + pub bases: *const *const CXIdxBaseClassInfo, + pub numBases: c_uint, +} + +default!(CXIdxCXXClassDeclInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxContainerInfo { + pub cursor: CXCursor, +} + +default!(CXIdxContainerInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxDeclInfo { + pub entityInfo: *const CXIdxEntityInfo, + pub cursor: CXCursor, + pub loc: CXIdxLoc, + pub semanticContainer: *const CXIdxContainerInfo, + pub lexicalContainer: *const CXIdxContainerInfo, + pub isRedeclaration: c_int, + pub isDefinition: c_int, + pub isContainer: c_int, + pub declAsContainer: *const CXIdxContainerInfo, + pub isImplicit: c_int, + pub attributes: *const *const CXIdxAttrInfo, + pub numAttributes: c_uint, + pub flags: c_uint, +} + +default!(CXIdxDeclInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxEntityInfo { + pub kind: CXIdxEntityKind, + pub templateKind: CXIdxEntityCXXTemplateKind, + pub lang: CXIdxEntityLanguage, + pub name: *const c_char, + pub USR: *const c_char, + pub cursor: CXCursor, + pub attributes: *const *const CXIdxAttrInfo, + pub numAttributes: c_uint, +} + +default!(CXIdxEntityInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxEntityRefInfo { + pub kind: CXIdxEntityRefKind, + pub cursor: CXCursor, + pub loc: CXIdxLoc, + pub referencedEntity: *const CXIdxEntityInfo, + pub parentEntity: *const CXIdxEntityInfo, + pub container: *const CXIdxContainerInfo, +} + +default!(CXIdxEntityRefInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxIBOutletCollectionAttrInfo { + pub attrInfo: *const CXIdxAttrInfo, + pub objcClass: *const CXIdxEntityInfo, + pub classCursor: CXCursor, + pub classLoc: CXIdxLoc, +} + +default!(CXIdxIBOutletCollectionAttrInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxImportedASTFileInfo { + pub file: CXFile, + pub module: CXModule, + pub loc: CXIdxLoc, + pub isImplicit: c_int, +} + +default!(CXIdxImportedASTFileInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxIncludedFileInfo { + pub hashLoc: CXIdxLoc, + pub filename: *const c_char, + pub file: CXFile, + pub isImport: c_int, + pub isAngled: c_int, + pub isModuleImport: c_int, +} + +default!(CXIdxIncludedFileInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxLoc { + pub ptr_data: [*mut c_void; 2], + pub int_data: c_uint, +} + +default!(CXIdxLoc); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxObjCCategoryDeclInfo { + pub containerInfo: *const CXIdxObjCContainerDeclInfo, + pub objcClass: *const CXIdxEntityInfo, + pub classCursor: CXCursor, + pub classLoc: CXIdxLoc, + pub protocols: *const CXIdxObjCProtocolRefListInfo, +} + +default!(CXIdxObjCCategoryDeclInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxObjCContainerDeclInfo { + pub declInfo: *const CXIdxDeclInfo, + pub kind: CXIdxObjCContainerKind, +} + +default!(CXIdxObjCContainerDeclInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxObjCInterfaceDeclInfo { + pub containerInfo: *const CXIdxObjCContainerDeclInfo, + pub superInfo: *const CXIdxBaseClassInfo, + pub protocols: *const CXIdxObjCProtocolRefListInfo, +} + +default!(CXIdxObjCInterfaceDeclInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxObjCPropertyDeclInfo { + pub declInfo: *const CXIdxDeclInfo, + pub getter: *const CXIdxEntityInfo, + pub setter: *const CXIdxEntityInfo, +} + +default!(CXIdxObjCPropertyDeclInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxObjCProtocolRefInfo { + pub protocol: *const CXIdxEntityInfo, + pub cursor: CXCursor, + pub loc: CXIdxLoc, +} + +default!(CXIdxObjCProtocolRefInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXIdxObjCProtocolRefListInfo { + pub protocols: *const *const CXIdxObjCProtocolRefInfo, + pub numProtocols: c_uint, +} + +default!(CXIdxObjCProtocolRefListInfo); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXPlatformAvailability { + pub Platform: CXString, + pub Introduced: CXVersion, + pub Deprecated: CXVersion, + pub Obsoleted: CXVersion, + pub Unavailable: c_int, + pub Message: CXString, +} + +default!(CXPlatformAvailability); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXSourceLocation { + pub ptr_data: [*const c_void; 2], + pub int_data: c_uint, +} + +default!(CXSourceLocation); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXSourceRange { + pub ptr_data: [*const c_void; 2], + pub begin_int_data: c_uint, + pub end_int_data: c_uint, +} + +default!(CXSourceRange); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXSourceRangeList { + pub count: c_uint, + pub ranges: *mut CXSourceRange, +} + +default!(CXSourceRangeList); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXString { + pub data: *const c_void, + pub private_flags: c_uint, +} + +default!(CXString); + +#[cfg(feature="gte_clang_3_8")] +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXStringSet { + pub Strings: *mut CXString, + pub Count: c_uint, +} + +default!(#[cfg(feature="gte_clang_3_8")] CXStringSet); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXTUResourceUsage { + pub data: *mut c_void, + pub numEntries: c_uint, + pub entries: *mut CXTUResourceUsageEntry, +} + +default!(CXTUResourceUsage); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXTUResourceUsageEntry { + pub kind: CXTUResourceUsageKind, + pub amount: c_ulong, +} + +default!(CXTUResourceUsageEntry); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXToken { + pub int_data: [c_uint; 4], + pub ptr_data: *mut c_void, +} + +default!(CXToken); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXType { + pub kind: CXTypeKind, + pub data: [*mut c_void; 2], +} + +default!(CXType); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXUnsavedFile { + pub Filename: *const c_char, + pub Contents: *const c_char, + pub Length: c_ulong, +} + +default!(CXUnsavedFile); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct CXVersion { + pub Major: c_int, + pub Minor: c_int, + pub Subminor: c_int, +} + +default!(CXVersion); + +#[derive(Copy, Clone, Debug)] +#[repr(C)] +pub struct IndexerCallbacks { + pub abortQuery: extern fn(CXClientData, *mut c_void) -> c_int, + pub diagnostic: extern fn(CXClientData, CXDiagnosticSet, *mut c_void), + pub enteredMainFile: extern fn(CXClientData, CXFile, *mut c_void) -> CXIdxClientFile, + pub ppIncludedFile: extern fn(CXClientData, *const CXIdxIncludedFileInfo) -> CXIdxClientFile, + pub importedASTFile: extern fn(CXClientData, *const CXIdxImportedASTFileInfo) -> CXIdxClientASTFile, + pub startedTranslationUnit: extern fn(CXClientData, *mut c_void) -> CXIdxClientContainer, + pub indexDeclaration: extern fn(CXClientData, *const CXIdxDeclInfo), + pub indexEntityReference: extern fn(CXClientData, *const CXIdxEntityRefInfo), +} + +default!(IndexerCallbacks); + +//================================================ +// Functions +//================================================ + +link! { + pub fn clang_CXCursorSet_contains(set: CXCursorSet, cursor: CXCursor) -> c_uint; + pub fn clang_CXCursorSet_insert(set: CXCursorSet, cursor: CXCursor) -> c_uint; + pub fn clang_CXIndex_getGlobalOptions(index: CXIndex) -> CXGlobalOptFlags; + pub fn clang_CXIndex_setGlobalOptions(index: CXIndex, flags: CXGlobalOptFlags); + #[cfg(feature="gte_clang_3_9")] + pub fn clang_CXXConstructor_isConvertingConstructor(cursor: CXCursor) -> c_uint; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_CXXConstructor_isCopyConstructor(cursor: CXCursor) -> c_uint; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_CXXConstructor_isDefaultConstructor(cursor: CXCursor) -> c_uint; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_CXXConstructor_isMoveConstructor(cursor: CXCursor) -> c_uint; + #[cfg(feature="gte_clang_3_8")] + pub fn clang_CXXField_isMutable(cursor: CXCursor) -> c_uint; + pub fn clang_CXXMethod_isConst(cursor: CXCursor) -> c_uint; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_CXXMethod_isDefaulted(cursor: CXCursor) -> c_uint; + pub fn clang_CXXMethod_isPureVirtual(cursor: CXCursor) -> c_uint; + pub fn clang_CXXMethod_isStatic(cursor: CXCursor) -> c_uint; + pub fn clang_CXXMethod_isVirtual(cursor: CXCursor) -> c_uint; + pub fn clang_CompilationDatabase_dispose(database: CXCompilationDatabase); + pub fn clang_CompilationDatabase_fromDirectory(directory: *const c_char, error: *mut CXCompilationDatabase_Error) -> CXCompilationDatabase; + pub fn clang_CompilationDatabase_getAllCompileCommands(database: CXCompilationDatabase) -> CXCompileCommands; + pub fn clang_CompilationDatabase_getCompileCommands(database: CXCompilationDatabase, filename: *const c_char) -> CXCompileCommands; + pub fn clang_CompileCommand_getArg(command: CXCompileCommand, index: c_uint) -> CXString; + pub fn clang_CompileCommand_getDirectory(command: CXCompileCommand) -> CXString; + #[cfg(feature="gte_clang_3_8")] + pub fn clang_CompileCommand_getFilename(command: CXCompileCommand) -> CXString; + #[cfg(feature="gte_clang_3_8")] + pub fn clang_CompileCommand_getMappedSourceContent(command: CXCompileCommand, index: c_uint) -> CXString; + #[cfg(feature="gte_clang_3_8")] + pub fn clang_CompileCommand_getMappedSourcePath(command: CXCompileCommand, index: c_uint) -> CXString; + pub fn clang_CompileCommand_getNumArgs(command: CXCompileCommand) -> c_uint; + pub fn clang_CompileCommands_dispose(command: CXCompileCommands); + pub fn clang_CompileCommands_getCommand(command: CXCompileCommands, index: c_uint) -> CXCompileCommand; + pub fn clang_CompileCommands_getSize(command: CXCompileCommands) -> c_uint; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_Cursor_Evaluate(cursor: CXCursor) -> CXEvalResult; + pub fn clang_Cursor_getArgument(cursor: CXCursor, index: c_uint) -> CXCursor; + pub fn clang_Cursor_getBriefCommentText(cursor: CXCursor) -> CXString; + #[cfg(feature="gte_clang_3_8")] + pub fn clang_Cursor_getCXXManglings(cursor: CXCursor) -> *mut CXStringSet; + pub fn clang_Cursor_getCommentRange(cursor: CXCursor) -> CXSourceRange; + #[cfg(feature="gte_clang_3_6")] + pub fn clang_Cursor_getMangling(cursor: CXCursor) -> CXString; + pub fn clang_Cursor_getModule(cursor: CXCursor) -> CXModule; + pub fn clang_Cursor_getNumArguments(cursor: CXCursor) -> c_int; + #[cfg(feature="gte_clang_3_6")] + pub fn clang_Cursor_getNumTemplateArguments(cursor: CXCursor) -> c_int; + pub fn clang_Cursor_getObjCDeclQualifiers(cursor: CXCursor) -> CXObjCDeclQualifierKind; + pub fn clang_Cursor_getObjCPropertyAttributes(cursor: CXCursor, reserved: c_uint) -> CXObjCPropertyAttrKind; + pub fn clang_Cursor_getObjCSelectorIndex(cursor: CXCursor) -> c_int; + #[cfg(feature="gte_clang_3_7")] + pub fn clang_Cursor_getOffsetOfField(cursor: CXCursor) -> c_longlong; + pub fn clang_Cursor_getRawCommentText(cursor: CXCursor) -> CXString; + pub fn clang_Cursor_getReceiverType(cursor: CXCursor) -> CXType; + pub fn clang_Cursor_getSpellingNameRange(cursor: CXCursor, index: c_uint, reserved: c_uint) -> CXSourceRange; + #[cfg(feature="gte_clang_3_6")] + pub fn clang_Cursor_getStorageClass(cursor: CXCursor) -> CX_StorageClass; + #[cfg(feature="gte_clang_3_6")] + pub fn clang_Cursor_getTemplateArgumentKind(cursor: CXCursor, index: c_uint) -> CXTemplateArgumentKind; + #[cfg(feature="gte_clang_3_6")] + pub fn clang_Cursor_getTemplateArgumentType(cursor: CXCursor, index: c_uint) -> CXType; + #[cfg(feature="gte_clang_3_6")] + pub fn clang_Cursor_getTemplateArgumentUnsignedValue(cursor: CXCursor, index: c_uint) -> c_ulonglong; + #[cfg(feature="gte_clang_3_6")] + pub fn clang_Cursor_getTemplateArgumentValue(cursor: CXCursor, index: c_uint) -> c_longlong; + pub fn clang_Cursor_getTranslationUnit(cursor: CXCursor) -> CXTranslationUnit; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_Cursor_hasAttrs(cursor: CXCursor) -> c_uint; + #[cfg(feature="gte_clang_3_7")] + pub fn clang_Cursor_isAnonymous(cursor: CXCursor) -> c_uint; + pub fn clang_Cursor_isBitField(cursor: CXCursor) -> c_uint; + pub fn clang_Cursor_isDynamicCall(cursor: CXCursor) -> c_int; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_Cursor_isFunctionInlined(cursor: CXCursor) -> c_uint; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_Cursor_isMacroBuiltin(cursor: CXCursor) -> c_uint; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_Cursor_isMacroFunctionLike(cursor: CXCursor) -> c_uint; + pub fn clang_Cursor_isNull(cursor: CXCursor) -> c_int; + pub fn clang_Cursor_isObjCOptional(cursor: CXCursor) -> c_uint; + pub fn clang_Cursor_isVariadic(cursor: CXCursor) -> c_uint; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_EvalResult_dispose(result: CXEvalResult); + #[cfg(feature="gte_clang_3_9")] + pub fn clang_EvalResult_getAsDouble(result: CXEvalResult) -> libc::c_double; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_EvalResult_getAsInt(result: CXEvalResult) -> c_int; + #[cfg(feature="gte_clang_4_0")] + pub fn clang_EvalResult_getAsLongLong(result: CXEvalResult) -> c_longlong; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_EvalResult_getAsStr(result: CXEvalResult) -> *const c_char; + #[cfg(feature="gte_clang_4_0")] + pub fn clang_EvalResult_getAsUnsigned(result: CXEvalResult) -> c_ulonglong; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_EvalResult_getKind(result: CXEvalResult) -> CXEvalResultKind; + #[cfg(feature="gte_clang_4_0")] + pub fn clang_EvalResult_isUnsignedInt(result: CXEvalResult) -> c_uint; + #[cfg(feature="gte_clang_3_6")] + pub fn clang_File_isEqual(left: CXFile, right: CXFile) -> c_int; + pub fn clang_IndexAction_create(index: CXIndex) -> CXIndexAction; + pub fn clang_IndexAction_dispose(index: CXIndexAction); + pub fn clang_Location_isFromMainFile(location: CXSourceLocation) -> c_int; + pub fn clang_Location_isInSystemHeader(location: CXSourceLocation) -> c_int; + pub fn clang_Module_getASTFile(module: CXModule) -> CXFile; + pub fn clang_Module_getFullName(module: CXModule) -> CXString; + pub fn clang_Module_getName(module: CXModule) -> CXString; + pub fn clang_Module_getNumTopLevelHeaders(tu: CXTranslationUnit, module: CXModule) -> c_uint; + pub fn clang_Module_getParent(module: CXModule) -> CXModule; + pub fn clang_Module_getTopLevelHeader(tu: CXTranslationUnit, module: CXModule, index: c_uint) -> CXFile; + pub fn clang_Module_isSystem(module: CXModule) -> c_int; + pub fn clang_Range_isNull(range: CXSourceRange) -> c_int; + pub fn clang_Type_getAlignOf(type_: CXType) -> c_longlong; + pub fn clang_Type_getCXXRefQualifier(type_: CXType) -> CXRefQualifierKind; + pub fn clang_Type_getClassType(type_: CXType) -> CXType; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_Type_getNamedType(type_: CXType) -> CXType; + pub fn clang_Type_getNumTemplateArguments(type_: CXType) -> c_int; + #[cfg(feature="gte_clang_3_9")] + pub fn clang_Type_getObjCEncoding(type_: CXType) -> CXString; + pub fn clang_Type_getOffsetOf(type_: CXType, field: *const c_char) -> c_longlong; + pub fn clang_Type_getSizeOf(type_: CXType) -> c_longlong; + pub fn clang_Type_getTemplateArgumentAsType(type_: CXType, index: c_uint) -> CXType; + #[cfg(feature="gte_clang_3_7")] + pub fn clang_Type_visitFields(type_: CXType, visitor: CXFieldVisitor, data: CXClientData) -> CXVisitorResult; + pub fn clang_annotateTokens(tu: CXTranslationUnit, tokens: *mut CXToken, n_tokens: c_uint, cursors: *mut CXCursor); + pub fn clang_codeCompleteAt(tu: CXTranslationUnit, file: *const c_char, line: c_uint, column: c_uint, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, flags: CXCodeComplete_Flags) -> *mut CXCodeCompleteResults; + pub fn clang_codeCompleteGetContainerKind(results: *mut CXCodeCompleteResults, incomplete: *mut c_uint) -> CXCursorKind; + pub fn clang_codeCompleteGetContainerUSR(results: *mut CXCodeCompleteResults) -> CXString; + pub fn clang_codeCompleteGetContexts(results: *mut CXCodeCompleteResults) -> c_ulonglong; + pub fn clang_codeCompleteGetDiagnostic(results: *mut CXCodeCompleteResults, index: c_uint) -> CXDiagnostic; + pub fn clang_codeCompleteGetNumDiagnostics(results: *mut CXCodeCompleteResults) -> c_uint; + pub fn clang_codeCompleteGetObjCSelector(results: *mut CXCodeCompleteResults) -> CXString; + pub fn clang_constructUSR_ObjCCategory(class: *const c_char, category: *const c_char) -> CXString; + pub fn clang_constructUSR_ObjCClass(class: *const c_char) -> CXString; + pub fn clang_constructUSR_ObjCIvar(name: *const c_char, usr: CXString) -> CXString; + pub fn clang_constructUSR_ObjCMethod(name: *const c_char, instance: c_uint, usr: CXString) -> CXString; + pub fn clang_constructUSR_ObjCProperty(property: *const c_char, usr: CXString) -> CXString; + pub fn clang_constructUSR_ObjCProtocol(protocol: *const c_char) -> CXString; + pub fn clang_createCXCursorSet() -> CXCursorSet; + pub fn clang_createIndex(exclude: c_int, display: c_int) -> CXIndex; + pub fn clang_createTranslationUnit(index: CXIndex, file: *const c_char) -> CXTranslationUnit; + pub fn clang_createTranslationUnit2(index: CXIndex, file: *const c_char, tu: *mut CXTranslationUnit) -> CXErrorCode; + pub fn clang_createTranslationUnitFromSourceFile(index: CXIndex, file: *const c_char, n_arguments: c_int, arguments: *const *const c_char, n_unsaved: c_uint, unsaved: *mut CXUnsavedFile) -> CXTranslationUnit; + pub fn clang_defaultCodeCompleteOptions() -> CXCodeComplete_Flags; + pub fn clang_defaultDiagnosticDisplayOptions() -> CXDiagnosticDisplayOptions; + pub fn clang_defaultEditingTranslationUnitOptions() -> CXTranslationUnit_Flags; + pub fn clang_defaultReparseOptions(tu: CXTranslationUnit) -> CXReparse_Flags; + pub fn clang_defaultSaveOptions(tu: CXTranslationUnit) -> CXSaveTranslationUnit_Flags; + pub fn clang_disposeCXCursorSet(set: CXCursorSet); + pub fn clang_disposeCXPlatformAvailability(availability: *mut CXPlatformAvailability); + pub fn clang_disposeCXTUResourceUsage(usage: CXTUResourceUsage); + pub fn clang_disposeCodeCompleteResults(results: *mut CXCodeCompleteResults); + pub fn clang_disposeDiagnostic(diagnostic: CXDiagnostic); + pub fn clang_disposeDiagnosticSet(diagnostic: CXDiagnosticSet); + pub fn clang_disposeIndex(index: CXIndex); + pub fn clang_disposeOverriddenCursors(cursors: *mut CXCursor); + pub fn clang_disposeSourceRangeList(list: *mut CXSourceRangeList); + pub fn clang_disposeString(string: CXString); + #[cfg(feature="gte_clang_3_8")] + pub fn clang_disposeStringSet(set: *mut CXStringSet); + pub fn clang_disposeTokens(tu: CXTranslationUnit, tokens: *mut CXToken, n_tokens: c_uint); + pub fn clang_disposeTranslationUnit(tu: CXTranslationUnit); + pub fn clang_enableStackTraces(); + pub fn clang_equalCursors(left: CXCursor, right: CXCursor) -> c_uint; + pub fn clang_equalLocations(left: CXSourceLocation, right: CXSourceLocation) -> c_uint; + pub fn clang_equalRanges(left: CXSourceRange, right: CXSourceRange) -> c_uint; + pub fn clang_equalTypes(left: CXType, right: CXType) -> c_uint; + pub fn clang_executeOnThread(function: extern fn(*mut c_void), data: *mut c_void, stack: c_uint); + pub fn clang_findIncludesInFile(tu: CXTranslationUnit, file: CXFile, cursor: CXCursorAndRangeVisitor) -> CXResult; + pub fn clang_findReferencesInFile(cursor: CXCursor, file: CXFile, visitor: CXCursorAndRangeVisitor) -> CXResult; + pub fn clang_formatDiagnostic(diagnostic: CXDiagnostic, flags: CXDiagnosticDisplayOptions) -> CXString; + #[cfg(feature="gte_clang_3_7")] + pub fn clang_free(buffer: *mut c_void); + #[cfg(feature="gte_clang_4_0")] + pub fn clang_getAllSkippedRanges(tu: CXTranslationUnit) -> *mut CXSourceRangeList; + pub fn clang_getArgType(type_: CXType, index: c_uint) -> CXType; + pub fn clang_getArrayElementType(type_: CXType) -> CXType; + pub fn clang_getArraySize(type_: CXType) -> c_longlong; + pub fn clang_getCString(string: CXString) -> *const c_char; + pub fn clang_getCXTUResourceUsage(tu: CXTranslationUnit) -> CXTUResourceUsage; + pub fn clang_getCXXAccessSpecifier(cursor: CXCursor) -> CX_CXXAccessSpecifier; + pub fn clang_getCanonicalCursor(cursor: CXCursor) -> CXCursor; + pub fn clang_getCanonicalType(type_: CXType) -> CXType; + pub fn clang_getChildDiagnostics(diagnostic: CXDiagnostic) -> CXDiagnosticSet; + pub fn clang_getClangVersion() -> CXString; + pub fn clang_getCompletionAnnotation(string: CXCompletionString, index: c_uint) -> CXString; + pub fn clang_getCompletionAvailability(string: CXCompletionString) -> CXAvailabilityKind; + pub fn clang_getCompletionBriefComment(string: CXCompletionString) -> CXString; + pub fn clang_getCompletionChunkCompletionString(string: CXCompletionString, index: c_uint) -> CXCompletionString; + pub fn clang_getCompletionChunkKind(string: CXCompletionString, index: c_uint) -> CXCompletionChunkKind; + pub fn clang_getCompletionChunkText(string: CXCompletionString, index: c_uint) -> CXString; + pub fn clang_getCompletionNumAnnotations(string: CXCompletionString) -> c_uint; + pub fn clang_getCompletionParent(string: CXCompletionString, kind: *mut CXCursorKind) -> CXString; + pub fn clang_getCompletionPriority(string: CXCompletionString) -> c_uint; + pub fn clang_getCursor(tu: CXTranslationUnit, location: CXSourceLocation) -> CXCursor; + pub fn clang_getCursorAvailability(cursor: CXCursor) -> CXAvailabilityKind; + pub fn clang_getCursorCompletionString(cursor: CXCursor) -> CXCompletionString; + pub fn clang_getCursorDefinition(cursor: CXCursor) -> CXCursor; + pub fn clang_getCursorDisplayName(cursor: CXCursor) -> CXString; + pub fn clang_getCursorExtent(cursor: CXCursor) -> CXSourceRange; + pub fn clang_getCursorKind(cursor: CXCursor) -> CXCursorKind; + pub fn clang_getCursorKindSpelling(kind: CXCursorKind) -> CXString; + pub fn clang_getCursorLanguage(cursor: CXCursor) -> CXLanguageKind; + pub fn clang_getCursorLexicalParent(cursor: CXCursor) -> CXCursor; + pub fn clang_getCursorLinkage(cursor: CXCursor) -> CXLinkageKind; + pub fn clang_getCursorLocation(cursor: CXCursor) -> CXSourceLocation; + pub fn clang_getCursorPlatformAvailability(cursor: CXCursor, deprecated: *mut c_int, deprecated_message: *mut CXString, unavailable: *mut c_int, unavailable_message: *mut CXString, availability: *mut CXPlatformAvailability, n_availability: c_int) -> c_int; + pub fn clang_getCursorReferenceNameRange(cursor: CXCursor, flags: CXNameRefFlags, index: c_uint) -> CXSourceRange; + pub fn clang_getCursorReferenced(cursor: CXCursor) -> CXCursor; + pub fn clang_getCursorResultType(cursor: CXCursor) -> CXType; + pub fn clang_getCursorSemanticParent(cursor: CXCursor) -> CXCursor; + pub fn clang_getCursorSpelling(cursor: CXCursor) -> CXString; + pub fn clang_getCursorType(cursor: CXCursor) -> CXType; + pub fn clang_getCursorUSR(cursor: CXCursor) -> CXString; + #[cfg(feature="gte_clang_3_8")] + pub fn clang_getCursorVisibility(cursor: CXCursor) -> CXVisibilityKind; + pub fn clang_getDeclObjCTypeEncoding(cursor: CXCursor) -> CXString; + pub fn clang_getDefinitionSpellingAndExtent(cursor: CXCursor, start: *mut *const c_char, end: *mut *const c_char, start_line: *mut c_uint, start_column: *mut c_uint, end_line: *mut c_uint, end_column: *mut c_uint); + pub fn clang_getDiagnostic(tu: CXTranslationUnit, index: c_uint) -> CXDiagnostic; + pub fn clang_getDiagnosticCategory(diagnostic: CXDiagnostic) -> c_uint; + pub fn clang_getDiagnosticCategoryName(category: c_uint) -> CXString; + pub fn clang_getDiagnosticCategoryText(diagnostic: CXDiagnostic) -> CXString; + pub fn clang_getDiagnosticFixIt(diagnostic: CXDiagnostic, index: c_uint, range: *mut CXSourceRange) -> CXString; + pub fn clang_getDiagnosticInSet(diagnostic: CXDiagnosticSet, index: c_uint) -> CXDiagnostic; + pub fn clang_getDiagnosticLocation(diagnostic: CXDiagnostic) -> CXSourceLocation; + pub fn clang_getDiagnosticNumFixIts(diagnostic: CXDiagnostic) -> c_uint; + pub fn clang_getDiagnosticNumRanges(diagnostic: CXDiagnostic) -> c_uint; + pub fn clang_getDiagnosticOption(diagnostic: CXDiagnostic, option: *mut CXString) -> CXString; + pub fn clang_getDiagnosticRange(diagnostic: CXDiagnostic, index: c_uint) -> CXSourceRange; + pub fn clang_getDiagnosticSetFromTU(tu: CXTranslationUnit) -> CXDiagnosticSet; + pub fn clang_getDiagnosticSeverity(diagnostic: CXDiagnostic) -> CXDiagnosticSeverity; + pub fn clang_getDiagnosticSpelling(diagnostic: CXDiagnostic) -> CXString; + pub fn clang_getElementType(type_: CXType) -> CXType; + pub fn clang_getEnumConstantDeclUnsignedValue(cursor: CXCursor) -> c_ulonglong; + pub fn clang_getEnumConstantDeclValue(cursor: CXCursor) -> c_longlong; + pub fn clang_getEnumDeclIntegerType(cursor: CXCursor) -> CXType; + pub fn clang_getExpansionLocation(location: CXSourceLocation, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint); + pub fn clang_getFieldDeclBitWidth(cursor: CXCursor) -> c_int; + pub fn clang_getFile(tu: CXTranslationUnit, file: *const c_char) -> CXFile; + pub fn clang_getFileLocation(location: CXSourceLocation, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint); + pub fn clang_getFileName(file: CXFile) -> CXString; + pub fn clang_getFileTime(file: CXFile) -> time_t; + pub fn clang_getFileUniqueID(file: CXFile, id: *mut CXFileUniqueID) -> c_int; + pub fn clang_getFunctionTypeCallingConv(type_: CXType) -> CXCallingConv; + pub fn clang_getIBOutletCollectionType(cursor: CXCursor) -> CXType; + pub fn clang_getIncludedFile(cursor: CXCursor) -> CXFile; + pub fn clang_getInclusions(tu: CXTranslationUnit, visitor: CXInclusionVisitor, data: CXClientData); + pub fn clang_getInstantiationLocation(location: CXSourceLocation, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint); + pub fn clang_getLocation(tu: CXTranslationUnit, file: CXFile, line: c_uint, column: c_uint) -> CXSourceLocation; + pub fn clang_getLocationForOffset(tu: CXTranslationUnit, file: CXFile, offset: c_uint) -> CXSourceLocation; + pub fn clang_getModuleForFile(tu: CXTranslationUnit, file: CXFile) -> CXModule; + pub fn clang_getNullCursor() -> CXCursor; + pub fn clang_getNullLocation() -> CXSourceLocation; + pub fn clang_getNullRange() -> CXSourceRange; + pub fn clang_getNumArgTypes(type_: CXType) -> c_int; + pub fn clang_getNumCompletionChunks(string: CXCompletionString) -> c_uint; + pub fn clang_getNumDiagnostics(tu: CXTranslationUnit) -> c_uint; + pub fn clang_getNumDiagnosticsInSet(diagnostic: CXDiagnosticSet) -> c_uint; + pub fn clang_getNumElements(type_: CXType) -> c_longlong; + pub fn clang_getNumOverloadedDecls(cursor: CXCursor) -> c_uint; + pub fn clang_getOverloadedDecl(cursor: CXCursor, index: c_uint) -> CXCursor; + pub fn clang_getOverriddenCursors(cursor: CXCursor, cursors: *mut *mut CXCursor, n_cursors: *mut c_uint); + pub fn clang_getPointeeType(type_: CXType) -> CXType; + pub fn clang_getPresumedLocation(location: CXSourceLocation, file: *mut CXString, line: *mut c_uint, column: *mut c_uint); + pub fn clang_getRange(start: CXSourceLocation, end: CXSourceLocation) -> CXSourceRange; + pub fn clang_getRangeEnd(range: CXSourceRange) -> CXSourceLocation; + pub fn clang_getRangeStart(range: CXSourceRange) -> CXSourceLocation; + pub fn clang_getRemappings(file: *const c_char) -> CXRemapping; + pub fn clang_getRemappingsFromFileList(files: *mut *const c_char, n_files: c_uint) -> CXRemapping; + pub fn clang_getResultType(type_: CXType) -> CXType; + pub fn clang_getSkippedRanges(tu: CXTranslationUnit, file: CXFile) -> *mut CXSourceRangeList; + pub fn clang_getSpecializedCursorTemplate(cursor: CXCursor) -> CXCursor; + pub fn clang_getSpellingLocation(location: CXSourceLocation, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint); + pub fn clang_getTUResourceUsageName(kind: CXTUResourceUsageKind) -> *const c_char; + pub fn clang_getTemplateCursorKind(cursor: CXCursor) -> CXCursorKind; + pub fn clang_getTokenExtent(tu: CXTranslationUnit, token: CXToken) -> CXSourceRange; + pub fn clang_getTokenKind(token: CXToken) -> CXTokenKind; + pub fn clang_getTokenLocation(tu: CXTranslationUnit, token: CXToken) -> CXSourceLocation; + pub fn clang_getTokenSpelling(tu: CXTranslationUnit, token: CXToken) -> CXString; + pub fn clang_getTranslationUnitCursor(tu: CXTranslationUnit) -> CXCursor; + pub fn clang_getTranslationUnitSpelling(tu: CXTranslationUnit) -> CXString; + pub fn clang_getTypeDeclaration(type_: CXType) -> CXCursor; + pub fn clang_getTypeKindSpelling(type_: CXTypeKind) -> CXString; + pub fn clang_getTypeSpelling(type_: CXType) -> CXString; + pub fn clang_getTypedefDeclUnderlyingType(cursor: CXCursor) -> CXType; + pub fn clang_hashCursor(cursor: CXCursor) -> c_uint; + pub fn clang_indexLoc_getCXSourceLocation(location: CXIdxLoc) -> CXSourceLocation; + pub fn clang_indexLoc_getFileLocation(location: CXIdxLoc, index_file: *mut CXIdxClientFile, file: *mut CXFile, line: *mut c_uint, column: *mut c_uint, offset: *mut c_uint); + pub fn clang_indexSourceFile(index: CXIndexAction, data: CXClientData, callbacks: *mut IndexerCallbacks, n_callbacks: c_uint, index_flags: CXIndexOptFlags, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, tu: *mut CXTranslationUnit, tu_flags: CXTranslationUnit_Flags) -> CXErrorCode; + #[cfg(feature="gte_clang_3_8")] + pub fn clang_indexSourceFileFullArgv(index: CXIndexAction, data: CXClientData, callbacks: *mut IndexerCallbacks, n_callbacks: c_uint, index_flags: CXIndexOptFlags, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, tu: *mut CXTranslationUnit, tu_flags: CXTranslationUnit_Flags) -> CXErrorCode; + pub fn clang_indexTranslationUnit(index: CXIndexAction, data: CXClientData, callbacks: *mut IndexerCallbacks, n_callbacks: c_uint, flags: CXIndexOptFlags, tu: CXTranslationUnit) -> c_int; + pub fn clang_index_getCXXClassDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxCXXClassDeclInfo; + pub fn clang_index_getClientContainer(info: *const CXIdxContainerInfo) -> CXIdxClientContainer; + pub fn clang_index_getClientEntity(info: *const CXIdxEntityInfo) -> CXIdxClientEntity; + pub fn clang_index_getIBOutletCollectionAttrInfo(info: *const CXIdxAttrInfo) -> *const CXIdxIBOutletCollectionAttrInfo; + pub fn clang_index_getObjCCategoryDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCCategoryDeclInfo; + pub fn clang_index_getObjCContainerDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCContainerDeclInfo; + pub fn clang_index_getObjCInterfaceDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCInterfaceDeclInfo; + pub fn clang_index_getObjCPropertyDeclInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCPropertyDeclInfo; + pub fn clang_index_getObjCProtocolRefListInfo(info: *const CXIdxDeclInfo) -> *const CXIdxObjCProtocolRefListInfo; + pub fn clang_index_isEntityObjCContainerKind(info: CXIdxEntityKind) -> c_int; + pub fn clang_index_setClientContainer(info: *const CXIdxContainerInfo, container: CXIdxClientContainer); + pub fn clang_index_setClientEntity(info: *const CXIdxEntityInfo, entity: CXIdxClientEntity); + pub fn clang_isAttribute(kind: CXCursorKind) -> c_uint; + pub fn clang_isConstQualifiedType(type_: CXType) -> c_uint; + pub fn clang_isCursorDefinition(cursor: CXCursor) -> c_uint; + pub fn clang_isDeclaration(kind: CXCursorKind) -> c_uint; + pub fn clang_isExpression(kind: CXCursorKind) -> c_uint; + pub fn clang_isFileMultipleIncludeGuarded(tu: CXTranslationUnit, file: CXFile) -> c_uint; + pub fn clang_isFunctionTypeVariadic(type_: CXType) -> c_uint; + pub fn clang_isInvalid(kind: CXCursorKind) -> c_uint; + pub fn clang_isPODType(type_: CXType) -> c_uint; + pub fn clang_isPreprocessing(kind: CXCursorKind) -> c_uint; + pub fn clang_isReference(kind: CXCursorKind) -> c_uint; + pub fn clang_isRestrictQualifiedType(type_: CXType) -> c_uint; + pub fn clang_isStatement(kind: CXCursorKind) -> c_uint; + pub fn clang_isTranslationUnit(kind: CXCursorKind) -> c_uint; + pub fn clang_isUnexposed(kind: CXCursorKind) -> c_uint; + pub fn clang_isVirtualBase(cursor: CXCursor) -> c_uint; + pub fn clang_isVolatileQualifiedType(type_: CXType) -> c_uint; + pub fn clang_loadDiagnostics(file: *const c_char, error: *mut CXLoadDiag_Error, message: *mut CXString) -> CXDiagnosticSet; + pub fn clang_parseTranslationUnit(index: CXIndex, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, flags: CXTranslationUnit_Flags) -> CXTranslationUnit; + pub fn clang_parseTranslationUnit2(index: CXIndex, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, flags: CXTranslationUnit_Flags, tu: *mut CXTranslationUnit) -> CXErrorCode; + #[cfg(feature="gte_clang_3_8")] + pub fn clang_parseTranslationUnit2FullArgv(index: CXIndex, file: *const c_char, arguments: *const *const c_char, n_arguments: c_int, unsaved: *mut CXUnsavedFile, n_unsaved: c_uint, flags: CXTranslationUnit_Flags, tu: *mut CXTranslationUnit) -> CXErrorCode; + pub fn clang_remap_dispose(remapping: CXRemapping); + pub fn clang_remap_getFilenames(remapping: CXRemapping, index: c_uint, original: *mut CXString, transformed: *mut CXString); + pub fn clang_remap_getNumFiles(remapping: CXRemapping) -> c_uint; + pub fn clang_reparseTranslationUnit(tu: CXTranslationUnit, n_unsaved: c_uint, unsaved: *mut CXUnsavedFile, flags: CXReparse_Flags) -> CXErrorCode; + pub fn clang_saveTranslationUnit(tu: CXTranslationUnit, file: *const c_char, options: CXSaveTranslationUnit_Flags) -> CXSaveError; + pub fn clang_sortCodeCompletionResults(results: *mut CXCompletionResult, n_results: c_uint); + pub fn clang_toggleCrashRecovery(recovery: c_uint); + pub fn clang_tokenize(tu: CXTranslationUnit, range: CXSourceRange, tokens: *mut *mut CXToken, n_tokens: *mut c_uint); + pub fn clang_visitChildren(cursor: CXCursor, visitor: CXCursorVisitor, data: CXClientData) -> c_uint; + + // Documentation + pub fn clang_BlockCommandComment_getArgText(comment: CXComment, index: c_uint) -> CXString; + pub fn clang_BlockCommandComment_getCommandName(comment: CXComment) -> CXString; + pub fn clang_BlockCommandComment_getNumArgs(comment: CXComment) -> c_uint; + pub fn clang_BlockCommandComment_getParagraph(comment: CXComment) -> CXComment; + pub fn clang_Comment_getChild(comment: CXComment, index: c_uint) -> CXComment; + pub fn clang_Comment_getKind(comment: CXComment) -> CXCommentKind; + pub fn clang_Comment_getNumChildren(comment: CXComment) -> c_uint; + pub fn clang_Comment_isWhitespace(comment: CXComment) -> c_uint; + pub fn clang_Cursor_getParsedComment(C: CXCursor) -> CXComment; + pub fn clang_FullComment_getAsHTML(comment: CXComment) -> CXString; + pub fn clang_FullComment_getAsXML(comment: CXComment) -> CXString; + pub fn clang_HTMLStartTagComment_isSelfClosing(comment: CXComment) -> c_uint; + pub fn clang_HTMLStartTag_getAttrName(comment: CXComment, index: c_uint) -> CXString; + pub fn clang_HTMLStartTag_getAttrValue(comment: CXComment, index: c_uint) -> CXString; + pub fn clang_HTMLStartTag_getNumAttrs(comment: CXComment) -> c_uint; + pub fn clang_HTMLTagComment_getAsString(comment: CXComment) -> CXString; + pub fn clang_HTMLTagComment_getTagName(comment: CXComment) -> CXString; + pub fn clang_InlineCommandComment_getArgText(comment: CXComment, index: c_uint) -> CXString; + pub fn clang_InlineCommandComment_getCommandName(comment: CXComment) -> CXString; + pub fn clang_InlineCommandComment_getNumArgs(comment: CXComment) -> c_uint; + pub fn clang_InlineCommandComment_getRenderKind(comment: CXComment) -> CXCommentInlineCommandRenderKind; + pub fn clang_InlineContentComment_hasTrailingNewline(comment: CXComment) -> c_uint; + pub fn clang_ParamCommandComment_getDirection(comment: CXComment) -> CXCommentParamPassDirection; + pub fn clang_ParamCommandComment_getParamIndex(comment: CXComment) -> c_uint; + pub fn clang_ParamCommandComment_getParamName(comment: CXComment) -> CXString; + pub fn clang_ParamCommandComment_isDirectionExplicit(comment: CXComment) -> c_uint; + pub fn clang_ParamCommandComment_isParamIndexValid(comment: CXComment) -> c_uint; + pub fn clang_TParamCommandComment_getDepth(comment: CXComment) -> c_uint; + pub fn clang_TParamCommandComment_getIndex(comment: CXComment, depth: c_uint) -> c_uint; + pub fn clang_TParamCommandComment_getParamName(comment: CXComment) -> CXString; + pub fn clang_TParamCommandComment_isParamPositionValid(comment: CXComment) -> c_uint; + pub fn clang_TextComment_getText(comment: CXComment) -> CXString; + pub fn clang_VerbatimBlockLineComment_getText(comment: CXComment) -> CXString; + pub fn clang_VerbatimLineComment_getText(comment: CXComment) -> CXString; +} diff --git a/third_party/rust/clang-sys/src/link.rs b/third_party/rust/clang-sys/src/link.rs index 715518267d03..e1eca4a2834d 100644 --- a/third_party/rust/clang-sys/src/link.rs +++ b/third_party/rust/clang-sys/src/link.rs @@ -1,184 +1,185 @@ -// Copyright 2016 Kyle Mayes -// -// Licensed 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. - -//================================================ -// Macros -//================================================ - -// link! _________________________________________ - -#[cfg(feature="runtime")] -macro_rules! link { - (@LOAD: #[cfg($cfg:meta)] fn $name:ident($($pname:ident: $pty:ty), *) $(-> $ret:ty)*) => ( - #[cfg($cfg)] - pub fn $name(library: &mut super::SharedLibrary) { - let symbol = unsafe { library.library.get(stringify!($name).as_bytes()) }.ok(); - library.functions.$name = symbol.map(|s| *s); - } - - #[cfg(not($cfg))] - pub fn $name(_: &mut super::SharedLibrary) {} - ); - - (@LOAD: fn $name:ident($($pname:ident: $pty:ty), *) $(-> $ret:ty)*) => ( - link!(@LOAD: #[cfg(feature="runtime")] fn $name($($pname: $pty), *) $(-> $ret)*); - ); - - ($($(#[cfg($cfg:meta)])* pub fn $name:ident($($pname:ident: $pty:ty), *) $(-> $ret:ty)*;)+) => ( - use std::cell::{RefCell}; - use std::sync::{Arc}; - - /// The set of functions loaded dynamically. - #[derive(Debug)] - pub struct Functions { - $($(#[cfg($cfg)])* pub $name: Option $ret)*>,)+ - } - - impl Default for Functions { - fn default() -> Functions { - unsafe { std::mem::zeroed() } - } - } - - /// A dynamically loaded instance of the `libclang` library. - #[derive(Debug)] - pub struct SharedLibrary { - library: libloading::Library, - pub functions: Functions, - } - - impl SharedLibrary { - //- Constructors ----------------------------- - - fn new(library: libloading::Library) -> SharedLibrary { - SharedLibrary { library: library, functions: Functions::default() } - } - } - - thread_local!(static LIBRARY: RefCell>> = RefCell::new(None)); - - /// Returns whether a `libclang` shared library is loaded on this thread. - pub fn is_loaded() -> bool { - LIBRARY.with(|l| l.borrow().is_some()) - } - - fn with_library(f: F) -> Option where F: FnOnce(&SharedLibrary) -> T { - LIBRARY.with(|l| { - match l.borrow().as_ref() { - Some(library) => Some(f(&library)), - _ => None, - } - }) - } - - $( - $(#[cfg($cfg)])* - pub unsafe fn $name($($pname: $pty), *) $(-> $ret)* { - let f = with_library(|l| { - match l.functions.$name { - Some(f) => f, - _ => panic!(concat!("function not loaded: ", stringify!($name))), - } - }).expect("a `libclang` shared library is not loaded on this thread"); - f($($pname), *) - } - - $(#[cfg($cfg)])* - pub mod $name { - pub fn is_loaded() -> bool { - super::with_library(|l| l.functions.$name.is_some()).unwrap_or(false) - } - } - )+ - - mod load { - $(link!(@LOAD: $(#[cfg($cfg)])* fn $name($($pname: $pty), *) $(-> $ret)*);)+ - } - - /// Loads a `libclang` shared library and returns the library instance. - /// - /// This function does not attempt to load any functions from the shared library. The caller - /// is responsible for loading the functions they require. - /// - /// # Failures - /// - /// * a `libclang` shared library could not be found - /// * the `libclang` shared library could not be opened - pub fn load_manually() -> Result { - #[path="../build.rs"] - mod build; - - let file = try!(build::find_shared_library()); - let library = libloading::Library::new(&file).map_err(|_| { - format!("the `libclang` shared library could not be opened: {}", file.display()) - }); - let mut library = SharedLibrary::new(try!(library)); - $(load::$name(&mut library);)+ - Ok(library) - } - - /// Loads a `libclang` shared library for use in the current thread. - /// - /// This functions attempts to load all the functions in the shared library. Whether a - /// function has been loaded can be tested by calling the `is_loaded` function on the - /// module with the same name as the function (e.g., `clang_createIndex::is_loaded()` for - /// the `clang_createIndex` function). - /// - /// # Failures - /// - /// * a `libclang` shared library could not be found - /// * the `libclang` shared library could not be opened - #[allow(dead_code)] - pub fn load() -> Result<(), String> { - let library = Arc::new(try!(load_manually())); - LIBRARY.with(|l| *l.borrow_mut() = Some(library)); - Ok(()) - } - - /// Unloads the `libclang` shared library in use in the current thread. - /// - /// # Failures - /// - /// * a `libclang` shared library is not in use in the current thread - pub fn unload() -> Result<(), String> { - let library = set_library(None); - if library.is_some() { - Ok(()) - } else { - Err("a `libclang` shared library is not in use in the current thread".into()) - } - } - - /// Returns the library instance stored in TLS. - /// - /// This functions allows for sharing library instances between threads. - pub fn get_library() -> Option> { - LIBRARY.with(|l| l.borrow_mut().clone()) - } - - /// Sets the library instance stored in TLS and returns the previous library. - /// - /// This functions allows for sharing library instances between threads. - pub fn set_library(library: Option>) -> Option> { - LIBRARY.with(|l| mem::replace(&mut *l.borrow_mut(), library)) - } - ) -} - -#[cfg(not(feature="runtime"))] -macro_rules! link { - ($($(#[cfg($cfg:meta)])* pub fn $name:ident($($pname:ident: $pty:ty), *) $(-> $ret:ty)*;)+) => ( - extern { $($(#[cfg($cfg)])* pub fn $name($($pname: $pty), *) $(-> $ret)*;)+ } - ) -} +// Copyright 2016 Kyle Mayes +// +// Licensed 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. + +//================================================ +// Macros +//================================================ + +// link! _________________________________________ + +#[cfg(feature="runtime")] +macro_rules! link { + (@LOAD: #[cfg($cfg:meta)] fn $name:ident($($pname:ident: $pty:ty), *) $(-> $ret:ty)*) => ( + #[cfg($cfg)] + pub fn $name(library: &mut super::SharedLibrary) { + let symbol = unsafe { library.library.get(stringify!($name).as_bytes()) }.ok(); + library.functions.$name = symbol.map(|s| *s); + } + + #[cfg(not($cfg))] + pub fn $name(_: &mut super::SharedLibrary) {} + ); + + (@LOAD: fn $name:ident($($pname:ident: $pty:ty), *) $(-> $ret:ty)*) => ( + link!(@LOAD: #[cfg(feature="runtime")] fn $name($($pname: $pty), *) $(-> $ret)*); + ); + + ($($(#[cfg($cfg:meta)])* pub fn $name:ident($($pname:ident: $pty:ty), *) $(-> $ret:ty)*;)+) => ( + use std::cell::{RefCell}; + use std::sync::{Arc}; + + /// The set of functions loaded dynamically. + #[derive(Debug)] + pub struct Functions { + $($(#[cfg($cfg)])* pub $name: Option $ret)*>,)+ + } + + impl Default for Functions { + fn default() -> Functions { + unsafe { std::mem::zeroed() } + } + } + + /// A dynamically loaded instance of the `libclang` library. + #[derive(Debug)] + pub struct SharedLibrary { + library: libloading::Library, + pub functions: Functions, + } + + impl SharedLibrary { + //- Constructors ----------------------------- + + fn new(library: libloading::Library) -> SharedLibrary { + SharedLibrary { library: library, functions: Functions::default() } + } + } + + thread_local!(static LIBRARY: RefCell>> = RefCell::new(None)); + + /// Returns whether a `libclang` shared library is loaded on this thread. + pub fn is_loaded() -> bool { + LIBRARY.with(|l| l.borrow().is_some()) + } + + fn with_library(f: F) -> Option where F: FnOnce(&SharedLibrary) -> T { + LIBRARY.with(|l| { + match l.borrow().as_ref() { + Some(library) => Some(f(&library)), + _ => None, + } + }) + } + + $( + #[cfg_attr(feature="clippy", allow(too_many_arguments))] + $(#[cfg($cfg)])* + pub unsafe fn $name($($pname: $pty), *) $(-> $ret)* { + let f = with_library(|l| { + match l.functions.$name { + Some(f) => f, + _ => panic!(concat!("function not loaded: ", stringify!($name))), + } + }).expect("a `libclang` shared library is not loaded on this thread"); + f($($pname), *) + } + + $(#[cfg($cfg)])* + pub mod $name { + pub fn is_loaded() -> bool { + super::with_library(|l| l.functions.$name.is_some()).unwrap_or(false) + } + } + )+ + + mod load { + $(link!(@LOAD: $(#[cfg($cfg)])* fn $name($($pname: $pty), *) $(-> $ret)*);)+ + } + + /// Loads a `libclang` shared library and returns the library instance. + /// + /// This function does not attempt to load any functions from the shared library. The caller + /// is responsible for loading the functions they require. + /// + /// # Failures + /// + /// * a `libclang` shared library could not be found + /// * the `libclang` shared library could not be opened + pub fn load_manually() -> Result { + #[path="../build.rs"] + mod build; + + let file = try!(build::find_shared_library()); + let library = libloading::Library::new(&file).map_err(|_| { + format!("the `libclang` shared library could not be opened: {}", file.display()) + }); + let mut library = SharedLibrary::new(try!(library)); + $(load::$name(&mut library);)+ + Ok(library) + } + + /// Loads a `libclang` shared library for use in the current thread. + /// + /// This functions attempts to load all the functions in the shared library. Whether a + /// function has been loaded can be tested by calling the `is_loaded` function on the + /// module with the same name as the function (e.g., `clang_createIndex::is_loaded()` for + /// the `clang_createIndex` function). + /// + /// # Failures + /// + /// * a `libclang` shared library could not be found + /// * the `libclang` shared library could not be opened + #[allow(dead_code)] + pub fn load() -> Result<(), String> { + let library = Arc::new(try!(load_manually())); + LIBRARY.with(|l| *l.borrow_mut() = Some(library)); + Ok(()) + } + + /// Unloads the `libclang` shared library in use in the current thread. + /// + /// # Failures + /// + /// * a `libclang` shared library is not in use in the current thread + pub fn unload() -> Result<(), String> { + let library = set_library(None); + if library.is_some() { + Ok(()) + } else { + Err("a `libclang` shared library is not in use in the current thread".into()) + } + } + + /// Returns the library instance stored in TLS. + /// + /// This functions allows for sharing library instances between threads. + pub fn get_library() -> Option> { + LIBRARY.with(|l| l.borrow_mut().clone()) + } + + /// Sets the library instance stored in TLS and returns the previous library. + /// + /// This functions allows for sharing library instances between threads. + pub fn set_library(library: Option>) -> Option> { + LIBRARY.with(|l| mem::replace(&mut *l.borrow_mut(), library)) + } + ) +} + +#[cfg(not(feature="runtime"))] +macro_rules! link { + ($($(#[cfg($cfg:meta)])* pub fn $name:ident($($pname:ident: $pty:ty), *) $(-> $ret:ty)*;)+) => ( + extern { $($(#[cfg($cfg)])* pub fn $name($($pname: $pty), *) $(-> $ret)*;)+ } + ) +} diff --git a/third_party/rust/clang-sys/src/support.rs b/third_party/rust/clang-sys/src/support.rs index a639f88a8581..0b0e607fcfa6 100644 --- a/third_party/rust/clang-sys/src/support.rs +++ b/third_party/rust/clang-sys/src/support.rs @@ -1,172 +1,189 @@ -// Copyright 2016 Kyle Mayes -// -// Licensed 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. - -//! Provides helper functionality. - -use std::env; -use std::process::{Command}; -use std::path::{Path, PathBuf}; - -use glob; - -use libc::{c_int}; - -use super::{CXVersion}; - -//================================================ -// Macros -//================================================ - -// try_opt! ______________________________________ - -macro_rules! try_opt { - ($option:expr) => ({ - match $option { - Some(some) => some, - None => return None, - } - }); -} - -//================================================ -// Structs -//================================================ - -/// A `clang` executable. -#[derive(Clone, Debug)] -pub struct Clang { - /// The path to this `clang` executable. - pub path: PathBuf, - /// The version of this `clang` executable if it could be parsed. - pub version: Option, - /// The directories searched by this `clang` executable for C headers. - pub c_search_paths: Vec, - /// The directories searched by this `clang` executable for C++ headers. - pub cpp_search_paths: Vec, -} - -impl Clang { - //- Constructors ----------------------------- - - fn new(path: PathBuf) -> Clang { - let version = parse_version(&path); - let c_search_paths = parse_search_paths(&path, "c"); - let cpp_search_paths = parse_search_paths(&path, "c++"); - Clang { - path: path, - version: version, - c_search_paths: c_search_paths, - cpp_search_paths: cpp_search_paths, - } - } - - /// Returns a `clang` executable if one can be found. - /// - /// If the `CLANG_PATH` environment variable is set, that is the instance of `clang` used. - /// Otherwise, a series of directories are searched. First, If a path is supplied, that is the - /// first directory searched. Then, the directory returned by `llvm-config --bindir` is - /// searched. On OS X systems, `xcodebuild -find clang` will next be queried. Last, the - /// directories in the system's `PATH` are searched. - pub fn find(path: Option<&Path>) -> Option { - if let Ok(path) = env::var("CLANG_PATH") { - return Some(Clang::new(path.into())); - } - - let mut paths = vec![]; - if let Some(path) = path { - paths.push(path.into()); - } - if let Ok(path) = run_llvm_config(&["--bindir"]) { - paths.push(path.into()); - } - if cfg!(target_os="macos") { - if let Ok((path, _)) = run("xcodebuild", &["-find", "clang"]) { - paths.push(path.into()); - } - } - paths.extend(env::split_paths(&env::var("PATH").unwrap())); - - let default = format!("clang{}", env::consts::EXE_SUFFIX); - let versioned = format!("clang-[0-9]*{}", env::consts::EXE_SUFFIX); - let patterns = &[&default[..], &versioned[..]]; - for path in paths { - if let Some(path) = find(&path, patterns) { - return Some(Clang::new(path)); - } - } - None - } -} - -//================================================ -// Functions -//================================================ - -/// Returns the first match to the supplied glob patterns in the supplied directory if there are any -/// matches. -fn find(directory: &Path, patterns: &[&str]) -> Option { - for pattern in patterns { - let pattern = directory.join(pattern).to_string_lossy().into_owned(); - if let Some(path) = try_opt!(glob::glob(&pattern).ok()).filter_map(|p| p.ok()).next() { - return Some(path); - } - } - None -} - -/// Attempts to run an executable, returning the `stdout` and `stderr` output if successful. -fn run(executable: &str, arguments: &[&str]) -> Result<(String, String), String> { - Command::new(executable).args(arguments).output().map(|o| { - let stdout = String::from_utf8_lossy(&o.stdout).into_owned(); - let stderr = String::from_utf8_lossy(&o.stderr).into_owned(); - (stdout, stderr) - }).map_err(|_| format!("could not run executable: `{}`", executable)) -} - -/// Runs `clang`, returning the `stdout` and `stderr` output. -fn run_clang(path: &Path, arguments: &[&str]) -> (String, String) { - run(&path.to_string_lossy().into_owned(), arguments).unwrap() -} - -/// Runs `llvm-config`, returning the `stdout` output if successful. -fn run_llvm_config(arguments: &[&str]) -> Result { - let config = env::var("LLVM_CONFIG_PATH").unwrap_or_else(|_| "llvm-config".to_string()); - run(&config, arguments).map(|(o, _)| o) -} - -/// Parses a version number if possible, ignoring trailing non-digit characters. -fn parse_version_number(number: &str) -> Option { - number.chars().take_while(|c| c.is_digit(10)).collect::().parse().ok() -} - -/// Parses the version from the output of a `clang` executable if possible. -fn parse_version(path: &Path) -> Option { - let output = run_clang(path, &["--version"]).0; - let start = try_opt!(output.find("version ")) + 8; - let mut numbers = try_opt!(output[start..].split_whitespace().nth(0)).split('.'); - let major = try_opt!(numbers.next().and_then(parse_version_number)); - let minor = try_opt!(numbers.next().and_then(parse_version_number)); - let subminor = numbers.next().and_then(parse_version_number).unwrap_or(0); - Some(CXVersion { Major: major, Minor: minor, Subminor: subminor }) -} - -/// Parses the search paths from the output of a `clang` executable. -fn parse_search_paths(path: &Path, language: &str) -> Vec { - let output = run_clang(path, &["-E", "-x", language, "-", "-v"]).1; - let include_start = "#include <...> search starts here:"; - let start = output.find(include_start).expect(include_start) + include_start.len(); - let end = output.find("End of search list.").expect("End of search list"); - let paths = output[start..end].replace("(framework directory)", ""); - paths.lines().filter(|l| !l.is_empty()).map(|l| Path::new(l.trim()).into()).collect() -} +// Copyright 2016 Kyle Mayes +// +// Licensed 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. + +//! Provides helper functionality. + +use std::{io, env}; +use std::process::{Command}; +use std::path::{Path, PathBuf}; + +use glob; + +use libc::{c_int}; + +use super::{CXVersion}; + +//================================================ +// Macros +//================================================ + +// try_opt! ______________________________________ + +macro_rules! try_opt { + ($option:expr) => ({ + match $option { + Some(some) => some, + None => return None, + } + }); +} + +//================================================ +// Structs +//================================================ + +/// A `clang` executable. +#[derive(Clone, Debug)] +pub struct Clang { + /// The path to this `clang` executable. + pub path: PathBuf, + /// The version of this `clang` executable if it could be parsed. + pub version: Option, + /// The directories searched by this `clang` executable for C headers. + pub c_search_paths: Vec, + /// The directories searched by this `clang` executable for C++ headers. + pub cpp_search_paths: Vec, +} + +impl Clang { + //- Constructors ----------------------------- + + fn new(path: PathBuf) -> Clang { + let version = parse_version(&path); + let c_search_paths = parse_search_paths(&path, "c"); + let cpp_search_paths = parse_search_paths(&path, "c++"); + Clang { + path: path, + version: version, + c_search_paths: c_search_paths, + cpp_search_paths: cpp_search_paths, + } + } + + /// Returns a `clang` executable if one can be found. + /// + /// If the `CLANG_PATH` environment variable is set, that is the instance of `clang` used. + /// Otherwise, a series of directories are searched. First, If a path is supplied, that is the + /// first directory searched. Then, the directory returned by `llvm-config --bindir` is + /// searched. On OS X systems, `xcodebuild -find clang` will next be queried. Last, the + /// directories in the system's `PATH` are searched. + pub fn find(path: Option<&Path>) -> Option { + if let Ok(path) = env::var("CLANG_PATH") { + return Some(Clang::new(path.into())); + } + + let mut paths = vec![]; + if let Some(path) = path { + paths.push(path.into()); + } + if let Ok(path) = run_llvm_config(&["--bindir"]) { + paths.push(path.into()); + } + if cfg!(target_os="macos") { + if let Ok((path, _)) = run("xcodebuild", &["-find", "clang"]) { + paths.push(path.into()); + } + } + paths.extend(env::split_paths(&env::var("PATH").unwrap())); + + let default = format!("clang{}", env::consts::EXE_SUFFIX); + let versioned = format!("clang-[0-9]*{}", env::consts::EXE_SUFFIX); + let patterns = &[&default[..], &versioned[..]]; + for path in paths { + if let Some(path) = find(&path, patterns) { + return Some(Clang::new(path)); + } + } + None + } +} + +//================================================ +// Functions +//================================================ + +/// Returns the first match to the supplied glob patterns in the supplied directory if there are any +/// matches. +fn find(directory: &Path, patterns: &[&str]) -> Option { + for pattern in patterns { + let pattern = directory.join(pattern).to_string_lossy().into_owned(); + if let Some(path) = try_opt!(glob::glob(&pattern).ok()).filter_map(|p| p.ok()).next() { + if path.is_file() && is_executable(&path).unwrap_or(false) { + return Some(path); + } + } + } + None +} + +#[cfg(unix)] +fn is_executable(path: &Path) -> io::Result { + use libc; + use std::ffi::CString; + use std::os::unix::ffi::OsStrExt; + let cpath = CString::new(path.as_os_str().as_bytes())?; + let res = unsafe { libc::access(cpath.as_ptr(), libc::X_OK) }; + Ok(res == 0) +} + +#[cfg(not(unix))] +fn is_executable(path: &Path) -> io::Result { + Ok(true) +} + +/// Attempts to run an executable, returning the `stdout` and `stderr` output if successful. +fn run(executable: &str, arguments: &[&str]) -> Result<(String, String), String> { + Command::new(executable).args(arguments).output().map(|o| { + let stdout = String::from_utf8_lossy(&o.stdout).into_owned(); + let stderr = String::from_utf8_lossy(&o.stderr).into_owned(); + (stdout, stderr) + }).map_err(|_| format!("could not run executable: `{}`", executable)) +} + +/// Runs `clang`, returning the `stdout` and `stderr` output. +fn run_clang(path: &Path, arguments: &[&str]) -> (String, String) { + run(&path.to_string_lossy().into_owned(), arguments).unwrap() +} + +/// Runs `llvm-config`, returning the `stdout` output if successful. +fn run_llvm_config(arguments: &[&str]) -> Result { + let config = env::var("LLVM_CONFIG_PATH").unwrap_or_else(|_| "llvm-config".to_string()); + run(&config, arguments).map(|(o, _)| o) +} + +/// Parses a version number if possible, ignoring trailing non-digit characters. +fn parse_version_number(number: &str) -> Option { + number.chars().take_while(|c| c.is_digit(10)).collect::().parse().ok() +} + +/// Parses the version from the output of a `clang` executable if possible. +fn parse_version(path: &Path) -> Option { + let output = run_clang(path, &["--version"]).0; + let start = try_opt!(output.find("version ")) + 8; + let mut numbers = try_opt!(output[start..].split_whitespace().nth(0)).split('.'); + let major = try_opt!(numbers.next().and_then(parse_version_number)); + let minor = try_opt!(numbers.next().and_then(parse_version_number)); + let subminor = numbers.next().and_then(parse_version_number).unwrap_or(0); + Some(CXVersion { Major: major, Minor: minor, Subminor: subminor }) +} + +/// Parses the search paths from the output of a `clang` executable. +fn parse_search_paths(path: &Path, language: &str) -> Vec { + let output = run_clang(path, &["-E", "-x", language, "-", "-v"]).1; + let include_start = "#include <...> search starts here:"; + let start = output.find(include_start).expect(include_start) + include_start.len(); + let end = output.find("End of search list.").expect("End of search list"); + let paths = output[start..end].replace("(framework directory)", ""); + paths.lines().filter(|l| !l.is_empty()).map(|l| Path::new(l.trim()).into()).collect() +} diff --git a/third_party/rust/clang-sys/tests/header.h b/third_party/rust/clang-sys/tests/header.h index 3767c8e7548f..5c392d31455a 100644 --- a/third_party/rust/clang-sys/tests/header.h +++ b/third_party/rust/clang-sys/tests/header.h @@ -1,6 +1,6 @@ -#ifndef HEADER_H_ -#define HEADER_H_ - -int add(int a, int b); - -#endif +#ifndef HEADER_H_ +#define HEADER_H_ + +int add(int a, int b); + +#endif diff --git a/third_party/rust/clang-sys/tests/lib.rs b/third_party/rust/clang-sys/tests/lib.rs index 6e2e73ce7f8f..f4096202b027 100644 --- a/third_party/rust/clang-sys/tests/lib.rs +++ b/third_party/rust/clang-sys/tests/lib.rs @@ -1,46 +1,46 @@ -extern crate clang_sys; -extern crate libc; - -use std::ptr; - -use clang_sys::*; - -use libc::{c_char}; - -fn parse() { - unsafe { - let index = clang_createIndex(0, 0); - assert!(!index.is_null()); - - let tu = clang_parseTranslationUnit( - index, - "tests/header.h\0".as_ptr() as *const c_char, - ptr::null_mut(), - 0, - ptr::null_mut(), - 0, - CXTranslationUnit_Flags::empty(), - ); - assert!(!tu.is_null()); - } -} - -#[cfg(feature="runtime")] -#[test] -fn test() { - load().unwrap(); - parse(); - unload().unwrap(); -} - -#[cfg(not(feature="runtime"))] -#[test] -fn test() { - parse(); -} - -#[test] -fn test_support() { - let clang = support::Clang::find(None).unwrap(); - println!("{:?}", clang); -} +extern crate clang_sys; +extern crate libc; + +use std::ptr; + +use clang_sys::*; + +use libc::{c_char}; + +fn parse() { + unsafe { + let index = clang_createIndex(0, 0); + assert!(!index.is_null()); + + let tu = clang_parseTranslationUnit( + index, + "tests/header.h\0".as_ptr() as *const c_char, + ptr::null_mut(), + 0, + ptr::null_mut(), + 0, + CXTranslationUnit_Flags::empty(), + ); + assert!(!tu.is_null()); + } +} + +#[cfg(feature="runtime")] +#[test] +fn test() { + load().unwrap(); + parse(); + unload().unwrap(); +} + +#[cfg(not(feature="runtime"))] +#[test] +fn test() { + parse(); +} + +#[test] +fn test_support() { + let clang = support::Clang::find(None).unwrap(); + println!("{:?}", clang); +} diff --git a/third_party/rust/dtoa/.cargo-checksum.json b/third_party/rust/dtoa/.cargo-checksum.json deleted file mode 100644 index 8268bdd0bbbf..000000000000 --- a/third_party/rust/dtoa/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f9b1ca6ae27d1c18215265024629a8960c31379f206d9ed20f64e0b2dcf79805",".travis.yml":"a2b867b2e28af9bde20a669a6ff0f366ecc5150b89314cd7ec97ed95bb427547","Cargo.toml":"5755612ec9d7adc4ec1a68e3b096bfa45af8ae7dfd8237515c9f85786c9a9356","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"e18259ab3aa7f39a194795bdad8039b3c5fd544f6dd922526c9326c44842b76d","README.md":"8de1d7a3224bfae275197dc75d128f73e2970c26f6790b575a8346074f7783c6","benches/bench.rs":"ac713ab4e1c668dea70416504955563fcd6bd2982ae1cfa3a1c0043e09dd893f","performance.png":"5909ebd7b98691502c6f019c126758da40edc7031b9da32bce45df34273b1b87","src/diyfp.rs":"81754c3d1b8ff2347a506187ef43a666f09e20ae0e53436226c969d7e3f737dc","src/dtoa.rs":"f5cdd96d6ac9d3c50289a090a6d6801d36cb121c2a5e6d8acd1aa41013fded76","src/lib.rs":"037eaaf26de236c916332fb76bc72b7a8d588df8c90a8dab5636140976559adb","tests/test.rs":"296f3c322e08508fd372e436434fdd209bb911cab2124ea654d5f78d90f3eeea"},"package":"80c8b71fd71146990a9742fc06dcbbde19161a267e0ad4e572c35162f4578c90"} \ No newline at end of file diff --git a/third_party/rust/dtoa/.gitignore b/third_party/rust/dtoa/.gitignore deleted file mode 100644 index a9d37c560c6a..000000000000 --- a/third_party/rust/dtoa/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -target -Cargo.lock diff --git a/third_party/rust/dtoa/.travis.yml b/third_party/rust/dtoa/.travis.yml deleted file mode 100644 index 0e4e98974ff5..000000000000 --- a/third_party/rust/dtoa/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -sudo: false - -language: rust - -rust: - - nightly diff --git a/third_party/rust/dtoa/Cargo.toml b/third_party/rust/dtoa/Cargo.toml deleted file mode 100644 index edf6630f1e11..000000000000 --- a/third_party/rust/dtoa/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "dtoa" -version = "0.4.1" -authors = ["David Tolnay "] -license = "MIT/Apache-2.0" -description = "Fast functions for printing floating-point primitives to an io::Write" -repository = "https://github.com/dtolnay/dtoa" -documentation = "https://github.com/dtolnay/dtoa" -categories = ["value-formatting"] diff --git a/third_party/rust/dtoa/README.md b/third_party/rust/dtoa/README.md deleted file mode 100644 index 43129d40117a..000000000000 --- a/third_party/rust/dtoa/README.md +++ /dev/null @@ -1,69 +0,0 @@ -dtoa -==== - -[![Build Status](https://api.travis-ci.org/dtolnay/dtoa.svg?branch=master)](https://travis-ci.org/dtolnay/dtoa) -[![Latest Version](https://img.shields.io/crates/v/dtoa.svg)](https://crates.io/crates/dtoa) - -This crate provides fast functions for printing floating-point primitives to an -[`io::Write`](https://doc.rust-lang.org/std/io/trait.Write.html). The -implementation is a straightforward Rust port of [Milo -Yip](https://github.com/miloyip)'s C++ implementation -[dtoa.h](https://github.com/miloyip/rapidjson/blob/master/include/rapidjson/internal/dtoa.h). -The original C++ code of each function is included in comments. - -See also [`itoa`](https://github.com/dtolnay/itoa) for printing integer -primitives. - -## Performance - -![performance](https://raw.githubusercontent.com/dtolnay/dtoa/master/performance.png) - -## Functions - -```rust -extern crate dtoa; - -// write to a vector or other io::Write -let mut buf = Vec::new(); -dtoa::write(&mut buf, 2.71828f64)?; -println!("{:?}", buf); - -// write to a stack buffer -let mut bytes = [b'\0'; 20]; -let n = dtoa::write(&mut bytes[..], 2.71828f64)?; -println!("{:?}", &bytes[..n]); -``` - -The function signature is: - -```rust -fn write(writer: W, value: V) -> io::Result<()> -``` - -where `dtoa::Floating` is implemented for `f32` and `f64`. The return value -gives the number of bytes written. - -## Dependency - -Dtoa is available on [crates.io](https://crates.io/crates/dtoa). Use the -following in `Cargo.toml`: - -```toml -[dependencies] -dtoa = "0.4" -``` - -## License - -Licensed under either of - - * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) - * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) - -at your option. - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in dtoa by you, as defined in the Apache-2.0 license, shall be -dual licensed as above, without any additional terms or conditions. diff --git a/third_party/rust/dtoa/benches/bench.rs b/third_party/rust/dtoa/benches/bench.rs deleted file mode 100644 index ec57953563ad..000000000000 --- a/third_party/rust/dtoa/benches/bench.rs +++ /dev/null @@ -1,54 +0,0 @@ -#![feature(test)] - -extern crate dtoa; -extern crate test; - -macro_rules! benches { - ($($name:ident($value:expr),)*) => { - mod bench_dtoa { - use test::{Bencher, black_box}; - $( - #[bench] - fn $name(b: &mut Bencher) { - use dtoa; - - let mut buf = Vec::with_capacity(20); - - b.iter(|| { - buf.clear(); - dtoa::write(&mut buf, black_box($value)).unwrap() - }); - } - )* - } - - mod bench_fmt { - use test::{Bencher, black_box}; - $( - #[bench] - fn $name(b: &mut Bencher) { - use std::io::Write; - - let mut buf = Vec::with_capacity(20); - - b.iter(|| { - buf.clear(); - write!(&mut buf, "{}", black_box($value)).unwrap() - }); - } - )* - } - } -} - -benches!( - bench_0_f64(0f64), - bench_short_f64(0.1234f64), - bench_e_f64(2.718281828459045f64), - bench_max_f64(::std::f64::MAX), - - bench_0_f32(0f32), - bench_short_f32(0.1234f32), - bench_e_f32(2.718281828459045f32), - bench_max_f32(::std::f32::MAX), -); diff --git a/third_party/rust/dtoa/performance.png b/third_party/rust/dtoa/performance.png deleted file mode 100644 index 69d04bdb7d720d8720e5ff5060d38915c835a56f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70571 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
    6o|n~t&EF{OYUq~{Pxhh zlcdrMn8sQ^1j!^pJLR_gwi_ua``4`J@WPd8Idgk@6cmp4G$&~9->dsJR`=m98;k_G zr#w(ae0iL7b)SvqI$XJ;c70pXhYwUJ$M+CK6E?I{vYx)PS=yDIUn|j5gRc}-W-`|>@Ssbs}PfKx# z2=9+Cj2$1pnyB}VS+3F>s*UX!YH;}ePJbJ>3X{!MtkaGyUOw~n6Z_)YV2L1`4b z)^%lRhPDEvaCgw!I9iNG6qz<{()#u5$Dn1<^w>i^C%bre4c&TDMr%CpF@2jCe`h!|+)|b2e2plYo9I!~(1^+$iaYb#Yh?MOKW}h7 zHmqSsi8mjmEy3s`&n{-YIp*ZkRWEADm20_} zF-+<7$DQ|BeB?Q}1x8wOvl_SlKDI^bx<+iEB(!awL)RbQxIuxz=2eItHc?VO*pTvq zFq9>L42ayzRK2C{h`>Q`KbZ^=E>fs zto`El{ZZ*jK;qEc35}C^aSW(2LG#+(83Vgio^7vfm$vI=B#B|Xg@^)J!K+F-I=U-> z1Q}LKi;ILtGnFgAx&G{vaj`8JJo-*Dn$dhIt1AOM0(SEAC(vFeN2I)b6c>rxwzA## z=BNU<(cSfdQ`Ax?m`g@TNXXj+ls=}L-(hJ41qYk8tkk?dO*$%oMD5V#v(ev@ z4GJHkGg5k%rIvpBv=&TmbbOrorm`l7nDySbXEeDvW7((p6TIC4o4x%Xrq8#*TI#J& z;v}sk*>|U$AhUs96Q(KD^n^{`*zI~zO%?aZV?Uiuw;6EjFX!U++xNJXr0sxHw0-N8sD1DR(dSo(oE1=+s&M5-4dUvA&<66s1ppK=PLs$_s=*C`s7 z`|*MP{yce)RhD=0h7udT59MCz{>(~6MMV(Trw8|({DrA)Kq5)#(>qWyAlnQqEG#FV z9XxKh0Q%RF_0pPI!;rN zQ+4t=hBT+5sJq@XtGo(-@%rn;Bk%7D3JT)h9^>WOtj{r$>EY_B>s$ur0hp^zF)(1y zUjV_pTY3?IL3@0iT|?42v4~~o3m0Ch)9mAHv9hqBb8&G28sQZbRNX_BqMh>mb7Rgp zHjTM)`k^_duzrQY_`v7SlSi`vw?}nDUJjrIl?*txIx8ARO+$Y6UaPf(d97B8{(4kd z1QjLGT;O)jDamZxQ9`%k%g2V=kl@y;=p<>U)`5=|j6bwOn0OUPj0vF#Jn{qZq_;i% zADY{tA{MuwOS!~1D>^$LmR_1X6D{5r6BCn~o~}OY{>j}VeV2my8BKk<=Q}*49u=PY zD_Uz(158|(bq|nN3G|mb9lG&wf&4Zmg${Fdef{LONe>DO3mHAnojYfQnr9chK){-c zdHVvha~mIDJhPOCJ7$2OurR4ctfHh8vT8gS_4+lPp}*@V&*7F_I-WxW6gIj*`Rh(j zH1^4Lao;}e7x8zK-sZ1l_0`h;c~WQ#{EiO$t5<~qKg*c6!+0V1!)Z(09r zDmDARwZhGR`prd~hJUgEDk^o2`XQo~E{l+EAj@C6bjftfF+Pt)lYx+t)_hLcQmSh} zk~aeb0~?nqQ$5lwJhI#3OFA3jt7hKC^H-L86W zPf#Ps@^-3vZnsIb=;xaSMMS)TZ)xf1upIuVq$?ij<9o0e<`(><2^$?9O@itu^*xXG zou@?&!7ZfW4d|(Su~OoeOh4Wcn;EK_u9_i=Z#1)d)#tbvAD*%kMi{IFnZ>20vG!t0 zl2yer?Khx3R^Xm3iR})%n26n-@W!};jobysP4U?=Qk5?I4U(0D|EyGj-o3@Iu=?;7 z*<+l|Bma+EV7!clb*}iJ}DLSpL zlN$!0GWThB`OM4_MJzP|JU27arrl&c_#ze*J9vj83*-uR1iHXg|%S+YH?M@*W4T{`B!KYwnQnLhsWgrGqJ%jKr%E6){*@!R2Z;BmWDfmJSJ{J+bmnsE3Lr+i7JT{B9 z>!{A0FjYLr4_%7i7749Bql(k2aROa|bvo3Zz#C_bnmz^YGJ=GG&6NRZjUDI@*@56* ztEul9?f{`esKw|j2IDWHGZ`n2fe9FpWItD0LgL($qFS&6Gq2R7q$I|Ai-e8)=mHEb zOSw$TBPW0mfhF_(QdqW8g4Mb$yKQC17L6BFU-P-!jI%s8&n+hPQs04udEKoOXrvhC z6tUT3(Zg{Je`_Zmu@=m z6$5lzQvdS2H)3Ufa@{#RWk@{dhvq>J*RqHetSm1mixjJzJbA&&YCS;%B*2T`Jg?dhz0X7`v_Y85F}VLmiFuC?S4QbCL&UL&L%(F;oO{$2Z&;ACIr`F zFd@DcZ8T@Yf*X+C?VfS)v%;rPtX~+-DYgd{elaP&>bu8Z^dM4W+h4l}W1jZK zYfFuts$+){yV0TPhu(P)F2Gh983VIIOhNGH+36-5q03*`gUg4jqv@djQ4m+IT;W*2 zefaD-6GOz#?wgyPy#P@`Ioby6d=LHYLT#)Xt?^-CSs^fFy<7*C&MW4+5Hq}9bAAgu z%v*c+F^r&MGK(=$DMKfwbI`1n8Yq?e<;9?7Z3DMxjc1+UaZiMem4i>$E?_iuWaZ%}_?l8&j|Ty5 z(THWNq2C;PusB*$QBl!w$-raD8yCAfIBjfV;=RcWx0o6c6;8mXh!kW&bn=|is$<=O zIZ2U3*H0S_Y12=tY~uUt)7;_T?*G-RgbxYr^nVVfGYh$M461x*U(M@Ld>pt@$M4^3 z{-ayLy&_XU@aa=86tD7K;FNIK>oC&l3y}#@F~4^sq|@TaWA`^K)300i0h84~H1t07 zLQ>a-0t&<9C~S4cFcf6xKuV!jtkvE(_#o0w!st0<-@gHnonA~#3>xJ&AW#NwX*lww zi*pkl(AYnI{K)4t^W2~z`8?}QEd~Y#Boz$Qb0Mqo^748=dMDbi$-pVP4tjtrzydH} zaBCKl07ei7O4^VfDuNbAVPIeYsJ25fv3>DqvUx*DG&f zIQK`PhYawFe?UN_#!=l?IA)A2EVm##ze-G8=Q2H53?OyE$cPeQ6%yM?Nu4*fflPB+ zdX5US3g34Jtq3Ka26IR^DSuyOZS4kb_gNk!4ZJZB77?W)xjLD|2n*Yc$W!Fow;P~@ zksgPrO>5#64;cS)oBYZCU{*T~N>f$nv9fV^B+q#w)n&$dc7FaMR-(5yjs;RRBa}cO zbAr`y0PA17rie83$VUSJNcsgRzFUETEb!d?yu7F`nV7sUDOp9T$JhC~i~%O7w6(Qy zv5FBNd}7ph%a$%cMwBEu_a834mYROE=bJYN?%lsnMpfW+l)xVWA7ixMtyKouc@%T# zB~&m#igGAiRWT}@@MwO)E%;bjsfZyk*6Am65iTmnjAn2Hc(lU3L4{ZN#Onx`^-cV> z2di)M7W+&pVe^vrcj(X|fQ{7(E%_v%&XMXMegk1q~MIJa1JAG3Xrl6(x|tysuZo z)+mWO9{9G9r%p-hw|q;RF!YDsA8D^f9Wh6}K5<(F`1>>Ad8|WU3_p>EoDCObb+&Iw zcv`>|Iro5~Og; z!4c2s30lyJFw>KRX3Q}vp=-Fgxe3;8c68EPkWItCW$YwvN~CgFlr=9I8}lGngO;^h zK%kUN=D?~j%-;!StW)To-`F@FZ!IY0hsI$vP@iPl_;%0Lt5BEQ1-p4?5gJP!J0VrggX+% z8L}&I*42^5nVR<{T<$gqk^RNV~!H;(k`M;g znV6VlXJ^N*FMOe?s!B%mpzmONZ?S58dj!H5ycoXPqYq(7U`ApLlfG>5f{(8+tNC7u zLx*Cw+z10Lhel4YvMia=Rf4pXc)6qfFwRdUg3CrlM^nVIvkGwEOMv=u6C58%YhXia zH%L&%?Q?HUd77!zUZcm5SE{1IDqRWPdTpRnJTt@%{5%p??aNCGf(H(;C|q`Nax#_L zNi5EG`WSGr9Lkn09gz|dVa0$i`5FW3g#YBrIJ&vc&zbu%BBA|)GTnef zfj~hdlxheu)y~52fg1G+TsH{`2|?8MLW4qNvtxL8pI1rxYrfhgX{aw=^P|s_rHEAU zjEHrgu}{9gF*)7RMkN5c!}^)eY@tPxf5(p1Ff^2ulw=JJc_7LY=w^6^G=n8<;tB!;XWsU;RH3`_W)o>!aN&Bs@Q@uJrE+I6aqblaSt!Nc$h zh(HXbfpT4O!fk2qcKQ9UFlHWXKCB+gB!&DIT>riZ2AM@h;1klj2TC;0#WX?qVx(YU zAMqzB++L?KCJ)?62>oF1 zo{h}MH6+Hz$8E>EjuR_-)PL~7UGsZLXnXb=8(z5J8J3;DTRG+3h2*WgRBNo_9e#;M zhCF@siWg1t0kRj1cul$k3lFOqmXaA%^i(x3j2fk0=~ic6=j*k~E2 z4bp3WFAe`2OPjWp_pi=H{_p>TsM;$eAgU@ZqUU1#d-!tCw81Dv=vTAzzlpwhI^g7` zLJ|oayUzv}J~_>(HTw!BhRXlQ&uOUOyFQu0$!>L>_{t%HQ8;5hsFPs~R1IK7No(+jX>DEOo%NE~Fi65%6^II_W$ z;UkPgGJMo8*~=}nJj?sXUq1vt#<#V(T9Y*W=DIhcHFf|7A!k8BAXG|+sh>FBd3-xF z$+SF69LY%rjEu;pfVvLAmlpRap#|qP&JGF$jUmO-e`3_y$1*r5VEj6VB+297_;tXWSkS zQu1IY_@*^v2ov-?65lC4LT0~yyt}pwX&***_T78A#qD;(UKDhlwMEKn(tBP}j%_y&bEHu$;#$-O{u;k3oCA|nOiX%j^lok6X#9dcNi->H=~XB2t)TisT3Y2=Em<073g9nlumkDq2(a)o$907cV|S#)>p2 zz$265&b$oyPG<7~Dz=G5`)W=^W@ob_rY1%dA()L54GG;` z`A=|)gEqwkUhWM_>i)OkfM&Gk(@iGt86oUi7w@sM{5LTBO4<9)9bS+QLhx#r5^#;FB{v(}Z73l`5l&~Mn%D7p zPXRV5;J8LdXD4s1_s*r@fPigz_0bQ$Rq%<3XgUr3{ykl?aK*vl_S2`E$doNC(fD4D z{9ijyh1~`E;RV(J>nQbF%VPeYm72U)V>KOSUq~($Yp@Rp#Fu90!5H<{<_<-fAgar8iB_HBR zH;?pT-YNdQV`I4ZVqVqlb^yv(Y%81r z)H30T2vrgMrvXu85Rwoc$5UY zghQfWpCK}3r(Q_=c6D8fu#%Ve`dn$S>~dxk;BPikASLhLlhHIX(1jBkh@LmF|3Y-8 z1MQkvc79R!sj{*hnQMC4xtTXe$$)Zh-?3wD#m!r{STn`2XU)3`2hsKk+3u;|&YxBk zE-kqIL`xq0`Gy*;5gfz`?a{7r_=68iiT#De*)ia~GdeG@1q)Y}IdQ8bmqrYWM11Y- z1T{7Fx-H^wt64s>As6{4K8Z_vdHRJkM^lCS#MD4T`HwUsk<4JF?c{Eb#PZ|n5d=jl zrWlDd;36`!cFHXby95{M|M>A5SkMo+q;#_a|AtT1Z;*Orw&MsF#Isc|Blq60qzcdT z^du4u3iW53kfg`nQ#E(&EL$JZ@+MGYC+>IP^0%cR0hP(^r6Lw{|1~c^Y^WF{fYbd+>&xS0Nr8x?}*L?LS8YBbEQS8#xX` zd|vI?Kz#3in(PXrqoq~fbh9E004=o92z7c9bd?Og;JT^`++2SA_^}m?;I(HKEKIBz z4JlcAc>-J_kf>?ilzqj>yATe<7y^pW`0wzjsi@JGqhY9PO40-8Ls0D(Sb zqW7p(m*Oz0PW`nN_(4_NnLmeD0FKFZKretjO97Ps9qf?IDD&PmHwjFYVt@*ji3%gSg=pe5iJ7stwV@~>yq3#JN_ zF%RSe$Y7|U2Wp}Nrp;R+;a`Q14R#>s!IFHbkd{?(XU5ce?IHEnN<(lWo8L13Yg+7E_qa1e4F;@Zn9M zC`x$ZmNui8qQotdx4OlopyL-G~|VTtV!3KACzL z2N#TuR|8xcZkHs`e8~Jg^4(tONT+3%yrB4Lonu^roK3{CFA2~U=jZ1KD^O~0#85L_ zbz<(?;_||X8el83J<<)!mkeK9+Ibj%TyaN`&k%=7YaDl%dhE|AK%s8Z3wk<_ujo|gR2YX`}w0MSnijS(IkK+GUrAn@*!Pw%nY=*dt!D5 zJ%0QPx>}vXUxvADsr-*ohqYoHZh=0JaZfvdY3&~pLQTkxLdU*~74>$2?k%^6Wlph5 z(_cCIiKrC^#GxR$7aQH=4K^YVn{C^%%JUv!UVL*kpCU^E(qSdLKLK$=cU2vd?tZ^h zvpDc1_z6NOyWiG`P*r~U@&Oxo!{a49SXOgI?bUGWaU^UHRXcG319~+b8_kPPa5Ge~ zx(M(6`Ex5PU*P$*9u*CbJnC>1O@W7?=97L8Tx`_!(VyTeSOL3F@g1(C;pF6Wa(2dk zJ<%c7h^>!*F%tlehavQ&D4p-~`op9x*4?xAJE>y9gY2!2zF%?`*$nc>s;bhe-D*BS zzeNHO3EuuLj3@IZbkL2U0fZ<1fnTa)6+y<{;5^pp-+||r>NBS|d zTh?YpNACcRq%krwB32&EKlWcCjVlg66R3IEK!w#y?)vHJ`-wlwyw$FgPqx+u(9_VU zHl1?6m}9alE-)l8kT=h|KJn=(zu!F|Pvzy*q`n>(wMacdJ_8hj28%f&_ zU1=Z4O~lxt=g*)2N%q;38CD2M{EJdZ3+bFYmtffhj?A+)IAv&=@0z{6H$u3LQy3tu z-<)w%B6UgH&n&O%yo?+?X8h?+J5slalgs7-u4h?(D%ogWy2eW|TIc26g_lS7s?hlK zhuRpRwT|2R0RLk!Yb-4H=N>+*tIK!tP{KnbJ4fe#zN7z3`JYph(IB3cC$n!lGWSx= zK)gY@lewhS#h(tI)Bf#9$p$}996k1NXNP57JS!PVNJ~Ods~U+TK4c{^ca{E`vIHn3 zZHj#ywLYTt(Cy{fm*%jyFJOP@WZS}{t7-zzl0v{U`YM@10Rh{(bt?gW%;C3V;bfiv z{-@*|$rzH~=C3OE3!s@}W-gxn;N9ugf3g683}sVb`ErjIMmvs%f1ay726zW$4-xdc zf^m^RAfOZc`8FFjZUm7hVxM?j0VZ%-oJ}i{kJ--;lcVE0BPI^;317w@$S7#%6dJYf z$zWOil5(^45#7Yf2@WFw&TQO99?8bgfOOL8oP!?U*_C!$JuB7S(K`=Gl@fQEYRk0 zrekWSU3ywtRbv?rdy*$T5L|(1V9~v>Bs_t(hP}sX&G^>xC-b%6U*ZC;?pAqruox?9MYi>?D}X67gutP{n_ozN06e!Q3)f7xweQ!6{Wv6bq`*mpmh4K z{5HFxM%In{^hl%h5zc(T+9S_U;8;GfytX*ke&9Cx7Z221pdSR2nKS*98e&9u8U?0s zFU*b^d5^EkfzcJKL9@?*@0iw#Rv@Gmnw0JnJBcEY0W$Am-69S!2%S+I>46fA1~1Wc zj%Rv({z){I?;s^z?Q@g7G`@F zO#x+AxVh#B3>n~6u$KFk@*z2;#_=<`m0Odb(l@7RYiJ3xJf{y9nteXU?&BB^1KX2 z`Dt~vrjUT8xfAmM9vMz!7mo+v{T9!!_wRw?auRhWa9}#_^>eG>+>TT zMY zE>ZFA4D7r8zPqs+!eeI|ewV)MSSiQ5VVo&@i|KVdm|9@RxqC1(KVMAKm^CZ{w|Nl! z1`2c;?Y9A`xvoG&vuXg-62X4*M@#5*vuz`g>5T<&#t61R=PjJ9w~Uhtt$;~rP#oMJG%{&jyFUk~>n2^b zwf#=b?W!8@I6Y;ZxnB9x%&X8Psp0Ptx5l!e6d7w3w>=0LQl}}Vz_K;36D^|}RFakT zteWpYFy!->FSUrhZ4ajZ7`@{COJ;HO7KHRkKv^ZeegXYZPW@J;qTZn)t6HsQi`<=v z;w0dpmN{Z`(frM!2hA=f?yRh=+|L@OUx@>kI^9l4v~+iMX&jn<*YmsvV%~PvDccuP zE|~?hzvzx1%m0wVU_78ZX7R;RRQuiMoOs_6>#m-a6PmjOB^`&uq9PmQ#>!rnD!ZT8 ze5s!|-_{zuPTT`WTSE(4k@WE`4_;lGl@0+g0S0wI6pCe2O3$xM6-1rN3W)B*_WeOo zkqirbbVU;r6E@;hHdx`RkVQza!4E}3zXsoKM*)g)ZCsg&i3!qMt1oOxjWzM)JVrzR zkac+u=+f^tf+s^aw|K16lj(AGYb@Nvh`RpR}koSH}cAu-y%13mRi4UxHq# z+oSue)UR3hv*=v*SmTLamb2wQ;`7u2O17DF9z~z2A9`DJpWNB=H=*tuaesguyqaO{JOP zv1hJe`NUzIbKoq~ntHa+x?9~J-Hao}dy9laZSU=z9ojeB;yoe|ZYA2MWy$3za9iN; zgFnC*XByo)m2eIb1=B@m=dnX^)^el2xW2$>)4VMK9V0L8`Yf52F*i5Qc)m+QBDdrk zcw>#rNd9YxR;M8zCQXX(xb-A{{^myNivg3sNdurs$##p-6qTp8Bl26YLz@kU?#i4N zkqe!NmtLj58zB>v!T+hfvv^ASoFa>gTw8~4zsccn~cjqjW_YMIkvf(xL&Z! z$3P!|=ah8g-bxRiVVT7>=q@7Hhe8d7pFSwO2hm_$#USO9t?pTaxLHB%?I#egFL+OIh+3NFDI!9td-m+v?uQ3Lzs|#TvWTkx)z%5&31VxA#Liv2 z6hZUdqZ`J?$Ay;zN-aePe8pO0wUi7X!1k3rhf`N}#}eM2<}|~f^7_nplhPrk>)r^m zmB+iOn|20%I;1a|46%Who<7-|??i)IUJfD|=WGg>GRYV3;QP+Q0>`T)1nRE70%E@2 z<*&G%b+w6~Ua*0Qe2UQR97iEand)_J#H<7 zeV=WwsgmaFF%;`|~hmzX?v zE;GHOb_Q4Vpy4-8hFDBCPPHID;yYr6ed4Q!6FNVfr0#foZz|+O#Dqief^76Pm&sn9 zxZO(Ri6Fh-Ztyx-uo~$&J>1pbf4wH-v8CArOt&EC7l+*!vv;0;o`?u3pV)6VWQu%M z-2mBf)=bxX8gOK6ktm?F=S27l(pIdDjHCAl+>oc7!dp%HG8*)2Zmy<-77&H943~6P#~ui{ zH~+OVR4k>$LUQZ_3leDgBm#l1>UL&)`nPOZkvor8GFn1l! zAjRSmjrM!uq@zYoo9FhgPY);}ok2nlG%mZ*_9JAD5m6FQsGurpS1c4v^zSNJt(!zG zpNKmSCqmTZ2XO*{)xy*0>g;?4XYT3O%Oa-VWo`1O9xqR&cxW~ze?-8*184lEaMEW0 z4?-Np!sRk3-00kF>TKnR~$bEX*s(s5eJ4ni|uC{*)@w?{Q{8eOq@E21^Xb6wm z+uFvahV)PIf3V19RZc_4w!j&fe$1Yy?q32vZ@%W}*g*C~kHt=Ig_U;P9geswgRJG_ zFs3zCJKhYFg9sO{?j=XUOhe&v#`Zq!gt8b%*0Isi@5lyDzLr^v(~xP0A0K|`N(mA& z2TfmsTUkI}omWp~0E8`(1r~ad?PBKi?=~ha6ZnO20+iwDcZpKX#*c zgDKvgg~Oy5C#f;+Yw){Sw`@sjZq~~%t5JYLt%=5O@pd{us^P@+t3uWdEBadXHu*Wq z%NdHAhF4Ue@f;NOva`1rnV)I!!jlbhu8dE_Vqs$qggdqhX$2Ud?}76+zPt7sOTIPm zQ&fol^|%Mfw=we0sWY!bz1ZWGMR=U=va@^fvsHJQc;oH!k@q!2fc84M z$ES~gv_el#B{v>4b6&!x@ogNJ`>f%s{c}@TCJf!(alJ0u=~m3-gIr|ZX`!;%#@}Cy zcPkvUZa#GU82<|aWEe`yiq_m3IUfsa!geXU?6bfud=hjEn-X3 z5V;Ut?m~QbI@tR2WzkUIt(g#oqD9vwDj{=Sbs!u4TyuGohra%E@&pLtPOp-Sii&6# zs336kTWR_{8N zrtpRX`@tVVIL^99R8$LF8TF+Ore24O7oIUq)3L*XbuP4bcSi$&Zt6L)9F{Quv*lxD z2RbKw9lkeArp}~r0P?nb=S~H<<*FEkwYiQqM(-;SYvM38!ajRiG5U%MIAVNrg zxqbtLrC1zB{dh^(3|xGCbab|~fp-0RO&makmbHP2N$r;A;}Kj(Ef#ghaftmj;2{>1 z^Qh}HKxROS*<_S&=p7nrV}V;PCJiRUrMy!(En}Xih{Mrkrk~EV-U&l^;hwK=u*Q_j zGn5{7w*CC1S!r1rj(KY3Onj55L)f8n<`=Z$&!0ZUjTi3P@nQvcShjE#ofMX5GWif; zLH9#$iRO0r6KVyCAa4f1iJf~Litpt#UZ$c1MJGz%W66HnB#sg~|8<-boWhZ;Gl)Va z3|zH7oKi3!pSD{_Ts%jYF4XkSsvi-*QX|BzFWJY1glKyweCB6nWVAh+v^Oj~ypAlC zJ8q>BC+%-Oz1M8&tFFe-jClKQg!b`vk_OPGgs{$zj)+H(7`?r`GzJdG(?-~I^|~tez*1CApB9|CZL z969xj9upjOK}F2tfbIh$k)MyFgb^Hlw0)^xyD%Ut%P~oESG);!5y~|Hir#alUp_he z{=mBM3p)-Gi*n>6Lv9zxYa%dTKpvBmPu$#sY@H^4itOg*8C>yJkQnQr=v@*GwZ}_U zcy$~w4R8e2pyM9-Y8$EXkGwFgbmQEAfy!j0$C(-$Mqpv;pnZfUt}6d}_TAO!?S0Q( zhTp}lze4i3m)qrR+Y3+b41{7~Za-0s_h^}Cy(vn9<|a*|JPlP<+xJolH{#cEOY7mx zbIO1)AC&fJv?2r+rEAb}gTuoGj{o_szWY*4(sY8JJ~eY4>gtLDcYuXsCQ^`Q>WmuA z0A3E2VXzJ>y;y~+7J)8c54AP9g1n9kiZsPHR-QrrM{xIiLZzAT(}U1pb=^+YCjNT7 zTh^@>tothj31F87SSn<{Grn|5qw!56&ktW-FvTO^%QtDP^uIg8z+iKGvSnDK>I5vjtOi2rns ztU&Th<0U@wwA54(!VgK9RQ+i5tPk%$d{_^q5uT|yIEyJ>;YVT|phsl4Z1I}WSIy2) z1Uba*V)0^tWW)fauyfF(?;t2K_5CPAALdv_UD7|lWH~|qcKZvr>8E7UorI-_9r|nI zfHcF%Nd&E30Iw^+TUrD4ox53$FJCqXBk9gOJolb^`6WCwzU|xPkx8iotFi}r6~Lhn z2#ME!`RodM^ytF3*g<#)k`Ffi zm0_?>RS@)`XV1t%6#Og%|9~x4aY?ujud4_O4Gq0w4X67$QhCN{I&YoEem%=S{CB|! z**#PHs63{Bniz|QP9gGAfx%Us1_&3t-Iq%$N8^#eaX@jFohKhf2^&u1nu9|_6Y!3P z3;?Vz_T0{0{^|{67bL%aDCE-?gKQ*`Zz3QC0a#7i-LnAR$^m%8jqdOqp5^glZtqWs zU-{*=os_ch|;kE=shsgN>o zmBdS6(J0EsNJC1zvZ0~DG)aAN^WV!LJfCUX$c=&#?SY$5z5t=SqeCs}a4Cg7W z-0AAo^sz%iLTS~`dJO@+n4a>C9>7jRN6Bqy&aFB(V)B>^vy7gF zB1DXWtPOP?KV}2*)x|=Ln&nSX>x?=lFH?gDmU@{Z=s{(Xx+@Kk+NEE=MKq@u*sLV2JW%L7F2gF!bH= z;8GahCs){BrsjzwXH*;0{GdyhtJkj&N7>#m_Z3O}L7E1bD%QNV{zi%ncqW5ZHyJ*D z`YYM#=t*h+v`mF4RaCHN#f@PsrQQvQhmx@4U!pF3fn*t|kyPSv4u7ycNA3pL(p)%_ z7fDH3;oSn>J@5Se<(cmrv*bSNgmxcBgZk2->_*1$oVL_tRv-vRY1uzPNmRAS?5Czb z+cAIjEJ)To>LaBJihOp=yv0>(NiC|z_qXGygZ+|TsuxA(9jRJ)lOh1aQ zzn%1t1cMQ@l&_Ay9eO9|TUp9NTm56QPr6xV^Lkqe9d;I$MnR=FcD^f^bv4xT16p|> zNb)CFwt;ZOkBFlTsm_wRI_1c3DoBh{e#2{NMS$%(BFXwSErs{e>lB?iplr#s-DP|R z@hSulmn0wyqJ(qz>BPil1X%%{c(*YuX!MWAU!@nDnoqG$I$lz7VJ1cD`o%9_CM<6e z5bf%L5mLh@P3E4uig4eIooctE=ci@QD!zVNZ7UtrEWhi&s&2*F8h4}|f&PDg{r{ec zZdv{Rd_gqRsw*;|-yVWa3f2b=&1hz&rgQcQ>I<`10k8mdR*yWIdZq2DrDb zqR+a1w^92a7r6u2-Kc~S<`4)(f@ZMy&6}@mHWoI?T4v=ChQy@7tZBt;h0ZO#ouT^l z)0g&4qLf@8)Ut5HpccdZ{Px2hdUoEjF(kxeb(cna`c-HFaBC6NujE48ozID8hfS;N zUL9rla{$R~sS7r4RL12Pt1g~De~ku*p%Y`313@@9(cP_$A`F+!4iZwqr(<%`had4x zufG7HMZnW7lV@{@Hs^$sFgu3LT_NhaxQBi zs9dGvwDh|ljJJX7gMB7+$6-o{QVN$djXd?sBGnEeX+(Jrtdy#xDMD=6H+{jUgGw(- z%cvh-PoOqo-fO**GWNpRhL1*!52@P|><9VRM)Xgp7NX$EoGs4LGLf4#ku<1o8-Fan zx%*wI5aZBgs~jjIFB&#L{;%R;ISb@+bOg`X=t8wiG znNOgU2~`&2yV|YGKX~G4B73|_-E-Eb;tJ*qo=l-)q~gj=X5F1|pdIpDjT1&N{F#~L zk>V=on2u~-6MH7%Y@1ednP)aq2{Hw3o$?e#??vCP%AbFM1Dv=S@z@ z2S1Bw5a?@zZQ`gydoP_0181Wb>FoNu0AP*c2Dy8WTeS+|r8A34%C@g>)&)Hebr};g z`zZbM^q|jfDhJeb+Wq6L|L0YhV?_j&VnVUSrqxmgJppK8I93Hl7$O4{tU2iXq2E3P zecQ)ig}G1e5C9^<3MnNbcMokOj#yc@`*u8d!Nw0|PA2*_O(e6~&J6RDcfjRk4B~!5Yb;=-c;CY=Cy7+w}%) z8>o1NyCWd|&F8<@{yaG(^uC4>styV686$*<8vFI%#vK97DXThv9r8fRA7&`o@4q8T z7_8xA_cDiZdxTNNN?(KW$K5RRorcZ}Y(W_0Xpjm4wSmt}RWJvF-K8);dgk=$CbR6? zgjo8&h^BnLQRnCmcJ{0L_ak^D&({Tg+0*OO;|Acu?A8n2kK?oQ=m3v!OhBPg*{7>P zhn*`rpclcAsV(N-|I_9i9il4*-SB{bbU|GKwm^3&|6(@9o=!MDsa2}eyG8i$$4E(E z2HWH`dv26wFwT`%)sj%JnIjp_czKXK2O^6@l8lYSCsp>(>*QlfJ=^ zw2GP1I2YZT@aQxB_N#1X>VH9@%yFnTMss1JCMjw9)ZQKSe;v`{psHF61A{mTL5wh7 z=h3+(SP&a;P}wO}%;iM%)_-a6&y4yMLhDOc3c#H>I_)%7V+x9~u~V3_}uQm2rm-%8F!Tk6CRji#lq>ifW#dCzq3; zM2*hJ?gG>c!YLO;aF_`Wm@sojjp!2pb~%u*Md`vQ%bz2g$y1pS94HPts0%J!P{G|m zu7sg8g(C-iiXl~u!cg}Wa1Z0SQF6b;el?#~`N)uJffVPe&SRp>KTcua0TLb__E^2( zIS@ern?PRcj~+dGFN67Y&V;m1vo$ zzrqs2;SVMc+)Eb$*px1h~RLm2vm(Ba@E) zyON~o(x74|?r+d&)c}6jVR)l?f2@4g_?KS_X1k|ab=RIAFlO$9AK8~pzSVBt{nwc2 z6xD@CPs(hE4$VbHRI>Bim*on5rQfG1q0bx5rm_%3yqh|K7IUx$A|U97`oVkq)~!C4 zFk}FTJ0}JzxlZCV>zHNvV*?9ZTTaP4jcf2f=(cFlkH*Kx5tY(07lhv{`+`k`%azK z+x=c#Z`+dl73(O33QM}I!pskMg%*IQj;Eow)r@v`&ml@vdD+9w5&yA~*d$AJ=gzT3 zmW(UqOb>i(U}0&QduD1xZ8-k&PfYFj@$+X<1qr1fF%y})s`LAnLu_s1{H8IW|4aS) zy8%Stt+XR9r2bgoR4outwB+UOypN@9-G56;a!};VzPIp0*~8);mg<#_f73sq&WKYI zh~vdDzayxzn8k+8Z%D9nPn$V_7c68Y-vE4O1WqPF)hgiK`o)Xw4i7%v@zvgbuep{z z>xRC`(`)%9lJ!t6Cpl|UB4YmKpq%7HxD>)V%EjLt{DUpX-R&;^^<%vq{5!tt)ks<^PpZ2i5=B~n|m z84-fSkPM`vl3PH)<3ot;q;Z`+>p_Q^S|M~A1{S5 z%49rvg9l{kKL8)8A1<3)J(AlwQDR z|Gs~3sy1a4vO}DKYm{CH+n>bk?g^Uc{ z0I=;sWCdq*MNk+!`zr<4w0DL2O2Pg(A*dbF5{(vp(#&)G=0IRC$Ul2(zbr$K&Rc$| zTQ`E2gYNk9q>_iZ6DWyWwd%{!1ntzm7%bLp zJTUZQ$;zuVUU^cvUjJlR{t!=eynN@*ow=hs*EPE^v9rn{bd}Gla}AFS{j*G7vADHb zT9!7xI%md=n3LZ6=U#9{LI~88NHIHhOeomY4o(#lK)29a6J{7}jCJjLDv-6yFI_jB zQ!sv&ZN>UnPE49j3NvccCKf`+^UAvB76<>X^}DTc?UN=&2DLw1_xMHsB}ZhOO_fbl z2zp~K(P{nqUsXk*e0Cd`-VV0w_ZoJdlzsbQw*D82c2PK6v$-@m-jsDG&C;<_T0(`z zj(<6;Wi_@!UD{V`*euMCZ7E|&<)41aR zs3HuySN3X-tZ9I_7$g_ZLx%ObPT}G^yaH{F*l|cz?G?xrr({_(6~yf5AAkR&*_n)a z{&03!+N4XHcaiO4LBgcz6d5bs^7qnP5k1*Aw|3M>q9$PD$Thf(X*Ob?gDeiU!VoqN z{xKm+k>qh!(sj|Lp!-ZqPtQ;9qQ49O-z+RfVQDFC0f~C!h7G&$HTGuJpWTe=ASyEQ zJe44gp?YLT?~u#ZuZtUY+qtugmxf|2nd7lC-{<>~oP4K->3f;`UBl?in1A%4K{+_G zL+IMeG}j0~q%tKzI@Ye;)obIQZbK55-6vg312b~uW}J%?p-7FfBh@y6P#d#Ae|@o@ z45F@Fv0}ZGHuSe&f9->XFtq4`EeEKXHZEVjoL;qIg9dxZtvNGO*yeRkUfpitk=*On z0gvV2)i&WD-o4Y}-tr6nFVsDfUs15-es5DRQ)o4<^wH`=!5;K2F67EmBz{@7P8u2- zvhpKezxE@fHCU9_plkJ$jt&m*5ZajVY}vO_SIB}>IE7;1^Eg+ zi-Kh4cU0LZePgZm5n|CKE#4Ejf8JZnRVE|wG57{iKDBJ4{wrUMMwEem-$+G6n6tyB zU}aiF#ECZQ2e}@!IN+^$j2knlXBxF{pAV@iKV2OcxqFx^+T6Y5P1!4~o8$p{kVNrf z^PxkB=&3e_hbPd#ozKfV;`)|`&Zwd1=IE9*)<>pX??>ARm3aAG5Y}vmL^})fuBPMVntw0qSXSir5nJaruLW^@RFYkS6-@JKqEe|pi z+hSy0+qf4IlCfiAsXnDchJyfeh^2GNLNE`WaPjKZBc2t{{6!xSawCfe~V?d2^QkWZQoZ$tvj=>T1id9 zPc`Z=a$K@y+751&k+ozd*;EdwNu&+Q@6b?v9)!d=gy$qIKNU9cl=O@f4~+EA5P5|B zIg*A%PZW!;2Pgg|HTH2RB5xE)GkT$l!)A!BDw$n*0q|USjX2HlpL|;^YK-Ka!b(08 zkC%o_MDR{JKN2N2BevcQR?xN_R{!@9z{8|RC7)jK?TUu%diOc-Xbv8zQp`DA2dFLe za8`dq`m#V+X(v^X{<=i~$U8>hS{yEh4X!ufaq1b)bHI48=M`t>I)xl1?cxVUP{ z-8FhRC)jW%X#}JE=?lW)cS0^G8#fNKjQ{z_58I-y(MHKW>St|j4)rNW5+(ZK0L${{ zs_29zd#<{A>Hv~aotibBP|(22PyAl5DC|43bum64SyD^?E77yMJkiHszpT$V6Cx+rF)ixCmM#3Y#^yWNlKPTkOWFf*V2W`a zL01gA6!r6KyAreh?zo~NSD%_7LLF9?j!pnC83L-{Qk2Wu=Um+a`zP&ah zBSVh&V8Iw8ph1aPN)ZlT3X`@QUWXV6H=A{H$RYSgwR_hh#ecu+irSt%)P)f=!(IzU zBEE4!-=$=2`LNw&pQ2ohkYr0sM)>5by~Sd-{7(i)BE_RQibKm!FYAEOARSnQ4!9!< zAX-WW7O@Mrbf(siezbD9!FQhJrlDA}8+02gf?lkBeqre|UqJqoD$3kECDFEj$C#YD z1rrVkx@$9Z=m;(dIi}0DVfs`bu>*TzCpH8F_Mr^Q@UX$D^3(zPp77`BGw zbE1yd;_yQ4WXx*feAEQOpkRMe@scbtMhQ!(KrR*9)?I6y#BeSi(W4|I1{_5&$v(Td zIs-_J20U6&G_p^?tF&hlxZFa&L#XevZOtxBIB=eE%S79gQw3C{*N09sQ3-d*6u|YL z&jkboc%xq z&7c7TRGL?*kJj2$eytf3_{me?!HcN)sPte`hkKNW!9>85P?w8V9~ftK2g{K?L7i}M z`w`a!9fQh1>qd(?`0M#lP|!uiy`D!=-!U%7wP-H&p$w*6%**@GxS%3PM5Oy3{QW6u z!AM28ihJLjtXl$(r~R@uo1uEU&7Jz}jHl5SxfsBL$kG5i}3j zsozn-*}ezsQ}T3uW9-k6L9g?OWsf5Q4#DYvEbX2+GXDORO<-q-k z90i!77z|rzTa%ji^oiliOd32Jm1;P!sq~W){*896B_^AVxo+6BX$;zNY8DrZXZv;r zc4h|SQ_3zB=&Tk7jJE?gI2u(&ahTwDj_K9E0Smc9xF$b?4)k^&nv zXpM0nv~8O9D8>5}y5ay4b3+JykH_ZEY5e4N5aolSw~L9cF@SPQ4K5Kw&7vON%6pq# z{w~J5?J%ei`UkWJm55v6M=o?v!eA!*FTT7y)daU9;+7^OWB!(i`NS7Zq$q!TeAuF#9^9=aacBF5czUCkC+=B3&tk zmI%e-waR^gGxmuB$2EB{woRTfv-Ss-XDmS)1{?nz(1Qre`hCt*7pg*nZ!!KGvLR(x z(d=G0d2*L_rMDZnrxOj4NWckG#XJ&cpd{Nh?Wa8x9C2n64aj7b1B_41WwTW-$#bBw zvgc8UL&9{M)4KeU`&g}qYl2de75ikzH`c69><9u!Z?^c=vCq>)#q{;-*R!d(K^4<{ zCxvdE;j>@W;};cU30tL_#|>84E|BT#Xi=3a284kD+W#>b^&OKcn-grZ8K0#Z>8{GA zpc6WZxCbWTghIq@&e6!9UG_F^iBQ{-gwBT=s~{x$Mah&)JN!!J?!YH0pq|*>XbMj_NO^ zik@@`$Sbdp{Z{JYwrLLys9|@%KBB6;Smz`NG(g3E!%XvN5yLV9sAv!9 zw#s4LxN&Kf<{p4XjOAh23?4jghPTy(8+DIvrfe3jA%AYH_wQSVNYP5Mw~tH~!{9RM ze?0|CB$%#yeKo`-e6l&<~di5Hw1AffT4SL1@n0$3Ck{=KvYgi@#yn_u4PW zQ{iGdZT+)H+lTrs+*G_U{QmYWd1Vh4PKDYXUG1(Md)IUBwfwt}gF;Jcet7?W6C6}Y zfRLNcX|J*ydsVGc#c5O?<1DkBuZoXoMQx{b^K@?v?4Q{ENW9$)(&;YqUGF{Nb<$T48obI%K4b* zVPE&bgI9pzBps@Nbh6KcjknQopw`=B?)5YTF4SuU0ds>0z5lmPKJ>17rNGAQ8xl z*I0s-!L3Ce{p9Q^ShdeD<=F9Ipk$6SW*ktzV8k|?%#5Tm2~~QSn_$2EyRC*ED+ z_@+2>XC4Ve1N5sx)xWP3fJ7WnW$yY4NG#{CRjcCaE(%K-)yx0I=9F49oG-dI|6E$y zY>bKb@@DgXf0~0?a7N^+-V1UJ7X<+h3o}mZr3JPHD>4TC!}}E4V*`wfh_>9OrA7Un z5Ai1wLB<*qC_l77u)qfn=TwQlvSa`p1%9Dw0>_r85~$h^l zQKChoUzrW(gi}&q^u{7V5KN3g&Jj%qFJH1m+PAGtdWv0P8D#^b2RWSa6s>DYX(^(L zIWiP+40Ar~D{vE;i@RwKhP(eZb*V4S>cVD-F01}Sw!o=UIBn^r+ zsV^?Js*p>$o)OEOZH+N?A2+pKPz<@=CdtJU zL}sg{+FQNR$tdK)Z0qTPnRkEPR>AKmyvL*{4{?V#K;yj1df}A@o#{f8!|8nUZ>7NN z(V02$b`YZ`6}8j92ZchF^UEU6y*KXMIlHusKq|s=!1gKB#yK-;lm~rjf*uM=&Jez=A-Ax_&BhJZp?_e5O%9mrKVtL|dLCI_2<_THrM>WV zulR7qz*ZGasiGkHd!wZ2*3mkkg23scmg&6E?b{ce`pi6tleKxY?f0M52C&X31`n&7 zMlb%Kzhx(Cu;$ncaqRw~7n|1}R!SYZ)H1lDb?uYzj3QPFjhq~3PPhN4{)hUYIet3M z9-h%J=T@lKgI&$&p*0(6wqR=vTo$J<`R^lK8ZC0`(1^jFi)V8pOuyfYeKE!HrToS{ zMF+xvNZYmJK1L9E1pBzSMsa|{S$FRq%m1M7TkN|rxE=>0#KcX=s#RHB3B4(t>je<1 zW^vY2{jFQgC1!%14tGx(X}6{G((jjGL5p?tfz`$Q*odzYhCk~c?ESrJ>$WF3Dhce= zfnVYCT|V#7|Ht6cXUqEeG2luDc5V1oCb6LIp}fN&H%(%1=ChrA&UW}8vk5x}K66lVq_>bQN!9_-t0M@1ug zVLIisV%gY`m6Jb}mWuu1H+CJo@i@b)7cLAh@208KVwkfS*lsU|=DS^hg?{@4G3Pe_= z%;kup2suqw)nS#~Qg_uox_`etG=6lVYdn?m_f<6#$?c71!4hkThwv(bFw40Hf)I)o zJ!Ku-vHAGFm&{BU2CkSwc_+$;g4E&Ioo4Xgrj~S%?%VB`MPl;I(#vsP)i7vf#XEDL z7!Ogxr#&Yb9Bi?>7Ec(Zv~J)C!^%xcO4R-R{`n^&;@7eVb%L%*LZFy?c{kIIkDq_J zR~6rfyjYB+fK!gAd+Ym{U>k%4gEh3ZCbPx8%7OMnM$fhkX#>f5B-@HKu#5gk8gz5> zoadV1wtkPBm0wh!1jJhwEC!qOCUafRQkiG~y<1J5{LJ_R3t*!XUHynzq0tH7AClJF z6LA!P{0Pf^FVdGUKj-=3-*@l$L3|e-)zL5i=Lc!6bCc*1O~RpxE|z5&>kyz@w{N@1 z4^E42`?2IaEwM^2U{t;oL9k^`CeHuG~M3gGXlWgg8m>t@; zBfy5Wlj}a`PSl_l^ZI9>$!#klWKr)R*IW4E&YUh$`ix*dlzuXYsda<=J#>`P7;z<2 z&W&Ez1jK@z56?%>BR!g^$+s6XUk8T_gO^s3l?Z~$eSD9TT{*GN(5{iPpUIkRGC~9im@Abi_{{r%x&AEfX zTLVmZ@@F4x+ysoEATqR=d3wb`{hLsftZvmR6)zEG`?hWO6_l_=RM~iWlHWvcQr&YP?UXK=H$Vy1a= zsY_GPl@eA6qo*vHd+0`ymKUwjKP|0J5z5X|VqrQ=RQO;>w8QGh=j%ybFKQ@JFYy-b zIJ$%l-8HdU%Aey~eMCV8EW70AJizUD47wL_CQ2T?Ai#4g8Qy?V40v(i+(crWQ-$iL zC|V9_)I5ImDp7n3@)xDiK;VcH1F#TFLtad>kf~$r6|8_|OJYlxJbF55WVJveu{?W) zb%fiU7Ufso$Iu~n#snlfp;d2FW6ChlyBwFXqBn%gxB+q%$7a6D9vyENw#xPN`W^T6 zw`}i@%a0r*t8$>O4SkDcaTh$H;Fkw$Hg4V=EeEmD!J9j@^=@0yDk)N2hY#OSQXJ>C zPfm3d>5PWsdD~|)!U`5>9^XqlZQ0WMb*$d4r}5u|Nncs)(_uU?@${rVp0meB-<{b1 z#6VSa-^HuK;Tl4cyf0%m+yw_>9S?1e$sgE)!HCx0X4d`u;04f^6#*sz$h~$>kn#Mr zEv#Z8I+|9vdlI6x0|CCG<{W>eci)c% z&En1L27K8|2ua7xJG0{Zerqi*ki&+#K(-M@6SDrS)ik@oXbtnJ76=P$D1D{XWBczC zGbUnc7+OmTl!h%^CLtk><$w!~)LBxtJJ&B?(!tv{!woV*7R%3LOJyw$kBCvI{k-6T z1kqU&*Wd1s4prvhcqBqGX1hm=fr1d}%%vGW>y1~^R=i1BIm5p{$31eArEqx&j)*3k zGBX#Zy`hc~g{lDm`ww$D{DW3NI6kIO!qeia%LeR;_N?i(+@TGTS2!tTiK3f9^Y``M znwKwx4hO#}Bm#=_3g-b%o@k-pokh{mEOh?N{6%77rh@!Ut}4e8d*h1*-oA^kfhjv3 z@X;RygbeVn$*p}mcEh?JdidCN)w`d?wdN3gfvn8IkV$h+HhTyXE?!&)T)b;jp^!|h!JBd9pKR>dtu+UH> ze=~XI-1Qu;P##O8FaKAx1%Rn*z9x117}c*|Kcxx{M%u$(p0l9SVh>nqCoQSC67NiA z>}@rHWhE|9@bLvB386+R#K^-L-VdFR3GJw{5u*;boEG>$zaoluI!w7YmQuV>V;vf) zbgl%nm&nk3I7%3TJZXO~TsK!WHXDILm|aN)IO4`Sg@M<&VtqhV+_ynVV2+2ko><8d zKa?g-q5&qT{-=Nu%T#tU2bK#K3X>4R+yb#l)FL=^x{lp%LHN$!rEUHF`iiR1I#|8G z=>eW0puQ9W?5^0qkID!gbz|r&PFD&ld3ERZbBE!pz6%he|A11A!!|=D+A7jGHNY*C z#2J2mGA%lrLuy>d?*6NE@%NT4e8TkUNrV@=^)Z&Xsv{icf7FJ1keN~BU7#F7i=`2- zO!5MSV}82tO-=%BD&2`7di%ho}V?mrs^4R0K~`-Rt|FULPVF8ZlPF zH(7_DQwYtuqYhIRBEpcWf2q0Dx2@Op+$|@Tp*lt!GH|1w{Enz?J7kDfrs+8!oDpK8 zgV^&6z^lH34CoyPJ-0J5iYmw_(2JcObWL>O!SU8aX%q{>uTWy9AOnKK9zA0XH1mRm z3qx5IjL+6zr0+r6O{ViL#bAh**f*0tQ*2lG^r9<0{^75-KfSth?6jd=YToz8Gw4;% zdu6M(Cl@bTq*O5)l9&7nZMP>#6je#K1)(B zea>)BbZV+j1kRchWeC*2+d1q$_X4YW6G1hRVjxt+)bW4mbTP0(!mbjMfpIto_O(_S z8yh90ND$<99@D0~EV@ zzDevV*yF$mc-qC5L~RlIgpOD?GAg7zccvQ5fv}J!Sukjpi;)V_Ky*7DTmEEz{#xCm zL&)nXB64cndyB=ar>k+3HM7c~WRr)LnD5_jMttT0_WR{yJDTRE;k^B3I zTL3Z4t#AzOV%VNN9(JL%4dOP`{o>Fj4Wy+TnC{BAK%{_x-M)?IUms+by=a2w8dNu8SM)I@~$A{TwI}v1G4>1qr|pqQ-3{ z%iqrY2BqF))c3HzqtgrJTpOE}yx@Ici%rxONN}_RzfTCDT5ij!b8cak4SrWvIf9C! z)A&W^3h{On=|uD99p=pWV3J5t*y(%!Tyh>f0`|m|H6sP@LAAyHdUW_8F3(Bz8S8}(R%*RNboc23Kl}u;m z7g@jb99%8%>7}MB2dwd{ozR!$1^bCA#ugTz(sNOLIRRa?pEDH+M|yE$M(mz0+L`_X zeFMnKHX00FC!c;_aWSJCS`S?`2YQ{2D|22*%X#!`QuXSJ-~i6<7yt|(5`HK2>W3B< zGy4-4rN9^BeGT2KmL?~Q^1d5}XF7*7GH;O#W1)Rm{olvzMlCI}0|tMDbNZ>p+&(b8 zVeW4k`XmR)NMo}{QxPleeD9z5(>pIQ zTwcDIoJkB6S)z2DG~b6!>!fTZ>LP*?GcJ_|S62}wM%ji@Yz?F0J9y;C@fW3Z3jZ$F zuZD>2z*a@KChyD<%?s7M7i|eG5IT}aVlm?uw%qmN`nq2r-z4=dEyntb4(0g6QmT>G z6>1;*a|9tT`fVA6M~1kUB{eO}DTWuH5EPAZ6nFHFeVQY}E|?D=Be< z;(^P&e3syPpD7n#rCJ0USxLqj6#8=!~Ez*A5-4!+n8 z^Y6nkDe^p)geO$2`(Oi(>eT!5$=zuy`q2ouR5MbSe5Cs9YJ5` zvD$~S_d9R9eAu)`N^q-}_OTAGuH-F2zS^TKqfIrRH(!4%-O?xweJJO6T4ADBqB^1+ zyOrMI=K2S%=7JLld?9)YsuY%b@>(EP>7sC!+eaBw2Nir%cl{d=4u}A5JNjz_P0eY` z{{=!3a|OABX494WClV6a0O8KjxT%t+A&^S1U>yjgTy0$ud}vL89~6I_5La0)2~ za%g-h3zAR#L4})>;*UYxL@1b>(G_@JK^3Y$#H;O)#oW5(>^qmEX5xrO=NSm)G%a+p z-cadc54zZUye+jGz^l}5N{o&NNJ}5Ly%;Kfv)a-aK3nZU@e zEOpjPBF80rcbWa%o>eJC0v!g@qtC|iAovHwREBx&t)>QDCk`I=8jYb!#$n71g2xu2 z8YLg>Vg1i0JpZ@6moF5ZOp14?In5iVcqDMl4W*h!nJ_x-V76kkMi2p#0Jv_>;LK=4 z7OTgE2}%_U@pzFr)e`%{F%8C7_vcs64N{55S$To;jL3E)L|nOhKn+zkZ$s?&FwwEr zXgR(^AiHm0p7j>?6zM95fPhl-1Y4D={gH}HsFa~O zO{Ca$@LXKbv8y>zSuKTv&X$HTUh)zVT;?K`G$W#hATw*F|EH!ypuFjJ0pV=?UO&Kceb)RX;e5Ys5AswLbTbj zkNuFvh_n$_uNAx$<3M6m{P$KEZEphhz|e}1t}T69pu2P4UsY?F4h-kI!|vb@6z|o- zw?Ye`(lDO#$vd`oN;pM%7H6mQ?AdB$dN)-ucnf9;zbJzUa>3_-IkY6%VNhoaJJ}uFT zdVliEAMa8n7a7+|X>P?ih`K-80Oac<=suJxz@EI6bJ$eoaGVTvxKOK>S=Jo~R#aRO zxqoaK;_~9dLL>G|%wBK%uxqvTYf0gE<2zjP|DmbBv((YuWX?<+0ss|%u2bg-dfH0= zVFzoZ>xKg7u^l%3(R|7GTM6E_sa30wf=(ctKyWdDih5u{1&k4F(mB#_)GPyu~g**iFJHh354 zS|q_P1WJ^T)FoZVjjT3?bD8Ai0ZYsLfR4-~2|NrK20X0h{8spDgb3pIDXKVTz^>M5 zt-nJXsXA$`U65D<-^gr{h~|I&^@QbQP#wv8nBuPhQ^ zB4PHW+r;5@#Q3|^l?>q! zRVhlubO!Xrc>*!K7}P;7=tQ>kJNywrJ~kq`CFG+#c_^#|$+9Vs5d{JIZ(AQpfV9y-;LJuxo&_Q=fI%G1`gvdg9(IV5CSmtzFmt+f zp$@5>F#?Vtgyg-bd}0!5Icv1f;(23M=$G34ATZlvTT`5@ul)RoR!M|fk*l^$1nV@u za}JY9FjLL!H$QHRZYeokU8GcryD%{U-im@vE%QGW^vSQx9SiR;@#V|1mOAfwoN8cUh zeh*Qes_|mAwhl!k6A@cEnM3KthEK=l4PCZlVFCE{l+!Efm9j95RP3zZrViIXy^(1d z8E(f-eOArPq*ZKNIANWiwoa|p`5$otyhb}C6Vj6Ckw8busg1P85SOS$jFA!J40<@R zX?MQ}^8fh%V9{S`ttosEv<{neC@tGU@+?q@E&#fWGT3;q!GqLKO&cvjzT<<4UkHD( zQsAtNc8t}sKpH-^9GfMH z89FIta zVTvU>`bpD_uV6_sCkf7ttE#L^^1KiAX_$K$BcUK(7eT_wMfNyX%0w#X0XaQ;q)(6C zG7o;JcJ}PqF&|p+R9IdiN-;~cBw6{LYI~AH2$f}HAAPzgEl4Z#pO zyVyISPD);_rDDmL`@RLKJD`m8p`QxT9uN9v5VyY>eor<*WyNE4BBWaXaHwIl$Uejc zMttX>@qhLaIk8;32#_#XPsqC$P~5TXiCNHfk9AgiNd;j(SIkt1;RMR&G}YZy#kr-n zX{dbhqI6|`zpVEiMoXmy>pM&je-!kTr4%z@h9}dZeXTy;U!3Dqujpsg38&$0=&H9; z+}682_7EFbOl%t7{fHsM{7kl)CX#4kBD#%_RB#jqtwaOG$XWYt?-6q9Y5+!=Kre30 z^gy&FqEk;O67Y#lpPhS2Y^x?_+s#)PQ+q%`qsE+mwCeA-~=4Lr1-E2_wMUmzcmoMjfYTd{)jHP5#Ncp<|tcci=@u0B>&Za7n@W+oj zBteDJTA)RZBoJnoM!(%b7~d2g-YVSnA{Jo*#R*50D(UqXFSbs5!#O`H@vw<1Mi9s| z_;D->JFBKUQB>Yi6Z2@b9U%{p*;m&Y1)fkq@Ho;M=cKEB+`=5p7z%NwC_}?HZZq%= zsD|tknq=|t&^PMjBOxm&E(De&bMS_y7i-41?$&(KamKO)v>v*nXH4Fh`F5NFw^jWD z4-kRe66akd70yf;vAQ#zFm1|EwqJnAqgU^Xj2!F`TI+*Z<_@S=VdiD7-Yf(8>`=)A z)WtS7KYv@S8%V7wBQ?dP-=b1yAmrY!uCAEoKm#VOAFQeoo~xcRD2}g0c4;O9XEeBx zER6cg@~pYQ5BMuckmjh_7*2ZhZddql=a8n{wp!vVSgMSz=VUm8W!y6k|o= z{S5L0I@kq_Gp~PIw9&NgRl*|CfXi4JV?6d$R|MxSGamLQb&r5+JpQ!Iv~dfUp#KD7=Qn0rS8ql|dgaoSB0anrBIQJ@Lj%dnHvlLG!< zT+kttapiiEzG{_i+OfNy`!2@0f>HZeJ-8F83bA>{0o1@hV?X_=Ou(mBWUsMl<672SNnK;+1<#Y03Z?AioS?A*PKQXz6g`ea(5F zCj#)9BTFHDomlZQ={7&z1&c0l38{aX*va>N7Pj;jvaHaxVI|!@-y30!xHQB`y-jma zO=cx(q?PI)r=lq4V2gX~!K8l;=cAe{rJHWY;}PvVoMrZz_gQ$T#+Ce9NWjf1sd?`5 z<@I%YB5gn~aE}ox3{c$42_zVaA|ij~>=vb%&+!fV!>GXzB~>tI^WUXI)V<0L~nR(z#kXl6eyy z5CouCDRg(&*v8d;QMrk(9&Ar{FbWjhP}@B=8QL7shA-PW4Y`le??}`8`ks9l4%()yB2={77KW=wDCL8bML>G zR2L{-pMi_z*dw4)af<@Hak*KHS#vhi$6|&iQ;3vtg7s4VsG$Wog(S!62?zCo* zMl#Dx^^N|``0^uDYJHS|@82hOYJ|yN%)i0SyX_08wqa!dBymgUbU)doNq zmu^uAnB5-#fZ_)|f<`I6|4n+Mn2TIhc4~NU?W(#9sHtf1Ganv}ZC2D9L4p9VaxyxY zBytkbeB|~HkG=>Gh1z2`!fZPcUeJ!q!3b1=|EBM#=wy?qtbRcSgw{e7hggfO=dr7g z(!NU@4ywmM^=|}spXsk{rQg$BOgM8n0efF^_VEW+)Z_w~a^~T?t+|xLH%j&SH?=Q_ zZw9b%5_>@WbMiChB#CDvwCE?LTo8HHaA3`|s1m~q!j$M-1t4!PKW z5OzqMzJ(AZ0TF4pTz)!p7R;wwf(hkY!`!w;MuGu4`t zbm%{?(9CKlW*BwtQGMEhkrXSv+hct|d(F-aOKGW}{8cD&PVTR}pcG>a%+J_M0@#Nd zWFcf{aVC3aH7Yiz>=!pSqF3yH-0n|=Wb6obbHWU==r~v%?tW(IRa%YGr`x6rOgpN> zrkNfz=qp#R7JHG$^hvGF_xN{;Z2OV!hVw-P^Os`Gq}wKjA;=vz8j)Bs>LACHPzi-7 z%ZPHFb}RKeUVT%@Av!WC<~CfI7~5$F`VgdR1Ms1Vugi7Tc>v2kTdj@ek?4t(oJkq|_f52+W-6(0 z1-hqz5Vt-cUYuHbRtRkrDh&!b`YWY#;OqCuGoA4>SBf?cWYmxIjYaRxUnfx17_%(M z8=|Rxa|ZPnI=1)Es(Ox}yM>_=v4Yk_Li9x}XyxypYk%~GvVwTWsYjTI>@$J)znPFD z#b;?gyDd38@Bu(DMBr+j5Q`GCTjDsaF&b*SS{NHL= zY+5VD4AI^Ap7^tCFe3;&vrs2xgyKn%XpA892)<8pcH-z)4MLfJ9i0Br%Z|S@jyL&y zdatmI{|P6sr3?lCjl7sKcw>0|53gURJ{;pY>tgN451&pRTjC_1d*JDKVIIYGP8{V2uB7UuIr>y7A@mZ9CC= zD>L7mHIQIU>KZfur8(6zw($5GvAm-G{z5A_SYQp~g}d66e_U{BT>R(Lv~9@mpU(84 zm(@h_OG1S?zuJJ^p~T7hKg}p^aH`*HuCa`>wglm(IDO1eo&Z(ML1S+VFM&dd1Md$e z>Z53|?H!7LdACY0M)75goWW}o89h7%uq9^_%if0R>c6xEZ!ay)(>@A0Nc@~;v5%hS zoj89P!=gm!JolUeR*Q{B{5~eC^bev)&Rr7ahi(vxy+^M1A_)L9hoPqjXp2H6%DL-~ zBDQ4A4e{eXl0Mqnk(Fot^wUp>2DdanDB$67SK15W!eLYWwfE`x6!;1bezc&s(0u9# zfBz_~-nX5ZJ=Vpg4}I7BYpy`g1^TtDM!S=&jyt5m1JQROmw8M?l)iiY*UaB%+VyNAQ0q1bx=LdAZ_hbWuQL1qn`HZ5G8I;Cy?fa(=? z6VHC5o@Ive2!WAq-VzzZu&&z@E}O&gNa_{RIOM|P$jB*X+Z`5R2wF&ZB$F-|lMxxH z!s7#OMc%6zNiZfbxxXGSxKEA{#0?o3rvko+<{L`8$c=S(f0g&S2K6>(pj(!HF{E8N ztt^{d=VmzF*H;V5uHCKZ)}-e9JXW@7DBhtT?9s(Up$K1U?Z2p-;o{#^^p$dYYrzY% z7j3AwY12ICoH!1Qa$?TpMQ$lJs;QHVbQ+5dj%e2<|v$Zrw__X3Fu@~_4Ow>wrK1J^c>p?k-r=H`}ql}Mu%Q*rwM>TdnGVn+aeH(X;KbdC%EUC=E66{0%WC{5K#-^()dRaIri8`D#mNK{ zPSjLY0-8!eMhVDAhR+yWy_ZZ8Pz+~VBv~LurD@ulpzClV;-(lU&o3!b=cd`sDk?5^ z9yKZk_^Nvs14VLMGM$VE5}GjrRjQ!dNJQ7gmq7YjmKxRA%oz^Jjcd0*IcQBYBb6L` zt1+^Dx11;!?<43KC^7?BvRT)z(1G!NGB`e@m1^dk-k;YM?Yrvb>pOd78^x4$B9-$v zTT{Sr8Q|tS_40{j%c=q$(_;vMC>l%#4(G1$Yy50|{i6b{v+zXkScW0A6YvLiPWRA& zN1ow4%po|4%#t^%^aAPc+-%MFYZ#Z}>g?!vQTKg)+xy$0oCAa;XBU^9Z%%I3 z%tl_P!c{oW;$`!ng0Cb3XQeZ7q~>%|vGD{96^)6vkB?`Hs|*r}hbPmQlyI_|uojB* zIHhX-zFQPC0zy^GS;jKx;qD$TO$NGy!<&6NHJN?Gu3KRc{@0(f3?v|2i^9i9j=QMT$F6-50)87<%Z#8JCT*psqF&1nj*02%fq)R{)--gRd}jZ_TolZV_IYkv~ysveRuGR(Zr+n`hy9yM(RLg_WezT%P1e zu-+E5OP3?BH5E7;Qsv{Q4;-WYVDWkzT{UdIPK(sQKc79z3I@(ibTN@(k*|mY_~l0KABgV4@P)jL{Ha6!an;Z zAG)QzdGmQu6NO^-NcL*Nh&buN=U2Lmq0MC+ZYCZ2w7pm2xXxRe*DIGxNj!0McfT_) zAto{L@bSdx=qX*FzItUkefmGEG_@4LS1z_PnoF4sB(79ZLuCU-U3{Y}(Sl8|5Fah2pukJe1pL$d&IXv9hpHsCQ4_yZ34AdFYnRXan+L zC{@f6iiq4@rcO-=;G_ed9L=T>YGPr&df=Y8)~5#WabcmMDlu3XQ2w_1n8?Wm$VYdo z$8g-eRHG`^%;mHAb2sPe^ABy^+Dy*fp*6NA;m6G)j%{6t-)ua%q@0(v@qzn#Yn#{b zXM;63KN`*`=in`+=p~%RrKh_NTHE|OHK)jnyXHk=pJ@9UDb$^&zgLR56B{3|6)2c( zdDsG@7+Z65^Y=-%Ha71l$cn{;P%MrE|GIgmdt{ZCD5(j4vW2-UUZ2Io+q%qrZC6d0 z2Hj~jXn4e_fjQ|!5Wm^X(VIZe=DblvxTC_jagQOg`IUNMnk4QwGXAPoi`JtA8Z|mG zaVYr_?o&%@71^nj*rZFr8!01V#0#|Nsr@x(oWC1{^h@9aYMY)By2TcJgA<_(1)68( z{R#RxA!n}!eLaMcj_J0`PmAU%u1yn%DRKiMof{%Y=P;YW_`=$wLrhG4__N4Up^xeI zzMj$ri2L6R7(@}Vq*ySi)tnj0K^mOv>deweTw7J~(gF3P(hKya+3yqj$IX(tAn~d~ z0-m2a{|GT%sp1f7!!0j{Go2)&F(6dI}SbqqAo;* zhZH@V19utybT_P}7<~mbsSsvl5@cNgxrPM@-*js6Mjl99HLhmouUl9|R#~@V#kJ#K zOUwop=)^_AL**DS-7qFXyJFsn$G+bbgF82=Da;|@s0@_RkcH2fM*ogRSgC@C_xgQ| zqhsqrty# z{=!5lB1-EXJ_XqXk8gJ2GFA|lugoR$mU$I8VXh7LUTV`cB%7&MFH z^phNml$4a%goKo!OT8%~p-$!KuGwcAxCdXk!}Ks3_7FRlP98@HEZ^c(=x32QD6T% zOy8oEAb^B{s7Q6qU80SSWnX8<+*ynHAqw&9L}}mNc{EDfw~%yb_{G{r6N#e8321tQ za(??>bSvV2p%JP>!mV^)*u=yjYIuFUysq9iF~wD^U*=b8!3d=Y{;*1BXIVT-r{dyi zdqK{_pF5Hp#G(r!%E#5u?*5<%c5MFdy9*p29CPg07;0=8VsTr2+xPIKu~*Tbio{(G z-4WDh?FwBZ9GoTNz9b}#s04H-7S1m2Ig=`xs)!uaX4iQ%V!0|KZqNm&7()J-P`OXW zeyCaTWtPI4q9^WAL}i*2BD1M(o?RNWylwt-pFMt@JaU%I(SU(tBlgp`db(_68AVTP zs}UNF>E)(to_+K9B(wmPn@apFO(*qKOvw}ZF4rrRbO7~-Zp3}^S=_Ruc-d`l=FybD)3R_`_O{Q8~hoea6yYAD|M&z}#?s?=wY zqoboJedPVlskJ=R2 zClRp^L;e3g3Gsr6K8i^1U@%#NJEwGC+thuVb&J)vk}DrA>{ejM$Y7-7j@G(m7h*>|-xfbDBu}R@s7M;>pgfY8qNPF`qkP;J{_X ztQ4G(<+Es{K?{jx;)=;OY=|%$o-Ez6^XN;hdYts|@OXmonzYLbyA-&P1MQ#(y{AmM z1~=o|+u#c!F#x*Vh~q3Td_7>Qi^`TElt(HDrkAnKFpA3wxclKI8CRS+RSsOC8L#Jg zCt57Q>curs<_;K|kTat`&!tk6{vV;3s~pEH#sX*04s6_JnTf^3wyA(Ofp1ogm9u(U zE_nSX0}c-y?_Ij%F4A=AGbK?oIsiKD{r=ZW*agVcrM}$@ww3vPLZ_^LXjoBe z%UMD|12gImX#8k>eWp3)J#D%WE!O+DC%5(FJj2-7*lb+ZII}rFUcso}F8P5$1N2dY zQdTMnVd})e}MyH@$j{};p}O(O-`C+yy)!if6KFDqCw57!b@`I%nn&4 z#AjKhz>!*lW%GtQtRUF`B&RM?YNb&2zk>Q&#S6`d2+r8@VxU0V8GH2TXr1JN8Xu4UzsDPWyd{;c^|G2Xa*pV}>4YbQ z)VsK`Wi||Gq{z&*bY?^n&@p>}Giq}F#R$%mPLfyULWL`bstVxosB)j>^(p1ips^rE zaWKJgX%q30aXGiBL0WwIz;s01A5CgfATFU*cu>?%ajmfFnt`8prcwG%4g9xic#R6X z#9-4Xic>khHqPUO3N$io(%>dMgPuel6i@d23Rd^^xlP9J$cg9=6p6J)T>tOAm$ ziRfD0H#hNHOZImjvBT-!o2wa?HepWlx(rnh`ue1(Nym2_m6B8MT3;fWnTg2_w9HH} zU`HmNGX~RA`%05|CI1aEp?|rbO8!#T#}s}Z}k@LQ@ zSwihjT`z2U$4YBbI^N~nbB(WNX!5E0%~S2^MmdyM&ak2s5kUZ<%K!8c-K|BOqWR4A zNy^+y1=97I*gXM30K}jcAI@H2JIgGfEDc)FnGO@cLc0>;bs-Src>D5!{MX-Tw~K^R zMjyvclL-(+x|H6`uh?<9a`|%N-@${OrN%&th$lKf<_V`)OyV5)2cY|TxOAj&WR}#@!j}kH%h3Sz zV=@UZU5Ugptp z4uaY9M!=zb>}5s6c4dngds&LH%uTYF zLD|Vt8ZC&HF@_mSaa%&A5DlpYH4!OeXiOrll9UN;NZJgg-|M{Y%=dYIzvK7c^T%@^ z-{X5Ux$mp%zCNGNxxCN!`95*`l2rTpzIc5{Nj$Oz07;N6wS}6t3BfN|1tvp?06h#< zQQh-=tHW&_M@;p($#w46%>Ms$Tk3m7evNXhmhavqvt++c;v8jFF42?o96dbzhi%7jO#nWq5w<; zBFps6#Cc->``<#)Ku-e>!>b~!j$-S>e2Cy4u?+-+VAuea{E9FUwDXfv926t z-axTm!2{$_@Nkw5wrhL+J6#9Ih;M5ZeZ}2iiH%W8$8G`ahzGD*e_Ma$7K=kPg1~Bd z{`3zeann_nN3zK;hCi}T+tKQzLx9d4$2Q<#QZ6}(hVdn1c=CQn@29FpKpv-kE1mJ= zN7JC2wSPR^fp3oC4fU*}7)CH&l0NCGmDxd8uU2&r96M>8uGnNca+alK5QVlroD?#c zvuDoCARSWMCIQ|F3PL>_DdsZc8`U4nIMasXbszNDFSH%9r~Rxh+}`_zzEb}~&YMKf z);XHO1tbj#--({2@_}7WXn($rlAqXHH>cO0Va**S2?4JPIg~>_l_<6>D#}=+y>ByH zsIt)MCDp>|Xafl>Qq$9=J=Q#-sS+wu)f!?hAutoxF(K^&F4WMXpQCahM;?k2-V*?6`DLE4JK)_r-VYXsV+ipJ%d;UCXU}IxR1m*Sc`_oo?AitAj zS^78t{P)%vyH#CcsOOD~bxb!mYu0R$N!zNt135Hsr2>L5jl|{riQ|5`W*Q@s{JaoB3+X2PT0UL!`)32HUThApShU2^?#0L3dkts8vG82xMI%?wD)2LPJ*;NuQ6!(u{!8&xz4 z-Q&TYNTH2qi%Mzz&s~QEW!>3AH|48WNqKpMiBdX_Emwes!~s13h6TIla<*63?gq!M zoCVugt%#ozzU!$=WfUbKc}Xwb&oAfBnR5`h22(3V8i=OBP6O% zwx);8J%1u2oopzG70Br~;@@tp#8u~OhnThf2{sqy-FwCZ=mW&X9MnTa=+}(HAZ%Y> zsDsm*uB)!)=z-%(Pz$V52G$sl>h$(6?WSW)?_Ih@el+DZiLbFiUku16amUr0&e6l7 zN@u>9Ke8f%2Tcvt7Lk?)C*u*FsI@^qlbZBIxyYotV49Hi39QO!GAYDIO(#1EhLWCG z@bOOSQhj&H`M#lJrfno6DyA@gB3%?PrE^270wp|+As?THbj6J>`J<(<^@--BfxDWS zXEOdX_#{{D^YN-n;2cE(^M)gMDeP&GNtwzbGn+_;EaSM{uN^ixsb5U7|BEhdVKz$K zL@FnYbl{2Sg|aVf{@w6+hx-!43H5=aMl#^wM6ua;h_mjYCN`0l9@#opkP7i0&jslq5M16-+S35beWsN&}eyv*X*xMXsfvmxu zfy*SHhdkzsXIkq&YvIB$;l5&HfoBft>4YpTQNWvnTM7QVo|1U{<8u*6S_*j-TOYh| z0qrr2E}NM}?Fy$PB;#^Y=b=8Reg%+Jh%jFif-O!N%e{@hf`ZejWoi5M!X^wsJr$RnSw|N?JnuAWH-iD^Vcq5fO!<^5A_H8kq5?wP(gxkDaOp zny~eRu^KtzEchCu8z<8Ugm`N^D>BoQI^6%5l=Ez--tajy5 z@B8>A^&pQN5{-l+$+6&n=xJ!wmR6R+!a^y*1AUx4ITTQ|O=UY6L!!?G38u}YvmDYx zyI1PSBwd0mNvi5$9?JWo!3jpLcUDJ`s#SIGSzie#t+np48Za7t4RB|OXL?%N!-f8!U_(8>l77V$Vc!>_?KJptFCJLZnVDJ1$)*3-C0PNTOpIzz$RU@CNHy&I zXXv?7TFl3p^?!Ar#g#4`ZA!4^fVdr4*&jZhg#6t^9mh7i{d}Rx%F84*tY>jyqyA>l z4bgv_Z5*1MJd)%3? zlPzu%k~*Ql0Km@p#;XXXE`2ni7epPBI_EL$myeam(SRID<})lkFE7skFzf$uF};|) zlV-xC=r#>5>7kD!^u_z4wo8W5HV{)qQsOLl6}a^%GC)c~qRk(1YsFnlaG@%fQC~?|R z?ICEhIu}XCn=^Z2Zq3V+`RQT)c9))fA{+*%EMy0JapIubi{Q|@Vb61O9qv2SHQhV} zX(+4>aI7kNZ{q&JC~S|XXPRh&MP@gBQo^lvRc8da&8Lvp#H_JmnwO+M`L*!(rN0#c z%!@@p3@iIz|FS~|i5Uc8&<0XSSw(eAm|Ni>?jlz~v=S2P3LIXJM+4_cO8~<>s!*P@irs=Zw$g~k9t;39G_1&E z9qcbbgqK=48Pa{cN|;EcGGtQF>vPb-2&6omZ4rK0y>{&Z$JIAd{^>Ai*-yt@3j2UO zyxEGjMPjPs&x5a@JaGcW>0p|Lr09Z$tuzXep%XGRk}XBbCv)>Ce9waAB^ZccR5XS1 zMyrcXf_yfMM^uyGfbv@kuaOU%alN=`?|pIcmICHO`5rm*=`I;l3% z1RB^T&tm(wZTXCWJ*ZM`6K;v(3#l%e;g*QQu^l1X%IH$9)U9%_4(5o54`+v^`hO_v zC72GSMV0xq>~;$@TQ3=tI$*o@w5S^Aij~l&ocPmjeZtW6Z?vGoN3GVqbD`X08=869 zq1Vbwbucm4lapt`l1=}*>1ZjJ(to7(a|n%0uufuH_TG<9JnjK0@XGWxC@+L~GSOhN z7F)OMV#bT6n?+4CaPXM77gljRXMy8^2pXAl=515^L zUkS)M6A~ijcamr698w+p=@ky_WKy>vR+gtLb9pJ;ROA}hQDQS@Y>hllb}xE44+=LX zmlJqH&Ukol3B1I04u0T9#6WYbtfopDXDr7c%l^g}g0jjE=8Dn8o}r!%l$Vn!HjMe_ zX-i0O?}xg(yJxMB?=KUE^a?l}!lUcyld!^nKcjaRx^q^~uFJl5_lqWqX~RFh>ut+u zTk_QJdxRKOyCg3tNU1k8bKZt`4+@GtSOK8H`?~k8sT%oJ^hVg%Yjnk7P!{LwP2FHg z2^kAI@tliw7idL%ioP;`k(H)L$)~k+z*BOoxC~ zL=uWk(wQE^+77UO^uqTwdsS?=(1S%zl*)y0Jnh?XJ7`wSK*O$jcd>iA<7gTUGU{oL zy2Y+>F?}90vijYT$uhTF$mDqklC!h@bRXn{F?v)5AGA^jHpBqGoT(ykn_ zar%n=kdF}P&E4%2#_iTTvA;EJH+{NEXG$N=yGVcaiqfOP`qWZ>{%u&gs2pGk+Umo~ zHQk&}{6bViEno3geLwCm!Wep&zXc(>HCY|Wtl^SzY}hU=^kST%DkR0Fq%VQ0Z^d~& zFXO+ofl!yy6VfERQXA}&lZBgvL4AK1*N7GEtr29%_qA00I_41~h-NY291*(=Zo?^@ z%kYJTWCLW1#?=A%FX-D5PfA}V9NH_rjg(6hmo7aSIP1!_`3~=bc29H9N*i@dzkyFvzYfZHM~YQ4 z98cUR;U`~g4!GSlDuWj8BV%+nIG+{rmhL_nm3_%oi9Dr@3v$)EUAz3l!{PAdETX|i z#4G#zB&03r$IfObyd_==^WRG&gT2W=ct8YFLDW5X+=UVyL&>^X)3#3jprgaA@x1vv z4ML|={dl<);7`Q;i9dD5izIFNkl#k#F2j=T)5GmO$g8J#q&XdFQH8HQ1v4e-xi4*; z5trKVW!PpECah;-4`KBNgVFS*p;OdhtGgYpxr>AFcYAlndegJkymKmqaAEcfP1Yy7 zY9hWUx_2?(DYi8Q;za{uajKK)8#Y%}sidhHgoB}EhpBYp792?u`ofO8=0*rqs|3m8 zGsvQy+Hg}BC1ikoPig#B;Ns+mJT}LfBJG}^L;@hW&D>DRxh3!aMGER z(*%b>kZG)T$m*2dme-K5G2Ui4YikUsS=*~=ylL9#@{~ydKDWSJ;=)1bKQXZa>{_fN_ z4`FkVrd$;M1w!}l{ey^bc*(5ew$ezL&K6pg-3_;R_guV+KgHhsj?$h++HHcbL?TF- z3Ll6V>q5rYaWz(e1o#jthk&i8$pUvQ|HPx>k3|D*P*xT-N@3K2WzaggnwHOm&g(a2 zIi;_na3QTZB9w+>MR2w^9e-pCdttJDmQD26si6w@+>I~ja>Jx0$(jUp=NjyRLm)nc zg7mJV%@yOVuq60&xY0_8GSXldIIHR1r`-T&2l`7@cN;{?E7V*dgk6n5C6hy)b^_nuflAYrOu4B@yNsWU*dE7i2wUX*xbghYH?T;A5S%(cTP zN2vUnWkcS?oKoz^Nb>>+OK%1o={~1}XY*{4S1?%_?=V!C(`BV(gvh@sDbC%v7Zj@!9-v z6%2nUyl|K%my9QR3)cwTV-`ubGldgsDA2nh_s!n7Zy)&Sq3erm9BhdIrIlKfL@eEx z6<#?WikNZry<7N6vgemuU+pJuXE*O^{TU(X9`V581-FAfOo6g7C<>m-Wbb8X!e-8$ zYhoE^GY86ws<(OJLXz7{G83)L=$S6XO!QvvUAhLELua119*YyVy@7{wcSPntyc6Qt z+_?`LWUU0*k!AJmA?RQtB_5XsP3HA3Jym1xbilA6Zrb)KXV*LJZbLXLx=4_3!j0W% zC6e}pD7a=r=_uY|z!TEqP^o0*C49}NKnTnbu zO1FTV;`;=j5%_GwUId2<2WQecRHBJ^& zCF_VE(1yeDLh9(RuQiC5kH4jX^}nifPN* ztHaiOc&}~^;Pc&0erSA3WP*}2`f6`FDfk#Ci%`no=FOAt?i&NCJ0}?~wI`{WJwS7el zw?8=njv)1Tf)Qc7`F850cr^K0Eia8&2h`$1r`v#y(f4gqpr068cUAJc;?<#(32kz+ zmU6ySZo%?;(|Zo=Ojr~Kl8^uBNfv>nlOZQMZ4MbqFKuuHqB13neZIcr3OmI0U(ikl zBqIr_NkaTWdXL@*EruFahAa)k>1PlDP*D>RQbr0cUg%CeJil$s+aImBluQsX5gNY~ zj{Z~8>SaV>O3HlW=uBVh+;KKl476WQ0X%W43NFMOuCeeK-k3mbX!-&e&6l5GJ8gBy zuQCGBtDp7gI*&>%A@s{w7#VS6WZ%A%wXvcG+;dcnSVacVD7@rgB zSx+(N*>#h4a9gKGh;w~-c<)~E?n)!qb7#*Mc0UEw>7W+5Jfdl{JZEff7dfF(+tNrKO2e&C?!+k8g`|6<@tHxW@4%+0h$$pD@OhDeg zxRl&`vT?*oGMeh{|3UPK)-*@&RvGr|r_TSNiBavxnK@G{5E`dV%oq(*^sqr_1_>c+ z_(n^PQ2IOI%h-~lC2~9!Ux=99It*Oof&46^1JBVxFRUg4USQz;da`YaK}7TAG2%zU z=)*1Hgx|Tp%-Uq1QvRf-B)wNJBj=VE8rL6p`RU$fC$`_%HYGTqdlQ>af9c(M^lZm- z;TD;9%Z4uvYoFP^eelhl6PnMPKY#M6Hq*zNH=o{YYvb>GcH6eMo>s|7i1x{vEP|`|ZaWsdc1kr=nbXrd3JZVO|GIZMf`98o6VYB-w z`Ew{)Nfu^Z(IGhXZ1I-7k&@EDL4ITxDFW?U?fU!C?FfuI>yPm8xJ>Uwl+}TN_Z^$; z81pW_$Hk>eqwX9HX_3x+nFf(8D!Pj;0Trk4rh#u0W$QFr9%yX5Bjw4k)+?N4*OVEu z3p$|5rdI%Gpl6U+ZjX5N+?#q^ZEW^s<`H?@rH8tei6>h@4G1a&IqB_H@=rNQ57gSU z)i4^pXd=^SJAC;iV|KEi89|XRr-CzC;I2@cF-ray5~gBDgncJ}7bKD0>I5XV<>dqN z6ejH0NQWqj)^_suiYe6u=o;Fxz9tk3TY{?onkWmM>qD zF%Y1|wEo*=pu#nWcZ+OK|i zRA(=}+ePJWFC(}{3ZFi?ZCibgY&4CeGQK*dM_r|vV{O@~Q8S-}o*LY6VM;lsN^0@o z($7jZikDcEea-d5Zuw(B4;(4GX52I?Sa#R`S&^L$a(w5rdP*JkclUxVjbD|!EN?e4 z=vF_vs{|89%`6z~7sM$wn<7r54(jtYjg_zyZhvVt!IzhMyV44;SwEs9+$x)(I8nd3 ztkOizAPIyBNnaT<45ow0+v`oY1mEUxALaP+WJ@>QQpBy1ZU>9Y|)|&%wpkn z{&4-_>H;lj4$hQ@-tn@?%xCr^p4yL4Id>F>fcjt|Jy}{MPp7Vq&61V&_;Dx;x0>{v zN>WkEVQBUunJz^^pbqzX5;`^7q&mj@LvU=Qcd#<#?W=R3gg{Y+6w#BZ_lJO`zwOga zsqb~@P#YEykLc5>f#PAU^O9E1XakYk+_ChCyLD?d$e}>A&=EMdTP959s2@FglzSDq zO**sZ_V3@H$1Eg+W3Cn70*|NP@n!+@%3Xwu{U7rQ$xx1X@lkf12z86d8u(gZ>HF`I z>6Uk8fK;=Ou)f&K@sQe;{U8y4o?zJh}ny~+kLHdK2&Vr~DhYITy1@umT zQc*6Otb2S~(gT7IjrQ96tm4&lHd=M)LdBKc6%5!c9Z}fn)JKobK~Qo3qk%{8UD~qV zA6!4*IL3Gjm={|8d*{uYwmlMSne8Um$Uvpugzre)3MAv>;gBUjb7L zM=8lLP?je#NNmi={CI z?BtqJovsh0n8fvnmt}jaoni8`^!`dqm{tVZicsPG=dX@%{KYK^5g28KPxu;2^z67V zhs$pC9tf_f$+O&s-L$)x%m&6e?|NR}W6_2u-fmDuuGOuIAsETpFlzZ<2d3Ob+NXy& z6z{m)%fI*Gd}Fb=Oukk`!Uld0%S;ppuX(-L@MC&WDn9h7qcQV)PIvoy``d1Plm)J^ z6ZAB|*PV{x-`;eBJF#&6vCnd|>>@ihiEC|!&3V0eq)<&AHHc;jJWWYQ#wUPXiWqrV z$C!>`>A^77q~<5JF}(sZCxMo_%D%!W>uYRnZ95&?VC;7-H!Uq~%H7iJyi3%h?Q2io z1?fK$TgAB)*$w8%PbYF0X(T7-qb5=4uPO+0n$0yelCR6{`Kobv-VFvPta` zFA<+xg2aimK3^*(+LaDLoWJxqQIjy|zE_q6mpPSSARaL{@FeKbyK7_c6m)R7O6aIpuy0c5`%o}PZZUl>RCQ8G>IV(_4d)27{^+-d z;ee|DZX2`r#*^vvW0RKQ2?s>=gm*3M8R^%-R%3^y%|83>t>NUheQpdio7_|}Ev_Yn zcxbS{=PZi!?~$YwG5@O3qV5ux`1{BylUM!zs!Nd{O%v5PNq*$l735mH0=zR&f|SgS zb&$bdE8^-XIcL?K!$$@zjm#7Y3mzhouwtLOR6Ql~$^U-2-@dNnQA7NBf@T`lfd4_h z4UUMI!xqPJkzI=f1#ei^ZhOXe1dxgGv**k?6BQK|SL$o*RQPFN9i{6KOrA%e3_HP= zNR5tSnscr0qk*3bL;+K2maY|F z>Sokwz=DK-GGqUD$N41P9%)|3aVDy5zY&DYh2Q0hdfqDUxNrl{{01Q$0XriGjkX4{zh(X zEq$wVSQw`A?VgHxFQ4`Qq{x{pN69Xck?fQ*`T}|l;({M0p%KqR;C~swOtZI9Gx&3+D&2lfb(K>iQyQoX%CGZa{`B z<|=)G!=Bq`xTDeBQ9wgHx@#OP#-2UdUZw-TflWvC(h*9KxMeUPX*VaG@-+_<2Z#ug z%xDyeAV{ZlBPV!%LD^l!-gzv+X4JemJR*C<64GgH28NB5+M`zh0LP#Nzb2iGMSCml zX*h=>OT7m-m<#Vc$yCkEFb5usz!!uSBz;=Mcn>eG^rD2(J1DtNSo#`gLbgyB)-16e z4D1)!U8PYs;+4don)i@~Vb_wIZQ(Wy8Hw(W<>*>J<8lPf5%Z)|UjRaseY$vs>Skmi zV;2hG;{C+=$}^&~mMxb$OTbnCdulBPI6YFP6_EA1F2f1L))*n7EVORwsquD^@lWjK zXc4)<&Jw-@c@Q3jGK2JqigQ{D>m{IVdm1D8%{phwBI7<4TVY8a4k1f~b*;l9Z>%BZ zgqenD3%8)f5EdUjeaRQndVp79-wWaZm?_+N z>MNpS!KROSdWl_0?jdO~#vPUB%ZCOm43$y!&6_{6(3zyrp0qNJOG8CJB`K*pxn*4E z&1Ucdic&6dSMZ5?lK|1%pMpG50Q^VV7cmW4_t=H`1TjR61-BC2i zMN$^74M?C0;=~pU04T#yv?63$oj=KBkP#-#GE#Ln?WM?QY1vCd4(RChT=W+8U_71+ zI-ENdqmLH-zOkYn+rhM}UeBJgwY7oBTJGmy*_WR@U#FQC zU&@S}v)EV?$On}@PXu$$VHWB8)$|s7l(UY25Yq0@k@SW}f0B7zY4j}=KyN*i-D{GB z2{Gz%fny=OtCKuHy)*OQ?_^u>ij86GbzLSc{{&((XZ-`>nMEYMb7#SXyv7|d~cSWH=*U4 zHNlX%)i5y_Dukpq!djwGz$5fcE||T1`6&qFLP>f3`nCBU0|SFu;DLN5^vWw^6G5Oi zfb@CPv?R}^V++%E1fQxXWAEBU%CttI$He9CbNrBZpJp=~<}HDycz1HA9w!MDY=ct* z>#z9;mzc68K?O1_f6H>Xk|q6%1SdH8lRkD)Kj+De_$^d7^p7dZt)a=v44bm#}`UFHT8YEA_*$YxP_bRYh(T{)Xe5Ky8))>y( zQmm;5v(&%Q0yc8o{hNgSj8ZXF1(|}QnMs8YqWoA`o2J9nQ-z1@3dVd;4_j+h5yc)E zUG@5gszxdYpXOB{JGXnJqrcWR2y``NCG-kFDHd)HS=>$p#o^T(%2>w~7_f#x$pz`V zv7%qrn%}yA2;~|uf2311ZznMq{TfYPWvd!MK~uSvw&M@$W(9dn--nJfXxd{Huy|m; zhX!6@$Ix-g1j!{LRp9>>*>>N5(Mo{WZ0SS7oyk%l%>(e<(5psU2JXf zF}=~!LapjOAdc22GBfK`33*Z)lNqX;(}@*uvv$%`{X~(rP?wc?A4N9`k?cuUjv6 zR=PHmUKHuf2akEtyBnGzk5x}A-)6>voJNfaPm@EZRsJ<7zsbdu+X5}#8(r+7`-)x1 z&)C{y+4zaQ@{eYw9qH5q?WNZSb6(ZBuZYvV!L-qmX|I(L3`TnFUgIi&gI#3iixIki zRGJOyeZ5+o6(I@Iwj%$H^*=>zwGeD!k3?+htE=9xop$=8ow|l7jebv=oqATf^r`DytCgCE1KZrNImu zw(fO(&&%mm0car55-G!naB|M~FB9C#sQUwYBC@%AW9@s@o6i~G{?9G~CWOs#g>Md) zQvdf-<&YaY4yk=(qdo_6+@{Z)*H=T&@RA*Qy~uG?{1;;xyI$uN71Lji*RTA6s97@; zounOkM47>~qHC}=PXFaiPp%(!qx+>#L6ZKZ#qHp}%p`Fq5qhe-m|>eComTF0Vg@HpjjuVH%bT%u#CiL~f-9 zdBL>SL8pr^aCCcFi45Ce7z5eK560db_U=0 z^(gjx>%WRDHm~t}IKSwQd5a6auS$cDD`n=ko-Ho+*fxaxqByrsz?ar;|16hQM86N=ZS^m8 z5#bH(0q^vZbp``o>}Z2>yHA4iglld|;>J7uwrw|TOW0Js2sf(@q`>6we)vJnTw;B_ zRm@@-^m&hfjM|Og^}zJ4@5e%V5RMy&e)Wr$CRg$wL2;B?%M`7M<+e=vcmVPjjcjG| z4?UD2Kw7f~M3-p=ri70UJ~!LIGITaIBSv2b0Jb0Q)Ux(ZZ0&&DnHe=>$)iYR!byEX ztgcvSTY}p0#3^nRj`|kQClkH6yy(r#EGB^5*)}VgHZ)OJh&r`iH@62z{y9R&$ zwM0tz@dOq@_v*Go8C8r%IN?lgGD5w^E`! z{m0e`cpv4`^b2>m6xOd7cC62-{dBWeJ=5WoH`Wjh@ZW<*eyWu9mHrd3UlBk0@yGMm zK2f56r;C~3^W)(F diff --git a/third_party/rust/dtoa/src/diyfp.rs b/third_party/rust/dtoa/src/diyfp.rs deleted file mode 100644 index 758dde67d41f..000000000000 --- a/third_party/rust/dtoa/src/diyfp.rs +++ /dev/null @@ -1,232 +0,0 @@ -// Copyright 2016 Dtoa Developers -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use std::ops; - -#[derive(Copy, Clone, Debug)] -pub struct DiyFp { - pub f: F, - pub e: E, -} - -impl DiyFp { - pub fn new(f: F, e: E) -> Self { - DiyFp { f: f, e: e } - } -} - -impl ops::Mul for DiyFp { - type Output = Self; - fn mul(self, rhs: Self) -> Self { - let mut tmp = self.f as u64 * rhs.f as u64; - tmp += 1u64 << 31; // mult_round - DiyFp { - f: (tmp >> 32) as u32, - e: self.e + rhs.e + 32, - } - } -} - -impl ops::Mul for DiyFp { - type Output = Self; - fn mul(self, rhs: Self) -> Self { - let m32 = 0xFFFFFFFFu64; - let a = self.f >> 32; - let b = self.f & m32; - let c = rhs.f >> 32; - let d = rhs.f & m32; - let ac = a * c; - let bc = b * c; - let ad = a * d; - let bd = b * d; - let mut tmp = (bd >> 32) + (ad & m32) + (bc & m32); - tmp += 1u64 << 31; // mult_round - DiyFp { - f: ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), - e: self.e + rhs.e + 64, - } - } -} - -#[macro_export] -macro_rules! diyfp {( - floating_type: $fty:ty, - significand_type: $sigty:ty, - exponent_type: $expty:ty, - - diy_significand_size: $diy_significand_size:expr, - significand_size: $significand_size:expr, - exponent_bias: $exponent_bias:expr, - mask_type: $mask_type:ty, - exponent_mask: $exponent_mask:expr, - significand_mask: $significand_mask:expr, - hidden_bit: $hidden_bit:expr, - cached_powers_f: $cached_powers_f:expr, - cached_powers_e: $cached_powers_e:expr, - min_power: $min_power:expr, -) => { - -type DiyFp = diyfp::DiyFp<$sigty, $expty>; - -impl DiyFp { - // Preconditions: - // `d` must have a positive sign and must not be infinity or NaN. - /* - explicit DiyFp(double d) { - union { - double d; - uint64_t u64; - } u = { d }; - - int biased_e = static_cast((u.u64 & kDpExponentMask) >> kDpSignificandSize); - uint64_t significand = (u.u64 & kDpSignificandMask); - if (biased_e != 0) { - f = significand + kDpHiddenBit; - e = biased_e - kDpExponentBias; - } - else { - f = significand; - e = kDpMinExponent + 1; - } - } - */ - unsafe fn from(d: $fty) -> Self { - let u: $mask_type = mem::transmute(d); - - let biased_e = ((u & $exponent_mask) >> $significand_size) as $expty; - let significand = u & $significand_mask; - if biased_e != 0 { - DiyFp { - f: significand + $hidden_bit, - e: biased_e - $exponent_bias - $significand_size, - } - } else { - DiyFp { - f: significand, - e: 1 - $exponent_bias - $significand_size, - } - } - } - - // Normalizes so that the highest bit of the diy significand is 1. - /* - DiyFp Normalize() const { - DiyFp res = *this; - while (!(res.f & (static_cast(1) << 63))) { - res.f <<= 1; - res.e--; - } - return res; - } - */ - fn normalize(self) -> DiyFp { - let mut res = self; - while (res.f & (1 << ($diy_significand_size - 1))) == 0 { - res.f <<= 1; - res.e -= 1; - } - res - } - - // Normalizes so that the highest bit of the diy significand is 1. - // - // Precondition: - // `self.f` must be no more than 2 bits longer than the f64 significand. - /* - DiyFp NormalizeBoundary() const { - DiyFp res = *this; - while (!(res.f & (kDpHiddenBit << 1))) { - res.f <<= 1; - res.e--; - } - res.f <<= (kDiySignificandSize - kDpSignificandSize - 2); - res.e = res.e - (kDiySignificandSize - kDpSignificandSize - 2); - return res; - } - */ - fn normalize_boundary(self) -> DiyFp { - let mut res = self; - while (res.f & $hidden_bit << 1) == 0 { - res.f <<= 1; - res.e -= 1; - } - res.f <<= $diy_significand_size - $significand_size - 2; - res.e -= $diy_significand_size - $significand_size - 2; - res - } - - // Normalizes `self - e` and `self + e` where `e` is half of the least - // significant digit of `self`. The plus is normalized so that the highest - // bit of the diy significand is 1. The minus is normalized so that it has - // the same exponent as the plus. - // - // Preconditions: - // `self` must have been returned directly from `DiyFp::from_f64`. - // `self.f` must not be zero. - /* - void NormalizedBoundaries(DiyFp* minus, DiyFp* plus) const { - DiyFp pl = DiyFp((f << 1) + 1, e - 1).NormalizeBoundary(); - DiyFp mi = (f == kDpHiddenBit) ? DiyFp((f << 2) - 1, e - 2) : DiyFp((f << 1) - 1, e - 1); - mi.f <<= mi.e - pl.e; - mi.e = pl.e; - *plus = pl; - *minus = mi; - } - */ - fn normalized_boundaries(self) -> (DiyFp, DiyFp) { - let pl = DiyFp::new((self.f << 1) + 1, self.e - 1).normalize_boundary(); - let mut mi = if self.f == $hidden_bit { - DiyFp::new((self.f << 2) - 1, self.e - 2) - } else { - DiyFp::new((self.f << 1) - 1, self.e - 1) - }; - mi.f <<= mi.e - pl.e; - mi.e = pl.e; - (mi, pl) - } -} - -impl ops::Sub for DiyFp { - type Output = Self; - fn sub(self, rhs: Self) -> Self { - DiyFp { - f: self.f - rhs.f, - e: self.e, - } - } -} - -/* -inline DiyFp GetCachedPower(int e, int* K) { - //int k = static_cast(ceil((-61 - e) * 0.30102999566398114)) + 374; - double dk = (-61 - e) * 0.30102999566398114 + 347; // dk must be positive, so can do ceiling in positive - int k = static_cast(dk); - if (dk - k > 0.0) - k++; - - unsigned index = static_cast((k >> 3) + 1); - *K = -(-348 + static_cast(index << 3)); // decimal exponent no need lookup table - - return GetCachedPowerByIndex(index); -} -*/ -#[inline] -fn get_cached_power(e: $expty) -> (DiyFp, isize) { - let dk = (3 - $diy_significand_size - e) as f64 * 0.30102999566398114f64 - ($min_power + 1) as f64; - let mut k = dk as isize; - if dk - k as f64 > 0.0 { - k += 1; - } - - let index = ((k >> 3) + 1) as usize; - let k = -($min_power + (index << 3) as isize); - - (DiyFp::new($cached_powers_f[index], $cached_powers_e[index] as $expty), k) -} - -}} diff --git a/third_party/rust/dtoa/src/dtoa.rs b/third_party/rust/dtoa/src/dtoa.rs deleted file mode 100644 index 5c10833d1738..000000000000 --- a/third_party/rust/dtoa/src/dtoa.rs +++ /dev/null @@ -1,479 +0,0 @@ -// Copyright 2016 Dtoa Developers -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -#[macro_export] -macro_rules! dtoa {( - floating_type: $fty:ty, - significand_type: $sigty:ty, - exponent_type: $expty:ty, - $($diyfp_param:ident: $diyfp_value:tt,)* -) => { - -diyfp! { - floating_type: $fty, - significand_type: $sigty, - exponent_type: $expty, - $($diyfp_param: $diyfp_value,)* -}; - -/* -inline void GrisuRound(char* buffer, int len, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w) { - while (rest < wp_w && delta - rest >= ten_kappa && - (rest + ten_kappa < wp_w || /// closer - wp_w - rest > rest + ten_kappa - wp_w)) { - buffer[len - 1]--; - rest += ten_kappa; - } -} -*/ - -#[inline] -unsafe fn grisu_round(buffer: *mut u8, len: isize, delta: $sigty, mut rest: $sigty, ten_kappa: $sigty, wp_w: $sigty) { - while rest < wp_w && delta - rest >= ten_kappa && - (rest + ten_kappa < wp_w || // closer - wp_w - rest > rest + ten_kappa - wp_w) { - *buffer.offset(len - 1) -= 1; - rest += ten_kappa; - } -} - -/* -inline unsigned CountDecimalDigit32(uint32_t n) { - // Simple pure C++ implementation was faster than __builtin_clz version in this situation. - if (n < 10) return 1; - if (n < 100) return 2; - if (n < 1000) return 3; - if (n < 10000) return 4; - if (n < 100000) return 5; - if (n < 1000000) return 6; - if (n < 10000000) return 7; - if (n < 100000000) return 8; - // Will not reach 10 digits in DigitGen() - //if (n < 1000000000) return 9; - //return 10; - return 9; -} -*/ - -#[inline] -fn count_decimal_digit32(n: u32) -> usize { - if n < 10 { 1 } - else if n < 100 { 2 } - else if n < 1000 { 3 } - else if n < 10000 { 4 } - else if n < 100000 { 5 } - else if n < 1000000 { 6 } - else if n < 10000000 { 7 } - else if n < 100000000 { 8 } - // Will not reach 10 digits in digit_gen() - else { 9 } -} - -/* -inline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buffer, int* len, int* K) { - static const uint32_t kPow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; - const DiyFp one(uint64_t(1) << -Mp.e, Mp.e); - const DiyFp wp_w = Mp - W; - uint32_t p1 = static_cast(Mp.f >> -one.e); - uint64_t p2 = Mp.f & (one.f - 1); - unsigned kappa = CountDecimalDigit32(p1); // kappa in [0, 9] - *len = 0; -*/ - -// Returns length and k. -#[inline] -unsafe fn digit_gen(w: DiyFp, mp: DiyFp, mut delta: $sigty, buffer: *mut u8, mut k: isize) -> (isize, isize) { - static POW10: [$sigty; 10] = [ 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 ]; - let one = DiyFp::new(1 << -mp.e, mp.e); - let wp_w = mp - w; - let mut p1 = (mp.f >> -one.e) as u32; - let mut p2 = mp.f & (one.f - 1); - let mut kappa = count_decimal_digit32(p1); // kappa in [0, 9] - let mut len = 0; - - /* - while (kappa > 0) { - uint32_t d = 0; - switch (kappa) { - case 9: d = p1 / 100000000; p1 %= 100000000; break; - case 8: d = p1 / 10000000; p1 %= 10000000; break; - case 7: d = p1 / 1000000; p1 %= 1000000; break; - case 6: d = p1 / 100000; p1 %= 100000; break; - case 5: d = p1 / 10000; p1 %= 10000; break; - case 4: d = p1 / 1000; p1 %= 1000; break; - case 3: d = p1 / 100; p1 %= 100; break; - case 2: d = p1 / 10; p1 %= 10; break; - case 1: d = p1; p1 = 0; break; - default:; - } - if (d || *len) - buffer[(*len)++] = static_cast('0' + static_cast(d)); - kappa--; - uint64_t tmp = (static_cast(p1) << -one.e) + p2; - if (tmp <= delta) { - *K += kappa; - GrisuRound(buffer, *len, delta, tmp, static_cast(kPow10[kappa]) << -one.e, wp_w.f); - return; - } - } - */ - while kappa > 0 { - let mut d = 0u32; - match kappa { - 9 => { d = p1 / 100000000; p1 %= 100000000; } - 8 => { d = p1 / 10000000; p1 %= 10000000; } - 7 => { d = p1 / 1000000; p1 %= 1000000; } - 6 => { d = p1 / 100000; p1 %= 100000; } - 5 => { d = p1 / 10000; p1 %= 10000; } - 4 => { d = p1 / 1000; p1 %= 1000; } - 3 => { d = p1 / 100; p1 %= 100; } - 2 => { d = p1 / 10; p1 %= 10; } - 1 => { d = p1; p1 = 0; } - _ => {} - } - if d != 0 || len != 0 { - *buffer.offset(len) = b'0' + d as u8; - len += 1; - } - kappa -= 1; - let tmp = (p1 as $sigty << -one.e) + p2; - if tmp <= delta { - k += kappa as isize; - grisu_round(buffer, len, delta, tmp, POW10[kappa] << -one.e, wp_w.f); - return (len, k); - } - } - - // kappa = 0 - /* - for (;;) { - p2 *= 10; - delta *= 10; - char d = static_cast(p2 >> -one.e); - if (d || *len) - buffer[(*len)++] = static_cast('0' + d); - p2 &= one.f - 1; - kappa--; - if (p2 < delta) { - *K += kappa; - int index = -static_cast(kappa); - GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * (index < 9 ? kPow10[-static_cast(kappa)] : 0)); - return; - } - } - */ - loop { - p2 *= 10; - delta *= 10; - let d = (p2 >> -one.e) as u8; - if d != 0 || len != 0 { - *buffer.offset(len) = b'0' + d; - len += 1; - } - p2 &= one.f - 1; - kappa = kappa.wrapping_sub(1); - if p2 < delta { - k += kappa as isize; - let index = -(kappa as isize); - grisu_round(buffer, len, delta, p2, one.f, wp_w.f * if index < 9 { POW10[-(kappa as isize) as usize] } else { 0 }); - return (len, k); - } - } -} - -/* -inline void Grisu2(double value, char* buffer, int* length, int* K) { - const DiyFp v(value); - DiyFp w_m, w_p; - v.NormalizedBoundaries(&w_m, &w_p); - - const DiyFp c_mk = GetCachedPower(w_p.e, K); - const DiyFp W = v.Normalize() * c_mk; - DiyFp Wp = w_p * c_mk; - DiyFp Wm = w_m * c_mk; - Wm.f++; - Wp.f--; - DigitGen(W, Wp, Wp.f - Wm.f, buffer, length, K); -} -*/ - -// Returns length and k. -#[inline] -unsafe fn grisu2(value: $fty, buffer: *mut u8) -> (isize, isize) { - let v = DiyFp::from(value); - let (w_m, w_p) = v.normalized_boundaries(); - - let (c_mk, k) = get_cached_power(w_p.e); - let w = v.normalize() * c_mk; - let mut wp = w_p * c_mk; - let mut wm = w_m * c_mk; - wm.f += 1; - wp.f -= 1; - digit_gen(w, wp, wp.f - wm.f, buffer, k) -} - -/* -inline char* WriteExponent(int K, char* buffer) { - if (K < 0) { - *buffer++ = '-'; - K = -K; - } - - if (K >= 100) { - *buffer++ = static_cast('0' + static_cast(K / 100)); - K %= 100; - const char* d = GetDigitsLut() + K * 2; - *buffer++ = d[0]; - *buffer++ = d[1]; - } - else if (K >= 10) { - const char* d = GetDigitsLut() + K * 2; - *buffer++ = d[0]; - *buffer++ = d[1]; - } - else - *buffer++ = static_cast('0' + static_cast(K)); - - return buffer; -} -*/ - -#[inline] -unsafe fn write_exponent(mut k: isize, mut buffer: *mut u8) -> *mut u8 { - if k < 0 { - *buffer = b'-'; - buffer = buffer.offset(1); - k = -k; - } - - if k >= 100 { - *buffer = b'0' + (k / 100) as u8; - k %= 100; - let d = DEC_DIGITS_LUT.as_ptr().offset(k * 2); - ptr::copy_nonoverlapping(d, buffer.offset(1), 2); - buffer.offset(3) - } else if k >= 10 { - let d = DEC_DIGITS_LUT.as_ptr().offset(k * 2); - ptr::copy_nonoverlapping(d, buffer, 2); - buffer.offset(2) - } else { - *buffer = b'0' + k as u8; - buffer.offset(1) - } -} - -/* -inline char* Prettify(char* buffer, int length, int k, int maxDecimalPlaces) { - const int kk = length + k; // 10^(kk-1) <= v < 10^kk -*/ - -#[inline] -unsafe fn prettify(buffer: *mut u8, length: isize, k: isize) -> *mut u8 { - let kk = length + k; // 10^(kk-1) <= v < 10^kk - - /* - if (0 <= k && kk <= 21) { - // 1234e7 -> 12340000000 - for (int i = length; i < kk; i++) - buffer[i] = '0'; - buffer[kk] = '.'; - buffer[kk + 1] = '0'; - return &buffer[kk + 2]; - } - */ - if 0 <= k && kk <= 21 { - // 1234e7 -> 12340000000 - for i in length..kk { - *buffer.offset(i) = b'0'; - } - *buffer.offset(kk) = b'.'; - *buffer.offset(kk + 1) = b'0'; - buffer.offset(kk + 2) - } - - /* - else if (0 < kk && kk <= 21) { - // 1234e-2 -> 12.34 - std::memmove(&buffer[kk + 1], &buffer[kk], static_cast(length - kk)); - buffer[kk] = '.'; - if (0 > k + maxDecimalPlaces) { - // When maxDecimalPlaces = 2, 1.2345 -> 1.23, 1.102 -> 1.1 - // Remove extra trailing zeros (at least one) after truncation. - for (int i = kk + maxDecimalPlaces; i > kk + 1; i--) - if (buffer[i] != '0') - return &buffer[i + 1]; - return &buffer[kk + 2]; // Reserve one zero - } - else - return &buffer[length + 1]; - } - */ - else if 0 < kk && kk <= 21 { - // 1234e-2 -> 12.34 - ptr::copy(buffer.offset(kk), buffer.offset(kk + 1), (length - kk) as usize); - *buffer.offset(kk) = b'.'; - if 0 > k + MAX_DECIMAL_PLACES { - // When MAX_DECIMAL_PLACES = 2, 1.2345 -> 1.23, 1.102 -> 1.1 - // Remove extra trailing zeros (at least one) after truncation. - for i in (kk + 2 .. kk + MAX_DECIMAL_PLACES + 1).rev() { - if *buffer.offset(i) != b'0' { - return buffer.offset(i + 1); - } - } - buffer.offset(kk + 2) // Reserve one zero - } else { - buffer.offset(length + 1) - } - } - - /* - else if (-6 < kk && kk <= 0) { - // 1234e-6 -> 0.001234 - const int offset = 2 - kk; - std::memmove(&buffer[offset], &buffer[0], static_cast(length)); - buffer[0] = '0'; - buffer[1] = '.'; - for (int i = 2; i < offset; i++) - buffer[i] = '0'; - if (length - kk > maxDecimalPlaces) { - // When maxDecimalPlaces = 2, 0.123 -> 0.12, 0.102 -> 0.1 - // Remove extra trailing zeros (at least one) after truncation. - for (int i = maxDecimalPlaces + 1; i > 2; i--) - if (buffer[i] != '0') - return &buffer[i + 1]; - return &buffer[3]; // Reserve one zero - } - else - return &buffer[length + offset]; - } - */ - else if -6 < kk && kk <= 0 { - // 1234e-6 -> 0.001234 - let offset = 2 - kk; - ptr::copy(buffer, buffer.offset(offset), length as usize); - *buffer = b'0'; - *buffer.offset(1) = b'.'; - for i in 2..offset { - *buffer.offset(i) = b'0'; - } - if length - kk > MAX_DECIMAL_PLACES { - // When MAX_DECIMAL_PLACES = 2, 0.123 -> 0.12, 0.102 -> 0.1 - // Remove extra trailing zeros (at least one) after truncation. - for i in (3 .. MAX_DECIMAL_PLACES + 2).rev() { - if *buffer.offset(i) != b'0' { - return buffer.offset(i + 1); - } - } - buffer.offset(3) // Reserve one zero - } else { - buffer.offset(length + offset) - } - } - - /* - else if (kk < -maxDecimalPlaces) { - // Truncate to zero - buffer[0] = '0'; - buffer[1] = '.'; - buffer[2] = '0'; - return &buffer[3]; - } - */ - else if kk < -MAX_DECIMAL_PLACES { - *buffer = b'0'; - *buffer.offset(1) = b'.'; - *buffer.offset(2) = b'0'; - buffer.offset(3) - } - - /* - else if (length == 1) { - // 1e30 - buffer[1] = 'e'; - return WriteExponent(kk - 1, &buffer[2]); - } - */ - else if length == 1 { - // 1e30 - *buffer.offset(1) = b'e'; - write_exponent(kk - 1, buffer.offset(2)) - } - - /* - else { - // 1234e30 -> 1.234e33 - std::memmove(&buffer[2], &buffer[1], static_cast(length - 1)); - buffer[1] = '.'; - buffer[length + 1] = 'e'; - return WriteExponent(kk - 1, &buffer[0 + length + 2]); - } - */ - else { - // 1234e30 -> 1.234e33 - ptr::copy(buffer.offset(1), buffer.offset(2), (length - 1) as usize); - *buffer.offset(1) = b'.'; - *buffer.offset(length + 1) = b'e'; - write_exponent(kk - 1, buffer.offset(length + 2)) - } -} - -/* -inline char* dtoa(double value, char* buffer, int maxDecimalPlaces = 324) { - RAPIDJSON_ASSERT(maxDecimalPlaces >= 1); - Double d(value); - if (d.IsZero()) { - if (d.Sign()) - *buffer++ = '-'; // -0.0, Issue #289 - buffer[0] = '0'; - buffer[1] = '.'; - buffer[2] = '0'; - return &buffer[3]; - } - else { - if (value < 0) { - *buffer++ = '-'; - value = -value; - } - int length, K; - Grisu2(value, buffer, &length, &K); - return Prettify(buffer, length, K, maxDecimalPlaces); - } -} -*/ - -#[inline] -unsafe fn dtoa(mut wr: W, mut value: $fty) -> io::Result { - if value == 0.0 { - if value.is_sign_negative() { - try!(wr.write_all(b"-0.0")); - Ok(4) - } else { - try!(wr.write_all(b"0.0")); - Ok(3) - } - } else { - let negative = value < 0.0; - if negative { - try!(wr.write_all(b"-")); - value = -value; - } - let mut buffer: [u8; 24] = mem::uninitialized(); - let buf_ptr = buffer.as_mut_ptr(); - let (length, k) = grisu2(value, buf_ptr); - let end = prettify(buf_ptr, length, k); - let len = end as usize - buf_ptr as usize; - try!(wr.write_all(slice::from_raw_parts(buf_ptr, len))); - if negative { - Ok(len + 1) - } else { - Ok(len) - } - } -} - -}} diff --git a/third_party/rust/dtoa/src/lib.rs b/third_party/rust/dtoa/src/lib.rs deleted file mode 100644 index 0970fe3316c2..000000000000 --- a/third_party/rust/dtoa/src/lib.rs +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2016 Dtoa Developers -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -#[macro_use] mod diyfp; -#[macro_use] mod dtoa; - -use std::{io, mem, ops, ptr, slice}; - -#[inline] -pub fn write(wr: W, value: V) -> io::Result { - value.write(wr) -} - -pub trait Floating { - fn write(self, W) -> io::Result; -} - -impl Floating for f32 { - fn write(self, wr: W) -> io::Result { - dtoa! { - floating_type: f32, - significand_type: u32, - exponent_type: i32, - - diy_significand_size: 32, - significand_size: 23, - exponent_bias: 0x7F, - mask_type: u32, - exponent_mask: 0x7F800000, - significand_mask: 0x007FFFFF, - hidden_bit: 0x00800000, - cached_powers_f: CACHED_POWERS_F_32, - cached_powers_e: CACHED_POWERS_E_32, - min_power: (-36), - }; - unsafe { dtoa(wr, self) } - } -} - -impl Floating for f64 { - fn write(self, wr: W) -> io::Result { - dtoa! { - floating_type: f64, - significand_type: u64, - exponent_type: isize, - - diy_significand_size: 64, - significand_size: 52, - exponent_bias: 0x3FF, - mask_type: u64, - exponent_mask: 0x7FF0000000000000, - significand_mask: 0x000FFFFFFFFFFFFF, - hidden_bit: 0x0010000000000000, - cached_powers_f: CACHED_POWERS_F_64, - cached_powers_e: CACHED_POWERS_E_64, - min_power: (-348), - }; - unsafe { dtoa(wr, self) } - } -} - -//////////////////////////////////////////////////////////////////////////////// - -const MAX_DECIMAL_PLACES: isize = 324; - -static DEC_DIGITS_LUT: &'static [u8] = - b"0001020304050607080910111213141516171819\ - 2021222324252627282930313233343536373839\ - 4041424344454647484950515253545556575859\ - 6061626364656667686970717273747576777879\ - 8081828384858687888990919293949596979899"; - -// 10^-36, 10^-28, ..., 10^52 -static CACHED_POWERS_F_32: [u32; 12] = [ - 0xaa242499, 0xfd87b5f3, 0xbce50865, 0x8cbccc09, - 0xd1b71759, 0x9c400000, 0xe8d4a510, 0xad78ebc6, - 0x813f3979, 0xc097ce7c, 0x8f7e32ce, 0xd5d238a5, -]; - -static CACHED_POWERS_E_32: [i16; 12] = [ - -151, -125, -98, -71, -45, -18, 8, 35, 62, 88, 115, 141, -]; - -// 10^-348, 10^-340, ..., 10^340 -static CACHED_POWERS_F_64: [u64; 87] = [ - 0xfa8fd5a0081c0288, 0xbaaee17fa23ebf76, - 0x8b16fb203055ac76, 0xcf42894a5dce35ea, - 0x9a6bb0aa55653b2d, 0xe61acf033d1a45df, - 0xab70fe17c79ac6ca, 0xff77b1fcbebcdc4f, - 0xbe5691ef416bd60c, 0x8dd01fad907ffc3c, - 0xd3515c2831559a83, 0x9d71ac8fada6c9b5, - 0xea9c227723ee8bcb, 0xaecc49914078536d, - 0x823c12795db6ce57, 0xc21094364dfb5637, - 0x9096ea6f3848984f, 0xd77485cb25823ac7, - 0xa086cfcd97bf97f4, 0xef340a98172aace5, - 0xb23867fb2a35b28e, 0x84c8d4dfd2c63f3b, - 0xc5dd44271ad3cdba, 0x936b9fcebb25c996, - 0xdbac6c247d62a584, 0xa3ab66580d5fdaf6, - 0xf3e2f893dec3f126, 0xb5b5ada8aaff80b8, - 0x87625f056c7c4a8b, 0xc9bcff6034c13053, - 0x964e858c91ba2655, 0xdff9772470297ebd, - 0xa6dfbd9fb8e5b88f, 0xf8a95fcf88747d94, - 0xb94470938fa89bcf, 0x8a08f0f8bf0f156b, - 0xcdb02555653131b6, 0x993fe2c6d07b7fac, - 0xe45c10c42a2b3b06, 0xaa242499697392d3, - 0xfd87b5f28300ca0e, 0xbce5086492111aeb, - 0x8cbccc096f5088cc, 0xd1b71758e219652c, - 0x9c40000000000000, 0xe8d4a51000000000, - 0xad78ebc5ac620000, 0x813f3978f8940984, - 0xc097ce7bc90715b3, 0x8f7e32ce7bea5c70, - 0xd5d238a4abe98068, 0x9f4f2726179a2245, - 0xed63a231d4c4fb27, 0xb0de65388cc8ada8, - 0x83c7088e1aab65db, 0xc45d1df942711d9a, - 0x924d692ca61be758, 0xda01ee641a708dea, - 0xa26da3999aef774a, 0xf209787bb47d6b85, - 0xb454e4a179dd1877, 0x865b86925b9bc5c2, - 0xc83553c5c8965d3d, 0x952ab45cfa97a0b3, - 0xde469fbd99a05fe3, 0xa59bc234db398c25, - 0xf6c69a72a3989f5c, 0xb7dcbf5354e9bece, - 0x88fcf317f22241e2, 0xcc20ce9bd35c78a5, - 0x98165af37b2153df, 0xe2a0b5dc971f303a, - 0xa8d9d1535ce3b396, 0xfb9b7cd9a4a7443c, - 0xbb764c4ca7a44410, 0x8bab8eefb6409c1a, - 0xd01fef10a657842c, 0x9b10a4e5e9913129, - 0xe7109bfba19c0c9d, 0xac2820d9623bf429, - 0x80444b5e7aa7cf85, 0xbf21e44003acdd2d, - 0x8e679c2f5e44ff8f, 0xd433179d9c8cb841, - 0x9e19db92b4e31ba9, 0xeb96bf6ebadf77d9, - 0xaf87023b9bf0ee6b, -]; -static CACHED_POWERS_E_64: [i16; 87] = [ - -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, - -954, -927, -901, -874, -847, -821, -794, -768, -741, -715, - -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, - -422, -396, -369, -343, -316, -289, -263, -236, -210, -183, - -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, - 109, 136, 162, 189, 216, 242, 269, 295, 322, 348, - 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, - 641, 667, 694, 720, 747, 774, 800, 827, 853, 880, - 907, 933, 960, 986, 1013, 1039, 1066, -]; diff --git a/third_party/rust/dtoa/tests/test.rs b/third_party/rust/dtoa/tests/test.rs deleted file mode 100644 index 4f92d7ee13d1..000000000000 --- a/third_party/rust/dtoa/tests/test.rs +++ /dev/null @@ -1,38 +0,0 @@ -extern crate dtoa; - -use std::str; - -#[test] -fn test_f64() { - test_write(1.234e20f64, "123400000000000000000.0"); - test_write(1.234e21f64, "1.234e21"); - test_write(2.71828f64, "2.71828"); - test_write(0.0f64, "0.0"); - test_write(-0.0f64, "-0.0"); - test_write(1.1e128f64, "1.1e128"); - test_write(1.1e-64f64, "1.1e-64"); - test_write(2.718281828459045f64, "2.718281828459045"); - test_write(5e-324f64, "5e-324"); - test_write(::std::f64::MAX, "1.7976931348623157e308"); -} - -#[test] -fn test_f32() { - test_write(1.234e20f32, "123400000000000000000.0"); - test_write(1.234e21f32, "1.234e21"); - test_write(2.71828f32, "2.71828"); - test_write(0.0f32, "0.0"); - test_write(-0.0f32, "-0.0"); - test_write(1.1e32f32, "1.1e32"); - test_write(1.1e-32f32, "1.1e-32"); - test_write(2.7182817f32, "2.7182817"); - test_write(1e-45f32, "1e-45"); - test_write(::std::f32::MAX, "3.4028235e38"); -} - -fn test_write(value: F, expected: &'static str) { - let mut buf = [b'\0'; 30]; - let len = dtoa::write(&mut buf[..], value).unwrap(); - let result = str::from_utf8(&buf[..len]).unwrap(); - assert_eq!(result, expected.to_string()); -} diff --git a/third_party/rust/itoa/.cargo-checksum.json b/third_party/rust/itoa/.cargo-checksum.json deleted file mode 100644 index dc9ce97cab9c..000000000000 --- a/third_party/rust/itoa/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"f9b1ca6ae27d1c18215265024629a8960c31379f206d9ed20f64e0b2dcf79805",".travis.yml":"a2b867b2e28af9bde20a669a6ff0f366ecc5150b89314cd7ec97ed95bb427547","Cargo.toml":"82b9e862ca8c12656987883e7339d992b770b2a8b23a9cd9ceb5ae0083252687","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"e18259ab3aa7f39a194795bdad8039b3c5fd544f6dd922526c9326c44842b76d","README.md":"f2b713cdc7ade373c4a733c09693cecd288201ec76bde725de65b4ff74530284","benches/bench.rs":"3e7075b70a899ab1e926403856afeb04b34a254b234bbca834f6136a703008a3","performance.png":"a6e70647a44084e65cedaaff3633b0624b37e0f0a84457362c1e078fb56c877d","src/lib.rs":"16169ef9fc6c6a6521daff8fefdfc1b54f4ce145763b9733308d6631dad4d14e","tests/test.rs":"9c7629f758e2833757c15617cd8c1ec2a2fb8437865d05b5d20abb07279d35ea"},"package":"eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c"} \ No newline at end of file diff --git a/third_party/rust/itoa/.cargo-ok b/third_party/rust/itoa/.cargo-ok deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/third_party/rust/itoa/.gitignore b/third_party/rust/itoa/.gitignore deleted file mode 100644 index a9d37c560c6a..000000000000 --- a/third_party/rust/itoa/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -target -Cargo.lock diff --git a/third_party/rust/itoa/.travis.yml b/third_party/rust/itoa/.travis.yml deleted file mode 100644 index 0e4e98974ff5..000000000000 --- a/third_party/rust/itoa/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -sudo: false - -language: rust - -rust: - - nightly diff --git a/third_party/rust/itoa/Cargo.toml b/third_party/rust/itoa/Cargo.toml deleted file mode 100644 index 7312236df304..000000000000 --- a/third_party/rust/itoa/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "itoa" -version = "0.3.1" -authors = ["David Tolnay "] -license = "MIT/Apache-2.0" -description = "Fast functions for printing integer primitives to an io::Write" -repository = "https://github.com/dtolnay/itoa" -documentation = "https://github.com/dtolnay/itoa" -categories = ["value-formatting"] diff --git a/third_party/rust/itoa/README.md b/third_party/rust/itoa/README.md deleted file mode 100644 index 230fa5bd3698..000000000000 --- a/third_party/rust/itoa/README.md +++ /dev/null @@ -1,70 +0,0 @@ -itoa -==== - -[![Build Status](https://api.travis-ci.org/dtolnay/itoa.svg?branch=master)](https://travis-ci.org/dtolnay/itoa) -[![Latest Version](https://img.shields.io/crates/v/itoa.svg)](https://crates.io/crates/itoa) - -This crate provides fast functions for printing integer primitives to an -[`io::Write`](https://doc.rust-lang.org/std/io/trait.Write.html). The -implementation comes straight from -[libcore](https://github.com/rust-lang/rust/blob/b8214dc6c6fc20d0a660fb5700dca9ebf51ebe89/src/libcore/fmt/num.rs#L201-L254) -but avoids the performance penalty of going through -[`fmt::Formatter`](https://doc.rust-lang.org/std/fmt/struct.Formatter.html). - -See also [`dtoa`](https://github.com/dtolnay/dtoa) for printing floating point -primitives. - -## Performance - -![performance](https://raw.githubusercontent.com/dtolnay/itoa/master/performance.png) - -## Functions - -```rust -extern crate itoa; - -// write to a vector or other io::Write -let mut buf = Vec::new(); -itoa::write(&mut buf, 128u64)?; -println!("{:?}", buf); - -// write to a stack buffer -let mut bytes = [b'\0'; 20]; -let n = itoa::write(&mut bytes[..], 128u64)?; -println!("{:?}", &bytes[..n]); -``` - -The function signature is: - -```rust -fn write(writer: W, value: V) -> io::Result -``` - -where `itoa::Integer` is implemented for `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, -`i64`, `u64`, `isize` and `usize`. The return value gives the number of bytes -written. - -## Dependency - -Itoa is available on [crates.io](https://crates.io/crates/itoa). Use the -following in `Cargo.toml`: - -```toml -[dependencies] -itoa = "0.3" -``` - -## License - -Licensed under either of - - * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) - * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) - -at your option. - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in itoa by you, as defined in the Apache-2.0 license, shall be -dual licensed as above, without any additional terms or conditions. diff --git a/third_party/rust/itoa/benches/bench.rs b/third_party/rust/itoa/benches/bench.rs deleted file mode 100644 index 5912fc2c71c7..000000000000 --- a/third_party/rust/itoa/benches/bench.rs +++ /dev/null @@ -1,52 +0,0 @@ -#![feature(test)] -#![allow(non_snake_case)] - -extern crate itoa; -extern crate test; - -macro_rules! benches { - ($($name:ident($value:expr),)*) => { - mod bench_itoa { - use test::{Bencher, black_box}; - $( - #[bench] - fn $name(b: &mut Bencher) { - use itoa; - - let mut buf = Vec::with_capacity(20); - - b.iter(|| { - buf.clear(); - itoa::write(&mut buf, black_box($value)).unwrap() - }); - } - )* - } - - mod bench_fmt { - use test::{Bencher, black_box}; - $( - #[bench] - fn $name(b: &mut Bencher) { - use std::io::Write; - - let mut buf = Vec::with_capacity(20); - - b.iter(|| { - buf.clear(); - write!(&mut buf, "{}", black_box($value)).unwrap() - }); - } - )* - } - } -} - -benches!( - bench_0u64(0u64), - bench_HALFu64(::max_value() as u64), - bench_MAXu64(::max_value()), - - bench_0i16(0i16), - bench_MINi16(::min_value()), -); diff --git a/third_party/rust/itoa/performance.png b/third_party/rust/itoa/performance.png deleted file mode 100644 index 1e23b7123d6aa8bf373789ae5340c167bfe278b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74625 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ɴ=ma+X4ykITt-Loe#0Wr(8aF`c*5OLsv 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 diff --git a/third_party/rust/itoa/src/lib.rs b/third_party/rust/itoa/src/lib.rs deleted file mode 100644 index 40e952bf8c41..000000000000 --- a/third_party/rust/itoa/src/lib.rs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2016 Itoa Developers -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use std::{io, mem, ptr, slice}; - -#[inline] -pub fn write(wr: W, value: V) -> io::Result { - value.write(wr) -} - -pub trait Integer { - fn write(self, W) -> io::Result; -} - -const DEC_DIGITS_LUT: &'static[u8] = - b"0001020304050607080910111213141516171819\ - 2021222324252627282930313233343536373839\ - 4041424344454647484950515253545556575859\ - 6061626364656667686970717273747576777879\ - 8081828384858687888990919293949596979899"; - -// Adaptation of the original implementation at -// https://github.com/rust-lang/rust/blob/b8214dc6c6fc20d0a660fb5700dca9ebf51ebe89/src/libcore/fmt/num.rs#L188-L266 -macro_rules! impl_Integer { - ($($t:ident),* as $conv_fn:ident) => ($( - impl Integer for $t { - #[allow(unused_comparisons)] - fn write(self, mut wr: W) -> io::Result { - let is_nonnegative = self >= 0; - let mut n = if is_nonnegative { - self as $conv_fn - } else { - try!(wr.write_all(b"-")); - // convert the negative num to positive by summing 1 to it's 2 complement - (!(self as $conv_fn)).wrapping_add(1) - }; - let mut buf: [u8; 20] = unsafe { mem::uninitialized() }; - let mut curr = buf.len() as isize; - let buf_ptr = buf.as_mut_ptr(); - let lut_ptr = DEC_DIGITS_LUT.as_ptr(); - - unsafe { - // eagerly decode 4 characters at a time - if <$t>::max_value() as u64 >= 10000 { - while n >= 10000 { - let rem = (n % 10000) as isize; - n /= 10000; - - let d1 = (rem / 100) << 1; - let d2 = (rem % 100) << 1; - curr -= 4; - ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2); - ptr::copy_nonoverlapping(lut_ptr.offset(d2), buf_ptr.offset(curr + 2), 2); - } - } - - // if we reach here numbers are <= 9999, so at most 4 chars long - let mut n = n as isize; // possibly reduce 64bit math - - // decode 2 more chars, if > 2 chars - if n >= 100 { - let d1 = (n % 100) << 1; - n /= 100; - curr -= 2; - ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2); - } - - // decode last 1 or 2 chars - if n < 10 { - curr -= 1; - *buf_ptr.offset(curr) = (n as u8) + 48; - } else { - let d1 = n << 1; - curr -= 2; - ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2); - } - } - - let mut len = buf.len() - curr as usize; - try!(wr.write_all(unsafe { slice::from_raw_parts(buf_ptr.offset(curr), len) })); - if !is_nonnegative { - len += 1; - } - Ok(len) - } - })*); -} - -impl_Integer!(i8, u8, i16, u16, i32, u32 as u32); -impl_Integer!(i64, u64 as u64); -#[cfg(target_pointer_width = "16")] -impl_Integer!(isize, usize as u16); -#[cfg(target_pointer_width = "32")] -impl_Integer!(isize, usize as u32); -#[cfg(target_pointer_width = "64")] -impl_Integer!(isize, usize as u64); diff --git a/third_party/rust/itoa/tests/test.rs b/third_party/rust/itoa/tests/test.rs deleted file mode 100644 index 7615c19b8be9..000000000000 --- a/third_party/rust/itoa/tests/test.rs +++ /dev/null @@ -1,25 +0,0 @@ -#![allow(non_snake_case)] - -extern crate itoa; - -macro_rules! test { - ($($name:ident($value:expr, $expected:expr),)*) => { - $( - #[test] - fn $name() { - let mut buf = [b'\0'; 20]; - let len = itoa::write(&mut buf[..], $value).unwrap(); - assert_eq!(&buf[0..len], $expected.as_bytes()); - } - )* - } -} - -test!( - test_0u64(0u64, "0"), - test_HALFu64(::max_value() as u64, "4294967295"), - test_MAXu64(::max_value(), "18446744073709551615"), - - test_0i16(0i16, "0"), - test_MINi16(::min_value(), "-32768"), -); diff --git a/third_party/rust/libloading/.cargo-checksum.json b/third_party/rust/libloading/.cargo-checksum.json index 5d8bd6774fbb..b6a8e30a51c4 100644 --- a/third_party/rust/libloading/.cargo-checksum.json +++ b/third_party/rust/libloading/.cargo-checksum.json @@ -1 +1 @@ -{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"d1f04f6e26b032947281447fede322031f61a24a6dc3cf72221f238411393d0c",".travis.yml":"c5fb30815c618af816dfb36f29b66e088dbff0f2bae603203f94d17f04761117","Cargo.toml":"c5f803cd84773c6e42cbbbdc3e8d9aafb9b3a7183ebf4ad12614d895feb8788e","LICENSE":"b29f8b01452350c20dd1af16ef83b598fea3053578ccc1c7a0ef40e57be2620f","README.mkd":"34dc610b01f8c3e56d95de1972120ca0d53cee787f636a3ce96526ab343878b5","appveyor.yml":"4c00a8503d3491de985927f703e50fd6893bea106d95e22db68470adf3fb5aee","build.rs":"f4135eaa51256562982eda2f76aceac7a0a08f77c6c24505b2134fa3b55dfb28","src/changelog.rs":"17742fd1a785f677b837d075a616681ef86a3067b9d0e792a96b527d0e2b1732","src/lib.rs":"665c5eeecdf77afc0dbe7de4232b2d5f5da5e19a5fd851ac433c89d600b801ee","src/os/mod.rs":"51d733e5522dacd6069642ad66aa6d7acf6c82950c934eb040e8dfd112e6d610","src/os/unix/mod.rs":"3f08596040a0e6f23b01ed1d2e2eb7237c0d714b558b55a1cda3f5ba7ea8cb30","src/os/windows/mod.rs":"62b34ba89fb6ead8f3f693a118f5023f4ba4fcf01fabf29702217a80c930e825","src/test_helpers.rs":"3a55052e8cd5231e97d9282b43398c2f144c57ced2d2df64bde7f482f5c778e7","src/util.rs":"df403de5694313b16e7761316aac7e436fd24bc9381a42d8dd7ebebe48225fa8","tests/functions.rs":"79f89516415735c9eecf3b118be04fdd8e83a91549cb94dd4217b205d7d2031a","tests/markers.rs":"8e9c1b883404d9190e4f23ed39b3d6cbbccb3a07883f733b04aed4357b9c6aca","tests/nagisa32.dll":"5c69b2bd9c8a6ad04165c221075fc9fade1dd66ca697399ace528a5a62328e36","tests/nagisa64.dll":"e20b95e3036f3289421abd100760874d4f455afd33c3b5b64fec56b191f7d477","tests/statics.rs":"8fd0955d38cdf3d56d1ece03ad159192702dbc049aa1af146f28fb10f1cf2fcc","tests/windows.rs":"7711dfe19062d91356cd127546542b1b6e13aeef76ad3098f32c8a6ae319b66a"},"package":"fd1835a714c1f67ba073a493493c23686a480e2614e208c921834808b1f19d8f"} \ No newline at end of file +{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"d1f04f6e26b032947281447fede322031f61a24a6dc3cf72221f238411393d0c",".travis.yml":"3c9d7103068d644d68f5d0f9dd6a9ba00eb86bfb4cfc2c2c14c8a853144fcf09","Cargo.toml":"538efc8b4fd54f900e4706d6904b7696dbf071578d16fe76df1db8c82566635b","LICENSE":"b29f8b01452350c20dd1af16ef83b598fea3053578ccc1c7a0ef40e57be2620f","README.mkd":"34dc610b01f8c3e56d95de1972120ca0d53cee787f636a3ce96526ab343878b5","appveyor.yml":"8382c7f1769f6cf78029a221058c4d73f35a48308b5dfc38d875facabec1c139","build.rs":"dd767f79832741a368fd46a846b7d53cdd05337becad6f7addad71e9618c2769","src/changelog.rs":"b1cbfc5b62c13693e06ca9b3196b359661a0c27d4bdc5eb093554ff86ce34a72","src/lib.rs":"665c5eeecdf77afc0dbe7de4232b2d5f5da5e19a5fd851ac433c89d600b801ee","src/os/mod.rs":"51d733e5522dacd6069642ad66aa6d7acf6c82950c934eb040e8dfd112e6d610","src/os/unix/mod.rs":"1cd2b6f51a34e492b7c88d054f25d89b825037bd81e62a2950ca13720e760061","src/os/windows/mod.rs":"2ed3564e9b88a601cd93b13affb286af7beee165b710279d55c953c74b783310","src/test_helpers.rs":"3a55052e8cd5231e97d9282b43398c2f144c57ced2d2df64bde7f482f5c778e7","src/util.rs":"0b0155448a26db4b00b2a6ca129e0e1f6f75870c56c9777d262941818c7581b7","tests/functions.rs":"dbed3ad32d6a31c8c0df5943f686ca328f020c5d49a9111281458971caa40e62","tests/markers.rs":"8e9c1b883404d9190e4f23ed39b3d6cbbccb3a07883f733b04aed4357b9c6aca","tests/nagisa32.dll":"5c69b2bd9c8a6ad04165c221075fc9fade1dd66ca697399ace528a5a62328e36","tests/nagisa64.dll":"e20b95e3036f3289421abd100760874d4f455afd33c3b5b64fec56b191f7d477","tests/statics.rs":"8fd0955d38cdf3d56d1ece03ad159192702dbc049aa1af146f28fb10f1cf2fcc","tests/windows.rs":"7711dfe19062d91356cd127546542b1b6e13aeef76ad3098f32c8a6ae319b66a"},"package":"be99f814beb3e9503a786a592c909692bb6d4fc5a695f6ed7987223acfbd5194"} \ No newline at end of file diff --git a/third_party/rust/libloading/.travis.yml b/third_party/rust/libloading/.travis.yml index cc8e5323f505..ac9b83b62a1e 100644 --- a/third_party/rust/libloading/.travis.yml +++ b/third_party/rust/libloading/.travis.yml @@ -2,7 +2,7 @@ language: rust sudo: false cache: cargo rust: - - 1.12.0 + - 1.14.0 - stable - nightly os: diff --git a/third_party/rust/libloading/Cargo.toml b/third_party/rust/libloading/Cargo.toml index 38ffbd70f2cb..a1dfcd561ee1 100644 --- a/third_party/rust/libloading/Cargo.toml +++ b/third_party/rust/libloading/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "libloading" -version = "0.3.2" +version = "0.4.0" authors = ["Simonas Kazlauskas "] build = "build.rs" description = "A safer binding to platform’s dynamic library loading utilities" @@ -15,6 +15,3 @@ lazy_static = "0.2" [target.'cfg(windows)'.dependencies] winapi = "0.2" kernel32-sys = "0.2" - -[build-dependencies] -target_build_utils = "0.3" diff --git a/third_party/rust/libloading/appveyor.yml b/third_party/rust/libloading/appveyor.yml index 4390f5357b3e..1bded0bd8d6a 100644 --- a/third_party/rust/libloading/appveyor.yml +++ b/third_party/rust/libloading/appveyor.yml @@ -4,10 +4,10 @@ environment: - TARGET: nightly-i686-pc-windows-msvc - TARGET: nightly-x86_64-pc-windows-gnu - TARGET: nightly-i686-pc-windows-gnu - - TARGET: 1.12.0-x86_64-pc-windows-msvc - - TARGET: 1.12.0-i686-pc-windows-msvc - - TARGET: 1.12.0-x86_64-pc-windows-gnu - - TARGET: 1.12.0-i686-pc-windows-gnu + - TARGET: 1.14.0-x86_64-pc-windows-msvc + - TARGET: 1.14.0-i686-pc-windows-msvc + - TARGET: 1.14.0-x86_64-pc-windows-gnu + - TARGET: 1.14.0-i686-pc-windows-gnu install: - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-${env:TARGET}.exe" -FileName "rust.exe" - ps: .\rust.exe /VERYSILENT /NORESTART /DIR="C:\rust" | Out-Null diff --git a/third_party/rust/libloading/build.rs b/third_party/rust/libloading/build.rs index 7657a82fb4ef..200e08f1d16b 100644 --- a/third_party/rust/libloading/build.rs +++ b/third_party/rust/libloading/build.rs @@ -1,22 +1,20 @@ -extern crate target_build_utils; -use target_build_utils::TargetInfo; use std::io::Write; use std::env; fn main(){ - let target = TargetInfo::new().expect("could not get target info"); - match target.target_os() { - "linux" | "android" => println!("cargo:rustc-link-lib=dl"), - "freebsd" | "dragonfly" => println!("cargo:rustc-link-lib=c"), + let target_os = env::var("CARGO_CFG_TARGET_OS"); + match target_os.as_ref().map(|x| &**x) { + Ok("linux") | Ok("android") => println!("cargo:rustc-link-lib=dl"), + Ok("freebsd") | Ok("dragonfly") => println!("cargo:rustc-link-lib=c"), // netbsd claims dl* will be available to any dynamically linked binary, but I haven’t // found any libraries that have to be linked to on other platforms. // What happens if the executable is not linked up dynamically? - "openbsd" | "bitrig" | "netbsd" | "macos" | "ios" => {} + Ok("openbsd") | Ok("bitrig") | Ok("netbsd") | Ok("macos") | Ok("ios") => {} // dependencies come with winapi - "windows" => {} + Ok("windows") => {} tos => { writeln!(::std::io::stderr(), - "Building for an unknown target_os=`{}`!\nPlease report an issue ", + "Building for an unknown target_os=`{:?}`!\nPlease report an issue ", tos).expect("could not report the error"); ::std::process::exit(0xfc); } diff --git a/third_party/rust/libloading/src/changelog.rs b/third_party/rust/libloading/src/changelog.rs index 87df4053df6e..1d71d08e2e21 100644 --- a/third_party/rust/libloading/src/changelog.rs +++ b/third_party/rust/libloading/src/changelog.rs @@ -1,5 +1,24 @@ //! Project changelog +/// Release 0.4.0 (2017-05-01) +/// +/// * Remove build-time dependency on target_build_utils (and by extension serde/phf); +/// * Require at least version 1.14.0 of rustc to build; +/// * Actually, it is cargo which has to be more recent here. The one shipped with rustc 1.14.0 +/// is what’s being required from now on. +pub mod r0_4_0 {} + +/// Release 0.3.4 (2017-03-25) +/// +/// * Remove rogue println! +pub mod r0_3_4 {} + +/// Release 0.3.3 (2017-03-25) +/// +/// * Panics when `Library::get` is called for incompatibly sized type such as named function +/// types (which are zero-sized). +pub mod r0_3_3 {} + /// Release 0.3.2 (2017-02-10) /// /// * Minimum version required is now rustc 1.12.0; diff --git a/third_party/rust/libloading/src/os/unix/mod.rs b/third_party/rust/libloading/src/os/unix/mod.rs index c4c44716221f..0b6cae1d6cd2 100644 --- a/third_party/rust/libloading/src/os/unix/mod.rs +++ b/third_party/rust/libloading/src/os/unix/mod.rs @@ -1,4 +1,4 @@ -use util::cstr_cow_from_bytes; +use util::{ensure_compatible_types, cstr_cow_from_bytes}; use std::ffi::{CStr, OsStr}; use std::{fmt, io, marker, mem, ptr}; @@ -147,6 +147,7 @@ impl Library { /// OS X uses some sort of lazy initialization scheme, which makes loading TLS variables /// impossible. Using a TLS variable loaded this way on OS X is undefined behaviour. pub unsafe fn get(&self, symbol: &[u8]) -> ::Result> { + ensure_compatible_types::(); let symbol = try!(cstr_cow_from_bytes(symbol)); // `dlsym` may return nullptr in two cases: when a symbol genuinely points to a null // pointer or the symbol cannot be found. In order to detect this case a double dlerror diff --git a/third_party/rust/libloading/src/os/windows/mod.rs b/third_party/rust/libloading/src/os/windows/mod.rs index 936c46afb890..128e3ff91a4e 100644 --- a/third_party/rust/libloading/src/os/windows/mod.rs +++ b/third_party/rust/libloading/src/os/windows/mod.rs @@ -1,7 +1,7 @@ extern crate winapi; extern crate kernel32; -use util::cstr_cow_from_bytes; +use util::{ensure_compatible_types, cstr_cow_from_bytes}; use std::ffi::{OsStr, OsString}; use std::{fmt, io, marker, mem, ptr}; @@ -68,6 +68,7 @@ impl Library { /// Pointer to a value of arbitrary type is returned. Using a value with wrong type is /// undefined. pub unsafe fn get(&self, symbol: &[u8]) -> ::Result> { + ensure_compatible_types::(); let symbol = try!(cstr_cow_from_bytes(symbol)); with_get_last_error(|| { let symbol = kernel32::GetProcAddress(self.0, symbol.as_ptr()); @@ -91,6 +92,7 @@ impl Library { /// Pointer to a value of arbitrary type is returned. Using a value with wrong type is /// undefined. pub unsafe fn get_ordinal(&self, ordinal: winapi::WORD) -> ::Result> { + ensure_compatible_types::(); with_get_last_error(|| { let ordinal = ordinal as usize as *mut _; let symbol = kernel32::GetProcAddress(self.0, ordinal); diff --git a/third_party/rust/libloading/src/util.rs b/third_party/rust/libloading/src/util.rs index 9af3c517eb89..caa95b63df46 100644 --- a/third_party/rust/libloading/src/util.rs +++ b/third_party/rust/libloading/src/util.rs @@ -47,3 +47,15 @@ pub fn cstr_cow_from_bytes<'a>(slice: &'a [u8]) -> Result, NullErr Some(_) => Cow::Owned(try!(CString::new(slice))), }) } + +#[inline] +pub fn ensure_compatible_types() { + #[cold] + #[inline(never)] + fn dopanic() { + panic!("value of requested type cannot be dynamically loaded"); + } + if ::std::mem::size_of::() != ::std::mem::size_of::() { + dopanic() + } +} diff --git a/third_party/rust/libloading/tests/functions.rs b/third_party/rust/libloading/tests/functions.rs index e92ebe7c524e..109689bc5fce 100644 --- a/third_party/rust/libloading/tests/functions.rs +++ b/third_party/rust/libloading/tests/functions.rs @@ -49,8 +49,8 @@ fn wrong_name_fails() { fn missing_symbol_fails() { let lib = Library::new(LIBPATH).unwrap(); unsafe { - lib.get::>(b"test_does_not_exist").err().unwrap(); - lib.get::>(b"test_does_not_exist\0").err().unwrap(); + lib.get::<*mut ()>(b"test_does_not_exist").err().unwrap(); + lib.get::<*mut ()>(b"test_does_not_exist\0").err().unwrap(); } } @@ -58,7 +58,28 @@ fn missing_symbol_fails() { fn interior_null_fails() { let lib = Library::new(LIBPATH).unwrap(); unsafe { - lib.get::>(b"test_does\0_not_exist").err().unwrap(); - lib.get::>(b"test\0_does_not_exist\0").err().unwrap(); + lib.get::<*mut ()>(b"test_does\0_not_exist").err().unwrap(); + lib.get::<*mut ()>(b"test\0_does_not_exist\0").err().unwrap(); + } +} + +#[test] +#[should_panic] +fn test_incompatible_type() { + let lib = Library::new(LIBPATH).unwrap(); + unsafe { + let _ = lib.get::<()>(b"test_identity_u32\0"); + } +} + +#[test] +#[should_panic] +fn test_incompatible_type_named_fn() { + unsafe fn get<'a, T>(l: &'a Library, _: T) -> libloading::Result> { + l.get::(b"test_identity_u32\0") + } + let lib = Library::new(LIBPATH).unwrap(); + unsafe { + let _ = get(&lib, test_incompatible_type_named_fn); } } diff --git a/third_party/rust/quasi/.cargo-checksum.json b/third_party/rust/quasi/.cargo-checksum.json index e75c7debe154..6a881ddf6c28 100644 --- a/third_party/rust/quasi/.cargo-checksum.json +++ b/third_party/rust/quasi/.cargo-checksum.json @@ -1 +1 @@ -{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"c7784ad13b709e309a65b60a42fa5728373e5dade1f5fc70eb66be9bd6519cdd","src/lib.rs":"f05bfe4525aecd520f568f548aa972c00faba9559973e318d06b62de5cb7d4ad"},"package":"dcbf815446dc6a0afbc72d88f9a8aa71b608d10b168e09437c80c0fd6fd410c9"} \ No newline at end of file +{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"6aa84fa759e9476addcc2e129578543faf25ec74e4e9a7fbbf237dd6ac977b07","src/lib.rs":"ceb1858965c87b0dab5fbc817e3ccc0bea64e74436748651f578e29c7837c996"},"package":"18c45c4854d6d1cf5d531db97c75880feb91c958b0720f4ec1057135fec358b3"} \ No newline at end of file diff --git a/third_party/rust/quasi/Cargo.toml b/third_party/rust/quasi/Cargo.toml index 1e3c71c4dbc4..3f2f47a338a9 100644 --- a/third_party/rust/quasi/Cargo.toml +++ b/third_party/rust/quasi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "quasi" -version = "0.29.0" +version = "0.32.0" authors = ["Erick Tryzelaar "] license = "MIT/Apache-2.0" description = "A quasi-quoting macro system" @@ -12,6 +12,6 @@ with-syntex = ["syntex_syntax", "syntex_errors"] unstable-testing = ["clippy"] [dependencies] -clippy = { version = "^0.*", optional = true } -syntex_errors = { version = "^0.54.0", optional = true } -syntex_syntax = { version = "^0.54.0", optional = true } +clippy = { version = "0.*", optional = true } +syntex_errors = { version = "0.58", optional = true } +syntex_syntax = { version = "0.58", optional = true } diff --git a/third_party/rust/quasi/src/lib.rs b/third_party/rust/quasi/src/lib.rs index 15ae6947754a..c0abaaa599a3 100644 --- a/third_party/rust/quasi/src/lib.rs +++ b/third_party/rust/quasi/src/lib.rs @@ -246,9 +246,7 @@ impl ToTokens for ast::Attribute { } r.push(TokenTree::Delimited(self.span, Rc::new(tokenstream::Delimited { delim: token::Bracket, - open_span: self.span, tts: self.value.to_tokens(cx), - close_span: self.span, }))); r } @@ -276,9 +274,7 @@ impl ToTokens for () { fn to_tokens(&self, _cx: &ExtCtxt) -> Vec { vec![TokenTree::Delimited(DUMMY_SP, Rc::new(tokenstream::Delimited { delim: token::Paren, - open_span: DUMMY_SP, tts: vec![], - close_span: DUMMY_SP, }))] } } diff --git a/third_party/rust/quasi_codegen/.cargo-checksum.json b/third_party/rust/quasi_codegen/.cargo-checksum.json index fe21994556ec..0577ae1eb228 100644 --- a/third_party/rust/quasi_codegen/.cargo-checksum.json +++ b/third_party/rust/quasi_codegen/.cargo-checksum.json @@ -1 +1 @@ -{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"47c15a377d35bccd1c9bf93caa7105c5ed9b36483959b67d9ccb17a9763a9eb8","src/lib.rs":"b978275b356139de30584044e4e8b1b39959fb2a2ed3d04eb60dd8260b83df85"},"package":"b06172e92ab0099427609854ffb1512c377be5fc4beaf572ae5d5a01b8359596"} \ No newline at end of file +{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"d0120003890b485935cabe08f72e291e1ee8945d285281f855ca0461c57832b3","src/lib.rs":"852412a91c6dda8632be03e5726cd0ed837a8aedcd710202a7d36d75c626270e"},"package":"51b9e25fa23c044c1803f43ca59c98dac608976dd04ce799411edd58ece776d4"} \ No newline at end of file diff --git a/third_party/rust/quasi_codegen/Cargo.toml b/third_party/rust/quasi_codegen/Cargo.toml index cf25e49e816e..129cadbe0203 100644 --- a/third_party/rust/quasi_codegen/Cargo.toml +++ b/third_party/rust/quasi_codegen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "quasi_codegen" -version = "0.29.0" +version = "0.32.0" authors = ["Erick Tryzelaar "] license = "MIT/Apache-2.0" description = "A quasi-quoting macro system" @@ -13,8 +13,8 @@ with-syntex = ["syntex", "syntex_errors", "syntex_syntax", "aster/with-syntex"] unstable-testing = ["clippy"] [dependencies] -aster = { version = "^0.38.0", default-features = false } -clippy = { version = "^0.*", optional = true } -syntex = { version = "^0.54.0", optional = true } -syntex_errors = { version = "^0.54.0", optional = true } -syntex_syntax = { version = "^0.54.0", optional = true } +aster = { version = "0.41", default-features = false } +clippy = { version = "0.*", optional = true } +syntex = { version = "0.58", optional = true } +syntex_errors = { version = "0.58", optional = true } +syntex_syntax = { version = "0.58", optional = true } diff --git a/third_party/rust/quasi_codegen/src/lib.rs b/third_party/rust/quasi_codegen/src/lib.rs index 10d2d42cfda5..1d7eda10849c 100644 --- a/third_party/rust/quasi_codegen/src/lib.rs +++ b/third_party/rust/quasi_codegen/src/lib.rs @@ -510,10 +510,10 @@ fn statements_mk_tt(tt: &TokenTree, matcher: bool) -> Result { idents: vec![], }) }, - TokenTree::Delimited(_, ref delimed) => { + TokenTree::Delimited(sp, ref delimed) => { let delimited = try!(statements_mk_tts(&delimed.tts[..], matcher)); - let open = try!(statements_mk_tt(&delimed.open_tt(), matcher)).stmts.into_iter(); - let close = try!(statements_mk_tt(&delimed.close_tt(), matcher)).stmts.into_iter(); + let open = try!(statements_mk_tt(&delimed.open_tt(sp), matcher)).stmts.into_iter(); + let close = try!(statements_mk_tt(&delimed.close_tt(sp), matcher)).stmts.into_iter(); Ok(QuoteStmts { stmts: open.chain(delimited.stmts.into_iter()).chain(close).collect(), idents: delimited.idents, diff --git a/third_party/rust/serde_json/.cargo-checksum.json b/third_party/rust/serde_json/.cargo-checksum.json deleted file mode 100644 index 269c0c152cbb..000000000000 --- a/third_party/rust/serde_json/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"9cec5418a9057b56d49b8f2e3b43f869e8f9d2f706caa5a16363e0663c9a166b","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"ea5aacdf7067bf6e0e68ccf1b4a4a30b15af45fcfa628425b0cceee2cd632574","src/de.rs":"5663e0ff0d587a16ab0aad40c991f3283945ac66f551457006bcb384793dd4a6","src/error.rs":"2e2a388fd5dfc9445ba133268daddaa362e333883b8caadcf5bb7c1f5c4fecd5","src/lib.rs":"ec6758d1f31d9a2e9a1c2f103aa3f5536486b6a8d0357dd5137637f31d4ede61","src/macros.rs":"7476997fa78a020d5e9f95160b101d6367db1ecd39cb2faae61fa170ab219094","src/map.rs":"a6bccaeeba053c3ef7f06cb91e2668d995629b1a6d88c6cc823ebd41d6654536","src/number.rs":"7b684584a57aaf609462a709dafa646b1efdad75c7373f8cfec8c2d2c4271e26","src/read.rs":"8ca8c8a3d1155e15be1a0eafea0876895af72fad3fd7f87f2d590c1663750267","src/ser.rs":"9ca1cdeda317630c240fbf8671cab5c14046fd65a987007c21d8d7e066e12382","src/value.rs":"4f1a70e0f9a6a3bd96a72a00980c45df5582c24b88388c0b32c8cb5c239eed1b"},"package":"6501ac6f8b74f9b1033f7ddf79a08edfa0f58d6f8e3190cb8dc97736afa257a8"} \ No newline at end of file diff --git a/third_party/rust/serde_json/.cargo-ok b/third_party/rust/serde_json/.cargo-ok deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/third_party/rust/serde_json/Cargo.toml b/third_party/rust/serde_json/Cargo.toml deleted file mode 100644 index bfa6e4c88de3..000000000000 --- a/third_party/rust/serde_json/Cargo.toml +++ /dev/null @@ -1,28 +0,0 @@ -[package] -name = "serde_json" -version = "0.9.8" -authors = ["Erick Tryzelaar "] -license = "MIT/Apache-2.0" -description = "A JSON serialization file format" -repository = "https://github.com/serde-rs/json" -documentation = "http://docs.serde.rs/serde_json/" -keywords = ["json", "serde", "serialization"] -categories = ["encoding"] -readme = "../README.md" -include = ["Cargo.toml", "src/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"] - -[badges] -travis-ci = { repository = "serde-rs/json" } - -[features] -preserve_order = ["linked-hash-map"] - -[dependencies] -serde = "0.9.4" -num-traits = "0.1.32" -linked-hash-map = { version = "0.4.1", optional = true } -itoa = "0.3" -dtoa = "0.4" - -[dev-dependencies] -serde_derive = "0.9" diff --git a/third_party/rust/serde_json/README.md b/third_party/rust/serde_json/README.md deleted file mode 100644 index 23a6dcea9d60..000000000000 --- a/third_party/rust/serde_json/README.md +++ /dev/null @@ -1,252 +0,0 @@ -# Serde JSON   [![Build Status](https://api.travis-ci.org/serde-rs/json.svg?branch=master)](https://travis-ci.org/serde-rs/json) [![Latest Version](https://img.shields.io/crates/v/serde_json.svg)](https://crates.io/crates/serde\_json) - -**Serde is a framework for *ser*ializing and *de*serializing Rust data structures efficiently and generically.** - ---- - -```toml -[dependencies] -serde_json = "0.9" -``` - -You may be looking for: - -- [JSON API documentation](https://docs.serde.rs/serde_json/) -- [Serde API documentation](https://docs.serde.rs/serde/) -- [Detailed documentation about Serde](https://serde.rs/) -- [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/codegen.html) -- [Release notes](https://github.com/serde-rs/json/releases) - -JSON is a ubiquitous open-standard format that uses human-readable text to -transmit data objects consisting of key-value pairs. - -```json,ignore -{ - "name": "John Doe", - "age": 43, - "address": { - "street": "10 Downing Street", - "city": "London" - }, - "phones": [ - "+44 1234567", - "+44 2345678" - ] -} -``` - -There are three common ways that you might find yourself needing to work -with JSON data in Rust. - - - **As text data.** An unprocessed string of JSON data that you receive on - an HTTP endpoint, read from a file, or prepare to send to a remote - server. - - **As an untyped or loosely typed representation.** Maybe you want to - check that some JSON data is valid before passing it on, but without - knowing the structure of what it contains. Or you want to do very basic - manipulations like add a level of nesting. - - **As a strongly typed Rust data structure.** When you expect all or most - of your data to conform to a particular structure and want to get real - work done without JSON's loosey-goosey nature tripping you up. - -Serde JSON provides efficient, flexible, safe ways of converting data -between each of these representations. - -## JSON to the Value enum - -Any valid JSON data can be manipulated in the following recursive enum -representation. This data structure is [`serde_json::Value`][value]. - -```rust,ignore -enum Value { - Null, - Bool(bool), - Number(Number), - String(String), - Array(Vec), - Object(Map), -} -``` - -A string of JSON data can be parsed into a `serde_json::Value` by the -[`serde_json::from_str`][from_str] function. There is also -[`from_slice`][from_slice] for parsing from a byte slice &[u8], -[`from_iter`][from_iter] for parsing from an iterator of bytes, and -[`from_reader`][from_reader] for parsing from any `io::Read` like a File or -a TCP stream. - -```rust -use serde_json::Value; - -let data = r#" { "name": "John Doe", "age": 43, ... } "#; -let v: Value = serde_json::from_str(data)?; -println!("Please call {} at the number {}", v["name"], v["phones"][0]); -``` - -The `Value` representation is sufficient for very basic tasks but is brittle -and tedious to work with. Error handling is verbose to implement correctly, -for example imagine trying to detect the presence of unrecognized fields in -the input data. The compiler is powerless to help you when you make a -mistake, for example imagine typoing `v["name"]` as `v["nmae"]` in one of -the dozens of places it is used in your code. - -## JSON to strongly typed data structures - -Serde provides a powerful way of mapping JSON data into Rust data structures -largely automatically. - -```rust -#[derive(Serialize, Deserialize)] -struct Person { - name: String, - age: u8, - address: Address, - phones: Vec, -} - -#[derive(Serialize, Deserialize)] -struct Address { - street: String, - city: String, -} - -let data = r#" { "name": "John Doe", "age": 43, ... } "#; -let p: Person = serde_json::from_str(data)?; -println!("Please call {} at the number {}", p.name, p.phones[0]); -``` - -This is the same `serde_json::from_str` function as before, but this time we -assign the return value to a variable of type `Person` so Serde JSON will -automatically interpret the input data as a `Person` and produce informative -error messages if the layout does not conform to what a `Person` is expected -to look like. - -Any type that implements Serde's `Deserialize` trait can be deserialized -this way. This includes built-in Rust standard library types like `Vec` -and `HashMap`, as well as any structs or enums annotated with -`#[derive(Deserialize)]`. - -Once we have `p` of type `Person`, our IDE and the Rust compiler can help us -use it correctly like they do for any other Rust code. The IDE can -autocomplete field names to prevent typos, which was impossible in the -`serde_json::Value` representation. And the Rust compiler can check that -when we write `p.phones[0]`, then `p.phones` is guaranteed to be a -`Vec` so indexing into it makes sense and produces a `String`. - -## Constructing JSON - -Serde JSON provides a [`json!` macro][macro] to build `serde_json::Value` -objects with very natural JSON syntax. In order to use this macro, -`serde_json` needs to be imported with the `#[macro_use]` attribute. - -```rust -#[macro_use] -extern crate serde_json; - -fn main() { - // The type of `john` is `serde_json::Value` - let john = json!({ - "name": "John Doe", - "age": 43, - "phones": [ - "+44 1234567", - "+44 2345678" - ] - }); - - println!("first phone number: {}", john["phones"][0]); - - // Convert to a string of JSON and print it out - println!("{}", john.to_string()); -} -``` - -The `Value::to_string()` function converts a `serde_json::Value` into a -`String` of JSON text. - -One neat thing about the `json!` macro is that variables and expressions can -be interpolated directly into the JSON value as you are building it. Serde -will check at compile time that the value you are interpolating is able to -be represented as JSON. - -```rust -let full_name = "John Doe"; -let age_last_year = 42; - -// The type of `john` is `serde_json::Value` -let john = json!({ - "name": full_name, - "age": age_last_year + 1, - "phones": [ - format!("+44 {}", random_phone()) - ] -}); -``` - -This is amazingly convenient but we have the problem we had before with -`Value` which is that the IDE and Rust compiler cannot help us if we get it -wrong. Serde JSON provides a better way of serializing strongly-typed data -structures into JSON text. - -## Serializing data structures - -A data structure can be converted to a JSON string by -[`serde_json::to_string`][to_string]. There is also -[`serde_json::to_vec`][to_vec] which serializes to a `Vec` and -[`serde_json::to_writer`][to_writer] which serializes to any `io::Write` -such as a File or a TCP stream. - -```rust -#[derive(Serialize, Deserialize)] -struct Address { - street: String, - city: String, -} - -let address = Address { - street: "10 Downing Street".to_owned(), - city: "London".to_owned(), -}; - -let j = serde_json::to_string(&address)?; -``` - -Any type that implements Serde's `Serialize` trait can be serialized this -way. This includes built-in Rust standard library types like `Vec` and -`HashMap`, as well as any structs or enums annotated with -`#[derive(Serialize)]`. - -## Getting help - -Serde developers live in the #serde channel on -[`irc.mozilla.org`](https://wiki.mozilla.org/IRC). The #rust channel is also a -good resource with generally faster response time but less specific knowledge -about Serde. If IRC is not your thing, we are happy to respond to [GitHub -issues](https://github.com/serde-rs/json/issues/new) as well. - -## License - -Serde JSON is licensed under either of - - * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or - http://www.apache.org/licenses/LICENSE-2.0) - * MIT license ([LICENSE-MIT](LICENSE-MIT) or - http://opensource.org/licenses/MIT) - -at your option. - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in Serde JSON by you, as defined in the Apache-2.0 license, shall -be dual licensed as above, without any additional terms or conditions. - -[value]: https://docs.serde.rs/serde_json/value/enum.Value.html -[from_str]: https://docs.serde.rs/serde_json/de/fn.from_str.html -[from_slice]: https://docs.serde.rs/serde_json/de/fn.from_slice.html -[from_iter]: https://docs.serde.rs/serde_json/de/fn.from_iter.html -[from_reader]: https://docs.serde.rs/serde_json/de/fn.from_reader.html -[to_string]: https://docs.serde.rs/serde_json/ser/fn.to_string.html -[to_vec]: https://docs.serde.rs/serde_json/ser/fn.to_vec.html -[to_writer]: https://docs.serde.rs/serde_json/ser/fn.to_writer.html -[macro]: https://docs.serde.rs/serde_json/macro.json.html diff --git a/third_party/rust/serde_json/src/de.rs b/third_party/rust/serde_json/src/de.rs deleted file mode 100644 index 7a199a4804c8..000000000000 --- a/third_party/rust/serde_json/src/de.rs +++ /dev/null @@ -1,1091 +0,0 @@ -//! Deserialize JSON data to a Rust data structure. - -use std::{i32, u64}; -use std::io; -use std::marker::PhantomData; - -use serde::de::{self, Unexpected}; - -use super::error::{Error, ErrorCode, Result}; - -use read; - -pub use read::{Read, IteratorRead, SliceRead, StrRead}; - -////////////////////////////////////////////////////////////////////////////// - -/// A structure that deserializes JSON into Rust values. -pub struct Deserializer { - read: R, - str_buf: Vec, - remaining_depth: u8, -} - -impl Deserializer - where R: read::Read -{ - /// Create a JSON deserializer from one of the possible serde_json input - /// sources. - /// - /// Typically it is more convenient to use one of these methods instead: - /// - /// - Deserializer::from_str - /// - Deserializer::from_bytes - /// - Deserializer::from_iter - /// - Deserializer::from_reader - pub fn new(read: R) -> Self { - Deserializer { - read: read, - str_buf: Vec::with_capacity(128), - remaining_depth: 128, - } - } -} - -impl Deserializer> - where I: Iterator> -{ - /// Creates a JSON deserializer from a `std::iter::Iterator`. - pub fn from_iter(iter: I) -> Self { - Deserializer::new(read::IteratorRead::new(iter)) - } -} - -impl Deserializer> - where R: io::Read -{ - /// Creates a JSON deserializer from an `io::Read`. - pub fn from_reader(reader: R) -> Self { - Deserializer::new(read::IoRead::new(reader)) - } -} - -impl<'a> Deserializer> { - /// Creates a JSON deserializer from a `&[u8]`. - pub fn from_slice(bytes: &'a [u8]) -> Self { - Deserializer::new(read::SliceRead::new(bytes)) - } -} - -impl<'a> Deserializer> { - /// Creates a JSON deserializer from a `&str`. - pub fn from_str(s: &'a str) -> Self { - Deserializer::new(read::StrRead::new(s)) - } -} - -macro_rules! overflow { - ($a:ident * 10 + $b:ident, $c:expr) => { - $a >= $c / 10 && ($a > $c / 10 || $b > $c % 10) - } -} - -impl Deserializer { - /// The `Deserializer::end` method should be called after a value has been fully deserialized. - /// This allows the `Deserializer` to validate that the input stream is at the end or that it - /// only has trailing whitespace. - pub fn end(&mut self) -> Result<()> { - if try!(self.parse_whitespace()) { // true if eof - Ok(()) - } else { - Err(self.peek_error(ErrorCode::TrailingCharacters)) - } - } - - /// Turn a JSON deserializer into an iterator over values of type T. - pub fn into_iter(self) -> StreamDeserializer - where T: de::Deserialize - { - // This cannot be an implementation of std::iter::IntoIterator because - // we need the caller to choose what T is. - StreamDeserializer { - de: self, - _marker: PhantomData, - } - } - - fn peek(&mut self) -> Result> { - self.read.peek().map_err(Into::into) - } - - fn peek_or_null(&mut self) -> Result { - Ok(try!(self.peek()).unwrap_or(b'\x00')) - } - - fn eat_char(&mut self) { - self.read.discard(); - } - - fn next_char(&mut self) -> Result> { - self.read.next().map_err(Into::into) - } - - fn next_char_or_null(&mut self) -> Result { - Ok(try!(self.next_char()).unwrap_or(b'\x00')) - } - - /// Error caused by a byte from next_char(). - fn error(&mut self, reason: ErrorCode) -> Error { - let pos = self.read.position(); - Error::syntax(reason, pos.line, pos.column) - } - - /// Error caused by a byte from peek(). - fn peek_error(&mut self, reason: ErrorCode) -> Error { - let pos = self.read.peek_position(); - Error::syntax(reason, pos.line, pos.column) - } - - /// Consume whitespace until the next non-whitespace character. - /// - /// Return `Ok(true)` if EOF was encountered in the process and `Ok(false)` otherwise. - fn parse_whitespace(&mut self) -> Result { - loop { - match try!(self.peek()) { - Some(b) => match b { - b' ' | b'\n' | b'\t' | b'\r' => { - self.eat_char(); - } - _ => { - return Ok(false); - } - }, - None => return Ok(true), - } - } - } - - fn parse_value(&mut self, visitor: V) -> Result - where V: de::Visitor, - { - if try!(self.parse_whitespace()) { // true if eof - return Err(self.peek_error(ErrorCode::EOFWhileParsingValue)); - } - - let value = match try!(self.peek_or_null()) { - b'n' => { - self.eat_char(); - try!(self.parse_ident(b"ull")); - visitor.visit_unit() - } - b't' => { - self.eat_char(); - try!(self.parse_ident(b"rue")); - visitor.visit_bool(true) - } - b'f' => { - self.eat_char(); - try!(self.parse_ident(b"alse")); - visitor.visit_bool(false) - } - b'-' => { - self.eat_char(); - self.parse_integer(false, visitor) - } - b'0'...b'9' => self.parse_integer(true, visitor), - b'"' => { - self.eat_char(); - self.str_buf.clear(); - let s = try!(self.read.parse_str(&mut self.str_buf)); - visitor.visit_str(s) - } - b'[' => { - self.remaining_depth -= 1; - if self.remaining_depth == 0 { - return Err(self.peek_error(ErrorCode::RecursionLimitExceeded)); - } - - self.eat_char(); - let ret = visitor.visit_seq(SeqVisitor::new(self)); - - self.remaining_depth += 1; - - match (ret, self.end_seq()) { - (Ok(ret), Ok(())) => Ok(ret), - (Err(err), _) | (_, Err(err)) => Err(err), - } - } - b'{' => { - self.remaining_depth -= 1; - if self.remaining_depth == 0 { - return Err(self.peek_error(ErrorCode::RecursionLimitExceeded)); - } - - self.eat_char(); - let ret = visitor.visit_map(MapVisitor::new(self)); - - self.remaining_depth += 1; - - match (ret, self.end_map()) { - (Ok(ret), Ok(())) => Ok(ret), - (Err(err), _) | (_, Err(err)) => Err(err), - } - } - _ => Err(self.peek_error(ErrorCode::ExpectedSomeValue)), - }; - - match value { - Ok(value) => Ok(value), - // The de::Error and From impls both create errors - // with unknown line and column. Fill in the position here by - // looking at the current index in the input. There is no way to - // tell whether this should call `error` or `peek_error` so pick the - // one that seems correct more often. Worst case, the position is - // off by one character. - Err(err) => Err(err.fix_position(|code| self.error(code))), - } - } - - fn parse_ident(&mut self, ident: &[u8]) -> Result<()> { - for c in ident { - if Some(*c) != try!(self.next_char()) { - return Err(self.error(ErrorCode::ExpectedSomeIdent)); - } - } - - Ok(()) - } - - fn parse_integer(&mut self, pos: bool, visitor: V) -> Result - where V: de::Visitor, - { - match try!(self.next_char_or_null()) { - b'0' => { - // There can be only one leading '0'. - match try!(self.peek_or_null()) { - b'0'...b'9' => { - Err(self.peek_error(ErrorCode::InvalidNumber)) - } - _ => self.parse_number(pos, 0, visitor), - } - } - c @ b'1'...b'9' => { - let mut res = (c - b'0') as u64; - - loop { - match try!(self.peek_or_null()) { - c @ b'0'...b'9' => { - self.eat_char(); - let digit = (c - b'0') as u64; - - // We need to be careful with overflow. If we can, try to keep the - // number as a `u64` until we grow too large. At that point, switch to - // parsing the value as a `f64`. - if overflow!(res * 10 + digit, u64::MAX) { - return self.parse_long_integer(pos, - res, - 1, // res * 10^1 - visitor); - } - - res = res * 10 + digit; - } - _ => { - return self.parse_number(pos, res, visitor); - } - } - } - } - _ => Err(self.error(ErrorCode::InvalidNumber)), - } - } - - fn parse_long_integer( - &mut self, - pos: bool, - significand: u64, - mut exponent: i32, - visitor: V - ) -> Result - where V: de::Visitor, - { - loop { - match try!(self.peek_or_null()) { - b'0'...b'9' => { - self.eat_char(); - // This could overflow... if your integer is gigabytes long. - // Ignore that possibility. - exponent += 1; - } - b'.' => { - return self.parse_decimal(pos, significand, exponent, visitor); - } - b'e' | b'E' => { - return self.parse_exponent(pos, significand, exponent, visitor); - } - _ => { - return self.visit_f64_from_parts(pos, - significand, - exponent, - visitor); - } - } - } - } - - fn parse_number( - &mut self, - pos: bool, - significand: u64, - visitor: V - ) -> Result - where V: de::Visitor, - { - match try!(self.peek_or_null()) { - b'.' => self.parse_decimal(pos, significand, 0, visitor), - b'e' | b'E' => self.parse_exponent(pos, significand, 0, visitor), - _ => { - if pos { - visitor.visit_u64(significand) - } else { - let neg = (significand as i64).wrapping_neg(); - - // Convert into a float if we underflow. - if neg > 0 { - visitor.visit_f64(-(significand as f64)) - } else { - visitor.visit_i64(neg) - } - } - } - } - } - - fn parse_decimal( - &mut self, - pos: bool, - mut significand: u64, - mut exponent: i32, - visitor: V - ) -> Result - where V: de::Visitor, - { - self.eat_char(); - - let mut at_least_one_digit = false; - while let c @ b'0'...b'9' = try!(self.peek_or_null()) { - self.eat_char(); - let digit = (c - b'0') as u64; - at_least_one_digit = true; - - if overflow!(significand * 10 + digit, u64::MAX) { - // The next multiply/add would overflow, so just ignore all - // further digits. - while let b'0'...b'9' = try!(self.peek_or_null()) { - self.eat_char(); - } - break; - } - - significand = significand * 10 + digit; - exponent -= 1; - } - - if !at_least_one_digit { - return Err(self.peek_error(ErrorCode::InvalidNumber)); - } - - match try!(self.peek_or_null()) { - b'e' | b'E' => { - self.parse_exponent(pos, significand, exponent, visitor) - } - _ => self.visit_f64_from_parts(pos, significand, exponent, visitor), - } - } - - fn parse_exponent( - &mut self, - pos: bool, - significand: u64, - starting_exp: i32, - visitor: V - ) -> Result - where V: de::Visitor, - { - self.eat_char(); - - let pos_exp = match try!(self.peek_or_null()) { - b'+' => { - self.eat_char(); - true - } - b'-' => { - self.eat_char(); - false - } - _ => true, - }; - - // Make sure a digit follows the exponent place. - let mut exp = match try!(self.next_char_or_null()) { - c @ b'0'...b'9' => (c - b'0') as i32, - _ => { - return Err(self.error(ErrorCode::InvalidNumber)); - } - }; - - while let c @ b'0'...b'9' = try!(self.peek_or_null()) { - self.eat_char(); - let digit = (c - b'0') as i32; - - if overflow!(exp * 10 + digit, i32::MAX) { - return self.parse_exponent_overflow(pos, - significand, - pos_exp, - visitor); - } - - exp = exp * 10 + digit; - } - - let final_exp = if pos_exp { - starting_exp.saturating_add(exp) - } else { - starting_exp.saturating_sub(exp) - }; - - self.visit_f64_from_parts(pos, significand, final_exp, visitor) - } - - // This cold code should not be inlined into the middle of the hot - // exponent-parsing loop above. - #[cold] - #[inline(never)] - fn parse_exponent_overflow( - &mut self, - pos: bool, - significand: u64, - pos_exp: bool, - visitor: V - ) -> Result - where V: de::Visitor, - { - // Error instead of +/- infinity. - if significand != 0 && pos_exp { - return Err(self.error(ErrorCode::NumberOutOfRange)); - } - - while let b'0'...b'9' = try!(self.peek_or_null()) { - self.eat_char(); - } - visitor.visit_f64(if pos { - 0.0 - } else { - -0.0 - }) - } - - fn visit_f64_from_parts( - &mut self, - pos: bool, - significand: u64, - mut exponent: i32, - visitor: V - ) -> Result - where V: de::Visitor, - { - let mut f = significand as f64; - loop { - match POW10.get(exponent.abs() as usize) { - Some(&pow) => { - if exponent >= 0 { - f *= pow; - if f.is_infinite() { - return Err(self.error(ErrorCode::NumberOutOfRange)); - } - } else { - f /= pow; - } - break; - } - None => { - if f == 0.0 { - break; - } - if exponent >= 0 { - return Err(self.error(ErrorCode::NumberOutOfRange)); - } - f /= 1e308; - exponent += 308; - } - } - } - visitor.visit_f64(if pos { - f - } else { - -f - }) - } - - fn parse_object_colon(&mut self) -> Result<()> { - try!(self.parse_whitespace()); - - match try!(self.peek()) { - Some(b':') => { - self.eat_char(); - Ok(()) - } - Some(_) => Err(self.peek_error(ErrorCode::ExpectedColon)), - None => Err(self.peek_error(ErrorCode::EOFWhileParsingObject)), - } - } - - fn end_seq(&mut self) -> Result<()> { - try!(self.parse_whitespace()); - - match try!(self.next_char()) { - Some(b']') => Ok(()), - Some(_) => Err(self.error(ErrorCode::TrailingCharacters)), - None => Err(self.error(ErrorCode::EOFWhileParsingList)), - } - } - - fn end_map(&mut self) -> Result<()> { - try!(self.parse_whitespace()); - - match try!(self.next_char()) { - Some(b'}') => Ok(()), - Some(_) => Err(self.error(ErrorCode::TrailingCharacters)), - None => Err(self.error(ErrorCode::EOFWhileParsingObject)), - } - } -} - -static POW10: [f64; 309] = - [1e000, 1e001, 1e002, 1e003, 1e004, 1e005, 1e006, 1e007, 1e008, 1e009, - 1e010, 1e011, 1e012, 1e013, 1e014, 1e015, 1e016, 1e017, 1e018, 1e019, - 1e020, 1e021, 1e022, 1e023, 1e024, 1e025, 1e026, 1e027, 1e028, 1e029, - 1e030, 1e031, 1e032, 1e033, 1e034, 1e035, 1e036, 1e037, 1e038, 1e039, - 1e040, 1e041, 1e042, 1e043, 1e044, 1e045, 1e046, 1e047, 1e048, 1e049, - 1e050, 1e051, 1e052, 1e053, 1e054, 1e055, 1e056, 1e057, 1e058, 1e059, - 1e060, 1e061, 1e062, 1e063, 1e064, 1e065, 1e066, 1e067, 1e068, 1e069, - 1e070, 1e071, 1e072, 1e073, 1e074, 1e075, 1e076, 1e077, 1e078, 1e079, - 1e080, 1e081, 1e082, 1e083, 1e084, 1e085, 1e086, 1e087, 1e088, 1e089, - 1e090, 1e091, 1e092, 1e093, 1e094, 1e095, 1e096, 1e097, 1e098, 1e099, - 1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109, - 1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119, - 1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129, - 1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139, - 1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149, - 1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159, - 1e160, 1e161, 1e162, 1e163, 1e164, 1e165, 1e166, 1e167, 1e168, 1e169, - 1e170, 1e171, 1e172, 1e173, 1e174, 1e175, 1e176, 1e177, 1e178, 1e179, - 1e180, 1e181, 1e182, 1e183, 1e184, 1e185, 1e186, 1e187, 1e188, 1e189, - 1e190, 1e191, 1e192, 1e193, 1e194, 1e195, 1e196, 1e197, 1e198, 1e199, - 1e200, 1e201, 1e202, 1e203, 1e204, 1e205, 1e206, 1e207, 1e208, 1e209, - 1e210, 1e211, 1e212, 1e213, 1e214, 1e215, 1e216, 1e217, 1e218, 1e219, - 1e220, 1e221, 1e222, 1e223, 1e224, 1e225, 1e226, 1e227, 1e228, 1e229, - 1e230, 1e231, 1e232, 1e233, 1e234, 1e235, 1e236, 1e237, 1e238, 1e239, - 1e240, 1e241, 1e242, 1e243, 1e244, 1e245, 1e246, 1e247, 1e248, 1e249, - 1e250, 1e251, 1e252, 1e253, 1e254, 1e255, 1e256, 1e257, 1e258, 1e259, - 1e260, 1e261, 1e262, 1e263, 1e264, 1e265, 1e266, 1e267, 1e268, 1e269, - 1e270, 1e271, 1e272, 1e273, 1e274, 1e275, 1e276, 1e277, 1e278, 1e279, - 1e280, 1e281, 1e282, 1e283, 1e284, 1e285, 1e286, 1e287, 1e288, 1e289, - 1e290, 1e291, 1e292, 1e293, 1e294, 1e295, 1e296, 1e297, 1e298, 1e299, - 1e300, 1e301, 1e302, 1e303, 1e304, 1e305, 1e306, 1e307, 1e308]; - -impl<'a, R: Read> de::Deserializer for &'a mut Deserializer { - type Error = Error; - - #[inline] - fn deserialize(self, visitor: V) -> Result - where V: de::Visitor, - { - self.parse_value(visitor) - } - - /// Parses a `null` as a None, and any other values as a `Some(...)`. - #[inline] - fn deserialize_option(self, visitor: V) -> Result - where V: de::Visitor, - { - try!(self.parse_whitespace()); - - match try!(self.peek_or_null()) { - b'n' => { - self.eat_char(); - try!(self.parse_ident(b"ull")); - visitor.visit_none() - } - _ => visitor.visit_some(self), - } - } - - /// Parses a newtype struct as the underlying value. - #[inline] - fn deserialize_newtype_struct( - self, - _name: &str, - visitor: V - ) -> Result - where V: de::Visitor, - { - visitor.visit_newtype_struct(self) - } - - /// Parses an enum as an object like `{"$KEY":$VALUE}`, where $VALUE is either a straight - /// value, a `[..]`, or a `{..}`. - #[inline] - fn deserialize_enum( - self, - _name: &str, - _variants: &'static [&'static str], - visitor: V - ) -> Result - where V: de::Visitor, - { - try!(self.parse_whitespace()); - - match try!(self.peek_or_null()) { - b'{' => { - self.remaining_depth -= 1; - if self.remaining_depth == 0 { - return Err(self.peek_error(ErrorCode::RecursionLimitExceeded)); - } - - self.eat_char(); - let value = try!(visitor.visit_enum(VariantVisitor::new(self))); - - self.remaining_depth += 1; - - try!(self.parse_whitespace()); - - match try!(self.next_char_or_null()) { - b'}' => Ok(value), - _ => Err(self.error(ErrorCode::ExpectedSomeValue)), - } - } - b'"' => visitor.visit_enum(UnitVariantVisitor::new(self)), - _ => Err(self.peek_error(ErrorCode::ExpectedSomeValue)), - } - } - - /// Parses a JSON string as bytes. Note that this function does not - /// check whether the bytes represent valid unicode code points. - /// - /// The JSON specification requires that strings only contain valid - /// unicode characters. To deal with non-conforming JSON, you may use - /// this function, which attempts to parse a string without checking - /// whether the bytes represent valid unicode code points. - /// - /// Escape sequences are processed as usual, and for `\uXXXX` escapes - /// it is still checked if the hex number represents a valid unicode - /// code point. - /// - /// # Example usage - /// - /// You can use this to parse JSON strings containing non-unicode bytes: - /// - /// ``` - /// # extern crate serde; - /// # extern crate serde_json; - /// # - /// let bytes = serde::bytes::ByteBuf::from(b"some raw bytes: \xe5\x00\xe5".to_vec()); - /// let parsed = serde_json::from_slice( b"\"some raw bytes: \xe5\x00\xe5\"").unwrap(); - /// - /// assert_eq!(bytes, parsed); - /// ``` - /// - /// `\u` escape sequences with invalid unicode code points still fail to parse: - /// - /// ``` - /// # extern crate serde; - /// # extern crate serde_json; - /// # - /// let json = "\"invalid unicode surrogate: \\uD801\""; - /// let parsed: Result = serde_json::from_str(json); - /// assert!(parsed.is_err(), "{} should not parse: {:?}", json, parsed); - /// ``` - fn deserialize_bytes(self, visitor: V) -> Result - where V: de::Visitor - { - try!(self.parse_whitespace()); - - match try!(self.peek_or_null()) { - b'"' => { - self.eat_char(); - self.str_buf.clear(); - let slice = try!(self.read.parse_str_raw(&mut self.str_buf)); - visitor.visit_bytes(slice) - } - _ => self.deserialize(visitor), - } - - } - - #[inline] - fn deserialize_byte_buf(self, visitor: V) -> Result - where V: de::Visitor - { - self.deserialize_bytes(visitor) - } - - forward_to_deserialize! { - bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq - seq_fixed_size map unit_struct tuple_struct struct - struct_field tuple ignored_any - } -} - -struct SeqVisitor<'a, R: Read + 'a> { - de: &'a mut Deserializer, - first: bool, -} - -impl<'a, R: Read + 'a> SeqVisitor<'a, R> { - fn new(de: &'a mut Deserializer) -> Self { - SeqVisitor { - de: de, - first: true, - } - } -} - -impl<'a, R: Read + 'a> de::SeqVisitor for SeqVisitor<'a, R> { - type Error = Error; - - fn visit_seed(&mut self, seed: T) -> Result> - where T: de::DeserializeSeed, - { - try!(self.de.parse_whitespace()); - - match try!(self.de.peek()) { - Some(b']') => { - return Ok(None); - } - Some(b',') if !self.first => { - self.de.eat_char(); - } - Some(_) => { - if self.first { - self.first = false; - } else { - return Err(self.de - .peek_error(ErrorCode::ExpectedListCommaOrEnd)); - } - } - None => { - return Err(self.de.peek_error(ErrorCode::EOFWhileParsingList)); - } - } - - let value = try!(seed.deserialize(&mut *self.de)); - Ok(Some(value)) - } -} - -struct MapVisitor<'a, R: Read + 'a> { - de: &'a mut Deserializer, - first: bool, -} - -impl<'a, R: Read + 'a> MapVisitor<'a, R> { - fn new(de: &'a mut Deserializer) -> Self { - MapVisitor { - de: de, - first: true, - } - } -} - -impl<'a, R: Read + 'a> de::MapVisitor for MapVisitor<'a, R> { - type Error = Error; - - fn visit_key_seed(&mut self, seed: K) -> Result> - where K: de::DeserializeSeed, - { - try!(self.de.parse_whitespace()); - - match try!(self.de.peek()) { - Some(b'}') => { - return Ok(None); - } - Some(b',') if !self.first => { - self.de.eat_char(); - try!(self.de.parse_whitespace()); - } - Some(_) => { - if self.first { - self.first = false; - } else { - return Err(self.de - .peek_error(ErrorCode::ExpectedObjectCommaOrEnd)); - } - } - None => { - return Err(self.de - .peek_error(ErrorCode::EOFWhileParsingObject)); - } - } - - match try!(self.de.peek()) { - Some(b'"') => Ok(Some(try!(seed.deserialize(&mut *self.de)))), - Some(_) => Err(self.de.peek_error(ErrorCode::KeyMustBeAString)), - None => Err(self.de.peek_error(ErrorCode::EOFWhileParsingValue)), - } - } - - fn visit_value_seed(&mut self, seed: V) -> Result - where V: de::DeserializeSeed, - { - try!(self.de.parse_object_colon()); - - seed.deserialize(&mut *self.de) - } -} - -struct VariantVisitor<'a, R: Read + 'a> { - de: &'a mut Deserializer, -} - -impl<'a, R: Read + 'a> VariantVisitor<'a, R> { - fn new(de: &'a mut Deserializer) -> Self { - VariantVisitor { - de: de, - } - } -} - -impl<'a, R: Read + 'a> de::EnumVisitor for VariantVisitor<'a, R> { - type Error = Error; - type Variant = Self; - - fn visit_variant_seed(self, seed: V) -> Result<(V::Value, Self)> - where V: de::DeserializeSeed, - { - let val = try!(seed.deserialize(&mut *self.de)); - try!(self.de.parse_object_colon()); - Ok((val, self)) - } -} - -impl<'a, R: Read + 'a> de::VariantVisitor for VariantVisitor<'a, R> { - type Error = Error; - - fn visit_unit(self) -> Result<()> { - de::Deserialize::deserialize(self.de) - } - - fn visit_newtype_seed(self, seed: T) -> Result - where T: de::DeserializeSeed, - { - seed.deserialize(self.de) - } - - fn visit_tuple(self, _len: usize, visitor: V) -> Result - where V: de::Visitor, - { - de::Deserializer::deserialize(self.de, visitor) - } - - fn visit_struct( - self, - _fields: &'static [&'static str], - visitor: V - ) -> Result - where V: de::Visitor, - { - de::Deserializer::deserialize(self.de, visitor) - } -} - -struct UnitVariantVisitor<'a, R: Read + 'a> { - de: &'a mut Deserializer, -} - -impl<'a, R: Read + 'a> UnitVariantVisitor<'a, R> { - fn new(de: &'a mut Deserializer) -> Self { - UnitVariantVisitor { - de: de, - } - } -} - -impl<'a, R: Read + 'a> de::EnumVisitor for UnitVariantVisitor<'a, R> { - type Error = Error; - type Variant = Self; - - fn visit_variant_seed(self, seed: V) -> Result<(V::Value, Self)> - where V: de::DeserializeSeed, - { - let variant = try!(seed.deserialize(&mut *self.de)); - Ok((variant, self)) - } -} - -impl<'a, R: Read + 'a> de::VariantVisitor for UnitVariantVisitor<'a, R> { - type Error = Error; - - fn visit_unit(self) -> Result<()> { - Ok(()) - } - - fn visit_newtype_seed(self, _seed: T) -> Result - where T: de::DeserializeSeed, - { - Err(de::Error::invalid_type(Unexpected::UnitVariant, &"newtype variant")) - } - - fn visit_tuple(self, _len: usize, _visitor: V) -> Result - where V: de::Visitor, - { - Err(de::Error::invalid_type(Unexpected::UnitVariant, &"tuple variant")) - } - - fn visit_struct( - self, - _fields: &'static [&'static str], - _visitor: V - ) -> Result - where V: de::Visitor, - { - Err(de::Error::invalid_type(Unexpected::UnitVariant, &"struct variant")) - } -} - -////////////////////////////////////////////////////////////////////////////// - -/// Iterator that deserializes a stream into multiple JSON values. -/// -/// A stream deserializer can be created from any JSON deserializer using the -/// `Deserializer::into_iter` method. -/// -/// ```rust -/// extern crate serde_json; -/// -/// use serde_json::{Deserializer, Value}; -/// -/// fn main() { -/// let data = "1 2 {\"k\": 3}"; -/// -/// let stream = Deserializer::from_str(data).into_iter::(); -/// -/// for value in stream { -/// println!("{}", value.unwrap()); -/// } -/// } -/// ``` -pub struct StreamDeserializer { - de: Deserializer, - _marker: PhantomData, -} - -impl StreamDeserializer - where R: read::Read, - T: de::Deserialize -{ - /// Create a JSON stream deserializer from one of the possible serde_json - /// input sources. - /// - /// Typically it is more convenient to use one of these methods instead: - /// - /// - Deserializer::from_str(...).into_iter() - /// - Deserializer::from_bytes(...).into_iter() - /// - Deserializer::from_iter(...).into_iter() - /// - Deserializer::from_reader(...).into_iter() - pub fn new(read: R) -> Self { - StreamDeserializer { - de: Deserializer::new(read), - _marker: PhantomData, - } - } -} - -impl Iterator for StreamDeserializer - where R: Read, - T: de::Deserialize, -{ - type Item = Result; - - fn next(&mut self) -> Option> { - // skip whitespaces, if any - // this helps with trailing whitespaces, since whitespaces between - // values are handled for us. - match self.de.parse_whitespace() { - Ok(true) => None, // eof - Ok(false) => { - match de::Deserialize::deserialize(&mut self.de) { - Ok(v) => Some(Ok(v)), - Err(e) => Some(Err(e)), - } - } - Err(e) => Some(Err(e)), - } - } -} - -////////////////////////////////////////////////////////////////////////////// - -fn from_trait(read: R) -> Result - where R: Read, - T: de::Deserialize, -{ - let mut de = Deserializer::new(read); - let value = try!(de::Deserialize::deserialize(&mut de)); - - // Make sure the whole stream has been consumed. - try!(de.end()); - Ok(value) -} - -/// Deserialize an instance of type `T` from an iterator over bytes of JSON. -/// -/// This conversion can fail if the structure of the Value does not match the -/// structure expected by `T`, for example if `T` is a struct type but the Value -/// contains something other than a JSON map. It can also fail if the structure -/// is correct but `T`'s implementation of `Deserialize` decides that something -/// is wrong with the data, for example required struct fields are missing from -/// the JSON map or some number is too big to fit in the expected primitive -/// type. -pub fn from_iter(iter: I) -> Result - where I: Iterator>, - T: de::Deserialize, -{ - from_trait(read::IteratorRead::new(iter)) -} - -/// Deserialize an instance of type `T` from an IO stream of JSON. -/// -/// This conversion can fail if the structure of the Value does not match the -/// structure expected by `T`, for example if `T` is a struct type but the Value -/// contains something other than a JSON map. It can also fail if the structure -/// is correct but `T`'s implementation of `Deserialize` decides that something -/// is wrong with the data, for example required struct fields are missing from -/// the JSON map or some number is too big to fit in the expected primitive -/// type. -pub fn from_reader(rdr: R) -> Result - where R: io::Read, - T: de::Deserialize, -{ - from_iter(rdr.bytes()) -} - -/// Deserialize an instance of type `T` from bytes of JSON text. -/// -/// This conversion can fail if the structure of the Value does not match the -/// structure expected by `T`, for example if `T` is a struct type but the Value -/// contains something other than a JSON map. It can also fail if the structure -/// is correct but `T`'s implementation of `Deserialize` decides that something -/// is wrong with the data, for example required struct fields are missing from -/// the JSON map or some number is too big to fit in the expected primitive -/// type. -pub fn from_slice(v: &[u8]) -> Result - where T: de::Deserialize, -{ - from_trait(read::SliceRead::new(v)) -} - -/// Deserialize an instance of type `T` from a string of JSON text. -/// -/// This conversion can fail if the structure of the Value does not match the -/// structure expected by `T`, for example if `T` is a struct type but the Value -/// contains something other than a JSON map. It can also fail if the structure -/// is correct but `T`'s implementation of `Deserialize` decides that something -/// is wrong with the data, for example required struct fields are missing from -/// the JSON map or some number is too big to fit in the expected primitive -/// type. -pub fn from_str(s: &str) -> Result - where T: de::Deserialize, -{ - from_trait(read::StrRead::new(s)) -} diff --git a/third_party/rust/serde_json/src/error.rs b/third_party/rust/serde_json/src/error.rs deleted file mode 100644 index 53f5e26f3e3e..000000000000 --- a/third_party/rust/serde_json/src/error.rs +++ /dev/null @@ -1,273 +0,0 @@ -//! When serializing or deserializing JSON goes wrong. - -use std::error; -use std::fmt::{self, Debug, Display}; -use std::io; -use std::result; - -use serde::de; -use serde::ser; - -/// This type represents all possible errors that can occur when serializing or -/// deserializing JSON data. -pub struct Error { - err: Box, -} - -/// Alias for a `Result` with the error type `serde_json::Error`. -pub type Result = result::Result; - -enum ErrorImpl { - /// The JSON value had some syntatic error. - Syntax(ErrorCode, usize, usize), - - /// Some IO error occurred when serializing or deserializing a value. - Io(io::Error), -} - -// Not public API. Should be pub(crate). -#[doc(hidden)] -#[derive(Clone, PartialEq, Debug)] -pub enum ErrorCode { - /// Catchall for syntax error messages - Message(String), - - /// EOF while parsing a list. - EOFWhileParsingList, - - /// EOF while parsing an object. - EOFWhileParsingObject, - - /// EOF while parsing a string. - EOFWhileParsingString, - - /// EOF while parsing a JSON value. - EOFWhileParsingValue, - - /// Expected this character to be a `':'`. - ExpectedColon, - - /// Expected this character to be either a `','` or a `]`. - ExpectedListCommaOrEnd, - - /// Expected this character to be either a `','` or a `}`. - ExpectedObjectCommaOrEnd, - - /// Expected to parse either a `true`, `false`, or a `null`. - ExpectedSomeIdent, - - /// Expected this character to start a JSON value. - ExpectedSomeValue, - - /// Expected this character to start a JSON string. - ExpectedSomeString, - - /// Invalid hex escape code. - InvalidEscape, - - /// Invalid number. - InvalidNumber, - - /// Number is bigger than the maximum value of its type. - NumberOutOfRange, - - /// Invalid unicode code point. - InvalidUnicodeCodePoint, - - /// Object key is not a string. - KeyMustBeAString, - - /// Lone leading surrogate in hex escape. - LoneLeadingSurrogateInHexEscape, - - /// JSON has non-whitespace trailing characters after the value. - TrailingCharacters, - - /// Unexpected end of hex excape. - UnexpectedEndOfHexEscape, - - /// Encountered nesting of JSON maps and arrays more than 128 layers deep. - RecursionLimitExceeded, -} - -impl Error { - // Not public API. Should be pub(crate). - #[doc(hidden)] - pub fn syntax(code: ErrorCode, line: usize, col: usize) -> Self { - Error { - err: Box::new(ErrorImpl::Syntax(code, line, col)), - } - } - - // Not public API. Should be pub(crate). - #[doc(hidden)] - pub fn fix_position(self, f: F) -> Self - where F: FnOnce(ErrorCode) -> Error - { - if let ErrorImpl::Syntax(code, 0, 0) = *self.err { - f(code) - } else { - self - } - } -} - -impl Display for ErrorCode { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - ErrorCode::Message(ref msg) => write!(f, "{}", msg), - ErrorCode::EOFWhileParsingList => { - f.write_str("EOF while parsing a list") - } - ErrorCode::EOFWhileParsingObject => { - f.write_str("EOF while parsing an object") - } - ErrorCode::EOFWhileParsingString => { - f.write_str("EOF while parsing a string") - } - ErrorCode::EOFWhileParsingValue => { - f.write_str("EOF while parsing a value") - } - ErrorCode::ExpectedColon => { - f.write_str("expected `:`") - } - ErrorCode::ExpectedListCommaOrEnd => { - f.write_str("expected `,` or `]`") - } - ErrorCode::ExpectedObjectCommaOrEnd => { - f.write_str("expected `,` or `}`") - } - ErrorCode::ExpectedSomeIdent => { - f.write_str("expected ident") - } - ErrorCode::ExpectedSomeValue => { - f.write_str("expected value") - } - ErrorCode::ExpectedSomeString => { - f.write_str("expected string") - } - ErrorCode::InvalidEscape => { - f.write_str("invalid escape") - } - ErrorCode::InvalidNumber => { - f.write_str("invalid number") - } - ErrorCode::NumberOutOfRange => { - f.write_str("number out of range") - } - ErrorCode::InvalidUnicodeCodePoint => { - f.write_str("invalid unicode code point") - } - ErrorCode::KeyMustBeAString => { - f.write_str("key must be a string") - } - ErrorCode::LoneLeadingSurrogateInHexEscape => { - f.write_str("lone leading surrogate in hex escape") - } - ErrorCode::TrailingCharacters => { - f.write_str("trailing characters") - } - ErrorCode::UnexpectedEndOfHexEscape => { - f.write_str("unexpected end of hex escape") - } - ErrorCode::RecursionLimitExceeded => { - f.write_str("recursion limit exceeded") - } - } - } -} - -impl error::Error for Error { - fn description(&self) -> &str { - match *self.err { - ErrorImpl::Syntax(..) => { - // If you want a better message, use Display::fmt or to_string(). - "JSON error" - } - ErrorImpl::Io(ref error) => error::Error::description(error), - } - } - - fn cause(&self) -> Option<&error::Error> { - match *self.err { - ErrorImpl::Io(ref error) => Some(error), - _ => None, - } - } -} - -impl Display for Error { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - match *self.err { - ErrorImpl::Syntax(ref code, line, col) => { - if line == 0 && col == 0 { - write!(fmt, "{}", code) - } else { - write!(fmt, "{} at line {} column {}", code, line, col) - } - } - ErrorImpl::Io(ref error) => fmt::Display::fmt(error, fmt), - } - } -} - -// Remove two layers of verbosity from the debug representation. Humans often -// end up seeing this representation because it is what unwrap() shows. -impl Debug for Error { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - match *self.err { - ErrorImpl::Syntax(ref code, ref line, ref col) => { - formatter.debug_tuple("Syntax") - .field(code) - .field(line) - .field(col) - .finish() - } - ErrorImpl::Io(ref io) => { - formatter.debug_tuple("Io") - .field(io) - .finish() - } - } - } -} - -impl From for Error { - fn from(error: ErrorImpl) -> Error { - Error { - err: Box::new(error), - } - } -} - -impl From for Error { - fn from(error: io::Error) -> Error { - Error { - err: Box::new(ErrorImpl::Io(error)), - } - } -} - -impl From for Error { - fn from(error: de::value::Error) -> Error { - Error { - err: Box::new(ErrorImpl::Syntax(ErrorCode::Message(error.to_string()), 0, 0)), - } - } -} - -impl de::Error for Error { - fn custom(msg: T) -> Error { - Error { - err: Box::new(ErrorImpl::Syntax(ErrorCode::Message(msg.to_string()), 0, 0)), - } - } -} - -impl ser::Error for Error { - fn custom(msg: T) -> Error { - Error { - err: Box::new(ErrorImpl::Syntax(ErrorCode::Message(msg.to_string()), 0, 0)), - } - } -} diff --git a/third_party/rust/serde_json/src/lib.rs b/third_party/rust/serde_json/src/lib.rs deleted file mode 100644 index 2c49eb3c4970..000000000000 --- a/third_party/rust/serde_json/src/lib.rs +++ /dev/null @@ -1,291 +0,0 @@ -//! # Serde JSON -//! -//! JSON is a ubiquitous open-standard format that uses human-readable text to -//! transmit data objects consisting of key-value pairs. -//! -//! ```json,ignore -//! { -//! "name": "John Doe", -//! "age": 43, -//! "address": { -//! "street": "10 Downing Street", -//! "city": "London" -//! }, -//! "phones": [ -//! "+44 1234567", -//! "+44 2345678" -//! ] -//! } -//! ``` -//! -//! There are three common ways that you might find yourself needing to work -//! with JSON data in Rust. -//! -//! - **As text data.** An unprocessed string of JSON data that you receive on -//! an HTTP endpoint, read from a file, or prepare to send to a remote -//! server. -//! - **As an untyped or loosely typed representation.** Maybe you want to -//! check that some JSON data is valid before passing it on, but without -//! knowing the structure of what it contains. Or you want to do very basic -//! manipulations like add a level of nesting. -//! - **As a strongly typed Rust data structure.** When you expect all or most -//! of your data to conform to a particular structure and want to get real -//! work done without JSON's loosey-goosey nature tripping you up. -//! -//! Serde JSON provides efficient, flexible, safe ways of converting data -//! between each of these representations. -//! -//! # JSON to the Value enum -//! -//! Any valid JSON data can be manipulated in the following recursive enum -//! representation. This data structure is [`serde_json::Value`][value]. -//! -//! ```rust -//! # use serde_json::{Number, Map}; -//! # #[allow(dead_code)] -//! enum Value { -//! Null, -//! Bool(bool), -//! Number(Number), -//! String(String), -//! Array(Vec), -//! Object(Map), -//! } -//! ``` -//! -//! A string of JSON data can be parsed into a `serde_json::Value` by the -//! [`serde_json::from_str`][from_str] function. There is also -//! [`from_slice`][from_slice] for parsing from a byte slice &[u8], -//! [`from_iter`][from_iter] for parsing from an iterator of bytes, and -//! [`from_reader`][from_reader] for parsing from any `io::Read` like a File or -//! a TCP stream. -//! -//! ```rust -//! # extern crate serde_json; -//! # use serde_json::Error; -//! # pub fn example() -> Result<(), Error> { -//! use serde_json::Value; -//! -//! let data = r#" { "name": "John Doe", "age": 43, ... } "#; -//! let v: Value = serde_json::from_str(data)?; -//! println!("Please call {} at the number {}", v["name"], v["phones"][0]); -//! # Ok(()) } -//! # fn main() {} -//! ``` -//! -//! The `Value` representation is sufficient for very basic tasks but is brittle -//! and tedious to work with. Error handling is verbose to implement correctly, -//! for example imagine trying to detect the presence of unrecognized fields in -//! the input data. The compiler is powerless to help you when you make a -//! mistake, for example imagine typoing `v["name"]` as `v["nmae"]` in one of -//! the dozens of places it is used in your code. -//! -//! # JSON to strongly typed data structures -//! -//! Serde provides a powerful way of mapping JSON data into Rust data structures -//! largely automatically. -//! -//! ```rust -//! # extern crate serde_json; -//! # #[macro_use] extern crate serde_derive; -//! # use serde_json::Error; -//! # pub fn example() -> Result<(), Error> { -//! #[derive(Serialize, Deserialize)] -//! struct Person { -//! name: String, -//! age: u8, -//! address: Address, -//! phones: Vec, -//! } -//! -//! #[derive(Serialize, Deserialize)] -//! struct Address { -//! street: String, -//! city: String, -//! } -//! -//! let data = r#" { "name": "John Doe", "age": 43, ... } "#; -//! let p: Person = serde_json::from_str(data)?; -//! println!("Please call {} at the number {}", p.name, p.phones[0]); -//! # Ok(()) } -//! # fn main() {} -//! ``` -//! -//! This is the same `serde_json::from_str` function as before, but this time we -//! assign the return value to a variable of type `Person` so Serde JSON will -//! automatically interpret the input data as a `Person` and produce informative -//! error messages if the layout does not conform to what a `Person` is expected -//! to look like. -//! -//! Any type that implements Serde's `Deserialize` trait can be deserialized -//! this way. This includes built-in Rust standard library types like `Vec` -//! and `HashMap`, as well as any structs or enums annotated with -//! `#[derive(Deserialize)]`. -//! -//! Once we have `p` of type `Person`, our IDE and the Rust compiler can help us -//! use it correctly like they do for any other Rust code. The IDE can -//! autocomplete field names to prevent typos, which was impossible in the -//! `serde_json::Value` representation. And the Rust compiler can check that -//! when we write `p.phones[0]`, then `p.phones` is guaranteed to be a -//! `Vec` so indexing into it makes sense and produces a `String`. -//! -//! # Constructing JSON -//! -//! Serde JSON provides a [`json!` macro][macro] to build `serde_json::Value` -//! objects with very natural JSON syntax. In order to use this macro, -//! `serde_json` needs to be imported with the `#[macro_use]` attribute. -//! -//! ```rust -//! #[macro_use] -//! extern crate serde_json; -//! -//! fn main() { -//! // The type of `john` is `serde_json::Value` -//! let john = json!({ -//! "name": "John Doe", -//! "age": 43, -//! "phones": [ -//! "+44 1234567", -//! "+44 2345678" -//! ] -//! }); -//! -//! println!("first phone number: {}", john["phones"][0]); -//! -//! // Convert to a string of JSON and print it out -//! println!("{}", john.to_string()); -//! } -//! ``` -//! -//! The `Value::to_string()` function converts a `serde_json::Value` into a -//! `String` of JSON text. -//! -//! One neat thing about the `json!` macro is that variables and expressions can -//! be interpolated directly into the JSON value as you are building it. Serde -//! will check at compile time that the value you are interpolating is able to -//! be represented as JSON. -//! -//! ```rust -//! # #[macro_use] extern crate serde_json; -//! # fn random_phone() -> u16 { 0 } -//! # fn main() { -//! let full_name = "John Doe"; -//! let age_last_year = 42; -//! -//! // The type of `john` is `serde_json::Value` -//! let john = json!({ -//! "name": full_name, -//! "age": age_last_year + 1, -//! "phones": [ -//! format!("+44 {}", random_phone()) -//! ] -//! }); -//! # let _ = john; -//! # } -//! ``` -//! -//! This is amazingly convenient but we have the problem we had before with -//! `Value` which is that the IDE and Rust compiler cannot help us if we get it -//! wrong. Serde JSON provides a better way of serializing strongly-typed data -//! structures into JSON text. -//! -//! # Serializing data structures -//! -//! A data structure can be converted to a JSON string by -//! [`serde_json::to_string`][to_string]. There is also -//! [`serde_json::to_vec`][to_vec] which serializes to a `Vec` and -//! [`serde_json::to_writer`][to_writer] which serializes to any `io::Write` -//! such as a File or a TCP stream. -//! -//! ```rust -//! # extern crate serde_json; -//! # #[macro_use] extern crate serde_derive; -//! # use serde_json::Error; -//! # pub fn example() -> Result { -//! #[derive(Serialize, Deserialize)] -//! struct Address { -//! street: String, -//! city: String, -//! } -//! -//! let address = Address { -//! street: "10 Downing Street".to_owned(), -//! city: "London".to_owned(), -//! }; -//! -//! let j = serde_json::to_string(&address)?; -//! # Ok(j) } -//! # fn main() {} -//! ``` -//! -//! Any type that implements Serde's `Serialize` trait can be serialized this -//! way. This includes built-in Rust standard library types like `Vec` and -//! `HashMap`, as well as any structs or enums annotated with -//! `#[derive(Serialize)]`. -//! -//! [value]: https://docs.serde.rs/serde_json/value/enum.Value.html -//! [from_str]: https://docs.serde.rs/serde_json/de/fn.from_str.html -//! [from_slice]: https://docs.serde.rs/serde_json/de/fn.from_slice.html -//! [from_iter]: https://docs.serde.rs/serde_json/de/fn.from_iter.html -//! [from_reader]: https://docs.serde.rs/serde_json/de/fn.from_reader.html -//! [to_string]: https://docs.serde.rs/serde_json/ser/fn.to_string.html -//! [to_vec]: https://docs.serde.rs/serde_json/ser/fn.to_vec.html -//! [to_writer]: https://docs.serde.rs/serde_json/ser/fn.to_writer.html -//! [macro]: https://docs.serde.rs/serde_json/macro.json.html - -#![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))] -// Because of "JavaScript"... fixed in Manishearth/rust-clippy#1071 -#![cfg_attr(feature = "cargo-clippy", allow(doc_markdown))] -// Whitelisted clippy_pedantic lints -#![cfg_attr(feature = "cargo-clippy", allow( -// Deserializer::from_str, from_iter, into_iter - should_implement_trait, -// integer and float ser/de requires these sorts of casts - cast_possible_truncation, - cast_possible_wrap, - cast_precision_loss, - cast_sign_loss, -// string ser/de uses indexing and slicing - indexing_slicing, -// things are often more readable this way - shadow_reuse, - shadow_unrelated, - single_match_else, - stutter, -// not practical - missing_docs_in_private_items, -))] - -#![deny(missing_docs)] - -extern crate num_traits; -extern crate core; -#[macro_use] -extern crate serde; -extern crate itoa; -extern crate dtoa; -#[cfg(feature = "preserve_order")] -extern crate linked_hash_map; - -#[doc(inline)] -pub use self::de::{Deserializer, StreamDeserializer, from_iter, from_reader, - from_slice, from_str}; -#[doc(inline)] -pub use self::error::{Error, Result}; -#[doc(inline)] -pub use self::ser::{Serializer, to_string, to_string_pretty, to_vec, - to_vec_pretty, to_writer, to_writer_pretty}; -#[doc(inline)] -pub use self::value::{Map, Number, Value, from_value, to_value}; - -#[macro_use] -mod macros; - -pub mod de; -pub mod error; -pub mod map; -pub mod ser; -pub mod value; - -mod number; -mod read; diff --git a/third_party/rust/serde_json/src/macros.rs b/third_party/rust/serde_json/src/macros.rs deleted file mode 100644 index 71410dba095f..000000000000 --- a/third_party/rust/serde_json/src/macros.rs +++ /dev/null @@ -1,259 +0,0 @@ -/// Construct a `serde_json::Value` from a JSON literal. -/// -/// ```rust -/// # #![allow(unused_variables)] -/// # #[macro_use] extern crate serde_json; -/// # fn main() { -/// let value = json!({ -/// "code": 200, -/// "success": true, -/// "payload": { -/// "features": [ -/// "serde", -/// "json" -/// ] -/// } -/// }); -/// # } -/// ``` -/// -/// Variables or expressions can be interpolated into the JSON literal. Any type -/// interpolated into an array element or object value must implement Serde's -/// `Serialize` trait, while any type interpolated into a object key must -/// implement `Into`. -/// -/// ```rust -/// # #![allow(unused_variables)] -/// # #[macro_use] extern crate serde_json; -/// # fn main() { -/// let code = 200; -/// let features = vec!["serde", "json"]; -/// -/// let value = json!({ -/// "code": code, -/// "success": code == 200, -/// "payload": { -/// features[0]: features[1] -/// } -/// }); -/// # } -/// ``` -/// -/// Trailing commas are allowed inside both arrays and objects. -/// -/// ```rust -/// # #![allow(unused_variables)] -/// # #[macro_use] extern crate serde_json; -/// # fn main() { -/// let value = json!([ -/// "notice", -/// "the", -/// "trailing", -/// "comma -->", -/// ]); -/// # } -/// ``` -#[macro_export] -macro_rules! json { - // Hide distracting implementation details from the generated rustdoc. - ($($json:tt)+) => { - json_internal!($($json)+) - }; -} - -// Rocket relies on this because they export their own `json!` with a different -// doc comment than ours, and various Rust bugs prevent them from calling our -// `json!` from their `json!` so they call `json_internal!` directly. Check with -// @SergioBenitez before making breaking changes to this macro. -// -// Changes are fine as long as `json_internal!` does not call any new helper -// macros and can still be invoked as `json_internal!($($json)+)`. -#[macro_export] -#[doc(hidden)] -macro_rules! json_internal { - ////////////////////////////////////////////////////////////////////////// - // TT muncher for parsing the inside of an array [...]. Produces a vec![...] - // of the elements. - // - // Must be invoked as: json_internal!(@array [] $($tt)*) - ////////////////////////////////////////////////////////////////////////// - - // Done with trailing comma. - (@array [$($elems:expr,)*]) => { - vec![$($elems,)*] - }; - - // Done without trailing comma. - (@array [$($elems:expr),*]) => { - vec![$($elems),*] - }; - - // Next element is `null`. - (@array [$($elems:expr,)*] null $($rest:tt)*) => { - json_internal!(@array [$($elems,)* json_internal!(null)] $($rest)*) - }; - - // Next element is `true`. - (@array [$($elems:expr,)*] true $($rest:tt)*) => { - json_internal!(@array [$($elems,)* json_internal!(true)] $($rest)*) - }; - - // Next element is `false`. - (@array [$($elems:expr,)*] false $($rest:tt)*) => { - json_internal!(@array [$($elems,)* json_internal!(false)] $($rest)*) - }; - - // Next element is an array. - (@array [$($elems:expr,)*] [$($array:tt)*] $($rest:tt)*) => { - json_internal!(@array [$($elems,)* json_internal!([$($array)*])] $($rest)*) - }; - - // Next element is a map. - (@array [$($elems:expr,)*] {$($map:tt)*} $($rest:tt)*) => { - json_internal!(@array [$($elems,)* json_internal!({$($map)*})] $($rest)*) - }; - - // Next element is an expression followed by comma. - (@array [$($elems:expr,)*] $next:expr, $($rest:tt)*) => { - json_internal!(@array [$($elems,)* json_internal!($next),] $($rest)*) - }; - - // Last element is an expression with no trailing comma. - (@array [$($elems:expr,)*] $last:expr) => { - json_internal!(@array [$($elems,)* json_internal!($last)]) - }; - - // Comma after the most recent element. - (@array [$($elems:expr),*] , $($rest:tt)*) => { - json_internal!(@array [$($elems,)*] $($rest)*) - }; - - ////////////////////////////////////////////////////////////////////////// - // TT muncher for parsing the inside of an object {...}. Each entry is - // inserted into the given map variable. - // - // Must be invoked as: json_internal!(@object $map () $($tt)*) - ////////////////////////////////////////////////////////////////////////// - - // Done. - (@object $object:ident ()) => {}; - - // Insert the current entry followed by trailing comma. - (@object $object:ident [$($key:tt)+] ($value:expr) , $($rest:tt)*) => { - $object.insert(($($key)+).into(), $value); - json_internal!(@object $object () $($rest)*); - }; - - // Insert the last entry without trailing comma. - (@object $object:ident [$($key:tt)+] ($value:expr)) => { - $object.insert(($($key)+).into(), $value); - }; - - // Next value is `null`. - (@object $object:ident ($($key:tt)+) : null $($rest:tt)*) => { - json_internal!(@object $object [$($key)+] (json_internal!(null)) $($rest)*); - }; - - // Next value is `true`. - (@object $object:ident ($($key:tt)+) : true $($rest:tt)*) => { - json_internal!(@object $object [$($key)+] (json_internal!(true)) $($rest)*); - }; - - // Next value is `false`. - (@object $object:ident ($($key:tt)+) : false $($rest:tt)*) => { - json_internal!(@object $object [$($key)+] (json_internal!(false)) $($rest)*); - }; - - // Next value is an array. - (@object $object:ident ($($key:tt)+) : [$($array:tt)*] $($rest:tt)*) => { - json_internal!(@object $object [$($key)+] (json_internal!([$($array)*])) $($rest)*); - }; - - // Next value is a map. - (@object $object:ident ($($key:tt)+) : {$($map:tt)*} $($rest:tt)*) => { - json_internal!(@object $object [$($key)+] (json_internal!({$($map)*})) $($rest)*); - }; - - // Next value is an expression followed by comma. - (@object $object:ident ($($key:tt)+) : $value:expr , $($rest:tt)*) => { - json_internal!(@object $object [$($key)+] (json_internal!($value)) , $($rest)*); - }; - - // Last value is an expression with no trailing comma. - (@object $object:ident ($($key:tt)+) : $value:expr) => { - json_internal!(@object $object [$($key)+] (json_internal!($value))); - }; - - // Missing value for last entry. Trigger a reasonable error message - // referring to the unexpected end of macro invocation. - (@object $object:ident ($($key:tt)+) :) => { - json_internal!(); - }; - - // Misplaced colon. Trigger a reasonable error message by failing to match - // the colon in the recursive call. - (@object $object:ident () : $($rest:tt)*) => { - json_internal!(:); - }; - - // Found a comma inside a key. Trigger a reasonable error message by failing - // to match the comma in the recursive call. - (@object $object:ident ($($key:tt)*) , $($rest:tt)*) => { - json_internal!(,); - }; - - // Key is fully parenthesized. This avoids clippy double_parens false - // positives because the parenthesization may be necessary here. - (@object $object:ident () ($key:expr) : $($rest:tt)*) => { - json_internal!(@object $object ($key) : $($rest)*); - }; - - // Munch a token into the current key. - (@object $object:ident ($($key:tt)*) $tt:tt $($rest:tt)*) => { - json_internal!(@object $object ($($key)* $tt) $($rest)*); - }; - - ////////////////////////////////////////////////////////////////////////// - // The main implementation. - // - // Must be invoked as: json_internal!($($json)+) - ////////////////////////////////////////////////////////////////////////// - - (null) => { - $crate::Value::Null - }; - - (true) => { - $crate::Value::Bool(true) - }; - - (false) => { - $crate::Value::Bool(false) - }; - - ([]) => { - $crate::Value::Array(vec![]) - }; - - ([ $($tt:tt)+ ]) => { - $crate::Value::Array(json_internal!(@array [] $($tt)+)) - }; - - ({}) => { - $crate::Value::Object($crate::Map::new()) - }; - - ({ $($tt:tt)+ }) => { - $crate::Value::Object({ - let mut object = $crate::Map::new(); - json_internal!(@object object () $($tt)+); - object - }) - }; - - // Any Serialize type: numbers, strings, struct literals, variables etc. - // Must be below every other rule. - ($other:expr) => { - $crate::value::ToJson::to_json(&$other).unwrap() - }; -} diff --git a/third_party/rust/serde_json/src/map.rs b/third_party/rust/serde_json/src/map.rs deleted file mode 100644 index d6493ebd71f3..000000000000 --- a/third_party/rust/serde_json/src/map.rs +++ /dev/null @@ -1,775 +0,0 @@ -//! A map of String to serde_json::Value. -//! -//! By default the map is backed by a BTreeMap. Enable the `preserve_order` -//! feature of serde_json to use LinkedHashMap instead. - -use serde::{ser, de}; -use std::fmt::{self, Debug}; -use value::Value; -use std::hash::Hash; -use std::iter::FromIterator; -use std::borrow::Borrow; -use std::ops; - -#[cfg(not(feature = "preserve_order"))] -use std::collections::{BTreeMap, btree_map}; - -#[cfg(feature = "preserve_order")] -use linked_hash_map::{self, LinkedHashMap}; - -/// Represents a JSON key/value type. -pub struct Map { - map: MapImpl, -} - -#[cfg(not(feature = "preserve_order"))] -type MapImpl = BTreeMap; -#[cfg(feature = "preserve_order")] -type MapImpl = LinkedHashMap; - -impl Map { - /// Makes a new empty Map. - #[inline] - pub fn new() -> Self { - Map { - map: MapImpl::new(), - } - } - - #[cfg(not(feature = "preserve_order"))] - /// Makes a new empty Map with the given initial capacity. - #[inline] - pub fn with_capacity(capacity: usize) -> Self { - // does not support with_capacity - let _ = capacity; - Map { - map: BTreeMap::new(), - } - } - - #[cfg(feature = "preserve_order")] - /// Makes a new empty Map with the given initial capacity. - #[inline] - pub fn with_capacity(capacity: usize) -> Self { - Map { - map: LinkedHashMap::with_capacity(capacity), - } - } - - /// Clears the map, removing all values. - #[inline] - pub fn clear(&mut self) { - self.map.clear() - } - - /// Returns a reference to the value corresponding to the key. - /// - /// The key may be any borrowed form of the map's key type, but the ordering - /// on the borrowed form *must* match the ordering on the key type. - #[inline] - pub fn get(&self, key: &Q) -> Option<&Value> - where String: Borrow, - Q: Ord + Eq + Hash - { - self.map.get(key) - } - - /// Returns true if the map contains a value for the specified key. - /// - /// The key may be any borrowed form of the map's key type, but the ordering - /// on the borrowed form *must* match the ordering on the key type. - #[inline] - pub fn contains_key(&self, key: &Q) -> bool - where String: Borrow, - Q: Ord + Eq + Hash - { - self.map.contains_key(key) - } - - /// Returns a mutable reference to the value corresponding to the key. - /// - /// The key may be any borrowed form of the map's key type, but the ordering - /// on the borrowed form *must* match the ordering on the key type. - #[inline] - pub fn get_mut(&mut self, key: &Q) -> Option<&mut Value> - where String: Borrow, - Q: Ord + Eq + Hash - { - self.map.get_mut(key) - } - - /// Inserts a key-value pair into the map. - /// - /// If the map did not have this key present, `None` is returned. - /// - /// If the map did have this key present, the value is updated, and the old - /// value is returned. The key is not updated, though; this matters for - /// types that can be `==` without being identical. - #[inline] - pub fn insert(&mut self, k: String, v: Value) -> Option { - self.map.insert(k, v) - } - - /// Removes a key from the map, returning the value at the key if the key - /// was previously in the map. - /// - /// The key may be any borrowed form of the map's key type, but the ordering - /// on the borrowed form *must* match the ordering on the key type. - #[inline] - pub fn remove(&mut self, key: &Q) -> Option - where String: Borrow, - Q: Ord + Eq + Hash - { - self.map.remove(key) - } - - /// Gets the given key's corresponding entry in the map for in-place - /// manipulation. - pub fn entry(&mut self, key: S) -> Entry - where S: Into - { - #[cfg(not(feature = "preserve_order"))] - use std::collections::btree_map::Entry as EntryImpl; - #[cfg(feature = "preserve_order")] - use linked_hash_map::Entry as EntryImpl; - - match self.map.entry(key.into()) { - EntryImpl::Vacant(vacant) => { - Entry::Vacant(VacantEntry { vacant: vacant }) - } - EntryImpl::Occupied(occupied) => { - Entry::Occupied(OccupiedEntry { occupied: occupied }) - } - } - } - - /// Returns the number of elements in the map. - #[inline] - pub fn len(&self) -> usize { - self.map.len() - } - - /// Returns true if the map contains no elements. - #[inline] - pub fn is_empty(&self) -> bool { - self.map.is_empty() - } - - /// Gets an iterator over the entries of the map. - #[inline] - pub fn iter(&self) -> Iter { - Iter { - iter: self.map.iter(), - } - } - - /// Gets a mutable iterator over the entries of the map. - #[inline] - pub fn iter_mut(&mut self) -> IterMut { - IterMut { - iter: self.map.iter_mut(), - } - } - - /// Gets an iterator over the keys of the map. - #[inline] - pub fn keys(&self) -> Keys { - Keys { - iter: self.map.keys(), - } - } - - /// Gets an iterator over the values of the map. - #[inline] - pub fn values(&self) -> Values { - Values { - iter: self.map.values(), - } - } -} - -impl Default for Map { - #[inline] - fn default() -> Self { - Map { - map: MapImpl::new(), - } - } -} - -impl Clone for Map { - #[inline] - fn clone(&self) -> Self { - Map { - map: self.map.clone(), - } - } -} - -impl PartialEq for Map { - #[inline] - fn eq(&self, other: &Self) -> bool { - self.map.eq(&other.map) - } -} - -/// Access an element of this map. Panics if the given key is not present in the -/// map. -/// -/// ```rust -/// # use serde_json::Value; -/// # let val = &Value::String("".to_owned()); -/// # let _ = -/// match *val { -/// Value::String(ref s) => Some(s.as_str()), -/// Value::Array(ref arr) => arr[0].as_str(), -/// Value::Object(ref map) => map["type"].as_str(), -/// _ => None, -/// } -/// # ; -/// ``` -impl<'a, Q: ?Sized> ops::Index<&'a Q> for Map - where String: Borrow, - Q: Ord + Eq + Hash -{ - type Output = Value; - - fn index(&self, index: &Q) -> &Value { - self.map.index(index) - } -} - -/// Mutably access an element of this map. Panics if the given key is not -/// present in the map. -/// -/// ```rust -/// # #[macro_use] extern crate serde_json; -/// # fn main() { -/// # let mut map = serde_json::Map::new(); -/// # map.insert("key".to_owned(), serde_json::Value::Null); -/// map["key"] = json!("value"); -/// # } -/// ``` -impl<'a, Q: ?Sized> ops::IndexMut<&'a Q> for Map - where String: Borrow, - Q: Ord + Eq + Hash -{ - fn index_mut(&mut self, index: &Q) -> &mut Value { - self.map.get_mut(index).expect("no entry found for key") - } -} - -impl Debug for Map { - #[inline] - fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> { - self.map.fmt(formatter) - } -} - -impl ser::Serialize for Map { - #[inline] - fn serialize(&self, serializer: S) -> Result - where S: ser::Serializer - { - use serde::ser::SerializeMap; - let mut map = try!(serializer.serialize_map(Some(self.len()))); - for (k, v) in self { - try!(map.serialize_key(k)); - try!(map.serialize_value(v)); - } - map.end() - } -} - -impl de::Deserialize for Map { - #[inline] - fn deserialize(deserializer: D) -> Result - where D: de::Deserializer - { - struct Visitor; - - impl de::Visitor for Visitor { - type Value = Map; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a map") - } - - #[inline] - fn visit_unit(self) -> Result - where E: de::Error - { - Ok(Map::new()) - } - - #[inline] - fn visit_map(self, mut visitor: V) -> Result - where V: de::MapVisitor - { - let mut values = Map::with_capacity(visitor.size_hint().0); - - while let Some((key, value)) = try!(visitor.visit()) { - values.insert(key, value); - } - - Ok(values) - } - } - - deserializer.deserialize_map(Visitor) - } -} - -impl FromIterator<(String, Value)> for Map { - fn from_iter(iter: T) -> Self where T: IntoIterator { - Map { - map: FromIterator::from_iter(iter) - } - } -} - -impl Extend<(String, Value)> for Map { - fn extend(&mut self, iter: T) where T: IntoIterator { - self.map.extend(iter); - } -} - -macro_rules! delegate_iterator { - (($name:ident $($generics:tt)*) => $item:ty) => { - impl $($generics)* Iterator for $name $($generics)* { - type Item = $item; - #[inline] - fn next(&mut self) -> Option { - self.iter.next() - } - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } - } - - impl $($generics)* DoubleEndedIterator for $name $($generics)* { - #[inline] - fn next_back(&mut self) -> Option { - self.iter.next_back() - } - } - - impl $($generics)* ExactSizeIterator for $name $($generics)* { - #[inline] - fn len(&self) -> usize { - self.iter.len() - } - } - } -} - -////////////////////////////////////////////////////////////////////////////// - -/// A view into a single entry in a map, which may either be vacant or occupied. -/// This enum is constructed from the [`entry`] method on [`Map`]. -/// -/// [`entry`]: struct.Map.html#method.entry -/// [`BTreeMap`]: struct.Map.html -pub enum Entry<'a> { - /// A vacant Entry. - Vacant(VacantEntry<'a>), - /// An occupied Entry. - Occupied(OccupiedEntry<'a>), -} - -/// A vacant Entry. It is part of the [`Entry`] enum. -/// -/// [`Entry`]: enum.Entry.html -pub struct VacantEntry<'a> { - vacant: VacantEntryImpl<'a>, -} - -/// An occupied Entry. It is part of the [`Entry`] enum. -/// -/// [`Entry`]: enum.Entry.html -pub struct OccupiedEntry<'a> { - occupied: OccupiedEntryImpl<'a>, -} - -#[cfg(not(feature = "preserve_order"))] -type VacantEntryImpl<'a> = btree_map::VacantEntry<'a, String, Value>; -#[cfg(feature = "preserve_order")] -type VacantEntryImpl<'a> = linked_hash_map::VacantEntry<'a, String, Value>; - -#[cfg(not(feature = "preserve_order"))] -type OccupiedEntryImpl<'a> = btree_map::OccupiedEntry<'a, String, Value>; -#[cfg(feature = "preserve_order")] -type OccupiedEntryImpl<'a> = linked_hash_map::OccupiedEntry<'a, String, Value>; - -impl<'a> Entry<'a> { - /// Returns a reference to this entry's key. - /// - /// # Examples - /// - /// ```rust - /// let mut map = serde_json::Map::new(); - /// assert_eq!(map.entry("serde").key(), &"serde"); - /// ``` - pub fn key(&self) -> &String { - match *self { - Entry::Vacant(ref e) => e.key(), - Entry::Occupied(ref e) => e.key(), - } - } - - /// Ensures a value is in the entry by inserting the default if empty, and - /// returns a mutable reference to the value in the entry. - /// - /// # Examples - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// let mut map = serde_json::Map::new(); - /// map.entry("serde").or_insert(json!(12)); - /// - /// assert_eq!(map["serde"], 12); - /// # } - /// ``` - pub fn or_insert(self, default: Value) -> &'a mut Value { - match self { - Entry::Vacant(entry) => entry.insert(default.into()), - Entry::Occupied(entry) => entry.into_mut(), - } - } - - /// Ensures a value is in the entry by inserting the result of the default - /// function if empty, and returns a mutable reference to the value in the - /// entry. - /// - /// # Examples - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// let mut map = serde_json::Map::new(); - /// map.entry("serde").or_insert_with(|| json!("hoho")); - /// - /// assert_eq!(map["serde"], "hoho".to_owned()); - /// # } - /// ``` - pub fn or_insert_with(self, default: F) -> &'a mut Value - where F: FnOnce() -> Value - { - match self { - Entry::Vacant(entry) => entry.insert(default()), - Entry::Occupied(entry) => entry.into_mut(), - } - } -} - -impl<'a> VacantEntry<'a> { - /// Gets a reference to the key that would be used when inserting a value - /// through the VacantEntry. - /// - /// # Examples - /// - /// ```rust - /// use serde_json::map::Entry; - /// - /// let mut map = serde_json::Map::new(); - /// - /// match map.entry("serde") { - /// Entry::Vacant(vacant) => { - /// assert_eq!(vacant.key(), &"serde"); - /// } - /// Entry::Occupied(_) => unimplemented!(), - /// } - /// ``` - #[inline] - pub fn key(&self) -> &String { - self.vacant.key() - } - - /// Sets the value of the entry with the VacantEntry's key, and returns a - /// mutable reference to it. - /// - /// # Examples - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// use serde_json::map::Entry; - /// - /// let mut map = serde_json::Map::new(); - /// - /// match map.entry("serde") { - /// Entry::Vacant(vacant) => { - /// vacant.insert(json!("hoho")); - /// } - /// Entry::Occupied(_) => unimplemented!(), - /// } - /// # } - /// ``` - #[inline] - pub fn insert(self, value: Value) -> &'a mut Value { - self.vacant.insert(value.into()) - } -} - -impl<'a> OccupiedEntry<'a> { - /// Gets a reference to the key in the entry. - /// - /// # Examples - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// use serde_json::map::Entry; - /// - /// let mut map = serde_json::Map::new(); - /// map.insert("serde".to_owned(), json!(12)); - /// - /// match map.entry("serde") { - /// Entry::Occupied(occupied) => { - /// assert_eq!(occupied.key(), &"serde"); - /// } - /// Entry::Vacant(_) => unimplemented!(), - /// } - /// # } - /// ``` - #[inline] - pub fn key(&self) -> &String { - self.occupied.key() - } - - /// Gets a reference to the value in the entry. - /// - /// # Examples - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// use serde_json::map::Entry; - /// - /// let mut map = serde_json::Map::new(); - /// map.insert("serde".to_owned(), json!(12)); - /// - /// match map.entry("serde") { - /// Entry::Occupied(occupied) => { - /// assert_eq!(occupied.get(), 12); - /// } - /// Entry::Vacant(_) => unimplemented!(), - /// } - /// # } - /// ``` - #[inline] - pub fn get(&self) -> &Value { - self.occupied.get() - } - - /// Gets a mutable reference to the value in the entry. - /// - /// # Examples - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// use serde_json::map::Entry; - /// - /// let mut map = serde_json::Map::new(); - /// map.insert("serde".to_owned(), json!([1, 2, 3])); - /// - /// match map.entry("serde") { - /// Entry::Occupied(mut occupied) => { - /// occupied.get_mut().as_array_mut().unwrap().push(json!(4)); - /// } - /// Entry::Vacant(_) => unimplemented!(), - /// } - /// - /// assert_eq!(map["serde"].as_array().unwrap().len(), 4); - /// # } - /// ``` - #[inline] - pub fn get_mut(&mut self) -> &mut Value { - self.occupied.get_mut() - } - - /// Converts the entry into a mutable reference to its value. - /// - /// # Examples - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// use serde_json::map::Entry; - /// - /// let mut map = serde_json::Map::new(); - /// map.insert("serde".to_owned(), json!([1, 2, 3])); - /// - /// match map.entry("serde") { - /// Entry::Occupied(mut occupied) => { - /// occupied.into_mut().as_array_mut().unwrap().push(json!(4)); - /// } - /// Entry::Vacant(_) => unimplemented!(), - /// } - /// - /// assert_eq!(map["serde"].as_array().unwrap().len(), 4); - /// # } - /// ``` - #[inline] - pub fn into_mut(self) -> &'a mut Value { - self.occupied.into_mut() - } - - /// Sets the value of the entry with the `OccupiedEntry`'s key, and returns - /// the entry's old value. - /// - /// # Examples - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// use serde_json::map::Entry; - /// - /// let mut map = serde_json::Map::new(); - /// map.insert("serde".to_owned(), json!(12)); - /// - /// match map.entry("serde") { - /// Entry::Occupied(mut occupied) => { - /// assert_eq!(occupied.insert(json!(13)), 12); - /// assert_eq!(occupied.get(), 13); - /// } - /// Entry::Vacant(_) => unimplemented!(), - /// } - /// # } - /// ``` - #[inline] - pub fn insert(&mut self, value: Value) -> Value { - self.occupied.insert(value.into()) - } - - /// Takes the value of the entry out of the map, and returns it. - /// - /// # Examples - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// use serde_json::map::Entry; - /// - /// let mut map = serde_json::Map::new(); - /// map.insert("serde".to_owned(), json!(12)); - /// - /// match map.entry("serde") { - /// Entry::Occupied(occupied) => { - /// assert_eq!(occupied.remove(), 12); - /// } - /// Entry::Vacant(_) => unimplemented!(), - /// } - /// # } - /// ``` - #[inline] - pub fn remove(self) -> Value { - self.occupied.remove() - } -} - -////////////////////////////////////////////////////////////////////////////// - -impl<'a> IntoIterator for &'a Map { - type Item = (&'a String, &'a Value); - type IntoIter = Iter<'a>; - #[inline] - fn into_iter(self) -> Self::IntoIter { - Iter { - iter: self.map.iter(), - } - } -} - -/// An iterator over a serde_json::Map's entries. -pub struct Iter<'a> { - iter: IterImpl<'a>, -} - -#[cfg(not(feature = "preserve_order"))] -type IterImpl<'a> = btree_map::Iter<'a, String, Value>; -#[cfg(feature = "preserve_order")] -type IterImpl<'a> = linked_hash_map::Iter<'a, String, Value>; - -delegate_iterator!((Iter<'a>) => (&'a String, &'a Value)); - -////////////////////////////////////////////////////////////////////////////// - -impl<'a> IntoIterator for &'a mut Map { - type Item = (&'a String, &'a mut Value); - type IntoIter = IterMut<'a>; - #[inline] - fn into_iter(self) -> Self::IntoIter { - IterMut { - iter: self.map.iter_mut(), - } - } -} - -/// A mutable iterator over a serde_json::Map's entries. -pub struct IterMut<'a> { - iter: IterMutImpl<'a>, -} - -#[cfg(not(feature = "preserve_order"))] -type IterMutImpl<'a> = btree_map::IterMut<'a, String, Value>; -#[cfg(feature = "preserve_order")] -type IterMutImpl<'a> = linked_hash_map::IterMut<'a, String, Value>; - -delegate_iterator!((IterMut<'a>) => (&'a String, &'a mut Value)); - -////////////////////////////////////////////////////////////////////////////// - -impl IntoIterator for Map { - type Item = (String, Value); - type IntoIter = IntoIter; - #[inline] - fn into_iter(self) -> Self::IntoIter { - IntoIter { - iter: self.map.into_iter(), - } - } -} - -/// An owning iterator over a serde_json::Map's entries. -pub struct IntoIter { - iter: IntoIterImpl, -} - -#[cfg(not(feature = "preserve_order"))] -type IntoIterImpl = btree_map::IntoIter; -#[cfg(feature = "preserve_order")] -type IntoIterImpl = linked_hash_map::IntoIter; - -delegate_iterator!((IntoIter) => (String, Value)); - -////////////////////////////////////////////////////////////////////////////// - -/// An iterator over a serde_json::Map's keys. -pub struct Keys<'a> { - iter: KeysImpl<'a>, -} - -#[cfg(not(feature = "preserve_order"))] -type KeysImpl<'a> = btree_map::Keys<'a, String, Value>; -#[cfg(feature = "preserve_order")] -type KeysImpl<'a> = linked_hash_map::Keys<'a, String, Value>; - -delegate_iterator!((Keys<'a>) => &'a String); - -////////////////////////////////////////////////////////////////////////////// - -/// An iterator over a serde_json::Map's values. -pub struct Values<'a> { - iter: ValuesImpl<'a>, -} - -#[cfg(not(feature = "preserve_order"))] -type ValuesImpl<'a> = btree_map::Values<'a, String, Value>; -#[cfg(feature = "preserve_order")] -type ValuesImpl<'a> = linked_hash_map::Values<'a, String, Value>; - -delegate_iterator!((Values<'a>) => &'a Value); diff --git a/third_party/rust/serde_json/src/number.rs b/third_party/rust/serde_json/src/number.rs deleted file mode 100644 index ff401d97ef70..000000000000 --- a/third_party/rust/serde_json/src/number.rs +++ /dev/null @@ -1,235 +0,0 @@ -use error::Error; -use num_traits::NumCast; -use serde::de::{self, Visitor}; -use serde::{Serialize, Serializer, Deserialize, Deserializer}; -use std::fmt::{self, Debug, Display}; -use std::i64; - -/// Represents a JSON number, whether integer or floating point. -#[derive(Clone, PartialEq)] -pub struct Number { - n: N, -} - -// "N" is a prefix of "NegInt"... this is a false positive. -// https://github.com/Manishearth/rust-clippy/issues/1241 -#[cfg_attr(feature = "cargo-clippy", allow(enum_variant_names))] -#[derive(Copy, Clone, Debug, PartialEq)] -enum N { - PosInt(u64), - /// Always less than zero. - NegInt(i64), - /// Always finite. - Float(f64), -} - -impl Number { - /// Returns `true` if the number can be represented as `i64`. - #[inline] - pub fn is_i64(&self) -> bool { - match self.n { - N::PosInt(v) => v <= i64::MAX as u64, - N::NegInt(_) => true, - N::Float(_) => false, - } - } - - /// Returns `true` if the number can be represented as `u64`. - #[inline] - pub fn is_u64(&self) -> bool { - match self.n { - N::PosInt(_) => true, - N::NegInt(_) | N::Float(_) => false, - } - } - - /// Returns `true` if the number can be represented as `f64`. - #[inline] - pub fn is_f64(&self) -> bool { - match self.n { - N::Float(_) => true, - N::PosInt(_) | N::NegInt(_) => false, - } - } - - /// Returns the number represented as `i64` if possible, or else `None`. - #[inline] - pub fn as_i64(&self) -> Option { - match self.n { - N::PosInt(n) => NumCast::from(n), - N::NegInt(n) => Some(n), - N::Float(_) => None, - } - } - - /// Returns the number represented as `u64` if possible, or else `None`. - #[inline] - pub fn as_u64(&self) -> Option { - match self.n { - N::PosInt(n) => Some(n), - N::NegInt(n) => NumCast::from(n), - N::Float(_) => None, - } - } - - /// Returns the number represented as `f64` if possible, or else `None`. - #[inline] - pub fn as_f64(&self) -> Option { - match self.n { - N::PosInt(n) => NumCast::from(n), - N::NegInt(n) => NumCast::from(n), - N::Float(n) => Some(n), - } - } - - /// Converts a finite `f64` to a `Number`. Infinite or NaN values are not JSON - /// numbers. - #[inline] - pub fn from_f64(f: f64) -> Option { - if f.is_finite() { - Some(Number { n: N::Float(f) }) - } else { - None - } - } -} - -impl fmt::Display for Number { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - match self.n { - N::PosInt(i) => Display::fmt(&i, formatter), - N::NegInt(i) => Display::fmt(&i, formatter), - N::Float(f) => Display::fmt(&f, formatter), - } - } -} - -impl Debug for Number { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - Debug::fmt(&self.n, formatter) - } -} - -impl Serialize for Number { - #[inline] - fn serialize(&self, serializer: S) -> Result - where S: Serializer - { - match self.n { - N::PosInt(i) => serializer.serialize_u64(i), - N::NegInt(i) => serializer.serialize_i64(i), - N::Float(f) => serializer.serialize_f64(f), - } - } -} - -impl Deserialize for Number { - #[inline] - fn deserialize(deserializer: D) -> Result - where D: Deserializer - { - struct NumberVisitor; - - impl Visitor for NumberVisitor { - type Value = Number; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("a number") - } - - #[inline] - fn visit_i64(self, value: i64) -> Result { - Ok(value.into()) - } - - #[inline] - fn visit_u64(self, value: u64) -> Result { - Ok(value.into()) - } - - #[inline] - fn visit_f64(self, value: f64) -> Result - where E: de::Error - { - Number::from_f64(value).ok_or_else(|| de::Error::custom("not a JSON number")) - } - } - - deserializer.deserialize(NumberVisitor) - } -} - -impl Deserializer for Number { - type Error = Error; - - #[inline] - fn deserialize(self, visitor: V) -> Result - where V: Visitor - { - match self.n { - N::PosInt(i) => visitor.visit_u64(i), - N::NegInt(i) => visitor.visit_i64(i), - N::Float(f) => visitor.visit_f64(f), - } - } - - forward_to_deserialize! { - bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option - seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct - tuple_struct struct struct_field tuple enum ignored_any - } -} - -impl<'a> Deserializer for &'a Number { - type Error = Error; - - #[inline] - fn deserialize(self, visitor: V) -> Result - where V: Visitor - { - match self.n { - N::PosInt(i) => visitor.visit_u64(i), - N::NegInt(i) => visitor.visit_i64(i), - N::Float(f) => visitor.visit_f64(f), - } - } - - forward_to_deserialize! { - bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option - seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct - tuple_struct struct struct_field tuple enum ignored_any - } -} - -macro_rules! from_signed { - ($($signed_ty:ident)*) => { - $( - impl From<$signed_ty> for Number { - #[inline] - fn from(i: $signed_ty) -> Self { - if i < 0 { - Number { n: N::NegInt(i as i64) } - } else { - Number { n: N::PosInt(i as u64) } - } - } - } - )* - }; -} - -macro_rules! from_unsigned { - ($($unsigned_ty:ident)*) => { - $( - impl From<$unsigned_ty> for Number { - #[inline] - fn from(u: $unsigned_ty) -> Self { - Number { n: N::PosInt(u as u64) } - } - } - )* - }; -} - -from_signed!(i8 i16 i32 i64 isize); -from_unsigned!(u8 u16 u32 u64 usize); diff --git a/third_party/rust/serde_json/src/read.rs b/third_party/rust/serde_json/src/read.rs deleted file mode 100644 index b712925c8853..000000000000 --- a/third_party/rust/serde_json/src/read.rs +++ /dev/null @@ -1,637 +0,0 @@ -use std::{char, cmp, io, str}; - -use serde::iter::LineColIterator; - -use super::error::{Error, ErrorCode, Result}; - -/// Trait used by the deserializer for iterating over input. This is manually -/// "specialized" for iterating over &[u8]. Once feature(specialization) is -/// stable we can use actual specialization. -/// -/// This trait is sealed and cannot be implemented for types outside of -/// `serde_json`. -pub trait Read: private::Sealed { - #[doc(hidden)] - fn next(&mut self) -> io::Result>; - #[doc(hidden)] - fn peek(&mut self) -> io::Result>; - - /// Only valid after a call to peek(). Discards the peeked byte. - #[doc(hidden)] - fn discard(&mut self); - - /// Position of the most recent call to next(). - /// - /// The most recent call was probably next() and not peek(), but this method - /// should try to return a sensible result if the most recent call was - /// actually peek() because we don't always know. - /// - /// Only called in case of an error, so performance is not important. - #[doc(hidden)] - fn position(&self) -> Position; - - /// Position of the most recent call to peek(). - /// - /// The most recent call was probably peek() and not next(), but this method - /// should try to return a sensible result if the most recent call was - /// actually next() because we don't always know. - /// - /// Only called in case of an error, so performance is not important. - #[doc(hidden)] - fn peek_position(&self) -> Position; - - /// Assumes the previous byte was a quotation mark. Parses a JSON-escaped - /// string until the next quotation mark using the given scratch space if - /// necessary. The scratch space is initially empty. - #[doc(hidden)] - fn parse_str<'s>( - &'s mut self, - scratch: &'s mut Vec, - ) -> Result<&'s str>; - - /// Assumes the previous byte was a quotation mark. Parses a JSON-escaped - /// string until the next quotation mark using the given scratch space if - /// necessary. The scratch space is initially empty. - /// - /// This function returns the raw bytes in the string with escape sequences - /// expanded but without performing unicode validation. - #[doc(hidden)] - fn parse_str_raw<'s>( - &'s mut self, - scratch: &'s mut Vec - ) -> Result<&'s [u8]>; -} - -pub struct Position { - pub line: usize, - pub column: usize, -} - -/// JSON input source that reads from an iterator of bytes. -pub struct IteratorRead - where Iter: Iterator>, -{ - iter: LineColIterator, - /// Temporary storage of peeked byte. - ch: Option, -} - -/// JSON input source that reads from a std::io input stream. -pub struct IoRead - where R: io::Read -{ - delegate: IteratorRead>, -} - -/// JSON input source that reads from a slice of bytes. -// -// This is more efficient than other iterators because peek() can be read-only -// and we can compute line/col position only if an error happens. -pub struct SliceRead<'a> { - slice: &'a [u8], - /// Index of the *next* byte that will be returned by next() or peek(). - index: usize, -} - -/// JSON input source that reads from a UTF-8 string. -// -// Able to elide UTF-8 checks by assuming that the input is valid UTF-8. -pub struct StrRead<'a> { - delegate: SliceRead<'a>, -} - -// Prevent users from implementing the Read trait. -mod private { - pub trait Sealed {} -} - -////////////////////////////////////////////////////////////////////////////// - -impl IteratorRead - where Iter: Iterator>, -{ - /// Create a JSON input source to read from an iterator of bytes. - pub fn new(iter: Iter) -> Self { - IteratorRead { - iter: LineColIterator::new(iter), - ch: None, - } - } -} - -impl private::Sealed for IteratorRead - where Iter: Iterator> {} - -impl IteratorRead - where Iter: Iterator> -{ - fn parse_str_bytes<'s, T, F>( - &'s mut self, - scratch: &'s mut Vec, - validate: bool, - result: F - ) -> Result - where T: 's, - F: FnOnce(&'s Self, &'s [u8]) -> Result, - { - loop { - let ch = match try!(self.next()) { - Some(ch) => ch, - None => { - return error(self, ErrorCode::EOFWhileParsingString); - } - }; - if !ESCAPE[ch as usize] { - scratch.push(ch); - continue; - } - match ch { - b'"' => { - return result(self, scratch); - } - b'\\' => { - try!(parse_escape(self, scratch)); - } - _ => { - if validate { - return error(self, ErrorCode::InvalidUnicodeCodePoint); - } - scratch.push(ch); - } - } - } - } -} - -impl Read for IteratorRead - where Iter: Iterator>, -{ - #[inline] - fn next(&mut self) -> io::Result> { - match self.ch.take() { - Some(ch) => Ok(Some(ch)), - None => { - match self.iter.next() { - Some(Err(err)) => Err(err), - Some(Ok(ch)) => Ok(Some(ch)), - None => Ok(None), - } - } - } - } - - #[inline] - fn peek(&mut self) -> io::Result> { - match self.ch { - Some(ch) => Ok(Some(ch)), - None => { - match self.iter.next() { - Some(Err(err)) => Err(err), - Some(Ok(ch)) => { - self.ch = Some(ch); - Ok(self.ch) - } - None => Ok(None), - } - } - } - } - - #[inline] - fn discard(&mut self) { - self.ch = None; - } - - fn position(&self) -> Position { - Position { - line: self.iter.line(), - column: self.iter.col(), - } - } - - fn peek_position(&self) -> Position { - // The LineColIterator updates its position during peek() so it has the - // right one here. - self.position() - } - - fn parse_str<'s>( - &'s mut self, - scratch: &'s mut Vec - ) -> Result<&'s str> { - self.parse_str_bytes(scratch, true, as_str) - } - - fn parse_str_raw<'s>( - &'s mut self, - scratch: &'s mut Vec - ) -> Result<&'s [u8]> { - self.parse_str_bytes(scratch, false, |_, bytes| Ok(bytes)) - } -} - -////////////////////////////////////////////////////////////////////////////// - -impl IoRead - where R: io::Read -{ - /// Create a JSON input source to read from a std::io input stream. - pub fn new(reader: R) -> Self { - IoRead { - delegate: IteratorRead::new(reader.bytes()), - } - } -} - -impl private::Sealed for IoRead - where R: io::Read {} - -impl Read for IoRead - where R: io::Read -{ - #[inline] - fn next(&mut self) -> io::Result> { - self.delegate.next() - } - - #[inline] - fn peek(&mut self) -> io::Result> { - self.delegate.peek() - } - - #[inline] - fn discard(&mut self) { - self.delegate.discard(); - } - - #[inline] - fn position(&self) -> Position { - self.delegate.position() - } - - #[inline] - fn peek_position(&self) -> Position { - self.delegate.peek_position() - } - - #[inline] - fn parse_str<'s>( - &'s mut self, - scratch: &'s mut Vec - ) -> Result<&'s str> { - self.delegate.parse_str(scratch) - } - - #[inline] - fn parse_str_raw<'s>( - &'s mut self, - scratch: &'s mut Vec - ) -> Result<&'s [u8]> { - self.delegate.parse_str_raw(scratch) - } -} - -////////////////////////////////////////////////////////////////////////////// - -impl<'a> SliceRead<'a> { - /// Create a JSON input source to read from a slice of bytes. - pub fn new(slice: &'a [u8]) -> Self { - SliceRead { - slice: slice, - index: 0, - } - } - - fn position_of_index(&self, i: usize) -> Position { - let mut pos = Position { - line: 1, - column: 0, - }; - for ch in &self.slice[..i] { - match *ch { - b'\n' => { - pos.line += 1; - pos.column = 0; - } - _ => { - pos.column += 1; - } - } - } - pos - } - - /// The big optimization here over IteratorRead is that if the string - /// contains no backslash escape sequences, the returned &str is a slice of - /// the raw JSON data so we avoid copying into the scratch space. - fn parse_str_bytes<'s, T, F>( - &'s mut self, - scratch: &'s mut Vec, - validate: bool, - result: F - ) -> Result - where T: 's, - F: FnOnce(&'s Self, &'s [u8]) -> Result, - { - // Index of the first byte not yet copied into the scratch space. - let mut start = self.index; - - loop { - while self.index < self.slice.len() && - !ESCAPE[self.slice[self.index] as usize] { - self.index += 1; - } - if self.index == self.slice.len() { - return error(self, ErrorCode::EOFWhileParsingString); - } - match self.slice[self.index] { - b'"' => { - let string = if scratch.is_empty() { - // Fast path: return a slice of the raw JSON without any - // copying. - &self.slice[start..self.index] - } else { - scratch.extend_from_slice(&self.slice[start .. self.index]); - // "as &[u8]" is required for rustc 1.8.0 - scratch as &[u8] - }; - self.index += 1; - return result(self, string); - } - b'\\' => { - scratch.extend_from_slice(&self.slice[start..self.index]); - self.index += 1; - try!(parse_escape(self, scratch)); - start = self.index; - } - _ => { - if validate { - return error(self, ErrorCode::InvalidUnicodeCodePoint); - } - self.index += 1; - } - } - } - } -} - -impl<'a> private::Sealed for SliceRead<'a> {} - -impl<'a> Read for SliceRead<'a> { - #[inline] - fn next(&mut self) -> io::Result> { - // `Ok(self.slice.get(self.index).map(|ch| { self.index += 1; *ch }))` - // is about 10% slower. - Ok(if self.index < self.slice.len() { - let ch = self.slice[self.index]; - self.index += 1; - Some(ch) - } else { - None - }) - } - - #[inline] - fn peek(&mut self) -> io::Result> { - // `Ok(self.slice.get(self.index).map(|ch| *ch))` is about 10% slower - // for some reason. - Ok(if self.index < self.slice.len() { - Some(self.slice[self.index]) - } else { - None - }) - } - - #[inline] - fn discard(&mut self) { - self.index += 1; - } - - fn position(&self) -> Position { - self.position_of_index(self.index) - } - - fn peek_position(&self) -> Position { - // Cap it at slice.len() just in case the most recent call was next() - // and it returned the last byte. - self.position_of_index(cmp::min(self.slice.len(), self.index + 1)) - } - - fn parse_str<'s>( - &'s mut self, - scratch: &'s mut Vec - ) -> Result<&'s str> { - self.parse_str_bytes(scratch, true, as_str) - } - - fn parse_str_raw<'s>( - &'s mut self, - scratch: &'s mut Vec - ) -> Result<&'s [u8]> { - self.parse_str_bytes(scratch, false, |_, bytes| Ok(bytes)) - } - -} - -////////////////////////////////////////////////////////////////////////////// - -impl<'a> StrRead<'a> { - /// Create a JSON input source to read from a UTF-8 string. - pub fn new(s: &'a str) -> Self { - StrRead { - delegate: SliceRead::new(s.as_bytes()), - } - } -} - -impl<'a> private::Sealed for StrRead<'a> {} - -impl<'a> Read for StrRead<'a> { - #[inline] - fn next(&mut self) -> io::Result> { - self.delegate.next() - } - - #[inline] - fn peek(&mut self) -> io::Result> { - self.delegate.peek() - } - - #[inline] - fn discard(&mut self) { - self.delegate.discard(); - } - - fn position(&self) -> Position { - self.delegate.position() - } - - fn peek_position(&self) -> Position { - self.delegate.peek_position() - } - - fn parse_str<'s>( - &'s mut self, - scratch: &'s mut Vec - ) -> Result<&'s str> { - self.delegate.parse_str_bytes(scratch, true, |_, bytes| { - // The input is assumed to be valid UTF-8 and the \u-escapes are - // checked along the way, so don't need to check here. - Ok(unsafe { str::from_utf8_unchecked(bytes) }) - }) - } - - fn parse_str_raw<'s>( - &'s mut self, - scratch: &'s mut Vec - ) -> Result<&'s [u8]> { - self.delegate.parse_str_raw(scratch) - } -} - -////////////////////////////////////////////////////////////////////////////// - -const CT: bool = true; // control character \x00...\x1F -const QU: bool = true; // quote \x22 -const BS: bool = true; // backslash \x5C -const O: bool = false; // allow unescaped - -// Lookup table of bytes that must be escaped. A value of true at index i means -// that byte i requires an escape sequence in the input. -#[cfg_attr(rustfmt, rustfmt_skip)] -static ESCAPE: [bool; 256] = [ - // 1 2 3 4 5 6 7 8 9 A B C D E F - CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, // 0 - CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, CT, // 1 - O, O, QU, O, O, O, O, O, O, O, O, O, O, O, O, O, // 2 - O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, // 3 - O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, // 4 - O, O, O, O, O, O, O, O, O, O, O, O, BS, O, O, O, // 5 - O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, // 6 - O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, // 7 - O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, // 8 - O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, // 9 - O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, // A - O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, // B - O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, // C - O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, // D - O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, // E - O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, // F -]; - -fn error(read: &R, reason: ErrorCode) -> Result { - let pos = read.position(); - Err(Error::syntax(reason, pos.line, pos.column)) -} - -fn as_str<'s, R: Read>(read: &R, slice: &'s [u8]) -> Result<&'s str> { - str::from_utf8(slice) - .or_else(|_| error(read, ErrorCode::InvalidUnicodeCodePoint)) -} - -/// Parses a JSON escape sequence and appends it into the scratch space. Assumes -/// the previous byte read was a backslash. -fn parse_escape(read: &mut R, scratch: &mut Vec) -> Result<()> { - let ch = match try!(read.next()) { - Some(ch) => ch, - None => { - return error(read, ErrorCode::EOFWhileParsingString); - } - }; - - match ch { - b'"' => scratch.push(b'"'), - b'\\' => scratch.push(b'\\'), - b'/' => scratch.push(b'/'), - b'b' => scratch.push(b'\x08'), - b'f' => scratch.push(b'\x0c'), - b'n' => scratch.push(b'\n'), - b'r' => scratch.push(b'\r'), - b't' => scratch.push(b'\t'), - b'u' => { - let c = - match try!(decode_hex_escape(read)) { - 0xDC00...0xDFFF => { - return error(read, ErrorCode::LoneLeadingSurrogateInHexEscape); - } - - // Non-BMP characters are encoded as a sequence of - // two hex escapes, representing UTF-16 surrogates. - n1 @ 0xD800...0xDBFF => { - match (try!(read.next()), - try!(read.next())) { - (Some(b'\\'), Some(b'u')) => (), - _ => { - return error(read, ErrorCode::UnexpectedEndOfHexEscape); - } - } - - let n2 = try!(decode_hex_escape(read)); - - if n2 < 0xDC00 || n2 > 0xDFFF { - return error(read, ErrorCode::LoneLeadingSurrogateInHexEscape); - } - - let n = (((n1 - 0xD800) as u32) << 10 | - (n2 - 0xDC00) as u32) + - 0x1_0000; - - match char::from_u32(n as u32) { - Some(c) => c, - None => { - return error(read, ErrorCode::InvalidUnicodeCodePoint); - } - } - } - - n => { - match char::from_u32(n as u32) { - Some(c) => c, - None => { - return error(read, ErrorCode::InvalidUnicodeCodePoint); - } - } - } - }; - - // FIXME: this allocation is required in order to be compatible with stable - // rust, which doesn't support encoding a `char` into a stack buffer. - let mut buf = String::new(); - buf.push(c); - scratch.extend(buf.bytes()); - } - _ => { - return error(read, ErrorCode::InvalidEscape); - } - } - - Ok(()) -} - -fn decode_hex_escape(read: &mut R) -> Result { - let mut i = 0; - let mut n = 0; - while i < 4 && try!(read.peek()).is_some() { - n = match try!(read.next()).unwrap_or(b'\x00') { - c @ b'0'...b'9' => n * 16_u16 + ((c as u16) - (b'0' as u16)), - b'a' | b'A' => n * 16_u16 + 10_u16, - b'b' | b'B' => n * 16_u16 + 11_u16, - b'c' | b'C' => n * 16_u16 + 12_u16, - b'd' | b'D' => n * 16_u16 + 13_u16, - b'e' | b'E' => n * 16_u16 + 14_u16, - b'f' | b'F' => n * 16_u16 + 15_u16, - _ => { - return error(read, ErrorCode::InvalidEscape); - } - }; - - i += 1; - } - - // Error out if we didn't parse 4 digits. - if i != 4 { - return error(read, ErrorCode::InvalidEscape); - } - - Ok(n) -} diff --git a/third_party/rust/serde_json/src/ser.rs b/third_party/rust/serde_json/src/ser.rs deleted file mode 100644 index f59262bea26c..000000000000 --- a/third_party/rust/serde_json/src/ser.rs +++ /dev/null @@ -1,1354 +0,0 @@ -//! Serialize a Rust data structure into JSON data. - -use std::io; -use std::num::FpCategory; - -use serde::ser::{self, Impossible}; -use super::error::{Error, ErrorCode, Result}; - -use itoa; -use dtoa; - -/// A structure for serializing Rust values into JSON. -pub struct Serializer { - writer: W, - formatter: F, -} - -impl Serializer - where W: io::Write, -{ - /// Creates a new JSON serializer. - #[inline] - pub fn new(writer: W) -> Self { - Serializer::with_formatter(writer, CompactFormatter) - } -} - -impl<'a, W> Serializer> - where W: io::Write, -{ - /// Creates a new JSON pretty print serializer. - #[inline] - pub fn pretty(writer: W) -> Self { - Serializer::with_formatter(writer, PrettyFormatter::new()) - } -} - -impl Serializer - where W: io::Write, - F: Formatter, -{ - /// Creates a new JSON visitor whose output will be written to the writer - /// specified. - #[inline] - pub fn with_formatter(writer: W, formatter: F) -> Self { - Serializer { - writer: writer, - formatter: formatter, - } - } - - /// Unwrap the `Writer` from the `Serializer`. - #[inline] - pub fn into_inner(self) -> W { - self.writer - } -} - -impl<'a, W, F> ser::Serializer for &'a mut Serializer - where W: io::Write, - F: Formatter, -{ - type Ok = (); - type Error = Error; - - type SerializeSeq = Compound<'a, W, F>; - type SerializeTuple = Compound<'a, W, F>; - type SerializeTupleStruct = Compound<'a, W, F>; - type SerializeTupleVariant = Compound<'a, W, F>; - type SerializeMap = Compound<'a, W, F>; - type SerializeStruct = Compound<'a, W, F>; - type SerializeStructVariant = Compound<'a, W, F>; - - #[inline] - fn serialize_bool(self, value: bool) -> Result<()> { - self.formatter.write_bool(&mut self.writer, value) - } - - #[inline] - fn serialize_i8(self, value: i8) -> Result<()> { - self.formatter.write_i8(&mut self.writer, value) - } - - #[inline] - fn serialize_i16(self, value: i16) -> Result<()> { - self.formatter.write_i16(&mut self.writer, value) - } - - #[inline] - fn serialize_i32(self, value: i32) -> Result<()> { - self.formatter.write_i32(&mut self.writer, value) - } - - #[inline] - fn serialize_i64(self, value: i64) -> Result<()> { - self.formatter.write_i64(&mut self.writer, value) - } - - #[inline] - fn serialize_u8(self, value: u8) -> Result<()> { - self.formatter.write_u8(&mut self.writer, value) - } - - #[inline] - fn serialize_u16(self, value: u16) -> Result<()> { - self.formatter.write_u16(&mut self.writer, value) - } - - #[inline] - fn serialize_u32(self, value: u32) -> Result<()> { - self.formatter.write_u32(&mut self.writer, value) - } - - #[inline] - fn serialize_u64(self, value: u64) -> Result<()> { - self.formatter.write_u64(&mut self.writer, value) - } - - #[inline] - fn serialize_f32(self, value: f32) -> Result<()> { - match value.classify() { - FpCategory::Nan | FpCategory::Infinite => { - self.formatter.write_null(&mut self.writer) - } - _ => { - self.formatter.write_f32(&mut self.writer, value) - } - } - } - - #[inline] - fn serialize_f64(self, value: f64) -> Result<()> { - match value.classify() { - FpCategory::Nan | FpCategory::Infinite => { - self.formatter.write_null(&mut self.writer) - } - _ => { - self.formatter.write_f64(&mut self.writer, value) - } - } - } - - #[inline] - fn serialize_char(self, value: char) -> Result<()> { - format_escaped_char(&mut self.writer, &mut self.formatter, value).map_err(From::from) - } - - #[inline] - fn serialize_str(self, value: &str) -> Result<()> { - format_escaped_str(&mut self.writer, &mut self.formatter, value).map_err(From::from) - } - - #[inline] - fn serialize_bytes(self, value: &[u8]) -> Result<()> { - use serde::ser::SerializeSeq; - let mut seq = try!(self.serialize_seq(Some(value.len()))); - for byte in value { - try!(seq.serialize_element(byte)); - } - seq.end() - } - - #[inline] - fn serialize_unit(self) -> Result<()> { - self.formatter.write_null(&mut self.writer) - } - - #[inline] - fn serialize_unit_struct(self, _name: &'static str) -> Result<()> { - self.serialize_unit() - } - - #[inline] - fn serialize_unit_variant( - self, - _name: &'static str, - _variant_index: usize, - variant: &'static str - ) -> Result<()> { - self.serialize_str(variant) - } - - /// Serialize newtypes without an object wrapper. - #[inline] - fn serialize_newtype_struct( - self, - _name: &'static str, - value: &T - ) -> Result<()> - where T: ser::Serialize, - { - value.serialize(self) - } - - #[inline] - fn serialize_newtype_variant( - self, - _name: &'static str, - _variant_index: usize, - variant: &'static str, - value: &T - ) -> Result<()> - where T: ser::Serialize, - { - try!(self.formatter.begin_object(&mut self.writer)); - try!(self.formatter.begin_object_key(&mut self.writer, true)); - try!(self.serialize_str(variant)); - try!(self.formatter.end_object_key(&mut self.writer)); - try!(self.formatter.begin_object_value(&mut self.writer)); - try!(value.serialize(&mut *self)); - try!(self.formatter.end_object_value(&mut self.writer)); - self.formatter.end_object(&mut self.writer) - } - - #[inline] - fn serialize_none(self) -> Result<()> { - self.serialize_unit() - } - - #[inline] - fn serialize_some(self, value: &T) -> Result<()> - where T: ser::Serialize, - { - value.serialize(self) - } - - #[inline] - fn serialize_seq(self, len: Option) -> Result { - if len == Some(0) { - try!(self.formatter.begin_array(&mut self.writer)); - try!(self.formatter.end_array(&mut self.writer)); - Ok(Compound { ser: self, state: State::Empty }) - } else { - try!(self.formatter.begin_array(&mut self.writer)); - Ok(Compound { ser: self, state: State::First }) - } - } - - #[inline] - fn serialize_seq_fixed_size(self, size: usize) -> Result { - self.serialize_seq(Some(size)) - } - - #[inline] - fn serialize_tuple(self, len: usize) -> Result { - self.serialize_seq(Some(len)) - } - - #[inline] - fn serialize_tuple_struct( - self, - _name: &'static str, - len: usize - ) -> Result { - self.serialize_seq(Some(len)) - } - - #[inline] - fn serialize_tuple_variant( - self, - _name: &'static str, - _variant_index: usize, - variant: &'static str, - len: usize - ) -> Result { - try!(self.formatter.begin_object(&mut self.writer)); - try!(self.formatter.begin_object_key(&mut self.writer, true)); - try!(self.serialize_str(variant)); - try!(self.formatter.end_object_key(&mut self.writer)); - try!(self.formatter.begin_object_value(&mut self.writer)); - self.serialize_seq(Some(len)) - } - - #[inline] - fn serialize_map(self, len: Option) -> Result { - if len == Some(0) { - try!(self.formatter.begin_object(&mut self.writer)); - try!(self.formatter.end_object(&mut self.writer)); - Ok(Compound { ser: self, state: State::Empty }) - } else { - try!(self.formatter.begin_object(&mut self.writer)); - Ok(Compound { ser: self, state: State::First }) - } - } - - #[inline] - fn serialize_struct( - self, - _name: &'static str, - len: usize - ) -> Result { - self.serialize_map(Some(len)) - } - - #[inline] - fn serialize_struct_variant( - self, - _name: &'static str, - _variant_index: usize, - variant: &'static str, - len: usize - ) -> Result { - try!(self.formatter.begin_object(&mut self.writer)); - try!(self.formatter.begin_object_key(&mut self.writer, true)); - try!(self.serialize_str(variant)); - try!(self.formatter.end_object_key(&mut self.writer)); - try!(self.formatter.begin_object_value(&mut self.writer)); - self.serialize_map(Some(len)) - } -} - -#[doc(hidden)] -#[derive(Eq, PartialEq)] -pub enum State { - Empty, - First, - Rest, -} - -#[doc(hidden)] -pub struct Compound<'a, W: 'a, F: 'a> { - ser: &'a mut Serializer, - state: State, -} - -impl<'a, W, F> ser::SerializeSeq for Compound<'a, W, F> - where W: io::Write, - F: Formatter -{ - type Ok = (); - type Error = Error; - - #[inline] - fn serialize_element( - &mut self, - value: &T - ) -> Result<()> - where T: ser::Serialize, - { - try!(self.ser.formatter.begin_array_value(&mut self.ser.writer, self.state == State::First)); - self.state = State::Rest; - try!(value.serialize(&mut *self.ser)); - self.ser.formatter.end_array_value(&mut self.ser.writer) - } - - #[inline] - fn end(self) -> Result<()> { - match self.state { - State::Empty => Ok(()), - _ => self.ser.formatter.end_array(&mut self.ser.writer), - } - } -} - -impl<'a, W, F> ser::SerializeTuple for Compound<'a, W, F> - where W: io::Write, - F: Formatter -{ - type Ok = (); - type Error = Error; - - #[inline] - fn serialize_element( - &mut self, - value: &T, - ) -> Result<()> - where T: ser::Serialize, - { - ser::SerializeSeq::serialize_element(self, value) - } - - #[inline] - fn end(self) -> Result<()> { - ser::SerializeSeq::end(self) - } -} - -impl<'a, W, F> ser::SerializeTupleStruct for Compound<'a, W, F> - where W: io::Write, - F: Formatter -{ - type Ok = (); - type Error = Error; - - #[inline] - fn serialize_field( - &mut self, - value: &T - ) -> Result<()> - where T: ser::Serialize, - { - ser::SerializeSeq::serialize_element(self, value) - } - - #[inline] - fn end(self) -> Result<()> { - ser::SerializeSeq::end(self) - } -} - -impl<'a, W, F> ser::SerializeTupleVariant for Compound<'a, W, F> - where W: io::Write, - F: Formatter -{ - type Ok = (); - type Error = Error; - - #[inline] - fn serialize_field( - &mut self, - value: &T - ) -> Result<()> - where T: ser::Serialize, - { - ser::SerializeSeq::serialize_element(self, value) - } - - #[inline] - fn end(self) -> Result<()> { - match self.state { - State::Empty => {} - _ => try!(self.ser.formatter.end_array(&mut self.ser.writer)), - } - try!(self.ser.formatter.end_object_value(&mut self.ser.writer)); - self.ser.formatter.end_object(&mut self.ser.writer) - } -} - -impl<'a, W, F> ser::SerializeMap for Compound<'a, W, F> - where W: io::Write, - F: Formatter -{ - type Ok = (); - type Error = Error; - - #[inline] - fn serialize_key( - &mut self, - key: &T, - ) -> Result<()> - where T: ser::Serialize, - { - try!(self.ser.formatter.begin_object_key(&mut self.ser.writer, self.state == State::First)); - self.state = State::Rest; - - try!(key.serialize(MapKeySerializer { - ser: self.ser, - })); - - self.ser.formatter.end_object_key(&mut self.ser.writer) - } - - #[inline] - fn serialize_value( - &mut self, - value: &T, - ) -> Result<()> - where T: ser::Serialize, - { - try!(self.ser.formatter.begin_object_value(&mut self.ser.writer)); - try!(value.serialize(&mut *self.ser)); - self.ser.formatter.end_object_value(&mut self.ser.writer) - } - - #[inline] - fn end(self) -> Result<()> { - match self.state { - State::Empty => Ok(()), - _ => self.ser.formatter.end_object(&mut self.ser.writer), - } - } -} - -impl<'a, W, F> ser::SerializeStruct for Compound<'a, W, F> - where W: io::Write, - F: Formatter -{ - type Ok = (); - type Error = Error; - - #[inline] - fn serialize_field( - &mut self, - key: &'static str, - value: &T - ) -> Result<()> - where T: ser::Serialize, - { - try!(ser::SerializeMap::serialize_key(self, key)); - ser::SerializeMap::serialize_value(self, value) - } - - #[inline] - fn end(self) -> Result<()> { - ser::SerializeMap::end(self) - } -} - -impl<'a, W, F> ser::SerializeStructVariant for Compound<'a, W, F> - where W: io::Write, - F: Formatter -{ - type Ok = (); - type Error = Error; - - #[inline] - fn serialize_field( - &mut self, - key: &'static str, - value: &T - ) -> Result<()> - where T: ser::Serialize, - { - ser::SerializeStruct::serialize_field(self, key, value) - } - - #[inline] - fn end(self) -> Result<()> { - match self.state { - State::Empty => {} - _ => try!(self.ser.formatter.end_object(&mut self.ser.writer)), - } - try!(self.ser.formatter.end_object_value(&mut self.ser.writer)); - self.ser.formatter.end_object(&mut self.ser.writer) - } -} - -struct MapKeySerializer<'a, W: 'a, F: 'a> { - ser: &'a mut Serializer, -} - -fn key_must_be_a_string() -> Error { - Error::syntax(ErrorCode::KeyMustBeAString, 0, 0) -} - -impl<'a, W, F> ser::Serializer for MapKeySerializer<'a, W, F> - where W: io::Write, - F: Formatter, -{ - type Ok = (); - type Error = Error; - - #[inline] - fn serialize_str(self, value: &str) -> Result<()> { - self.ser.serialize_str(value) - } - - #[inline] - fn serialize_unit_variant( - self, - _name: &'static str, - _variant_index: usize, - variant: &'static str - ) -> Result<()> { - self.ser.serialize_str(variant) - } - - #[inline] - fn serialize_newtype_struct( - self, - _name: &'static str, - value: &T - ) -> Result<()> - where T: ser::Serialize, - { - value.serialize(self) - } - - type SerializeSeq = Impossible<(), Error>; - type SerializeTuple = Impossible<(), Error>; - type SerializeTupleStruct = Impossible<(), Error>; - type SerializeTupleVariant = Impossible<(), Error>; - type SerializeMap = Impossible<(), Error>; - type SerializeStruct = Impossible<(), Error>; - type SerializeStructVariant = Impossible<(), Error>; - - fn serialize_bool(self, _value: bool) -> Result<()> { - Err(key_must_be_a_string()) - } - - fn serialize_i8(self, value: i8) -> Result<()> { - try!(self.ser.formatter.begin_string(&mut self.ser.writer)); - try!(self.ser.formatter.write_i8(&mut self.ser.writer, value)); - self.ser.formatter.end_string(&mut self.ser.writer) - } - - fn serialize_i16(self, value: i16) -> Result<()> { - try!(self.ser.formatter.begin_string(&mut self.ser.writer)); - try!(self.ser.formatter.write_i16(&mut self.ser.writer, value)); - self.ser.formatter.end_string(&mut self.ser.writer) - } - - fn serialize_i32(self, value: i32) -> Result<()> { - try!(self.ser.formatter.begin_string(&mut self.ser.writer)); - try!(self.ser.formatter.write_i32(&mut self.ser.writer, value)); - self.ser.formatter.end_string(&mut self.ser.writer) - } - - fn serialize_i64(self, value: i64) -> Result<()> { - try!(self.ser.formatter.begin_string(&mut self.ser.writer)); - try!(self.ser.formatter.write_i64(&mut self.ser.writer, value)); - self.ser.formatter.end_string(&mut self.ser.writer) - } - - fn serialize_u8(self, value: u8) -> Result<()> { - try!(self.ser.formatter.begin_string(&mut self.ser.writer)); - try!(self.ser.formatter.write_u8(&mut self.ser.writer, value)); - self.ser.formatter.end_string(&mut self.ser.writer) - } - - fn serialize_u16(self, value: u16) -> Result<()> { - try!(self.ser.formatter.begin_string(&mut self.ser.writer)); - try!(self.ser.formatter.write_u16(&mut self.ser.writer, value)); - self.ser.formatter.end_string(&mut self.ser.writer) - } - - fn serialize_u32(self, value: u32) -> Result<()> { - try!(self.ser.formatter.begin_string(&mut self.ser.writer)); - try!(self.ser.formatter.write_u32(&mut self.ser.writer, value)); - self.ser.formatter.end_string(&mut self.ser.writer) - } - - fn serialize_u64(self, value: u64) -> Result<()> { - try!(self.ser.formatter.begin_string(&mut self.ser.writer)); - try!(self.ser.formatter.write_u64(&mut self.ser.writer, value)); - self.ser.formatter.end_string(&mut self.ser.writer) - } - - fn serialize_f32(self, _value: f32) -> Result<()> { - Err(key_must_be_a_string()) - } - - fn serialize_f64(self, _value: f64) -> Result<()> { - Err(key_must_be_a_string()) - } - - fn serialize_char(self, _value: char) -> Result<()> { - Err(key_must_be_a_string()) - } - - fn serialize_bytes(self, _value: &[u8]) -> Result<()> { - Err(key_must_be_a_string()) - } - - fn serialize_unit(self) -> Result<()> { - Err(key_must_be_a_string()) - } - - fn serialize_unit_struct(self, _name: &'static str) -> Result<()> { - Err(key_must_be_a_string()) - } - - fn serialize_newtype_variant( - self, - _name: &'static str, - _variant_index: usize, - _variant: &'static str, - _value: &T - ) -> Result<()> - where T: ser::Serialize, - { - Err(key_must_be_a_string()) - } - - fn serialize_none(self) -> Result<()> { - Err(key_must_be_a_string()) - } - - fn serialize_some(self, _value: &T) -> Result<()> - where T: ser::Serialize, - { - Err(key_must_be_a_string()) - } - - fn serialize_seq(self, _len: Option) -> Result { - Err(key_must_be_a_string()) - } - - fn serialize_seq_fixed_size(self, _size: usize) -> Result { - Err(key_must_be_a_string()) - } - - fn serialize_tuple(self, _len: usize) -> Result { - Err(key_must_be_a_string()) - } - - fn serialize_tuple_struct( - self, - _name: &'static str, - _len: usize - ) -> Result { - Err(key_must_be_a_string()) - } - - fn serialize_tuple_variant( - self, - _name: &'static str, - _variant_index: usize, - _variant: &'static str, - _len: usize - ) -> Result { - Err(key_must_be_a_string()) - } - - fn serialize_map(self, _len: Option) -> Result { - Err(key_must_be_a_string()) - } - - fn serialize_struct( - self, - _name: &'static str, - _len: usize - ) -> Result { - Err(key_must_be_a_string()) - } - - fn serialize_struct_variant( - self, - _name: &'static str, - _variant_index: usize, - _variant: &'static str, - _len: usize - ) -> Result { - Err(key_must_be_a_string()) - } -} - -/// Represents a character escape code in a type-safe manner. -pub enum CharEscape { - /// An escaped quote `"` - Quote, - /// An escaped reverse solidus `\` - ReverseSolidus, - /// An escaped solidus `/` - Solidus, - /// An escaped backspace character (usually escaped as `\b`) - Backspace, - /// An escaped form feed character (usually escaped as `\f`) - FormFeed, - /// An escaped line feed character (usually escaped as `\n`) - LineFeed, - /// An escaped carriage return character (usually escaped as `\r`) - CarriageReturn, - /// An escaped tab character (usually escaped as `\t`) - Tab, - /// An escaped ASCII plane control character (usually escaped as - /// `\u00XX` where `XX` are two hex characters) - AsciiControl(u8), -} - -impl CharEscape { - #[inline] - fn from_escape_table(escape: u8, byte: u8) -> CharEscape { - match escape { - self::BB => CharEscape::Backspace, - self::TT => CharEscape::Tab, - self::NN => CharEscape::LineFeed, - self::FF => CharEscape::FormFeed, - self::RR => CharEscape::CarriageReturn, - self::QU => CharEscape::Quote, - self::BS => CharEscape::ReverseSolidus, - self::U => CharEscape::AsciiControl(byte), - _ => unreachable!(), - } - } -} - -/// This trait abstracts away serializing the JSON control characters, which allows the user to -/// optionally pretty print the JSON output. -pub trait Formatter { - /// Writes a `null` value to the specified writer. - #[inline] - fn write_null(&mut self, writer: &mut W) -> Result<()> - where W: io::Write - { - writer.write_all(b"null").map_err(From::from) - } - - /// Writes a `true` or `false` value to the specified writer. - #[inline] - fn write_bool(&mut self, writer: &mut W, value: bool) -> Result<()> - where W: io::Write - { - let s = if value { - b"true" as &[u8] - } else { - b"false" as &[u8] - }; - writer.write_all(s).map_err(From::from) - } - - /// Writes an integer value like `-123` to the specified writer. - #[inline] - fn write_i8(&mut self, writer: &mut W, value: i8) -> Result<()> - where W: io::Write - { - itoa::write(writer, value) - .map(|_| ()) - .map_err(From::from) - } - - /// Writes an integer value like `-123` to the specified writer. - #[inline] - fn write_i16(&mut self, writer: &mut W, value: i16) -> Result<()> - where W: io::Write - { - itoa::write(writer, value) - .map(|_| ()) - .map_err(From::from) - } - - /// Writes an integer value like `-123` to the specified writer. - #[inline] - fn write_i32(&mut self, writer: &mut W, value: i32) -> Result<()> - where W: io::Write - { - itoa::write(writer, value) - .map(|_| ()) - .map_err(From::from) - } - - /// Writes an integer value like `-123` to the specified writer. - #[inline] - fn write_i64(&mut self, writer: &mut W, value: i64) -> Result<()> - where W: io::Write - { - itoa::write(writer, value) - .map(|_| ()) - .map_err(From::from) - } - - /// Writes an integer value like `123` to the specified writer. - #[inline] - fn write_u8(&mut self, writer: &mut W, value: u8) -> Result<()> - where W: io::Write - { - itoa::write(writer, value) - .map(|_| ()) - .map_err(From::from) - } - - /// Writes an integer value like `123` to the specified writer. - #[inline] - fn write_u16(&mut self, writer: &mut W, value: u16) -> Result<()> - where W: io::Write - { - itoa::write(writer, value) - .map(|_| ()) - .map_err(From::from) - } - - /// Writes an integer value like `123` to the specified writer. - #[inline] - fn write_u32(&mut self, writer: &mut W, value: u32) -> Result<()> - where W: io::Write - { - itoa::write(writer, value) - .map(|_| ()) - .map_err(From::from) - } - - /// Writes an integer value like `123` to the specified writer. - #[inline] - fn write_u64(&mut self, writer: &mut W, value: u64) -> Result<()> - where W: io::Write - { - itoa::write(writer, value) - .map(|_| ()) - .map_err(From::from) - } - - /// Writes a floating point value like `-31.26e+12` to the specified writer. - #[inline] - fn write_f32(&mut self, writer: &mut W, value: f32) -> Result<()> - where W: io::Write - { - dtoa::write(writer, value) - .map(|_| ()) - .map_err(From::from) - } - - /// Writes a floating point value like `-31.26e+12` to the specified writer. - #[inline] - fn write_f64(&mut self, writer: &mut W, value: f64) -> Result<()> - where W: io::Write - { - dtoa::write(writer, value) - .map(|_| ()) - .map_err(From::from) - } - - /// Called before each series of `write_string_fragment` and - /// `write_char_escape`. Writes a `"` to the specified writer. - #[inline] - fn begin_string(&mut self, writer: &mut W) -> Result<()> - where W: io::Write - { - writer.write_all(b"\"").map_err(From::from) - } - - /// Called after each series of `write_string_fragment` and - /// `write_char_escape`. Writes a `"` to the specified writer. - #[inline] - fn end_string(&mut self, writer: &mut W) -> Result<()> - where W: io::Write - { - writer.write_all(b"\"").map_err(From::from) - } - - /// Writes a string fragment that doesn't need any escaping to the - /// specified writer. - #[inline] - fn write_string_fragment(&mut self, writer: &mut W, fragment: &[u8]) -> Result<()> - where W: io::Write - { - writer.write_all(fragment).map_err(From::from) - } - - /// Writes a character escape code to the specified writer. - #[inline] - fn write_char_escape(&mut self, writer: &mut W, char_escape: CharEscape) -> Result<()> - where W: io::Write - { - use self::CharEscape::*; - - let s = match char_escape { - Quote => b"\\\"", - ReverseSolidus => b"\\\\", - Solidus => b"\\/", - Backspace => b"\\b", - FormFeed => b"\\f", - LineFeed => b"\\n", - CarriageReturn => b"\\r", - Tab => b"\\t", - AsciiControl(byte) => { - static HEX_DIGITS: [u8; 16] = *b"0123456789abcdef"; - let bytes = &[b'\\', b'u', b'0', b'0', - HEX_DIGITS[(byte >> 4) as usize], - HEX_DIGITS[(byte & 0xF) as usize]]; - return writer.write_all(bytes).map_err(From::from); - } - }; - - writer.write_all(s).map_err(From::from) - } - - /// Called before every array. Writes a `[` to the specified - /// writer. - #[inline] - fn begin_array(&mut self, writer: &mut W) -> Result<()> - where W: io::Write - { - writer.write_all(b"[").map_err(From::from) - } - - /// Called after every array. Writes a `]` to the specified - /// writer. - #[inline] - fn end_array(&mut self, writer: &mut W) -> Result<()> - where W: io::Write - { - writer.write_all(b"]").map_err(From::from) - } - - /// Called before every array value. Writes a `,` if needed to - /// the specified writer. - #[inline] - fn begin_array_value(&mut self, writer: &mut W, first: bool) -> Result<()> - where W: io::Write - { - if first { - Ok(()) - } else { - writer.write_all(b",").map_err(From::from) - } - } - - /// Called after every array value. - #[inline] - fn end_array_value(&mut self, _writer: &mut W) -> Result<()> - where W: io::Write - { - Ok(()) - } - - /// Called before every object. Writes a `{` to the specified - /// writer. - #[inline] - fn begin_object(&mut self, writer: &mut W) -> Result<()> - where W: io::Write - { - writer.write_all(b"{").map_err(From::from) - } - - /// Called after every object. Writes a `}` to the specified - /// writer. - #[inline] - fn end_object(&mut self, writer: &mut W) -> Result<()> - where W: io::Write - { - writer.write_all(b"}").map_err(From::from) - } - - /// Called before every object key. - #[inline] - fn begin_object_key(&mut self, writer: &mut W, first: bool) -> Result<()> - where W: io::Write - { - if first { - Ok(()) - } else { - writer.write_all(b",").map_err(From::from) - } - } - - /// Called after every object key. A `:` should be written to the - /// specified writer by either this method or - /// `begin_object_value`. - #[inline] - fn end_object_key(&mut self, _writer: &mut W) -> Result<()> - where W: io::Write - { - Ok(()) - } - - /// Called before every object value. A `:` should be written to - /// the specified writer by either this method or - /// `end_object_key`. - #[inline] - fn begin_object_value(&mut self, writer: &mut W) -> Result<()> - where W: io::Write - { - writer.write_all(b":").map_err(From::from) - } - - /// Called after every object value. - #[inline] - fn end_object_value(&mut self, _writer: &mut W) -> Result<()> - where W: io::Write - { - Ok(()) - } -} - -/// This structure compacts a JSON value with no extra whitespace. -#[derive(Clone, Debug)] -pub struct CompactFormatter; - -impl Formatter for CompactFormatter {} - -/// This structure pretty prints a JSON value to make it human readable. -#[derive(Clone, Debug)] -pub struct PrettyFormatter<'a> { - current_indent: usize, - has_value: bool, - indent: &'a [u8], -} - -impl<'a> PrettyFormatter<'a> { - /// Construct a pretty printer formatter that defaults to using two spaces for indentation. - pub fn new() -> Self { - PrettyFormatter::with_indent(b" ") - } - - /// Construct a pretty printer formatter that uses the `indent` string for indentation. - pub fn with_indent(indent: &'a [u8]) -> Self { - PrettyFormatter { - current_indent: 0, - has_value: false, - indent: indent, - } - } -} - -impl<'a> Default for PrettyFormatter<'a> { - fn default() -> Self { - PrettyFormatter::new() - } -} - -impl<'a> Formatter for PrettyFormatter<'a> { - #[inline] - fn begin_array(&mut self, writer: &mut W) -> Result<()> - where W: io::Write - { - self.current_indent += 1; - self.has_value = false; - writer.write_all(b"[").map_err(From::from) - } - - #[inline] - fn end_array(&mut self, writer: &mut W) -> Result<()> - where W: io::Write - { - self.current_indent -= 1; - - if self.has_value { - try!(writer.write_all(b"\n")); - try!(indent(writer, self.current_indent, self.indent)); - } - - writer.write_all(b"]").map_err(From::from) - } - - #[inline] - fn begin_array_value(&mut self, writer: &mut W, first: bool) -> Result<()> - where W: io::Write - { - if first { - try!(writer.write_all(b"\n")); - } else { - try!(writer.write_all(b",\n")); - } - try!(indent(writer, self.current_indent, self.indent)); - Ok(()) - } - - #[inline] - fn end_array_value(&mut self, _writer: &mut W) -> Result<()> - where W: io::Write - { - self.has_value = true; - Ok(()) - } - - #[inline] - fn begin_object(&mut self, writer: &mut W) -> Result<()> - where W: io::Write - { - self.current_indent += 1; - self.has_value = false; - writer.write_all(b"{").map_err(From::from) - } - - #[inline] - fn end_object(&mut self, writer: &mut W) -> Result<()> - where W: io::Write - { - self.current_indent -= 1; - - if self.has_value { - try!(writer.write_all(b"\n")); - try!(indent(writer, self.current_indent, self.indent)); - } - - writer.write_all(b"}").map_err(From::from) - } - - #[inline] - fn begin_object_key(&mut self, writer: &mut W, first: bool) -> Result<()> - where W: io::Write - { - if first { - try!(writer.write_all(b"\n")); - } else { - try!(writer.write_all(b",\n")); - } - indent(writer, self.current_indent, self.indent) - } - - #[inline] - fn begin_object_value(&mut self, writer: &mut W) -> Result<()> - where W: io::Write - { - writer.write_all(b": ").map_err(From::from) - } - - #[inline] - fn end_object_value(&mut self, _writer: &mut W) -> Result<()> - where W: io::Write - { - self.has_value = true; - Ok(()) - } -} - -fn format_escaped_str(writer: &mut W, formatter: &mut F, value: &str) -> Result<()> - where W: io::Write, - F: Formatter -{ - let bytes = value.as_bytes(); - - try!(formatter.begin_string(writer)); - - let mut start = 0; - - for (i, &byte) in bytes.iter().enumerate() { - let escape = ESCAPE[byte as usize]; - if escape == 0 { - continue; - } - - if start < i { - try!(formatter.write_string_fragment(writer, &bytes[start..i])); - } - - let char_escape = CharEscape::from_escape_table(escape, byte); - try!(formatter.write_char_escape(writer, char_escape)); - - start = i + 1; - } - - if start != bytes.len() { - try!(formatter.write_string_fragment(writer, &bytes[start..])); - } - - try!(formatter.end_string(writer)); - Ok(()) -} - -const BB: u8 = b'b'; // \x08 -const TT: u8 = b't'; // \x09 -const NN: u8 = b'n'; // \x0A -const FF: u8 = b'f'; // \x0C -const RR: u8 = b'r'; // \x0D -const QU: u8 = b'"'; // \x22 -const BS: u8 = b'\\'; // \x5C -const U: u8 = b'u'; // \x00...\x1F except the ones above - -// Lookup table of escape sequences. A value of b'x' at index i means that byte -// i is escaped as "\x" in JSON. A value of 0 means that byte i is not escaped. -#[cfg_attr(rustfmt, rustfmt_skip)] -static ESCAPE: [u8; 256] = [ - // 1 2 3 4 5 6 7 8 9 A B C D E F - U, U, U, U, U, U, U, U, BB, TT, NN, U, FF, RR, U, U, // 0 - U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, // 1 - 0, 0, QU, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, BS, 0, 0, 0, // 5 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 7 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // A - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // B - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // C - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // D - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // E - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // F -]; - -#[inline] -fn format_escaped_char(wr: &mut W, formatter: &mut F, value: char) -> Result<()> - where W: io::Write, - F: Formatter, -{ - // FIXME: this allocation is required in order to be compatible with stable - // rust, which doesn't support encoding a `char` into a stack buffer. - let mut s = String::new(); - s.push(value); - format_escaped_str(wr, formatter, &s) -} - -/// Serialize the given data structure as JSON into the IO stream. -/// -/// Serialization can fail if `T`'s implementation of `Serialize` decides to -/// fail, or if `T` contains a map with non-string keys. -#[inline] -pub fn to_writer(writer: &mut W, value: &T) -> Result<()> - where W: io::Write, - T: ser::Serialize, -{ - let mut ser = Serializer::new(writer); - try!(value.serialize(&mut ser)); - Ok(()) -} - -/// Serialize the given data structure as pretty-printed JSON into the IO -/// stream. -/// -/// Serialization can fail if `T`'s implementation of `Serialize` decides to -/// fail, or if `T` contains a map with non-string keys. -#[inline] -pub fn to_writer_pretty(writer: &mut W, value: &T) -> Result<()> - where W: io::Write, - T: ser::Serialize, -{ - let mut ser = Serializer::pretty(writer); - try!(value.serialize(&mut ser)); - Ok(()) -} - -/// Serialize the given data structure as a JSON byte vector. -/// -/// Serialization can fail if `T`'s implementation of `Serialize` decides to -/// fail, or if `T` contains a map with non-string keys. -#[inline] -pub fn to_vec(value: &T) -> Result> - where T: ser::Serialize, -{ - // We are writing to a Vec, which doesn't fail. So we can ignore - // the error. - let mut writer = Vec::with_capacity(128); - try!(to_writer(&mut writer, value)); - Ok(writer) -} - -/// Serialize the given data structure as a pretty-printed JSON byte vector. -/// -/// Serialization can fail if `T`'s implementation of `Serialize` decides to -/// fail, or if `T` contains a map with non-string keys. -#[inline] -pub fn to_vec_pretty(value: &T) -> Result> - where T: ser::Serialize, -{ - // We are writing to a Vec, which doesn't fail. So we can ignore - // the error. - let mut writer = Vec::with_capacity(128); - try!(to_writer_pretty(&mut writer, value)); - Ok(writer) -} - -/// Serialize the given data structure as a String of JSON. -/// -/// Serialization can fail if `T`'s implementation of `Serialize` decides to -/// fail, or if `T` contains a map with non-string keys. -#[inline] -pub fn to_string(value: &T) -> Result - where T: ser::Serialize, -{ - let vec = try!(to_vec(value)); - let string = unsafe { - // We do not emit invalid UTF-8. - String::from_utf8_unchecked(vec) - }; - Ok(string) -} - -/// Serialize the given data structure as a pretty-printed String of JSON. -/// -/// Serialization can fail if `T`'s implementation of `Serialize` decides to -/// fail, or if `T` contains a map with non-string keys. -#[inline] -pub fn to_string_pretty(value: &T) -> Result - where T: ser::Serialize, -{ - let vec = try!(to_vec_pretty(value)); - let string = unsafe { - // We do not emit invalid UTF-8. - String::from_utf8_unchecked(vec) - }; - Ok(string) -} - -fn indent(wr: &mut W, n: usize, s: &[u8]) -> Result<()> - where W: io::Write, -{ - for _ in 0..n { - try!(wr.write_all(s)); - } - - Ok(()) -} diff --git a/third_party/rust/serde_json/src/value.rs b/third_party/rust/serde_json/src/value.rs deleted file mode 100644 index 7b9ccae1cfd6..000000000000 --- a/third_party/rust/serde_json/src/value.rs +++ /dev/null @@ -1,2233 +0,0 @@ -//! The Value enum, a loosely typed way of representing any valid JSON value. -//! -//! # Constructing JSON -//! -//! Serde JSON provides a [`json!` macro][macro] to build `serde_json::Value` -//! objects with very natural JSON syntax. In order to use this macro, -//! `serde_json` needs to be imported with the `#[macro_use]` attribute. -//! -//! ```rust -//! #[macro_use] -//! extern crate serde_json; -//! -//! fn main() { -//! // The type of `john` is `serde_json::Value` -//! let john = json!({ -//! "name": "John Doe", -//! "age": 43, -//! "phones": [ -//! "+44 1234567", -//! "+44 2345678" -//! ] -//! }); -//! -//! println!("first phone number: {}", john["phones"][0]); -//! -//! // Convert to a string of JSON and print it out -//! println!("{}", john.to_string()); -//! } -//! ``` -//! -//! The `Value::to_string()` function converts a `serde_json::Value` into a -//! `String` of JSON text. -//! -//! One neat thing about the `json!` macro is that variables and expressions can -//! be interpolated directly into the JSON value as you are building it. Serde -//! will check at compile time that the value you are interpolating is able to -//! be represented as JSON. -//! -//! ```rust -//! # #[macro_use] extern crate serde_json; -//! # fn random_phone() -> u16 { 0 } -//! # fn main() { -//! let full_name = "John Doe"; -//! let age_last_year = 42; -//! -//! // The type of `john` is `serde_json::Value` -//! let john = json!({ -//! "name": full_name, -//! "age": age_last_year + 1, -//! "phones": [ -//! format!("+44 {}", random_phone()) -//! ] -//! }); -//! # let _ = john; -//! # } -//! ``` -//! -//! A string of JSON data can be parsed into a `serde_json::Value` by the -//! [`serde_json::from_str`][from_str] function. There is also -//! [`from_slice`][from_slice] for parsing from a byte slice &[u8], -//! [`from_iter`][from_iter] for parsing from an iterator of bytes, and -//! [`from_reader`][from_reader] for parsing from any `io::Read` like a File or -//! a TCP stream. -//! -//! ```rust -//! # extern crate serde_json; -//! # use serde_json::Error; -//! # pub fn example() -> Result<(), Error> { -//! use serde_json::Value; -//! -//! let data = r#" { "name": "John Doe", "age": 43, ... } "#; -//! let v: Value = serde_json::from_str(data)?; -//! println!("Please call {} at the number {}", v["name"], v["phones"][0]); -//! # Ok(()) } -//! # fn main() {} -//! ``` -//! -//! [macro]: https://docs.serde.rs/serde_json/macro.json.html -//! [from_str]: https://docs.serde.rs/serde_json/de/fn.from_str.html -//! [from_slice]: https://docs.serde.rs/serde_json/de/fn.from_slice.html -//! [from_iter]: https://docs.serde.rs/serde_json/de/fn.from_iter.html -//! [from_reader]: https://docs.serde.rs/serde_json/de/fn.from_reader.html - -use std::fmt; -use std::i64; -use std::io; -use std::ops; -use std::slice; -use std::str; -use std::vec; -use std::borrow::Cow; - -use serde::de::{self, Unexpected}; -use serde::ser; -use serde::de::value::ValueDeserializer; - -use error::{Error, ErrorCode}; - -pub use map::Map; -pub use number::Number; - -/// Represents any valid JSON value. -#[derive(Debug, Clone, PartialEq)] -pub enum Value { - /// Represents a JSON null value. - Null, - - /// Represents a JSON boolean. - Bool(bool), - - /// Represents a JSON number, whether integer or floating point. - Number(Number), - - /// Represents a JSON string. - String(String), - - /// Represents a JSON array. - Array(Vec), - - /// Represents a JSON object. - Object(Map), -} - -fn parse_index(s: &str) -> Option { - if s.starts_with('+') || (s.starts_with('0') && s.len() != 1) { - return None; - } - s.parse().ok() -} - -impl Value { - /// Index into a JSON array or map. A string index can be used to access a - /// value in a map, and a usize index can be used to access an element of an - /// array. - /// - /// Returns `None` if the type of `self` does not match the type of the - /// index, for example if the index is a string and `self` is an array or a - /// number. Also returns `None` if the given key does not exist in the map - /// or the given index is not within the bounds of the array. - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// let object = json!({ "A": 65, "B": 66, "C": 67 }); - /// assert_eq!(*object.get("A").unwrap(), json!(65)); - /// - /// let array = json!([ "A", "B", "C" ]); - /// assert_eq!(*array.get(2).unwrap(), json!("C")); - /// - /// assert_eq!(array.get("A"), None); - /// # } - /// ``` - /// - /// Square brackets can also be used to index into a value in a more concise - /// way. This returns `Value::Null` in cases where `get` would have returned - /// `None`. - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// let object = json!({ - /// "A": ["a", "á", "à"], - /// "B": ["b", "b́"], - /// "C": ["c", "ć", "ć̣", "ḉ"], - /// }); - /// assert_eq!(object["B"][0], json!("b")); - /// - /// assert_eq!(object["D"], json!(null)); - /// assert_eq!(object[0]["x"]["y"]["z"], json!(null)); - /// # } - /// ``` - pub fn get(&self, index: I) -> Option<&Value> { - index.index_into(self) - } - - /// Mutably index into a JSON array or map. A string index can be used to - /// access a value in a map, and a usize index can be used to access an - /// element of an array. - /// - /// Returns `None` if the type of `self` does not match the type of the - /// index, for example if the index is a string and `self` is an array or a - /// number. Also returns `None` if the given key does not exist in the map - /// or the given index is not within the bounds of the array. - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// let mut object = json!({ "A": 65, "B": 66, "C": 67 }); - /// *object.get_mut("A").unwrap() = json!(69); - /// - /// let mut array = json!([ "A", "B", "C" ]); - /// *array.get_mut(2).unwrap() = json!("D"); - /// # } - /// ``` - pub fn get_mut(&mut self, index: I) -> Option<&mut Value> { - index.index_into_mut(self) - } - - /// Returns true if the `Value` is an Object. Returns false otherwise. - pub fn is_object(&self) -> bool { - self.as_object().is_some() - } - - /// If the `Value` is an Object, returns the associated Map. - /// Returns None otherwise. - pub fn as_object(&self) -> Option<&Map> { - match *self { - Value::Object(ref map) => Some(map), - _ => None, - } - } - - /// If the `Value` is an Object, returns the associated mutable Map. - /// Returns None otherwise. - pub fn as_object_mut(&mut self) -> Option<&mut Map> { - match *self { - Value::Object(ref mut map) => Some(map), - _ => None, - } - } - - /// Returns true if the `Value` is an Array. Returns false otherwise. - pub fn is_array(&self) -> bool { - self.as_array().is_some() - } - - /// If the `Value` is an Array, returns the associated vector. - /// Returns None otherwise. - pub fn as_array(&self) -> Option<&Vec> { - match *self { - Value::Array(ref array) => Some(&*array), - _ => None, - } - } - - /// If the `Value` is an Array, returns the associated mutable vector. - /// Returns None otherwise. - pub fn as_array_mut(&mut self) -> Option<&mut Vec> { - match *self { - Value::Array(ref mut list) => Some(list), - _ => None, - } - } - - /// Returns true if the `Value` is a String. Returns false otherwise. - pub fn is_string(&self) -> bool { - self.as_str().is_some() - } - - /// If the `Value` is a String, returns the associated str. - /// Returns None otherwise. - pub fn as_str(&self) -> Option<&str> { - match *self { - Value::String(ref s) => Some(s), - _ => None, - } - } - - /// Returns true if the `Value` is a Number. Returns false otherwise. - pub fn is_number(&self) -> bool { - match *self { - Value::Number(_) => true, - _ => false, - } - } - - /// Returns true if the `Value` is a number that can be represented by i64. - pub fn is_i64(&self) -> bool { - match *self { - Value::Number(ref n) => n.is_i64(), - _ => false, - } - } - - /// Returns true if the `Value` is a number that can be represented by u64. - pub fn is_u64(&self) -> bool { - match *self { - Value::Number(ref n) => n.is_u64(), - _ => false, - } - } - - /// Returns true if the `Value` is a number that can be represented by f64. - pub fn is_f64(&self) -> bool { - match *self { - Value::Number(ref n) => n.is_f64(), - _ => false, - } - } - - /// If the `Value` is a number, represent it as i64 if possible. - /// Returns None otherwise. - pub fn as_i64(&self) -> Option { - match *self { - Value::Number(ref n) => n.as_i64(), - _ => None, - } - } - - /// If the `Value` is a number, represent it as u64 if possible. - /// Returns None otherwise. - pub fn as_u64(&self) -> Option { - match *self { - Value::Number(ref n) => n.as_u64(), - _ => None, - } - } - - /// If the `Value` is a number, represent it as f64 if possible. - /// Returns None otherwise. - pub fn as_f64(&self) -> Option { - match *self { - Value::Number(ref n) => n.as_f64(), - _ => None, - } - } - - /// Returns true if the `Value` is a Boolean. Returns false otherwise. - pub fn is_boolean(&self) -> bool { - self.as_bool().is_some() - } - - /// If the `Value` is a Boolean, returns the associated bool. - /// Returns None otherwise. - pub fn as_bool(&self) -> Option { - match *self { - Value::Bool(b) => Some(b), - _ => None, - } - } - - /// Returns true if the `Value` is a Null. Returns false otherwise. - pub fn is_null(&self) -> bool { - self.as_null().is_some() - } - - /// If the `Value` is a Null, returns (). - /// Returns None otherwise. - pub fn as_null(&self) -> Option<()> { - match *self { - Value::Null => Some(()), - _ => None, - } - } - - /// Looks up a value by a JSON Pointer. - /// - /// JSON Pointer defines a string syntax for identifying a specific value - /// within a JavaScript Object Notation (JSON) document. - /// - /// A Pointer is a Unicode string with the reference tokens separated by `/`. - /// Inside tokens `/` is replaced by `~1` and `~` is replaced by `~0`. The - /// addressed value is returned and if there is no such value `None` is - /// returned. - /// - /// For more information read [RFC6901](https://tools.ietf.org/html/rfc6901). - /// - /// # Examples - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// let data = json!({ - /// "x": { - /// "y": ["z", "zz"] - /// } - /// }); - /// - /// assert_eq!(data.pointer("/x/y/1").unwrap(), &json!("zz")); - /// assert_eq!(data.pointer("/a/b/c"), None); - /// # } - /// ``` - pub fn pointer<'a>(&'a self, pointer: &str) -> Option<&'a Value> { - if pointer == "" { - return Some(self); - } - if !pointer.starts_with('/') { - return None; - } - let tokens = pointer.split('/').skip(1).map(|x| x.replace("~1", "/").replace("~0", "~")); - let mut target = self; - - for token in tokens { - let target_opt = match *target { - Value::Object(ref map) => map.get(&token), - Value::Array(ref list) => parse_index(&token).and_then(|x| list.get(x)), - _ => return None, - }; - if let Some(t) = target_opt { - target = t; - } else { - return None; - } - } - Some(target) - } - - /// Looks up a value by a JSON Pointer and returns a mutable reference to - /// that value. - /// - /// JSON Pointer defines a string syntax for identifying a specific value - /// within a JavaScript Object Notation (JSON) document. - /// - /// A Pointer is a Unicode string with the reference tokens separated by `/`. - /// Inside tokens `/` is replaced by `~1` and `~` is replaced by `~0`. The - /// addressed value is returned and if there is no such value `None` is - /// returned. - /// - /// For more information read [RFC6901](https://tools.ietf.org/html/rfc6901). - /// - /// # Example of Use - /// - /// ```rust - /// extern crate serde_json; - /// - /// use serde_json::Value; - /// use std::mem; - /// - /// fn main() { - /// let s = r#"{"x": 1.0, "y": 2.0}"#; - /// let mut value: Value = serde_json::from_str(s).unwrap(); - /// - /// // Check value using read-only pointer - /// assert_eq!(value.pointer("/x"), Some(&1.0.into())); - /// // Change value with direct assignment - /// *value.pointer_mut("/x").unwrap() = 1.5.into(); - /// // Check that new value was written - /// assert_eq!(value.pointer("/x"), Some(&1.5.into())); - /// - /// // "Steal" ownership of a value. Can replace with any valid Value. - /// let old_x = value.pointer_mut("/x").map(|x| mem::replace(x, Value::Null)).unwrap(); - /// assert_eq!(old_x, 1.5); - /// assert_eq!(value.pointer("/x").unwrap(), &Value::Null); - /// } - /// ``` - pub fn pointer_mut<'a>(&'a mut self, pointer: &str) -> Option<&'a mut Value> { - if pointer == "" { - return Some(self); - } - if !pointer.starts_with('/') { - return None; - } - let tokens = pointer.split('/').skip(1).map(|x| x.replace("~1", "/").replace("~0", "~")); - let mut target = self; - - for token in tokens { - // borrow checker gets confused about `target` being mutably borrowed too many times because of the loop - // this once-per-loop binding makes the scope clearer and circumvents the error - let target_once = target; - let target_opt = match *target_once { - Value::Object(ref mut map) => map.get_mut(&token), - Value::Array(ref mut list) => parse_index(&token).and_then(move |x| list.get_mut(x)), - _ => return None, - }; - if let Some(t) = target_opt { - target = t; - } else { - return None; - } - } - Some(target) - } -} - -/// The default value is `Value::Null`. -/// -/// This is useful for handling omitted `Value` fields when deserializing. -/// -/// # Examples -/// -/// ```rust -/// # extern crate serde_json; -/// # #[macro_use] extern crate serde_derive; -/// use serde_json::Value; -/// -/// #[derive(Deserialize)] -/// struct Settings { -/// level: i32, -/// #[serde(default)] -/// extras: Value, -/// } -/// -/// # pub fn try_main() -> Result<(), serde_json::Error> { -/// let data = r#" { "level": 42 } "#; -/// let s: Settings = serde_json::from_str(data)?; -/// -/// assert_eq!(s.level, 42); -/// assert_eq!(s.extras, Value::Null); -/// # Ok(()) } -/// # fn main() { try_main().unwrap() } -/// ``` -impl Default for Value { - fn default() -> Value { - Value::Null - } -} - -/// A type that can be used to index into a `serde_json::Value`. See the `get` -/// and `get_mut` methods of `Value`. -/// -/// This trait is sealed and cannot be implemented for types outside of -/// `serde_json`. -pub trait Index: private::Sealed { - /// Return None if the key is not already in the array or object. - #[doc(hidden)] - fn index_into<'v>(&self, v: &'v Value) -> Option<&'v Value>; - - /// Return None if the key is not already in the array or object. - #[doc(hidden)] - fn index_into_mut<'v>(&self, v: &'v mut Value) -> Option<&'v mut Value>; - - /// Panic if array index out of bounds. If key is not already in the object, - /// insert it with a value of null. Panic if Value is a type that cannot be - /// indexed into, except if Value is null then it can be treated as an empty - /// object. - #[doc(hidden)] - fn index_or_insert<'v>(&self, v: &'v mut Value) -> &'v mut Value; -} - -impl Index for usize { - fn index_into<'v>(&self, v: &'v Value) -> Option<&'v Value> { - match *v { - Value::Array(ref vec) => vec.get(*self), - _ => None, - } - } - fn index_into_mut<'v>(&self, v: &'v mut Value) -> Option<&'v mut Value> { - match *v { - Value::Array(ref mut vec) => vec.get_mut(*self), - _ => None, - } - } - fn index_or_insert<'v>(&self, v: &'v mut Value) -> &'v mut Value { - match *v { - Value::Array(ref mut vec) => { - let len = vec.len(); - vec.get_mut(*self).unwrap_or_else(|| { - panic!("cannot access index {} of JSON array of length {}", - self, len) - }) - } - _ => panic!("cannot access index {} of JSON {}", self, Type(v)), - } - } -} - -impl Index for str { - fn index_into<'v>(&self, v: &'v Value) -> Option<&'v Value> { - match *v { - Value::Object(ref map) => map.get(self), - _ => None, - } - } - fn index_into_mut<'v>(&self, v: &'v mut Value) -> Option<&'v mut Value> { - match *v { - Value::Object(ref mut map) => map.get_mut(self), - _ => None, - } - } - fn index_or_insert<'v>(&self, v: &'v mut Value) -> &'v mut Value { - if let Value::Null = *v { - let mut map = Map::new(); - map.insert(self.to_owned(), Value::Null); - *v = Value::Object(map); - } - match *v { - Value::Object(ref mut map) => { - // TODO: use entry() once LinkedHashMap supports entry() - // https://github.com/contain-rs/linked-hash-map/issues/5 - if !map.contains_key(self) { - map.insert(self.to_owned(), Value::Null); - } - map.get_mut(self).unwrap() - } - _ => panic!("cannot access key {:?} in JSON {}", self, Type(v)), - } - } -} - -impl Index for String { - fn index_into<'v>(&self, v: &'v Value) -> Option<&'v Value> { - self[..].index_into(v) - } - fn index_into_mut<'v>(&self, v: &'v mut Value) -> Option<&'v mut Value> { - self[..].index_into_mut(v) - } - fn index_or_insert<'v>(&self, v: &'v mut Value) -> &'v mut Value { - self[..].index_or_insert(v) - } -} - -impl<'a, T: ?Sized> Index for &'a T where T: Index { - fn index_into<'v>(&self, v: &'v Value) -> Option<&'v Value> { - (**self).index_into(v) - } - fn index_into_mut<'v>(&self, v: &'v mut Value) -> Option<&'v mut Value> { - (**self).index_into_mut(v) - } - fn index_or_insert<'v>(&self, v: &'v mut Value) -> &'v mut Value { - (**self).index_or_insert(v) - } -} - -// Prevent users from implementing the Index trait. -mod private { - pub trait Sealed {} - impl Sealed for usize {} - impl Sealed for str {} - impl Sealed for String {} - impl<'a, T: ?Sized> Sealed for &'a T where T: Sealed {} -} - -/// Used in panic messages. -struct Type<'a>(&'a Value); - -impl<'a> fmt::Display for Type<'a> { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - match *self.0 { - Value::Null => formatter.write_str("null"), - Value::Bool(_) => formatter.write_str("boolean"), - Value::Number(_) => formatter.write_str("number"), - Value::String(_) => formatter.write_str("string"), - Value::Array(_) => formatter.write_str("array"), - Value::Object(_) => formatter.write_str("object"), - } - } -} - -// The usual semantics of Index is to panic on invalid indexing. -// -// That said, the usual semantics are for things like Vec and BTreeMap which -// have different use cases than Value. If you are working with a Vec, you know -// that you are working with a Vec and you can get the len of the Vec and make -// sure your indices are within bounds. The Value use cases are more -// loosey-goosey. You got some JSON from an endpoint and you want to pull values -// out of it. Outside of this Index impl, you already have the option of using -// value.as_array() and working with the Vec directly, or matching on -// Value::Array and getting the Vec directly. The Index impl means you can skip -// that and index directly into the thing using a concise syntax. You don't have -// to check the type, you don't have to check the len, it is all about what you -// expect the Value to look like. -// -// Basically the use cases that would be well served by panicking here are -// better served by using one of the other approaches: get and get_mut, -// as_array, or match. The value of this impl is that it adds a way of working -// with Value that is not well served by the existing approaches: concise and -// careless and sometimes that is exactly what you want. -impl ops::Index for Value where I: Index { - type Output = Value; - - /// Index into a `serde_json::Value` using the syntax `value[0]` or - /// `value["k"]`. - /// - /// Returns `Value::Null` if the type of `self` does not match the type of - /// the index, for example if the index is a string and `self` is an array - /// or a number. Also returns `Value::Null` if the given key does not exist - /// in the map or the given index is not within the bounds of the array. - /// - /// For retrieving deeply nested values, you should have a look at the - /// `Value::pointer` method. - /// - /// # Examples - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// let data = json!({ - /// "x": { - /// "y": ["z", "zz"] - /// } - /// }); - /// - /// assert_eq!(data["x"]["y"], json!(["z", "zz"])); - /// assert_eq!(data["x"]["y"][0], json!("z")); - /// - /// assert_eq!(data["a"], json!(null)); // returns null for undefined values - /// assert_eq!(data["a"]["b"], json!(null)); // does not panic - /// # } - /// ``` - fn index(&self, index: I) -> &Value { - static NULL: Value = Value::Null; - index.index_into(self).unwrap_or(&NULL) - } -} - -impl ops::IndexMut for Value where I: Index { - /// Write into a `serde_json::Value` using the syntax `value[0] = ...` or - /// `value["k"] = ...`. - /// - /// If the index is a number, the value must be an array of length bigger - /// than the index. Indexing into a value that is not an array or an array - /// that is too small will panic. - /// - /// If the index is a string, the value must be an object or null which is - /// treated like an empty object. If the key is not already present in the - /// object, it will be inserted with a value of null. Indexing into a value - /// that is neither an object nor null will panic. - /// - /// # Examples - /// - /// ```rust - /// # #[macro_use] extern crate serde_json; - /// # fn main() { - /// let mut data = json!({ "x": 0 }); - /// - /// // replace an existing key - /// data["x"] = json!(1); - /// - /// // insert a new key - /// data["y"] = json!([false, false, false]); - /// - /// // replace an array value - /// data["y"][0] = json!(true); - /// - /// // inserted a deeply nested key - /// data["a"]["b"]["c"]["d"] = json!(true); - /// - /// println!("{}", data); - /// # } - /// ``` - fn index_mut(&mut self, index: I) -> &mut Value { - index.index_or_insert(self) - } -} - -impl PartialEq for Value { - fn eq(&self, other: &str) -> bool { - self.as_str().map_or(false, |s| s == other) - } -} - -impl<'a> PartialEq<&'a str> for Value { - fn eq(&self, other: &&str) -> bool { - self.as_str().map_or(false, |s| s == *other) - } -} - -impl PartialEq for str { - fn eq(&self, other: &Value) -> bool { - other.as_str().map_or(false, |s| s == self) - } -} - -impl<'a> PartialEq for &'a str { - fn eq(&self, other: &Value) -> bool { - other.as_str().map_or(false, |s| s == *self) - } -} - -impl PartialEq for Value { - fn eq(&self, other: &String) -> bool { - self.as_str().map_or(false, |s| s == other) - } -} - - -impl PartialEq for String { - fn eq(&self, other: &Value) -> bool { - other.as_str().map_or(false, |s| s == self) - } -} - -macro_rules! partialeq_numeric { - ($([$($ty:ty)*], $conversion:ident, $base:ty)*) => { - $($( - impl PartialEq<$ty> for Value { - fn eq(&self, other: &$ty) -> bool { - self.$conversion().map_or(false, |i| i == (*other as $base)) - } - } - - impl PartialEq for $ty { - fn eq(&self, other: &Value) -> bool { - other.$conversion().map_or(false, |i| i == (*self as $base)) - } - } - - impl<'a> PartialEq<$ty> for &'a Value { - fn eq(&self, other: &$ty) -> bool { - self.$conversion().map_or(false, |i| i == (*other as $base)) - } - } - - impl<'a> PartialEq<$ty> for &'a mut Value { - fn eq(&self, other: &$ty) -> bool { - self.$conversion().map_or(false, |i| i == (*other as $base)) - } - } - )*)* - } -} - -partialeq_numeric! { - [i8 i16 i32 i64 isize], as_i64, i64 - [u8 u16 u32 u64 usize], as_u64, u64 - [f32 f64], as_f64, f64 -} - -macro_rules! from_integer { - ($($ty:ident)*) => { - $( - impl From<$ty> for Value { - fn from(n: $ty) -> Self { - Value::Number(n.into()) - } - } - )* - }; -} - -from_integer! { - i8 i16 i32 i64 isize - u8 u16 u32 u64 usize -} - -impl From for Value { - /// Convert 32-bit floating point number to `Value` - /// - /// # Examples - /// - /// ```rust - /// # extern crate serde_json; - /// use serde_json::Value; - /// - /// # fn main() { - /// let f: f32 = 13.37; - /// let x: Value = f.into(); - /// # } - /// ``` - fn from(f: f32) -> Self { - From::from(f as f64) - } -} - -impl From for Value { - /// Convert 64-bit floating point number to `Value` - /// - /// # Examples - /// - /// ```rust - /// # extern crate serde_json; - /// use serde_json::Value; - /// - /// # fn main() { - /// let f: f64 = 13.37; - /// let x: Value = f.into(); - /// # } - /// ``` - fn from(f: f64) -> Self { - Number::from_f64(f).map_or(Value::Null, Value::Number) - } -} - -impl From for Value { - /// Convert boolean to `Value` - /// - /// # Examples - /// - /// ```rust - /// # extern crate serde_json; - /// use serde_json::Value; - /// - /// # fn main() { - /// let b = false; - /// let x: Value = b.into(); - /// # } - /// ``` - fn from(f: bool) -> Self { - Value::Bool(f) - } -} - -impl From for Value { - /// Convert `String` to `Value` - /// - /// # Examples - /// - /// ```rust - /// # extern crate serde_json; - /// use serde_json::Value; - /// - /// # fn main() { - /// let s: String = "lorem".to_string(); - /// let x: Value = s.into(); - /// # } - /// ``` - fn from(f: String) -> Self { - Value::String(f) - } -} - -impl<'a> From<&'a str> for Value { - /// Convert string slice to `Value` - /// - /// # Examples - /// - /// ```rust - /// # extern crate serde_json; - /// use serde_json::Value; - /// - /// # fn main() { - /// let s: &str = "lorem"; - /// let x: Value = s.into(); - /// # } - /// ``` - fn from(f: &str) -> Self { - Value::String(f.to_string()) - } -} - -impl<'a> From> for Value { - /// Convert copy-on-write string to `Value` - /// - /// # Examples - /// - /// ```rust - /// # extern crate serde_json; - /// use serde_json::Value; - /// use std::borrow::Cow; - /// # fn main() { - /// - /// let s: Cow = Cow::Borrowed("lorem"); - /// let x: Value = s.into(); - /// # } - /// ``` - /// - /// ```rust - /// # extern crate serde_json; - /// use serde_json::Value; - /// use std::borrow::Cow; - /// - /// # fn main() { - /// let s: Cow = Cow::Owned("lorem".to_string()); - /// let x: Value = s.into(); - /// # } - /// ``` - fn from(f: Cow<'a, str>) -> Self { - Value::String(f.to_string()) - } -} - -impl From> for Value { - /// Convert map (with string keys) to `Value` - /// - /// # Examples - /// - /// ```rust - /// # extern crate serde_json; - /// use serde_json::{Map, Value}; - /// # fn main() { - /// - /// let mut m = Map::new(); - /// m.insert("Lorem".to_string(), "ipsum".into()); - /// let x: Value = m.into(); - /// # } - /// ``` - fn from(f: Map) -> Self { - Value::Object(f) - } -} - -impl> From> for Value { - /// Convert a `Vec` to `Value` - /// - /// # Examples - /// - /// ```rust - /// # extern crate serde_json; - /// use serde_json::Value; - /// # fn main() { - /// - /// let v = vec!["lorem", "ipsum", "dolor"]; - /// let x: Value = v.into(); - /// # } - /// ``` - fn from(f: Vec) -> Self { - Value::Array(f.into_iter().map(Into::into).collect()) - } -} - -impl<'a, T: Clone + Into> From<&'a [T]> for Value { - /// Convert a slice to `Value` - /// - /// # Examples - /// - /// ```rust - /// # extern crate serde_json; - /// use serde_json::Value; - /// # fn main() { - /// - /// let v: &[&str] = &["lorem", "ipsum", "dolor"]; - /// let x: Value = v.into(); - /// # } - /// ``` - fn from(f: &'a [T]) -> Self { - Value::Array(f.into_iter().cloned().map(Into::into).collect()) - } -} - -impl> ::std::iter::FromIterator for Value { - /// Convert an iteratable type to a `Value` - /// - /// # Examples - /// - /// ```rust - /// # extern crate serde_json; - /// use serde_json::Value; - /// # fn main() { - /// - /// let v = std::iter::repeat(42).take(5); - /// let x: Value = v.collect(); - /// # } - /// ``` - /// - /// ```rust - /// # extern crate serde_json; - /// use serde_json::Value; - /// - /// # fn main() { - /// let v: Vec<_> = vec!["lorem", "ipsum", "dolor"]; - /// let x: Value = v.into_iter().collect(); - /// # } - /// ``` - /// - /// ```rust - /// # extern crate serde_json; - /// use std::iter::FromIterator; - /// use serde_json::Value; - /// - /// # fn main() { - /// let x: Value = Value::from_iter(vec!["lorem", "ipsum", "dolor"]); - /// # } - /// ``` - fn from_iter>(iter: I) -> Self { - let vec: Vec = iter.into_iter().map(|x| x.into()).collect(); - - Value::Array(vec) - } -} - -impl ser::Serialize for Value { - #[inline] - fn serialize(&self, serializer: S) -> Result - where S: ser::Serializer, - { - match *self { - Value::Null => serializer.serialize_unit(), - Value::Bool(b) => serializer.serialize_bool(b), - Value::Number(ref n) => n.serialize(serializer), - Value::String(ref s) => serializer.serialize_str(s), - Value::Array(ref v) => v.serialize(serializer), - Value::Object(ref m) => { - use serde::ser::SerializeMap; - let mut map = try!(serializer.serialize_map(Some(m.len()))); - for (k, v) in m { - try!(map.serialize_key(k)); - try!(map.serialize_value(v)); - } - map.end() - } - } - } -} - -impl de::Deserialize for Value { - #[inline] - fn deserialize(deserializer: D) -> Result - where D: de::Deserializer, - { - struct ValueVisitor; - - impl de::Visitor for ValueVisitor { - type Value = Value; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("any valid JSON value") - } - - #[inline] - fn visit_bool(self, value: bool) -> Result { - Ok(Value::Bool(value)) - } - - #[inline] - fn visit_i64(self, value: i64) -> Result { - Ok(Value::Number(value.into())) - } - - #[inline] - fn visit_u64(self, value: u64) -> Result { - Ok(Value::Number(value.into())) - } - - #[inline] - fn visit_f64(self, value: f64) -> Result { - Ok(Number::from_f64(value).map_or(Value::Null, Value::Number)) - } - - #[inline] - fn visit_str(self, value: &str) -> Result - where E: de::Error, - { - self.visit_string(String::from(value)) - } - - #[inline] - fn visit_string(self, value: String) -> Result { - Ok(Value::String(value)) - } - - #[inline] - fn visit_none(self) -> Result { - Ok(Value::Null) - } - - #[inline] - fn visit_some( - self, - deserializer: D - ) -> Result - where D: de::Deserializer, - { - de::Deserialize::deserialize(deserializer) - } - - #[inline] - fn visit_unit(self) -> Result { - Ok(Value::Null) - } - - #[inline] - fn visit_seq(self, visitor: V) -> Result - where V: de::SeqVisitor, - { - let values = try!(de::impls::VecVisitor::new() - .visit_seq(visitor)); - Ok(Value::Array(values)) - } - - fn visit_map(self, mut visitor: V) -> Result - where V: de::MapVisitor, - { - let mut values = Map::with_capacity(visitor.size_hint().0); - - while let Some((key, value)) = try!(visitor.visit()) { - values.insert(key, value); - } - - Ok(Value::Object(values)) - } - } - - deserializer.deserialize(ValueVisitor) - } -} - -struct WriterFormatter<'a, 'b: 'a> { - inner: &'a mut fmt::Formatter<'b>, -} - -impl<'a, 'b> io::Write for WriterFormatter<'a, 'b> { - fn write(&mut self, buf: &[u8]) -> io::Result { - fn io_error(_: E) -> io::Error { - // Value does not matter because fmt::Debug and fmt::Display impls - // below just map it to fmt::Error - io::Error::new(io::ErrorKind::Other, "fmt error") - } - let s = try!(str::from_utf8(buf).map_err(io_error)); - try!(self.inner.write_str(s).map_err(io_error)); - Ok(buf.len()) - } - - fn flush(&mut self) -> io::Result<()> { - Ok(()) - } -} - -impl fmt::Display for Value { - /// Serializes a json value into a string - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let mut wr = WriterFormatter { - inner: f, - }; - super::ser::to_writer(&mut wr, self).map_err(|_| fmt::Error) - } -} - -impl str::FromStr for Value { - type Err = Error; - fn from_str(s: &str) -> Result { - super::de::from_str(s) - } -} - -struct Serializer; - -impl ser::Serializer for Serializer { - type Ok = Value; - type Error = Error; - - type SerializeSeq = SerializeVec; - type SerializeTuple = SerializeVec; - type SerializeTupleStruct = SerializeVec; - type SerializeTupleVariant = SerializeTupleVariant; - type SerializeMap = SerializeMap; - type SerializeStruct = SerializeMap; - type SerializeStructVariant = SerializeStructVariant; - - #[inline] - fn serialize_bool(self, value: bool) -> Result { - Ok(Value::Bool(value)) - } - - #[inline] - fn serialize_i8(self, value: i8) -> Result { - self.serialize_i64(value as i64) - } - - #[inline] - fn serialize_i16(self, value: i16) -> Result { - self.serialize_i64(value as i64) - } - - #[inline] - fn serialize_i32(self, value: i32) -> Result { - self.serialize_i64(value as i64) - } - - fn serialize_i64(self, value: i64) -> Result { - Ok(Value::Number(value.into())) - } - - #[inline] - fn serialize_u8(self, value: u8) -> Result { - self.serialize_u64(value as u64) - } - - #[inline] - fn serialize_u16(self, value: u16) -> Result { - self.serialize_u64(value as u64) - } - - #[inline] - fn serialize_u32(self, value: u32) -> Result { - self.serialize_u64(value as u64) - } - - #[inline] - fn serialize_u64(self, value: u64) -> Result { - Ok(Value::Number(value.into())) - } - - #[inline] - fn serialize_f32(self, value: f32) -> Result { - self.serialize_f64(value as f64) - } - - #[inline] - fn serialize_f64(self, value: f64) -> Result { - Ok(Number::from_f64(value).map_or(Value::Null, Value::Number)) - } - - #[inline] - fn serialize_char(self, value: char) -> Result { - let mut s = String::new(); - s.push(value); - self.serialize_str(&s) - } - - #[inline] - fn serialize_str(self, value: &str) -> Result { - Ok(Value::String(value.to_owned())) - } - - fn serialize_bytes(self, value: &[u8]) -> Result { - let vec = value.iter().map(|&b| Value::Number(b.into())).collect(); - Ok(Value::Array(vec)) - } - - #[inline] - fn serialize_unit(self) -> Result { - Ok(Value::Null) - } - - #[inline] - fn serialize_unit_struct( - self, - _name: &'static str - ) -> Result { - self.serialize_unit() - } - - #[inline] - fn serialize_unit_variant( - self, - _name: &'static str, - _variant_index: usize, - variant: &'static str - ) -> Result { - self.serialize_str(variant) - } - - #[inline] - fn serialize_newtype_struct( - self, - _name: &'static str, - value: &T - ) -> Result - where T: ser::Serialize, - { - value.serialize(self) - } - - fn serialize_newtype_variant( - self, - _name: &'static str, - _variant_index: usize, - variant: &'static str, - value: &T - ) -> Result - where T: ser::Serialize, - { - let mut values = Map::new(); - values.insert(String::from(variant), try!(to_value(&value))); - Ok(Value::Object(values)) - } - - #[inline] - fn serialize_none(self) -> Result { - self.serialize_unit() - } - - #[inline] - fn serialize_some(self, value: &T) -> Result - where T: ser::Serialize, - { - value.serialize(self) - } - - fn serialize_seq( - self, - len: Option - ) -> Result { - Ok(SerializeVec { - vec: Vec::with_capacity(len.unwrap_or(0)) - }) - } - - fn serialize_seq_fixed_size( - self, - size: usize - ) -> Result { - self.serialize_seq(Some(size)) - } - - fn serialize_tuple(self, len: usize) -> Result { - self.serialize_seq(Some(len)) - } - - fn serialize_tuple_struct( - self, - _name: &'static str, - len: usize - ) -> Result { - self.serialize_seq(Some(len)) - } - - fn serialize_tuple_variant( - self, - _name: &'static str, - _variant_index: usize, - variant: &'static str, - len: usize - ) -> Result { - Ok(SerializeTupleVariant { - name: String::from(variant), - vec: Vec::with_capacity(len), - }) - } - - fn serialize_map( - self, - _len: Option - ) -> Result { - Ok(SerializeMap { - map: Map::new(), - next_key: None, - }) - } - - fn serialize_struct( - self, - _name: &'static str, - len: usize - ) -> Result { - self.serialize_map(Some(len)) - } - - fn serialize_struct_variant( - self, - _name: &'static str, - _variant_index: usize, - variant: &'static str, - _len: usize - ) -> Result { - Ok(SerializeStructVariant { - name: String::from(variant), - map: Map::new(), - }) - } -} - -#[doc(hidden)] -pub struct SerializeVec { - vec: Vec, -} - -#[doc(hidden)] -pub struct SerializeTupleVariant { - name: String, - vec: Vec, -} - -#[doc(hidden)] -pub struct SerializeMap { - map: Map, - next_key: Option, -} - -#[doc(hidden)] -pub struct SerializeStructVariant { - name: String, - map: Map, -} - -impl ser::SerializeSeq for SerializeVec { - type Ok = Value; - type Error = Error; - - fn serialize_element(&mut self, value: &T) -> Result<(), Error> - where T: ser::Serialize - { - self.vec.push(try!(to_value(&value))); - Ok(()) - } - - fn end(self) -> Result { - Ok(Value::Array(self.vec)) - } -} - -impl ser::SerializeTuple for SerializeVec { - type Ok = Value; - type Error = Error; - - fn serialize_element(&mut self, value: &T) -> Result<(), Error> - where T: ser::Serialize - { - ser::SerializeSeq::serialize_element(self, value) - } - - fn end(self) -> Result { - ser::SerializeSeq::end(self) - } -} - -impl ser::SerializeTupleStruct for SerializeVec { - type Ok = Value; - type Error = Error; - - fn serialize_field(&mut self, value: &T) -> Result<(), Error> - where T: ser::Serialize - { - ser::SerializeSeq::serialize_element(self, value) - } - - fn end(self) -> Result { - ser::SerializeSeq::end(self) - } -} - -impl ser::SerializeTupleVariant for SerializeTupleVariant { - type Ok = Value; - type Error = Error; - - fn serialize_field(&mut self, value: &T) -> Result<(), Error> - where T: ser::Serialize - { - self.vec.push(try!(to_value(&value))); - Ok(()) - } - - fn end(self) -> Result { - let mut object = Map::new(); - - object.insert(self.name, Value::Array(self.vec)); - - Ok(Value::Object(object)) - } -} - -impl ser::SerializeMap for SerializeMap { - type Ok = Value; - type Error = Error; - - fn serialize_key(&mut self, key: &T) -> Result<(), Error> - where T: ser::Serialize - { - match try!(to_value(&key)) { - Value::String(s) => self.next_key = Some(s), - Value::Number(n) => { - if n.is_u64() || n.is_i64() { - self.next_key = Some(n.to_string()) - } else { - return Err(Error::syntax(ErrorCode::KeyMustBeAString, 0, 0)) - } - } - _ => return Err(Error::syntax(ErrorCode::KeyMustBeAString, 0, 0)), - }; - Ok(()) - } - - fn serialize_value(&mut self, value: &T) -> Result<(), Error> - where T: ser::Serialize - { - let key = self.next_key.take(); - // Panic because this indicates a bug in the program rather than an - // expected failure. - let key = key.expect("serialize_value called before serialize_key"); - self.map.insert(key, try!(to_value(&value))); - Ok(()) - } - - fn end(self) -> Result { - Ok(Value::Object(self.map)) - } -} - -impl ser::SerializeStruct for SerializeMap { - type Ok = Value; - type Error = Error; - - fn serialize_field(&mut self, key: &'static str, value: &T) -> Result<(), Error> - where T: ser::Serialize - { - try!(ser::SerializeMap::serialize_key(self, key)); - ser::SerializeMap::serialize_value(self, value) - } - - fn end(self) -> Result { - ser::SerializeMap::end(self) - } -} - -impl ser::SerializeStructVariant for SerializeStructVariant { - type Ok = Value; - type Error = Error; - - fn serialize_field(&mut self, key: &'static str, value: &T) -> Result<(), Error> - where T: ser::Serialize - { - self.map.insert(String::from(key), try!(to_value(&value))); - Ok(()) - } - - fn end(self) -> Result { - let mut object = Map::new(); - - object.insert(self.name, Value::Object(self.map)); - - Ok(Value::Object(object)) - } -} - -impl de::Deserializer for Value { - type Error = Error; - - #[inline] - fn deserialize(self, visitor: V) -> Result - where V: de::Visitor, - { - match self { - Value::Null => visitor.visit_unit(), - Value::Bool(v) => visitor.visit_bool(v), - Value::Number(n) => n.deserialize(visitor), - Value::String(v) => visitor.visit_string(v), - Value::Array(v) => { - let len = v.len(); - let mut deserializer = SeqDeserializer::new(v); - let seq = try!(visitor.visit_seq(&mut deserializer)); - let remaining = deserializer.iter.len(); - if remaining == 0 { - Ok(seq) - } else { - Err(de::Error::invalid_length(len, &"fewer elements in array")) - } - } - Value::Object(v) => { - let len = v.len(); - let mut deserializer = MapDeserializer::new(v); - let map = try!(visitor.visit_map(&mut deserializer)); - let remaining = deserializer.iter.len(); - if remaining == 0 { - Ok(map) - } else { - Err(de::Error::invalid_length(len, &"fewer elements in map")) - } - } - } - } - - #[inline] - fn deserialize_option( - self, - visitor: V - ) -> Result - where V: de::Visitor, - { - match self { - Value::Null => visitor.visit_none(), - _ => visitor.visit_some(self), - } - } - - #[inline] - fn deserialize_enum( - self, - _name: &str, - _variants: &'static [&'static str], - visitor: V - ) -> Result - where V: de::Visitor, - { - let (variant, value) = match self { - Value::Object(value) => { - let mut iter = value.into_iter(); - let (variant, value) = match iter.next() { - Some(v) => v, - None => { - return Err(de::Error::invalid_value(Unexpected::Map, &"map with a single key")); - } - }; - // enums are encoded in json as maps with a single key:value pair - if iter.next().is_some() { - return Err(de::Error::invalid_value(Unexpected::Map, &"map with a single key")); - } - (variant, Some(value)) - } - Value::String(variant) => (variant, None), - other => { - return Err(de::Error::invalid_type(other.unexpected(), &"string or map")); - } - }; - - visitor.visit_enum(EnumDeserializer { - variant: variant, - value: value, - }) - } - - #[inline] - fn deserialize_newtype_struct( - self, - _name: &'static str, - visitor: V - ) -> Result - where V: de::Visitor, - { - visitor.visit_newtype_struct(self) - } - - forward_to_deserialize! { - bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq - seq_fixed_size bytes byte_buf map unit_struct tuple_struct struct - struct_field tuple ignored_any - } -} - -struct EnumDeserializer { - variant: String, - value: Option, -} - -impl de::EnumVisitor for EnumDeserializer { - type Error = Error; - type Variant = VariantDeserializer; - - fn visit_variant_seed(self, seed: V) -> Result<(V::Value, VariantDeserializer), Error> - where V: de::DeserializeSeed, - { - let variant = self.variant.into_deserializer(); - let visitor = VariantDeserializer { value: self.value }; - seed.deserialize(variant).map(|v| (v, visitor)) - } -} - -struct VariantDeserializer { - value: Option, -} - -impl de::VariantVisitor for VariantDeserializer { - type Error = Error; - - fn visit_unit(self) -> Result<(), Error> { - match self.value { - Some(value) => de::Deserialize::deserialize(value), - None => Ok(()), - } - } - - fn visit_newtype_seed(self, seed: T) -> Result - where T: de::DeserializeSeed, - { - match self.value { - Some(value) => seed.deserialize(value), - None => Err(de::Error::invalid_type(Unexpected::UnitVariant, &"newtype variant")), - } - } - - fn visit_tuple( - self, - _len: usize, - visitor: V - ) -> Result - where V: de::Visitor, - { - match self.value { - Some(Value::Array(v)) => { - de::Deserializer::deserialize(SeqDeserializer::new(v), visitor) - } - Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"tuple variant")), - None => Err(de::Error::invalid_type(Unexpected::UnitVariant, &"tuple variant")) - } - } - - fn visit_struct( - self, - _fields: &'static [&'static str], - visitor: V - ) -> Result - where V: de::Visitor, - { - match self.value { - Some(Value::Object(v)) => { - de::Deserializer::deserialize(MapDeserializer::new(v), visitor) - } - Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"struct variant")), - _ => Err(de::Error::invalid_type(Unexpected::UnitVariant, &"struct variant")) - } - } -} - -struct SeqDeserializer { - iter: vec::IntoIter, -} - -impl SeqDeserializer { - fn new(vec: Vec) -> Self { - SeqDeserializer { - iter: vec.into_iter(), - } - } -} - -impl de::Deserializer for SeqDeserializer { - type Error = Error; - - #[inline] - fn deserialize(mut self, visitor: V) -> Result - where V: de::Visitor, - { - let len = self.iter.len(); - if len == 0 { - visitor.visit_unit() - } else { - let ret = try!(visitor.visit_seq(&mut self)); - let remaining = self.iter.len(); - if remaining == 0 { - Ok(ret) - } else { - Err(de::Error::invalid_length(len, &"fewer elements in array")) - } - } - } - - forward_to_deserialize! { - bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option - seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct - tuple_struct struct struct_field tuple enum ignored_any - } -} - -impl de::SeqVisitor for SeqDeserializer { - type Error = Error; - - fn visit_seed(&mut self, seed: T) -> Result, Error> - where T: de::DeserializeSeed, - { - match self.iter.next() { - Some(value) => seed.deserialize(value).map(Some), - None => Ok(None), - } - } - - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } -} - -struct MapDeserializer { - iter: as IntoIterator>::IntoIter, - value: Option, -} - -impl MapDeserializer { - fn new(map: Map) -> Self { - MapDeserializer { - iter: map.into_iter(), - value: None, - } - } -} - -impl de::MapVisitor for MapDeserializer { - type Error = Error; - - fn visit_key_seed(&mut self, seed: T) -> Result, Error> - where T: de::DeserializeSeed, - { - match self.iter.next() { - Some((key, value)) => { - self.value = Some(value); - seed.deserialize(key.into_deserializer()).map(Some) - } - None => Ok(None), - } - } - - fn visit_value_seed(&mut self, seed: T) -> Result - where T: de::DeserializeSeed, - { - match self.value.take() { - Some(value) => seed.deserialize(value), - None => Err(de::Error::custom("value is missing")), - } - } - - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } -} - -impl de::Deserializer for MapDeserializer { - type Error = Error; - - #[inline] - fn deserialize(self, visitor: V) -> Result - where V: de::Visitor, - { - visitor.visit_map(self) - } - - forward_to_deserialize! { - bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option - seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct - tuple_struct struct struct_field tuple enum ignored_any - } -} - -impl<'a> de::Deserializer for &'a Value { - type Error = Error; - - fn deserialize(self, visitor: V) -> Result - where V: de::Visitor, - { - match *self { - Value::Null => visitor.visit_unit(), - Value::Bool(v) => visitor.visit_bool(v), - Value::Number(ref n) => n.deserialize(visitor), - Value::String(ref v) => visitor.visit_str(v), - Value::Array(ref v) => { - let len = v.len(); - let mut deserializer = SeqRefDeserializer::new(v); - let seq = try!(visitor.visit_seq(&mut deserializer)); - let remaining = deserializer.iter.len(); - if remaining == 0 { - Ok(seq) - } else { - Err(de::Error::invalid_length(len, &"fewer elements in array")) - } - } - Value::Object(ref v) => { - let len = v.len(); - let mut deserializer = MapRefDeserializer::new(v); - let map = try!(visitor.visit_map(&mut deserializer)); - let remaining = deserializer.iter.len(); - if remaining == 0 { - Ok(map) - } else { - Err(de::Error::invalid_length(len, &"fewer elements in map")) - } - } - } - } - - fn deserialize_option( - self, - visitor: V - ) -> Result - where V: de::Visitor, - { - match *self { - Value::Null => visitor.visit_none(), - _ => visitor.visit_some(self), - } - } - - fn deserialize_enum( - self, - _name: &str, - _variants: &'static [&'static str], - visitor: V - ) -> Result - where V: de::Visitor, - { - let (variant, value) = match *self { - Value::Object(ref value) => { - let mut iter = value.into_iter(); - let (variant, value) = match iter.next() { - Some(v) => v, - None => { - return Err(de::Error::invalid_value(Unexpected::Map, &"map with a single key")); - } - }; - // enums are encoded in json as maps with a single key:value pair - if iter.next().is_some() { - return Err(de::Error::invalid_value(Unexpected::Map, &"map with a single key")); - } - (variant, Some(value)) - } - Value::String(ref variant) => (variant, None), - ref other => { - return Err(de::Error::invalid_type(other.unexpected(), &"string or map")); - } - }; - - visitor.visit_enum(EnumRefDeserializer { - variant: variant, - value: value, - }) - } - - #[inline] - fn deserialize_newtype_struct( - self, - _name: &'static str, - visitor: V - ) -> Result - where V: de::Visitor, - { - visitor.visit_newtype_struct(self) - } - - forward_to_deserialize! { - bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq - seq_fixed_size bytes byte_buf map unit_struct tuple_struct struct - struct_field tuple ignored_any - } -} - -struct EnumRefDeserializer<'a> { - variant: &'a str, - value: Option<&'a Value>, -} - -impl<'a> de::EnumVisitor for EnumRefDeserializer<'a> { - type Error = Error; - type Variant = VariantRefDeserializer<'a>; - - fn visit_variant_seed(self, seed: V) -> Result<(V::Value, Self::Variant), Error> - where V: de::DeserializeSeed, - { - let variant = self.variant.into_deserializer(); - let visitor = VariantRefDeserializer { value: self.value }; - seed.deserialize(variant).map(|v| (v, visitor)) - } -} - -struct VariantRefDeserializer<'a> { - value: Option<&'a Value>, -} - -impl<'a> de::VariantVisitor for VariantRefDeserializer<'a> { - type Error = Error; - - fn visit_unit(self) -> Result<(), Error> { - match self.value { - Some(value) => de::Deserialize::deserialize(value), - None => Ok(()), - } - } - - fn visit_newtype_seed(self, seed: T) -> Result - where T: de::DeserializeSeed, - { - match self.value { - Some(value) => seed.deserialize(value), - None => Err(de::Error::invalid_type(Unexpected::UnitVariant, &"newtype variant")), - } - } - - fn visit_tuple( - self, - _len: usize, - visitor: V - ) -> Result - where V: de::Visitor, - { - match self.value { - Some(&Value::Array(ref v)) => { - de::Deserializer::deserialize(SeqRefDeserializer::new(v), visitor) - } - Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"tuple variant")), - None => Err(de::Error::invalid_type(Unexpected::UnitVariant, &"tuple variant")) - } - } - - fn visit_struct( - self, - _fields: &'static [&'static str], - visitor: V - ) -> Result - where V: de::Visitor, - { - match self.value { - Some(&Value::Object(ref v)) => { - de::Deserializer::deserialize(MapRefDeserializer::new(v), visitor) - } - Some(other) => Err(de::Error::invalid_type(other.unexpected(), &"struct variant")), - _ => Err(de::Error::invalid_type(Unexpected::UnitVariant, &"struct variant")) - } - } -} - -struct SeqRefDeserializer<'a> { - iter: slice::Iter<'a, Value>, -} - -impl<'a> SeqRefDeserializer<'a> { - fn new(slice: &'a [Value]) -> Self { - SeqRefDeserializer { - iter: slice.iter(), - } - } -} - -impl<'a> de::Deserializer for SeqRefDeserializer<'a> { - type Error = Error; - - #[inline] - fn deserialize(mut self, visitor: V) -> Result - where V: de::Visitor, - { - let len = self.iter.len(); - if len == 0 { - visitor.visit_unit() - } else { - let ret = try!(visitor.visit_seq(&mut self)); - let remaining = self.iter.len(); - if remaining == 0 { - Ok(ret) - } else { - Err(de::Error::invalid_length(len, &"fewer elements in array")) - } - } - } - - forward_to_deserialize! { - bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option - seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct - tuple_struct struct struct_field tuple enum ignored_any - } -} - -impl<'a> de::SeqVisitor for SeqRefDeserializer<'a> { - type Error = Error; - - fn visit_seed(&mut self, seed: T) -> Result, Error> - where T: de::DeserializeSeed, - { - match self.iter.next() { - Some(value) => seed.deserialize(value).map(Some), - None => Ok(None), - } - } - - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } -} - -struct MapRefDeserializer<'a> { - iter: <&'a Map as IntoIterator>::IntoIter, - value: Option<&'a Value>, -} - -impl<'a> MapRefDeserializer<'a> { - fn new(map: &'a Map) -> Self { - MapRefDeserializer { - iter: map.into_iter(), - value: None, - } - } -} - -impl<'a> de::MapVisitor for MapRefDeserializer<'a> { - type Error = Error; - - fn visit_key_seed(&mut self, seed: T) -> Result, Error> - where T: de::DeserializeSeed, - { - match self.iter.next() { - Some((key, value)) => { - self.value = Some(value); - seed.deserialize((&**key).into_deserializer()).map(Some) - } - None => Ok(None), - } - } - - fn visit_value_seed(&mut self, seed: T) -> Result - where T: de::DeserializeSeed, - { - match self.value.take() { - Some(value) => seed.deserialize(value), - None => Err(de::Error::custom("value is missing")), - } - } - - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } -} - -impl<'a> de::Deserializer for MapRefDeserializer<'a> { - type Error = Error; - - #[inline] - fn deserialize(self, visitor: V) -> Result - where V: de::Visitor, - { - visitor.visit_map(self) - } - - forward_to_deserialize! { - bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit option - seq seq_fixed_size bytes byte_buf map unit_struct newtype_struct - tuple_struct struct struct_field tuple enum ignored_any - } -} - -impl Value { - fn unexpected(&self) -> Unexpected { - match *self { - Value::Null => Unexpected::Unit, - Value::Bool(b) => Unexpected::Bool(b), - Value::Number(ref n) => { - if let Some(u) = n.as_u64() { - Unexpected::Unsigned(u) - } else if let Some(i) = n.as_i64() { - Unexpected::Signed(i) - } else if let Some(f) = n.as_f64() { - Unexpected::Float(f) - } else { - panic!("unexpected number") - } - } - Value::String(ref s) => Unexpected::Str(s), - Value::Array(_) => Unexpected::Seq, - Value::Object(_) => Unexpected::Map, - } - } -} - -/// Convert a `T` into `serde_json::Value` which is an enum that can represent -/// any valid JSON data. -/// -/// This conversion can fail if `T`'s implementation of `Serialize` decides to -/// fail, or if `T` contains a map with non-string keys. -/// -/// ```rust -/// # use serde_json::Value; -/// let val = serde_json::to_value("s").unwrap(); -/// assert_eq!(val, Value::String("s".to_owned())); -/// ``` -pub fn to_value(value: T) -> Result - where T: ser::Serialize, -{ - value.serialize(Serializer) -} - -/// Interpret a `serde_json::Value` as an instance of type `T`. -/// -/// This conversion can fail if the structure of the Value does not match the -/// structure expected by `T`, for example if `T` is a struct type but the Value -/// contains something other than a JSON map. It can also fail if the structure -/// is correct but `T`'s implementation of `Deserialize` decides that something -/// is wrong with the data, for example required struct fields are missing from -/// the JSON map or some number is too big to fit in the expected primitive -/// type. -pub fn from_value(value: Value) -> Result - where T: de::Deserialize, -{ - de::Deserialize::deserialize(value) -} - -/// Representation of any serializable data as a `serde_json::Value`. -pub trait ToJson { - /// Represent `self` as a `serde_json::Value`. Note that `Value` is not a - /// JSON string. If you need a string, use `serde_json::to_string` instead. - /// - /// This conversion can fail if `T`'s implementation of `Serialize` decides - /// to fail, or if `T` contains a map with non-string keys. - fn to_json(&self) -> Result; -} - -impl ToJson for T - where T: ser::Serialize, -{ - fn to_json(&self) -> Result { - to_value(self) - } -} diff --git a/third_party/rust/syntex/.cargo-checksum.json b/third_party/rust/syntex/.cargo-checksum.json index 013e66d8430b..cd824f7f4b40 100644 --- a/third_party/rust/syntex/.cargo-checksum.json +++ b/third_party/rust/syntex/.cargo-checksum.json @@ -1 +1 @@ -{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"cfa0e51c2177698edca724439fda05af5bbf0013d26b805d22c5b26f8b61348a","src/error.rs":"c99d5582e76ca9f9b06989517e866d0078834b3db3d4e51b3b193cae06b55526","src/lib.rs":"1679bbd38be948783e508648cf075fe27174ed2e717efa80609befcf6d772f55","src/registry.rs":"6d8a40c82f274a2d4fb413ef1f29b2c540c436051933e5b81cb488c34623d4b9","src/resolver.rs":"c01be55f360ee1d55f5ff001f05623a318175a7b8cf2c21a2eab9610c2f5f61e","src/stack.rs":"130dc7ff3851288a0e8e701f69af99f8f52f203a1419976d09ebc0075abe97e7"},"package":"bb3f52553a966675982404dc34028291b347e0c9a9c0b0b34f2da6be8a0443f8"} \ No newline at end of file +{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"7834a0de40701adcaef3abb5c35f50467218b952044aef26bcb743322d62eca6","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"d7f5489a2f756fb780d16a530f66822c3079aefe9c7a1151f1709356f586818e","src/error.rs":"c99d5582e76ca9f9b06989517e866d0078834b3db3d4e51b3b193cae06b55526","src/lib.rs":"1679bbd38be948783e508648cf075fe27174ed2e717efa80609befcf6d772f55","src/registry.rs":"9aa5a01d1729126bd973f907a8b8f89c3669f1aa5ac9629cffa1726e0cfd19a6","src/resolver.rs":"c01be55f360ee1d55f5ff001f05623a318175a7b8cf2c21a2eab9610c2f5f61e","src/stack.rs":"130dc7ff3851288a0e8e701f69af99f8f52f203a1419976d09ebc0075abe97e7"},"package":"a8f5e3aaa79319573d19938ea38d068056b826db9883a5d47f86c1cecc688f0e"} \ No newline at end of file diff --git a/third_party/rust/syntex/Cargo.toml b/third_party/rust/syntex/Cargo.toml index 15a92196a1fe..2fffe4160ff5 100644 --- a/third_party/rust/syntex/Cargo.toml +++ b/third_party/rust/syntex/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "syntex" -version = "0.54.0" +version = "0.58.1" authors = [ "erick.tryzelaar@gmail.com" ] license = "MIT/Apache-2.0" description = "A library that enables compile time syntax extension expansion" repository = "https://github.com/erickt/rust-syntex" readme = "../README.md" -include = ["Cargo.toml", "src/**/*.rs"] +include = ["Cargo.toml", "src/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"] [dependencies] -syntex_errors = { version = "^0.54.0", path = "../syntex_errors" } -syntex_syntax = { version = "^0.54.0", path = "../syntex_syntax" } +syntex_errors = { version = "0.58", path = "../syntex_errors" } +syntex_syntax = { version = "0.58", path = "../syntex_syntax" } diff --git a/third_party/rust/itoa/LICENSE-APACHE b/third_party/rust/syntex/LICENSE-APACHE similarity index 100% rename from third_party/rust/itoa/LICENSE-APACHE rename to third_party/rust/syntex/LICENSE-APACHE diff --git a/third_party/rust/dtoa/LICENSE-MIT b/third_party/rust/syntex/LICENSE-MIT similarity index 95% rename from third_party/rust/dtoa/LICENSE-MIT rename to third_party/rust/syntex/LICENSE-MIT index d1c35df03836..39d4bdb5acd3 100644 --- a/third_party/rust/dtoa/LICENSE-MIT +++ b/third_party/rust/syntex/LICENSE-MIT @@ -1,4 +1,4 @@ -Copyright (c) 2016 Itoa Developers +Copyright (c) 2014 The Rust Project Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/third_party/rust/syntex/README.md b/third_party/rust/syntex/README.md new file mode 100644 index 000000000000..e3bb235675b3 --- /dev/null +++ b/third_party/rust/syntex/README.md @@ -0,0 +1,88 @@ +Syntex Code Generation Framework +================================ + +[![Build Status](https://api.travis-ci.org/serde-rs/syntex.png?branch=master)](https://travis-ci.org/serde-rs/syntex) +[![Latest Version](https://img.shields.io/crates/v/syntex.svg)](https://crates.io/crates/syntex) + +`syntex` is a library that enables compile time syntax extension expansion. +This allows users to use libraries like [serde](https://github.com/serde-rs/serde) +on stable Rust. + +Configuring with Cargo +====================== + +To create a package: + +```toml +[package] +name = "hello_world_macros" +version = "0.2.0" +authors = [ "erick.tryzelaar@gmail.com" ] + +[dependencies] +syntex = "*" +syntex_syntax = "*" +``` + +To use it: + +Cargo.toml: + +```toml +[package] +name = "hello_world" +version = "0.3.0" +authors = [ "erick.tryzelaar@gmail.com" ] +build = "build.rs" + +[build-dependencies] +syntex = "*" +``` + +build.rs: + +```rust +extern crate syntex; +extern crate hello_world_macros; + +use std::env; +use std::path::Path; + +fn main() { + let mut registry = syntex::Registry::new(); + hello_world_macros::register(&mut registry); + + let src = Path::new("src/main.rs.in"); + let dst = Path::new(&env::var("OUT_DIR").unwrap()).join("main.rs"); + + registry.expand("hello_world", &src, &dst).unwrap(); +} +``` + +src/main.rs: + +```rust +// Include the real main +include!(concat!(env!("OUT_DIR"), "/main.rs")); +``` + +src/main.rs.in: + +```rust +fn main() { + let s = hello_world!(); + println!("{}", s); +} +``` + +Limitations +=========== + +Unfortunately because there is no stable plugin support in Rust yet, there are +some things that syntex cannot do: + +* The code generated by syntex reports errors in the generated file, not the + source file. +* Syntex macros cannot be embedded in macros it doesn't know about, like the + builtin `vec![]`, `println!(...)`, and etc. This is because those macros + may override the `macro_name!(...)` to mean something different. diff --git a/third_party/rust/syntex/src/registry.rs b/third_party/rust/syntex/src/registry.rs index a33f19cb8aa4..61e6f22c8268 100644 --- a/third_party/rust/syntex/src/registry.rs +++ b/third_party/rust/syntex/src/registry.rs @@ -221,7 +221,7 @@ impl Registry { try!(pprust::print_crate( sess.codemap(), - &sess.span_diagnostic, + &sess, &krate, src_name, &mut rdr, diff --git a/third_party/rust/syntex_errors/.cargo-checksum.json b/third_party/rust/syntex_errors/.cargo-checksum.json index ec90a6606be5..1409a0cb56fa 100644 --- a/third_party/rust/syntex_errors/.cargo-checksum.json +++ b/third_party/rust/syntex_errors/.cargo-checksum.json @@ -1 +1 @@ -{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"3442bb8acc6f060590055401c2ed655933cf3006df7a7a7c4ce04bd4034ca4cf","src/diagnostic.rs":"c469bbeb9bc0bff1dc7da90f12fbf686de53b7920e8a8ec509171d7ee7939f9e","src/diagnostic_builder.rs":"535a903c0961e85d8ad9eb88a08e3095fbc251c6f032f84cb48a1f1d36c1b716","src/emitter.rs":"393b6dec613e03a9e248c0245248a17f3836750d6ef4591334fd4474b94416eb","src/lib.rs":"33d43a964af5efd3ec43bd44a8fe07db70db349f7247baf966cf7e46c95695e5","src/lock.rs":"77e185b48b20509596d9778d7dcca02b92e09be061ed57a9ef37ccfb9fa781ae","src/registry.rs":"ab229b7c6d3016917638d15e754df421be8f4b88b95518773c5c33a07a005274","src/snippet.rs":"436f7a9d20d39de14ae84c3d368d23a59c3436b63b6298578728a16b20143190","src/styled_buffer.rs":"a00d37a0c57b0c16cafa28dff936c1689e0d64a0002570b731f9f34a8ecdc61c"},"package":"dee2f6e49c075f71332bb775219d5982bee6732d26227fa1ae1b53cdb12f5cc5"} \ No newline at end of file +{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"ec018060c00d8ef6f05d30613fd8b9b1475a0d3f2c826e897f6f6bd9dd84aebc","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"d7f5489a2f756fb780d16a530f66822c3079aefe9c7a1151f1709356f586818e","src/diagnostic.rs":"3df61b2252da1d110b55c2981249d35a68576ee2c7470e438dcb84763e180629","src/diagnostic_builder.rs":"535a903c0961e85d8ad9eb88a08e3095fbc251c6f032f84cb48a1f1d36c1b716","src/emitter.rs":"f7e4a4322d8f6e5a74d452ffb966e1f983c831f18526b1d2f36af66ee9b335ca","src/lib.rs":"dc689305ed5bcb2412acdb8c02de64b6d5aaf8c1c807ae244cb0ad3b45a741aa","src/lock.rs":"77e185b48b20509596d9778d7dcca02b92e09be061ed57a9ef37ccfb9fa781ae","src/registry.rs":"ab229b7c6d3016917638d15e754df421be8f4b88b95518773c5c33a07a005274","src/snippet.rs":"1d38ef64e75ced2f69808cfbe50a49a60138ee37fb49f32abb28d8241f2db6ce","src/styled_buffer.rs":"a00d37a0c57b0c16cafa28dff936c1689e0d64a0002570b731f9f34a8ecdc61c"},"package":"867cc5c2d7140ae7eaad2ae9e8bf39cb18a67ca651b7834f88d46ca98faadb9c"} \ No newline at end of file diff --git a/third_party/rust/syntex_errors/Cargo.toml b/third_party/rust/syntex_errors/Cargo.toml index 76eb75bdad03..406d29d2d4e5 100644 --- a/third_party/rust/syntex_errors/Cargo.toml +++ b/third_party/rust/syntex_errors/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "syntex_errors" -version = "0.54.0" +version = "0.58.1" authors = [ "erick.tryzelaar@gmail.com" ] license = "MIT/Apache-2.0" description = "Export of librustc_errors for code generation" repository = "https://github.com/serde-rs/syntex" -include = ["Cargo.toml", "src/**/*.rs"] +readme = "../README.md" +include = ["Cargo.toml", "src/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"] [dependencies] -libc = "^0.2.13" -log = "^0.3.3" -rustc-serialize = "^0.3.16" -syntex_pos = { version = "^0.54.0", path = "../syntex_pos" } -term = "^0.4.4" -unicode-xid = "^0.0.4" +libc = "0.2.13" +rustc-serialize = "0.3.16" +syntex_pos = { version = "0.58", path = "../syntex_pos" } +term = "0.4.4" +unicode-xid = "0.0.4" diff --git a/third_party/rust/serde_json/LICENSE-APACHE b/third_party/rust/syntex_errors/LICENSE-APACHE similarity index 100% rename from third_party/rust/serde_json/LICENSE-APACHE rename to third_party/rust/syntex_errors/LICENSE-APACHE diff --git a/third_party/rust/itoa/LICENSE-MIT b/third_party/rust/syntex_errors/LICENSE-MIT similarity index 95% rename from third_party/rust/itoa/LICENSE-MIT rename to third_party/rust/syntex_errors/LICENSE-MIT index d1c35df03836..39d4bdb5acd3 100644 --- a/third_party/rust/itoa/LICENSE-MIT +++ b/third_party/rust/syntex_errors/LICENSE-MIT @@ -1,4 +1,4 @@ -Copyright (c) 2016 Itoa Developers +Copyright (c) 2014 The Rust Project Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/third_party/rust/syntex_errors/README.md b/third_party/rust/syntex_errors/README.md new file mode 100644 index 000000000000..e3bb235675b3 --- /dev/null +++ b/third_party/rust/syntex_errors/README.md @@ -0,0 +1,88 @@ +Syntex Code Generation Framework +================================ + +[![Build Status](https://api.travis-ci.org/serde-rs/syntex.png?branch=master)](https://travis-ci.org/serde-rs/syntex) +[![Latest Version](https://img.shields.io/crates/v/syntex.svg)](https://crates.io/crates/syntex) + +`syntex` is a library that enables compile time syntax extension expansion. +This allows users to use libraries like [serde](https://github.com/serde-rs/serde) +on stable Rust. + +Configuring with Cargo +====================== + +To create a package: + +```toml +[package] +name = "hello_world_macros" +version = "0.2.0" +authors = [ "erick.tryzelaar@gmail.com" ] + +[dependencies] +syntex = "*" +syntex_syntax = "*" +``` + +To use it: + +Cargo.toml: + +```toml +[package] +name = "hello_world" +version = "0.3.0" +authors = [ "erick.tryzelaar@gmail.com" ] +build = "build.rs" + +[build-dependencies] +syntex = "*" +``` + +build.rs: + +```rust +extern crate syntex; +extern crate hello_world_macros; + +use std::env; +use std::path::Path; + +fn main() { + let mut registry = syntex::Registry::new(); + hello_world_macros::register(&mut registry); + + let src = Path::new("src/main.rs.in"); + let dst = Path::new(&env::var("OUT_DIR").unwrap()).join("main.rs"); + + registry.expand("hello_world", &src, &dst).unwrap(); +} +``` + +src/main.rs: + +```rust +// Include the real main +include!(concat!(env!("OUT_DIR"), "/main.rs")); +``` + +src/main.rs.in: + +```rust +fn main() { + let s = hello_world!(); + println!("{}", s); +} +``` + +Limitations +=========== + +Unfortunately because there is no stable plugin support in Rust yet, there are +some things that syntex cannot do: + +* The code generated by syntex reports errors in the generated file, not the + source file. +* Syntex macros cannot be embedded in macros it doesn't know about, like the + builtin `vec![]`, `println!(...)`, and etc. This is because those macros + may override the `macro_name!(...)` to mean something different. diff --git a/third_party/rust/syntex_errors/src/diagnostic.rs b/third_party/rust/syntex_errors/src/diagnostic.rs index 730ca8f9e2e4..ac39af201899 100644 --- a/third_party/rust/syntex_errors/src/diagnostic.rs +++ b/third_party/rust/syntex_errors/src/diagnostic.rs @@ -14,12 +14,13 @@ use RenderSpan; use RenderSpan::Suggestion; use std::fmt; use syntax_pos::{MultiSpan, Span}; +use snippet::Style; #[must_use] #[derive(Clone, Debug, PartialEq)] pub struct Diagnostic { pub level: Level, - pub message: String, + pub message: Vec<(String, Style)>, pub code: Option, pub span: MultiSpan, pub children: Vec, @@ -29,7 +30,7 @@ pub struct Diagnostic { #[derive(Clone, Debug, PartialEq)] pub struct SubDiagnostic { pub level: Level, - pub message: String, + pub message: Vec<(String, Style)>, pub span: MultiSpan, pub render_span: Option, } @@ -42,7 +43,7 @@ impl Diagnostic { pub fn new_with_code(level: Level, code: Option, message: &str) -> Self { Diagnostic { level: level, - message: message.to_owned(), + message: vec![(message.to_owned(), Style::NoStyle)], code: code, span: MultiSpan::new(), children: vec![], @@ -96,8 +97,14 @@ impl Diagnostic { -> &mut Self { // For now, just attach these as notes - self.note(&format!("expected {} `{}`{}", label, expected, expected_extra)); - self.note(&format!(" found {} `{}`{}", label, found, found_extra)); + self.highlighted_note(vec![ + (format!("expected {} `", label), Style::NoStyle), + (format!("{}", expected), Style::Highlight), + (format!("`{}\n", expected_extra), Style::NoStyle), + (format!(" found {} `", label), Style::NoStyle), + (format!("{}", found), Style::Highlight), + (format!("`{}", found_extra), Style::NoStyle), + ]); self } @@ -106,6 +113,11 @@ impl Diagnostic { self } + pub fn highlighted_note(&mut self, msg: Vec<(String, Style)>) -> &mut Self { + self.sub_with_highlights(Level::Note, msg, MultiSpan::new(), None); + self + } + pub fn span_note>(&mut self, sp: S, msg: &str) @@ -168,7 +180,11 @@ impl Diagnostic { self } - pub fn message(&self) -> &str { + pub fn message(&self) -> String { + self.message.iter().map(|i| i.0.to_owned()).collect::() + } + + pub fn styled_message(&self) -> &Vec<(String, Style)> { &self.message } @@ -193,10 +209,36 @@ impl Diagnostic { render_span: Option) { let sub = SubDiagnostic { level: level, - message: message.to_owned(), + message: vec![(message.to_owned(), Style::NoStyle)], + span: span, + render_span: render_span, + }; + self.children.push(sub); + } + + /// Convenience function for internal use, clients should use one of the + /// public methods above. + fn sub_with_highlights(&mut self, + level: Level, + message: Vec<(String, Style)>, + span: MultiSpan, + render_span: Option) { + let sub = SubDiagnostic { + level: level, + message: message, span: span, render_span: render_span, }; self.children.push(sub); } } + +impl SubDiagnostic { + pub fn message(&self) -> String { + self.message.iter().map(|i| i.0.to_owned()).collect::() + } + + pub fn styled_message(&self) -> &Vec<(String, Style)> { + &self.message + } +} diff --git a/third_party/rust/syntex_errors/src/emitter.rs b/third_party/rust/syntex_errors/src/emitter.rs index b9996010025b..fafd995034f0 100644 --- a/third_party/rust/syntex_errors/src/emitter.rs +++ b/third_party/rust/syntex_errors/src/emitter.rs @@ -34,7 +34,11 @@ impl Emitter for EmitterWriter { let mut primary_span = db.span.clone(); let mut children = db.children.clone(); self.fix_multispans_in_std_macros(&mut primary_span, &mut children); - self.emit_messages_default(&db.level, &db.message, &db.code, &primary_span, &children); + self.emit_messages_default(&db.level, + &db.styled_message(), + &db.code, + &primary_span, + &children); } } @@ -336,43 +340,56 @@ impl EmitterWriter { // which is...less weird, at least. In fact, in general, if // the rightmost span overlaps with any other span, we should // use the "hang below" version, so we can at least make it - // clear where the span *starts*. + // clear where the span *starts*. There's an exception for this + // logic, when the labels do not have a message: + // + // fn foo(x: u32) { + // -------------- + // | + // x_span + // + // instead of: + // + // fn foo(x: u32) { + // -------------- + // | | + // | x_span + // + // let mut annotations_position = vec![]; let mut line_len = 0; let mut p = 0; let mut ann_iter = annotations.iter().peekable(); while let Some(annotation) = ann_iter.next() { - let is_line = if let AnnotationType::MultilineLine(_) = annotation.annotation_type { - true - } else { - false - }; let peek = ann_iter.peek(); if let Some(next) = peek { - let next_is_line = if let AnnotationType::MultilineLine(_) = next.annotation_type { - true - } else { - false - }; - - if overlaps(next, annotation) && !is_line && !next_is_line { + if overlaps(next, annotation) && !annotation.is_line() && !next.is_line() + && annotation.has_label() + { + // This annotation needs a new line in the output. p += 1; } } annotations_position.push((p, annotation)); if let Some(next) = peek { - let next_is_line = if let AnnotationType::MultilineLine(_) = next.annotation_type { - true - } else { - false - }; let l = if let Some(ref label) = next.label { label.len() + 2 } else { 0 }; - if (overlaps(next, annotation) || next.end_col + l > annotation.start_col) - && !is_line && !next_is_line + if (overlaps(next, annotation) // Do not allow two labels to be in the same line + || next.end_col + l > annotation.start_col) // if they overlap including + // padding, to avoid situations like: + // + // fn foo(x: u32) { + // -------^------ + // | | + // fn_spanx_span + // + && !annotation.is_line() // Do not add a new line if this annotation or the + && !next.is_line() // next are vertical line placeholders. + && annotation.has_label() // Both labels must have some text, otherwise + && next.has_label() // they are not overlapping. { p += 1; } @@ -409,6 +426,17 @@ impl EmitterWriter { return; } + // Write the colunmn separator. + // + // After this we will have: + // + // 2 | fn foo() { + // | + // | + // | + // 3 | + // 4 | } + // | for pos in 0..line_len + 1 { draw_col_separator(buffer, line_offset + pos + 1, width_offset - 2); buffer.putc(line_offset + pos + 1, @@ -469,7 +497,8 @@ impl EmitterWriter { Style::UnderlineSecondary }; let pos = pos + 1; - if pos > 1 { + + if pos > 1 && annotation.has_label() { for p in line_offset + 1..line_offset + pos + 1 { buffer.putc(p, code_offset + annotation.start_col, @@ -547,16 +576,8 @@ impl EmitterWriter { // | | something about `foo` // | something about `fn foo()` annotations_position.sort_by(|a, b| { - fn len(a: &Annotation) -> usize { - // Account for usize underflows - if a.end_col > a.start_col { - a.end_col - a.start_col - } else { - a.start_col - a.end_col - } - } // Decreasing order - len(a.1).cmp(&len(b.1)).reverse() + a.1.len().cmp(&b.1.len()).reverse() }); // Write the underlines. @@ -696,17 +717,93 @@ impl EmitterWriter { if spans_updated { children.push(SubDiagnostic { level: Level::Note, - message: "this error originates in a macro outside of the current crate" - .to_string(), + message: vec![("this error originates in a macro outside of the current crate" + .to_string(), Style::NoStyle)], span: MultiSpan::new(), render_span: None, }); } } + /// Add a left margin to every line but the first, given a padding length and the label being + /// displayed, keeping the provided highlighting. + fn msg_to_buffer(&self, + buffer: &mut StyledBuffer, + msg: &Vec<(String, Style)>, + padding: usize, + label: &str, + override_style: Option

    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 Dz|AwJ literal 0 HcmV?d00001 diff --git a/third_party/rust/bindgen/src/chooser.rs b/third_party/rust/bindgen/src/callbacks.rs similarity index 85% rename from third_party/rust/bindgen/src/chooser.rs rename to third_party/rust/bindgen/src/callbacks.rs index 29090a422001..ef85fdd7ab57 100644 --- a/third_party/rust/bindgen/src/chooser.rs +++ b/third_party/rust/bindgen/src/callbacks.rs @@ -7,7 +7,11 @@ use std::panic::UnwindSafe; /// A trait to allow configuring different kinds of types in different /// situations. -pub trait TypeChooser: fmt::Debug + UnwindSafe { +pub trait ParseCallbacks: fmt::Debug + UnwindSafe { + + /// This function will be run on every macro that is identified + fn parsed_macro(&self, _name: &str) {} + /// The integer kind an integer macro should have, given a name and the /// value of that macro, or `None` if you want the default to be chosen. fn int_macro(&self, _name: &str, _value: i64) -> Option { diff --git a/third_party/rust/bindgen/src/clang.rs b/third_party/rust/bindgen/src/clang.rs index 613e08e84927..cdadce1c1c42 100644 --- a/third_party/rust/bindgen/src/clang.rs +++ b/third_party/rust/bindgen/src/clang.rs @@ -6,6 +6,7 @@ use cexpr; use clang_sys::*; +use regex; use std::{mem, ptr, slice}; use std::ffi::{CStr, CString}; use std::fmt; @@ -76,6 +77,36 @@ impl Cursor { } } + /// Gets the C++ manglings for this cursor, or an error if the function is + /// not loaded or the manglings are not available. + pub fn cxx_manglings(&self) -> Result, ()> { + use clang_sys::*; + if !clang_Cursor_getCXXManglings::is_loaded() { + return Err(()); + } + unsafe { + let manglings = clang_Cursor_getCXXManglings(self.x); + if manglings.is_null() { + return Err(()); + } + let count = (*manglings).Count as usize; + + let mut result = Vec::with_capacity(count); + for i in 0..count { + let string_ptr = (*manglings).Strings.offset(i as isize); + result.push(cxstring_to_string_leaky(*string_ptr)); + } + clang_disposeStringSet(manglings); + Ok(result) + } + } + + /// Returns whether the cursor refers to a built-in definition. + pub fn is_builtin(&self) -> bool { + let (file, _, _, _) = self.location().location(); + file.name().is_none() + } + /// Get the `Cursor` for this cursor's referent's lexical parent. /// /// The lexical parent is the parent of the definition. The semantic parent @@ -126,11 +157,11 @@ impl Cursor { } /// Return the number of template arguments used by this cursor's referent, - /// if the referent is either a template specialization or declaration. - /// Returns `None` otherwise. + /// if the referent is either a template instantiation. Returns `None` + /// otherwise. /// - /// NOTE: This may not return `Some` for some non-fully specialized - /// templates, see #193 and #194. + /// NOTE: This may not return `Some` for partial template specializations, + /// see #193 and #194. pub fn num_template_args(&self) -> Option { // XXX: `clang_Type_getNumTemplateArguments` is sort of reliable, while // `clang_Cursor_getNumTemplateArguments` is totally unreliable. @@ -208,7 +239,7 @@ impl Cursor { /// Get the kind of referent this cursor is pointing to. pub fn kind(&self) -> CXCursorKind { - unsafe { clang_getCursorKind(self.x) } + self.x.kind } /// Returns true is the cursor is a definition @@ -302,7 +333,11 @@ impl Cursor { x: clang_getCursorDefinition(self.x), }; - if ret.is_valid() { Some(ret) } else { None } + if ret.is_valid() && ret.kind() != CXCursor_NoDeclFound { + Some(ret) + } else { + None + } } } @@ -331,8 +366,9 @@ impl Cursor { } } - /// Given that this cursor points to a template specialization, get a cursor - /// pointing to the template definition that is being specialized. + /// Given that this cursor points to either a template specialization or a + /// template instantiation, get a cursor pointing to the template definition + /// that is being specialized. pub fn specialized(&self) -> Option { unsafe { let ret = Cursor { @@ -588,6 +624,17 @@ impl Cursor { } } +/// Checks whether the name looks like an identifier, i.e. is alphanumeric +/// (including '_') and does not start with a digit. +pub fn is_valid_identifier(name: &str) -> bool { + let mut chars = name.chars(); + let first_valid = chars.next() + .map(|c| c.is_alphabetic() || c == '_') + .unwrap_or(false); + + first_valid && chars.all(|c| c.is_alphanumeric() || c == '_') +} + extern "C" fn visit_children(cur: CXCursor, _parent: CXCursor, data: CXClientData) @@ -633,9 +680,10 @@ impl Eq for Type {} impl fmt::Debug for Type { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { write!(fmt, - "Type({}, kind: {}, decl: {:?}, canon: {:?})", + "Type({}, kind: {}, cconv: {}, decl: {:?}, canon: {:?})", self.spelling(), type_to_str(self.kind()), + self.call_conv(), self.declaration(), self.declaration().canonical()) } @@ -716,7 +764,16 @@ impl Type { /// Get a raw display name for this type. pub fn spelling(&self) -> String { - unsafe { cxstring_into_string(clang_getTypeSpelling(self.x)) } + let s = unsafe { cxstring_into_string(clang_getTypeSpelling(self.x)) }; + // Clang 5.0 introduced changes in the spelling API so it returned the + // full qualified name. Let's undo that here. + if s.split("::").all(|s| is_valid_identifier(s)) { + if let Some(s) = s.split("::").last() { + return s.to_owned(); + } + } + + s } /// Is this type const qualified? @@ -875,7 +932,11 @@ impl Type { pub fn named(&self) -> Type { unsafe { Type { - x: clang_Type_getNamedType(self.x), + x: if clang_Type_getNamedType::is_loaded() { + clang_Type_getNamedType(self.x) + } else { + self.x + }, } } } @@ -890,8 +951,8 @@ impl Type { self.is_valid() && self.kind() != CXType_Unexposed } - /// Is this type a fully specialized template? - pub fn is_fully_specialized_template(&self) -> bool { + /// Is this type a fully instantiated template? + pub fn is_fully_instantiated_template(&self) -> bool { // Yep, the spelling of this containing type-parameter is extremely // nasty... But can happen in . Unfortunately I couldn't // reduce it enough :( @@ -903,6 +964,30 @@ impl Type { _ => true, } } + + /// Is this type an associated template type? Eg `T::Associated` in + /// this example: + /// + /// ```c++ + /// template + /// class Foo { + /// typename T::Associated member; + /// }; + /// ``` + pub fn is_associated_type(&self) -> bool { + // This is terrible :( + fn hacky_parse_associated_type>(spelling: S) -> bool { + lazy_static! { + static ref ASSOC_TYPE_RE: regex::Regex = + regex::Regex::new(r"typename type\-parameter\-\d+\-\d+::.+").unwrap(); + } + ASSOC_TYPE_RE.is_match(spelling.as_ref()) + } + + self.kind() == CXType_Unexposed && + (hacky_parse_associated_type(self.spelling()) || + hacky_parse_associated_type(self.canonical_type().spelling())) + } } /// The `CanonicalTypeDeclaration` type exists as proof-by-construction that its @@ -1107,16 +1192,18 @@ impl File { } } -fn cxstring_into_string(s: CXString) -> String { +fn cxstring_to_string_leaky(s: CXString) -> String { if s.data.is_null() { return "".to_owned(); } - unsafe { - let c_str = CStr::from_ptr(clang_getCString(s) as *const _); - let ret = c_str.to_string_lossy().into_owned(); - clang_disposeString(s); - ret - } + let c_str = unsafe { CStr::from_ptr(clang_getCString(s) as *const _) }; + c_str.to_string_lossy().into_owned() +} + +fn cxstring_into_string(s: CXString) -> String { + let ret = cxstring_to_string_leaky(s); + unsafe { clang_disposeString(s) }; + ret } /// An `Index` is an environment for a set of translation units that will @@ -1368,7 +1455,9 @@ impl Drop for Diagnostic { /// A file which has not been saved to disk. pub struct UnsavedFile { x: CXUnsavedFile, - name: CString, + /// The name of the unsaved file. Kept here to avoid leaving dangling pointers in + /// `CXUnsavedFile`. + pub name: CString, contents: CString, } @@ -1390,6 +1479,15 @@ impl UnsavedFile { } } +impl fmt::Debug for UnsavedFile { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + write!(fmt, + "UnsavedFile(name: {:?}, contents: {:?})", + self.name, + self.contents) + } +} + /// Convert a cursor kind into a static string. pub fn kind_to_str(x: CXCursorKind) -> String { unsafe { cxstring_into_string(clang_getCursorKindSpelling(x)) } @@ -1498,6 +1596,13 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { &specialized); } } + + if let Some(parent) = c.fallible_semantic_parent() { + println!(""); + print_cursor(depth, + String::from(prefix) + "semantic-parent.", + &parent); + } } fn print_type>(depth: isize, prefix: S, ty: &Type) { @@ -1509,6 +1614,8 @@ pub fn ast_dump(c: &Cursor, depth: isize) -> CXChildVisitResult { return; } + print_indent(depth, format!(" {}cconv = {}", prefix, ty.call_conv())); + print_indent(depth, format!(" {}spelling = \"{}\"", prefix, ty.spelling())); let num_template_args = diff --git a/third_party/rust/bindgen/src/codegen/error.rs b/third_party/rust/bindgen/src/codegen/error.rs new file mode 100644 index 000000000000..ccb76c5bd7b6 --- /dev/null +++ b/third_party/rust/bindgen/src/codegen/error.rs @@ -0,0 +1,41 @@ +use std::error; +use std::fmt; + +/// Errors that can occur during code generation. +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum Error { + /// Tried to generate an opaque blob for a type that did not have a layout. + NoLayoutForOpaqueBlob, + + /// Tried to instantiate an opaque template definition, or a template + /// definition that is too difficult for us to understand (like a partial + /// template specialization). + InstantiationOfOpaqueType, +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", error::Error::description(self)) + } +} + +impl error::Error for Error { + fn cause(&self) -> Option<&error::Error> { + None + } + + fn description(&self) -> &'static str { + match *self { + Error::NoLayoutForOpaqueBlob => { + "Tried to generate an opaque blob, but had no layout" + } + Error::InstantiationOfOpaqueType => { + "Instantiation of opaque template type or partial template \ + specialization" + } + } + } +} + +/// A `Result` of `T` or an error of `bindgen::codegen::error::Error`. +pub type Result = ::std::result::Result; diff --git a/third_party/rust/bindgen/src/codegen/helpers.rs b/third_party/rust/bindgen/src/codegen/helpers.rs index 06dadab0c92a..eb843a653988 100644 --- a/third_party/rust/bindgen/src/codegen/helpers.rs +++ b/third_party/rust/bindgen/src/codegen/helpers.rs @@ -10,6 +10,10 @@ pub mod attributes { use aster; use syntax::ast; + pub fn allow(which_ones: &[&str]) -> ast::Attribute { + aster::AstBuilder::new().attr().list("allow").words(which_ones).build() + } + pub fn repr(which: &str) -> ast::Attribute { aster::AstBuilder::new().attr().list("repr").words(&[which]).build() } @@ -142,7 +146,7 @@ pub mod ast_ty { } vec.push(int_expr(0)); - let kind = ast::ExprKind::Vec(vec); + let kind = ast::ExprKind::Array(vec); aster::AstBuilder::new().expr().build_expr_kind(kind) } @@ -154,17 +158,38 @@ pub mod ast_ty { .build_lit(aster::AstBuilder::new().lit().byte_str(string)) } - pub fn float_expr(f: f64) -> P { + pub fn float_expr(ctx: &BindgenContext, + f: f64) + -> Result, ()> { use aster::symbol::ToSymbol; - let mut string = f.to_string(); - // So it gets properly recognised as a floating point constant. - if !string.contains('.') { - string.push('.'); + if f.is_finite() { + let mut string = f.to_string(); + + // So it gets properly recognised as a floating point constant. + if !string.contains('.') { + string.push('.'); + } + + let kind = ast::LitKind::FloatUnsuffixed(string.as_str().to_symbol()); + return Ok(aster::AstBuilder::new().expr().lit().build_lit(kind)) } - let kind = ast::LitKind::FloatUnsuffixed(string.as_str().to_symbol()); - aster::AstBuilder::new().expr().lit().build_lit(kind) + let prefix = ctx.trait_prefix(); + if f.is_nan() { + return Ok(quote_expr!(ctx.ext_cx(), ::$prefix::f64::NAN)); + } + + if f.is_infinite() { + return Ok(if f.is_sign_positive() { + quote_expr!(ctx.ext_cx(), ::$prefix::f64::INFINITY) + } else { + quote_expr!(ctx.ext_cx(), ::$prefix::f64::NEG_INFINITY) + }); + } + + warn!("Unknown non-finite float number: {:?}", f); + return Err(()); } pub fn arguments_from_signature(signature: &FunctionSig, diff --git a/third_party/rust/bindgen/src/codegen/mod.rs b/third_party/rust/bindgen/src/codegen/mod.rs index 77f654e6e6df..697c140f8448 100644 --- a/third_party/rust/bindgen/src/codegen/mod.rs +++ b/third_party/rust/bindgen/src/codegen/mod.rs @@ -1,15 +1,17 @@ +mod error; mod helpers; mod struct_layout; use self::helpers::{BlobTyBuilder, attributes}; +use self::struct_layout::{StructLayoutTracker, bytes_from_bits_pow2}; use self::struct_layout::{align_to, bytes_from_bits}; -use self::struct_layout::{bytes_from_bits_pow2, StructLayoutTracker}; use aster; use ir::annotations::FieldAccessorKind; use ir::comp::{Base, CompInfo, CompKind, Field, Method, MethodKind}; use ir::context::{BindgenContext, ItemId}; use ir::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; +use ir::dot; use ir::enum_ty::{Enum, EnumVariant, EnumVariantValue}; use ir::function::{Function, FunctionSig}; use ir::int::IntKind; @@ -18,7 +20,8 @@ use ir::item::{Item, ItemAncestors, ItemCanonicalName, ItemCanonicalPath, use ir::item_kind::ItemKind; use ir::layout::Layout; use ir::module::Module; -use ir::objc::ObjCInterface; +use ir::objc::{ObjCInterface, ObjCMethod}; +use ir::template::{AsNamed, TemplateInstantiation, TemplateParameters}; use ir::ty::{Type, TypeKind}; use ir::var::Var; @@ -136,11 +139,6 @@ impl<'a> CodegenResult<'a> { } } - fn next_id(&mut self) -> usize { - self.codegen_id.set(self.codegen_id.get() + 1); - self.codegen_id.get() - } - fn saw_union(&mut self) { self.saw_union = true; } @@ -402,10 +400,18 @@ impl CodeGenerator for Module { }); let name = item.canonical_name(ctx); - let item = aster::AstBuilder::new() + let item_builder = aster::AstBuilder::new() .item() - .pub_() - .build_item_kind(name, module); + .pub_(); + let item = if name == "root" { + let attrs = &["non_snake_case", + "non_camel_case_types", + "non_upper_case_globals"]; + item_builder.with_attr(attributes::allow(attrs)) + .build_item_kind(name, module) + } else { + item_builder.build_item_kind(name, module) + }; result.push(item); } @@ -428,7 +434,7 @@ impl CodeGenerator for Var { } result.saw_var(&canonical_name); - let ty = self.ty().to_rust_ty(ctx); + let ty = self.ty().to_rust_ty_or_opaque(ctx, &()); if let Some(val) = self.val() { let const_item = aster::AstBuilder::new() @@ -438,8 +444,7 @@ impl CodeGenerator for Var { .expr(); let item = match *val { VarType::Bool(val) => { - const_item.build(helpers::ast_ty::bool_expr(val)) - .build(ty) + const_item.build(helpers::ast_ty::bool_expr(val)).build(ty) } VarType::Int(val) => { const_item.build(helpers::ast_ty::int_expr(val)).build(ty) @@ -465,8 +470,12 @@ impl CodeGenerator for Var { } } VarType::Float(f) => { - const_item.build(helpers::ast_ty::float_expr(f)) - .build(ty) + match helpers::ast_ty::float_expr(ctx, f) { + Ok(expr) => { + const_item.build(expr).build(ty) + } + Err(..) => return, + } } VarType::Char(c) => { const_item @@ -521,19 +530,20 @@ impl CodeGenerator for Type { TypeKind::Pointer(..) | TypeKind::BlockPointer | TypeKind::Reference(..) | - TypeKind::TemplateInstantiation(..) | TypeKind::Function(..) | TypeKind::ResolvedTypeRef(..) | + TypeKind::Opaque | TypeKind::Named => { // These items don't need code generation, they only need to be // converted to rust types in fields, arguments, and such. return; } + TypeKind::TemplateInstantiation(ref inst) => { + inst.codegen(ctx, result, whitelisted_items, item) + } TypeKind::Comp(ref ci) => { ci.codegen(ctx, result, whitelisted_items, item) } - // NB: The code below will pick the correct - // applicable_template_args. TypeKind::TemplateAlias(inner, _) | TypeKind::Alias(inner) => { let inner_item = ctx.resolve_item(inner); @@ -556,15 +566,16 @@ impl CodeGenerator for Type { return; } - let mut applicable_template_args = - item.applicable_template_args(ctx); + let mut used_template_params = item.used_template_params(ctx); let inner_rust_type = if item.is_opaque(ctx) { - applicable_template_args.clear(); - // Pray if there's no layout. - let layout = self.layout(ctx).unwrap_or_else(Layout::zero); - BlobTyBuilder::new(layout).build() + used_template_params = None; + self.to_opaque(ctx, item) } else { - inner_item.to_rust_ty(ctx) + // Its possible that we have better layout information than + // the inner type does, so fall back to an opaque blob based + // on our layout if converting the inner item fails. + inner_item.try_to_rust_ty_or_opaque(ctx, &()) + .unwrap_or_else(|_| self.to_opaque(ctx, item)) }; { @@ -602,7 +613,7 @@ impl CodeGenerator for Type { // https://github.com/rust-lang/rust/issues/26264 let simple_enum_path = match inner_rust_type.node { ast::TyKind::Path(None, ref p) => { - if applicable_template_args.is_empty() && + if used_template_params.is_none() && inner_item.expect_type() .canonical_type(ctx) .is_enum() && @@ -626,17 +637,21 @@ impl CodeGenerator for Type { typedef.use_().build(p).as_(rust_name) } else { let mut generics = typedef.type_(rust_name).generics(); - for template_arg in applicable_template_args.iter() { - let template_arg = ctx.resolve_type(*template_arg); - if template_arg.is_named() { - if template_arg.is_invalid_named_type() { - warn!("Item contained invalid template \ - parameter: {:?}", - item); - return; + if let Some(ref params) = used_template_params { + for template_param in params { + if let Some(id) = + template_param.as_named(ctx, &()) { + let template_param = ctx.resolve_type(id); + if template_param.is_invalid_named_type() { + warn!("Item contained invalid template \ + parameter: {:?}", + item); + return; + } + generics = + generics.ty_param_id(template_param.name() + .unwrap()); } - generics = - generics.ty_param_id(template_arg.name().unwrap()); } } generics.build().build_ty(inner_rust_type) @@ -646,6 +661,9 @@ impl CodeGenerator for Type { TypeKind::Enum(ref ei) => { ei.codegen(ctx, result, whitelisted_items, item) } + TypeKind::ObjCId | TypeKind::ObjCSel => { + result.saw_objc(); + } TypeKind::ObjCInterface(ref interface) => { interface.codegen(ctx, result, whitelisted_items, item) } @@ -688,17 +706,15 @@ impl<'a> CodeGenerator for Vtable<'a> { assert_eq!(item.id(), self.item_id); // For now, generate an empty struct, later we should generate function // pointers and whatnot. - let mut attributes = vec![attributes::repr("C")]; - - if ctx.options().derive_default { - attributes.push(attributes::derives(&["Default"])) - } + let attributes = vec![attributes::repr("C")]; let vtable = aster::AstBuilder::new() .item() .pub_() .with_attrs(attributes) - .struct_(self.canonical_name(ctx)) + .tuple_struct(self.canonical_name(ctx)) + .field() + .build_ty(helpers::ast_ty::raw_type(ctx, "c_void")) .build(); result.push(vtable); } @@ -710,9 +726,13 @@ impl<'a> ItemCanonicalName for Vtable<'a> { } } -impl<'a> ItemToRustTy for Vtable<'a> { - fn to_rust_ty(&self, ctx: &BindgenContext) -> P { - aster::ty::TyBuilder::new().id(self.canonical_name(ctx)) +impl<'a> TryToRustTy for Vtable<'a> { + type Extra = (); + + fn try_to_rust_ty(&self, + ctx: &BindgenContext, + _: &()) -> error::Result> { + Ok(aster::ty::TyBuilder::new().id(self.canonical_name(ctx))) } } @@ -731,11 +751,10 @@ impl<'a> Bitfield<'a> { fn codegen_fields(self, ctx: &BindgenContext, + parent: &CompInfo, fields: &mut Vec, - _methods: &mut Vec) + methods: &mut Vec) -> Layout { - use aster::struct_field::StructFieldBuilder; - // NOTE: What follows is reverse-engineered from LLVM's // lib/AST/RecordLayoutBuilder.cpp // @@ -753,29 +772,29 @@ impl<'a> Bitfield<'a> { let mut last_field_name = format!("_bitfield_{}", self.index); let mut last_field_align = 0; + // (name, mask, width, bitfield's type, bitfield's layout) + let mut bitfields: Vec<(&str, usize, usize, ast::Ty, Layout)> = vec![]; + for field in self.fields { - let width = field.bitfield().unwrap(); + let width = field.bitfield().unwrap() as usize; let field_item = ctx.resolve_item(field.ty()); let field_ty_layout = field_item.kind() .expect_type() .layout(ctx) .expect("Bitfield without layout? Gah!"); - let field_align = field_ty_layout.align; if field_size_in_bits != 0 && - (width == 0 || width as usize > unfilled_bits_in_last_unit) { + (width == 0 || width > unfilled_bits_in_last_unit) { + // We've finished a physical field, so flush it and its bitfields. field_size_in_bits = align_to(field_size_in_bits, field_align); - // Push the new field. - let ty = - BlobTyBuilder::new(Layout::new(bytes_from_bits_pow2(field_size_in_bits), - bytes_from_bits_pow2(last_field_align))) - .build(); - - let field = StructFieldBuilder::named(&last_field_name) - .pub_() - .build_ty(ty); - fields.push(field); + fields.push(flush_bitfields(ctx, + parent, + field_size_in_bits, + last_field_align, + &last_field_name, + bitfields.drain(..), + methods)); // TODO(emilio): dedup this. *self.index += 1; @@ -787,44 +806,225 @@ impl<'a> Bitfield<'a> { last_field_align = 0; } - // TODO(emilio): Create the accessors. Problem here is that we still - // don't know which one is going to be the final alignment of the - // bitfield, and whether we have to index in it. Thus, we don't know - // which integer type do we need. - // - // We could push them to a Vec or something, but given how buggy - // they where maybe it's not a great idea? - field_size_in_bits += width as usize; - total_size_in_bits += width as usize; + if let Some(name) = field.name() { + let field_item_ty = field_item.to_rust_ty_or_opaque(ctx, &()); + bitfields.push((name, + field_size_in_bits, + width, + field_item_ty.unwrap(), + field_ty_layout)); + } + field_size_in_bits += width; + total_size_in_bits += width; let data_size = align_to(field_size_in_bits, field_align * 8); max_align = cmp::max(max_align, field_align); // NB: The width here is completely, absolutely intentional. - last_field_align = cmp::max(last_field_align, width as usize); + last_field_align = cmp::max(last_field_align, width); unfilled_bits_in_last_unit = data_size - field_size_in_bits; } if field_size_in_bits != 0 { - // Push the last field. - let ty = - BlobTyBuilder::new(Layout::new(bytes_from_bits_pow2(field_size_in_bits), - bytes_from_bits_pow2(last_field_align))) - .build(); - - let field = StructFieldBuilder::named(&last_field_name) - .pub_() - .build_ty(ty); - fields.push(field); + // Flush the last physical field and its bitfields. + fields.push(flush_bitfields(ctx, + parent, + field_size_in_bits, + last_field_align, + &last_field_name, + bitfields.drain(..), + methods)); } Layout::new(bytes_from_bits(total_size_in_bits), max_align) } } +fn parent_has_method(ctx: &BindgenContext, + parent: &CompInfo, + name: &str) + -> bool { + parent.methods().iter().any(|method| { + let method_name = match *ctx.resolve_item(method.signature()).kind() { + ItemKind::Function(ref func) => func.name(), + ref otherwise => panic!("a method's signature should always be a \ + item of kind ItemKind::Function, found: \ + {:?}", + otherwise), + }; + + method_name == name || ctx.rust_mangle(&method_name) == name + }) +} + +fn bitfield_getter_name(ctx: &BindgenContext, + parent: &CompInfo, + bitfield_name: &str) + -> ast::Ident { + let name = ctx.rust_mangle(bitfield_name); + + if parent_has_method(ctx, parent, &name) { + let mut name = name.to_string(); + name.push_str("_bindgen_bitfield"); + return ctx.ext_cx().ident_of(&name); + } + + ctx.ext_cx().ident_of(&name) +} + +fn bitfield_setter_name(ctx: &BindgenContext, + parent: &CompInfo, + bitfield_name: &str) + -> ast::Ident { + let setter = format!("set_{}", bitfield_name); + let mut setter = ctx.rust_mangle(&setter).to_string(); + + if parent_has_method(ctx, parent, &setter) { + setter.push_str("_bindgen_bitfield"); + } + + ctx.ext_cx().ident_of(&setter) +} + +/// A physical field (which is a word or byte or ...) has many logical bitfields +/// contained within it, but not all bitfields are in the same physical field of +/// a struct. This function creates a single physical field and flushes all the +/// accessors for the logical `bitfields` within that physical field to the +/// outgoing `methods`. +fn flush_bitfields<'a, I>(ctx: &BindgenContext, + parent: &CompInfo, + field_size_in_bits: usize, + field_align: usize, + field_name: &str, + bitfields: I, + methods: &mut Vec) -> ast::StructField + where I: IntoIterator +{ + use aster::struct_field::StructFieldBuilder; + + let field_layout = Layout::new(bytes_from_bits_pow2(field_size_in_bits), + bytes_from_bits_pow2(field_align)); + let field_ty = BlobTyBuilder::new(field_layout).build(); + + let field = StructFieldBuilder::named(field_name) + .pub_() + .build_ty(field_ty.clone()); + + let field_int_ty = match field_layout.size { + 8 => quote_ty!(ctx.ext_cx(), u64), + 4 => quote_ty!(ctx.ext_cx(), u32), + 2 => quote_ty!(ctx.ext_cx(), u16), + 1 => quote_ty!(ctx.ext_cx(), u8), + _ => return field + }; + + for (name, offset, width, bitfield_ty, bitfield_layout) in bitfields { + let prefix = ctx.trait_prefix(); + let getter_name = bitfield_getter_name(ctx, parent, name); + let setter_name = bitfield_setter_name(ctx, parent, name); + let field_ident = ctx.ext_cx().ident_of(field_name); + + let bitfield_int_ty = BlobTyBuilder::new(bitfield_layout).build(); + + let mask: usize = ((1usize << width) - 1usize) << offset; + + let impl_item = quote_item!( + ctx.ext_cx(), + impl XxxIgnored { + #[inline] + pub fn $getter_name(&self) -> $bitfield_ty { + let mask = $mask as $field_int_ty; + let field_val: $field_int_ty = unsafe { + ::$prefix::mem::transmute(self.$field_ident) + }; + let val = (field_val & mask) >> $offset; + unsafe { + ::$prefix::mem::transmute(val as $bitfield_int_ty) + } + } + + #[inline] + pub fn $setter_name(&mut self, val: $bitfield_ty) { + let mask = $mask as $field_int_ty; + let val = val as $bitfield_int_ty as $field_int_ty; + + let mut field_val: $field_int_ty = unsafe { + ::$prefix::mem::transmute(self.$field_ident) + }; + field_val &= !mask; + field_val |= (val << $offset) & mask; + + self.$field_ident = unsafe { + ::$prefix::mem::transmute(field_val) + }; + } + } + ).unwrap(); + + match impl_item.unwrap().node { + ast::ItemKind::Impl(_, _, _, _, _, items) => { + methods.extend(items.into_iter()); + }, + _ => unreachable!(), + }; + } + + field +} + +impl CodeGenerator for TemplateInstantiation { + type Extra = Item; + + fn codegen<'a>(&self, + ctx: &BindgenContext, + result: &mut CodegenResult<'a>, + _whitelisted_items: &ItemSet, + item: &Item) { + // Although uses of instantiations don't need code generation, and are + // just converted to rust types in fields, vars, etc, we take this + // opportunity to generate tests for their layout here. + if !ctx.options().layout_tests { + return + } + + let layout = item.kind().expect_type().layout(ctx); + + if let Some(layout) = layout { + let size = layout.size; + let align = layout.align; + + let name = item.canonical_name(ctx); + let fn_name = format!("__bindgen_test_layout_{}_instantiation_{}", + name, + item.id().as_usize()); + let fn_name = ctx.rust_ident_raw(&fn_name); + + let prefix = ctx.trait_prefix(); + let ident = item.to_rust_ty_or_opaque(ctx, &()); + let size_of_expr = quote_expr!(ctx.ext_cx(), + ::$prefix::mem::size_of::<$ident>()); + let align_of_expr = quote_expr!(ctx.ext_cx(), + ::$prefix::mem::align_of::<$ident>()); + + let item = quote_item!( + ctx.ext_cx(), + #[test] + fn $fn_name() { + assert_eq!($size_of_expr, $size, + concat!("Size of template specialization: ", stringify!($ident))); + assert_eq!($align_of_expr, $align, + concat!("Alignment of template specialization: ", stringify!($ident))); + }) + .unwrap(); + + result.push(item); + } + } +} + impl CodeGenerator for CompInfo { type Extra = Item; @@ -843,53 +1043,26 @@ impl CodeGenerator for CompInfo { return; } - let applicable_template_args = item.applicable_template_args(ctx); + let used_template_params = item.used_template_params(ctx); // generate tuple struct if struct or union is a forward declaration, // skip for now if template parameters are needed. - if self.is_forward_declaration() && - applicable_template_args.is_empty() { + // + // NB: We generate a proper struct to avoid struct/function name + // collisions. + if self.is_forward_declaration() && used_template_params.is_none() { let struct_name = item.canonical_name(ctx); let struct_name = ctx.rust_ident_raw(&struct_name); let tuple_struct = quote_item!(ctx.ext_cx(), #[repr(C)] #[derive(Debug, Copy, Clone)] - pub struct $struct_name([u8; 0]); + pub struct $struct_name { _unused: [u8; 0] }; ) .unwrap(); result.push(tuple_struct); return; } - if self.is_template_specialization() { - let layout = item.kind().expect_type().layout(ctx); - - if let Some(layout) = layout { - let fn_name = format!("__bindgen_test_layout_template_{}", - result.next_id()); - let fn_name = ctx.rust_ident_raw(&fn_name); - let ident = item.to_rust_ty(ctx); - let prefix = ctx.trait_prefix(); - let size_of_expr = quote_expr!(ctx.ext_cx(), - ::$prefix::mem::size_of::<$ident>()); - let align_of_expr = quote_expr!(ctx.ext_cx(), - ::$prefix::mem::align_of::<$ident>()); - let size = layout.size; - let align = layout.align; - let item = quote_item!(ctx.ext_cx(), - #[test] - fn $fn_name() { - assert_eq!($size_of_expr, $size, - concat!("Size of template specialization: ", stringify!($ident))); - assert_eq!($align_of_expr, $align, - concat!("Alignment of template specialization: ", stringify!($ident))); - }) - .unwrap(); - result.push(item); - } - return; - } - let mut attributes = vec![]; let mut needs_clone_impl = false; let mut needs_default_impl = false; @@ -919,7 +1092,7 @@ impl CodeGenerator for CompInfo { if item.can_derive_copy(ctx, ()) && !item.annotations().disallow_copy() { derives.push("Copy"); - if !applicable_template_args.is_empty() { + if used_template_params.is_some() { // FIXME: This requires extra logic if you have a big array in a // templated struct. The reason for this is that the magic: // fn clone(&self) -> Self { *self } @@ -936,8 +1109,6 @@ impl CodeGenerator for CompInfo { attributes.push(attributes::derives(&derives)) } - let mut template_args_used = - vec![false; applicable_template_args.len()]; let canonical_name = item.canonical_name(ctx); let builder = if is_union && ctx.options().unstable_rust { aster::AstBuilder::new() @@ -972,7 +1143,9 @@ impl CodeGenerator for CompInfo { Vtable::new(item.id(), self.methods(), self.base_members()); vtable.codegen(ctx, result, whitelisted_items, item); - let vtable_type = vtable.to_rust_ty(ctx).to_ptr(true, ctx.span()); + let vtable_type = vtable.try_to_rust_ty(ctx, &()) + .expect("vtable to Rust type conversion is infallible") + .to_ptr(true, ctx.span()); let vtable_field = StructFieldBuilder::named("vtable_") .pub_() @@ -1000,14 +1173,7 @@ impl CodeGenerator for CompInfo { continue; } - for (i, ty_id) in applicable_template_args.iter().enumerate() { - let template_arg_ty = ctx.resolve_type(*ty_id); - if base_ty.signature_contains_named_type(ctx, template_arg_ty) { - template_args_used[i] = true; - } - } - - let inner = base.ty.to_rust_ty(ctx); + let inner = base.ty.to_rust_ty_or_opaque(ctx, &()); let field_name = if i == 0 { "_base".into() } else { @@ -1071,7 +1237,7 @@ impl CodeGenerator for CompInfo { mem::replace(&mut current_bitfield_fields, vec![]); let bitfield_layout = Bitfield::new(&mut bitfield_count, bitfield_fields) - .codegen_fields(ctx, &mut fields, &mut methods); + .codegen_fields(ctx, self, &mut fields, &mut methods); struct_layout.saw_bitfield_batch(bitfield_layout); current_bitfield_width = None; @@ -1088,14 +1254,7 @@ impl CodeGenerator for CompInfo { continue; } - for (i, ty_id) in applicable_template_args.iter().enumerate() { - let template_arg = ctx.resolve_type(*ty_id); - if field_ty.signature_contains_named_type(ctx, template_arg) { - template_args_used[i] = true; - } - } - - let ty = field.ty().to_rust_ty(ctx); + let ty = field.ty().to_rust_ty_or_opaque(ctx, &()); // NB: In unstable rust we use proper `union` types. let ty = if is_union && !ctx.options().unstable_rust { @@ -1104,10 +1263,11 @@ impl CodeGenerator for CompInfo { } else { quote_ty!(ctx.ext_cx(), __BindgenUnionField<$ty>) } - } else if let Some(item) = field_ty.is_incomplete_array(ctx) { + } else if let Some(item) = + field_ty.is_incomplete_array(ctx) { result.saw_incomplete_array(); - let inner = item.to_rust_ty(ctx); + let inner = item.to_rust_ty_or_opaque(ctx, &()); if ctx.options().enable_cxx_namespaces { quote_ty!(ctx.ext_cx(), root::__IncompleteArrayField<$inner>) @@ -1132,9 +1292,11 @@ impl CodeGenerator for CompInfo { } }; - if let Some(padding_field) = - struct_layout.pad_field(&field_name, field_ty, field.offset()) { - fields.push(padding_field); + if !is_union { + if let Some(padding_field) = + struct_layout.pad_field(&field_name, field_ty, field.offset()) { + fields.push(padding_field); + } } let is_private = field.annotations() @@ -1230,7 +1392,7 @@ impl CodeGenerator for CompInfo { vec![]); let bitfield_layout = Bitfield::new(&mut bitfield_count, bitfield_fields) - .codegen_fields(ctx, &mut fields, &mut methods); + .codegen_fields(ctx, self, &mut fields, &mut methods); struct_layout.saw_bitfield_batch(bitfield_layout); } debug_assert!(current_bitfield_fields.is_empty()); @@ -1251,9 +1413,6 @@ impl CodeGenerator for CompInfo { if item.is_opaque(ctx) { fields.clear(); methods.clear(); - for i in 0..template_args_used.len() { - template_args_used[i] = false; - } match layout { Some(l) => { @@ -1270,7 +1429,9 @@ impl CodeGenerator for CompInfo { } } else if !is_union && !self.is_unsized(ctx) { if let Some(padding_field) = - layout.and_then(|layout| struct_layout.pad_struct(&canonical_name, layout)) { + layout.and_then(|layout| { + struct_layout.pad_struct(&canonical_name, layout) + }) { fields.push(padding_field); } @@ -1280,46 +1441,36 @@ impl CodeGenerator for CompInfo { } } - // C requires every struct to be addressable, so what C compilers do is - // making the struct 1-byte sized. + // C++ requires every struct to be addressable, so what C++ compilers do + // is making the struct 1-byte sized. + // + // This is apparently not the case for C, see: + // https://github.com/servo/rust-bindgen/issues/551 + // + // Just get the layout, and assume C++ if not. // // NOTE: This check is conveniently here to avoid the dummy fields we // may add for unused template parameters. if self.is_unsized(ctx) { - let ty = BlobTyBuilder::new(Layout::new(1, 1)).build(); - let field = StructFieldBuilder::named("_address") - .pub_() - .build_ty(ty); - fields.push(field); - } - - // Append any extra template arguments that nobody has used so far. - for (i, ty) in applicable_template_args.iter().enumerate() { - if !template_args_used[i] { - let name = ctx.resolve_type(*ty).name().unwrap(); - let ident = ctx.rust_ident(name); - let prefix = ctx.trait_prefix(); - let phantom = quote_ty!(ctx.ext_cx(), - ::$prefix::marker::PhantomData<$ident>); - let field = StructFieldBuilder::named(format!("_phantom_{}", - i)) + let has_address = layout.map_or(true, |l| l.size != 0); + if has_address { + let ty = BlobTyBuilder::new(Layout::new(1, 1)).build(); + let field = StructFieldBuilder::named("_address") .pub_() - .build_ty(phantom); - fields.push(field) + .build_ty(ty); + fields.push(field); } } - let mut generics = aster::AstBuilder::new().generics(); - for template_arg in applicable_template_args.iter() { - // Take into account that here only arrive named types, not - // template specialisations that would need to be - // instantiated. - // - // TODO: Add template args from the parent, here and in - // `to_rust_ty`!! - let template_arg = ctx.resolve_type(*template_arg); - generics = generics.ty_param_id(template_arg.name().unwrap()); + + if let Some(ref params) = used_template_params { + for ty in params.iter() { + let param = ctx.resolve_type(*ty); + let name = param.name().unwrap(); + let ident = ctx.rust_ident(name); + generics = generics.ty_param_id(ident); + } } let generics = generics.build(); @@ -1347,82 +1498,84 @@ impl CodeGenerator for CompInfo { canonical_name); } - if applicable_template_args.is_empty() { + if used_template_params.is_none() { for var in self.inner_vars() { ctx.resolve_item(*var) .codegen(ctx, result, whitelisted_items, &()); } - if let Some(layout) = layout { - let fn_name = format!("bindgen_test_layout_{}", canonical_name); - let fn_name = ctx.rust_ident_raw(&fn_name); - let type_name = ctx.rust_ident_raw(&canonical_name); - let prefix = ctx.trait_prefix(); - let size_of_expr = quote_expr!(ctx.ext_cx(), - ::$prefix::mem::size_of::<$type_name>()); - let align_of_expr = quote_expr!(ctx.ext_cx(), - ::$prefix::mem::align_of::<$type_name>()); - let size = layout.size; - let align = layout.align; + if ctx.options().layout_tests { + if let Some(layout) = layout { + let fn_name = format!("bindgen_test_layout_{}", canonical_name); + let fn_name = ctx.rust_ident_raw(&fn_name); + let type_name = ctx.rust_ident_raw(&canonical_name); + let prefix = ctx.trait_prefix(); + let size_of_expr = quote_expr!(ctx.ext_cx(), + ::$prefix::mem::size_of::<$type_name>()); + let align_of_expr = quote_expr!(ctx.ext_cx(), + ::$prefix::mem::align_of::<$type_name>()); + let size = layout.size; + let align = layout.align; - let check_struct_align = if align > mem::size_of::<*mut ()>() { - // FIXME when [RFC 1358](https://github.com/rust-lang/rust/issues/33626) ready - None - } else { - quote_item!(ctx.ext_cx(), - assert_eq!($align_of_expr, - $align, - concat!("Alignment of ", stringify!($type_name))); - ) - }; + let check_struct_align = if align > mem::size_of::<*mut ()>() { + // FIXME when [RFC 1358](https://github.com/rust-lang/rust/issues/33626) ready + None + } else { + quote_item!(ctx.ext_cx(), + assert_eq!($align_of_expr, + $align, + concat!("Alignment of ", stringify!($type_name))); + ) + }; - // FIXME when [issue #465](https://github.com/servo/rust-bindgen/issues/465) ready - let too_many_base_vtables = self.base_members() - .iter() - .filter(|base| { - ctx.resolve_type(base.ty).has_vtable(ctx) - }) - .count() > 1; - - let should_skip_field_offset_checks = item.is_opaque(ctx) || - too_many_base_vtables; - - let check_field_offset = if should_skip_field_offset_checks { - None - } else { - let asserts = self.fields() - .iter() - .filter(|field| field.bitfield().is_none()) - .flat_map(|field| { - field.name().and_then(|name| { - field.offset().and_then(|offset| { - let field_offset = offset / 8; - let field_name = ctx.rust_ident(name); - - quote_item!(ctx.ext_cx(), - assert_eq!(unsafe { &(*(0 as *const $type_name)).$field_name as *const _ as usize }, - $field_offset, - concat!("Alignment of field: ", stringify!($type_name), "::", stringify!($field_name))); - ) - }) + // FIXME when [issue #465](https://github.com/servo/rust-bindgen/issues/465) ready + let too_many_base_vtables = self.base_members() + .iter() + .filter(|base| { + ctx.resolve_type(base.ty).has_vtable(ctx) }) - }).collect::>>(); + .count() > 1; - Some(asserts) - }; + let should_skip_field_offset_checks = item.is_opaque(ctx) || + too_many_base_vtables; - let item = quote_item!(ctx.ext_cx(), - #[test] - fn $fn_name() { - assert_eq!($size_of_expr, - $size, - concat!("Size of: ", stringify!($type_name))); + let check_field_offset = if should_skip_field_offset_checks { + None + } else { + let asserts = self.fields() + .iter() + .filter(|field| field.bitfield().is_none()) + .flat_map(|field| { + field.name().and_then(|name| { + field.offset().and_then(|offset| { + let field_offset = offset / 8; + let field_name = ctx.rust_ident(name); - $check_struct_align - $check_field_offset - }) - .unwrap(); - result.push(item); + quote_item!(ctx.ext_cx(), + assert_eq!(unsafe { &(*(0 as *const $type_name)).$field_name as *const _ as usize }, + $field_offset, + concat!("Alignment of field: ", stringify!($type_name), "::", stringify!($field_name))); + ) + }) + }) + }).collect::>>(); + + Some(asserts) + }; + + let item = quote_item!(ctx.ext_cx(), + #[test] + fn $fn_name() { + assert_eq!($size_of_expr, + $size, + concat!("Size of: ", stringify!($type_name))); + + $check_struct_align + $check_field_offset + }) + .unwrap(); + result.push(item); + } } let mut method_names = Default::default(); @@ -1452,6 +1605,24 @@ impl CodeGenerator for CompInfo { self); } } + + if ctx.options().codegen_config.destructors { + if let Some((is_virtual, destructor)) = self.destructor() { + let kind = if is_virtual { + MethodKind::VirtualDestructor + } else { + MethodKind::Destructor + }; + + Method::new(kind, destructor, false) + .codegen_method(ctx, + &mut methods, + &mut method_names, + result, + whitelisted_items, + self); + } + } } // NB: We can't use to_rust_ty here since for opaque types this tries to @@ -1548,6 +1719,7 @@ impl MethodCodegen for Method { if self.is_virtual() { return; // FIXME } + // First of all, output the actual function. let function_item = ctx.resolve_item(self.signature()); function_item.codegen(ctx, result, whitelisted_items, &()); @@ -1556,6 +1728,7 @@ impl MethodCodegen for Method { let signature_item = ctx.resolve_item(function.signature()); let mut name = match self.kind() { MethodKind::Constructor => "new".into(), + MethodKind::Destructor => "destruct".into(), _ => function.name().to_owned(), }; @@ -1656,11 +1829,7 @@ impl MethodCodegen for Method { exprs[0] = quote_expr!(ctx.ext_cx(), &mut __bindgen_tmp); } else if !self.is_static() { assert!(!exprs.is_empty()); - exprs[0] = if self.is_const() { - quote_expr!(ctx.ext_cx(), &*self) - } else { - quote_expr!(ctx.ext_cx(), &mut *self) - }; + exprs[0] = quote_expr!(ctx.ext_cx(), self); }; let call = aster::expr::ExprBuilder::new() @@ -1968,7 +2137,7 @@ impl CodeGenerator for Enum { } let repr = self.repr() - .map(|repr| repr.to_rust_ty(ctx)) + .and_then(|repr| repr.try_to_rust_ty_or_opaque(ctx, &()).ok()) .unwrap_or_else(|| helpers::ast_ty::raw_type(ctx, repr_name)); let mut builder = EnumBuilder::new(builder, @@ -1979,7 +2148,7 @@ impl CodeGenerator for Enum { // A map where we keep a value -> variant relation. let mut seen_values = HashMap::<_, String>::new(); - let enum_rust_ty = item.to_rust_ty(ctx); + let enum_rust_ty = item.to_rust_ty_or_opaque(ctx, &()); let is_toplevel = item.is_toplevel(ctx); // Used to mangle the constants we generate in the unnamed-enum case. @@ -1989,10 +2158,14 @@ impl CodeGenerator for Enum { Some(item.parent_id().canonical_name(ctx)) }; - let constant_mangling_prefix = if enum_ty.name().is_none() { - parent_canonical_name.as_ref().map(|n| &*n) + let constant_mangling_prefix = if ctx.options().prepend_enum_name { + if enum_ty.name().is_none() { + parent_canonical_name.as_ref().map(|n| &*n) + } else { + Some(&name) + } } else { - Some(&name) + None }; // NB: We defer the creation of constified variants, in case we find @@ -2086,196 +2259,363 @@ impl CodeGenerator for Enum { } } -trait ToRustTy { +/// Fallible conversion to an opaque blob. +/// +/// Implementors of this trait should provide the `try_get_layout` method to +/// fallibly get this thing's layout, which the provided `try_to_opaque` trait +/// method will use to convert the `Layout` into an opaque blob Rust type. +trait TryToOpaque { type Extra; - fn to_rust_ty(&self, + /// Get the layout for this thing, if one is available. + fn try_get_layout(&self, + ctx: &BindgenContext, + extra: &Self::Extra) + -> error::Result; + + /// Do not override this provided trait method. + fn try_to_opaque(&self, + ctx: &BindgenContext, + extra: &Self::Extra) + -> error::Result> { + self.try_get_layout(ctx, extra) + .map(|layout| BlobTyBuilder::new(layout).build()) + } +} + +/// Infallible conversion of an IR thing to an opaque blob. +/// +/// The resulting layout is best effort, and is unfortunately not guaranteed to +/// be correct. When all else fails, we fall back to a single byte layout as a +/// last resort, because C++ does not permit zero-sized types. See the note in +/// the `ToRustTyOrOpaque` doc comment about fallible versus infallible traits +/// and when each is appropriate. +/// +/// Don't implement this directly. Instead implement `TryToOpaque`, and then +/// leverage the blanket impl for this trait. +trait ToOpaque: TryToOpaque { + fn get_layout(&self, ctx: &BindgenContext, extra: &Self::Extra) - -> P; -} + -> Layout { + self.try_get_layout(ctx, extra) + .unwrap_or_else(|_| Layout::for_size(1)) + } -trait ItemToRustTy { - fn to_rust_ty(&self, ctx: &BindgenContext) -> P; -} - -// Convenience implementation. -impl ItemToRustTy for ItemId { - fn to_rust_ty(&self, ctx: &BindgenContext) -> P { - ctx.resolve_item(*self).to_rust_ty(ctx) + fn to_opaque(&self, + ctx: &BindgenContext, + extra: &Self::Extra) + -> P { + let layout = self.get_layout(ctx, extra); + BlobTyBuilder::new(layout).build() } } -impl ItemToRustTy for Item { - fn to_rust_ty(&self, ctx: &BindgenContext) -> P { - self.kind().expect_type().to_rust_ty(ctx, self) +impl ToOpaque for T + where T: TryToOpaque +{} + +/// Fallible conversion from an IR thing to an *equivalent* Rust type. +/// +/// If the C/C++ construct represented by the IR thing cannot (currently) be +/// represented in Rust (for example, instantiations of templates with +/// const-value generic parameters) then the impl should return an `Err`. It +/// should *not* attempt to return an opaque blob with the correct size and +/// alignment. That is the responsibility of the `TryToOpaque` trait. +trait TryToRustTy { + type Extra; + + fn try_to_rust_ty(&self, + ctx: &BindgenContext, + extra: &Self::Extra) + -> error::Result>; +} + +/// Fallible conversion to a Rust type or an opaque blob with the correct size +/// and alignment. +/// +/// Don't implement this directly. Instead implement `TryToRustTy` and +/// `TryToOpaque`, and then leverage the blanket impl for this trait below. +trait TryToRustTyOrOpaque: TryToRustTy + TryToOpaque { + type Extra; + + fn try_to_rust_ty_or_opaque(&self, + ctx: &BindgenContext, + extra: &::Extra) + -> error::Result>; +} + +impl TryToRustTyOrOpaque for T + where T: TryToRustTy + TryToOpaque +{ + type Extra = E; + + fn try_to_rust_ty_or_opaque(&self, + ctx: &BindgenContext, + extra: &E) + -> error::Result> { + self.try_to_rust_ty(ctx, extra) + .or_else(|_| { + if let Ok(layout) = self.try_get_layout(ctx, extra) { + Ok(BlobTyBuilder::new(layout).build()) + } else { + Err(error::Error::NoLayoutForOpaqueBlob) + } + }) } } -impl ToRustTy for Type { +/// Infallible conversion to a Rust type, or an opaque blob with a best effort +/// of correct size and alignment. +/// +/// Don't implement this directly. Instead implement `TryToRustTy` and +/// `TryToOpaque`, and then leverage the blanket impl for this trait below. +/// +/// ### Fallible vs. Infallible Conversions to Rust Types +/// +/// When should one use this infallible `ToRustTyOrOpaque` trait versus the +/// fallible `TryTo{RustTy, Opaque, RustTyOrOpaque}` triats? All fallible trait +/// implementations that need to convert another thing into a Rust type or +/// opaque blob in a nested manner should also use fallible trait methods and +/// propagate failure up the stack. Only infallible functions and methods like +/// CodeGenerator implementations should use the infallible +/// `ToRustTyOrOpaque`. The further out we push error recovery, the more likely +/// we are to get a usable `Layout` even if we can't generate an equivalent Rust +/// type for a C++ construct. +trait ToRustTyOrOpaque: TryToRustTy + ToOpaque { + type Extra; + + fn to_rust_ty_or_opaque(&self, + ctx: &BindgenContext, + extra: &::Extra) + -> P; +} + +impl ToRustTyOrOpaque for T + where T: TryToRustTy + ToOpaque +{ + type Extra = E; + + fn to_rust_ty_or_opaque(&self, + ctx: &BindgenContext, + extra: &E) + -> P { + self.try_to_rust_ty(ctx, extra) + .unwrap_or_else(|_| self.to_opaque(ctx, extra)) + } +} + +impl TryToOpaque for ItemId { + type Extra = (); + + fn try_get_layout(&self, + ctx: &BindgenContext, + _: &()) + -> error::Result { + ctx.resolve_item(*self).try_get_layout(ctx, &()) + } +} + +impl TryToRustTy for ItemId { + type Extra = (); + + fn try_to_rust_ty(&self, + ctx: &BindgenContext, + _: &()) + -> error::Result> { + ctx.resolve_item(*self).try_to_rust_ty(ctx, &()) + } +} + +impl TryToOpaque for Item { + type Extra = (); + + fn try_get_layout(&self, + ctx: &BindgenContext, + _: &()) + -> error::Result { + self.kind().expect_type().try_get_layout(ctx, self) + } +} + +impl TryToRustTy for Item { + type Extra = (); + + fn try_to_rust_ty(&self, + ctx: &BindgenContext, + _: &()) + -> error::Result> { + self.kind().expect_type().try_to_rust_ty(ctx, self) + } +} + +impl TryToOpaque for Type { type Extra = Item; - fn to_rust_ty(&self, ctx: &BindgenContext, item: &Item) -> P { + fn try_get_layout(&self, + ctx: &BindgenContext, + _: &Item) + -> error::Result { + self.layout(ctx).ok_or(error::Error::NoLayoutForOpaqueBlob) + } +} + +impl TryToRustTy for Type { + type Extra = Item; + + fn try_to_rust_ty(&self, + ctx: &BindgenContext, + item: &Item) + -> error::Result> { use self::helpers::ast_ty::*; match *self.kind() { - TypeKind::Void => raw_type(ctx, "c_void"), + TypeKind::Void => Ok(raw_type(ctx, "c_void")), // TODO: we should do something smart with nullptr, or maybe *const // c_void is enough? TypeKind::NullPtr => { - raw_type(ctx, "c_void").to_ptr(true, ctx.span()) + Ok(raw_type(ctx, "c_void").to_ptr(true, ctx.span())) } TypeKind::Int(ik) => { match ik { - IntKind::Bool => aster::ty::TyBuilder::new().bool(), - IntKind::Char => raw_type(ctx, "c_char"), - IntKind::UChar => raw_type(ctx, "c_uchar"), - IntKind::Short => raw_type(ctx, "c_short"), - IntKind::UShort => raw_type(ctx, "c_ushort"), - IntKind::Int => raw_type(ctx, "c_int"), - IntKind::UInt => raw_type(ctx, "c_uint"), - IntKind::Long => raw_type(ctx, "c_long"), - IntKind::ULong => raw_type(ctx, "c_ulong"), - IntKind::LongLong => raw_type(ctx, "c_longlong"), - IntKind::ULongLong => raw_type(ctx, "c_ulonglong"), + IntKind::Bool => Ok(aster::ty::TyBuilder::new().bool()), + IntKind::Char { .. } => Ok(raw_type(ctx, "c_char")), + IntKind::SChar => Ok(raw_type(ctx, "c_schar")), + IntKind::UChar => Ok(raw_type(ctx, "c_uchar")), + IntKind::Short => Ok(raw_type(ctx, "c_short")), + IntKind::UShort => Ok(raw_type(ctx, "c_ushort")), + IntKind::Int => Ok(raw_type(ctx, "c_int")), + IntKind::UInt => Ok(raw_type(ctx, "c_uint")), + IntKind::Long => Ok(raw_type(ctx, "c_long")), + IntKind::ULong => Ok(raw_type(ctx, "c_ulong")), + IntKind::LongLong => Ok(raw_type(ctx, "c_longlong")), + IntKind::ULongLong => Ok(raw_type(ctx, "c_ulonglong")), - IntKind::I8 => aster::ty::TyBuilder::new().i8(), - IntKind::U8 => aster::ty::TyBuilder::new().u8(), - IntKind::I16 => aster::ty::TyBuilder::new().i16(), - IntKind::U16 => aster::ty::TyBuilder::new().u16(), - IntKind::I32 => aster::ty::TyBuilder::new().i32(), - IntKind::U32 => aster::ty::TyBuilder::new().u32(), - IntKind::I64 => aster::ty::TyBuilder::new().i64(), - IntKind::U64 => aster::ty::TyBuilder::new().u64(), + IntKind::I8 => Ok(aster::ty::TyBuilder::new().i8()), + IntKind::U8 => Ok(aster::ty::TyBuilder::new().u8()), + IntKind::I16 => Ok(aster::ty::TyBuilder::new().i16()), + IntKind::U16 => Ok(aster::ty::TyBuilder::new().u16()), + IntKind::I32 => Ok(aster::ty::TyBuilder::new().i32()), + IntKind::U32 => Ok(aster::ty::TyBuilder::new().u32()), + IntKind::I64 => Ok(aster::ty::TyBuilder::new().i64()), + IntKind::U64 => Ok(aster::ty::TyBuilder::new().u64()), IntKind::Custom { name, .. } => { let ident = ctx.rust_ident_raw(name); - quote_ty!(ctx.ext_cx(), $ident) + Ok(quote_ty!(ctx.ext_cx(), $ident)) } // FIXME: This doesn't generate the proper alignment, but we // can't do better right now. We should be able to use // i128/u128 when they're available. IntKind::U128 | IntKind::I128 => { - aster::ty::TyBuilder::new().array(2).u64() + Ok(aster::ty::TyBuilder::new().array(2).u64()) } } } - TypeKind::Float(fk) => float_kind_rust_type(ctx, fk), + TypeKind::Float(fk) => Ok(float_kind_rust_type(ctx, fk)), TypeKind::Complex(fk) => { let float_path = float_kind_rust_type(ctx, fk); ctx.generated_bindegen_complex(); - if ctx.options().enable_cxx_namespaces { + Ok(if ctx.options().enable_cxx_namespaces { quote_ty!(ctx.ext_cx(), root::__BindgenComplex<$float_path>) } else { quote_ty!(ctx.ext_cx(), __BindgenComplex<$float_path>) - } + }) } TypeKind::Function(ref fs) => { - let ty = fs.to_rust_ty(ctx, item); + // We can't rely on the sizeof(Option>) == + // sizeof(NonZero<_>) optimization with opaque blobs (because + // they aren't NonZero), so don't *ever* use an or_opaque + // variant here. + let ty = fs.try_to_rust_ty(ctx, &())?; + let prefix = ctx.trait_prefix(); - quote_ty!(ctx.ext_cx(), ::$prefix::option::Option<$ty>) + Ok(quote_ty!(ctx.ext_cx(), ::$prefix::option::Option<$ty>)) } TypeKind::Array(item, len) => { - let ty = item.to_rust_ty(ctx); - aster::ty::TyBuilder::new().array(len).build(ty) + let ty = item.try_to_rust_ty(ctx, &())?; + Ok(aster::ty::TyBuilder::new().array(len).build(ty)) } TypeKind::Enum(..) => { let path = item.namespace_aware_canonical_path(ctx); - aster::AstBuilder::new().ty().path().ids(path).build() + Ok(aster::AstBuilder::new() + .ty() + .path() + .ids(path) + .build()) } - TypeKind::TemplateInstantiation(inner, ref template_args) => { - // PS: Sorry for the duplication here. - let mut inner_ty = inner.to_rust_ty(ctx).unwrap(); - - if let ast::TyKind::Path(_, ref mut path) = inner_ty.node { - let template_args = template_args.iter() - .map(|arg| arg.to_rust_ty(ctx)) - .collect::>(); - - path.segments.last_mut().unwrap().parameters = if - template_args.is_empty() { - None - } else { - Some(P(ast::PathParameters::AngleBracketed( - ast::AngleBracketedParameterData { - lifetimes: vec![], - types: P::from_vec(template_args), - bindings: P::from_vec(vec![]), - } - ))) - } - } - - P(inner_ty) + TypeKind::TemplateInstantiation(ref inst) => { + inst.try_to_rust_ty(ctx, self) } - TypeKind::ResolvedTypeRef(inner) => inner.to_rust_ty(ctx), + TypeKind::ResolvedTypeRef(inner) => inner.try_to_rust_ty(ctx, &()), TypeKind::TemplateAlias(inner, _) | TypeKind::Alias(inner) => { - let applicable_named_args = item.applicable_template_args(ctx) + let template_params = item.used_template_params(ctx) + .unwrap_or(vec![]) .into_iter() - .filter(|arg| ctx.resolve_type(*arg).is_named()) + .filter(|param| param.is_named(ctx, &())) .collect::>(); let spelling = self.name().expect("Unnamed alias?"); - if item.is_opaque(ctx) && !applicable_named_args.is_empty() { - // Pray if there's no available layout. - let layout = self.layout(ctx).unwrap_or_else(Layout::zero); - BlobTyBuilder::new(layout).build() + if item.is_opaque(ctx) && !template_params.is_empty() { + self.try_to_opaque(ctx, item) } else if let Some(ty) = utils::type_from_named(ctx, spelling, inner) { - ty + Ok(ty) } else { - utils::build_templated_path(item, - ctx, - applicable_named_args) + utils::build_templated_path(item, ctx, template_params) } } TypeKind::Comp(ref info) => { - let template_args = item.applicable_template_args(ctx); + let template_params = item.used_template_params(ctx); if info.has_non_type_template_params() || - (item.is_opaque(ctx) && !template_args.is_empty()) { - return match self.layout(ctx) { - Some(layout) => BlobTyBuilder::new(layout).build(), - None => { - warn!("Couldn't compute layout for a type with non \ - type template params or opaque, expect \ - dragons!"); - aster::AstBuilder::new().ty().unit() - } - }; + (item.is_opaque(ctx) && template_params.is_some()) { + return self.try_to_opaque(ctx, item); } - utils::build_templated_path(item, ctx, template_args) + let template_params = template_params.unwrap_or(vec![]); + utils::build_templated_path(item, + ctx, + template_params) + } + TypeKind::Opaque => { + self.try_to_opaque(ctx, item) } TypeKind::BlockPointer => { let void = raw_type(ctx, "c_void"); - void.to_ptr(/* is_const = */ - false, - ctx.span()) + Ok(void.to_ptr(/* is_const = */ + false, + ctx.span())) } TypeKind::Pointer(inner) | TypeKind::Reference(inner) => { let inner = ctx.resolve_item(inner); let inner_ty = inner.expect_type(); - let ty = inner.to_rust_ty(ctx); + + // Regardless if we can properly represent the inner type, we + // should always generate a proper pointer here, so use + // infallible conversion of the inner type. + let ty = inner.to_rust_ty_or_opaque(ctx, &()); // Avoid the first function pointer level, since it's already // represented in Rust. if inner_ty.canonical_type(ctx).is_function() { - ty + Ok(ty) } else { let is_const = self.is_const() || inner.expect_type().is_const(); - ty.to_ptr(is_const, ctx.span()) + Ok(ty.to_ptr(is_const, ctx.span())) } } TypeKind::Named => { let name = item.canonical_name(ctx); let ident = ctx.rust_ident(&name); - quote_ty!(ctx.ext_cx(), $ident) + Ok(quote_ty!(ctx.ext_cx(), $ident)) } - TypeKind::ObjCInterface(..) => quote_ty!(ctx.ext_cx(), id), + TypeKind::ObjCSel => Ok(quote_ty!(ctx.ext_cx(), objc::runtime::Sel)), + TypeKind::ObjCId | + TypeKind::ObjCInterface(..) => Ok(quote_ty!(ctx.ext_cx(), id)), ref u @ TypeKind::UnresolvedTypeRef(..) => { unreachable!("Should have been resolved after parsing {:?}!", u) } @@ -2283,10 +2623,84 @@ impl ToRustTy for Type { } } -impl ToRustTy for FunctionSig { - type Extra = Item; +impl TryToOpaque for TemplateInstantiation { + type Extra = Type; - fn to_rust_ty(&self, ctx: &BindgenContext, _item: &Item) -> P { + fn try_get_layout(&self, + ctx: &BindgenContext, + self_ty: &Type) + -> error::Result { + self_ty.layout(ctx).ok_or(error::Error::NoLayoutForOpaqueBlob) + } +} + +impl TryToRustTy for TemplateInstantiation { + type Extra = Type; + + fn try_to_rust_ty(&self, + ctx: &BindgenContext, + _: &Type) + -> error::Result> { + let decl = self.template_definition(); + let mut ty = decl.try_to_rust_ty(ctx, &())?.unwrap(); + + let decl_params = match decl.self_template_params(ctx) { + Some(params) => params, + None => { + // This can happen if we generated an opaque type for a partial + // template specialization, and we've hit an instantiation of + // that partial specialization. + extra_assert!(decl.into_resolver() + .through_type_refs() + .resolve(ctx) + .is_opaque(ctx)); + return Err(error::Error::InstantiationOfOpaqueType); + } + }; + + // TODO: If the decl type is a template class/struct + // declaration's member template declaration, it could rely on + // generic template parameters from its outer template + // class/struct. When we emit bindings for it, it could require + // *more* type arguments than we have here, and we will need to + // reconstruct them somehow. We don't have any means of doing + // that reconstruction at this time. + + if let ast::TyKind::Path(_, ref mut path) = ty.node { + let template_args = self.template_arguments() + .iter() + .zip(decl_params.iter()) + // Only pass type arguments for the type parameters that + // the decl uses. + .filter(|&(_, param)| ctx.uses_template_parameter(decl, *param)) + .map(|(arg, _)| arg.try_to_rust_ty(ctx, &())) + .collect::>>()?; + + path.segments.last_mut().unwrap().parameters = if + template_args.is_empty() { + None + } else { + Some(P(ast::PathParameters::AngleBracketed( + ast::AngleBracketedParameterData { + lifetimes: vec![], + types: template_args, + bindings: vec![], + } + ))) + } + } + + Ok(P(ty)) + } +} + +impl TryToRustTy for FunctionSig { + type Extra = (); + + fn try_to_rust_ty(&self, + ctx: &BindgenContext, + _: &()) + -> error::Result> { // TODO: we might want to consider ignoring the reference return value. let ret = utils::fnsig_return_ty(ctx, &self); let arguments = utils::fnsig_arguments(ctx, &self); @@ -2304,11 +2718,11 @@ impl ToRustTy for FunctionSig { decl: decl, })); - P(ast::Ty { + Ok(P(ast::Ty { id: ast::DUMMY_NODE_ID, node: fnty, span: ctx.span(), - }) + })) } } @@ -2388,8 +2802,95 @@ impl CodeGenerator for Function { } } + +fn objc_method_codegen(ctx: &BindgenContext, + method: &ObjCMethod, + class_name: Option<&str>, + prefix: &str) + -> (ast::ImplItem, ast::TraitItem) { + let signature = method.signature(); + let fn_args = utils::fnsig_arguments(ctx, signature); + let fn_ret = utils::fnsig_return_ty(ctx, signature); + + let sig = if method.is_class_method() { + aster::AstBuilder::new() + .method_sig() + .unsafe_() + .fn_decl() + .with_args(fn_args.clone()) + .build(fn_ret) + } else { + aster::AstBuilder::new() + .method_sig() + .unsafe_() + .fn_decl() + .self_() + .build(ast::SelfKind::Value(ast::Mutability::Immutable)) + .with_args(fn_args.clone()) + .build(fn_ret) + }; + + // Collect the actual used argument names + let arg_names: Vec<_> = fn_args.iter() + .map(|ref arg| match arg.pat.node { + ast::PatKind::Ident(_, ref spanning, _) => { + spanning.node.name.as_str().to_string() + } + _ => { + panic!("odd argument!"); + } + }) + .collect(); + + let methods_and_args = + ctx.rust_ident(&method.format_method_call(&arg_names)); + + let body = if method.is_class_method() { + let class_name = + class_name.expect("Generating a class method without class name?") + .to_owned(); + let expect_msg = format!("Couldn't find {}", class_name); + quote_stmt!(ctx.ext_cx(), + msg_send![objc::runtime::Class::get($class_name).expect($expect_msg), $methods_and_args]) + .unwrap() + } else { + quote_stmt!(ctx.ext_cx(), msg_send![self, $methods_and_args]).unwrap() + }; + let block = ast::Block { + stmts: vec![body], + id: ast::DUMMY_NODE_ID, + rules: ast::BlockCheckMode::Default, + span: ctx.span(), + }; + + let attrs = vec![]; + + let method_name = format!("{}{}", prefix, method.rust_name()); + + let impl_item = ast::ImplItem { + id: ast::DUMMY_NODE_ID, + ident: ctx.rust_ident(&method_name), + vis: ast::Visibility::Inherited, // Public, + attrs: attrs.clone(), + node: ast::ImplItemKind::Method(sig.clone(), P(block)), + defaultness: ast::Defaultness::Final, + span: ctx.span(), + }; + + let trait_item = ast::TraitItem { + id: ast::DUMMY_NODE_ID, + ident: ctx.rust_ident(&method_name), + attrs: attrs, + node: ast::TraitItemKind::Method(sig, None), + span: ctx.span(), + }; + + (impl_item, trait_item) +} + impl CodeGenerator for ObjCInterface { type Extra = Item; + fn codegen<'a>(&self, ctx: &BindgenContext, result: &mut CodegenResult<'a>, @@ -2399,71 +2900,34 @@ impl CodeGenerator for ObjCInterface { let mut trait_items = vec![]; for method in self.methods() { - let signature = method.signature(); - let fn_args = utils::fnsig_arguments(ctx, signature); - let fn_ret = utils::fnsig_return_ty(ctx, signature); - let sig = aster::AstBuilder::new() - .method_sig() - .unsafe_() - .fn_decl() - .self_() - .build(ast::SelfKind::Value(ast::Mutability::Immutable)) - .with_args(fn_args.clone()) - .build(fn_ret); - - // Collect the actual used argument names - let arg_names: Vec<_> = fn_args.iter() - .map(|ref arg| match arg.pat.node { - ast::PatKind::Ident(_, ref spanning, _) => { - spanning.node.name.as_str().to_string() - } - _ => { - panic!("odd argument!"); - } - }) - .collect(); - - let methods_and_args = - ctx.rust_ident(&method.format_method_call(&arg_names)); - let body = quote_stmt!(ctx.ext_cx(), - msg_send![self, $methods_and_args]) - .unwrap(); - let block = ast::Block { - stmts: vec![body], - id: ast::DUMMY_NODE_ID, - rules: ast::BlockCheckMode::Default, - span: ctx.span(), - }; - - let attrs = vec![]; - - let impl_item = ast::ImplItem { - id: ast::DUMMY_NODE_ID, - ident: ctx.rust_ident(method.rust_name()), - vis: ast::Visibility::Inherited, // Public, - attrs: attrs.clone(), - node: ast::ImplItemKind::Method(sig.clone(), P(block)), - defaultness: ast::Defaultness::Final, - span: ctx.span(), - }; - - let trait_item = ast::TraitItem { - id: ast::DUMMY_NODE_ID, - ident: ctx.rust_ident(method.rust_name()), - attrs: attrs, - node: ast::TraitItemKind::Method(sig, None), - span: ctx.span(), - }; - + let (impl_item, trait_item) = + objc_method_codegen(ctx, method, None, ""); impl_items.push(impl_item); trait_items.push(trait_item) } + let instance_method_names : Vec<_> = self.methods().iter().map( { |m| m.rust_name() } ).collect(); + + for class_method in self.class_methods() { + + let ambiquity = instance_method_names.contains(&class_method.rust_name()); + let prefix = if ambiquity { + "class_" + } else { + "" + }; + let (impl_item, trait_item) = + objc_method_codegen(ctx, class_method, Some(self.name()), prefix); + impl_items.push(impl_item); + trait_items.push(trait_item) + } + + let trait_name = self.rust_name(); let trait_block = aster::AstBuilder::new() .item() .pub_() - .trait_(self.name()) + .trait_(&trait_name) .with_items(trait_items) .build(); @@ -2472,7 +2936,7 @@ impl CodeGenerator for ObjCInterface { .item() .impl_() .trait_() - .id(self.name()) + .id(&trait_name) .build() .with_items(impl_items) .build_ty(ty_for_impl); @@ -2502,7 +2966,7 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { } if let Some(path) = context.options().emit_ir_graphviz.as_ref() { - match context.emit_ir_graphviz(path.clone()) { + match dot::write_dot_file(context, path) { Ok(()) => info!("Your dot file was generated successfully into: {}", path), Err(e) => error!("{}", e), } @@ -2516,7 +2980,7 @@ pub fn codegen(context: &mut BindgenContext) -> Vec> { } mod utils { - use super::ItemToRustTy; + use super::{error, TryToRustTy, ToRustTyOrOpaque}; use aster; use ir::context::{BindgenContext, ItemId}; use ir::function::FunctionSig; @@ -2530,13 +2994,13 @@ mod utils { result: &mut Vec>) { let use_objc = if ctx.options().objc_extern_crate { quote_item!(ctx.ext_cx(), - use objc; + #[macro_use] + extern crate objc; ) .unwrap() } else { quote_item!(ctx.ext_cx(), - #[macro_use] - extern crate objc; + use objc; ) .unwrap() }; @@ -2728,21 +3192,21 @@ mod utils { pub fn build_templated_path(item: &Item, ctx: &BindgenContext, - template_args: Vec) - -> P { + template_params: Vec) + -> error::Result> { let path = item.namespace_aware_canonical_path(ctx); let builder = aster::AstBuilder::new().ty().path(); - let template_args = template_args.iter() - .map(|arg| arg.to_rust_ty(ctx)) - .collect::>(); + let template_params = template_params.iter() + .map(|param| param.try_to_rust_ty(ctx, &())) + .collect::>>()?; // XXX: I suck at aster. if path.len() == 1 { - return builder.segment(&path[0]) - .with_tys(template_args) - .build() - .build(); + return Ok(builder.segment(&path[0]) + .with_tys(template_params) + .build() + .build()); } let mut builder = builder.id(&path[0]); @@ -2751,14 +3215,14 @@ mod utils { builder = if i == path.len() - 2 { // XXX Extra clone courtesy of the borrow checker. builder.segment(&segment) - .with_tys(template_args.clone()) + .with_tys(template_params.clone()) .build() } else { builder.segment(&segment).build() } } - builder.build() + Ok(builder.build()) } fn primitive_ty(ctx: &BindgenContext, name: &str) -> P { @@ -2784,7 +3248,9 @@ mod utils { "uintptr_t" | "size_t" => primitive_ty(ctx, "usize"), - "intptr_t" | "ptrdiff_t" | "ssize_t" => primitive_ty(ctx, "isize"), + "intptr_t" | "ptrdiff_t" | "ssize_t" => { + primitive_ty(ctx, "isize") + } _ => return None, }) } @@ -2792,15 +3258,14 @@ mod utils { pub fn rust_fndecl_from_signature(ctx: &BindgenContext, sig: &Item) -> P { - use codegen::ToRustTy; - let signature = sig.kind().expect_type().canonical_type(ctx); let signature = match *signature.kind() { TypeKind::Function(ref sig) => sig, _ => panic!("How?"), }; - let decl_ty = signature.to_rust_ty(ctx, sig); + let decl_ty = signature.try_to_rust_ty(ctx, &()) + .expect("function signature to Rust type conversion is infallible"); match decl_ty.unwrap().node { ast::TyKind::BareFn(bare_fn) => bare_fn.unwrap().decl, _ => panic!("How did this happen exactly?"), @@ -2814,7 +3279,7 @@ mod utils { if let TypeKind::Void = *return_item.kind().expect_type().kind() { ast::FunctionRetTy::Default(ctx.span()) } else { - ast::FunctionRetTy::Ty(return_item.to_rust_ty(ctx)) + ast::FunctionRetTy::Ty(return_item.to_rust_ty_or_opaque(ctx, &())) } } @@ -2837,7 +3302,8 @@ mod utils { // [1]: http://c0x.coding-guidelines.com/6.7.5.3.html let arg_ty = match *arg_ty.canonical_type(ctx).kind() { TypeKind::Array(t, _) => { - t.to_rust_ty(ctx).to_ptr(ctx.resolve_type(t).is_const(), ctx.span()) + t.to_rust_ty_or_opaque(ctx, &()) + .to_ptr(ctx.resolve_type(t).is_const(), ctx.span()) }, TypeKind::Pointer(inner) => { let inner = ctx.resolve_item(inner); @@ -2845,11 +3311,11 @@ mod utils { if let TypeKind::ObjCInterface(_) = *inner_ty.canonical_type(ctx).kind() { quote_ty!(ctx.ext_cx(), id) } else { - arg_item.to_rust_ty(ctx) + arg_item.to_rust_ty_or_opaque(ctx, &()) } }, _ => { - arg_item.to_rust_ty(ctx) + arg_item.to_rust_ty_or_opaque(ctx, &()) } }; diff --git a/third_party/rust/bindgen/src/codegen/struct_layout.rs b/third_party/rust/bindgen/src/codegen/struct_layout.rs index 24938c160854..351f76428e61 100644 --- a/third_party/rust/bindgen/src/codegen/struct_layout.rs +++ b/third_party/rust/bindgen/src/codegen/struct_layout.rs @@ -167,17 +167,20 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { None => return None, }; - if let TypeKind::Array(inner, len) = *field_ty.canonical_type(self.ctx).kind() { + if let TypeKind::Array(inner, len) = + *field_ty.canonical_type(self.ctx).kind() { // FIXME(emilio): As an _ultra_ hack, we correct the layout returned // by arrays of structs that have a bigger alignment than what we // can support. // // This means that the structs in the array are super-unsafe to // access, since they won't be properly aligned, but *shrug*. - if let Some(layout) = self.ctx.resolve_type(inner).layout(self.ctx) { + if let Some(layout) = self.ctx + .resolve_type(inner) + .layout(self.ctx) { if layout.align > mem::size_of::<*mut ()>() { - field_layout.size = - align_to(layout.size, layout.align) * len; + field_layout.size = align_to(layout.size, layout.align) * + len; field_layout.align = mem::size_of::<*mut ()>(); } } @@ -197,7 +200,8 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { }; // Otherwise the padding is useless. - let need_padding = padding_bytes >= field_layout.align; + let need_padding = padding_bytes >= field_layout.align || + field_layout.align > mem::size_of::<*mut ()>(); self.latest_offset += padding_bytes; @@ -206,14 +210,16 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { self.latest_offset); debug!("align field {} to {}/{} with {} padding bytes {:?}", - field_name, - self.latest_offset, - field_offset.unwrap_or(0) / 8, - padding_bytes, - field_layout); + field_name, + self.latest_offset, + field_offset.unwrap_or(0) / 8, + padding_bytes, + field_layout); if need_padding && padding_bytes != 0 { - Some(Layout::new(padding_bytes, field_layout.align)) + Some(Layout::new(padding_bytes, + cmp::min(field_layout.align, + mem::size_of::<*mut ()>()))) } else { None } @@ -221,7 +227,8 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { self.latest_offset += field_layout.size; self.latest_field_layout = Some(field_layout); - self.max_field_align = cmp::max(self.max_field_align, field_layout.align); + self.max_field_align = cmp::max(self.max_field_align, + field_layout.align); self.last_field_was_bitfield = false; debug!("Offset: {}: {} -> {}", @@ -232,11 +239,15 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { padding_layout.map(|layout| self.padding_field(layout)) } - pub fn pad_struct(&mut self, name: &str, layout: Layout) -> Option { + pub fn pad_struct(&mut self, + name: &str, + layout: Layout) + -> Option { if layout.size < self.latest_offset { error!("Calculated wrong layout for {}, too more {} bytes", - name, self.latest_offset - layout.size); - return None + name, + self.latest_offset - layout.size); + return None; } let padding_bytes = layout.size - self.latest_offset; @@ -248,20 +259,22 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { // regardless, because bitfields don't respect alignment as strictly as // other fields. if padding_bytes > 0 && - (padding_bytes >= layout.align || - (self.last_field_was_bitfield && - padding_bytes >= self.latest_field_layout.unwrap().align) || - layout.align > mem::size_of::<*mut ()>()) { + (padding_bytes >= layout.align || + (self.last_field_was_bitfield && + padding_bytes >= self.latest_field_layout.unwrap().align) || + layout.align > mem::size_of::<*mut ()>()) { let layout = if self.comp.packed() { Layout::new(padding_bytes, 1) } else if self.last_field_was_bitfield || - layout.align > mem::size_of::<*mut ()>() { + layout.align > mem::size_of::<*mut ()>() { // We've already given up on alignment here. Layout::for_size(padding_bytes) } else { Layout::new(padding_bytes, layout.align) }; + debug!("pad bytes to struct {}, {:?}", name, layout); + Some(self.padding_field(layout)) } else { None @@ -314,12 +327,14 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { // If it was, we may or may not need to align, depending on what the // current field alignment and the bitfield size and alignment are. - debug!("align_to_bitfield? {}: {:?} {:?}", self.last_field_was_bitfield, - layout, new_field_layout); + debug!("align_to_bitfield? {}: {:?} {:?}", + self.last_field_was_bitfield, + layout, + new_field_layout); if self.last_field_was_bitfield && - new_field_layout.align <= layout.size % layout.align && - new_field_layout.size <= layout.size % layout.align { + new_field_layout.align <= layout.size % layout.align && + new_field_layout.size <= layout.size % layout.align { // The new field will be coalesced into some of the remaining bits. // // FIXME(emilio): I think this may not catch everything? diff --git a/third_party/rust/bindgen/src/extra_assertions.rs b/third_party/rust/bindgen/src/extra_assertions.rs new file mode 100644 index 000000000000..b89c718a4813 --- /dev/null +++ b/third_party/rust/bindgen/src/extra_assertions.rs @@ -0,0 +1,30 @@ +//! Macros for defining extra assertions that should only be checked in testing +//! and/or CI when the `testing_only_extra_assertions` feature is enabled. + +#[macro_export] +macro_rules! extra_assert { + ( $cond:expr ) => { + if cfg!(feature = "testing_only_extra_assertions") { + assert!($cond); + } + }; + ( $cond:expr , $( $arg:tt )+ ) => { + if cfg!(feature = "testing_only_extra_assertions") { + assert!($cond, $( $arg )* ) + } + }; +} + +#[macro_export] +macro_rules! extra_assert_eq { + ( $lhs:expr , $rhs:expr ) => { + if cfg!(feature = "testing_only_extra_assertions") { + assert_eq!($lhs, $rhs); + } + }; + ( $lhs:expr , $rhs:expr , $( $arg:tt )+ ) => { + if cfg!(feature = "testing_only_extra_assertions") { + assert!($lhs, $rhs, $( $arg )* ); + } + }; +} diff --git a/third_party/rust/bindgen/src/ir/comp.rs b/third_party/rust/bindgen/src/ir/comp.rs index ce6ec25d1450..91593b79349f 100644 --- a/third_party/rust/bindgen/src/ir/comp.rs +++ b/third_party/rust/bindgen/src/ir/comp.rs @@ -6,7 +6,7 @@ use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; use super::item::Item; use super::layout::Layout; use super::traversal::{EdgeKind, Trace, Tracer}; -use super::ty::{TemplateDeclaration, Type}; +use super::template::TemplateParameters; use clang; use parse::{ClangItemParser, ParseError}; use std::cell::Cell; @@ -26,6 +26,10 @@ pub enum MethodKind { /// A constructor. We represent it as method for convenience, to avoid code /// duplication. Constructor, + /// A destructor. + Destructor, + /// A virtual destructor. + VirtualDestructor, /// A static method. Static, /// A normal method. @@ -61,6 +65,12 @@ impl Method { self.kind } + /// Is this a destructor method? + pub fn is_destructor(&self) -> bool { + self.kind == MethodKind::Destructor || + self.kind == MethodKind::VirtualDestructor + } + /// Is this a constructor? pub fn is_constructor(&self) -> bool { self.kind == MethodKind::Constructor @@ -68,7 +78,8 @@ impl Method { /// Is this a virtual method? pub fn is_virtual(&self) -> bool { - self.kind == MethodKind::Virtual + self.kind == MethodKind::Virtual || + self.kind == MethodKind::VirtualDestructor } /// Is this a static method? @@ -238,10 +249,11 @@ pub struct CompInfo { /// The members of this struct or union. fields: Vec, - /// The template parameters of this class. These are non-concrete, and - /// should always be a Type(TypeKind::Named(name)), but still they need to - /// be registered with an unique type id in the context. - template_args: Vec, + /// The abstract template parameters of this class. These are NOT concrete + /// template arguments, and should always be a + /// Type(TypeKind::Named(name)). For concrete template arguments, see the + /// TypeKind::TemplateInstantiation. + template_params: Vec, /// The method declarations inside this class, if in C++ mode. methods: Vec, @@ -249,12 +261,13 @@ pub struct CompInfo { /// The different constructors this struct or class contains. constructors: Vec, + /// The destructor of this type. The bool represents whether this destructor + /// is virtual. + destructor: Option<(bool, ItemId)>, + /// Vector of classes this one inherits from. base_members: Vec, - /// The parent reference template if any. - ref_template: Option, - /// The inner types that were declared inside this class, in something like: /// /// class Foo { @@ -320,11 +333,11 @@ impl CompInfo { CompInfo { kind: kind, fields: vec![], - template_args: vec![], + template_params: vec![], methods: vec![], constructors: vec![], + destructor: None, base_members: vec![], - ref_template: None, inner_types: vec![], inner_vars: vec![], has_vtable: false, @@ -345,9 +358,7 @@ impl CompInfo { !self.has_vtable(ctx) && self.fields.is_empty() && self.base_members.iter().all(|base| { ctx.resolve_type(base.ty).canonical_type(ctx).is_unsized(ctx) - }) && - self.ref_template - .map_or(true, |template| ctx.resolve_type(template).is_unsized(ctx)) + }) } /// Does this compound type have a destructor? @@ -364,16 +375,6 @@ impl CompInfo { match self.kind { CompKind::Union => false, CompKind::Struct => { - // NB: We can't rely on a type with type parameters - // not having destructor. - // - // This is unfortunate, but... - self.ref_template.as_ref().map_or(false, |t| { - ctx.resolve_type(*t).has_destructor(ctx) - }) || - self.template_args.iter().any(|t| { - ctx.resolve_type(*t).has_destructor(ctx) - }) || self.base_members.iter().any(|base| { ctx.resolve_type(base.ty).has_destructor(ctx) }) || @@ -389,16 +390,6 @@ impl CompInfo { has_destructor } - /// Is this type a template specialization? - pub fn is_template_specialization(&self) -> bool { - self.ref_template.is_some() - } - - /// Get the template declaration this specialization is specializing. - pub fn specialized_template(&self) -> Option { - self.ref_template - } - /// Compute the layout of this type. /// /// This is called as a fallback under some circumstances where LLVM doesn't @@ -411,7 +402,7 @@ impl CompInfo { use std::cmp; // We can't do better than clang here, sorry. if self.kind == CompKind::Struct { - return None + return None; } let mut max_size = 0; @@ -434,12 +425,6 @@ impl CompInfo { &self.fields } - /// Get this type's set of free template arguments. Empty if this is not a - /// template. - pub fn template_args(&self) -> &[ItemId] { - &self.template_args - } - /// Does this type have any template parameters that aren't types /// (e.g. int)? pub fn has_non_type_template_params(&self) -> bool { @@ -452,9 +437,6 @@ impl CompInfo { self.base_members().iter().any(|base| { ctx.resolve_type(base.ty) .has_vtable(ctx) - }) || - self.ref_template.map_or(false, |template| { - ctx.resolve_type(template).has_vtable(ctx) }) } @@ -468,6 +450,11 @@ impl CompInfo { &self.constructors } + /// Get this type's destructor. + pub fn destructor(&self) -> Option<(bool, ItemId)> { + self.destructor + } + /// What kind of compound type is this? pub fn kind(&self) -> CompKind { self.kind @@ -485,10 +472,9 @@ impl CompInfo { ctx: &mut BindgenContext) -> Result { use clang_sys::*; - // Sigh... For class templates we want the location, for - // specialisations, we want the declaration... So just try both. - // - // TODO: Yeah, this code reads really bad. + assert!(ty.template_args().is_none(), + "We handle template instantiations elsewhere"); + let mut cursor = ty.declaration(); let mut kind = Self::kind_from_cursor(&cursor); if kind.is_err() { @@ -510,44 +496,23 @@ impl CompInfo { CXCursor_ClassDecl => !cur.is_definition(), _ => false, }); - ci.template_args = match ty.template_args() { - // In forward declarations and not specializations, etc, they are in - // the ast, we'll meet them in CXCursor_TemplateTypeParameter - None => vec![], - Some(arg_types) => { - let num_arg_types = arg_types.len(); - let mut specialization = true; - - let args = arg_types.filter(|t| t.kind() != CXType_Invalid) - .filter_map(|t| if t.spelling() - .starts_with("type-parameter") { - specialization = false; - None - } else { - Some(Item::from_ty_or_ref(t, None, None, ctx)) - }) - .collect::>(); - - if specialization && args.len() != num_arg_types { - ci.has_non_type_template_params = true; - warn!("warning: Template parameter is not a type"); - } - - if specialization { args } else { vec![] } - } - }; - - ci.ref_template = cursor.specialized() - .and_then(|c| Item::parse(c, None, ctx).ok()); let mut maybe_anonymous_struct_field = None; cursor.visit(|cur| { if cur.kind() != CXCursor_FieldDecl { - if let Some((ty, _, offset)) = + if let Some((ty, clang_ty, offset)) = maybe_anonymous_struct_field.take() { - let field = - Field::new(None, ty, None, None, None, false, offset); - ci.fields.push(field); + if cur.kind() == CXCursor_TypedefDecl && + cur.typedef_type().unwrap().canonical_type() == clang_ty { + // Typedefs of anonymous structs appear later in the ast + // than the struct itself, that would otherwise be an + // anonymous field. Detect that case here, and do + // nothing. + } else { + let field = + Field::new(None, ty, None, None, None, false, offset); + ci.fields.push(field); + } } } @@ -576,7 +541,7 @@ impl CompInfo { let bit_width = cur.bit_width(); let field_type = Item::from_ty_or_ref(cur.cur_type(), - Some(cur), + cur, Some(potential_id), ctx); @@ -616,17 +581,27 @@ impl CompInfo { } CXCursor_EnumDecl | CXCursor_TypeAliasDecl | + CXCursor_TypeAliasTemplateDecl | CXCursor_TypedefDecl | CXCursor_StructDecl | CXCursor_UnionDecl | CXCursor_ClassTemplate | CXCursor_ClassDecl => { // We can find non-semantic children here, clang uses a - // StructDecl to note incomplete structs that hasn't been - // forward-declared before, see: + // StructDecl to note incomplete structs that haven't been + // forward-declared before, see [1]. // - // https://github.com/servo/rust-bindgen/issues/482 - if cur.semantic_parent() != cursor { + // Also, clang seems to scope struct definitions inside + // unions, and other named struct definitions inside other + // structs to the whole translation unit. + // + // Let's just assume that if the cursor we've found is a + // definition, it's a valid inner type. + // + // [1]: https://github.com/servo/rust-bindgen/issues/482 + let is_inner_struct = cur.semantic_parent() == cursor || + cur.is_definition(); + if !is_inner_struct { return CXChildVisit_Continue; } @@ -649,17 +624,10 @@ impl CompInfo { ci.packed = true; } CXCursor_TemplateTypeParameter => { - // Yes! You can arrive here with an empty template parameter - // name! Awesome, isn't it? - // - // see tests/headers/empty_template_param_name.hpp - if cur.spelling().is_empty() { - return CXChildVisit_Continue; - } - - let param = - Item::named_type(cur.spelling(), potential_id, ctx); - ci.template_args.push(param); + let param = Item::named_type(None, cur, ctx) + .expect("Item::named_type should't fail when pointing \ + at a TemplateTypeParameter"); + ci.template_params.push(param); } CXCursor_CXXBaseSpecifier => { let is_virtual_base = cur.is_virtual_base(); @@ -671,10 +639,8 @@ impl CompInfo { BaseKind::Normal }; - let type_id = Item::from_ty_or_ref(cur.cur_type(), - Some(cur), - None, - ctx); + let type_id = + Item::from_ty_or_ref(cur.cur_type(), cur, None, ctx); ci.base_members.push(Base { ty: type_id, kind: kind, @@ -700,7 +666,7 @@ impl CompInfo { // Methods of template functions not only use to be inlined, // but also instantiated, and we wouldn't be able to call // them, so just bail out. - if !ci.template_args.is_empty() { + if !ci.template_params.is_empty() { return CXChildVisit_Continue; } @@ -718,8 +684,9 @@ impl CompInfo { CXCursor_Constructor => { ci.constructors.push(signature); } - // TODO(emilio): Bind the destructor? - CXCursor_Destructor => {} + CXCursor_Destructor => { + ci.destructor = Some((is_virtual, signature)); + } CXCursor_CXXMethod => { let is_const = cur.method_is_const(); let method_kind = if is_static { @@ -767,7 +734,7 @@ impl CompInfo { _ => { warn!("unhandled comp member `{}` (kind {:?}) in `{}` ({})", cur.spelling(), - cur.kind(), + clang::kind_to_str(cur.kind()), cursor.spelling(), cur.location()); } @@ -776,7 +743,8 @@ impl CompInfo { }); if let Some((ty, _, offset)) = maybe_anonymous_struct_field { - let field = Field::new(None, ty, None, None, None, false, offset); + let field = + Field::new(None, ty, None, None, None, false, offset); ci.fields.push(field); } @@ -805,25 +773,6 @@ impl CompInfo { }) } - /// Do any of the types that participate in this type's "signature" use the - /// named type `ty`? - /// - /// See also documentation for `ir::Item::signature_contains_named_type`. - pub fn signature_contains_named_type(&self, - ctx: &BindgenContext, - ty: &Type) - -> bool { - // We don't generate these, so rather don't make the codegen step to - // think we got it covered. - if self.has_non_type_template_params() { - return false; - } - self.template_args.iter().any(|arg| { - ctx.resolve_type(*arg) - .signature_contains_named_type(ctx, ty) - }) - } - /// Get the set of types that were declared within this compound type /// (e.g. nested class definitions). pub fn inner_types(&self) -> &[ItemId] { @@ -870,12 +819,14 @@ impl CompInfo { } } -impl TemplateDeclaration for CompInfo { - fn template_params(&self, _ctx: &BindgenContext) -> Option> { - if self.template_args.is_empty() { +impl TemplateParameters for CompInfo { + fn self_template_params(&self, + _ctx: &BindgenContext) + -> Option> { + if self.template_params.is_empty() { None } else { - Some(self.template_args.clone()) + Some(self.template_params.clone()) } } } @@ -914,13 +865,9 @@ impl CanDeriveDebug for CompInfo { self.base_members .iter() .all(|base| base.ty.can_derive_debug(ctx, ())) && - self.template_args - .iter() - .all(|id| id.can_derive_debug(ctx, ())) && self.fields .iter() - .all(|f| f.can_derive_debug(ctx, ())) && - self.ref_template.map_or(true, |id| id.can_derive_debug(ctx, ())) + .all(|f| f.can_derive_debug(ctx, ())) }; self.detect_derive_debug_cycle.set(false); @@ -950,7 +897,7 @@ impl CanDeriveDefault for CompInfo { return layout.unwrap_or_else(Layout::zero) .opaque() - .can_derive_debug(ctx, ()); + .can_derive_default(ctx, ()); } self.detect_derive_default_cycle.set(true); @@ -960,14 +907,9 @@ impl CanDeriveDefault for CompInfo { self.base_members .iter() .all(|base| base.ty.can_derive_default(ctx, ())) && - self.template_args - .iter() - .all(|id| id.can_derive_default(ctx, ())) && self.fields .iter() - .all(|f| f.can_derive_default(ctx, ())) && - self.ref_template - .map_or(true, |id| id.can_derive_default(ctx, ())); + .all(|f| f.can_derive_default(ctx, ())); self.detect_derive_default_cycle.set(false); @@ -1002,17 +944,12 @@ impl<'a> CanDeriveCopy<'a> for CompInfo { } // https://github.com/rust-lang/rust/issues/36640 - if !self.template_args.is_empty() || self.ref_template.is_some() || - !item.applicable_template_args(ctx).is_empty() { + if !self.template_params.is_empty() || + item.used_template_params(ctx).is_some() { return false; } } - // With template args, use a safe subset of the types, - // since copyability depends on the types itself. - self.ref_template - .as_ref() - .map_or(true, |t| t.can_derive_copy(ctx, ())) && self.base_members .iter() .all(|base| base.ty.can_derive_copy(ctx, ())) && @@ -1033,49 +970,40 @@ impl Trace for CompInfo { fn trace(&self, context: &BindgenContext, tracer: &mut T, item: &Item) where T: Tracer, { - // TODO: We should properly distinguish template instantiations from - // template declarations at the type level. Why are some template - // instantiations represented here instead of as - // TypeKind::TemplateInstantiation? - if let Some(template) = self.specialized_template() { - // This is an instantiation of a template declaration with concrete - // template type arguments. - tracer.visit(template); - let args = item.applicable_template_args(context); - for a in args { - tracer.visit(a); - } - } else { - let params = item.applicable_template_args(context); - // This is a template declaration with abstract template type - // parameters. - for p in params { - tracer.visit_kind(p, EdgeKind::TemplateParameterDefinition); - } - } - - for base in self.base_members() { - tracer.visit(base.ty); - } - - for field in self.fields() { - tracer.visit(field.ty()); + let params = item.all_template_params(context).unwrap_or(vec![]); + for p in params { + tracer.visit_kind(p, EdgeKind::TemplateParameterDefinition); } for &ty in self.inner_types() { - tracer.visit(ty); + tracer.visit_kind(ty, EdgeKind::InnerType); + } + + // We unconditionally trace `CompInfo`'s template parameters and inner + // types for the the usage analysis. However, we don't want to continue + // tracing anything else, if this type is marked opaque. + if item.is_opaque(context) { + return; + } + + for base in self.base_members() { + tracer.visit_kind(base.ty, EdgeKind::BaseMember); + } + + for field in self.fields() { + tracer.visit_kind(field.ty(), EdgeKind::Field); } for &var in self.inner_vars() { - tracer.visit(var); + tracer.visit_kind(var, EdgeKind::InnerVar); } for method in self.methods() { - tracer.visit(method.signature); + tracer.visit_kind(method.signature, EdgeKind::Method); } for &ctor in self.constructors() { - tracer.visit(ctor); + tracer.visit_kind(ctor, EdgeKind::Constructor); } } } diff --git a/third_party/rust/bindgen/src/ir/context.rs b/third_party/rust/bindgen/src/ir/context.rs index 7383c09a4cc4..3d3e9fcdb4fa 100644 --- a/third_party/rust/bindgen/src/ir/context.rs +++ b/third_party/rust/bindgen/src/ir/context.rs @@ -5,11 +5,13 @@ use super::int::IntKind; use super::item::{Item, ItemCanonicalPath, ItemSet}; use super::item_kind::ItemKind; use super::module::{Module, ModuleKind}; -use super::traversal::{self, Edge, ItemTraversal, Trace}; -use super::ty::{FloatKind, TemplateDeclaration, Type, TypeKind}; +use super::named::{UsedTemplateParameters, analyze}; +use super::template::{TemplateInstantiation, TemplateParameters}; +use super::traversal::{self, Edge, ItemTraversal}; +use super::ty::{FloatKind, Type, TypeKind}; use BindgenOptions; use cexpr; -use chooser::TypeChooser; +use callbacks::ParseCallbacks; use clang::{self, Cursor}; use clang_sys; use parse::ClangItemParser; @@ -18,8 +20,6 @@ use std::cell::Cell; use std::collections::{HashMap, hash_map}; use std::collections::btree_map::{self, BTreeMap}; use std::fmt; -use std::fs::File; -use std::io::{self, Write}; use std::iter::IntoIterator; use syntax::ast::Ident; use syntax::codemap::{DUMMY_SP, Span}; @@ -104,6 +104,10 @@ pub struct BindgenContext<'ctx> { /// item ids during parsing. types: HashMap, + /// Maps from a cursor to the item id of the named template type parameter + /// for that cursor. + named_types: HashMap, + /// A cursor to module map. Similar reason than above. modules: HashMap, @@ -151,15 +155,61 @@ pub struct BindgenContext<'ctx> { /// Whether a bindgen complex was generated generated_bindegen_complex: Cell, + + /// Map from an item's id to the set of template parameter items that it + /// uses. See `ir::named` for more details. Always `Some` during the codegen + /// phase. + used_template_parameters: Option>, } /// A traversal of whitelisted items. -pub type WhitelistedItems<'ctx, 'gen> = ItemTraversal<'ctx, - 'gen, - ItemSet, - Vec, - fn(Edge) -> bool>; +pub struct WhitelistedItems<'ctx, 'gen> + where 'gen: 'ctx +{ + ctx: &'ctx BindgenContext<'gen>, + traversal: ItemTraversal<'ctx, + 'gen, + ItemSet, + Vec, + fn(Edge) -> bool>, +} +impl<'ctx, 'gen> Iterator for WhitelistedItems<'ctx, 'gen> + where 'gen: 'ctx +{ + type Item = ItemId; + + fn next(&mut self) -> Option { + loop { + match self.traversal.next() { + None => return None, + Some(id) if self.ctx.resolve_item(id).is_hidden(self.ctx) => continue, + Some(id) => return Some(id), + } + } + } +} + +impl<'ctx, 'gen> WhitelistedItems<'ctx, 'gen> + where 'gen: 'ctx +{ + /// Construct a new whitelisted items traversal. + pub fn new(ctx: &'ctx BindgenContext<'gen>, + roots: R) + -> WhitelistedItems<'ctx, 'gen> + where R: IntoIterator, + { + let predicate = if ctx.options().whitelist_recursively { + traversal::all_edges + } else { + traversal::no_edges + }; + WhitelistedItems { + ctx: ctx, + traversal: ItemTraversal::new(ctx, roots, predicate) + } + } +} impl<'ctx> BindgenContext<'ctx> { /// Construct the context for the given `options`. pub fn new(options: BindgenOptions) -> Self { @@ -173,14 +223,15 @@ impl<'ctx> BindgenContext<'ctx> { clang::TranslationUnit::parse(&index, "", &options.clang_args, - &[], + &options.input_unsaved_files, parse_options) - .expect("TranslationUnit::parse"); + .expect("TranslationUnit::parse failed"); let root_module = Self::build_root_module(ItemId(0)); let mut me = BindgenContext { items: Default::default(), types: Default::default(), + named_types: Default::default(), modules: Default::default(), next_item_id: ItemId(1), root_module: root_module.id(), @@ -195,6 +246,7 @@ impl<'ctx> BindgenContext<'ctx> { translation_unit: translation_unit, options: options, generated_bindegen_complex: Cell::new(false), + used_template_parameters: None, }; me.add_item(root_module, None, None); @@ -222,9 +274,9 @@ impl<'ctx> BindgenContext<'ctx> { .expect("should have been parsing a type, if we finished parsing a type") } - /// Get the user-provided type chooser by reference, if any. - pub fn type_chooser(&self) -> Option<&TypeChooser> { - self.options().type_chooser.as_ref().map(|t| &**t) + /// Get the user-provided callbacks by reference, if any. + pub fn parse_callbacks(&self) -> Option<&ParseCallbacks> { + self.options().parse_callbacks.as_ref().map(|t| &**t) } /// Define a new item. @@ -240,7 +292,8 @@ impl<'ctx> BindgenContext<'ctx> { declaration, location); debug_assert!(declaration.is_some() || !item.kind().is_type() || - item.kind().expect_type().is_builtin_or_named(), + item.kind().expect_type().is_builtin_or_named() || + item.kind().expect_type().is_opaque(), "Adding a type without declaration?"); let id = item.id(); @@ -258,7 +311,8 @@ impl<'ctx> BindgenContext<'ctx> { } let old_item = self.items.insert(id, item); - assert!(old_item.is_none(), "Inserted type twice?"); + assert!(old_item.is_none(), + "should not have already associated an item with the given id"); // Unnamed items can have an USR, but they can't be referenced from // other sites explicitly and the USR can match if the unnamed items are @@ -301,6 +355,35 @@ impl<'ctx> BindgenContext<'ctx> { } } + /// Add a new named template type parameter to this context's item set. + pub fn add_named_type(&mut self, item: Item, definition: clang::Cursor) { + debug!("BindgenContext::add_named_type: item = {:?}; definition = {:?}", + item, + definition); + + assert!(item.expect_type().is_named(), + "Should directly be a named type, not a resolved reference or anything"); + assert_eq!(definition.kind(), + clang_sys::CXCursor_TemplateTypeParameter); + + let id = item.id(); + let old_item = self.items.insert(id, item); + assert!(old_item.is_none(), + "should not have already associated an item with the given id"); + + let old_named_ty = self.named_types.insert(definition, id); + assert!(old_named_ty.is_none(), + "should not have already associated a named type with this id"); + } + + /// Get the named type defined at the given cursor location, if we've + /// already added one. + pub fn get_named_type(&self, definition: &clang::Cursor) -> Option { + assert_eq!(definition.kind(), + clang_sys::CXCursor_TemplateTypeParameter); + self.named_types.get(definition).cloned() + } + // TODO: Move all this syntax crap to other part of the code. /// Given that we are in the codegen phase, get the syntex context. @@ -354,7 +437,7 @@ impl<'ctx> BindgenContext<'ctx> { /// Gather all the unresolved type references. fn collect_typerefs (&mut self) - -> Vec<(ItemId, clang::Type, Option, Option)> { + -> Vec<(ItemId, clang::Type, clang::Cursor, Option)> { debug_assert!(!self.collected_typerefs); self.collected_typerefs = true; let mut typerefs = vec![]; @@ -382,7 +465,11 @@ impl<'ctx> BindgenContext<'ctx> { for (id, ty, loc, parent_id) in typerefs { let _resolved = { let resolved = Item::from_ty(&ty, loc, parent_id, self) - .expect("What happened?"); + .unwrap_or_else(|_| { + warn!("Could not resolve type reference, falling back \ + to opaque blob"); + Item::new_opaque_type(self.next_item_id(), &ty, self) + }); let mut item = self.items.get_mut(&id).unwrap(); *item.kind_mut().as_type_mut().unwrap().kind_mut() = @@ -425,7 +512,7 @@ impl<'ctx> BindgenContext<'ctx> { }; match *ty.kind() { - TypeKind::Comp(ref ci) if !ci.is_template_specialization() => {} + TypeKind::Comp(..) | TypeKind::TemplateAlias(..) | TypeKind::Alias(..) => {} _ => continue, @@ -531,14 +618,18 @@ impl<'ctx> BindgenContext<'ctx> { self.process_replacements(); } + self.find_used_template_parameters(); + let ret = cb(self); self.gen_ctx = None; ret } - /// This function trying to find any dangling references inside of `items` + /// When the `testing_only_extra_assertions` feature is enabled, this + /// function walks the IR graph and asserts that we do not have any edges + /// referencing an ItemId for which we do not have an associated IR item. fn assert_no_dangling_references(&self) { - if cfg!(feature = "assert_no_dangling_items") { + if cfg!(feature = "testing_only_extra_assertions") { for _ in self.assert_no_dangling_item_traversal() { // The iterator's next method does the asserting for us. } @@ -557,6 +648,62 @@ impl<'ctx> BindgenContext<'ctx> { traversal::all_edges) } + fn find_used_template_parameters(&mut self) { + if self.options.whitelist_recursively { + let used_params = analyze::(self); + self.used_template_parameters = Some(used_params); + } else { + // If you aren't recursively whitelisting, then we can't really make + // any sense of template parameter usage, and you're on your own. + let mut used_params = HashMap::new(); + for id in self.whitelisted_items() { + used_params.entry(id) + .or_insert(id.self_template_params(self) + .map_or(Default::default(), + |params| params.into_iter().collect())); + } + self.used_template_parameters = Some(used_params); + } + } + + /// Return `true` if `item` uses the given `template_param`, `false` + /// otherwise. + /// + /// This method may only be called during the codegen phase, because the + /// template usage information is only computed as we enter the codegen + /// phase. + /// + /// If the item is blacklisted, then we say that it always uses the template + /// parameter. This is a little subtle. The template parameter usage + /// analysis only considers whitelisted items, and if any blacklisted item + /// shows up in the generated bindings, it is the user's responsibility to + /// manually provide a definition for them. To give them the most + /// flexibility when doing that, we assume that they use every template + /// parameter and always pass template arguments through in instantiations. + pub fn uses_template_parameter(&self, + item: ItemId, + template_param: ItemId) + -> bool { + assert!(self.in_codegen_phase(), + "We only compute template parameter usage as we enter codegen"); + + if self.resolve_item(item).is_hidden(self) { + return true; + } + + let template_param = template_param.into_resolver() + .through_type_refs() + .through_type_aliases() + .resolve(self) + .id(); + + self.used_template_parameters + .as_ref() + .expect("should have found template parameter usage if we're in codegen") + .get(&item) + .map_or(false, |items_used_params| items_used_params.contains(&template_param)) + } + // This deserves a comment. Builtin types don't get a valid declaration, so // we can't add it to the cursor->type map. // @@ -636,7 +783,7 @@ impl<'ctx> BindgenContext<'ctx> { .and_then(|canon_decl| { self.get_resolved_type(&canon_decl) .and_then(|template_decl_id| { - template_decl_id.num_template_params(self) + template_decl_id.num_self_template_params(self) .map(|num_params| { (*canon_decl.cursor(), template_decl_id, @@ -660,7 +807,7 @@ impl<'ctx> BindgenContext<'ctx> { .cloned() }) .and_then(|template_decl| { - template_decl.num_template_params(self) + template_decl.num_self_template_params(self) .map(|num_template_params| { (*template_decl.decl(), template_decl.id(), @@ -708,7 +855,7 @@ impl<'ctx> BindgenContext<'ctx> { use clang_sys; let num_expected_args = match self.resolve_type(template) - .num_template_params(self) { + .num_self_template_params(self) { Some(n) => n, None => { warn!("Tried to instantiate a template for which we could not \ @@ -755,7 +902,7 @@ impl<'ctx> BindgenContext<'ctx> { // template declaration as the parent. It is already parsed and // has a known-resolvable `ItemId`. let ty = Item::from_ty_or_ref(child.cur_type(), - Some(*child), + *child, Some(template), self); args.push(ty); @@ -772,7 +919,7 @@ impl<'ctx> BindgenContext<'ctx> { // Do a happy little parse. See comment in the TypeRef // match arm about parent IDs. let ty = Item::from_ty_or_ref(child.cur_type(), - Some(*child), + *child, Some(template), self); args.push(ty); @@ -794,9 +941,9 @@ impl<'ctx> BindgenContext<'ctx> { sub_args.reverse(); let sub_name = Some(template_decl_cursor.spelling()); + let sub_inst = TemplateInstantiation::new(template_decl_id, sub_args); let sub_kind = - TypeKind::TemplateInstantiation(template_decl_id, - sub_args); + TypeKind::TemplateInstantiation(sub_inst); let sub_ty = Type::new(sub_name, template_decl_cursor.cur_type() .fallible_layout() @@ -846,7 +993,8 @@ impl<'ctx> BindgenContext<'ctx> { } args.reverse(); - let type_kind = TypeKind::TemplateInstantiation(template, args); + let type_kind = TypeKind::TemplateInstantiation( + TemplateInstantiation::new(template, args)); let name = ty.spelling(); let name = if name.is_empty() { None } else { Some(name) }; let ty = Type::new(name, @@ -865,9 +1013,9 @@ impl<'ctx> BindgenContext<'ctx> { /// If we have already resolved the type for the given type declaration, /// return its `ItemId`. Otherwise, return `None`. - fn get_resolved_type(&self, - decl: &clang::CanonicalTypeDeclaration) - -> Option { + pub fn get_resolved_type(&self, + decl: &clang::CanonicalTypeDeclaration) + -> Option { self.types .get(&TypeKey::Declaration(*decl.cursor())) .or_else(|| { @@ -906,16 +1054,15 @@ impl<'ctx> BindgenContext<'ctx> { // of it, or // * we have already parsed and resolved this type, and // there's nothing left to do. - // - // Note that we only do the former if the `parent_id` exists, - // and we have a location for building the new arguments. The - // template argument names don't matter in the global context. if decl.cursor().is_template_like() && *ty != decl.cursor().cur_type() && - location.is_some() && - parent_id.is_some() { + location.is_some() { let location = location.unwrap(); - let parent_id = parent_id.unwrap(); + + // It is always safe to hang instantiations off of the root + // module. They use their template definition for naming, + // and don't need the parent for anything else. + let parent_id = self.root_module(); // For specialized type aliases, there's no way to get the // template parameters as of this writing (for a struct @@ -934,10 +1081,10 @@ impl<'ctx> BindgenContext<'ctx> { } return self.instantiate_template(with_id, - id, - parent_id, - ty, - location) + id, + parent_id, + ty, + location) .or_else(|| Some(id)); } @@ -949,17 +1096,20 @@ impl<'ctx> BindgenContext<'ctx> { self.build_builtin_ty(ty) } - // This is unfortunately a lot of bloat, but is needed to properly track - // constness et. al. - // - // We should probably make the constness tracking separate, so it doesn't - // bloat that much, but hey, we already bloat the heck out of builtin types. - fn build_ty_wrapper(&mut self, - with_id: ItemId, - wrapped_id: ItemId, - parent_id: Option, - ty: &clang::Type) - -> ItemId { + /// Make a new item that is a resolved type reference to the `wrapped_id`. + /// + /// This is unfortunately a lot of bloat, but is needed to properly track + /// constness et. al. + /// + /// We should probably make the constness tracking separate, so it doesn't + /// bloat that much, but hey, we already bloat the heck out of builtin + /// types. + pub fn build_ty_wrapper(&mut self, + with_id: ItemId, + wrapped_id: ItemId, + parent_id: Option, + ty: &clang::Type) + -> ItemId { let spelling = ty.spelling(); let is_const = ty.is_const(); let layout = ty.fallible_layout().ok(); @@ -989,8 +1139,10 @@ impl<'ctx> BindgenContext<'ctx> { CXType_Bool => TypeKind::Int(IntKind::Bool), CXType_Int => TypeKind::Int(IntKind::Int), CXType_UInt => TypeKind::Int(IntKind::UInt), - CXType_SChar | CXType_Char_S => TypeKind::Int(IntKind::Char), - CXType_UChar | CXType_Char_U => TypeKind::Int(IntKind::UChar), + CXType_Char_S => TypeKind::Int(IntKind::Char { is_signed: true }), + CXType_Char_U => TypeKind::Int(IntKind::Char { is_signed: false }), + CXType_SChar => TypeKind::Int(IntKind::SChar), + CXType_UChar => TypeKind::Int(IntKind::UChar), CXType_Short => TypeKind::Int(IntKind::Short), CXType_UShort => TypeKind::Int(IntKind::UShort), CXType_WChar | CXType_Char16 => TypeKind::Int(IntKind::U16), @@ -1111,35 +1263,8 @@ impl<'ctx> BindgenContext<'ctx> { &self.options } - /// Output graphviz dot file. - pub fn emit_ir_graphviz(&self, path: String) -> io::Result<()> { - let file = try!(File::create(path)); - let mut dot_file = io::BufWriter::new(file); - writeln!(&mut dot_file, "digraph {{")?; - - let mut err: Option> = None; - - for (id, item) in self.items() { - writeln!(&mut dot_file, "{} {};", id.0, item.dot_attributes(self))?; - - item.trace(self, &mut |sub_id: ItemId, _edge_kind| { - match writeln!(&mut dot_file, "{} -> {};", id.0, sub_id.as_usize()) { - Ok(_) => {}, - Err(e) => err = Some(Err(e)), - } - }, &()); - - if err.is_some() { - return err.unwrap(); - } - } - - writeln!(&mut dot_file, "}}")?; - Ok(()) - } - /// Tokenizes a namespace cursor in order to get the name and kind of the - /// namespace, + /// namespace. fn tokenize_namespace(&self, cursor: &clang::Cursor) -> (Option, ModuleKind) { @@ -1155,6 +1280,7 @@ impl<'ctx> BindgenContext<'ctx> { let mut kind = ModuleKind::Normal; let mut found_namespace_keyword = false; let mut module_name = None; + while let Some(token) = iter.next() { match &*token.spelling { "inline" => { @@ -1162,7 +1288,17 @@ impl<'ctx> BindgenContext<'ctx> { assert!(kind != ModuleKind::Inline); kind = ModuleKind::Inline; } - "namespace" => { + // The double colon allows us to handle nested namespaces like + // namespace foo::bar { } + // + // libclang still gives us two namespace cursors, which is cool, + // but the tokenization of the second begins with the double + // colon. That's ok, so we only need to handle the weird + // tokenization here. + // + // Fortunately enough, inline nested namespace specifiers aren't + // a thing, and are invalid C++ :) + "namespace" | "::" => { found_namespace_keyword = true; } "{" => { @@ -1299,14 +1435,7 @@ impl<'ctx> BindgenContext<'ctx> { // unions). let mut roots: Vec<_> = roots.collect(); roots.reverse(); - - let predicate = if self.options().whitelist_recursively { - traversal::all_edges - } else { - traversal::no_edges - }; - - WhitelistedItems::new(self, roots, predicate) + WhitelistedItems::new(self, roots) } /// Convenient method for getting the prefix to use for most traits in @@ -1330,6 +1459,73 @@ impl<'ctx> BindgenContext<'ctx> { } } +/// A builder struct for configuring item resolution options. +#[derive(Debug, Copy, Clone)] +pub struct ItemResolver { + id: ItemId, + through_type_refs: bool, + through_type_aliases: bool, +} + +impl ItemId { + /// Create an `ItemResolver` from this item id. + pub fn into_resolver(self) -> ItemResolver { + self.into() + } +} + +impl From for ItemResolver { + fn from(id: ItemId) -> ItemResolver { + ItemResolver::new(id) + } +} + +impl ItemResolver { + /// Construct a new `ItemResolver` from the given id. + pub fn new(id: ItemId) -> ItemResolver { + ItemResolver { + id: id, + through_type_refs: false, + through_type_aliases: false, + } + } + + /// Keep resolving through `Type::TypeRef` items. + pub fn through_type_refs(mut self) -> ItemResolver { + self.through_type_refs = true; + self + } + + /// Keep resolving through `Type::Alias` items. + pub fn through_type_aliases(mut self) -> ItemResolver { + self.through_type_aliases = true; + self + } + + /// Finish configuring and perform the actual item resolution. + pub fn resolve<'a, 'b>(self, ctx: &'a BindgenContext<'b>) -> &'a Item { + assert!(ctx.collected_typerefs()); + + let mut id = self.id; + loop { + let item = ctx.resolve_item(id); + let ty_kind = item.as_type().map(|t| t.kind()); + match ty_kind { + Some(&TypeKind::ResolvedTypeRef(next_id)) if self.through_type_refs => { + id = next_id; + } + // We intentionally ignore template aliases here, as they are + // more complicated, and don't represent a simple renaming of + // some type. + Some(&TypeKind::Alias(next_id)) if self.through_type_aliases => { + id = next_id; + } + _ => return item, + } + } + } +} + /// A type that we are in the middle of parsing. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct PartialType { @@ -1359,14 +1555,16 @@ impl PartialType { } } -impl TemplateDeclaration for PartialType { - fn template_params(&self, _ctx: &BindgenContext) -> Option> { +impl TemplateParameters for PartialType { + fn self_template_params(&self, + _ctx: &BindgenContext) + -> Option> { // Maybe at some point we will eagerly parse named types, but for now we // don't and this information is unavailable. None } - fn num_template_params(&self, _ctx: &BindgenContext) -> Option { + fn num_self_template_params(&self, _ctx: &BindgenContext) -> Option { // Wouldn't it be nice if libclang would reliably give us this // information‽ match self.decl().kind() { diff --git a/third_party/rust/bindgen/src/ir/dot.rs b/third_party/rust/bindgen/src/ir/dot.rs new file mode 100644 index 000000000000..7472dd8e0f3f --- /dev/null +++ b/third_party/rust/bindgen/src/ir/dot.rs @@ -0,0 +1,62 @@ +//! Generating Graphviz `dot` files from our IR. + +use super::context::{BindgenContext, ItemId}; +use super::traversal::Trace; +use std::fs::File; +use std::io::{self, Write}; +use std::path::Path; + +/// A trait for anything that can write attributes as `` rows to a dot +/// file. +pub trait DotAttributes { + /// Write this thing's attributes to the given output. Each attribute must + /// be its own `...`. + fn dot_attributes(&self, + ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write; +} + +/// Write a graphviz dot file containing our IR. +pub fn write_dot_file

    (ctx: &BindgenContext, path: P) -> io::Result<()> + where P: AsRef, +{ + let file = try!(File::create(path)); + let mut dot_file = io::BufWriter::new(file); + try!(writeln!(&mut dot_file, "digraph {{")); + + let mut err: Option> = None; + + for (id, item) in ctx.items() { + try!(writeln!(&mut dot_file, + r#"{} [fontname="courier", label=<

    "#, + id.as_usize())); + try!(item.dot_attributes(ctx, &mut dot_file)); + try!(writeln!(&mut dot_file, r#"
    >];"#)); + + item.trace(ctx, + &mut |sub_id: ItemId, edge_kind| { + if err.is_some() { + return; + } + + match writeln!(&mut dot_file, + "{} -> {} [label={:?}];", + id.as_usize(), + sub_id.as_usize(), + edge_kind) { + Ok(_) => {} + Err(e) => err = Some(Err(e)), + } + }, + &()); + + if let Some(err) = err { + return err; + } + } + + try!(writeln!(&mut dot_file, "}}")); + Ok(()) +} diff --git a/third_party/rust/bindgen/src/ir/enum_ty.rs b/third_party/rust/bindgen/src/ir/enum_ty.rs index 3470e033736b..e64354fb9d11 100644 --- a/third_party/rust/bindgen/src/ir/enum_ty.rs +++ b/third_party/rust/bindgen/src/ir/enum_ty.rs @@ -54,13 +54,15 @@ impl Enum { ctx: &mut BindgenContext) -> Result { use clang_sys::*; + debug!("Enum::from_ty {:?}", ty); + if ty.kind() != CXType_Enum { return Err(ParseError::Continue); } let declaration = ty.declaration().canonical(); let repr = declaration.enum_type() - .and_then(|et| Item::from_ty(&et, None, None, ctx).ok()); + .and_then(|et| Item::from_ty(&et, declaration, None, ctx).ok()); let mut variants = vec![]; // Assume signedness since the default type by the C standard is an int. @@ -82,7 +84,8 @@ impl Enum { }; let type_name = type_name.as_ref().map(String::as_str); - declaration.visit(|cursor| { + let definition = declaration.definition().unwrap_or(declaration); + definition.visit(|cursor| { if cursor.kind() == CXCursor_EnumConstantDecl { let value = if is_signed { cursor.enum_val_signed().map(EnumVariantValue::Signed) @@ -91,7 +94,7 @@ impl Enum { }; if let Some(val) = value { let name = cursor.spelling(); - let custom_behavior = ctx.type_chooser() + let custom_behavior = ctx.parse_callbacks() .and_then(|t| { t.enum_variant_behavior(type_name, &name, val) }) diff --git a/third_party/rust/bindgen/src/ir/function.rs b/third_party/rust/bindgen/src/ir/function.rs index 22b9c9b04aac..0168973454f4 100644 --- a/third_party/rust/bindgen/src/ir/function.rs +++ b/third_party/rust/bindgen/src/ir/function.rs @@ -1,12 +1,15 @@ //! Intermediate representation for C/C++ functions and methods. use super::context::{BindgenContext, ItemId}; +use super::dot::DotAttributes; use super::item::Item; -use super::traversal::{Trace, Tracer}; +use super::traversal::{EdgeKind, Trace, Tracer}; use super::ty::TypeKind; use clang; use clang_sys::CXCallingConv; +use ir::derive::CanDeriveDebug; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; +use std::io; use syntax::abi; /// A function declaration, with a signature, arguments, and argument names. @@ -59,6 +62,23 @@ impl Function { } } +impl DotAttributes for Function { + fn dot_attributes(&self, + _ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write, + { + if let Some(ref mangled) = self.mangled_name { + try!(writeln!(out, + "mangled name{}", + mangled)); + } + + Ok(()) + } +} + /// A function signature. #[derive(Debug)] pub struct FunctionSig { @@ -91,7 +111,14 @@ fn get_abi(cc: CXCallingConv) -> Option { } /// Get the mangled name for the cursor's referent. -pub fn cursor_mangling(cursor: &clang::Cursor) -> Option { +pub fn cursor_mangling(ctx: &BindgenContext, + cursor: &clang::Cursor) + -> Option { + use clang_sys; + if !ctx.options().enable_mangling { + return None; + } + // We early return here because libclang may crash in some case // if we pass in a variable inside a partial specialized template. // See servo/rust-bindgen#67, and servo/rust-bindgen#462. @@ -99,16 +126,52 @@ pub fn cursor_mangling(cursor: &clang::Cursor) -> Option { return None; } + if let Ok(mut manglings) = cursor.cxx_manglings() { + if let Some(m) = manglings.pop() { + return Some(m); + } + } + let mut mangling = cursor.mangling(); if mangling.is_empty() { return None; } // Try to undo backend linkage munging (prepended _, generally) + // + // TODO(emilio): This is wrong when the target system is not the host + // system. See https://github.com/servo/rust-bindgen/issues/593 if cfg!(target_os = "macos") { mangling.remove(0); } + if cursor.kind() == clang_sys::CXCursor_Destructor { + // With old (3.8-) libclang versions, and the Itanium ABI, clang returns + // the "destructor group 0" symbol, which means that it'll try to free + // memory, which definitely isn't what we want. + // + // Explicitly force the destructor group 1 symbol. + // + // See http://refspecs.linuxbase.org/cxxabi-1.83.html#mangling-special + // for the reference, and http://stackoverflow.com/a/6614369/1091587 for + // a more friendly explanation. + // + // We don't need to do this for constructors since clang seems to always + // have returned the C1 constructor. + // + // FIXME(emilio): Can a legit symbol in other ABIs end with this string? + // I don't think so, but if it can this would become a linker error + // anyway, not an invalid free at runtime. + // + // TODO(emilio, #611): Use cpp_demangle if this becomes nastier with + // time. + if mangling.ends_with("D0Ev") { + let new_len = mangling.len() - 4; + mangling.truncate(new_len); + mangling.push_str("D1Ev"); + } + } + Some(mangling) } @@ -156,7 +219,8 @@ impl FunctionSig { CXCursor_FunctionDecl | CXCursor_Constructor | CXCursor_CXXMethod | - CXCursor_ObjCInstanceMethodDecl => { + CXCursor_ObjCInstanceMethodDecl | + CXCursor_ObjCClassMethodDecl => { // For CXCursor_FunctionDecl, cursor.args() is the reliable way // to get parameter names and types. cursor.args() @@ -167,8 +231,7 @@ impl FunctionSig { let name = arg.spelling(); let name = if name.is_empty() { None } else { Some(name) }; - let ty = - Item::from_ty_or_ref(arg_ty, Some(*arg), None, ctx); + let ty = Item::from_ty_or_ref(arg_ty, *arg, None, ctx); (name, ty) }) .collect() @@ -179,10 +242,8 @@ impl FunctionSig { let mut args = vec![]; cursor.visit(|c| { if c.kind() == CXCursor_ParmDecl { - let ty = Item::from_ty_or_ref(c.cur_type(), - Some(c), - None, - ctx); + let ty = + Item::from_ty_or_ref(c.cur_type(), c, None, ctx); let name = c.spelling(); let name = if name.is_empty() { None } else { Some(name) }; @@ -196,13 +257,14 @@ impl FunctionSig { let is_method = cursor.kind() == CXCursor_CXXMethod; let is_constructor = cursor.kind() == CXCursor_Constructor; - if (is_constructor || is_method) && + let is_destructor = cursor.kind() == CXCursor_Destructor; + if (is_constructor || is_destructor || is_method) && cursor.lexical_parent() != cursor.semantic_parent() { // Only parse constructors once. return Err(ParseError::Continue); } - if is_method || is_constructor { + if is_method || is_constructor || is_destructor { let is_const = is_method && cursor.method_is_const(); let is_virtual = is_method && cursor.method_is_virtual(); let is_static = is_method && cursor.method_is_static(); @@ -220,17 +282,20 @@ impl FunctionSig { } } - let ty_ret_type = if cursor.kind() == CXCursor_ObjCInstanceMethodDecl { - try!(cursor.ret_type().ok_or(ParseError::Continue)) + let ty_ret_type = if cursor.kind() == CXCursor_ObjCInstanceMethodDecl || + cursor.kind() == CXCursor_ObjCClassMethodDecl { + try!(ty.ret_type() + .or_else(|| cursor.ret_type()) + .ok_or(ParseError::Continue)) } else { try!(ty.ret_type().ok_or(ParseError::Continue)) }; - let ret = Item::from_ty_or_ref(ty_ret_type, None, None, ctx); + let ret = Item::from_ty_or_ref(ty_ret_type, cursor, None, ctx); let abi = get_abi(ty.call_conv()); if abi.is_none() { - assert_eq!(cursor.kind(), - CXCursor_ObjCInstanceMethodDecl, + assert!(cursor.kind() == CXCursor_ObjCInstanceMethodDecl || + cursor.kind() == CXCursor_ObjCClassMethodDecl, "Invalid ABI for function signature") } @@ -267,9 +332,9 @@ impl ClangSubItemParser for Function { -> Result, ParseError> { use clang_sys::*; match cursor.kind() { - // FIXME(emilio): Generate destructors properly. CXCursor_FunctionDecl | CXCursor_Constructor | + CXCursor_Destructor | CXCursor_CXXMethod => {} _ => return Err(ParseError::Continue), }; @@ -285,7 +350,8 @@ impl ClangSubItemParser for Function { return Err(ParseError::Continue); } - if cursor.is_inlined_function() { + if !context.options().generate_inline_functions && + cursor.is_inlined_function() { return Err(ParseError::Continue); } @@ -296,15 +362,27 @@ impl ClangSubItemParser for Function { } // Grab the signature using Item::from_ty. - let sig = try!(Item::from_ty(&cursor.cur_type(), - Some(cursor), - None, - context)); + let sig = + try!(Item::from_ty(&cursor.cur_type(), cursor, None, context)); - let name = cursor.spelling(); + let mut name = cursor.spelling(); assert!(!name.is_empty(), "Empty function name?"); - let mut mangled_name = cursor_mangling(&cursor); + if cursor.kind() == CXCursor_Destructor { + // Remove the leading `~`. The alternative to this is special-casing + // code-generation for destructor functions, which seems less than + // ideal. + if name.starts_with('~') { + name.remove(0); + } + + // Add a suffix to avoid colliding with constructors. This would be + // technically fine (since we handle duplicated functions/methods), + // but seems easy enough to handle it here. + name.push_str("_destructor"); + } + + let mut mangled_name = cursor_mangling(context, &cursor); if mangled_name.as_ref() == Some(&name) { mangled_name = None; } @@ -322,10 +400,34 @@ impl Trace for FunctionSig { fn trace(&self, _: &BindgenContext, tracer: &mut T, _: &()) where T: Tracer, { - tracer.visit(self.return_type()); + tracer.visit_kind(self.return_type(), EdgeKind::FunctionReturn); for &(_, ty) in self.argument_types() { - tracer.visit(ty); + tracer.visit_kind(ty, EdgeKind::FunctionParameter); + } + } +} + +// Function pointers follow special rules, see: +// +// https://github.com/servo/rust-bindgen/issues/547, +// https://github.com/rust-lang/rust/issues/38848, +// and https://github.com/rust-lang/rust/issues/40158 +// +// Note that copy is always derived, so we don't need to implement it. +impl CanDeriveDebug for FunctionSig { + type Extra = (); + + fn can_derive_debug(&self, _ctx: &BindgenContext, _: ()) -> bool { + const RUST_DERIVE_FUNPTR_LIMIT: usize = 12; + if self.argument_types.len() > RUST_DERIVE_FUNPTR_LIMIT { + return false; + } + + match self.abi { + Some(abi::Abi::C) | + None => true, + _ => false, } } } diff --git a/third_party/rust/bindgen/src/ir/int.rs b/third_party/rust/bindgen/src/ir/int.rs index 89068e0fab5b..a4cb8bc77d2d 100644 --- a/third_party/rust/bindgen/src/ir/int.rs +++ b/third_party/rust/bindgen/src/ir/int.rs @@ -6,12 +6,18 @@ pub enum IntKind { /// A `bool`. Bool, - /// A `char`. - Char, + /// A `signed char`. + SChar, /// An `unsigned char`. UChar, + /// A platform-dependent `char` type, with the signedness support. + Char { + /// Whether the char is signed for the target platform. + is_signed: bool, + }, + /// A `short`. Short, @@ -84,9 +90,11 @@ impl IntKind { Bool | UChar | UShort | UInt | ULong | ULongLong | U8 | U16 | U32 | U64 | U128 => false, - Char | Short | Int | Long | LongLong | I8 | I16 | I32 | I64 | + SChar | Short | Int | Long | LongLong | I8 | I16 | I32 | I64 | I128 => true, + Char { is_signed } => is_signed, + Custom { is_signed, .. } => is_signed, } } @@ -97,7 +105,7 @@ impl IntKind { pub fn known_size(&self) -> Option { use self::IntKind::*; Some(match *self { - Bool | UChar | Char | U8 | I8 => 1, + Bool | UChar | SChar | U8 | I8 | Char { .. } => 1, U16 | I16 => 2, U32 | I32 => 4, U64 | I64 => 8, diff --git a/third_party/rust/bindgen/src/ir/item.rs b/third_party/rust/bindgen/src/ir/item.rs index 8f16a96ff60e..a60697b88994 100644 --- a/third_party/rust/bindgen/src/ir/item.rs +++ b/third_party/rust/bindgen/src/ir/item.rs @@ -3,18 +3,23 @@ use super::annotations::Annotations; use super::context::{BindgenContext, ItemId, PartialType}; use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; +use super::dot::DotAttributes; use super::function::Function; use super::item_kind::ItemKind; +use super::layout::Opaque; use super::module::Module; -use super::traversal::{Trace, Tracer}; -use super::ty::{TemplateDeclaration, Type, TypeKind}; +use super::template::{AsNamed, TemplateParameters}; +use super::traversal::{EdgeKind, Trace, Tracer}; +use super::ty::{Type, TypeKind}; use clang; use clang_sys; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; use std::cell::{Cell, RefCell}; use std::collections::BTreeSet; use std::fmt::Write; +use std::io; use std::iter; +use regex; /// A trait to get the canonical name from an item. /// @@ -65,7 +70,7 @@ pub trait ItemAncestors { } cfg_if! { - if #[cfg(debug_assertions)] { + if #[cfg(testing_only_extra_assertions)] { type DebugOnlyItemSet = ItemSet; } else { struct DebugOnlyItemSet; @@ -118,7 +123,7 @@ impl<'a, 'b> Iterator for ItemAncestorsIter<'a, 'b> } else { self.item = item.parent_id(); - debug_assert!(!self.seen.contains(&item.id())); + extra_assert!(!self.seen.contains(&item.id())); self.seen.insert(item.id()); Some(item.id()) @@ -126,6 +131,35 @@ impl<'a, 'b> Iterator for ItemAncestorsIter<'a, 'b> } } +impl AsNamed for ItemId { + type Extra = (); + + fn as_named(&self, ctx: &BindgenContext, _: &()) -> Option { + ctx.resolve_item(*self).as_named(ctx, &()) + } +} + +impl AsNamed for Item { + type Extra = (); + + fn as_named(&self, ctx: &BindgenContext, _: &()) -> Option { + self.kind.as_named(ctx, self) + } +} + +impl AsNamed for ItemKind { + type Extra = Item; + + fn as_named(&self, ctx: &BindgenContext, item: &Item) -> Option { + match *self { + ItemKind::Type(ref ty) => ty.as_named(ctx, item), + ItemKind::Module(..) | + ItemKind::Function(..) | + ItemKind::Var(..) => None, + } + } +} + // Pure convenience impl ItemCanonicalName for ItemId { fn canonical_name(&self, ctx: &BindgenContext) -> String { @@ -183,9 +217,12 @@ impl Trace for Item { fn trace(&self, ctx: &BindgenContext, tracer: &mut T, _extra: &()) where T: Tracer, { - if self.is_hidden(ctx) { - return; - } + // Even if this item is blacklisted/hidden, we want to trace it. It is + // traversal iterators' consumers' responsibility to filter items as + // needed. Generally, this filtering happens in the implementation of + // `Iterator` for `WhitelistedItems`. Fully tracing blacklisted items is + // necessary for things like the template parameter usage analysis to + // function correctly. match *self.kind() { ItemKind::Type(ref ty) => { @@ -203,7 +240,7 @@ impl Trace for Item { tracer.visit(fun.signature()); } ItemKind::Var(ref var) => { - tracer.visit(var.ty()); + tracer.visit_kind(var.ty(), EdgeKind::VarType); } ItemKind::Module(_) => { // Module -> children edges are "weak", and we do not want to @@ -222,8 +259,14 @@ impl CanDeriveDebug for Item { type Extra = (); fn can_derive_debug(&self, ctx: &BindgenContext, _: ()) -> bool { - ctx.options().derive_debug && - match self.kind { + if self.detect_derive_debug_cycle.get() { + return true; + } + + self.detect_derive_debug_cycle.set(true); + + let result = ctx.options().derive_debug && + match self.kind { ItemKind::Type(ref ty) => { if self.is_opaque(ctx) { ty.layout(ctx) @@ -233,7 +276,11 @@ impl CanDeriveDebug for Item { } } _ => false, - } + }; + + self.detect_derive_debug_cycle.set(false); + + result } } @@ -261,7 +308,13 @@ impl<'a> CanDeriveCopy<'a> for Item { type Extra = (); fn can_derive_copy(&self, ctx: &BindgenContext, _: ()) -> bool { - match self.kind { + if self.detect_derive_copy_cycle.get() { + return true; + } + + self.detect_derive_copy_cycle.set(true); + + let result = match self.kind { ItemKind::Type(ref ty) => { if self.is_opaque(ctx) { ty.layout(ctx) @@ -271,7 +324,11 @@ impl<'a> CanDeriveCopy<'a> for Item { } } _ => false, - } + }; + + self.detect_derive_copy_cycle.set(false); + + result } fn can_derive_copy_in_array(&self, ctx: &BindgenContext, _: ()) -> bool { @@ -344,6 +401,16 @@ pub struct Item { parent_id: ItemId, /// The item kind. kind: ItemKind, + /// Detect cycles when determining if we can derive debug/copy or not, and + /// avoid infinite recursion. + detect_derive_debug_cycle: Cell, + detect_derive_copy_cycle: Cell, +} + +impl AsRef for Item { + fn as_ref(&self) -> &ItemId { + &self.id + } } impl Item { @@ -364,28 +431,28 @@ impl Item { comment: comment, annotations: annotations.unwrap_or_default(), kind: kind, + detect_derive_debug_cycle: Cell::new(false), + detect_derive_copy_cycle: Cell::new(false), } } + /// Construct a new opaque item type. + pub fn new_opaque_type(with_id: ItemId, + ty: &clang::Type, + ctx: &mut BindgenContext) + -> ItemId { + let ty = Opaque::from_clang_ty(ty); + let kind = ItemKind::Type(ty); + let parent = ctx.root_module(); + ctx.add_item(Item::new(with_id, None, None, parent, kind), None, None); + with_id + } + /// Get this `Item`'s identifier. pub fn id(&self) -> ItemId { self.id } - /// Get this `Item`'s dot attributes. - pub fn dot_attributes(&self, ctx: &BindgenContext) -> String { - format!("[fontname=\"courier\", label=< \ - \ - \ - \ - \ -
    ItemId({})
    name{}
    kind{}
    \ - >]", - self.id.as_usize(), - self.name(ctx).get(), - self.kind.kind_name()) - } - /// Get this `Item`'s parent's identifier. /// /// For the root module, the parent's ID is its own ID. @@ -486,184 +553,12 @@ impl Item { self.kind().as_type() } - /// Is this item a named template type parameter? - pub fn is_named(&self) -> bool { - self.as_type() - .map(|ty| ty.is_named()) - .unwrap_or(false) - } - /// Get a reference to this item's underlying `Function`. Panic if this is /// some other kind of item. pub fn expect_function(&self) -> &Function { self.kind().expect_function() } - /// Checks whether an item contains in its "type signature" some named type. - /// - /// This function is used to avoid unused template parameter errors in Rust - /// when generating typedef declarations, and also to know whether we need - /// to generate a `PhantomData` member for a template parameter. - /// - /// For example, in code like the following: - /// - /// ```c++ - /// template - /// struct Foo { - /// T bar; - /// - /// struct Baz { - /// U bas; - /// }; - /// }; - /// ``` - /// - /// Both `Foo` and `Baz` contain both `T` and `U` template parameters in - /// their signature: - /// - /// * `Foo` - /// * `Bar` - /// - /// But the Rust structure for `Foo` would look like: - /// - /// ```rust - /// struct Foo { - /// bar: T, - /// _phantom0: ::std::marker::PhantomData, - /// } - /// ``` - /// - /// because none of its member fields contained the `U` type in the - /// signature. Similarly, `Bar` would contain a `PhantomData` type, for - /// the same reason. - /// - /// Note that this is somewhat similar to `applicable_template_args`, but - /// this also takes into account other kind of types, like arrays, - /// (`[T; 40]`), pointers: `*mut T`, etc... - /// - /// Normally we could do this check just in the `Type` kind, but we also - /// need to check the `applicable_template_args` more generally, since we - /// could need a type transitively from our parent, see the test added in - /// commit 2a3f93074dd2898669dbbce6e97e5cc4405d7cb1. - /// - /// It's kind of unfortunate (in the sense that it's a sort of complex - /// process), but I think it should get all the cases. - fn signature_contains_named_type(&self, - ctx: &BindgenContext, - ty: &Type) - -> bool { - debug_assert!(ty.is_named()); - self.expect_type().signature_contains_named_type(ctx, ty) || - self.applicable_template_args(ctx).iter().any(|template| { - ctx.resolve_type(*template).signature_contains_named_type(ctx, ty) - }) - } - - /// Returns the template arguments that apply to a struct. This is a concept - /// needed because of type declarations inside templates, for example: - /// - /// ```c++ - /// template - /// class Foo { - /// typedef T element_type; - /// typedef int Bar; - /// - /// template - /// class Baz { - /// }; - /// }; - /// ``` - /// - /// In this case, the applicable template arguments for the different types - /// would be: - /// - /// * `Foo`: [`T`] - /// * `Foo::element_type`: [`T`] - /// * `Foo::Bar`: [`T`] - /// * `Foo::Baz`: [`T`, `U`] - /// - /// You might notice that we can't generate something like: - /// - /// ```rust,ignore - /// type Foo_Bar = ::std::os::raw::c_int; - /// ``` - /// - /// since that would be invalid Rust. Still, conceptually, `Bar` *could* use - /// the template parameter type `T`, and that's exactly what this method - /// represents. The unused template parameters get stripped in the - /// `signature_contains_named_type` check. - pub fn applicable_template_args(&self, - ctx: &BindgenContext) - -> Vec { - let ty = match *self.kind() { - ItemKind::Type(ref ty) => ty, - _ => return vec![], - }; - - fn parent_contains(ctx: &BindgenContext, - parent_template_args: &[ItemId], - item: ItemId) - -> bool { - let item_ty = ctx.resolve_type(item); - parent_template_args.iter().any(|parent_item| { - let parent_ty = ctx.resolve_type(*parent_item); - match (parent_ty.kind(), item_ty.kind()) { - (&TypeKind::Named, &TypeKind::Named) => { - parent_ty.name() == item_ty.name() - } - _ => false, - } - }) - } - - match *ty.kind() { - TypeKind::Named => vec![self.id()], - TypeKind::Array(inner, _) | - TypeKind::Pointer(inner) | - TypeKind::Reference(inner) | - TypeKind::ResolvedTypeRef(inner) => { - ctx.resolve_item(inner).applicable_template_args(ctx) - } - TypeKind::Alias(inner) => { - let parent_args = ctx.resolve_item(self.parent_id()) - .applicable_template_args(ctx); - let inner = ctx.resolve_item(inner); - - // Avoid unused type parameters, sigh. - parent_args.iter() - .cloned() - .filter(|arg| { - let arg = ctx.resolve_type(*arg); - arg.is_named() && - inner.signature_contains_named_type(ctx, arg) - }) - .collect() - } - // XXX Is this completely correct? Partial template specialization - // is hard anyways, sigh... - TypeKind::TemplateAlias(_, ref args) | - TypeKind::TemplateInstantiation(_, ref args) => args.clone(), - // In a template specialization we've got all we want. - TypeKind::Comp(ref ci) if ci.is_template_specialization() => { - ci.template_args().iter().cloned().collect() - } - TypeKind::Comp(ref ci) => { - let mut parent_template_args = - ctx.resolve_item(self.parent_id()) - .applicable_template_args(ctx); - - for ty in ci.template_args() { - if !parent_contains(ctx, &parent_template_args, *ty) { - parent_template_args.push(*ty); - } - } - - parent_template_args - } - _ => vec![], - } - } - /// Is this item a module? pub fn is_module(&self) -> bool { match self.kind { @@ -692,6 +587,7 @@ impl Item { debug_assert!(ctx.in_codegen_phase(), "You're not supposed to call this yet"); self.annotations.opaque() || + self.as_type().map_or(false, |ty| ty.is_opaque()) || ctx.opaque_by_name(&self.canonical_path(ctx)) } @@ -721,7 +617,7 @@ impl Item { let mut item = self; loop { - debug_assert!(!targets_seen.contains(&item.id())); + extra_assert!(!targets_seen.contains(&item.id())); targets_seen.insert(item.id()); if self.annotations().use_instead_of().is_some() { @@ -731,19 +627,12 @@ impl Item { match *item.kind() { ItemKind::Type(ref ty) => { match *ty.kind() { - // If we're a template specialization, our name is our - // parent's name. - TypeKind::Comp(ref ci) - if ci.is_template_specialization() => { - let specialized = - ci.specialized_template().unwrap(); - item = ctx.resolve_item(specialized); - } - // Same as above. - TypeKind::ResolvedTypeRef(inner) | - TypeKind::TemplateInstantiation(inner, _) => { + TypeKind::ResolvedTypeRef(inner) => { item = ctx.resolve_item(inner); } + TypeKind::TemplateInstantiation(ref inst) => { + item = ctx.resolve_item(inst.template_definition()); + } _ => return item.id(), } } @@ -857,7 +746,7 @@ impl Item { // Named template type arguments are never namespaced, and never // mangled. - if target.as_type().map_or(false, |ty| ty.is_named()) { + if target.is_named(ctx, &()) { return base_name; } @@ -928,23 +817,45 @@ impl Item { /// A set of items. pub type ItemSet = BTreeSet; -impl TemplateDeclaration for ItemId { - fn template_params(&self, ctx: &BindgenContext) -> Option> { +impl DotAttributes for Item { + fn dot_attributes(&self, + ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write, + { + try!(writeln!(out, + "{:?} + name{}", + self.id, + self.name(ctx).get())); + self.kind.dot_attributes(ctx, out) + } +} + +impl TemplateParameters for ItemId { + fn self_template_params(&self, + ctx: &BindgenContext) + -> Option> { ctx.resolve_item_fallible(*self) - .and_then(|item| item.template_params(ctx)) + .and_then(|item| item.self_template_params(ctx)) } } -impl TemplateDeclaration for Item { - fn template_params(&self, ctx: &BindgenContext) -> Option> { - self.kind.template_params(ctx) +impl TemplateParameters for Item { + fn self_template_params(&self, + ctx: &BindgenContext) + -> Option> { + self.kind.self_template_params(ctx) } } -impl TemplateDeclaration for ItemKind { - fn template_params(&self, ctx: &BindgenContext) -> Option> { +impl TemplateParameters for ItemKind { + fn self_template_params(&self, + ctx: &BindgenContext) + -> Option> { match *self { - ItemKind::Type(ref ty) => ty.template_params(ctx), + ItemKind::Type(ref ty) => ty.self_template_params(ctx), // If we start emitting bindings to explicitly instantiated // functions, then we'll need to check ItemKind::Function for // template params. @@ -968,7 +879,7 @@ fn visit_child(cur: clang::Cursor, return CXChildVisit_Break; } - *result = Item::from_ty_with_id(id, ty, Some(cur), parent_id, ctx); + *result = Item::from_ty_with_id(id, ty, cur, parent_id, ctx); match *result { Ok(..) => CXChildVisit_Break, @@ -1061,8 +972,8 @@ impl ClangItemParser for Item { // twice, handle them separately. { let applicable_cursor = cursor.definition().unwrap_or(cursor); - match Self::from_ty(&applicable_cursor.cur_type(), - Some(applicable_cursor), + match Item::from_ty(&applicable_cursor.cur_type(), + applicable_cursor, parent_id, ctx) { Ok(ty) => return Ok(ty), @@ -1104,7 +1015,7 @@ impl ClangItemParser for Item { } fn from_ty_or_ref(ty: clang::Type, - location: Option, + location: clang::Cursor, parent_id: Option, ctx: &mut BindgenContext) -> ItemId { @@ -1124,7 +1035,7 @@ impl ClangItemParser for Item { /// `BindgenContext::resolve_typerefs`. fn from_ty_or_ref_with_id(potential_id: ItemId, ty: clang::Type, - location: Option, + location: clang::Cursor, parent_id: Option, ctx: &mut BindgenContext) -> ItemId { @@ -1136,16 +1047,20 @@ impl ClangItemParser for Item { if ctx.collected_typerefs() { debug!("refs already collected, resolving directly"); - return Self::from_ty_with_id(potential_id, + return Item::from_ty_with_id(potential_id, &ty, location, parent_id, ctx) - .expect("Unable to resolve type"); + .unwrap_or_else(|_| { + Item::new_opaque_type(potential_id, &ty, ctx) + }); } - if let Some(ty) = - ctx.builtin_or_resolved_ty(potential_id, parent_id, &ty, location) { + if let Some(ty) = ctx.builtin_or_resolved_ty(potential_id, + parent_id, + &ty, + Some(location)) { debug!("{:?} already resolved: {:?}", ty, location); return ty; } @@ -1168,14 +1083,13 @@ impl ClangItemParser for Item { potential_id } - fn from_ty(ty: &clang::Type, - location: Option, + location: clang::Cursor, parent_id: Option, ctx: &mut BindgenContext) -> Result { let id = ctx.next_item_id(); - Self::from_ty_with_id(id, ty, location, parent_id, ctx) + Item::from_ty_with_id(id, ty, location, parent_id, ctx) } /// This is one of the trickiest methods you'll find (probably along with @@ -1188,21 +1102,41 @@ impl ClangItemParser for Item { /// context. fn from_ty_with_id(id: ItemId, ty: &clang::Type, - location: Option, + location: clang::Cursor, parent_id: Option, ctx: &mut BindgenContext) -> Result { use clang_sys::*; + debug!("Item::from_ty_with_id: {:?}\n\ + \tty = {:?},\n\ + \tlocation = {:?}", + id, + ty, + location); + + if ty.kind() == clang_sys::CXType_Unexposed || + location.cur_type().kind() == clang_sys::CXType_Unexposed { + + if ty.is_associated_type() || + location.cur_type().is_associated_type() { + return Ok(Item::new_opaque_type(id, ty, ctx)); + } + + if let Some(id) = Item::named_type(Some(id), location, ctx) { + return Ok(id); + } + } + let decl = { let decl = ty.declaration(); decl.definition().unwrap_or(decl) }; let comment = decl.raw_comment() - .or_else(|| location.as_ref().and_then(|l| l.raw_comment())); + .or_else(|| location.raw_comment()); let annotations = Annotations::new(&decl) - .or_else(|| location.as_ref().and_then(|l| Annotations::new(l))); + .or_else(|| Annotations::new(&location)); if let Some(ref annotations) = annotations { if let Some(ref replaced) = annotations.use_instead_of() { @@ -1211,7 +1145,7 @@ impl ClangItemParser for Item { } if let Some(ty) = - ctx.builtin_or_resolved_ty(id, parent_id, ty, location) { + ctx.builtin_or_resolved_ty(id, parent_id, ty, Some(location)) { return Ok(ty); } @@ -1219,11 +1153,10 @@ impl ClangItemParser for Item { let mut valid_decl = decl.kind() != CXCursor_NoDeclFound; let declaration_to_look_for = if valid_decl { decl.canonical() - } else if location.is_some() && - location.unwrap().kind() == + } else if location.kind() == CXCursor_ClassTemplate { valid_decl = true; - location.unwrap() + location } else { decl }; @@ -1254,51 +1187,47 @@ impl ClangItemParser for Item { relevant_parent_id, ItemKind::Type(item)), declaration, - location); + Some(location)); Ok(id) } Err(ParseError::Continue) => Err(ParseError::Continue), Err(ParseError::Recurse) => { debug!("Item::from_ty recursing in the ast"); let mut result = Err(ParseError::Recurse); - if let Some(ref location) = location { - // Need to pop here, otherwise we'll get stuck. - // - // TODO: Find a nicer interface, really. Also, the - // declaration_to_look_for suspiciously shares a lot of - // logic with ir::context, so we should refactor that. - if valid_decl { - let finished = ctx.finish_parsing(); - assert_eq!(*finished.decl(), declaration_to_look_for); - } - location.visit(|cur| { - visit_child(cur, id, ty, parent_id, ctx, &mut result) - }); - - if valid_decl { - let partial_ty = - PartialType::new(declaration_to_look_for, id); - ctx.begin_parsing(partial_ty); - } + // Need to pop here, otherwise we'll get stuck. + // + // TODO: Find a nicer interface, really. Also, the + // declaration_to_look_for suspiciously shares a lot of + // logic with ir::context, so we should refactor that. + if valid_decl { + let finished = ctx.finish_parsing(); + assert_eq!(*finished.decl(), declaration_to_look_for); } + + location.visit(|cur| { + visit_child(cur, id, ty, parent_id, ctx, &mut result) + }); + + if valid_decl { + let partial_ty = PartialType::new(declaration_to_look_for, + id); + ctx.begin_parsing(partial_ty); + } + // If we have recursed into the AST all we know, and we still - // haven't found what we've got, let's just make a named type. + // haven't found what we've got, let's just try and make a named + // type. // // This is what happens with some template members, for example. - // - // FIXME: Maybe we should restrict this to things with parent? - // It's harmless, but if we restrict that, then - // tests/headers/nsStyleAutoArray.hpp crashes. if let Err(ParseError::Recurse) = result { warn!("Unknown type, assuming named template type: \ id = {:?}; spelling = {}", id, ty.spelling()); - Ok(Self::named_type_with_id(id, - ty.spelling(), - relevant_parent_id, - ctx)) + Item::named_type(Some(id), location, ctx) + .map(Ok) + .unwrap_or(Err(ParseError::Recurse)) } else { result } @@ -1316,40 +1245,161 @@ impl ClangItemParser for Item { /// A named type is a template parameter, e.g., the "T" in Foo. They're /// always local so it's the only exception when there's no declaration for /// a type. - /// - /// It must have an id, and must not be the current module id. Ideally we - /// could assert the parent id is a Comp(..) type, but that info isn't - /// available yet. - fn named_type_with_id(id: ItemId, - name: S, - parent_id: ItemId, - ctx: &mut BindgenContext) - -> ItemId - where S: Into, - { - // see tests/headers/const_tparam.hpp - // and tests/headers/variadic_tname.hpp - let name = name.into().replace("const ", "").replace(".", ""); + fn named_type(with_id: Option, + location: clang::Cursor, + ctx: &mut BindgenContext) + -> Option { + let ty = location.cur_type(); - ctx.add_item(Item::new(id, - None, - None, - parent_id, - ItemKind::Type(Type::named(name))), - None, - None); + debug!("Item::named_type:\n\ + \twith_id = {:?},\n\ + \tty = {} {:?},\n\ + \tlocation: {:?}", + with_id, + ty.spelling(), + ty, + location); - id - } + if ty.kind() != clang_sys::CXType_Unexposed { + // If the given cursor's type's kind is not Unexposed, then we + // aren't looking at a template parameter. This check may need to be + // updated in the future if they start properly exposing template + // type parameters. + return None; + } - fn named_type(name: S, - parent_id: ItemId, - ctx: &mut BindgenContext) - -> ItemId - where S: Into, - { - let id = ctx.next_item_id(); - Self::named_type_with_id(id, name, parent_id, ctx) + let ty_spelling = ty.spelling(); + + // Clang does not expose any information about template type parameters + // via their clang::Type, nor does it give us their canonical cursors + // the straightforward way. However, there are three situations from + // which we can find the definition of the template type parameter, if + // the cursor is indeed looking at some kind of a template type + // parameter or use of one: + // + // 1. The cursor is pointing at the template type parameter's + // definition. This is the trivial case. + // + // (kind = TemplateTypeParameter, ...) + // + // 2. The cursor is pointing at a TypeRef whose referenced() cursor is + // situation (1). + // + // (kind = TypeRef, + // referenced = (kind = TemplateTypeParameter, ...), + // ...) + // + // 3. The cursor is pointing at some use of a template type parameter + // (for example, in a FieldDecl), and this cursor has a child cursor + // whose spelling is the same as the parent's type's spelling, and whose + // kind is a TypeRef of the situation (2) variety. + // + // (kind = FieldDecl, + // type = (kind = Unexposed, + // spelling = "T", + // ...), + // children = + // (kind = TypeRef, + // spelling = "T", + // referenced = (kind = TemplateTypeParameter, + // spelling = "T", + // ...), + // ...) + // ...) + // + // TODO: The alternative to this hacky pattern matching would be to + // maintain proper scopes of template parameters while parsing and use + // de Brujin indices to access template parameters, which clang exposes + // in the cursor's type's canonical type's spelling: + // "type-parameter-x-y". That is probably a better approach long-term, + // but maintaining these scopes properly would require more changes to + // the whole libclang -> IR parsing code. + + fn is_template_with_spelling(refd: &clang::Cursor, + spelling: &str) + -> bool { + lazy_static! { + static ref ANON_TYPE_PARAM_RE: regex::Regex = + regex::Regex::new(r"^type\-parameter\-\d+\-\d+$").unwrap(); + } + + if refd.kind() != clang_sys::CXCursor_TemplateTypeParameter { + return false; + } + + let refd_spelling = refd.spelling(); + refd_spelling == spelling || + // Allow for anonymous template parameters. + (refd_spelling.is_empty() && ANON_TYPE_PARAM_RE.is_match(spelling.as_ref())) + } + + let definition = if is_template_with_spelling(&location, + &ty_spelling) { + // Situation (1) + location + } else if location.kind() == + clang_sys::CXCursor_TypeRef { + // Situation (2) + match location.referenced() { + Some(refd) if is_template_with_spelling(&refd, + &ty_spelling) => refd, + _ => return None, + } + } else { + // Situation (3) + let mut definition = None; + + location.visit(|child| { + let child_ty = child.cur_type(); + if child_ty.kind() == clang_sys::CXCursor_TypeRef && + child_ty.spelling() == ty_spelling { + match child.referenced() { + Some(refd) if is_template_with_spelling(&refd, &ty_spelling) => { + definition = Some(refd); + return clang_sys::CXChildVisit_Break; + } + _ => {} + } + } + + clang_sys::CXChildVisit_Continue + }); + + if let Some(def) = definition { + def + } else { + return None; + } + }; + assert!(is_template_with_spelling(&definition, &ty_spelling)); + + // Named types are always parented to the root module. They are never + // referenced with namespace prefixes, and they can't inherit anything + // from their parent either, so it is simplest to just hang them off + // something we know will always exist. + let parent = ctx.root_module(); + + if let Some(id) = ctx.get_named_type(&definition) { + if let Some(with_id) = with_id { + return Some(ctx.build_ty_wrapper(with_id, id, Some(parent), &ty)); + } else { + return Some(id); + } + } + + // See tests/headers/const_tparam.hpp and + // tests/headers/variadic_tname.hpp. + let name = ty_spelling.replace("const ", "") + .replace(".", ""); + + let id = with_id.unwrap_or_else(|| ctx.next_item_id()); + let item = Item::new(id, + None, + None, + parent, + ItemKind::Type(Type::named(name))); + ctx.add_named_type(item, definition); + Some(id) } } diff --git a/third_party/rust/bindgen/src/ir/item_kind.rs b/third_party/rust/bindgen/src/ir/item_kind.rs index 3ff0673169d4..419f9d4421d8 100644 --- a/third_party/rust/bindgen/src/ir/item_kind.rs +++ b/third_party/rust/bindgen/src/ir/item_kind.rs @@ -1,9 +1,12 @@ //! Different variants of an `Item` in our intermediate representation. +use super::context::BindgenContext; +use super::dot::DotAttributes; use super::function::Function; use super::module::Module; use super::ty::Type; use super::var::Var; +use std::io; /// A item we parse and translate. #[derive(Debug)] @@ -38,8 +41,8 @@ impl ItemKind { ItemKind::Module(..) => "Module", ItemKind::Type(..) => "Type", ItemKind::Function(..) => "Function", - ItemKind::Var(..) => "Var" - } + ItemKind::Var(..) => "Var", + } } /// Is this a module? @@ -122,3 +125,23 @@ impl ItemKind { self.as_var().expect("Not a var") } } + +impl DotAttributes for ItemKind { + fn dot_attributes(&self, + ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write, + { + try!(writeln!(out, + "kind{}", + self.kind_name())); + + match *self { + ItemKind::Module(ref module) => module.dot_attributes(ctx, out), + ItemKind::Type(ref ty) => ty.dot_attributes(ctx, out), + ItemKind::Function(ref func) => func.dot_attributes(ctx, out), + ItemKind::Var(ref var) => var.dot_attributes(ctx, out), + } + } +} diff --git a/third_party/rust/bindgen/src/ir/layout.rs b/third_party/rust/bindgen/src/ir/layout.rs index 3837926107a5..21382b2d9947 100644 --- a/third_party/rust/bindgen/src/ir/layout.rs +++ b/third_party/rust/bindgen/src/ir/layout.rs @@ -2,7 +2,8 @@ use super::context::BindgenContext; use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; -use super::ty::RUST_DERIVE_IN_ARRAY_LIMIT; +use super::ty::{RUST_DERIVE_IN_ARRAY_LIMIT, Type, TypeKind}; +use clang; use std::{cmp, mem}; /// A type that represents the struct layout of a type. @@ -20,7 +21,8 @@ pub struct Layout { fn test_layout_for_size() { let ptr_size = mem::size_of::<*mut ()>(); assert_eq!(Layout::for_size(ptr_size), Layout::new(ptr_size, ptr_size)); - assert_eq!(Layout::for_size(3 * ptr_size), Layout::new(3 * ptr_size, ptr_size)); + assert_eq!(Layout::for_size(3 * ptr_size), + Layout::new(3 * ptr_size, ptr_size)); } impl Layout { @@ -38,7 +40,8 @@ impl Layout { /// alignment possible. pub fn for_size(size: usize) -> Self { let mut next_align = 2; - while size % next_align == 0 && next_align <= 2 * mem::size_of::<*mut ()>() { + while size % next_align == 0 && + next_align <= mem::size_of::<*mut ()>() { next_align *= 2; } Layout { @@ -65,9 +68,17 @@ impl Layout { } /// When we are treating a type as opaque, it is just a blob with a `Layout`. +#[derive(Clone, Debug, PartialEq)] pub struct Opaque(pub Layout); impl Opaque { + /// Construct a new opaque type from the given clang type. + pub fn from_clang_ty(ty: &clang::Type) -> Type { + let layout = Layout::new(ty.size(), ty.align()); + let ty_kind = TypeKind::Opaque; + Type::new(None, Some(layout), ty_kind, false) + } + /// Return the known rust type we should use to create a correctly-aligned /// field with this layout. pub fn known_rust_type_for_array(&self) -> Option<&'static str> { diff --git a/third_party/rust/bindgen/src/ir/mod.rs b/third_party/rust/bindgen/src/ir/mod.rs index e624e46bd236..d703e53dbbc5 100644 --- a/third_party/rust/bindgen/src/ir/mod.rs +++ b/third_party/rust/bindgen/src/ir/mod.rs @@ -7,6 +7,7 @@ pub mod annotations; pub mod comp; pub mod context; pub mod derive; +pub mod dot; pub mod enum_ty; pub mod function; pub mod int; @@ -15,6 +16,7 @@ pub mod item_kind; pub mod layout; pub mod module; pub mod named; +pub mod template; pub mod traversal; pub mod ty; pub mod var; diff --git a/third_party/rust/bindgen/src/ir/module.rs b/third_party/rust/bindgen/src/ir/module.rs index 6b6c535bc797..ee3912c5f119 100644 --- a/third_party/rust/bindgen/src/ir/module.rs +++ b/third_party/rust/bindgen/src/ir/module.rs @@ -1,9 +1,11 @@ //! Intermediate representation for modules (AKA C++ namespaces). use super::context::{BindgenContext, ItemId}; +use super::dot::DotAttributes; use clang; use parse::{ClangSubItemParser, ParseError, ParseResult}; use parse_one; +use std::io; /// Whether this module is inline or not. #[derive(Debug, Copy, Clone, PartialEq, Eq)] @@ -56,6 +58,17 @@ impl Module { } } +impl DotAttributes for Module { + fn dot_attributes(&self, + _ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write, + { + writeln!(out, "ModuleKind{:?}", self.kind) + } +} + impl ClangSubItemParser for Module { fn parse(cursor: clang::Cursor, ctx: &mut BindgenContext) diff --git a/third_party/rust/bindgen/src/ir/named.rs b/third_party/rust/bindgen/src/ir/named.rs index 7a6c597ca281..943d3a574852 100644 --- a/third_party/rust/bindgen/src/ir/named.rs +++ b/third_party/rust/bindgen/src/ir/named.rs @@ -76,23 +76,63 @@ //! fixed-point. //! //! We use the "monotone framework" for this fix-point analysis where our -//! lattice is the powerset of the template parameters that appear in the input -//! C++ header, our join function is set union, and we use the -//! `ir::traversal::Trace` trait to implement the work-list optimization so we -//! don't have to revisit every node in the graph when for every iteration -//! towards the fix-point. +//! lattice is the mapping from each IR item to the powerset of the template +//! parameters that appear in the input C++ header, our join function is set +//! union, and we use the `ir::traversal::Trace` trait to implement the +//! work-list optimization so we don't have to revisit every node in the graph +//! when for every iteration towards the fix-point. +//! +//! A lattice is a set with a partial ordering between elements, where there is +//! a single least upper bound and a single greatest least bound for every +//! subset. We are dealing with finite lattices, which means that it has a +//! finite number of elements, and it follows that there exists a single top and +//! a single bottom member of the lattice. For example, the power set of a +//! finite set forms a finite lattice where partial ordering is defined by set +//! inclusion, that is `a <= b` if `a` is a subset of `b`. Here is the finite +//! lattice constructed from the set {0,1,2}: +//! +//! ```text +//! .----- Top = {0,1,2} -----. +//! / | \ +//! / | \ +//! / | \ +//! {0,1} -------. {0,2} .--------- {1,2} +//! | \ / \ / | +//! | / \ | +//! | / \ / \ | +//! {0} --------' {1} `---------- {2} +//! \ | / +//! \ | / +//! \ | / +//! `------ Bottom = {} ------' +//! ``` +//! +//! A monotone function `f` is a function where if `x <= y`, then it holds that +//! `f(x) <= f(y)`. It should be clear that running a monotone function to a +//! fix-point on a finite lattice will always terminate: `f` can only "move" +//! along the lattice in a single direction, and therefore can only either find +//! a fix-point in the middle of the lattice or continue to the top or bottom +//! depending if it is ascending or descending the lattice respectively. +//! +//! For our analysis, we are collecting the set of template parameters used by +//! any given IR node. The set of template parameters appearing in the program +//! is finite. Our lattice is their powerset. We start at the bottom element, +//! the empty set. Our analysis only adds members to the set of used template +//! parameters, never removes them, so it is monotone, and therefore iteration +//! to a fix-point will terminate. //! //! For a deeper introduction to the general form of this kind of analysis, see //! [Static Program Analysis by Anders Møller and Michael I. Schwartzbach][spa]. //! //! [spa]: https://cs.au.dk/~amoeller/spa/spa.pdf -use std::collections::HashMap; -use std::fmt; use super::context::{BindgenContext, ItemId}; -use super::item::ItemSet; +use super::item::{Item, ItemSet}; +use super::template::{TemplateInstantiation, TemplateParameters}; use super::traversal::{EdgeKind, Trace}; -use super::ty::{TemplateDeclaration, TypeKind}; +use super::ty::TypeKind; +use std::collections::{HashMap, HashSet}; +use std::fmt; /// An analysis in the monotone framework. /// @@ -124,7 +164,7 @@ pub trait MonotoneFramework: Sized + fmt::Debug { /// The final output of this analysis. Once we have reached a fix-point, we /// convert `self` into this type, and return it as the final result of the /// analysis. - type Output: From; + type Output: From + fmt::Debug; /// Construct a new instance of this analysis. fn new(extra: Self::Extra) -> Self; @@ -152,12 +192,8 @@ pub trait MonotoneFramework: Sized + fmt::Debug { } /// Run an analysis in the monotone framework. -// TODO: This allow(...) is just temporary until we replace -// `Item::signature_contains_named_type` with -// `analyze::`. -#[allow(dead_code)] pub fn analyze(extra: Analysis::Extra) -> Analysis::Output - where Analysis: MonotoneFramework + where Analysis: MonotoneFramework, { let mut analysis = Analysis::new(extra); let mut worklist = analysis.initial_worklist(); @@ -173,129 +209,453 @@ pub fn analyze(extra: Analysis::Extra) -> Analysis::Output analysis.into() } -/// An analysis that finds the set of template parameters that actually end up -/// used in our generated bindings. +/// An analysis that finds for each IR item its set of template parameters that +/// it uses. +/// +/// We use the monotone constraint function `template_param_usage`, defined as +/// follows: +/// +/// * If `T` is a named template type parameter, it trivially uses itself: +/// +/// ```ignore +/// template_param_usage(T) = { T } +/// ``` +/// +/// * If `inst` is a template instantiation, `inst.args` are the template +/// instantiation's template arguments, `inst.def` is the template definition +/// being instantiated, and `inst.def.params` is the template definition's +/// template parameters, then the instantiation's usage is the union of each +/// of its arguments' usages *if* the corresponding template parameter is in +/// turn used by the template definition: +/// +/// ```ignore +/// template_param_usage(inst) = union( +/// template_param_usage(inst.args[i]) +/// for i in 0..length(inst.args.length) +/// if inst.def.params[i] in template_param_usage(inst.def) +/// ) +/// ``` +/// +/// * Finally, for all other IR item kinds, we use our lattice's `join` +/// operation: set union with each successor of the given item's template +/// parameter usage: +/// +/// ```ignore +/// template_param_usage(v) = +/// union(template_param_usage(w) for w in successors(v)) +/// ``` +/// +/// Note that we ignore certain edges in the graph, such as edges from a +/// template declaration to its template parameters' definitions for this +/// analysis. If we didn't, then we would mistakenly determine that ever +/// template parameter is always used. +/// +/// The final wrinkle is handling of blacklisted types. Normally, we say that +/// the set of whitelisted items is the transitive closure of items explicitly +/// called out for whitelisting, *without* any items explicitly called out as +/// blacklisted. However, for the purposes of this analysis's correctness, we +/// simplify and consider run the analysis on the full transitive closure of +/// whitelisted items. We do, however, treat instantiations of blacklisted items +/// specially; see `constrain_instantiation_of_blacklisted_template` and its +/// documentation for details. #[derive(Debug, Clone)] -pub struct UsedTemplateParameters<'a> { - ctx: &'a BindgenContext<'a>, - used: ItemSet, +pub struct UsedTemplateParameters<'ctx, 'gen> + where 'gen: 'ctx, +{ + ctx: &'ctx BindgenContext<'gen>, + + // The Option is only there for temporary moves out of the hash map. See the + // comments in `UsedTemplateParameters::constrain` below. + used: HashMap>, + dependencies: HashMap>, + + // The set of whitelisted items, without any blacklisted items reachable + // from the whitelisted items which would otherwise be considered + // whitelisted as well. + whitelisted_items: HashSet, } -impl<'a> MonotoneFramework for UsedTemplateParameters<'a> { +impl<'ctx, 'gen> UsedTemplateParameters<'ctx, 'gen> { + fn consider_edge(kind: EdgeKind) -> bool { + match kind { + // For each of these kinds of edges, if the referent uses a template + // parameter, then it should be considered that the origin of the + // edge also uses the template parameter. + EdgeKind::TemplateArgument | + EdgeKind::BaseMember | + EdgeKind::Field | + EdgeKind::Constructor | + EdgeKind::VarType | + EdgeKind::FunctionReturn | + EdgeKind::FunctionParameter | + EdgeKind::TypeReference => true, + + // An inner var or type using a template parameter is orthogonal + // from whether we use it. See template-param-usage-{6,11}.hpp. + EdgeKind::InnerVar | EdgeKind::InnerType => false, + + // We can't emit machine code for new monomorphizations of class + // templates' methods (and don't detect explicit instantiations) so + // we must ignore template parameters that are only used by + // methods. This doesn't apply to a function type's return or + // parameter types, however, because of type aliases of function + // pointers that use template parameters, eg + // tests/headers/struct_with_typedef_template_arg.hpp + EdgeKind::Method => false, + + // If we considered these edges, we would end up mistakenly claiming + // that every template parameter always used. + EdgeKind::TemplateDeclaration | + EdgeKind::TemplateParameterDefinition => false, + + // Since we have to be careful about which edges we consider for + // this analysis to be correct, we ignore generic edges. We also + // avoid a `_` wild card to force authors of new edge kinds to + // determine whether they need to be considered by this analysis. + EdgeKind::Generic => false, + } + } + + fn take_this_id_usage_set(&mut self, this_id: ItemId) -> ItemSet { + self.used + .get_mut(&this_id) + .expect("Should have a set of used template params for every item \ + id") + .take() + .expect("Should maintain the invariant that all used template param \ + sets are `Some` upon entry of `constrain`") + } + + /// We say that blacklisted items use all of their template parameters. The + /// blacklisted type is most likely implemented explicitly by the user, + /// since it won't be in the generated bindings, and we don't know exactly + /// what they'll to with template parameters, but we can push the issue down + /// the line to them. + fn constrain_instantiation_of_blacklisted_template(&self, + this_id: ItemId, + used_by_this_id: &mut ItemSet, + instantiation: &TemplateInstantiation) { + trace!(" instantiation of blacklisted template, uses all template \ + arguments"); + + let args = instantiation.template_arguments() + .into_iter() + .map(|a| { + a.into_resolver() + .through_type_refs() + .through_type_aliases() + .resolve(self.ctx) + .id() + }) + .filter(|a| *a != this_id) + .flat_map(|a| { + self.used.get(&a) + .expect("Should have a used entry for the template arg") + .as_ref() + .expect("Because a != this_id, and all used template \ + param sets other than this_id's are `Some`, \ + a's used template param set should be `Some`") + .iter() + .cloned() + }); + + used_by_this_id.extend(args); + } + + /// A template instantiation's concrete template argument is only used if + /// the template definition uses the corresponding template parameter. + fn constrain_instantiation(&self, + this_id: ItemId, + used_by_this_id: &mut ItemSet, + instantiation: &TemplateInstantiation) { + trace!(" template instantiation"); + + let decl = self.ctx.resolve_type(instantiation.template_definition()); + let args = instantiation.template_arguments(); + + let params = decl.self_template_params(self.ctx) + .unwrap_or(vec![]); + + debug_assert!(this_id != instantiation.template_definition()); + let used_by_def = self.used + .get(&instantiation.template_definition()) + .expect("Should have a used entry for instantiation's template definition") + .as_ref() + .expect("And it should be Some because only this_id's set is None, and an \ + instantiation's template definition should never be the \ + instantiation itself"); + + for (arg, param) in args.iter().zip(params.iter()) { + trace!(" instantiation's argument {:?} is used if definition's \ + parameter {:?} is used", + arg, + param); + + if used_by_def.contains(param) { + trace!(" param is used by template definition"); + + let arg = arg.into_resolver() + .through_type_refs() + .through_type_aliases() + .resolve(self.ctx) + .id(); + + if arg == this_id { + continue; + } + + let used_by_arg = self.used + .get(&arg) + .expect("Should have a used entry for the template arg") + .as_ref() + .expect("Because arg != this_id, and all used template \ + param sets other than this_id's are `Some`, \ + arg's used template param set should be \ + `Some`") + .iter() + .cloned(); + used_by_this_id.extend(used_by_arg); + } + } + } + + /// The join operation on our lattice: the set union of all of this id's + /// successors. + fn constrain_join(&self, used_by_this_id: &mut ItemSet, item: &Item) { + trace!(" other item: join with successors' usage"); + + item.trace(self.ctx, &mut |sub_id, edge_kind| { + // Ignore ourselves, since union with ourself is a + // no-op. Ignore edges that aren't relevant to the + // analysis. + if sub_id == item.id() || !Self::consider_edge(edge_kind) { + return; + } + + let used_by_sub_id = self.used + .get(&sub_id) + .expect("Should have a used set for the sub_id successor") + .as_ref() + .expect("Because sub_id != id, and all used template \ + param sets other than id's are `Some`, \ + sub_id's used template param set should be \ + `Some`") + .iter() + .cloned(); + + trace!(" union with {:?}'s usage: {:?}", + sub_id, + used_by_sub_id.clone().collect::>()); + + used_by_this_id.extend(used_by_sub_id); + }, &()); + } +} + +impl<'ctx, 'gen> MonotoneFramework for UsedTemplateParameters<'ctx, 'gen> { type Node = ItemId; - type Extra = &'a BindgenContext<'a>; - type Output = ItemSet; + type Extra = &'ctx BindgenContext<'gen>; + type Output = HashMap; - fn new(ctx: &'a BindgenContext<'a>) -> UsedTemplateParameters<'a> { + fn new(ctx: &'ctx BindgenContext<'gen>) + -> UsedTemplateParameters<'ctx, 'gen> { + let mut used = HashMap::new(); let mut dependencies = HashMap::new(); + let whitelisted_items: HashSet<_> = ctx.whitelisted_items().collect(); + + let whitelisted_and_blacklisted_items: ItemSet = whitelisted_items.iter() + .cloned() + .flat_map(|i| { + let mut reachable = vec![i]; + i.trace(ctx, &mut |s, _| { + reachable.push(s); + }, &()); + reachable + }) + .collect(); + + for item in whitelisted_and_blacklisted_items { + dependencies.entry(item).or_insert(vec![]); + used.entry(item).or_insert(Some(ItemSet::new())); - for item in ctx.whitelisted_items() { { // We reverse our natural IR graph edges to find dependencies // between nodes. - let mut add_reverse_edge = |sub_item, _| { - dependencies.entry(sub_item).or_insert(vec![]).push(item); - }; - item.trace(ctx, &mut add_reverse_edge, &()); + item.trace(ctx, &mut |sub_item: ItemId, _| { + used.entry(sub_item).or_insert(Some(ItemSet::new())); + dependencies.entry(sub_item) + .or_insert(vec![]) + .push(item); + }, &()); } // Additionally, whether a template instantiation's template // arguments are used depends on whether the template declaration's // generic template parameters are used. - ctx.resolve_item_fallible(item) - .and_then(|item| item.as_type()) + ctx.resolve_item(item) + .as_type() .map(|ty| match ty.kind() { - &TypeKind::TemplateInstantiation(decl, ref args) => { - let decl = ctx.resolve_type(decl); - let params = decl.template_params(ctx) - .expect("a template instantiation's referenced \ - template declaration should have template \ - parameters"); + &TypeKind::TemplateInstantiation(ref inst) => { + let decl = ctx.resolve_type(inst.template_definition()); + let args = inst.template_arguments(); + + // Although template definitions should always have + // template parameters, there is a single exception: + // opaque templates. Hence the unwrap_or. + let params = decl.self_template_params(ctx) + .unwrap_or(vec![]); + for (arg, param) in args.iter().zip(params.iter()) { - dependencies.entry(*arg).or_insert(vec![]).push(*param); + let arg = arg.into_resolver() + .through_type_aliases() + .through_type_refs() + .resolve(ctx) + .id(); + + let param = param.into_resolver() + .through_type_aliases() + .through_type_refs() + .resolve(ctx) + .id(); + + used.entry(arg).or_insert(Some(ItemSet::new())); + used.entry(param).or_insert(Some(ItemSet::new())); + + dependencies.entry(arg) + .or_insert(vec![]) + .push(param); } } _ => {} }); } + if cfg!(feature = "testing_only_extra_assertions") { + // Invariant: The `used` map has an entry for every whitelisted + // item, as well as all explicitly blacklisted items that are + // reachable from whitelisted items. + // + // Invariant: the `dependencies` map has an entry for every + // whitelisted item. + // + // (This is so that every item we call `constrain` on is guaranteed + // to have a set of template parameters, and we can allow + // blacklisted templates to use all of their parameters). + for item in whitelisted_items.iter() { + extra_assert!(used.contains_key(item)); + extra_assert!(dependencies.contains_key(item)); + item.trace(ctx, &mut |sub_item, _| { + extra_assert!(used.contains_key(&sub_item)); + extra_assert!(dependencies.contains_key(&sub_item)); + }, &()) + } + } + UsedTemplateParameters { ctx: ctx, - used: ItemSet::new(), + used: used, dependencies: dependencies, + whitelisted_items: whitelisted_items, } } - fn initial_worklist(&self) -> Vec { - self.ctx.whitelisted_items().collect() + fn initial_worklist(&self) -> Vec { + // The transitive closure of all whitelisted items, including explicitly + // blacklisted items. + self.ctx + .whitelisted_items() + .flat_map(|i| { + let mut reachable = vec![i]; + i.trace(self.ctx, &mut |s, _| { + reachable.push(s); + }, &()); + reachable + }) + .collect() } - fn constrain(&mut self, item: ItemId) -> bool { - let original_size = self.used.len(); + fn constrain(&mut self, id: ItemId) -> bool { + // Invariant: all hash map entries' values are `Some` upon entering and + // exiting this method. + extra_assert!(self.used.values().all(|v| v.is_some())); - item.trace(self.ctx, &mut |item, edge_kind| { - if edge_kind == EdgeKind::TemplateParameterDefinition { - // The definition of a template parameter is not considered a - // use of said template parameter. Ignore this edge. - return; + // Take the set for this id out of the hash map while we mutate it based + // on other hash map entries. We *must* put it back into the hash map at + // the end of this method. This allows us to side-step HashMap's lack of + // an analog to slice::split_at_mut. + let mut used_by_this_id = self.take_this_id_usage_set(id); + + trace!("constrain {:?}", id); + trace!(" initially, used set is {:?}", used_by_this_id); + + let original_len = used_by_this_id.len(); + + let item = self.ctx.resolve_item(id); + let ty_kind = item.as_type().map(|ty| ty.kind()); + match ty_kind { + // Named template type parameters trivially use themselves. + Some(&TypeKind::Named) => { + trace!(" named type, trivially uses itself"); + used_by_this_id.insert(id); } - - let ty_kind = self.ctx.resolve_item(item) - .as_type() - .map(|ty| ty.kind()); - - match ty_kind { - Some(&TypeKind::Named) => { - // This is a "trivial" use of the template type parameter. - self.used.insert(item); - }, - Some(&TypeKind::TemplateInstantiation(decl, ref args)) => { - // A template instantiation's concrete template argument is - // only used if the template declaration uses the - // corresponding template parameter. - let decl = self.ctx.resolve_type(decl); - let params = decl.template_params(self.ctx) - .expect("a template instantiation's referenced \ - template declaration should have template \ - parameters"); - for (arg, param) in args.iter().zip(params.iter()) { - if self.used.contains(param) { - if self.ctx.resolve_item(*arg).is_named() { - self.used.insert(*arg); - } - } - } - }, - _ => return, + // Template instantiations only use their template arguments if the + // template definition uses the corresponding template parameter. + Some(&TypeKind::TemplateInstantiation(ref inst)) => { + if self.whitelisted_items.contains(&inst.template_definition()) { + self.constrain_instantiation(id, &mut used_by_this_id, inst); + } else { + self.constrain_instantiation_of_blacklisted_template(id, + &mut used_by_this_id, + inst); + } } - }, &()); + // Otherwise, add the union of each of its referent item's template + // parameter usage. + _ => self.constrain_join(&mut used_by_this_id, item), + } - let new_size = self.used.len(); - new_size != original_size + trace!(" finally, used set is {:?}", used_by_this_id); + + let new_len = used_by_this_id.len(); + assert!(new_len >= original_len, + "This is the property that ensures this function is monotone -- \ + if it doesn't hold, the analysis might never terminate!"); + + // Put the set back in the hash map and restore our invariant. + debug_assert!(self.used[&id].is_none()); + self.used.insert(id, Some(used_by_this_id)); + extra_assert!(self.used.values().all(|v| v.is_some())); + + new_len != original_len } fn each_depending_on(&self, item: ItemId, mut f: F) - where F: FnMut(Self::Node) + where F: FnMut(ItemId), { if let Some(edges) = self.dependencies.get(&item) { for item in edges { + trace!("enqueue {:?} into worklist", item); f(*item); } } } } -impl<'a> From> for ItemSet { - fn from(used_templ_params: UsedTemplateParameters) -> ItemSet { +impl<'ctx, 'gen> From> + for HashMap { + fn from(used_templ_params: UsedTemplateParameters<'ctx, 'gen>) -> Self { used_templ_params.used + .into_iter() + .map(|(k, v)| (k, v.unwrap())) + .collect() } } #[cfg(test)] mod tests { - use std::collections::{HashMap, HashSet}; use super::*; + use std::collections::{HashMap, HashSet}; // Here we find the set of nodes that are reachable from any given // node. This is a lattice mapping nodes to subsets of all nodes. Our join @@ -361,7 +721,7 @@ mod tests { g.0.insert(Node(8), vec![]); g } - + fn reverse(&self) -> Graph { let mut reversed = Graph::default(); for (node, edges) in self.0.iter() { @@ -409,8 +769,9 @@ mod tests { // Yes, what follows is a **terribly** inefficient set union // implementation. Don't copy this code outside of this test! - let original_size = self.reachable.entry(node).or_insert(HashSet::new()).len(); - + let original_size = + self.reachable.entry(node).or_insert(HashSet::new()).len(); + for sub_node in self.graph.0[&node].iter() { self.reachable.get_mut(&node).unwrap().insert(*sub_node); @@ -429,7 +790,7 @@ mod tests { } fn each_depending_on(&self, node: Node, mut f: F) - where F: FnMut(Node) + where F: FnMut(Node), { for dep in self.reversed.0[&node].iter() { f(*dep); @@ -450,19 +811,19 @@ mod tests { println!("reachable = {:#?}", reachable); fn nodes
    (nodes: A) -> HashSet - where A: AsRef<[usize]> + where A: AsRef<[usize]>, { nodes.as_ref().iter().cloned().map(Node).collect() } let mut expected = HashMap::new(); - expected.insert(Node(1), nodes([3,4,5,6,7,8])); + expected.insert(Node(1), nodes([3, 4, 5, 6, 7, 8])); expected.insert(Node(2), nodes([2])); - expected.insert(Node(3), nodes([3,4,5,6,7,8])); - expected.insert(Node(4), nodes([3,4,5,6,7,8])); - expected.insert(Node(5), nodes([3,4,5,6,7,8])); + expected.insert(Node(3), nodes([3, 4, 5, 6, 7, 8])); + expected.insert(Node(4), nodes([3, 4, 5, 6, 7, 8])); + expected.insert(Node(5), nodes([3, 4, 5, 6, 7, 8])); expected.insert(Node(6), nodes([8])); - expected.insert(Node(7), nodes([3,4,5,6,7,8])); + expected.insert(Node(7), nodes([3, 4, 5, 6, 7, 8])); expected.insert(Node(8), nodes([])); println!("expected = {:#?}", expected); diff --git a/third_party/rust/bindgen/src/ir/objc.rs b/third_party/rust/bindgen/src/ir/objc.rs index b3c3688b3709..3a88eef8ab64 100644 --- a/third_party/rust/bindgen/src/ir/objc.rs +++ b/third_party/rust/bindgen/src/ir/objc.rs @@ -1,27 +1,42 @@ //! Objective C types -use super::context::BindgenContext; +use super::context::{BindgenContext, ItemId}; use super::function::FunctionSig; +use super::traversal::{Trace, Tracer}; +use super::ty::TypeKind; use clang; use clang_sys::CXChildVisit_Continue; +use clang_sys::CXCursor_ObjCCategoryDecl; +use clang_sys::CXCursor_ObjCClassMethodDecl; +use clang_sys::CXCursor_ObjCClassRef; use clang_sys::CXCursor_ObjCInstanceMethodDecl; +use clang_sys::CXCursor_ObjCProtocolDecl; +use clang_sys::CXCursor_ObjCProtocolRef; /// Objective C interface as used in TypeKind /// -/// Also protocols are parsed as this type +/// Also protocols and categories are parsed as this type #[derive(Debug)] pub struct ObjCInterface { /// The name /// like, NSObject name: String, + category: Option, + + is_protocol: bool, + + conforms_to: Vec, + /// List of the methods defined in this interfae - methods: Vec, + methods: Vec, + + class_methods: Vec, } /// The objective c methods #[derive(Debug)] -pub struct ObjCInstanceMethod { +pub struct ObjCMethod { /// The original method selector name /// like, dataWithBytes:length: name: String, @@ -31,13 +46,20 @@ pub struct ObjCInstanceMethod { rust_name: String, signature: FunctionSig, + + /// Is class method? + is_class_method: bool, } impl ObjCInterface { fn new(name: &str) -> ObjCInterface { ObjCInterface { name: name.to_owned(), + category: None, + is_protocol: false, + conforms_to: Vec::new(), methods: Vec::new(), + class_methods: Vec::new(), } } @@ -47,11 +69,31 @@ impl ObjCInterface { self.name.as_ref() } - /// List of the methods defined in this interfae - pub fn methods(&self) -> &Vec { + /// Formats the name for rust + /// Can be like NSObject, but with categories might be like NSObject_NSCoderMethods + /// and protocols are like protocol_NSObject + pub fn rust_name(&self) -> String { + if let Some(ref cat) = self.category { + format!("{}_{}", self.name(), cat) + } else { + if self.is_protocol { + format!("protocol_{}", self.name()) + } else { + self.name().to_owned() + } + } + } + + /// List of the methods defined in this interface + pub fn methods(&self) -> &Vec { &self.methods } + /// List of the class methods defined in this interface + pub fn class_methods(&self) -> &Vec { + &self.class_methods + } + /// Parses the Objective C interface from the cursor pub fn from_ty(cursor: &clang::Cursor, ctx: &mut BindgenContext) @@ -59,16 +101,57 @@ impl ObjCInterface { let name = cursor.spelling(); let mut interface = Self::new(&name); - cursor.visit(|cursor| { - match cursor.kind() { - CXCursor_ObjCInstanceMethodDecl => { - let name = cursor.spelling(); - let signature = - FunctionSig::from_ty(&cursor.cur_type(), &cursor, ctx) - .expect("Invalid function sig"); - let method = ObjCInstanceMethod::new(&name, signature); + if cursor.kind() == CXCursor_ObjCProtocolDecl { + interface.is_protocol = true; + } - interface.methods.push(method); + cursor.visit(|c| { + match c.kind() { + CXCursor_ObjCClassRef => { + if cursor.kind() == CXCursor_ObjCCategoryDecl { + // We are actually a category extension, and we found the reference + // to the original interface, so name this interface approriately + interface.name = c.spelling(); + interface.category = Some(cursor.spelling()); + } + } + CXCursor_ObjCProtocolRef => { + // Gather protocols this interface conforms to + let needle = format!("protocol_{}", c.spelling()); + let items_map = ctx.items(); + debug!("Interface {} conforms to {}, find the item", interface.name, needle); + + for (id, item) in items_map + { + if let Some(ty) = item.as_type() { + match *ty.kind() { + TypeKind::ObjCInterface(ref protocol) => { + if protocol.is_protocol + { + debug!("Checking protocol {}, ty.name {:?}", protocol.name, ty.name()); + if Some(needle.as_ref()) == ty.name() + { + debug!("Found conforming protocol {:?}", item); + interface.conforms_to.push(*id); + break; + } + } + } + _ => {} + } + } + } + + } + CXCursor_ObjCInstanceMethodDecl | + CXCursor_ObjCClassMethodDecl => { + let name = c.spelling(); + let signature = + FunctionSig::from_ty(&c.cur_type(), &c, ctx) + .expect("Invalid function sig"); + let is_class_method = c.kind() == CXCursor_ObjCClassMethodDecl; + let method = ObjCMethod::new(&name, signature, is_class_method); + interface.add_method(method); } _ => {} } @@ -76,18 +159,30 @@ impl ObjCInterface { }); Some(interface) } + + fn add_method(&mut self, method: ObjCMethod) { + if method.is_class_method { + self.class_methods.push(method); + } else { + self.methods.push(method); + } + } } -impl ObjCInstanceMethod { - fn new(name: &str, signature: FunctionSig) -> ObjCInstanceMethod { +impl ObjCMethod { + fn new(name: &str, + signature: FunctionSig, + is_class_method: bool) + -> ObjCMethod { let split_name: Vec<&str> = name.split(':').collect(); let rust_name = split_name.join("_"); - ObjCInstanceMethod { + ObjCMethod { name: name.to_owned(), rust_name: rust_name.to_owned(), signature: signature, + is_class_method: is_class_method, } } @@ -108,6 +203,11 @@ impl ObjCInstanceMethod { &self.signature } + /// Is this a class method? + pub fn is_class_method(&self) -> bool { + self.is_class_method + } + /// Formats the method call pub fn format_method_call(&self, args: &[String]) -> String { let split_name: Vec<&str> = @@ -132,3 +232,23 @@ impl ObjCInstanceMethod { .join("") } } + +impl Trace for ObjCInterface { + type Extra = (); + + fn trace(&self, context: &BindgenContext, tracer: &mut T, _: &()) + where T: Tracer, + { + for method in &self.methods { + method.signature.trace(context, tracer, &()); + } + + for class_method in &self.class_methods { + class_method.signature.trace(context, tracer, &()); + } + + for protocol in &self.conforms_to { + tracer.visit(*protocol); + } + } +} diff --git a/third_party/rust/bindgen/src/ir/template.rs b/third_party/rust/bindgen/src/ir/template.rs new file mode 100644 index 000000000000..d29963302f8f --- /dev/null +++ b/third_party/rust/bindgen/src/ir/template.rs @@ -0,0 +1,343 @@ +//! Template declaration and instantiation related things. +//! +//! The nomenclature surrounding templates is often confusing, so here are a few +//! brief definitions: +//! +//! * "Template definition": a class/struct/alias/function definition that takes +//! generic template parameters. For example: +//! +//! ```c++ +//! template +//! class List { +//! // ... +//! }; +//! ``` +//! +//! * "Template instantiation": an instantiation is a use of a template with +//! concrete template arguments. For example, `List`. +//! +//! * "Template specialization": an alternative template definition providing a +//! custom definition for instantiations with the matching template +//! arguments. This C++ feature is unsupported by bindgen. For example: +//! +//! ```c++ +//! template<> +//! class List { +//! // Special layout for int lists... +//! }; +//! ``` + +use super::context::{BindgenContext, ItemId}; +use super::derive::{CanDeriveCopy, CanDeriveDebug}; +use super::item::{Item, ItemAncestors}; +use super::layout::Layout; +use super::traversal::{EdgeKind, Trace, Tracer}; +use clang; +use parse::ClangItemParser; + +/// Template declaration (and such declaration's template parameters) related +/// methods. +/// +/// This trait's methods distinguish between `None` and `Some([])` for +/// declarations that are not templates and template declarations with zero +/// parameters, in general. +/// +/// Consider this example: +/// +/// ```c++ +/// template +/// class Foo { +/// T use_of_t; +/// U use_of_u; +/// +/// template +/// using Bar = V*; +/// +/// class Inner { +/// T x; +/// U y; +/// Bar z; +/// }; +/// +/// template +/// class Lol { +/// // No use of W, but here's a use of T. +/// T t; +/// }; +/// +/// template +/// class Wtf { +/// // X is not used because W is not used. +/// Lol lololol; +/// }; +/// }; +/// +/// class Qux { +/// int y; +/// }; +/// ``` +/// +/// The following table depicts the results of each trait method when invoked on +/// each of the declarations above: +/// +/// +------+----------------------+--------------------------+------------------------+---- +/// |Decl. | self_template_params | num_self_template_params | all_template_parameters| ... +/// +------+----------------------+--------------------------+------------------------+---- +/// |Foo | Some([T, U]) | Some(2) | Some([T, U]) | ... +/// |Bar | Some([V]) | Some(1) | Some([T, U, V]) | ... +/// |Inner | None | None | Some([T, U]) | ... +/// |Lol | Some([W]) | Some(1) | Some([T, U, W]) | ... +/// |Wtf | Some([X]) | Some(1) | Some([T, U, X]) | ... +/// |Qux | None | None | None | ... +/// +------+----------------------+--------------------------+------------------------+---- +/// +/// ----+------+-----+----------------------+ +/// ... |Decl. | ... | used_template_params | +/// ----+------+-----+----------------------+ +/// ... |Foo | ... | Some([T, U]) | +/// ... |Bar | ... | Some([V]) | +/// ... |Inner | ... | None | +/// ... |Lol | ... | Some([T]) | +/// ... |Wtf | ... | Some([T]) | +/// ... |Qux | ... | None | +/// ----+------+-----+----------------------+ +pub trait TemplateParameters { + /// Get the set of `ItemId`s that make up this template declaration's free + /// template parameters. + /// + /// Note that these might *not* all be named types: C++ allows + /// constant-value template parameters as well as template-template + /// parameters. Of course, Rust does not allow generic parameters to be + /// anything but types, so we must treat them as opaque, and avoid + /// instantiating them. + fn self_template_params(&self, + ctx: &BindgenContext) + -> Option>; + + /// Get the number of free template parameters this template declaration + /// has. + /// + /// Implementations *may* return `Some` from this method when + /// `template_params` returns `None`. This is useful when we only have + /// partial information about the template declaration, such as when we are + /// in the middle of parsing it. + fn num_self_template_params(&self, ctx: &BindgenContext) -> Option { + self.self_template_params(ctx).map(|params| params.len()) + } + + /// Get the complete set of template parameters that can affect this + /// declaration. + /// + /// Note that this item doesn't need to be a template declaration itself for + /// `Some` to be returned here (in contrast to `self_template_params`). If + /// this item is a member of a template declaration, then the parent's + /// template parameters are included here. + /// + /// In the example above, `Inner` depends on both of the `T` and `U` type + /// parameters, even though it is not itself a template declaration and + /// therefore has no type parameters itself. Perhaps it helps to think about + /// how we would fully reference such a member type in C++: + /// `Foo::Inner`. `Foo` *must* be instantiated with template + /// arguments before we can gain access to the `Inner` member type. + fn all_template_params(&self, ctx: &BindgenContext) -> Option> + where Self: ItemAncestors, + { + let each_self_params: Vec> = self.ancestors(ctx) + .filter_map(|id| id.self_template_params(ctx)) + .collect(); + if each_self_params.is_empty() { + None + } else { + Some(each_self_params.into_iter() + .rev() + .flat_map(|params| params) + .collect()) + } + } + + /// Get only the set of template parameters that this item uses. This is a + /// subset of `all_template_params` and does not necessarily contain any of + /// `self_template_params`. + fn used_template_params(&self, ctx: &BindgenContext) -> Option> + where Self: AsRef, + { + assert!(ctx.in_codegen_phase(), + "template parameter usage is not computed until codegen"); + + let id = *self.as_ref(); + ctx.resolve_item(id) + .all_template_params(ctx) + .map(|all_params| { + all_params.into_iter() + .filter(|p| ctx.uses_template_parameter(id, *p)) + .collect() + }) + } +} + +/// A trait for things which may or may not be a named template type parameter. +pub trait AsNamed { + /// Any extra information the implementor might need to make this decision. + type Extra; + + /// Convert this thing to the item id of a named template type parameter. + fn as_named(&self, + ctx: &BindgenContext, + extra: &Self::Extra) + -> Option; + + /// Is this a named template type parameter? + fn is_named(&self, ctx: &BindgenContext, extra: &Self::Extra) -> bool { + self.as_named(ctx, extra).is_some() + } +} + +/// A concrete instantiation of a generic template. +#[derive(Clone, Debug)] +pub struct TemplateInstantiation { + /// The template definition which this is instantiating. + definition: ItemId, + /// The concrete template arguments, which will be substituted in the + /// definition for the generic template parameters. + args: Vec, +} + +impl TemplateInstantiation { + /// Construct a new template instantiation from the given parts. + pub fn new(template_definition: ItemId, + template_args: I) + -> TemplateInstantiation + where I: IntoIterator, + { + TemplateInstantiation { + definition: template_definition, + args: template_args.into_iter().collect(), + } + } + + /// Get the template definition for this instantiation. + pub fn template_definition(&self) -> ItemId { + self.definition + } + + /// Get the concrete template arguments used in this instantiation. + pub fn template_arguments(&self) -> &[ItemId] { + &self.args[..] + } + + /// Parse a `TemplateInstantiation` from a clang `Type`. + pub fn from_ty(ty: &clang::Type, + ctx: &mut BindgenContext) + -> Option { + use clang_sys::*; + + let template_args = ty.template_args() + .map_or(vec![], |args| { + args.filter(|t| t.kind() != CXType_Invalid) + .map(|t| { + Item::from_ty_or_ref(t, t.declaration(), None, ctx) + }) + .collect() + }); + + let definition = ty.declaration() + .specialized() + .or_else(|| { + let mut template_ref = None; + ty.declaration().visit(|child| { + if child.kind() == CXCursor_TemplateRef { + template_ref = Some(child); + return CXVisit_Break; + } + + // Instantiations of template aliases might have the + // TemplateRef to the template alias definition arbitrarily + // deep, so we need to recurse here and not only visit + // direct children. + CXChildVisit_Recurse + }); + + template_ref.and_then(|cur| cur.referenced()) + }); + + let definition = match definition { + Some(def) => def, + None => { + if !ty.declaration().is_builtin() { + warn!("Could not find template definition for template \ + instantiation"); + } + return None + } + }; + + let template_definition = + Item::from_ty_or_ref(definition.cur_type(), definition, None, ctx); + + Some(TemplateInstantiation::new(template_definition, template_args)) + } + + /// Does this instantiation have a vtable? + pub fn has_vtable(&self, ctx: &BindgenContext) -> bool { + ctx.resolve_type(self.definition).has_vtable(ctx) || + self.args.iter().any(|arg| ctx.resolve_type(*arg).has_vtable(ctx)) + } + + /// Does this instantiation have a destructor? + pub fn has_destructor(&self, ctx: &BindgenContext) -> bool { + ctx.resolve_type(self.definition).has_destructor(ctx) || + self.args.iter().any(|arg| ctx.resolve_type(*arg).has_destructor(ctx)) + } +} + +impl<'a> CanDeriveCopy<'a> for TemplateInstantiation { + type Extra = (); + + fn can_derive_copy(&self, ctx: &BindgenContext, _: ()) -> bool { + self.definition.can_derive_copy(ctx, ()) && + self.args.iter().all(|arg| arg.can_derive_copy(ctx, ())) + } + + fn can_derive_copy_in_array(&self, ctx: &BindgenContext, _: ()) -> bool { + self.definition.can_derive_copy_in_array(ctx, ()) && + self.args.iter().all(|arg| arg.can_derive_copy_in_array(ctx, ())) + } +} + +impl CanDeriveDebug for TemplateInstantiation { + type Extra = Option; + + fn can_derive_debug(&self, + ctx: &BindgenContext, + layout: Option) + -> bool { + self.args.iter().all(|arg| arg.can_derive_debug(ctx, ())) && + ctx.resolve_type(self.definition) + .as_comp() + .and_then(|c| { + // For non-type template parameters, we generate an opaque + // blob, and in this case the instantiation has a better + // idea of the layout than the definition does. + if c.has_non_type_template_params() { + let opaque = layout.unwrap_or(Layout::zero()).opaque(); + Some(opaque.can_derive_debug(ctx, ())) + } else { + None + } + }) + .unwrap_or_else(|| self.definition.can_derive_debug(ctx, ())) + } +} + +impl Trace for TemplateInstantiation { + type Extra = (); + + fn trace(&self, _ctx: &BindgenContext, tracer: &mut T, _: &()) + where T: Tracer, + { + tracer.visit_kind(self.definition, EdgeKind::TemplateDeclaration); + for &item in self.template_arguments() { + tracer.visit_kind(item, EdgeKind::TemplateArgument); + } + } +} diff --git a/third_party/rust/bindgen/src/ir/traversal.rs b/third_party/rust/bindgen/src/ir/traversal.rs index 8c5e32cfc3aa..0072e6b28262 100644 --- a/third_party/rust/bindgen/src/ir/traversal.rs +++ b/third_party/rust/bindgen/src/ir/traversal.rs @@ -25,16 +25,6 @@ impl Edge { kind: kind, } } - - /// Get the item that this edge is pointing to. - pub fn to(&self) -> ItemId { - self.to - } - - /// Get the kind of edge that this is. - pub fn kind(&self) -> EdgeKind { - self.kind - } } impl Into for Edge { @@ -44,22 +34,137 @@ impl Into for Edge { } /// The kind of edge reference. This is useful when we wish to only consider -/// certain kinds of edges for a particular traversal. +/// certain kinds of edges for a particular traversal or analysis. #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum EdgeKind { /// A generic, catch-all edge. Generic, /// An edge from a template declaration, to the definition of a named type - /// parameter. For example, the edge Foo -> T in the following snippet: + /// parameter. For example, the edge from `Foo` to `T` in the following + /// snippet: /// /// ```C++ /// template + /// class Foo { }; + /// ``` + TemplateParameterDefinition, + + /// An edge from a template instantiation to the template declaration that + /// is being instantiated. For example, the edge from `Foo` to + /// to `Foo`: + /// + /// ```C++ + /// template + /// class Foo { }; + /// + /// using Bar = Foo; + /// ``` + TemplateDeclaration, + + /// An edge from a template instantiation to its template argument. For + /// example, `Foo` to `Bar`: + /// + /// ```C++ + /// template + /// class Foo { }; + /// + /// class Bar { }; + /// + /// using FooBar = Foo; + /// ``` + TemplateArgument, + + /// An edge from a compound type to one of its base member types. For + /// example, the edge from `Bar` to `Foo`: + /// + /// ```C++ + /// class Foo { }; + /// + /// class Bar : public Foo { }; + /// ``` + BaseMember, + + /// An edge from a compound type to the types of one of its fields. For + /// example, the edge from `Foo` to `int`: + /// + /// ```C++ /// class Foo { /// int x; /// }; /// ``` - TemplateParameterDefinition, + Field, + + /// An edge from an class or struct type to an inner type member. For + /// example, the edge from `Foo` to `Foo::Bar` here: + /// + /// ```C++ + /// class Foo { + /// struct Bar { }; + /// }; + /// ``` + InnerType, + + /// An edge from an class or struct type to an inner static variable. For + /// example, the edge from `Foo` to `Foo::BAR` here: + /// + /// ```C++ + /// class Foo { + /// static const char* BAR; + /// }; + /// ``` + InnerVar, + + /// An edge from a class or struct type to one of its method functions. For + /// example, the edge from `Foo` to `Foo::bar`: + /// + /// ```C++ + /// class Foo { + /// bool bar(int x, int y); + /// }; + /// ``` + Method, + + /// An edge from a class or struct type to one of its constructor + /// functions. For example, the edge from `Foo` to `Foo::Foo(int x, int y)`: + /// + /// ```C++ + /// class Foo { + /// int my_x; + /// int my_y; + /// + /// public: + /// Foo(int x, int y); + /// }; + /// ``` + Constructor, + + /// An edge from a function declaration to its return type. For example, the + /// edge from `foo` to `int`: + /// + /// ```C++ + /// int foo(char* string); + /// ``` + FunctionReturn, + + /// An edge from a function declaration to one of its parameter types. For + /// example, the edge from `foo` to `char*`: + /// + /// ```C++ + /// int foo(char* string); + /// ``` + FunctionParameter, + + /// An edge from a static variable to its type. For example, the edge from + /// `FOO` to `const char*`: + /// + /// ```C++ + /// static const char* FOO; + /// ``` + VarType, + + /// An edge from a non-templated alias or typedef to the referenced type. + TypeReference, } /// A predicate to allow visiting only sub-sets of the whole IR graph by @@ -203,7 +308,7 @@ pub trait Tracer { } impl Tracer for F - where F: FnMut(ItemId, EdgeKind) + where F: FnMut(ItemId, EdgeKind), { fn visit_kind(&mut self, item: ItemId, kind: EdgeKind) { (*self)(item, kind) @@ -211,7 +316,8 @@ impl Tracer for F } /// Trace all of the outgoing edges to other items. Implementations should call -/// `tracer.visit(edge)` for each of their outgoing edges. +/// one of `tracer.visit(edge)` or `tracer.visit_kind(edge, EdgeKind::Whatever)` +/// for each of their outgoing edges. pub trait Trace { /// If a particular type needs extra information beyond what it has in /// `self` and `context` to find its referenced items, its implementation diff --git a/third_party/rust/bindgen/src/ir/ty.rs b/third_party/rust/bindgen/src/ir/ty.rs index c3ec4039ca09..a9054e981c74 100644 --- a/third_party/rust/bindgen/src/ir/ty.rs +++ b/third_party/rust/bindgen/src/ir/ty.rs @@ -3,40 +3,21 @@ use super::comp::CompInfo; use super::context::{BindgenContext, ItemId}; use super::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault}; +use super::dot::DotAttributes; use super::enum_ty::Enum; use super::function::FunctionSig; use super::int::IntKind; use super::item::Item; -use super::layout::Layout; +use super::layout::{Layout, Opaque}; use super::objc::ObjCInterface; -use super::traversal::{Trace, Tracer}; +use super::template::{AsNamed, TemplateInstantiation, TemplateParameters}; +use super::traversal::{EdgeKind, Trace, Tracer}; use clang::{self, Cursor}; use parse::{ClangItemParser, ParseError, ParseResult}; +use std::cell::Cell; +use std::io; use std::mem; -/// Template declaration related methods. -pub trait TemplateDeclaration { - /// Get the set of `ItemId`s that make up this template declaration's free - /// template parameters. - /// - /// Note that these might *not* all be named types: C++ allows - /// constant-value template parameters. Of course, Rust does not allow - /// generic parameters to be anything but types, so we must treat them as - /// opaque, and avoid instantiating them. - fn template_params(&self, ctx: &BindgenContext) -> Option>; - - /// Get the number of free template parameters this template declaration - /// has. - /// - /// Implementations *may* return `Some` from this method when - /// `template_params` returns `None`. This is useful when we only have - /// partial information about the template declaration, such as when we are - /// in the middle of parsing it. - fn num_template_params(&self, ctx: &BindgenContext) -> Option { - self.template_params(ctx).map(|params| params.len()) - } -} - /// The base representation of a type in bindgen. /// /// A type has an optional name, which if present cannot be empty, a `layout` @@ -52,6 +33,9 @@ pub struct Type { kind: TypeKind, /// Whether this type is const-qualified. is_const: bool, + /// Don't go into an infinite loop when detecting if we have a vtable or + /// not. + detect_has_vtable_cycle: Cell, } /// The maximum number of items in an array for which Rust implements common @@ -82,6 +66,7 @@ impl Type { layout: layout, kind: kind, is_const: is_const, + detect_has_vtable_cycle: Cell::new(false), } } @@ -108,7 +93,15 @@ impl Type { } } - /// Is this a named type? + /// Is this type of kind `TypeKind::Opaque`? + pub fn is_opaque(&self) -> bool { + match self.kind { + TypeKind::Opaque => true, + _ => false, + } + } + + /// Is this type of kind `TypeKind::Named`? pub fn is_named(&self) -> bool { match self.kind { TypeKind::Named => true, @@ -159,8 +152,12 @@ impl Type { /// Creates a new named type, with name `name`. pub fn named(name: String) -> Self { - assert!(!name.is_empty()); - Self::new(Some(name), None, TypeKind::Named, false) + let name = if name.is_empty() { + None + } else { + Some(name) + }; + Self::new(name, None, TypeKind::Named, false) } /// Is this a floating point type? @@ -238,71 +235,43 @@ impl Type { /// Whether this type has a vtable. pub fn has_vtable(&self, ctx: &BindgenContext) -> bool { + if self.detect_has_vtable_cycle.get() { + return false; + } + + self.detect_has_vtable_cycle.set(true); + // FIXME: Can we do something about template parameters? Huh... - match self.kind { - TypeKind::TemplateInstantiation(t, _) | + let result = match self.kind { TypeKind::TemplateAlias(t, _) | TypeKind::Alias(t) | TypeKind::ResolvedTypeRef(t) => ctx.resolve_type(t).has_vtable(ctx), TypeKind::Comp(ref info) => info.has_vtable(ctx), + TypeKind::TemplateInstantiation(ref inst) => inst.has_vtable(ctx), _ => false, - } + }; + self.detect_has_vtable_cycle.set(false); + + result } /// Returns whether this type has a destructor. pub fn has_destructor(&self, ctx: &BindgenContext) -> bool { match self.kind { - TypeKind::TemplateInstantiation(t, _) | TypeKind::TemplateAlias(t, _) | TypeKind::Alias(t) | TypeKind::ResolvedTypeRef(t) => { ctx.resolve_type(t).has_destructor(ctx) } + TypeKind::TemplateInstantiation(ref inst) => { + inst.has_destructor(ctx) + } TypeKind::Comp(ref info) => info.has_destructor(ctx), _ => false, } } - /// See the comment in `Item::signature_contains_named_type`. - pub fn signature_contains_named_type(&self, - ctx: &BindgenContext, - ty: &Type) - -> bool { - let name = match *ty.kind() { - TypeKind::Named => ty.name(), - ref other @ _ => unreachable!("Not a named type: {:?}", other), - }; - - match self.kind { - TypeKind::Named => self.name() == name, - TypeKind::ResolvedTypeRef(t) | - TypeKind::Array(t, _) | - TypeKind::Pointer(t) | - TypeKind::Alias(t) => { - ctx.resolve_type(t) - .signature_contains_named_type(ctx, ty) - } - TypeKind::Function(ref sig) => { - sig.argument_types().iter().any(|&(_, arg)| { - ctx.resolve_type(arg) - .signature_contains_named_type(ctx, ty) - }) || - ctx.resolve_type(sig.return_type()) - .signature_contains_named_type(ctx, ty) - } - TypeKind::TemplateAlias(_, ref template_args) | - TypeKind::TemplateInstantiation(_, ref template_args) => { - template_args.iter().any(|arg| { - ctx.resolve_type(*arg) - .signature_contains_named_type(ctx, ty) - }) - } - TypeKind::Comp(ref ci) => ci.signature_contains_named_type(ctx, ty), - _ => false, - } - } - /// Whether this named type is an invalid C++ identifier. This is done to /// avoid generating invalid code with some cases we can't handle, see: /// @@ -320,10 +289,7 @@ impl Type { /// Checks whether the name looks like an identifier, /// i.e. is alphanumeric (including '_') and does not start with a digit. pub fn is_valid_identifier(name: &str) -> bool { - let mut chars = name.chars(); - let first_valid = chars.next().map(|c| c.is_alphabetic() || c == '_').unwrap_or(false); - - first_valid && chars.all(|c| c.is_alphanumeric() || c == '_') + clang::is_valid_identifier(name) } /// See safe_canonical_type. @@ -337,7 +303,7 @@ impl Type { /// Returns the canonical type of this type, that is, the "inner type". /// /// For example, for a `typedef`, the canonical type would be the - /// `typedef`ed type, for a template specialization, would be the template + /// `typedef`ed type, for a template instantiation, would be the template /// its specializing, and so on. Return None if the type is unresolved. pub fn safe_canonical_type<'tr>(&'tr self, ctx: &'tr BindgenContext) @@ -346,6 +312,7 @@ impl Type { TypeKind::Named | TypeKind::Array(..) | TypeKind::Comp(..) | + TypeKind::Opaque | TypeKind::Int(..) | TypeKind::Float(..) | TypeKind::Complex(..) | @@ -356,14 +323,19 @@ impl Type { TypeKind::NullPtr | TypeKind::BlockPointer | TypeKind::Pointer(..) | + TypeKind::ObjCId | + TypeKind::ObjCSel | TypeKind::ObjCInterface(..) => Some(self), TypeKind::ResolvedTypeRef(inner) | TypeKind::Alias(inner) | - TypeKind::TemplateAlias(inner, _) | - TypeKind::TemplateInstantiation(inner, _) => { + TypeKind::TemplateAlias(inner, _) => { ctx.resolve_type(inner).safe_canonical_type(ctx) } + TypeKind::TemplateInstantiation(ref inst) => { + ctx.resolve_type(inst.template_definition()) + .safe_canonical_type(ctx) + } TypeKind::UnresolvedTypeRef(..) => None, } @@ -373,6 +345,7 @@ impl Type { /// item, so we can arrive to the proper item that needs to be generated. pub fn should_be_traced_unconditionally(&self) -> bool { match self.kind { + TypeKind::Comp(..) | TypeKind::Function(..) | TypeKind::Pointer(..) | TypeKind::Array(..) | @@ -384,6 +357,88 @@ impl Type { } } +impl AsNamed for Type { + type Extra = Item; + + fn as_named(&self, ctx: &BindgenContext, item: &Item) -> Option { + self.kind.as_named(ctx, item) + } +} + +impl AsNamed for TypeKind { + type Extra = Item; + + fn as_named(&self, ctx: &BindgenContext, item: &Item) -> Option { + match *self { + TypeKind::Named => Some(item.id()), + TypeKind::ResolvedTypeRef(id) => id.as_named(ctx, &()), + _ => None, + } + } +} + +impl DotAttributes for Type { + fn dot_attributes(&self, + ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write, + { + if let Some(ref layout) = self.layout { + try!(writeln!(out, + "size{} + align{}", + layout.size, + layout.align)); + if layout.packed { + try!(writeln!(out, "packedtrue")); + } + } + + if self.is_const { + try!(writeln!(out, "consttrue")); + } + + self.kind.dot_attributes(ctx, out) + } +} + +impl DotAttributes for TypeKind { + fn dot_attributes(&self, + _ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write, + { + write!(out, + "TypeKind{}", + match *self { + TypeKind::Void => "Void", + TypeKind::NullPtr => "NullPtr", + TypeKind::Comp(..) => "Comp", + TypeKind::Opaque => "Opaque", + TypeKind::Int(..) => "Int", + TypeKind::Float(..) => "Float", + TypeKind::Complex(..) => "Complex", + TypeKind::Alias(..) => "Alias", + TypeKind::TemplateAlias(..) => "TemplateAlias", + TypeKind::Array(..) => "Array", + TypeKind::Function(..) => "Function", + TypeKind::Enum(..) => "Enum", + TypeKind::Pointer(..) => "Pointer", + TypeKind::BlockPointer => "BlockPointer", + TypeKind::Reference(..) => "Reference", + TypeKind::TemplateInstantiation(..) => "TemplateInstantiation", + TypeKind::ResolvedTypeRef(..) => "ResolvedTypeRef", + TypeKind::Named => "Named", + TypeKind::ObjCId => "ObjCId", + TypeKind::ObjCSel => "ObjCSel", + TypeKind::ObjCInterface(..) => "ObjCInterface", + TypeKind::UnresolvedTypeRef(..) => unreachable!("there shouldn't be any more of these anymore"), + }) + } +} + #[test] fn is_invalid_named_type_valid() { let ty = Type::new(Some("foo".into()), None, TypeKind::Named, false); @@ -429,21 +484,26 @@ fn is_invalid_named_type_empty_name() { } -impl TemplateDeclaration for Type { - fn template_params(&self, ctx: &BindgenContext) -> Option> { - self.kind.template_params(ctx) +impl TemplateParameters for Type { + fn self_template_params(&self, + ctx: &BindgenContext) + -> Option> { + self.kind.self_template_params(ctx) } } -impl TemplateDeclaration for TypeKind { - fn template_params(&self, ctx: &BindgenContext) -> Option> { +impl TemplateParameters for TypeKind { + fn self_template_params(&self, + ctx: &BindgenContext) + -> Option> { match *self { TypeKind::ResolvedTypeRef(id) => { - ctx.resolve_type(id).template_params(ctx) + ctx.resolve_type(id).self_template_params(ctx) } - TypeKind::Comp(ref comp) => comp.template_params(ctx), + TypeKind::Comp(ref comp) => comp.self_template_params(ctx), TypeKind::TemplateAlias(_, ref args) => Some(args.clone()), + TypeKind::Opaque | TypeKind::TemplateInstantiation(..) | TypeKind::Void | TypeKind::NullPtr | @@ -459,6 +519,8 @@ impl TemplateDeclaration for TypeKind { TypeKind::UnresolvedTypeRef(..) | TypeKind::Named | TypeKind::Alias(_) | + TypeKind::ObjCId | + TypeKind::ObjCSel | TypeKind::ObjCInterface(_) => None, } } @@ -478,6 +540,17 @@ impl CanDeriveDebug for Type { TypeKind::Comp(ref info) => { info.can_derive_debug(ctx, self.layout(ctx)) } + TypeKind::Pointer(inner) => { + let inner = ctx.resolve_type(inner); + if let TypeKind::Function(ref sig) = + *inner.canonical_type(ctx).kind() { + return sig.can_derive_debug(ctx, ()); + } + return true; + } + TypeKind::TemplateInstantiation(ref inst) => { + inst.can_derive_debug(ctx, self.layout(ctx)) + } _ => true, } } @@ -498,6 +571,10 @@ impl CanDeriveDefault for Type { TypeKind::Comp(ref info) => { info.can_derive_default(ctx, self.layout(ctx)) } + TypeKind::Opaque => { + self.layout + .map_or(true, |l| l.opaque().can_derive_default(ctx, ())) + } TypeKind::Void | TypeKind::Named | TypeKind::TemplateInstantiation(..) | @@ -505,8 +582,11 @@ impl CanDeriveDefault for Type { TypeKind::NullPtr | TypeKind::Pointer(..) | TypeKind::BlockPointer | + TypeKind::ObjCId | + TypeKind::ObjCSel | TypeKind::ObjCInterface(..) | TypeKind::Enum(..) => false, + TypeKind::Function(..) | TypeKind::Int(..) | TypeKind::Float(..) | @@ -527,11 +607,17 @@ impl<'a> CanDeriveCopy<'a> for Type { } TypeKind::ResolvedTypeRef(t) | TypeKind::TemplateAlias(t, _) | - TypeKind::TemplateInstantiation(t, _) | TypeKind::Alias(t) => t.can_derive_copy(ctx, ()), + TypeKind::TemplateInstantiation(ref inst) => { + inst.can_derive_copy(ctx, ()) + } TypeKind::Comp(ref info) => { info.can_derive_copy(ctx, (item, self.layout(ctx))) } + TypeKind::Opaque => { + self.layout + .map_or(true, |l| l.opaque().can_derive_copy(ctx, ())) + } _ => true, } } @@ -587,6 +673,11 @@ pub enum TypeKind { /// A compound type, that is, a class, struct, or union. Comp(CompInfo), + /// An opaque type that we just don't understand. All usage of this shoulf + /// result in an opaque blob of bytes generated from the containing type's + /// layout. + Opaque, + /// An integer type, of a given kind. `bool` and `char` are also considered /// integers. Int(IntKind), @@ -623,9 +714,9 @@ pub enum TypeKind { /// A reference to a type, as in: int& foo(). Reference(ItemId), - /// An instantiation of an abstract template declaration (first tuple - /// member) with a set of concrete template arguments (second tuple member). - TemplateInstantiation(ItemId, Vec), + /// An instantiation of an abstract template definition with a set of + /// concrete template arguments. + TemplateInstantiation(TemplateInstantiation), /// A reference to a yet-to-resolve type. This stores the clang cursor /// itself, and postpones its resolution. @@ -635,7 +726,7 @@ pub enum TypeKind { /// /// see tests/headers/typeref.hpp to see somewhere where this is a problem. UnresolvedTypeRef(clang::Type, - Option, + clang::Cursor, /* parent_id */ Option), @@ -650,6 +741,12 @@ pub enum TypeKind { /// Objective C interface. Always referenced through a pointer ObjCInterface(ObjCInterface), + + /// Objective C 'id' type, points to any object + ObjCId, + + /// Objective C selector type + ObjCSel, } impl Type { @@ -663,15 +760,18 @@ impl Type { match self.kind { TypeKind::Void => true, TypeKind::Comp(ref ci) => ci.is_unsized(ctx), + TypeKind::Opaque => self.layout.map_or(true, |l| l.size == 0), TypeKind::Array(inner, size) => { size == 0 || ctx.resolve_type(inner).is_unsized(ctx) } TypeKind::ResolvedTypeRef(inner) | TypeKind::Alias(inner) | - TypeKind::TemplateAlias(inner, _) | - TypeKind::TemplateInstantiation(inner, _) => { + TypeKind::TemplateAlias(inner, _) => { ctx.resolve_type(inner).is_unsized(ctx) } + TypeKind::TemplateInstantiation(ref inst) => { + ctx.resolve_type(inst.template_definition()).is_unsized(ctx) + } TypeKind::Named | TypeKind::Int(..) | TypeKind::Float(..) | @@ -681,6 +781,8 @@ impl Type { TypeKind::Reference(..) | TypeKind::NullPtr | TypeKind::BlockPointer | + TypeKind::ObjCId | + TypeKind::ObjCSel | TypeKind::Pointer(..) => false, TypeKind::ObjCInterface(..) => true, // dunno? @@ -698,17 +800,16 @@ impl Type { /// comments in every special case justify why they're there. pub fn from_clang_ty(potential_id: ItemId, ty: &clang::Type, - location: Option, + location: Cursor, parent_id: Option, ctx: &mut BindgenContext) -> Result, ParseError> { use clang_sys::*; { - let already_resolved = - ctx.builtin_or_resolved_ty(potential_id, - parent_id, - ty, - location); + let already_resolved = ctx.builtin_or_resolved_ty(potential_id, + parent_id, + ty, + Some(location)); if let Some(ty) = already_resolved { debug!("{:?} already resolved: {:?}", ty, location); return Ok(ParseResult::AlreadyResolved(ty)); @@ -729,377 +830,431 @@ impl Type { // Parse objc protocols as if they were interfaces let mut ty_kind = ty.kind(); - if let Some(loc) = location { - if loc.kind() == CXCursor_ObjCProtocolDecl { - ty_kind = CXType_ObjCInterface; - } + match location.kind() { + CXCursor_ObjCProtocolDecl | + CXCursor_ObjCCategoryDecl => ty_kind = CXType_ObjCInterface, + _ => {} } - let kind = match ty_kind { - CXType_Unexposed if *ty != canonical_ty && - canonical_ty.kind() != CXType_Invalid && - // Sometime clang desugars some types more than - // what we need, specially with function - // pointers. - // - // We should also try the solution of inverting - // those checks instead of doing this, that is, - // something like: - // - // CXType_Unexposed if ty.ret_type().is_some() - // => { ... } - // - // etc. - !canonical_ty.spelling().contains("type-parameter") => { - debug!("Looking for canonical type: {:?}", canonical_ty); - return Self::from_clang_ty(potential_id, - &canonical_ty, - location, - parent_id, - ctx); + // Objective C template type parameter + // FIXME: This is probably wrong, we are attempting to find the + // objc template params, which seem to manifest as a typedef. + // We are rewriting them as id to suppress multiple conflicting + // typedefs at root level + if ty_kind == CXType_Typedef { + let is_template_type_param = ty.declaration().kind() == CXCursor_TemplateTypeParameter; + let is_canonical_objcpointer = canonical_ty.kind() == CXType_ObjCObjectPointer; + + // We have found a template type for objc interface + if is_canonical_objcpointer && is_template_type_param { + // Objective-C generics are just ids with fancy name. + // To keep it simple, just name them ids + name = "id".to_owned(); } - CXType_Unexposed | CXType_Invalid => { - // For some reason Clang doesn't give us any hint in some - // situations where we should generate a function pointer (see - // tests/headers/func_ptr_in_struct.h), so we do a guess here - // trying to see if it has a valid return type. - if ty.ret_type().is_some() { - let signature = try!(FunctionSig::from_ty(ty, - &location.unwrap_or(cursor), - ctx)); - TypeKind::Function(signature) - // Same here, with template specialisations we can safely - // assume this is a Comp(..) - } else if ty.is_fully_specialized_template() { - debug!("Template specialization: {:?}, {:?} {:?}", - ty, - location, - canonical_ty); - let complex = - CompInfo::from_ty(potential_id, ty, location, ctx) + + } + + if location.kind() == CXCursor_ClassTemplatePartialSpecialization { + // Sorry! (Not sorry) + warn!("Found a partial template specialization; bindgen does not \ + support partial template specialization! Constructing \ + opaque type instead."); + return Ok(ParseResult::New(Opaque::from_clang_ty(&canonical_ty), + None)); + } + + let kind = if location.kind() == CXCursor_TemplateRef || + (ty.template_args().is_some() && + ty_kind != CXType_Typedef) { + // This is a template instantiation. + match TemplateInstantiation::from_ty(&ty, ctx) { + Some(inst) => TypeKind::TemplateInstantiation(inst), + None => TypeKind::Opaque, + } + } else { + match ty_kind { + CXType_Unexposed if *ty != canonical_ty && + canonical_ty.kind() != CXType_Invalid && + ty.ret_type().is_none() && + // Sometime clang desugars some types more than + // what we need, specially with function + // pointers. + // + // We should also try the solution of inverting + // those checks instead of doing this, that is, + // something like: + // + // CXType_Unexposed if ty.ret_type().is_some() + // => { ... } + // + // etc. + !canonical_ty.spelling().contains("type-parameter") => { + debug!("Looking for canonical type: {:?}", canonical_ty); + return Self::from_clang_ty(potential_id, + &canonical_ty, + location, + parent_id, + ctx); + } + CXType_Unexposed | CXType_Invalid => { + // For some reason Clang doesn't give us any hint in some + // situations where we should generate a function pointer (see + // tests/headers/func_ptr_in_struct.h), so we do a guess here + // trying to see if it has a valid return type. + if ty.ret_type().is_some() { + let signature = + try!(FunctionSig::from_ty(ty, &location, ctx)); + TypeKind::Function(signature) + // Same here, with template specialisations we can safely + // assume this is a Comp(..) + } else if ty.is_fully_instantiated_template() { + debug!("Template specialization: {:?}, {:?} {:?}", + ty, + location, + canonical_ty); + let complex = CompInfo::from_ty(potential_id, + ty, + Some(location), + ctx) .expect("C'mon"); - TypeKind::Comp(complex) - } else if let Some(location) = location { - match location.kind() { - CXCursor_ClassTemplatePartialSpecialization | - CXCursor_CXXBaseSpecifier | - CXCursor_ClassTemplate => { - if location.kind() == CXCursor_CXXBaseSpecifier { - // In the case we're parsing a base specifier - // inside an unexposed or invalid type, it means - // that we're parsing one of two things: - // - // * A template parameter. - // * A complex class that isn't exposed. - // - // This means, unfortunately, that there's no - // good way to differentiate between them. - // - // Probably we could try to look at the - // declaration and complicate more this logic, - // but we'll keep it simple... if it's a valid - // C++ identifier, we'll consider it as a - // template parameter. - // - // This is because: - // - // * We expect every other base that is a - // proper identifier (that is, a simple - // struct/union declaration), to be exposed, - // so this path can't be reached in that - // case. - // - // * Quite conveniently, complex base - // specifiers preserve their full names (that - // is: Foo instead of Foo). We can take - // advantage of this. - // - // If we find some edge case where this doesn't - // work (which I guess is unlikely, see the - // different test cases[1][2][3][4]), we'd need - // to find more creative ways of differentiating - // these two cases. - // - // [1]: inherit_named.hpp - // [2]: forward-inherit-struct-with-fields.hpp - // [3]: forward-inherit-struct.hpp - // [4]: inherit-namespaced.hpp - if location.spelling() - .chars() - .all(|c| c.is_alphanumeric() || c == '_') { + TypeKind::Comp(complex) + } else { + match location.kind() { + CXCursor_CXXBaseSpecifier | + CXCursor_ClassTemplate => { + if location.kind() == + CXCursor_CXXBaseSpecifier { + // In the case we're parsing a base specifier + // inside an unexposed or invalid type, it means + // that we're parsing one of two things: + // + // * A template parameter. + // * A complex class that isn't exposed. + // + // This means, unfortunately, that there's no + // good way to differentiate between them. + // + // Probably we could try to look at the + // declaration and complicate more this logic, + // but we'll keep it simple... if it's a valid + // C++ identifier, we'll consider it as a + // template parameter. + // + // This is because: + // + // * We expect every other base that is a + // proper identifier (that is, a simple + // struct/union declaration), to be exposed, + // so this path can't be reached in that + // case. + // + // * Quite conveniently, complex base + // specifiers preserve their full names (that + // is: Foo instead of Foo). We can take + // advantage of this. + // + // If we find some edge case where this doesn't + // work (which I guess is unlikely, see the + // different test cases[1][2][3][4]), we'd need + // to find more creative ways of differentiating + // these two cases. + // + // [1]: inherit_named.hpp + // [2]: forward-inherit-struct-with-fields.hpp + // [3]: forward-inherit-struct.hpp + // [4]: inherit-namespaced.hpp + if location.spelling() + .chars() + .all(|c| { + c.is_alphanumeric() || c == '_' + }) { + return Err(ParseError::Recurse); + } + } else { + name = location.spelling(); + } + + let complex = CompInfo::from_ty(potential_id, + ty, + Some(location), + ctx); + match complex { + Ok(complex) => TypeKind::Comp(complex), + Err(_) => { + warn!("Could not create complex type \ + from class template or base \ + specifier, using opaque blob"); + let opaque = Opaque::from_clang_ty(ty); + return Ok(ParseResult::New(opaque, None)); + } + } + } + CXCursor_TypeAliasTemplateDecl => { + debug!("TypeAliasTemplateDecl"); + + // We need to manually unwind this one. + let mut inner = Err(ParseError::Continue); + let mut args = vec![]; + + location.visit(|cur| { + match cur.kind() { + CXCursor_TypeAliasDecl => { + let current = cur.cur_type(); + + debug_assert!(current.kind() == + CXType_Typedef); + + name = current.spelling(); + + let inner_ty = cur.typedef_type() + .expect("Not valid Type?"); + inner = + Item::from_ty(&inner_ty, + cur, + Some(potential_id), + ctx); + } + CXCursor_TemplateTypeParameter => { + let param = + Item::named_type(None, + cur, + ctx) + .expect("Item::named_type shouldn't \ + ever fail if we are looking \ + at a TemplateTypeParameter"); + args.push(param); + } + _ => {} + } + CXChildVisit_Continue + }); + + let inner_type = match inner { + Ok(inner) => inner, + Err(..) => { + error!("Failed to parse template alias \ + {:?}", + location); + return Err(ParseError::Continue); + } + }; + + TypeKind::TemplateAlias(inner_type, args) + } + CXCursor_TemplateRef => { + let referenced = location.referenced().unwrap(); + let referenced_ty = referenced.cur_type(); + + debug!("TemplateRef: location = {:?}; referenced = \ + {:?}; referenced_ty = {:?}", + location, + referenced, + referenced_ty); + + return Self::from_clang_ty(potential_id, + &referenced_ty, + referenced, + parent_id, + ctx); + } + CXCursor_TypeRef => { + let referenced = location.referenced().unwrap(); + let referenced_ty = referenced.cur_type(); + let declaration = referenced_ty.declaration(); + + debug!("TypeRef: location = {:?}; referenced = \ + {:?}; referenced_ty = {:?}", + location, + referenced, + referenced_ty); + + let item = + Item::from_ty_or_ref_with_id(potential_id, + referenced_ty, + declaration, + parent_id, + ctx); + return Ok(ParseResult::AlreadyResolved(item)); + } + CXCursor_NamespaceRef => { + return Err(ParseError::Continue); + } + _ => { + if ty.kind() == CXType_Unexposed { + warn!("Unexposed type {:?}, recursing inside, \ + loc: {:?}", + ty, + location); return Err(ParseError::Recurse); } - } else { - name = location.spelling(); - } - let complex = CompInfo::from_ty(potential_id, - ty, - Some(location), - ctx) - .expect("C'mon"); - TypeKind::Comp(complex) - } - CXCursor_TypeAliasTemplateDecl => { - debug!("TypeAliasTemplateDecl"); - // We need to manually unwind this one. - let mut inner = Err(ParseError::Continue); - let mut args = vec![]; - - location.visit(|cur| { - match cur.kind() { - CXCursor_TypeAliasDecl => { - let current = cur.cur_type(); - - debug_assert!(current.kind() == - CXType_Typedef); - - name = current.spelling(); - - let inner_ty = cur.typedef_type() - .expect("Not valid Type?"); - inner = - Item::from_ty(&inner_ty, - Some(cur), - Some(potential_id), - ctx); - } - CXCursor_TemplateTypeParameter => { - // See the comment in src/ir/comp.rs - // about the same situation. - if cur.spelling().is_empty() { - return CXChildVisit_Continue; - } - - let param = - Item::named_type(cur.spelling(), - potential_id, - ctx); - args.push(param); - } - _ => {} - } - CXChildVisit_Continue - }); - - let inner_type = match inner { - Ok(inner) => inner, - Err(..) => { - error!("Failed to parse template alias \ - {:?}", - location); - return Err(ParseError::Continue); - } - }; - - TypeKind::TemplateAlias(inner_type, args) - } - CXCursor_TemplateRef => { - let referenced = location.referenced().unwrap(); - let referenced_ty = referenced.cur_type(); - - debug!("TemplateRef: location = {:?}; referenced = \ - {:?}; referenced_ty = {:?}", - location, - referenced, - referenced_ty); - - return Self::from_clang_ty(potential_id, - &referenced_ty, - Some(referenced), - parent_id, - ctx); - } - CXCursor_TypeRef => { - let referenced = location.referenced().unwrap(); - let referenced_ty = referenced.cur_type(); - let declaration = referenced_ty.declaration(); - - debug!("TypeRef: location = {:?}; referenced = \ - {:?}; referenced_ty = {:?}", - location, - referenced, - referenced_ty); - - let item = - Item::from_ty_or_ref_with_id(potential_id, - referenced_ty, - Some(declaration), - parent_id, - ctx); - return Ok(ParseResult::AlreadyResolved(item)); - } - CXCursor_NamespaceRef => { - return Err(ParseError::Continue); - } - _ => { - if ty.kind() == CXType_Unexposed { - warn!("Unexposed type {:?}, recursing inside, \ - loc: {:?}", - ty, - location); - return Err(ParseError::Recurse); - } - - // If the type name is empty we're probably - // over-recursing to find a template parameter name - // or something like that, so just don't be too - // noisy with it since it causes confusion, see for - // example the discussion in: - // - // https://github.com/jamesmunns/teensy3-rs/issues/9 - if !ty.spelling().is_empty() { - warn!("invalid type {:?}", ty); - } else { warn!("invalid type {:?}", ty); + return Err(ParseError::Continue); } - return Err(ParseError::Continue); } } - } else { - // TODO: Don't duplicate this! - if ty.kind() == CXType_Unexposed { - warn!("Unexposed type {:?}, recursing inside", ty); - return Err(ParseError::Recurse); + } + CXType_Auto => { + if canonical_ty == *ty { + debug!("Couldn't find deduced type: {:?}", ty); + return Err(ParseError::Continue); } - if !ty.spelling().is_empty() { - warn!("invalid type {:?}", ty); - } else { - warn!("invalid type {:?}", ty); + return Self::from_clang_ty(potential_id, + &canonical_ty, + location, + parent_id, + ctx); + } + // NOTE: We don't resolve pointers eagerly because the pointee type + // might not have been parsed, and if it contains templates or + // something else we might get confused, see the comment inside + // TypeRef. + // + // We might need to, though, if the context is already in the + // process of resolving them. + CXType_ObjCObjectPointer | + CXType_MemberPointer | + CXType_Pointer => { + // Fun fact: the canonical type of a pointer type may sometimes + // contain information we need but isn't present in the concrete + // type (yeah, I'm equally wat'd). + // + // Yet we still have trouble if we unconditionally trust the + // canonical type, like too-much desugaring (sigh). + // + // See tests/headers/call-conv-field.h for an example. + // + // Since for now the only identifier cause of breakage is the + // ABI for function pointers, and different ABI mixed with + // problematic stuff like that one is _extremely_ unlikely and + // can be bypassed via blacklisting, we do the check explicitly + // (as hacky as it is). + // + // Yet we should probably (somehow) get the best of both worlds, + // presumably special-casing function pointers as a whole, yet + // someone is going to need to care about typedef'd function + // pointers, etc, which isn't trivial given function pointers + // are mostly unexposed. I don't have the time for it right now. + let mut pointee = ty.pointee_type().unwrap(); + let canonical_pointee = canonical_ty.pointee_type() + .unwrap(); + if pointee.call_conv() != canonical_pointee.call_conv() { + pointee = canonical_pointee; } - return Err(ParseError::Continue); + let inner = + Item::from_ty_or_ref(pointee, location, None, ctx); + TypeKind::Pointer(inner) } - } - CXType_Auto => { - if canonical_ty == *ty { - debug!("Couldn't find deduced type: {:?}", ty); - return Err(ParseError::Continue); + CXType_BlockPointer => TypeKind::BlockPointer, + // XXX: RValueReference is most likely wrong, but I don't think we + // can even add bindings for that, so huh. + CXType_RValueReference | + CXType_LValueReference => { + let inner = Item::from_ty_or_ref(ty.pointee_type() + .unwrap(), + location, + None, + ctx); + TypeKind::Reference(inner) } + // XXX DependentSizedArray is wrong + CXType_VariableArray | + CXType_DependentSizedArray => { + let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), + location, + None, + ctx) + .expect("Not able to resolve array element?"); + TypeKind::Pointer(inner) + } + CXType_IncompleteArray => { + let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), + location, + None, + ctx) + .expect("Not able to resolve array element?"); + TypeKind::Array(inner, 0) + } + CXType_FunctionNoProto | + CXType_FunctionProto => { + let signature = + try!(FunctionSig::from_ty(ty, &location, ctx)); + TypeKind::Function(signature) + } + CXType_Typedef => { + let inner = cursor.typedef_type().expect("Not valid Type?"); + let inner = + Item::from_ty_or_ref(inner, location, None, ctx); + TypeKind::Alias(inner) + } + CXType_Enum => { + let enum_ = Enum::from_ty(ty, ctx).expect("Not an enum?"); - return Self::from_clang_ty(potential_id, - &canonical_ty, - location, - parent_id, - ctx); - } - // NOTE: We don't resolve pointers eagerly because the pointee type - // might not have been parsed, and if it contains templates or - // something else we might get confused, see the comment inside - // TypeRef. - // - // We might need to, though, if the context is already in the - // process of resolving them. - CXType_ObjCObjectPointer | - CXType_MemberPointer | - CXType_Pointer => { - let inner = Item::from_ty_or_ref(ty.pointee_type().unwrap(), - location, - None, - ctx); - TypeKind::Pointer(inner) - } - CXType_BlockPointer => TypeKind::BlockPointer, - // XXX: RValueReference is most likely wrong, but I don't think we - // can even add bindings for that, so huh. - CXType_RValueReference | - CXType_LValueReference => { - let inner = Item::from_ty_or_ref(ty.pointee_type().unwrap(), - location, - None, - ctx); - TypeKind::Reference(inner) - } - // XXX DependentSizedArray is wrong - CXType_VariableArray | - CXType_DependentSizedArray => { - let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), - location, - None, - ctx) - .expect("Not able to resolve array element?"); - TypeKind::Pointer(inner) - } - CXType_IncompleteArray => { - let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), - location, - None, - ctx) - .expect("Not able to resolve array element?"); - TypeKind::Array(inner, 0) - } - CXType_FunctionNoProto | - CXType_FunctionProto => { - let signature = try!(FunctionSig::from_ty(ty, - &location.unwrap_or(cursor), - ctx)); - TypeKind::Function(signature) - } - CXType_Typedef => { - let inner = cursor.typedef_type().expect("Not valid Type?"); - let inner = Item::from_ty_or_ref(inner, location, None, ctx); - TypeKind::Alias(inner) - } - CXType_Enum => { - let enum_ = Enum::from_ty(ty, ctx).expect("Not an enum?"); - - if name.is_empty() { - let pretty_name = ty.spelling(); - if Self::is_valid_identifier(&pretty_name) { - name = pretty_name; + if name.is_empty() { + let pretty_name = ty.spelling(); + if Self::is_valid_identifier(&pretty_name) { + name = pretty_name; + } } - } - TypeKind::Enum(enum_) - } - CXType_Record => { - let complex = - CompInfo::from_ty(potential_id, ty, location, ctx) + TypeKind::Enum(enum_) + } + CXType_Record => { + let complex = CompInfo::from_ty(potential_id, + ty, + Some(location), + ctx) .expect("Not a complex type?"); - if name.is_empty() { - // The pretty-printed name may contain typedefed name, - // but may also be "struct (anonymous at .h:1)" - let pretty_name = ty.spelling(); - if Self::is_valid_identifier(&pretty_name) { - name = pretty_name; + if name.is_empty() { + // The pretty-printed name may contain typedefed name, + // but may also be "struct (anonymous at .h:1)" + let pretty_name = ty.spelling(); + if Self::is_valid_identifier(&pretty_name) { + name = pretty_name; + } } - } - TypeKind::Comp(complex) - } - // FIXME: We stub vectors as arrays since in 99% of the cases the - // layout is going to be correct, and there's no way we can generate - // vector types properly in Rust for now. - // - // That being said, that should be fixed eventually. - CXType_Vector | - CXType_ConstantArray => { - let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), - location, - None, - ctx) - .expect("Not able to resolve array element?"); - TypeKind::Array(inner, ty.num_elements().unwrap()) - } - CXType_Elaborated => { - return Self::from_clang_ty(potential_id, - &ty.named(), - location, - parent_id, - ctx); - } - CXType_ObjCInterface => { - let interface = ObjCInterface::from_ty(&location.unwrap(), ctx) - .expect("Not a valid objc interface?"); - TypeKind::ObjCInterface(interface) - } - _ => { - error!("unsupported type: kind = {:?}; ty = {:?}; at {:?}", - ty.kind(), - ty, - location); - return Err(ParseError::Continue); + TypeKind::Comp(complex) + } + // FIXME: We stub vectors as arrays since in 99% of the cases the + // layout is going to be correct, and there's no way we can generate + // vector types properly in Rust for now. + // + // That being said, that should be fixed eventually. + CXType_Vector | + CXType_ConstantArray => { + let inner = Item::from_ty(ty.elem_type().as_ref().unwrap(), + location, + None, + ctx) + .expect("Not able to resolve array element?"); + TypeKind::Array(inner, ty.num_elements().unwrap()) + } + CXType_Elaborated => { + return Self::from_clang_ty(potential_id, + &ty.named(), + location, + parent_id, + ctx); + } + CXType_ObjCId => TypeKind::ObjCId, + CXType_ObjCSel => TypeKind::ObjCSel, + CXType_ObjCClass | + CXType_ObjCInterface => { + let interface = ObjCInterface::from_ty(&location, ctx) + .expect("Not a valid objc interface?"); + name = interface.rust_name(); + TypeKind::ObjCInterface(interface) + } + _ => { + error!("unsupported type: kind = {:?}; ty = {:?}; at {:?}", + ty.kind(), + ty, + location); + return Err(ParseError::Continue); + } } }; @@ -1124,16 +1279,18 @@ impl Trace for Type { TypeKind::Array(inner, _) | TypeKind::Alias(inner) | TypeKind::ResolvedTypeRef(inner) => { - tracer.visit(inner); + tracer.visit_kind(inner, EdgeKind::TypeReference); } - - TypeKind::TemplateAlias(inner, ref template_args) | - TypeKind::TemplateInstantiation(inner, ref template_args) => { - tracer.visit(inner); - for &item in template_args { - tracer.visit(item); + TypeKind::TemplateAlias(inner, ref template_params) => { + tracer.visit_kind(inner, EdgeKind::TypeReference); + for &item in template_params { + tracer.visit_kind(item, + EdgeKind::TemplateParameterDefinition); } } + TypeKind::TemplateInstantiation(ref inst) => { + inst.trace(context, tracer, &()); + } TypeKind::Comp(ref ci) => ci.trace(context, tracer, item), TypeKind::Function(ref sig) => sig.trace(context, tracer, &()), TypeKind::Enum(ref en) => { @@ -1145,11 +1302,12 @@ impl Trace for Type { tracer.visit(id); } - TypeKind::ObjCInterface(_) => { - // TODO: + TypeKind::ObjCInterface(ref interface) => { + interface.trace(context, tracer, &()); } // None of these variants have edges to other items and types. + TypeKind::Opaque | TypeKind::UnresolvedTypeRef(_, _, None) | TypeKind::Named | TypeKind::Void | @@ -1157,6 +1315,8 @@ impl Trace for Type { TypeKind::Int(_) | TypeKind::Float(_) | TypeKind::Complex(_) | + TypeKind::ObjCId | + TypeKind::ObjCSel | TypeKind::BlockPointer => {} } } diff --git a/third_party/rust/bindgen/src/ir/var.rs b/third_party/rust/bindgen/src/ir/var.rs index 6cfcdae73518..656a1a6dfd57 100644 --- a/third_party/rust/bindgen/src/ir/var.rs +++ b/third_party/rust/bindgen/src/ir/var.rs @@ -1,6 +1,7 @@ //! Intermediate representation of variables. use super::context::{BindgenContext, ItemId}; +use super::dot::DotAttributes; use super::function::cursor_mangling; use super::int::IntKind; use super::item::Item; @@ -8,6 +9,7 @@ use super::ty::{FloatKind, TypeKind}; use cexpr; use clang; use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult}; +use std::io; use std::num::Wrapping; /// The type for a constant variable. @@ -84,6 +86,27 @@ impl Var { } } +impl DotAttributes for Var { + fn dot_attributes(&self, + _ctx: &BindgenContext, + out: &mut W) + -> io::Result<()> + where W: io::Write, + { + if self.is_const { + try!(writeln!(out, "consttrue")); + } + + if let Some(ref mangled) = self.mangled_name { + try!(writeln!(out, + "mangled name{}", + mangled)); + } + + Ok(()) + } +} + impl ClangSubItemParser for Var { fn parse(cursor: clang::Cursor, ctx: &mut BindgenContext) @@ -93,6 +116,11 @@ impl ClangSubItemParser for Var { use cexpr::literal::CChar; match cursor.kind() { CXCursor_MacroDefinition => { + + if let Some(visitor) = ctx.parse_callbacks() { + visitor.parsed_macro(&cursor.spelling()); + } + let value = parse_macro(ctx, &cursor, ctx.translation_unit()); let (id, value) = match value { @@ -123,7 +151,7 @@ impl ClangSubItemParser for Var { let (type_kind, val) = match value { EvalResult::Invalid => return Err(ParseError::Continue), EvalResult::Float(f) => { - (TypeKind::Float(FloatKind::Float), VarType::Float(f)) + (TypeKind::Float(FloatKind::Double), VarType::Float(f)) } EvalResult::Char(c) => { let c = match c { @@ -147,7 +175,7 @@ impl ClangSubItemParser for Var { (TypeKind::Pointer(char_ty), VarType::String(val)) } EvalResult::Int(Wrapping(value)) => { - let kind = ctx.type_chooser() + let kind = ctx.parse_callbacks() .and_then(|c| c.int_macro(&name, value)) .unwrap_or_else(|| if value < 0 { if value < i32::min_value() as i64 { @@ -155,9 +183,7 @@ impl ClangSubItemParser for Var { } else { IntKind::Int } - } else if value > - u32::max_value() as - i64 { + } else if value > u32::max_value() as i64 { IntKind::ULongLong } else { IntKind::UInt @@ -184,7 +210,7 @@ impl ClangSubItemParser for Var { // XXX this is redundant, remove! let is_const = ty.is_const(); - let ty = match Item::from_ty(&ty, Some(cursor), None, ctx) { + let ty = match Item::from_ty(&ty, cursor, None, ctx) { Ok(ty) => ty, Err(e) => { assert_eq!(ty.kind(), @@ -238,7 +264,7 @@ impl ClangSubItemParser for Var { .map(VarType::String) }; - let mangling = cursor_mangling(&cursor); + let mangling = cursor_mangling(ctx, &cursor); let var = Var::new(name, mangling, ty, value, is_const); Ok(ParseResult::New(var, Some(cursor))) diff --git a/third_party/rust/bindgen/src/lib.rs b/third_party/rust/bindgen/src/lib.rs index 42363ebdb108..5d8237fbff2e 100644 --- a/third_party/rust/bindgen/src/lib.rs +++ b/third_party/rust/bindgen/src/lib.rs @@ -3,7 +3,7 @@ //! Provide a C/C++ header file, receive Rust FFI code to call into C/C++ //! functions and use types defined in the header. //! -//! See the [Builder](./struct.Builder.html) struct for usage. +//! See the [`Builder`](./struct.Builder.html) struct for usage. #![deny(missing_docs)] #![deny(warnings)] @@ -37,16 +37,19 @@ extern crate log; #[macro_use] mod log_stubs; +#[macro_use] +mod extra_assertions; + // A macro to declare an internal module for which we *must* provide -// documentation for. If we are building with the "docs_" feature, then the -// module is declared public, and our `#![deny(missing_docs)]` pragma applies to -// it. This feature is used in CI, so we won't let anything slip by +// documentation for. If we are building with the "testing_only_docs" feature, +// then the module is declared public, and our `#![deny(missing_docs)]` pragma +// applies to it. This feature is used in CI, so we won't let anything slip by // undocumented. Normal builds, however, will leave the module private, so that // we don't expose internals to library consumers. macro_rules! doc_mod { ($m:ident, $doc_mod_name:ident) => { cfg_if! { - if #[cfg(feature = "docs_")] { + if #[cfg(feature = "testing_only_docs")] { pub mod $doc_mod_name { //! Autogenerated documentation module. pub use super::$m::*; @@ -63,7 +66,7 @@ mod parse; mod regex_set; mod uses; -pub mod chooser; +pub mod callbacks; #[cfg(rustfmt)] mod codegen; @@ -86,7 +89,7 @@ use regex_set::RegexSet; use std::fs::OpenOptions; use std::io::{self, Write}; use std::path::Path; -use std::sync::{Arc, Mutex}; +use std::sync::Arc; use syntax::ast; use syntax::codemap::{DUMMY_SP, Span}; @@ -109,6 +112,8 @@ pub struct CodegenConfig { pub methods: bool, /// Whether to generate constructors. pub constructors: bool, + /// Whether to generate destructors. + pub destructors: bool, } impl CodegenConfig { @@ -120,6 +125,7 @@ impl CodegenConfig { vars: true, methods: true, constructors: true, + destructors: true, } } @@ -131,6 +137,7 @@ impl CodegenConfig { vars: false, methods: false, constructors: false, + destructors: false, } } } @@ -168,13 +175,288 @@ pub fn builder() -> Builder { } impl Builder { - /// Set the input C/C++ header. + /// Generates the command line flags use for creating `Builder`. + pub fn command_line_flags(&self) -> Vec { + let mut output_vector: Vec = Vec::new(); + + if let Some(ref header) = self.options.input_header { + //Positional argument 'header' + output_vector.push(header.clone().into()); + } + + self.options + .bitfield_enums + .get_items() + .iter() + .map(|item| { + output_vector.push("--bitfield-enum".into()); + output_vector.push(item.trim_left_matches("^").trim_right_matches("$").into()); + }) + .count(); + + self.options + .constified_enums + .get_items() + .iter() + .map(|item| { + output_vector.push("--constified-enum".into()); + output_vector.push(item.trim_left_matches("^").trim_right_matches("$").into()); + }) + .count(); + + self.options + .hidden_types + .get_items() + .iter() + .map(|item| { + output_vector.push("--blacklist-type".into()); + output_vector.push(item.trim_left_matches("^").trim_right_matches("$").into()); + }) + .count(); + + if !self.options.layout_tests { + output_vector.push("--no-layout-tests".into()); + } + + if !self.options.derive_debug { + output_vector.push("--no-derive-debug".into()); + } + + if !self.options.derive_default { + output_vector.push("--no-derive-default".into()); + } else { + output_vector.push("--with-derive-default".into()); + } + + if !self.options.generate_comments { + output_vector.push("--no-doc-comments".into()); + } + + if !self.options.whitelist_recursively { + output_vector.push("--no-recursive-whitelist".into()); + } + + if self.options.objc_extern_crate { + output_vector.push("--objc-extern-crate".into()); + } + + if self.options.builtins { + output_vector.push("--builtins".into()); + } + + if let Some(ref prefix) = self.options.ctypes_prefix { + output_vector.push("--ctypes-prefix".into()); + output_vector.push(prefix.clone()); + } + + if let Some(ref dummy) = self.options.dummy_uses { + output_vector.push("--dummy-uses".into()); + output_vector.push(dummy.clone()); + } + + if self.options.emit_ast { + output_vector.push("--emit-clang-ast".into()); + } + + if self.options.emit_ir { + output_vector.push("--emit-ir".into()); + } + if let Some(ref graph) = self.options.emit_ir_graphviz { + output_vector.push("--emit-ir-graphviz".into()); + output_vector.push(graph.clone()) + } + if self.options.enable_cxx_namespaces { + output_vector.push("--enable-cxx-namespaces".into()); + } + if self.options.disable_name_namespacing { + output_vector.push("--disable-name-namespacing".into()); + } + + self.options + .links + .iter() + .map(|&(ref item, _)| { + output_vector.push("--framework".into()); + output_vector.push(item.trim_left_matches("^").trim_right_matches("$").into()); + }) + .count(); + + if !self.options.codegen_config.functions { + output_vector.push("--ignore-functions".into()); + } + + output_vector.push("--generate".into()); + + //Temporary placeholder for below 4 options + let mut options:Vec = Vec::new(); + if self.options.codegen_config.functions { + options.push("function".into()); + } + if self.options.codegen_config.types { + options.push("types".into()); + } + if self.options.codegen_config.vars { + options.push("vars".into()); + } + if self.options.codegen_config.methods { + options.push("methods".into()); + } + if self.options.codegen_config.constructors { + options.push("constructors".into()); + } + if self.options.codegen_config.destructors { + options.push("destructors".into()); + } + + output_vector.push(options.join(",")); + + if !self.options.codegen_config.methods { + output_vector.push("--ignore-methods".into()); + } + + self.options + .links + .iter() + .map(|&(ref item, _)| { + output_vector.push("--clang-args".into()); + output_vector.push(item.trim_left_matches("^").trim_right_matches("$").into()); + }) + .count(); + + if !self.options.convert_floats { + output_vector.push("--no-convert-floats".into()); + } + + if !self.options.prepend_enum_name { + output_vector.push("--no-prepend-enum-name".into()); + } + + if !self.options.unstable_rust { + output_vector.push("--no-unstable-rust".into()); + } + + self.options + .opaque_types + .get_items() + .iter() + .map(|item| { + output_vector.push("--opaque-type".into()); + output_vector.push(item.trim_left_matches("^").trim_right_matches("$").into()); + }) + .count(); + + self.options + .raw_lines + .iter() + .map(|item| { + output_vector.push("--raw-line".into()); + output_vector.push(item.trim_left_matches("^").trim_right_matches("$").into()); + }) + .count(); + + self.options + .links + .iter() + .map(|&(ref item, _)| { + output_vector.push("--static".into()); + output_vector.push(item.trim_left_matches("^").trim_right_matches("$").into()); + }) + .count(); + + if self.options.use_core { + output_vector.push("--use-core".into()); + } + + if self.options.conservative_inline_namespaces { + output_vector.push("--conservative-inline-namespaces".into()); + } + + self.options + .whitelisted_functions + .get_items() + .iter() + .map(|item| { + output_vector.push("--whitelist-function".into()); + output_vector.push(item.trim_left_matches("^").trim_right_matches("$").into()); + }) + .count(); + + self.options + .whitelisted_types + .get_items() + .iter() + .map(|item| { + output_vector.push("--whitelist-type".into()); + output_vector.push(item.trim_left_matches("^").trim_right_matches("$").into()); + }) + .count(); + + self.options + .whitelisted_vars + .get_items() + .iter() + .map(|item| { + output_vector.push("--whitelist-var".into()); + output_vector.push(item.trim_left_matches("^").trim_right_matches("$").into()); + }) + .count(); + + if !self.options.clang_args.is_empty() { + output_vector.push("--".into()); + self.options + .clang_args + .iter() + .cloned() + .map(|item| { + output_vector.push(item); + }) + .count(); + } + + output_vector + } + + /// Add an input C/C++ header to generate bindings for. + /// + /// This can be used to generate bindings to a single header: + /// + /// ```ignore + /// let bindings = bindgen::Builder::default() + /// .header("input.h") + /// .generate() + /// .unwrap(); + /// ``` + /// + /// Or you can invoke it multiple times to generate bindings to multiple + /// headers: + /// + /// ```ignore + /// let bindings = bindgen::Builder::default() + /// .header("first.h") + /// .header("second.h") + /// .header("third.h") + /// .generate() + /// .unwrap(); + /// ``` pub fn header>(mut self, header: T) -> Builder { + if let Some(prev_header) = self.options.input_header.take() { + self.options.clang_args.push("-include".into()); + self.options.clang_args.push(prev_header); + } + let header = header.into(); self.options.input_header = Some(header); self } + /// Add `contents` as an input C/C++ header named `name`. + /// + /// The file `name` will be added to the clang arguments. + pub fn header_contents(mut self, name: &str, contents: &str) -> Builder { + self.options.input_unsaved_files.push(clang::UnsavedFile::new(name, contents)); + self + } + /// Set the output graphviz file. pub fn emit_ir_graphviz>(mut self, path: T) -> Builder { let path = path.into(); @@ -199,19 +481,31 @@ impl Builder { /// /// This can be used to get bindgen to generate _exactly_ the types you want /// in your bindings, and then import other types manually via other means - /// (like `raw_line`). + /// (like [`raw_line`](#method.raw_line)). pub fn whitelist_recursively(mut self, doit: bool) -> Self { self.options.whitelist_recursively = doit; self } - /// Generate '#[macro_use] extern crate objc;' instead of 'use objc;' + /// Generate `#[macro_use] extern crate objc;` instead of `use objc;` /// in the prologue of the files generated from objective-c files pub fn objc_extern_crate(mut self, doit: bool) -> Self { self.options.objc_extern_crate = doit; self } + /// Whether to use the clang-provided name mangling. This is true by default + /// and probably needed for C++ features. + /// + /// However, some old libclang versions seem to return incorrect results in + /// some cases for non-mangled functions, see [1], so we allow disabling it. + /// + /// [1]: https://github.com/servo/rust-bindgen/issues/528 + pub fn trust_clang_mangling(mut self, doit: bool) -> Self { + self.options.enable_mangling = doit; + self + } + /// Generate a C/C++ file that includes the header and has dummy uses of /// every type defined in the header. pub fn dummy_uses>(mut self, dummy_uses: T) -> Builder { @@ -290,6 +584,16 @@ impl Builder { self } + /// Add arguments to be passed straight through to clang. + pub fn clang_args(mut self, iter: I) -> Builder + where I: IntoIterator, + I::Item: AsRef { + for arg in iter { + self = self.clang_arg(arg.as_ref()) + } + self + } + /// Make the generated bindings link the given shared library. pub fn link>(mut self, library: T) -> Builder { self.options.links.push((library.into(), LinkType::Default)); @@ -315,12 +619,18 @@ impl Builder { self } - /// Avoid converting floats to f32/f64 by default. + /// Avoid converting floats to `f32`/`f64` by default. pub fn no_convert_floats(mut self) -> Self { self.options.convert_floats = false; self } + /// Set whether layout tests should be generated. + pub fn layout_tests(mut self, doit: bool) -> Self { + self.options.layout_tests = doit; + self + } + /// Set whether `Debug` should be derived by default. pub fn derive_debug(mut self, doit: bool) -> Self { self.options.derive_debug = doit; @@ -351,20 +661,19 @@ impl Builder { self } - /// Disable auto-namespacing of names if namespaces are disabled. + /// Disable name auto-namespacing. /// - /// By default, if namespaces are disabled, bindgen tries to mangle the - /// names to from `foo::bar::Baz` to look like `foo_bar_Baz`, instead of - /// just `Baz`. + /// By default, bindgen mangles names like `foo::bar::Baz` to look like + /// `foo_bar_Baz` instead of just `Baz`. /// - /// This option disables that behavior. + /// This method disables that behavior. /// - /// Note that this intentionally doesn't change the names using for - /// whitelisting and blacklisting, that should still be mangled with the + /// Note that this intentionally does not change the names used for + /// whitelisting and blacklisting, which should still be mangled with the /// namespaces. /// - /// Note, also, that using this option may cause duplicated names to be - /// generated. + /// Note, also, that this option may cause bindgen to generate duplicate + /// names. pub fn disable_name_namespacing(mut self) -> Builder { self.options.disable_name_namespacing = true; self @@ -403,6 +712,16 @@ impl Builder { self } + /// Whether inline functions should be generated or not. + /// + /// Note that they will usually not work. However you can use + /// `-fkeep-inline-functions` or `-fno-inline-functions` if you are + /// responsible of compiling the library to make them callable. + pub fn generate_inline_functions(mut self, doit: bool) -> Self { + self.options.generate_inline_functions = doit; + self + } + /// Ignore functions. pub fn ignore_functions(mut self) -> Builder { self.options.codegen_config.functions = false; @@ -433,19 +752,26 @@ impl Builder { self } - /// Allows configuring types in different situations, see the `TypeChooser` - /// documentation. - pub fn type_chooser(mut self, cb: Box) -> Self { - self.options.type_chooser = Some(cb); + /// Allows configuring types in different situations, see the + /// [`ParseCallbacks`](./callbacks/trait.ParseCallbacks.html) documentation. + pub fn parse_callbacks(mut self, cb: Box) -> Self { + self.options.parse_callbacks = Some(cb); self } - /// Choose what to generate using a CodegenConfig. + /// Choose what to generate using a + /// [`CodegenConfig`](./struct.CodegenConfig.html). pub fn with_codegen_config(mut self, config: CodegenConfig) -> Self { self.options.codegen_config = config; self } + /// Prepend the enum name to constant or bitfield variants. + pub fn prepend_enum_name(mut self, doit: bool) -> Self { + self.options.prepend_enum_name = doit; + self + } + /// Generate the Rust bindings using the options built up thus far. pub fn generate<'ctx>(self) -> Result, ()> { Bindings::generate(self.options, None) @@ -508,11 +834,14 @@ pub struct BindgenOptions { /// True if we should avoid mangling names with namespaces. pub disable_name_namespacing: bool, - /// True if we shold derive Debug trait implementations for C/C++ structures + /// True if we should generate layout tests for generated structures. + pub layout_tests: bool, + + /// True if we should derive Debug trait implementations for C/C++ structures /// and types. pub derive_debug: bool, - /// True if we shold derive Default trait implementations for C/C++ structures + /// True if we should derive Default trait implementations for C/C++ structures /// and types. pub derive_default: bool, @@ -545,13 +874,16 @@ pub struct BindgenOptions { /// The input header file. pub input_header: Option, + /// Unsaved files for input. + pub input_unsaved_files: Vec, + /// Generate a dummy C/C++ file that includes the header and has dummy uses /// of all types defined therein. See the `uses` module for more. pub dummy_uses: Option, - /// A user-provided type chooser to allow customizing different kinds of + /// A user-provided visitor to allow customizing different kinds of /// situations. - pub type_chooser: Option>, + pub parse_callbacks: Option>, /// Which kind of items should we generate? By default, we'll generate all /// of them. @@ -566,12 +898,27 @@ pub struct BindgenOptions { /// documentation for more details. pub generate_comments: bool, + /// Whether to generate inline functions. Defaults to false. + pub generate_inline_functions: bool, + /// Wether to whitelist types recursively. Defaults to true. pub whitelist_recursively: bool, /// Intead of emitting 'use objc;' to files generated from objective c files, /// generate '#[macro_use] extern crate objc;' pub objc_extern_crate: bool, + + /// Whether to use the clang-provided name mangling. This is true and + /// probably needed for C++ features. + /// + /// However, some old libclang versions seem to return incorrect results in + /// some cases for non-mangled functions, see [1], so we allow disabling it. + /// + /// [1]: https://github.com/servo/rust-bindgen/issues/528 + pub enable_mangling: bool, + + /// Whether to prepend the enum name to bitfield or constant variants. + pub prepend_enum_name: bool, } /// TODO(emilio): This is sort of a lie (see the error message that results from @@ -606,6 +953,7 @@ impl Default for BindgenOptions { emit_ast: false, emit_ir: false, emit_ir_graphviz: None, + layout_tests: true, derive_debug: true, derive_default: false, enable_cxx_namespaces: false, @@ -619,13 +967,17 @@ impl Default for BindgenOptions { raw_lines: vec![], clang_args: vec![], input_header: None, + input_unsaved_files: vec![], dummy_uses: None, - type_chooser: None, + parse_callbacks: None, codegen_config: CodegenConfig::all(), conservative_inline_namespaces: false, generate_comments: true, + generate_inline_functions: false, whitelist_recursively: true, objc_extern_crate: false, + enable_mangling: true, + prepend_enum_name: true, } } } @@ -653,23 +1005,15 @@ fn ensure_libclang_is_loaded() { // across different threads. lazy_static! { - static ref LIBCLANG: Mutex>> = { - Mutex::new(None) + static ref LIBCLANG: Arc = { + clang_sys::load().expect("Unable to find libclang"); + clang_sys::get_library() + .expect("We just loaded libclang and it had better still be \ + here!") }; } - let mut libclang = LIBCLANG.lock().unwrap(); - if !clang_sys::is_loaded() { - if libclang.is_none() { - // TODO(emilio): Return meaningful error (breaking). - clang_sys::load().expect("Unable to find libclang"); - *libclang = Some(clang_sys::get_library() - .expect("We just loaded libclang and it had \ - better still be here!")); - } else { - clang_sys::set_library(libclang.clone()); - } - } + clang_sys::set_library(Some(LIBCLANG.clone())); } /// Generated Rust bindings. @@ -716,6 +1060,10 @@ impl<'ctx> Bindings<'ctx> { options.clang_args.push(h.clone()) } + for f in options.input_unsaved_files.iter() { + options.clang_args.push(f.name.to_str().unwrap().to_owned()) + } + let mut context = BindgenContext::new(options); try!(parse(&mut context)); @@ -802,12 +1150,7 @@ impl<'ctx> Bindings<'ctx> { /// Determines whether the given cursor is in any of the files matched by the /// options. fn filter_builtins(ctx: &BindgenContext, cursor: &clang::Cursor) -> bool { - let (file, _, _, _) = cursor.location().location(); - - match file.name() { - None => ctx.options().builtins, - Some(..) => true, - } + ctx.options().builtins || !cursor.is_builtin() } /// Parse one `Item` from the Clang cursor. @@ -847,8 +1190,17 @@ fn parse(context: &mut BindgenContext) -> Result<(), ()> { } let cursor = context.translation_unit().cursor(); + if context.options().emit_ast { - cursor.visit(|cur| clang::ast_dump(&cur, 0)); + + fn dump_if_not_builtin(cur: &clang::Cursor) -> CXChildVisitResult { + if !cur.is_builtin() { + clang::ast_dump(&cur, 0) + } else { + CXChildVisit_Continue + } + } + cursor.visit(|cur| dump_if_not_builtin(&cur)); } let root = context.root_module(); @@ -904,3 +1256,38 @@ pub fn clang_version() -> ClangVersion { full: raw_v.clone(), } } + +/// Test command_line_flag function. +#[test] +fn commandline_flag_unit_test_function() { + //Test 1 + let bindings = ::builder(); + let command_line_flags = bindings.command_line_flags(); + + let test_cases = vec!["--no-derive-default", + "--generate", "function,types,vars,methods,constructors,destructors"] + .iter() + .map(|&x| x.into()) + .collect::>(); + + assert!(test_cases.iter().all(|ref x| command_line_flags.contains(x)) ); + + //Test 2 + let bindings = ::builder().header("input_header") + .whitelisted_type("Distinct_Type") + .whitelisted_function("safe_function"); + + let command_line_flags = bindings.command_line_flags(); + let test_cases = vec!["input_header", + "--no-derive-default", + "--generate", "function,types,vars,methods,constructors,destructors", + "--whitelist-type", "Distinct_Type", + "--whitelist-function", "safe_function"] + .iter() + .map(|&x| x.into()) + .collect::>(); + println!("{:?}", command_line_flags); + + assert!(test_cases.iter().all(|ref x| command_line_flags.contains(x)) ); + +} diff --git a/third_party/rust/bindgen/src/log_stubs.rs b/third_party/rust/bindgen/src/log_stubs.rs index 4262e1204011..4a72d9a5eaf0 100644 --- a/third_party/rust/bindgen/src/log_stubs.rs +++ b/third_party/rust/bindgen/src/log_stubs.rs @@ -1,12 +1,12 @@ macro_rules! log { - (target: $target:expr, $lvl:expr, $($arg)+) => { + (target: $target:expr, $lvl:expr, $($arg:tt)+) => { let _ = $target; let _ = log!($lvl, $($arg)+); }; - ($lvl:expr, $($arg:tt)+) => { + ($lvl:expr, $($arg:tt)+) => {{ let _ = $lvl; let _ = format_args!($($arg)+); - }; + }}; } macro_rules! error { (target: $target:expr, $($arg:tt)*) => { log!($target, $($arg)*); }; diff --git a/third_party/rust/bindgen/src/main.rs b/third_party/rust/bindgen/src/main.rs index df596e0b934d..603a65556217 100644 --- a/third_party/rust/bindgen/src/main.rs +++ b/third_party/rust/bindgen/src/main.rs @@ -1,19 +1,25 @@ extern crate bindgen; +#[cfg(feature="logging")] extern crate env_logger; #[macro_use] +#[cfg(feature="logging")] extern crate log; extern crate clang_sys; extern crate clap; -extern crate rustc_serialize; use bindgen::clang_version; use std::env; use std::panic; +#[macro_use] +#[cfg(not(feature="logging"))] +mod log_stubs; + mod options; use options::builder_from_flags; pub fn main() { + #[cfg(feature="logging")] log::set_logger(|max_log_level| { use env_logger::Logger; let env_logger = Logger::new(); diff --git a/third_party/rust/bindgen/src/options.rs b/third_party/rust/bindgen/src/options.rs index e54ee0124ef4..bbf9c0ddb8db 100644 --- a/third_party/rust/bindgen/src/options.rs +++ b/third_party/rust/bindgen/src/options.rs @@ -35,11 +35,14 @@ pub fn builder_from_flags .number_of_values(1), Arg::with_name("blacklist-type") .long("blacklist-type") - .help("Mark a type as hidden.") + .help("Mark as hidden.") .value_name("type") .takes_value(true) .multiple(true) .number_of_values(1), + Arg::with_name("no-layout-tests") + .long("no-layout-tests") + .help("Avoid generating layout tests for any type."), Arg::with_name("no-derive-debug") .long("no-derive-debug") .help("Avoid deriving Debug on any type."), @@ -49,17 +52,20 @@ pub fn builder_from_flags .help("Avoid deriving Default on any type."), Arg::with_name("with-derive-default") .long("with-derive-default") - .help("Deriving Default on any type."), + .help("Derive Default on any type."), Arg::with_name("no-doc-comments") .long("no-doc-comments") .help("Avoid including doc comments in the output, see: \ https://github.com/servo/rust-bindgen/issues/426"), Arg::with_name("no-recursive-whitelist") .long("no-recursive-whitelist") - .help("Avoid whitelisting types recursively"), + .help("Avoid whitelisting types recursively."), Arg::with_name("objc-extern-crate") .long("objc-extern-crate") - .help("Use extern crate instead of use for objc"), + .help("Use extern crate instead of use for objc."), + Arg::with_name("distrust-clang-mangling") + .long("distrust-clang-mangling") + .help("Do not trust the libclang-provided mangling"), Arg::with_name("builtins") .long("builtins") .help("Output bindings for builtin definitions, e.g. \ @@ -94,7 +100,9 @@ pub fn builder_from_flags .help("Enable support for C++ namespaces."), Arg::with_name("disable-name-namespacing") .long("disable-name-namespacing") - .help("Disable name namespacing if namespaces are disabled."), + .help("Disable namespacing via mangling, causing bindgen to \ + generate names like \"Baz\" instead of \"foo_bar_Baz\" \ + for an input name \"foo::bar::Baz\"."), Arg::with_name("framework") .long("framework-link") .help("Link to framework.") @@ -107,9 +115,9 @@ pub fn builder_from_flags is useful when you only care about struct layouts."), Arg::with_name("generate") .long("generate") - .help("Generate a given kind of items, split by commas. \ - Valid values are \"functions\",\"types\", \"vars\" and \ - \"methods\".") + .help("Generate only given items, split by commas. \ + Valid values are \"functions\",\"types\", \"vars\", \ + \"methods\", \"constructors\" and \"destructors\".") .takes_value(true), Arg::with_name("ignore-methods") .long("ignore-methods") @@ -123,14 +131,17 @@ pub fn builder_from_flags .number_of_values(1), Arg::with_name("no-convert-floats") .long("no-convert-floats") - .help("Don't automatically convert floats to f32/f64."), + .help("Do not automatically convert floats to f32/f64."), + Arg::with_name("no-prepend-enum-name") + .long("no-prepend-enum-name") + .help("Do not prepend the enum name to bitfield or constant variants."), Arg::with_name("no-unstable-rust") .long("no-unstable-rust") .help("Do not generate unstable Rust code.") .multiple(true), // FIXME: Pass legacy test suite Arg::with_name("opaque-type") .long("opaque-type") - .help("Mark a type as opaque.") + .help("Mark as opaque.") .value_name("type") .takes_value(true) .multiple(true) @@ -171,6 +182,9 @@ pub fn builder_from_flags .takes_value(true) .multiple(true) .number_of_values(1), + Arg::with_name("generate-inline-functions") + .long("generate-inline-functions") + .help("Generate inline functions."), Arg::with_name("whitelist-type") .long("whitelist-type") .help("Whitelist the type. Other non-whitelisted types will \ @@ -190,7 +204,7 @@ pub fn builder_from_flags .number_of_values(1), Arg::with_name("verbose") .long("verbose") - .help("Print verbose error messages"), + .help("Print verbose error messages."), ]) // .args() .get_matches_from(args); @@ -224,6 +238,10 @@ pub fn builder_from_flags builder = builder.emit_builtins(); } + if matches.is_present("no-layout-tests") { + builder = builder.layout_tests(false); + } + if matches.is_present("no-derive-debug") { builder = builder.derive_debug(false); } @@ -236,6 +254,10 @@ pub fn builder_from_flags builder = builder.derive_default(false); } + if matches.is_present("no-prepend-enum-name") { + builder = builder.prepend_enum_name(false); + } + if let Some(prefix) = matches.value_of("ctypes-prefix") { builder = builder.ctypes_prefix(prefix); } @@ -258,6 +280,8 @@ pub fn builder_from_flags "types" => config.types = true, "vars" => config.vars = true, "methods" => config.methods = true, + "constructors" => config.constructors = true, + "destructors" => config.destructors = true, _ => { return Err(Error::new(ErrorKind::Other, "Unknown generate item")); @@ -317,6 +341,10 @@ pub fn builder_from_flags builder = builder.whitelist_recursively(false); } + if matches.is_present("objc-extern-crate") { + builder = builder.objc_extern_crate(true); + } + if let Some(opaque_types) = matches.values_of("opaque-type") { for ty in opaque_types { builder = builder.opaque_type(ty); @@ -339,10 +367,18 @@ pub fn builder_from_flags builder = builder.use_core(); } + if matches.is_present("distrust-clang-mangling") { + builder = builder.trust_clang_mangling(false); + } + if matches.is_present("conservative-inline-namespaces") { builder = builder.conservative_inline_namespaces(); } + if matches.is_present("generate-inline-functions") { + builder = builder.generate_inline_functions(true); + } + if let Some(whitelist) = matches.values_of("whitelist-function") { for regex in whitelist { builder = builder.whitelisted_function(regex); diff --git a/third_party/rust/bindgen/src/parse.rs b/third_party/rust/bindgen/src/parse.rs index 0e4164f0b31c..73bb7b25d8dd 100644 --- a/third_party/rust/bindgen/src/parse.rs +++ b/third_party/rust/bindgen/src/parse.rs @@ -49,7 +49,7 @@ pub trait ClangItemParser: Sized { /// Parse this item from the given Clang type. fn from_ty(ty: &clang::Type, - location: Option, + location: clang::Cursor, parent: Option, ctx: &mut BindgenContext) -> Result; @@ -58,7 +58,7 @@ pub trait ClangItemParser: Sized { /// newly parsed item. fn from_ty_with_id(id: ItemId, ty: &clang::Type, - location: Option, + location: clang::Cursor, parent: Option, ctx: &mut BindgenContext) -> Result; @@ -66,7 +66,7 @@ pub trait ClangItemParser: Sized { /// Parse this item from the given Clang type, or if we haven't resolved all /// the other items this one depends on, an unresolved reference. fn from_ty_or_ref(ty: clang::Type, - location: Option, + location: clang::Cursor, parent_id: Option, context: &mut BindgenContext) -> ItemId; @@ -75,26 +75,16 @@ pub trait ClangItemParser: Sized { /// `ItemId` for the newly parsed item. fn from_ty_or_ref_with_id(potential_id: ItemId, ty: clang::Type, - location: Option, + location: clang::Cursor, parent_id: Option, context: &mut BindgenContext) -> ItemId; /// Create a named template type. - fn named_type(name: S, - parent: ItemId, - context: &mut BindgenContext) - -> ItemId - where S: Into; - - /// Identical to `named_type`, but use `id` as the resulting item's - /// `ItemId`. - fn named_type_with_id(id: ItemId, - name: S, - parent: ItemId, - context: &mut BindgenContext) - -> ItemId - where S: Into; + fn named_type(with_id: Option, + location: clang::Cursor, + ctx: &mut BindgenContext) + -> Option; /// Create a builtin type. fn builtin_type(kind: TypeKind, diff --git a/third_party/rust/bindgen/src/regex_set.rs b/third_party/rust/bindgen/src/regex_set.rs index 2eff740b8626..a93e7a1357eb 100644 --- a/third_party/rust/bindgen/src/regex_set.rs +++ b/third_party/rust/bindgen/src/regex_set.rs @@ -35,6 +35,15 @@ impl RegexSet { self.items.push(format!("^{}$", string.as_ref())); self.set = None; } + + /// Returns slice of String from its field 'items' + pub fn get_items(&self) -> &[String] { + &self.items[..] + } + /// Returns reference of its field 'set' + pub fn get_set(&self) -> Option<&RxSet> { + self.set.as_ref() + } /// Construct a RegexSet from the set of entries we've accumulated. /// diff --git a/third_party/rust/bindgen/src/uses.rs b/third_party/rust/bindgen/src/uses.rs index 47f72da6fb3e..fee2be24ed13 100644 --- a/third_party/rust/bindgen/src/uses.rs +++ b/third_party/rust/bindgen/src/uses.rs @@ -37,6 +37,7 @@ use ir::context::BindgenContext; use ir::item::{Item, ItemAncestors, ItemCanonicalName}; +use ir::template::TemplateParameters; use std::io; // Like `canonical_path`, except we always take namespaces into account, ignore @@ -83,9 +84,9 @@ pub fn generate_dummy_uses(ctx: &mut BindgenContext, // these. !ty.is_builtin_or_named() && // And finally, we won't be creating any dummy - // specializations, so ignore template declarations and - // partial specializations. - item.applicable_template_args(ctx).is_empty() + // instantiations, so ignore template declarations and + // instantiations. + item.all_template_params(ctx).is_none() } else { false } diff --git a/third_party/rust/bindgen/tests/headers/16-byte-alignment.h b/third_party/rust/bindgen/tests/headers/16-byte-alignment.h deleted file mode 100644 index 7a7f7548eb13..000000000000 --- a/third_party/rust/bindgen/tests/headers/16-byte-alignment.h +++ /dev/null @@ -1,33 +0,0 @@ - -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; - -struct rte_ipv4_tuple { - uint32_t src_addr; - uint32_t dst_addr; - union { - struct { - uint16_t dport; - uint16_t sport; - }; - uint32_t sctp_tag; - }; -}; - -struct rte_ipv6_tuple { - uint8_t src_addr[16]; - uint8_t dst_addr[16]; - union { - struct { - uint16_t dport; - uint16_t sport; - }; - uint32_t sctp_tag; - }; -}; - -union rte_thash_tuple { - struct rte_ipv4_tuple v4; - struct rte_ipv6_tuple v6; -} __attribute__((aligned(16))); diff --git a/third_party/rust/bindgen/tests/headers/381-decltype-alias.hpp b/third_party/rust/bindgen/tests/headers/381-decltype-alias.hpp deleted file mode 100644 index 0bec2fc7d14b..000000000000 --- a/third_party/rust/bindgen/tests/headers/381-decltype-alias.hpp +++ /dev/null @@ -1,7 +0,0 @@ -// bindgen-flags: -- -std=c++11 - -namespace std { - template struct allocator_traits { - typedef decltype ( _S_size_type_helper ( ( _Alloc * ) 0 ) ) __size_type; - }; -} diff --git a/third_party/rust/bindgen/tests/headers/accessors.hpp b/third_party/rust/bindgen/tests/headers/accessors.hpp deleted file mode 100644 index 4c23e35d8686..000000000000 --- a/third_party/rust/bindgen/tests/headers/accessors.hpp +++ /dev/null @@ -1,46 +0,0 @@ -struct SomeAccessors { - int mNoAccessor; - /**

    v>#o&)^@S0BM}S&<&bzU3_lf| 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%0D+eFm#5K?(|L1Z9uzAK&f+jht5eX?c} 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�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