Copy disabled (too large)
Download .txt
Showing preview only (16,187K chars total). Download the full file to get everything.
Repository: crystal-lang/crystal
Branch: master
Commit: f4c2f0ab510c
Files: 2517
Total size: 16.3 MB
Directory structure:
gitextract_6d0b5p8f/
├── .ameba.yml
├── .circleci/
│ └── config.yml
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.md
│ │ ├── config.yml
│ │ ├── discussion.md
│ │ └── feature-request.md
│ ├── PULL_REQUEST_TEMPLATE/
│ │ └── pull_request_template.md
│ ├── actionlint.yaml
│ ├── renovate.json
│ ├── workflows/
│ │ ├── aarch64.yml
│ │ ├── backport.yml
│ │ ├── docs.yml
│ │ ├── forward-compatibility.yml
│ │ ├── interpreter.yml
│ │ ├── lint.yml
│ │ ├── linux.yml
│ │ ├── llvm.yml
│ │ ├── macos.yml
│ │ ├── mingw-w64-steps.yml
│ │ ├── mingw-w64.yml
│ │ ├── openssl.yml
│ │ ├── regex-engine.yml
│ │ ├── smoke.yml
│ │ ├── update-devenv.yml
│ │ ├── wasm32.yml
│ │ ├── win.yml
│ │ ├── win_build_portable.yml
│ │ └── xml.yml
│ └── zizmor.yml
├── .gitignore
├── .mailmap
├── .markdownlint.yaml
├── .markdownlintignore
├── .well-known/
│ └── funding-manifest-urls
├── Brewfile
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── LICENSES/
│ ├── Apache-2.0.txt
│ ├── MIT.txt
│ └── Swift-exception.txt
├── Makefile
├── Makefile.win
├── NOTICE.md
├── README.md
├── REUSE.toml
├── SECURITY.md
├── UPGRADING.md
├── _typos.toml
├── bin/
│ ├── check-compiler-flag
│ ├── ci
│ ├── crystal
│ ├── crystal.bat
│ └── crystal.ps1
├── devenv.nix
├── devenv.yaml
├── doc/
│ ├── changelogs/
│ │ ├── README.md
│ │ ├── pre-1.0.md
│ │ ├── v1.0.md
│ │ ├── v1.1.md
│ │ ├── v1.10.md
│ │ ├── v1.11.md
│ │ ├── v1.12.md
│ │ ├── v1.13.md
│ │ ├── v1.14.md
│ │ ├── v1.15.md
│ │ ├── v1.16.md
│ │ ├── v1.17.md
│ │ ├── v1.18.md
│ │ ├── v1.19.md
│ │ ├── v1.2.md
│ │ ├── v1.3.md
│ │ ├── v1.4.md
│ │ ├── v1.5.md
│ │ ├── v1.6.md
│ │ ├── v1.7.md
│ │ ├── v1.8.md
│ │ └── v1.9.md
│ └── man/
│ ├── crystal-build.adoc
│ ├── crystal-docs.adoc
│ ├── crystal-env.adoc
│ ├── crystal-eval.adoc
│ ├── crystal-init.adoc
│ ├── crystal-play.adoc
│ ├── crystal-run.adoc
│ ├── crystal-spec.adoc
│ ├── crystal-tool-dependencies.adoc
│ ├── crystal-tool-format.adoc
│ ├── crystal-tool-macro_code_coverage.adoc
│ ├── crystal-tool-unreachable.adoc
│ └── crystal.adoc
├── etc/
│ ├── completion.bash
│ ├── completion.fish
│ ├── completion.zsh
│ ├── gdb/
│ │ └── crystal_formatters.py
│ ├── lldb/
│ │ └── crystal_formatters.py
│ ├── msvc/
│ │ └── crystal.natvis
│ └── win-ci/
│ ├── build-ffi.ps1
│ ├── build-gc.ps1
│ ├── build-iconv.ps1
│ ├── build-llvm.ps1
│ ├── build-mpir.ps1
│ ├── build-openssl.ps1
│ ├── build-pcre.ps1
│ ├── build-pcre2.ps1
│ ├── build-xml2.ps1
│ ├── build-yaml.ps1
│ ├── build-z.ps1
│ ├── crystal.iss
│ ├── cygwin-build-iconv.sh
│ └── setup.ps1
├── lib/
│ └── .shards.info
├── man/
│ └── crystal.1
├── samples/
│ ├── 2048.cr
│ ├── Makefile
│ ├── Makefile.win
│ ├── binary-trees.cr
│ ├── brainfuck.cr
│ ├── channel_primes.cr
│ ├── channel_select.cr
│ ├── compiler/
│ │ ├── formatter_example.cr
│ │ ├── transformer_example.cr
│ │ └── visitor_example.cr
│ ├── conway.cr
│ ├── degree_days.cr
│ ├── egrep.cr
│ ├── fannkuch-redux.cr
│ ├── fibonacci.cr
│ ├── havlak.cr
│ ├── http_server.cr
│ ├── impl.cr
│ ├── llvm/
│ │ └── brainfuck.cr
│ ├── mandelbrot.cr
│ ├── mandelbrot2.cr
│ ├── matmul.cr
│ ├── meteor.cr
│ ├── mt_gc_test.cr
│ ├── nbodies.cr
│ ├── neural_net.cr
│ ├── noise.cr
│ ├── pig.cr
│ ├── pretty_json.cr
│ ├── quine.cr
│ ├── red_black_tree.cr
│ ├── sdl/
│ │ ├── fire.cr
│ │ ├── fire.txt
│ │ ├── raytracer.cr
│ │ ├── sdl/
│ │ │ ├── lib_sdl.cr
│ │ │ ├── sdl.cr
│ │ │ └── surface.cr
│ │ ├── tv.cr
│ │ └── tv.txt
│ ├── sieve.cr
│ ├── spectral-norm.cr
│ ├── sudoku.cr
│ ├── tcp_client.cr
│ ├── tcp_server.cr
│ ├── text_raytracer.cr
│ ├── tree.cr
│ └── wordcount.cr
├── scripts/
│ ├── docs-versions.sh
│ ├── generate_data.mk
│ ├── generate_glob_specs.sh
│ ├── generate_grapheme_break_specs.cr
│ ├── generate_grapheme_properties.cr
│ ├── generate_html_entities.cr
│ ├── generate_llvm_version_info.cr
│ ├── generate_object_properties.cr
│ ├── generate_ssl_server_defaults.cr
│ ├── generate_unicode_data.cr
│ ├── generate_windows_zone_names.cr
│ ├── git/
│ │ └── pre-commit
│ ├── github-changelog.cr
│ ├── grapheme_properties.ecr
│ ├── html_entities.ecr
│ ├── print_regex_config.cr
│ ├── release-update.sh
│ ├── test_ssl_server.cr
│ ├── unicode_data.ecr
│ ├── update-changelog.sh
│ ├── update-distribution-scripts.sh
│ ├── update-shards.sh
│ └── windows_zone_names.ecr
├── shard.yml
├── shell.nix
├── spec/
│ ├── all_spec.cr
│ ├── compiler/
│ │ ├── codegen/
│ │ │ ├── abi/
│ │ │ │ ├── aarch64_spec.cr
│ │ │ │ ├── arm_spec.cr
│ │ │ │ ├── avr_spec.cr
│ │ │ │ ├── x86_64_spec.cr
│ │ │ │ └── x86_spec.cr
│ │ │ ├── alias_spec.cr
│ │ │ ├── and_spec.cr
│ │ │ ├── array_literal_spec.cr
│ │ │ ├── asm_spec.cr
│ │ │ ├── automatic_cast_spec.cr
│ │ │ ├── block_spec.cr
│ │ │ ├── c_abi/
│ │ │ │ ├── c_abi_spec.cr
│ │ │ │ └── c_abi_x86_64_spec.cr
│ │ │ ├── c_enum_spec.cr
│ │ │ ├── c_struct_spec.cr
│ │ │ ├── c_union_spec.cr
│ │ │ ├── case_spec.cr
│ │ │ ├── cast_spec.cr
│ │ │ ├── class_spec.cr
│ │ │ ├── class_var_spec.cr
│ │ │ ├── closure_spec.cr
│ │ │ ├── const_spec.cr
│ │ │ ├── debug_spec.cr
│ │ │ ├── def_default_value_spec.cr
│ │ │ ├── def_spec.cr
│ │ │ ├── double_splat_spec.cr
│ │ │ ├── enum_spec.cr
│ │ │ ├── exception_spec.cr
│ │ │ ├── experimental_spec.cr
│ │ │ ├── extern_spec.cr
│ │ │ ├── fun_spec.cr
│ │ │ ├── generic_class_spec.cr
│ │ │ ├── hash_literal_spec.cr
│ │ │ ├── hooks_spec.cr
│ │ │ ├── if_spec.cr
│ │ │ ├── is_a_spec.cr
│ │ │ ├── lib_spec.cr
│ │ │ ├── macro_spec.cr
│ │ │ ├── magic_constants_spec.cr
│ │ │ ├── method_missing_spec.cr
│ │ │ ├── module_spec.cr
│ │ │ ├── multi_assign_spec.cr
│ │ │ ├── named_args_spec.cr
│ │ │ ├── named_tuple_spec.cr
│ │ │ ├── new_spec.cr
│ │ │ ├── next_spec.cr
│ │ │ ├── nilable_cast_spec.cr
│ │ │ ├── no_return_spec.cr
│ │ │ ├── not_spec.cr
│ │ │ ├── offsetof_spec.cr
│ │ │ ├── op_assign_spec.cr
│ │ │ ├── or_spec.cr
│ │ │ ├── pointer_spec.cr
│ │ │ ├── previous_def_spec.cr
│ │ │ ├── primitives_spec.cr
│ │ │ ├── private_spec.cr
│ │ │ ├── proc_spec.cr
│ │ │ ├── regex_literal_spec.cr
│ │ │ ├── responds_to_spec.cr
│ │ │ ├── return_spec.cr
│ │ │ ├── sizeof_spec.cr
│ │ │ ├── special_vars_spec.cr
│ │ │ ├── splat_spec.cr
│ │ │ ├── ssa_spec.cr
│ │ │ ├── struct_spec.cr
│ │ │ ├── super_spec.cr
│ │ │ ├── target_spec.cr
│ │ │ ├── thread_local_spec.cr
│ │ │ ├── tuple_spec.cr
│ │ │ ├── type_declaration_spec.cr
│ │ │ ├── uninitialized_spec.cr
│ │ │ ├── union_type_spec.cr
│ │ │ ├── until_spec.cr
│ │ │ ├── var_spec.cr
│ │ │ ├── virtual_spec.cr
│ │ │ ├── void_spec.cr
│ │ │ ├── while_spec.cr
│ │ │ └── yield_with_scope_spec.cr
│ │ ├── compiler_spec.cr
│ │ ├── config_spec.cr
│ │ ├── crystal/
│ │ │ ├── commands/
│ │ │ │ └── clear_cache_spec.cr
│ │ │ ├── tools/
│ │ │ │ ├── context_spec.cr
│ │ │ │ ├── doc/
│ │ │ │ │ ├── directives_spec.cr
│ │ │ │ │ ├── doc_renderer_spec.cr
│ │ │ │ │ ├── generator_spec.cr
│ │ │ │ │ ├── macro_spec.cr
│ │ │ │ │ ├── method_spec.cr
│ │ │ │ │ ├── project_info_spec.cr
│ │ │ │ │ └── type_spec.cr
│ │ │ │ ├── doc_spec.cr
│ │ │ │ ├── expand_spec.cr
│ │ │ │ ├── flags_spec.cr
│ │ │ │ ├── format_spec.cr
│ │ │ │ ├── hierarchy_spec.cr
│ │ │ │ ├── implementations_spec.cr
│ │ │ │ ├── init_spec.cr
│ │ │ │ ├── macro_code_coverage_spec.cr
│ │ │ │ ├── playground_spec.cr
│ │ │ │ ├── repl_spec.cr
│ │ │ │ ├── table_print_spec.cr
│ │ │ │ └── unreachable_spec.cr
│ │ │ └── types_spec.cr
│ │ ├── crystal_path/
│ │ │ └── crystal_path_spec.cr
│ │ ├── data/
│ │ │ ├── args_test
│ │ │ ├── build
│ │ │ ├── compiler_sample
│ │ │ ├── crystal_path/
│ │ │ │ ├── foo.cr/
│ │ │ │ │ └── foo.cr
│ │ │ │ ├── other_test_files/
│ │ │ │ │ └── other_test_files.cr
│ │ │ │ ├── simple.cr
│ │ │ │ └── test_files/
│ │ │ │ ├── file_one.cr
│ │ │ │ ├── file_two.cr
│ │ │ │ ├── src/
│ │ │ │ │ ├── file_three.cr
│ │ │ │ │ ├── test_files/
│ │ │ │ │ │ ├── another/
│ │ │ │ │ │ │ └── another.cr
│ │ │ │ │ │ └── file_four.cr
│ │ │ │ │ ├── test_files.cr
│ │ │ │ │ └── yet_another/
│ │ │ │ │ └── yet_another.cr
│ │ │ │ └── test_folder/
│ │ │ │ ├── file_three.cr
│ │ │ │ ├── not_a_crystal_file.txt
│ │ │ │ └── test_folder.cr
│ │ │ ├── ffi/
│ │ │ │ └── sum.c
│ │ │ ├── interpreter/
│ │ │ │ └── sum.c
│ │ │ ├── loader/
│ │ │ │ ├── bar.c
│ │ │ │ ├── foo.c
│ │ │ │ └── foo2.c
│ │ │ └── visibility.h
│ │ ├── ffi/
│ │ │ └── ffi_spec.cr
│ │ ├── formatter/
│ │ │ └── formatter_spec.cr
│ │ ├── interpreter/
│ │ │ ├── autocast_spec.cr
│ │ │ ├── blocks_spec.cr
│ │ │ ├── bugs_spec.cr
│ │ │ ├── calls_spec.cr
│ │ │ ├── casts_spec.cr
│ │ │ ├── class_vars_spec.cr
│ │ │ ├── classes_spec.cr
│ │ │ ├── closures_spec.cr
│ │ │ ├── constants_spec.cr
│ │ │ ├── control_flow_spec.cr
│ │ │ ├── enum_spec.cr
│ │ │ ├── exceptions_spec.cr
│ │ │ ├── extern_spec.cr
│ │ │ ├── integration_spec.cr
│ │ │ ├── is_a_spec.cr
│ │ │ ├── lib_spec.cr
│ │ │ ├── multidispatch_spec.cr
│ │ │ ├── named_tuple_spec.cr
│ │ │ ├── pointers_spec.cr
│ │ │ ├── primitives_spec.cr
│ │ │ ├── procs_spec.cr
│ │ │ ├── responds_to_spec.cr
│ │ │ ├── sizeof_spec.cr
│ │ │ ├── spec_helper.cr
│ │ │ ├── special_vars_spec.cr
│ │ │ ├── structs_spec.cr
│ │ │ ├── symbol_spec.cr
│ │ │ ├── tuple_spec.cr
│ │ │ ├── typeof_spec.cr
│ │ │ ├── types_spec.cr
│ │ │ └── unions_spec.cr
│ │ ├── interpreter_spec.cr
│ │ ├── lexer/
│ │ │ ├── lexer_comment_spec.cr
│ │ │ ├── lexer_doc_spec.cr
│ │ │ ├── lexer_macro_spec.cr
│ │ │ ├── lexer_objects/
│ │ │ │ └── strings.cr
│ │ │ ├── lexer_spec.cr
│ │ │ ├── lexer_string_array_spec.cr
│ │ │ ├── lexer_string_spec.cr
│ │ │ └── location_spec.cr
│ │ ├── loader/
│ │ │ ├── msvc_spec.cr
│ │ │ ├── spec_helper.cr
│ │ │ └── unix_spec.cr
│ │ ├── macro/
│ │ │ ├── macro_expander_spec.cr
│ │ │ └── macro_methods_spec.cr
│ │ ├── normalize/
│ │ │ ├── and_spec.cr
│ │ │ ├── array_literal_spec.cr
│ │ │ ├── block_spec.cr
│ │ │ ├── case_spec.cr
│ │ │ ├── chained_comparisons_spec.cr
│ │ │ ├── def_spec.cr
│ │ │ ├── expressions_spec.cr
│ │ │ ├── hash_literal_spec.cr
│ │ │ ├── multi_assign_spec.cr
│ │ │ ├── op_assign_spec.cr
│ │ │ ├── or_spec.cr
│ │ │ ├── proc_pointer_spec.cr
│ │ │ ├── range_literal_spec.cr
│ │ │ ├── regex_spec.cr
│ │ │ ├── return_next_break_spec.cr
│ │ │ ├── select_spec.cr
│ │ │ ├── string_interpolation_spec.cr
│ │ │ ├── unless_spec.cr
│ │ │ └── until_spec.cr
│ │ ├── parser/
│ │ │ ├── parser_doc_spec.cr
│ │ │ ├── parser_spec.cr
│ │ │ ├── to_s_spec.cr
│ │ │ └── warnings_spec.cr
│ │ ├── semantic/
│ │ │ ├── abstract_def_spec.cr
│ │ │ ├── alias_spec.cr
│ │ │ ├── annotation_spec.cr
│ │ │ ├── array_spec.cr
│ │ │ ├── automatic_cast_spec.cr
│ │ │ ├── block_spec.cr
│ │ │ ├── c_enum_spec.cr
│ │ │ ├── c_struct_spec.cr
│ │ │ ├── c_type_spec.cr
│ │ │ ├── c_union_spec.cr
│ │ │ ├── call_error_spec.cr
│ │ │ ├── case_spec.cr
│ │ │ ├── cast_spec.cr
│ │ │ ├── class_spec.cr
│ │ │ ├── class_var_spec.cr
│ │ │ ├── cleanup_spec.cr
│ │ │ ├── closure_spec.cr
│ │ │ ├── concrete_types_spec.cr
│ │ │ ├── const_spec.cr
│ │ │ ├── def_overload_spec.cr
│ │ │ ├── def_spec.cr
│ │ │ ├── did_you_mean_spec.cr
│ │ │ ├── doc_spec.cr
│ │ │ ├── double_splat_spec.cr
│ │ │ ├── enum_spec.cr
│ │ │ ├── exception_spec.cr
│ │ │ ├── extern_spec.cr
│ │ │ ├── external_internal_spec.cr
│ │ │ ├── fun_spec.cr
│ │ │ ├── generic_class_spec.cr
│ │ │ ├── hooks_spec.cr
│ │ │ ├── if_spec.cr
│ │ │ ├── initialize_spec.cr
│ │ │ ├── instance_var_spec.cr
│ │ │ ├── is_a_spec.cr
│ │ │ ├── lib_spec.cr
│ │ │ ├── macro_overload_spec.cr
│ │ │ ├── macro_spec.cr
│ │ │ ├── metaclass_spec.cr
│ │ │ ├── method_missing_spec.cr
│ │ │ ├── module_spec.cr
│ │ │ ├── multi_assign_spec.cr
│ │ │ ├── named_args_spec.cr
│ │ │ ├── named_tuple_spec.cr
│ │ │ ├── new_spec.cr
│ │ │ ├── nil_spec.cr
│ │ │ ├── nilable_cast_spec.cr
│ │ │ ├── nilable_instance_var_spec.cr
│ │ │ ├── no_return_spec.cr
│ │ │ ├── not_spec.cr
│ │ │ ├── offsetof_spec.cr
│ │ │ ├── pointer_spec.cr
│ │ │ ├── previous_def_spec.cr
│ │ │ ├── primitives_spec.cr
│ │ │ ├── private_spec.cr
│ │ │ ├── proc_spec.cr
│ │ │ ├── recursive_struct_check_spec.cr
│ │ │ ├── reference_storage_spec.cr
│ │ │ ├── require_spec.cr
│ │ │ ├── responds_to_spec.cr
│ │ │ ├── restrictions_augmenter_spec.cr
│ │ │ ├── restrictions_spec.cr
│ │ │ ├── return_spec.cr
│ │ │ ├── sizeof_spec.cr
│ │ │ ├── special_vars_spec.cr
│ │ │ ├── splat_spec.cr
│ │ │ ├── ssa_spec.cr
│ │ │ ├── static_array_spec.cr
│ │ │ ├── struct_spec.cr
│ │ │ ├── super_spec.cr
│ │ │ ├── tuple_spec.cr
│ │ │ ├── uninitialized_spec.cr
│ │ │ ├── union_spec.cr
│ │ │ ├── var_spec.cr
│ │ │ ├── virtual_metaclass_spec.cr
│ │ │ ├── virtual_spec.cr
│ │ │ ├── visibility_modifiers_spec.cr
│ │ │ ├── warnings_spec.cr
│ │ │ ├── while_spec.cr
│ │ │ └── yield_with_scope_spec.cr
│ │ ├── spec_helper.cr
│ │ └── util_spec.cr
│ ├── compiler_spec.cr
│ ├── debug/
│ │ ├── arrays.cr
│ │ ├── blocks.cr
│ │ ├── driver.cr
│ │ ├── extern_unions.cr
│ │ ├── large_enums.cr
│ │ ├── strings.cr
│ │ ├── test.sh
│ │ └── top_level.cr
│ ├── generate_wasm32_spec.sh
│ ├── llvm-ir/
│ │ ├── argless-initialize-debug-loc.cr
│ │ ├── assign-unions.cr
│ │ ├── cast-unions.cr
│ │ ├── class-var-read-debug-loc.cr
│ │ ├── const-read-debug-loc.cr
│ │ ├── memcpy.cr
│ │ ├── memset.cr
│ │ ├── pass-closure-to-c-debug-loc.cr
│ │ ├── proc-call-debug-loc.cr
│ │ ├── proc-pointer-debug-loc.cr
│ │ ├── test.sh
│ │ ├── virtual-class-var-read-debug-loc.cr
│ │ └── virtual-metaclass-var-read-debug-loc.cr
│ ├── manual/
│ │ ├── badssl_spec.cr
│ │ ├── digest_large_file_spec.cr
│ │ ├── find_executable_spec.cr
│ │ ├── gzip_large_file_spec.cr
│ │ ├── hash_large_spec.cr
│ │ ├── https_client_spec.cr
│ │ ├── string_normalize_spec.cr
│ │ ├── string_to_f32_spec.cr
│ │ └── string_to_f_supplemental_spec.cr
│ ├── primitives/
│ │ ├── external_command_spec.cr
│ │ ├── float_spec.cr
│ │ ├── int_spec.cr
│ │ ├── pointer_spec.cr
│ │ ├── reference_spec.cr
│ │ ├── slice_spec.cr
│ │ └── struct_spec.cr
│ ├── primitives_spec.cr
│ ├── spec_helper.cr
│ ├── std/
│ │ ├── array_spec.cr
│ │ ├── atomic_spec.cr
│ │ ├── base64_spec.cr
│ │ ├── benchmark_spec.cr
│ │ ├── big/
│ │ │ ├── big_decimal_spec.cr
│ │ │ ├── big_float_spec.cr
│ │ │ ├── big_int_spec.cr
│ │ │ ├── big_rational_spec.cr
│ │ │ └── number_spec.cr
│ │ ├── bit_array_spec.cr
│ │ ├── bool_spec.cr
│ │ ├── box_spec.cr
│ │ ├── channel_spec.cr
│ │ ├── char/
│ │ │ └── reader_spec.cr
│ │ ├── char_spec.cr
│ │ ├── class_spec.cr
│ │ ├── colorize_spec.cr
│ │ ├── comparable_spec.cr
│ │ ├── complex_spec.cr
│ │ ├── compress/
│ │ │ ├── deflate/
│ │ │ │ └── deflate_spec.cr
│ │ │ ├── gzip/
│ │ │ │ └── gzip_spec.cr
│ │ │ ├── zip/
│ │ │ │ ├── zip_file_spec.cr
│ │ │ │ └── zip_spec.cr
│ │ │ └── zlib/
│ │ │ ├── reader_spec.cr
│ │ │ ├── stress_spec.cr
│ │ │ └── writer_spec.cr
│ │ ├── concurrent/
│ │ │ └── select_spec.cr
│ │ ├── concurrent_spec.cr
│ │ ├── crypto/
│ │ │ ├── bcrypt/
│ │ │ │ ├── base64_spec.cr
│ │ │ │ └── password_spec.cr
│ │ │ ├── bcrypt_spec.cr
│ │ │ ├── blowfish_spec.cr
│ │ │ └── subtle_spec.cr
│ │ ├── crystal/
│ │ │ ├── compiler_rt/
│ │ │ │ ├── ashlti3_spec.cr
│ │ │ │ ├── ashrti3_spec.cr
│ │ │ │ ├── divmod128_spec.cr
│ │ │ │ ├── fixint_spec.cr
│ │ │ │ ├── float_spec.cr
│ │ │ │ ├── lshrti3_spec.cr
│ │ │ │ ├── mulodi4_spec.cr
│ │ │ │ ├── mulosi4_spec.cr
│ │ │ │ ├── muloti4_spec.cr
│ │ │ │ ├── multi3_spec.cr
│ │ │ │ ├── powidf2_spec.cr
│ │ │ │ ├── powisf2_spec.cr
│ │ │ │ └── spec_helper.cr
│ │ │ ├── digest/
│ │ │ │ ├── md5_spec.cr
│ │ │ │ └── sha1_spec.cr
│ │ │ ├── event_loop/
│ │ │ │ ├── polling/
│ │ │ │ │ ├── arena_spec.cr
│ │ │ │ │ ├── poll_descriptor_spec.cr
│ │ │ │ │ └── waiters_spec.cr
│ │ │ │ └── timers_spec.cr
│ │ │ ├── fd_lock_spec.cr
│ │ │ ├── hasher_spec.cr
│ │ │ ├── pointer_linked_list_spec.cr
│ │ │ ├── pointer_pairing_heap_spec.cr
│ │ │ ├── syntax_highlighter/
│ │ │ │ ├── colorize_spec.cr
│ │ │ │ └── html_spec.cr
│ │ │ ├── system/
│ │ │ │ └── cpucount_spec.cr
│ │ │ └── system_spec.cr
│ │ ├── csv/
│ │ │ ├── csv_build_spec.cr
│ │ │ ├── csv_lex_spec.cr
│ │ │ ├── csv_parse_spec.cr
│ │ │ └── csv_spec.cr
│ │ ├── data/
│ │ │ ├── android_tzdata
│ │ │ ├── argf_test_file_1.txt
│ │ │ ├── argf_test_file_2.txt
│ │ │ ├── argf_test_file_3.xml
│ │ │ ├── backtrace_sample
│ │ │ ├── blank_test_file.txt
│ │ │ ├── cipher_spec.ciphertext
│ │ │ ├── collect_within_ensure
│ │ │ ├── crash_backtrace_sample
│ │ │ ├── dir/
│ │ │ │ ├── dots/
│ │ │ │ │ ├── .dot.hidden
│ │ │ │ │ └── .hidden/
│ │ │ │ │ └── f1.txt
│ │ │ │ ├── f1.txt
│ │ │ │ ├── f2.txt
│ │ │ │ ├── f3.txx
│ │ │ │ ├── g2.txt
│ │ │ │ ├── subdir/
│ │ │ │ │ ├── f1.txt
│ │ │ │ │ └── subdir2/
│ │ │ │ │ └── f2.txt
│ │ │ │ └── subdir2/
│ │ │ │ └── .gitkeep
│ │ │ ├── exception_backtrace_sample
│ │ │ ├── io_data_incomplete_multibyte_sequence.txt
│ │ │ ├── io_data_incomplete_multibyte_sequence_2.txt
│ │ │ ├── large_single_line_string.txt
│ │ │ ├── mime.types
│ │ │ ├── openssl/
│ │ │ │ ├── openssl.crt
│ │ │ │ └── openssl.key
│ │ │ ├── static_file_handler/
│ │ │ │ ├── empty.txt
│ │ │ │ ├── foo/
│ │ │ │ │ └── bar.txt
│ │ │ │ ├── range.txt
│ │ │ │ └── test.txt
│ │ │ ├── test_file.ini
│ │ │ ├── test_file.txt
│ │ │ ├── test_template.ecr
│ │ │ ├── test_template2.ecr
│ │ │ ├── test_template3.ecr
│ │ │ ├── test_template4.ecr
│ │ │ ├── test_template5.ecr
│ │ │ ├── test_template6.ecr
│ │ │ ├── test_template7.ecr
│ │ │ └── zoneinfo/
│ │ │ └── Foo/
│ │ │ ├── Bar
│ │ │ └── invalid
│ │ ├── deque_spec.cr
│ │ ├── digest/
│ │ │ ├── adler32_spec.cr
│ │ │ ├── crc32_spec.cr
│ │ │ ├── io_digest_spec.cr
│ │ │ ├── md5_spec.cr
│ │ │ ├── sha1_spec.cr
│ │ │ ├── sha256_spec.cr
│ │ │ ├── sha512_spec.cr
│ │ │ └── spec_helper.cr
│ │ ├── dir_spec.cr
│ │ ├── double_spec.cr
│ │ ├── ecr/
│ │ │ ├── ecr_lexer_spec.cr
│ │ │ └── ecr_spec.cr
│ │ ├── enum_spec.cr
│ │ ├── enumerable_spec.cr
│ │ ├── env_spec.cr
│ │ ├── errno_spec.cr
│ │ ├── exception/
│ │ │ └── call_stack_spec.cr
│ │ ├── exception_spec.cr
│ │ ├── fiber/
│ │ │ ├── execution_context/
│ │ │ │ ├── global_queue_spec.cr
│ │ │ │ ├── parallel_spec.cr
│ │ │ │ ├── runnables_spec.cr
│ │ │ │ └── spec_helper.cr
│ │ │ └── list_spec.cr
│ │ ├── fiber_spec.cr
│ │ ├── file/
│ │ │ ├── match-fast-glob_spec.cr
│ │ │ ├── match_spec.cr
│ │ │ └── tempfile_spec.cr
│ │ ├── file_spec.cr
│ │ ├── file_utils_spec.cr
│ │ ├── float_printer/
│ │ │ ├── diy_fp_spec.cr
│ │ │ ├── grisu3_spec.cr
│ │ │ ├── hexfloat_spec.cr
│ │ │ ├── ieee_spec.cr
│ │ │ ├── ryu_printf_spec.cr
│ │ │ ├── ryu_printf_test_cases.cr
│ │ │ └── shortest_spec.cr
│ │ ├── float_spec.cr
│ │ ├── gc_spec.cr
│ │ ├── hash_spec.cr
│ │ ├── html_spec.cr
│ │ ├── http/
│ │ │ ├── chunked_content_spec.cr
│ │ │ ├── client/
│ │ │ │ ├── client_spec.cr
│ │ │ │ └── response_spec.cr
│ │ │ ├── cookie_spec.cr
│ │ │ ├── cookies_spec.cr
│ │ │ ├── formdata/
│ │ │ │ ├── builder_spec.cr
│ │ │ │ └── parser_spec.cr
│ │ │ ├── formdata_spec.cr
│ │ │ ├── headers_spec.cr
│ │ │ ├── http_spec.cr
│ │ │ ├── params_spec.cr
│ │ │ ├── request_spec.cr
│ │ │ ├── server/
│ │ │ │ ├── handlers/
│ │ │ │ │ ├── compress_handler_spec.cr
│ │ │ │ │ ├── error_handler_spec.cr
│ │ │ │ │ ├── handler_spec.cr
│ │ │ │ │ ├── log_handler_spec.cr
│ │ │ │ │ ├── static_file_handler_spec.cr
│ │ │ │ │ └── websocket_handler_spec.cr
│ │ │ │ ├── request_processor_spec.cr
│ │ │ │ ├── response_spec.cr
│ │ │ │ └── server_spec.cr
│ │ │ ├── spec_helper.cr
│ │ │ ├── status_spec.cr
│ │ │ └── web_socket_spec.cr
│ │ ├── humanize_spec.cr
│ │ ├── indexable/
│ │ │ └── mutable_spec.cr
│ │ ├── indexable_spec.cr
│ │ ├── ini_spec.cr
│ │ ├── int_spec.cr
│ │ ├── io/
│ │ │ ├── argf_spec.cr
│ │ │ ├── buffered_spec.cr
│ │ │ ├── byte_format_spec.cr
│ │ │ ├── delimited_spec.cr
│ │ │ ├── file_descriptor_spec.cr
│ │ │ ├── hexdump_spec.cr
│ │ │ ├── io_spec.cr
│ │ │ ├── memory_spec.cr
│ │ │ ├── multi_writer_spec.cr
│ │ │ ├── sized_spec.cr
│ │ │ └── stapled_spec.cr
│ │ ├── iterator_spec.cr
│ │ ├── json/
│ │ │ ├── any_spec.cr
│ │ │ ├── builder_spec.cr
│ │ │ ├── lexer_spec.cr
│ │ │ ├── parser_spec.cr
│ │ │ ├── pull_parser_spec.cr
│ │ │ ├── serializable_spec.cr
│ │ │ └── serialization_spec.cr
│ │ ├── kernel_spec.cr
│ │ ├── levenshtein_spec.cr
│ │ ├── llvm/
│ │ │ ├── llvm_spec.cr
│ │ │ └── type_spec.cr
│ │ ├── log/
│ │ │ ├── broadcast_backend_spec.cr
│ │ │ ├── builder_spec.cr
│ │ │ ├── context_spec.cr
│ │ │ ├── dispatch_spec.cr
│ │ │ ├── env_config_spec.cr
│ │ │ ├── format_spec.cr
│ │ │ ├── io_backend_spec.cr
│ │ │ ├── log_spec.cr
│ │ │ ├── main_spec.cr
│ │ │ ├── metadata_spec.cr
│ │ │ └── spec_spec.cr
│ │ ├── math_spec.cr
│ │ ├── mime/
│ │ │ ├── media_type_spec.cr
│ │ │ ├── multipart/
│ │ │ │ ├── builder_spec.cr
│ │ │ │ └── parser_spec.cr
│ │ │ └── multipart_spec.cr
│ │ ├── mime_spec.cr
│ │ ├── mutex_spec.cr
│ │ ├── named_tuple_spec.cr
│ │ ├── number_spec.cr
│ │ ├── oauth/
│ │ │ ├── access_token_spec.cr
│ │ │ ├── authorization_header_spec.cr
│ │ │ ├── consumer_spec.cr
│ │ │ ├── request_token_spec.cr
│ │ │ └── signature_spec.cr
│ │ ├── oauth2/
│ │ │ ├── access_token_spec.cr
│ │ │ ├── client_spec.cr
│ │ │ └── session_spec.cr
│ │ ├── object_spec.cr
│ │ ├── openssl/
│ │ │ ├── cipher_spec.cr
│ │ │ ├── digest_spec.cr
│ │ │ ├── hmac_spec.cr
│ │ │ ├── pkcs5_spec.cr
│ │ │ ├── ssl/
│ │ │ │ ├── context_spec.cr
│ │ │ │ ├── hostname_validation_spec.cr
│ │ │ │ ├── server_spec.cr
│ │ │ │ └── socket_spec.cr
│ │ │ └── x509/
│ │ │ ├── certificate_spec.cr
│ │ │ └── name_spec.cr
│ │ ├── option_parser_spec.cr
│ │ ├── path_spec.cr
│ │ ├── pointer/
│ │ │ └── appender_spec.cr
│ │ ├── pointer_spec.cr
│ │ ├── pp_spec.cr
│ │ ├── pretty_print_spec.cr
│ │ ├── proc_spec.cr
│ │ ├── process/
│ │ │ ├── exit_reason_spec.cr
│ │ │ ├── find_executable_spec.cr
│ │ │ ├── status_spec.cr
│ │ │ └── utils_spec.cr
│ │ ├── process_spec.cr
│ │ ├── raise_spec.cr
│ │ ├── random/
│ │ │ ├── isaac_spec.cr
│ │ │ ├── pcg32_spec.cr
│ │ │ └── secure_spec.cr
│ │ ├── random_spec.cr
│ │ ├── range_spec.cr
│ │ ├── record_spec.cr
│ │ ├── reference_spec.cr
│ │ ├── regex/
│ │ │ └── match_data_spec.cr
│ │ ├── regex_spec.cr
│ │ ├── semantic_version_spec.cr
│ │ ├── set_spec.cr
│ │ ├── signal_spec.cr
│ │ ├── slice_spec.cr
│ │ ├── socket/
│ │ │ ├── address_spec.cr
│ │ │ ├── addrinfo_spec.cr
│ │ │ ├── socket_spec.cr
│ │ │ ├── spec_helper.cr
│ │ │ ├── tcp_server_spec.cr
│ │ │ ├── tcp_socket_spec.cr
│ │ │ ├── udp_socket_spec.cr
│ │ │ ├── unix_server_spec.cr
│ │ │ └── unix_socket_spec.cr
│ │ ├── spec/
│ │ │ ├── context_spec.cr
│ │ │ ├── expectations_spec.cr
│ │ │ ├── filters_spec.cr
│ │ │ ├── helpers/
│ │ │ │ └── iterate_spec.cr
│ │ │ ├── hooks_spec.cr
│ │ │ ├── junit_formatter_spec.cr
│ │ │ ├── list_tags_spec.cr
│ │ │ ├── spec_helper.cr
│ │ │ └── tap_formatter_spec.cr
│ │ ├── spec_helper.cr
│ │ ├── spec_spec.cr
│ │ ├── sprintf_spec.cr
│ │ ├── static_array_spec.cr
│ │ ├── string/
│ │ │ ├── grapheme_break_spec.cr
│ │ │ ├── grapheme_spec.cr
│ │ │ ├── spec_helper.cr
│ │ │ └── utf16_spec.cr
│ │ ├── string_builder_spec.cr
│ │ ├── string_pool_spec.cr
│ │ ├── string_scanner_spec.cr
│ │ ├── string_spec.cr
│ │ ├── struct_spec.cr
│ │ ├── symbol_spec.cr
│ │ ├── sync/
│ │ │ ├── condition_variable_spec.cr
│ │ │ ├── exclusive_spec.cr
│ │ │ ├── mutex_spec.cr
│ │ │ ├── rw_lock_spec.cr
│ │ │ ├── shared_spec.cr
│ │ │ └── spec_helper.cr
│ │ ├── syscall_spec.cr
│ │ ├── system/
│ │ │ ├── group_spec.cr
│ │ │ └── user_spec.cr
│ │ ├── system_error_spec.cr
│ │ ├── system_spec.cr
│ │ ├── thread/
│ │ │ ├── condition_variable_spec.cr
│ │ │ └── mutex_spec.cr
│ │ ├── thread_spec.cr
│ │ ├── time/
│ │ │ ├── custom_formats_spec.cr
│ │ │ ├── format_spec.cr
│ │ │ ├── instant_spec.cr
│ │ │ ├── location_spec.cr
│ │ │ ├── span_spec.cr
│ │ │ └── time_spec.cr
│ │ ├── tuple_spec.cr
│ │ ├── uint_spec.cr
│ │ ├── uri/
│ │ │ ├── json_spec.cr
│ │ │ ├── params/
│ │ │ │ ├── from_www_form_spec.cr
│ │ │ │ ├── serializable_spec.cr
│ │ │ │ └── to_www_form_spec.cr
│ │ │ ├── params_spec.cr
│ │ │ └── punycode_spec.cr
│ │ ├── uri_spec.cr
│ │ ├── uuid/
│ │ │ ├── json_spec.cr
│ │ │ └── yaml_spec.cr
│ │ ├── uuid_spec.cr
│ │ ├── va_list_spec.cr
│ │ ├── wait_group_spec.cr
│ │ ├── weak_ref_spec.cr
│ │ ├── winerror_spec.cr
│ │ ├── xml/
│ │ │ ├── builder_spec.cr
│ │ │ ├── html_spec.cr
│ │ │ ├── reader_spec.cr
│ │ │ ├── xml_spec.cr
│ │ │ └── xpath_spec.cr
│ │ └── yaml/
│ │ ├── any_spec.cr
│ │ ├── builder_spec.cr
│ │ ├── nodes/
│ │ │ ├── builder_spec.cr
│ │ │ └── parser_spec.cr
│ │ ├── schema/
│ │ │ ├── core_spec.cr
│ │ │ └── fail_safe_spec.cr
│ │ ├── serializable_spec.cr
│ │ ├── serialization_spec.cr
│ │ ├── yaml_pull_parser_spec.cr
│ │ └── yaml_spec.cr
│ ├── std_spec.cr
│ ├── support/
│ │ ├── channel.cr
│ │ ├── env.cr
│ │ ├── fibers.cr
│ │ ├── finalize.cr
│ │ ├── interpreted.cr
│ │ ├── io.cr
│ │ ├── mt_abort_timeout.cr
│ │ ├── number.cr
│ │ ├── retry.cr
│ │ ├── ssl.cr
│ │ ├── string.cr
│ │ ├── syntax.cr
│ │ ├── tempfile.cr
│ │ ├── thread.cr
│ │ ├── time.cr
│ │ ├── wait_for.cr
│ │ ├── wasm32.cr
│ │ └── win32.cr
│ ├── syntax_spec.cr
│ └── wasm32_std_spec.cr
└── src/
├── VERSION
├── annotations.cr
├── array.cr
├── atomic.cr
├── base64.cr
├── benchmark/
│ ├── bm.cr
│ └── ips.cr
├── benchmark.cr
├── big/
│ ├── big_decimal.cr
│ ├── big_float.cr
│ ├── big_int.cr
│ ├── big_rational.cr
│ ├── json.cr
│ ├── lib_gmp.cr
│ ├── number.cr
│ └── yaml.cr
├── big.cr
├── bit_array.cr
├── bool.cr
├── box.cr
├── channel/
│ ├── select/
│ │ ├── select_action.cr
│ │ └── timeout_action.cr
│ └── select.cr
├── channel.cr
├── char/
│ └── reader.cr
├── char.cr
├── class.cr
├── colorize.cr
├── comparable.cr
├── compiler/
│ ├── crystal/
│ │ ├── annotatable.cr
│ │ ├── codegen/
│ │ │ ├── abi/
│ │ │ │ ├── aarch64.cr
│ │ │ │ ├── arm.cr
│ │ │ │ ├── avr.cr
│ │ │ │ ├── wasm32.cr
│ │ │ │ ├── x86.cr
│ │ │ │ ├── x86_64.cr
│ │ │ │ └── x86_win64.cr
│ │ │ ├── abi.cr
│ │ │ ├── asm.cr
│ │ │ ├── ast.cr
│ │ │ ├── cache_dir.cr
│ │ │ ├── call.cr
│ │ │ ├── cast.cr
│ │ │ ├── class_var.cr
│ │ │ ├── codegen.cr
│ │ │ ├── cond.cr
│ │ │ ├── const.cr
│ │ │ ├── context.cr
│ │ │ ├── crystal_llvm_builder.cr
│ │ │ ├── debug.cr
│ │ │ ├── dump_type_info.cr
│ │ │ ├── exception.cr
│ │ │ ├── experimental.cr
│ │ │ ├── fun.cr
│ │ │ ├── link.cr
│ │ │ ├── llvm_builder_helper.cr
│ │ │ ├── llvm_id.cr
│ │ │ ├── llvm_typer.cr
│ │ │ ├── match.cr
│ │ │ ├── once.cr
│ │ │ ├── phi.cr
│ │ │ ├── primitives.cr
│ │ │ ├── target.cr
│ │ │ ├── type_id.cr
│ │ │ ├── types.cr
│ │ │ └── unions.cr
│ │ ├── command/
│ │ │ ├── clear_cache.cr
│ │ │ ├── cursor.cr
│ │ │ ├── docs.cr
│ │ │ ├── env.cr
│ │ │ ├── eval.cr
│ │ │ ├── format.cr
│ │ │ ├── playground.cr
│ │ │ ├── repl.cr
│ │ │ └── spec.cr
│ │ ├── command.cr
│ │ ├── compiler.cr
│ │ ├── config.cr
│ │ ├── crystal_path.cr
│ │ ├── error.cr
│ │ ├── exception.cr
│ │ ├── ffi/
│ │ │ ├── call_interface.cr
│ │ │ ├── closure.cr
│ │ │ ├── ffi.cr
│ │ │ ├── lib_ffi.cr
│ │ │ └── type.cr
│ │ ├── formatter.cr
│ │ ├── interpreter/
│ │ │ ├── c.cr
│ │ │ ├── cast.cr
│ │ │ ├── class_vars.cr
│ │ │ ├── closure.cr
│ │ │ ├── closure_context.cr
│ │ │ ├── compiled_block.cr
│ │ │ ├── compiled_def.cr
│ │ │ ├── compiled_instructions.cr
│ │ │ ├── compiler.cr
│ │ │ ├── constants.cr
│ │ │ ├── context.cr
│ │ │ ├── debug.cr
│ │ │ ├── disassembler.cr
│ │ │ ├── escaping_exception.cr
│ │ │ ├── ffi_closure_context.cr
│ │ │ ├── instruction.cr
│ │ │ ├── instructions.cr
│ │ │ ├── interpreter.cr
│ │ │ ├── lib_function.cr
│ │ │ ├── local_vars.cr
│ │ │ ├── local_vars_gatherer.cr
│ │ │ ├── multidispatch.cr
│ │ │ ├── op_code.cr
│ │ │ ├── primitives.cr
│ │ │ ├── pry_reader.cr
│ │ │ ├── repl.cr
│ │ │ ├── repl_reader.cr
│ │ │ ├── to_bool.cr
│ │ │ └── value.cr
│ │ ├── interpreter.cr
│ │ ├── loader/
│ │ │ ├── mingw.cr
│ │ │ ├── msvc.cr
│ │ │ └── unix.cr
│ │ ├── loader.cr
│ │ ├── macros/
│ │ │ ├── interpreter.cr
│ │ │ ├── macros.cr
│ │ │ ├── methods.cr
│ │ │ └── types.cr
│ │ ├── macros.cr
│ │ ├── program.cr
│ │ ├── progress_tracker.cr
│ │ ├── semantic/
│ │ │ ├── abstract_def_checker.cr
│ │ │ ├── ast.cr
│ │ │ ├── bindings.cr
│ │ │ ├── call.cr
│ │ │ ├── call_error.cr
│ │ │ ├── class_vars_initializer_visitor.cr
│ │ │ ├── cleanup_transformer.cr
│ │ │ ├── conversions.cr
│ │ │ ├── cover.cr
│ │ │ ├── default_arguments.cr
│ │ │ ├── exception.cr
│ │ │ ├── exhaustiveness_checker.cr
│ │ │ ├── filters.cr
│ │ │ ├── fix_missing_types.cr
│ │ │ ├── flags.cr
│ │ │ ├── hooks.cr
│ │ │ ├── instance_vars_initializer_visitor.cr
│ │ │ ├── lib.cr
│ │ │ ├── literal_expander.cr
│ │ │ ├── main_visitor.cr
│ │ │ ├── match.cr
│ │ │ ├── math_interpreter.cr
│ │ │ ├── method_lookup.cr
│ │ │ ├── method_missing.cr
│ │ │ ├── new.cr
│ │ │ ├── normalizer.cr
│ │ │ ├── path_lookup.cr
│ │ │ ├── recursive_struct_checker.cr
│ │ │ ├── restrictions.cr
│ │ │ ├── restrictions_augmenter.cr
│ │ │ ├── semantic_visitor.cr
│ │ │ ├── suggestions.cr
│ │ │ ├── to_s.cr
│ │ │ ├── top_level_visitor.cr
│ │ │ ├── transformer.cr
│ │ │ ├── type_declaration_processor.cr
│ │ │ ├── type_declaration_visitor.cr
│ │ │ ├── type_guess_visitor.cr
│ │ │ ├── type_intersect.cr
│ │ │ ├── type_lookup.cr
│ │ │ ├── type_merge.cr
│ │ │ ├── type_to_restriction.cr
│ │ │ └── warnings.cr
│ │ ├── semantic.cr
│ │ ├── syntax/
│ │ │ ├── ast.cr
│ │ │ ├── exception.cr
│ │ │ ├── lexer.cr
│ │ │ ├── location.cr
│ │ │ ├── parser.cr
│ │ │ ├── to_s.cr
│ │ │ ├── token.cr
│ │ │ ├── transformer.cr
│ │ │ ├── virtual_file.cr
│ │ │ └── visitor.cr
│ │ ├── syntax.cr
│ │ ├── tools/
│ │ │ ├── context.cr
│ │ │ ├── dependencies.cr
│ │ │ ├── doc/
│ │ │ │ ├── constant.cr
│ │ │ │ ├── generator.cr
│ │ │ │ ├── html/
│ │ │ │ │ ├── 404.html
│ │ │ │ │ ├── _head.html
│ │ │ │ │ ├── _list_items.html
│ │ │ │ │ ├── _macros_inherited.html
│ │ │ │ │ ├── _method_detail.html
│ │ │ │ │ ├── _method_summary.html
│ │ │ │ │ ├── _methods_inherited.html
│ │ │ │ │ ├── _other_types.html
│ │ │ │ │ ├── _sidebar.html
│ │ │ │ │ ├── css/
│ │ │ │ │ │ └── style.css
│ │ │ │ │ ├── js/
│ │ │ │ │ │ ├── _navigator.js
│ │ │ │ │ │ ├── _search.js
│ │ │ │ │ │ ├── _usage-modal.js
│ │ │ │ │ │ ├── _versions.js
│ │ │ │ │ │ └── doc.js
│ │ │ │ │ ├── main.html
│ │ │ │ │ ├── sitemap.xml
│ │ │ │ │ └── type.html
│ │ │ │ ├── item.cr
│ │ │ │ ├── macro.cr
│ │ │ │ ├── main.cr
│ │ │ │ ├── markd_doc_renderer.cr
│ │ │ │ ├── method.cr
│ │ │ │ ├── project_info.cr
│ │ │ │ ├── relative_location.cr
│ │ │ │ ├── templates.cr
│ │ │ │ ├── to_json.cr
│ │ │ │ └── type.cr
│ │ │ ├── doc.cr
│ │ │ ├── expand.cr
│ │ │ ├── flags.cr
│ │ │ ├── formatter.cr
│ │ │ ├── git.cr
│ │ │ ├── implementations.cr
│ │ │ ├── init/
│ │ │ │ └── template/
│ │ │ │ ├── editorconfig.ecr
│ │ │ │ ├── example.cr.ecr
│ │ │ │ ├── example_spec.cr.ecr
│ │ │ │ ├── gitignore.ecr
│ │ │ │ ├── license.ecr
│ │ │ │ ├── readme.md.ecr
│ │ │ │ ├── shard.yml.ecr
│ │ │ │ └── spec_helper.cr.ecr
│ │ │ ├── init.cr
│ │ │ ├── macro_code_coverage.cr
│ │ │ ├── playground/
│ │ │ │ ├── agent.cr
│ │ │ │ ├── agent_instrumentor_transformer.cr
│ │ │ │ ├── public/
│ │ │ │ │ ├── application.css
│ │ │ │ │ ├── application.js
│ │ │ │ │ ├── session.js
│ │ │ │ │ ├── settings.js
│ │ │ │ │ └── vendor/
│ │ │ │ │ ├── REUSE.toml
│ │ │ │ │ ├── ansi_up-1.3.0/
│ │ │ │ │ │ ├── ansi_up.js
│ │ │ │ │ │ └── theme.css
│ │ │ │ │ ├── codemirror-5.38.0/
│ │ │ │ │ │ ├── addon/
│ │ │ │ │ │ │ └── comment/
│ │ │ │ │ │ │ └── comment.js
│ │ │ │ │ │ ├── lib/
│ │ │ │ │ │ │ ├── codemirror.css
│ │ │ │ │ │ │ └── codemirror.js
│ │ │ │ │ │ ├── mode/
│ │ │ │ │ │ │ └── crystal/
│ │ │ │ │ │ │ └── crystal.js
│ │ │ │ │ │ └── theme/
│ │ │ │ │ │ └── neat.css
│ │ │ │ │ └── octicons-19.5.0/
│ │ │ │ │ └── octicons.css
│ │ │ │ ├── server.cr
│ │ │ │ └── views/
│ │ │ │ ├── _about.html
│ │ │ │ ├── _index.html
│ │ │ │ ├── _settings.html
│ │ │ │ ├── _workbook.html.ecr
│ │ │ │ └── layout.html.ecr
│ │ │ ├── playground.cr
│ │ │ ├── print_hierarchy.cr
│ │ │ ├── print_types_visitor.cr
│ │ │ ├── table_print.cr
│ │ │ ├── typed_def_processor.cr
│ │ │ └── unreachable.cr
│ │ ├── types.cr
│ │ ├── util.cr
│ │ └── warnings.cr
│ ├── crystal.cr
│ └── requires.cr
├── complex.cr
├── compress/
│ ├── deflate/
│ │ ├── deflate.cr
│ │ ├── reader.cr
│ │ └── writer.cr
│ ├── gzip/
│ │ ├── gzip.cr
│ │ ├── header.cr
│ │ ├── reader.cr
│ │ └── writer.cr
│ ├── zip/
│ │ ├── checksum_reader.cr
│ │ ├── checksum_writer.cr
│ │ ├── compression_method.cr
│ │ ├── file.cr
│ │ ├── file_info.cr
│ │ ├── reader.cr
│ │ ├── writer.cr
│ │ └── zip.cr
│ └── zlib/
│ ├── reader.cr
│ ├── writer.cr
│ └── zlib.cr
├── concurrent.cr
├── crypto/
│ ├── bcrypt/
│ │ ├── base64.cr
│ │ ├── blowfish.cr
│ │ └── password.cr
│ ├── bcrypt.cr
│ ├── blowfish.cr
│ └── subtle.cr
├── crystal/
│ ├── at_exit_handlers.cr
│ ├── atomic_semaphore.cr
│ ├── compiler_rt/
│ │ ├── divmod128.cr
│ │ ├── fixint.cr
│ │ ├── float.cr
│ │ ├── mul.cr
│ │ ├── multi3.cr
│ │ ├── pow.cr
│ │ └── shift.cr
│ ├── compiler_rt.cr
│ ├── datum.cr
│ ├── digest/
│ │ ├── md5.cr
│ │ └── sha1.cr
│ ├── dwarf/
│ │ ├── abbrev.cr
│ │ ├── info.cr
│ │ ├── line_numbers.cr
│ │ └── strings.cr
│ ├── dwarf.cr
│ ├── elf.cr
│ ├── event_loop/
│ │ ├── epoll.cr
│ │ ├── file_descriptor.cr
│ │ ├── iocp/
│ │ │ ├── fiber_event.cr
│ │ │ └── timer.cr
│ │ ├── iocp.cr
│ │ ├── kqueue.cr
│ │ ├── libevent/
│ │ │ ├── event.cr
│ │ │ └── lib_event2.cr
│ │ ├── libevent.cr
│ │ ├── lock.cr
│ │ ├── polling/
│ │ │ ├── arena.cr
│ │ │ ├── event.cr
│ │ │ ├── fiber_event.cr
│ │ │ ├── poll_descriptor.cr
│ │ │ └── waiters.cr
│ │ ├── polling.cr
│ │ ├── socket.cr
│ │ ├── timers.cr
│ │ └── wasi.cr
│ ├── event_loop.cr
│ ├── fd_lock.cr
│ ├── hasher.cr
│ ├── iconv.cr
│ ├── interpreter.cr
│ ├── lib_iconv.cr
│ ├── mach_o.cr
│ ├── main.cr
│ ├── once.cr
│ ├── pe.cr
│ ├── pointer_linked_list.cr
│ ├── pointer_pairing_heap.cr
│ ├── print_buffered.cr
│ ├── rw_lock.cr
│ ├── scheduler.cr
│ ├── small_deque.cr
│ ├── spin_lock.cr
│ ├── syntax_highlighter/
│ │ ├── colorize.cr
│ │ └── html.cr
│ ├── syntax_highlighter.cr
│ ├── system/
│ │ ├── addrinfo.cr
│ │ ├── dir.cr
│ │ ├── env.cr
│ │ ├── fiber.cr
│ │ ├── file.cr
│ │ ├── file_descriptor.cr
│ │ ├── file_info.cr
│ │ ├── group.cr
│ │ ├── mime.cr
│ │ ├── panic.cr
│ │ ├── path.cr
│ │ ├── print_error.cr
│ │ ├── process.cr
│ │ ├── random.cr
│ │ ├── signal.cr
│ │ ├── socket.cr
│ │ ├── thread.cr
│ │ ├── thread_condition_variable.cr
│ │ ├── thread_linked_list.cr
│ │ ├── thread_mutex.cr
│ │ ├── thread_wait_group.cr
│ │ ├── time.cr
│ │ ├── unix/
│ │ │ ├── addrinfo.cr
│ │ │ ├── arc4random.cr
│ │ │ ├── dir.cr
│ │ │ ├── env.cr
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── fiber.cr
│ │ │ ├── file.cr
│ │ │ ├── file_descriptor.cr
│ │ │ ├── file_info.cr
│ │ │ ├── getrandom.cr
│ │ │ ├── group.cr
│ │ │ ├── hostname.cr
│ │ │ ├── kqueue.cr
│ │ │ ├── linux_cpucount.cr
│ │ │ ├── main.cr
│ │ │ ├── mime.cr
│ │ │ ├── path.cr
│ │ │ ├── process.cr
│ │ │ ├── pthread.cr
│ │ │ ├── pthread_condition_variable.cr
│ │ │ ├── pthread_mutex.cr
│ │ │ ├── signal.cr
│ │ │ ├── socket.cr
│ │ │ ├── spawn.cr
│ │ │ ├── syscall.cr
│ │ │ ├── sysconf_cpucount.cr
│ │ │ ├── sysctl_cpucount.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── urandom.cr
│ │ │ └── user.cr
│ │ ├── unix.cr
│ │ ├── user.cr
│ │ ├── wasi/
│ │ │ ├── addrinfo.cr
│ │ │ ├── cpucount.cr
│ │ │ ├── dir.cr
│ │ │ ├── fiber.cr
│ │ │ ├── file.cr
│ │ │ ├── file_descriptor.cr
│ │ │ ├── group.cr
│ │ │ ├── hostname.cr
│ │ │ ├── lib_wasi.cr
│ │ │ ├── main.cr
│ │ │ ├── path.cr
│ │ │ ├── process.cr
│ │ │ ├── random.cr
│ │ │ ├── signal.cr
│ │ │ ├── socket.cr
│ │ │ ├── thread.cr
│ │ │ ├── thread_condition_variable.cr
│ │ │ ├── thread_mutex.cr
│ │ │ ├── user.cr
│ │ │ └── wasi.cr
│ │ ├── win32/
│ │ │ ├── addrinfo.cr
│ │ │ ├── addrinfo_win7.cr
│ │ │ ├── cpucount.cr
│ │ │ ├── crypto.cr
│ │ │ ├── dir.cr
│ │ │ ├── env.cr
│ │ │ ├── fiber.cr
│ │ │ ├── file.cr
│ │ │ ├── file_descriptor.cr
│ │ │ ├── file_info.cr
│ │ │ ├── group.cr
│ │ │ ├── hostname.cr
│ │ │ ├── iocp.cr
│ │ │ ├── library_archive.cr
│ │ │ ├── mime.cr
│ │ │ ├── path.cr
│ │ │ ├── process.cr
│ │ │ ├── random.cr
│ │ │ ├── signal.cr
│ │ │ ├── socket.cr
│ │ │ ├── thread.cr
│ │ │ ├── thread_condition_variable.cr
│ │ │ ├── thread_mutex.cr
│ │ │ ├── time.cr
│ │ │ ├── user.cr
│ │ │ ├── visual_studio.cr
│ │ │ ├── waitable_timer.cr
│ │ │ ├── windows_registry.cr
│ │ │ ├── windows_sdk.cr
│ │ │ ├── wmain.cr
│ │ │ └── zone_names.cr
│ │ └── windows.cr
│ ├── system.cr
│ ├── thread_local_value.cr
│ ├── tracing.cr
│ └── value_with_finalizer.cr
├── csv/
│ ├── builder.cr
│ ├── error.cr
│ ├── lexer/
│ │ ├── io_based.cr
│ │ └── string_based.cr
│ ├── lexer.cr
│ ├── parser.cr
│ └── token.cr
├── csv.cr
├── deque.cr
├── digest/
│ ├── adler32.cr
│ ├── crc32.cr
│ ├── digest.cr
│ ├── io_digest.cr
│ ├── md5.cr
│ ├── sha1.cr
│ ├── sha256.cr
│ └── sha512.cr
├── digest.cr
├── dir/
│ └── glob.cr
├── dir.cr
├── docs_main.cr
├── docs_pseudo_methods.cr
├── ecr/
│ ├── lexer.cr
│ ├── macros.cr
│ ├── process.cr
│ └── processor.cr
├── ecr.cr
├── empty.cr
├── enum.cr
├── enumerable.cr
├── env.cr
├── errno.cr
├── exception/
│ ├── call_stack/
│ │ ├── dwarf.cr
│ │ ├── elf.cr
│ │ ├── interpreter.cr
│ │ ├── libunwind.cr
│ │ ├── mach_o.cr
│ │ ├── null.cr
│ │ └── stackwalk.cr
│ ├── call_stack.cr
│ └── lib_unwind.cr
├── exception.cr
├── fiber/
│ ├── context/
│ │ ├── aarch64-generic.cr
│ │ ├── aarch64-microsoft.cr
│ │ ├── arm.cr
│ │ ├── i386.cr
│ │ ├── interpreted.cr
│ │ ├── wasm32.cr
│ │ ├── x86_64-microsoft.cr
│ │ └── x86_64-sysv.cr
│ ├── context.cr
│ ├── execution_context/
│ │ ├── concurrent.cr
│ │ ├── global_queue.cr
│ │ ├── isolated.cr
│ │ ├── monitor.cr
│ │ ├── parallel/
│ │ │ └── scheduler.cr
│ │ ├── parallel.cr
│ │ ├── runnables.cr
│ │ ├── scheduler.cr
│ │ └── thread_pool.cr
│ ├── execution_context.cr
│ ├── list.cr
│ ├── pointer_linked_list_node.cr
│ ├── stack.cr
│ └── stack_pool.cr
├── fiber.cr
├── file/
│ ├── error.cr
│ ├── info.cr
│ ├── match.cr
│ ├── preader.cr
│ └── tempfile.cr
├── file.cr
├── file_utils.cr
├── float/
│ ├── fast_float/
│ │ ├── ascii_number.cr
│ │ ├── bigint.cr
│ │ ├── decimal_to_binary.cr
│ │ ├── digit_comparison.cr
│ │ ├── fast_table.cr
│ │ ├── fast_table_slice_literal.cr
│ │ ├── float_common.cr
│ │ └── parse_number.cr
│ ├── fast_float.cr
│ ├── printer/
│ │ ├── cached_powers.cr
│ │ ├── diy_fp.cr
│ │ ├── dragonbox.cr
│ │ ├── dragonbox_cache.cr
│ │ ├── grisu3.cr
│ │ ├── hexfloat.cr
│ │ ├── ieee.cr
│ │ ├── ryu_printf.cr
│ │ └── ryu_printf_table.cr
│ └── printer.cr
├── float.cr
├── gc/
│ ├── boehm.cr
│ └── none.cr
├── gc.cr
├── hash.cr
├── html/
│ └── entities.cr
├── html.cr
├── http/
│ ├── client/
│ │ └── response.cr
│ ├── client.cr
│ ├── common.cr
│ ├── content.cr
│ ├── cookie.cr
│ ├── cookies.cr
│ ├── formdata/
│ │ ├── builder.cr
│ │ ├── parser.cr
│ │ └── part.cr
│ ├── formdata.cr
│ ├── headers.cr
│ ├── log.cr
│ ├── params.cr
│ ├── request.cr
│ ├── server/
│ │ ├── context.cr
│ │ ├── handler.cr
│ │ ├── handlers/
│ │ │ ├── compress_handler.cr
│ │ │ ├── error_handler.cr
│ │ │ ├── log_handler.cr
│ │ │ ├── static_file_handler.cr
│ │ │ ├── static_file_handler.html
│ │ │ └── websocket_handler.cr
│ │ ├── request_processor.cr
│ │ └── response.cr
│ ├── server.cr
│ ├── status.cr
│ ├── web_socket/
│ │ ├── close_code.cr
│ │ └── protocol.cr
│ └── web_socket.cr
├── http.cr
├── humanize.cr
├── indexable/
│ └── mutable.cr
├── indexable.cr
├── ini.cr
├── int.cr
├── intrinsics.cr
├── io/
│ ├── argf.cr
│ ├── buffered.cr
│ ├── byte_format.cr
│ ├── console.cr
│ ├── delimited.cr
│ ├── encoding.cr
│ ├── encoding_stubs.cr
│ ├── error.cr
│ ├── evented.cr
│ ├── file_descriptor.cr
│ ├── hexdump.cr
│ ├── memory.cr
│ ├── multi_writer.cr
│ ├── sized.cr
│ └── stapled.cr
├── io.cr
├── iterable.cr
├── iterator.cr
├── json/
│ ├── any.cr
│ ├── builder.cr
│ ├── from_json.cr
│ ├── lexer/
│ │ ├── io_based.cr
│ │ └── string_based.cr
│ ├── lexer.cr
│ ├── parser.cr
│ ├── pull_parser.cr
│ ├── serialization.cr
│ ├── to_json.cr
│ └── token.cr
├── json.cr
├── kernel.cr
├── levenshtein.cr
├── lib_c/
│ ├── aarch64-darwin/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── event.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── types.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── aarch64-linux-android/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── ioctl.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── syscall.cr
│ │ │ ├── system_properties.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── aarch64-linux-gnu/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── aarch64-linux-musl/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── arm-linux-gnueabihf/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── i386-linux-gnu/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── i386-linux-musl/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── linux/
│ │ └── tls.cr
│ ├── wasm32-wasi/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── iconv.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── sched.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── file.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── times.cr
│ │ │ └── types.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-darwin/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── event.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── types.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-dragonfly/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── event.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── types.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── sysctl.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-freebsd/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── cpuset.cr
│ │ │ ├── event.cr
│ │ │ ├── file.cr
│ │ │ ├── ktls.cr
│ │ │ ├── mman.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── sysctl.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-linux-gnu/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-linux-musl/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-netbsd/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── event.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── types.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── sysctl.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-openbsd/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── event.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── types.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── sysctl.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-solaris/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ └── x86_64-windows-msvc/
│ └── c/
│ ├── afunix.cr
│ ├── basetsd.cr
│ ├── combaseapi.cr
│ ├── consoleapi.cr
│ ├── consoleapi2.cr
│ ├── corecrt.cr
│ ├── dbghelp.cr
│ ├── debugapi.cr
│ ├── delayimp.cr
│ ├── direct.cr
│ ├── errhandlingapi.cr
│ ├── errno.cr
│ ├── fcntl.cr
│ ├── fileapi.cr
│ ├── guiddef.cr
│ ├── handleapi.cr
│ ├── heapapi.cr
│ ├── in6addr.cr
│ ├── inaddr.cr
│ ├── int_safe.cr
│ ├── io.cr
│ ├── ioapiset.cr
│ ├── jobapi2.cr
│ ├── knownfolders.cr
│ ├── libloaderapi.cr
│ ├── lm.cr
│ ├── malloc.cr
│ ├── memoryapi.cr
│ ├── minwinbase.cr
│ ├── mswsock.cr
│ ├── netioapi.cr
│ ├── ntdef.cr
│ ├── ntdll.cr
│ ├── ntifs.cr
│ ├── ntsecapi.cr
│ ├── ntstatus.cr
│ ├── process.cr
│ ├── processenv.cr
│ ├── processthreadsapi.cr
│ ├── profileapi.cr
│ ├── regapix.cr
│ ├── sddl.cr
│ ├── sdkddkver.cr
│ ├── security.cr
│ ├── shlobj_core.cr
│ ├── signal.cr
│ ├── stdarg.cr
│ ├── stddef.cr
│ ├── stdint.cr
│ ├── stdio.cr
│ ├── stdlib.cr
│ ├── string.cr
│ ├── stringapiset.cr
│ ├── synchapi.cr
│ ├── sys/
│ │ ├── stat.cr
│ │ ├── types.cr
│ │ └── utime.cr
│ ├── sysinfoapi.cr
│ ├── timezoneapi.cr
│ ├── tlhelp32.cr
│ ├── userenv.cr
│ ├── wdm.cr
│ ├── win_def.cr
│ ├── winbase.cr
│ ├── wincrypt.cr
│ ├── windows.cr
│ ├── winioctl.cr
│ ├── winnls.cr
│ ├── winnt.cr
│ ├── winreg.cr
│ ├── winsock2.cr
│ ├── winternl.cr
│ ├── ws2def.cr
│ ├── ws2ipdef.cr
│ ├── ws2tcpip.cr
│ └── wtypesbase.cr
├── lib_c.cr
├── lib_z/
│ └── lib_z.cr
├── llvm/
│ ├── abi/
│ │ ├── aarch64.cr
│ │ ├── arm.cr
│ │ ├── avr.cr
│ │ ├── wasm32.cr
│ │ ├── x86.cr
│ │ ├── x86_64.cr
│ │ └── x86_win64.cr
│ ├── abi.cr
│ ├── basic_block.cr
│ ├── basic_block_collection.cr
│ ├── builder.cr
│ ├── context.cr
│ ├── di_builder.cr
│ ├── enums/
│ │ └── atomic.cr
│ ├── enums.cr
│ ├── ext/
│ │ ├── find-llvm-config.sh
│ │ ├── llvm-versions.txt
│ │ └── llvm_ext.cc
│ ├── function.cr
│ ├── function_collection.cr
│ ├── function_pass_manager.cr
│ ├── generic_value.cr
│ ├── global_collection.cr
│ ├── instruction_collection.cr
│ ├── jit_compiler.cr
│ ├── lib_llvm/
│ │ ├── analysis.cr
│ │ ├── bit_reader.cr
│ │ ├── bit_writer.cr
│ │ ├── config.cr
│ │ ├── core.cr
│ │ ├── debug_info.cr
│ │ ├── error.cr
│ │ ├── execution_engine.cr
│ │ ├── initialization.cr
│ │ ├── ir_reader.cr
│ │ ├── lljit.cr
│ │ ├── orc.cr
│ │ ├── support.cr
│ │ ├── target.cr
│ │ ├── target_machine.cr
│ │ ├── transforms/
│ │ │ ├── pass_builder.cr
│ │ │ └── pass_manager_builder.cr
│ │ └── types.cr
│ ├── lib_llvm.cr
│ ├── lib_llvm_ext.cr
│ ├── memory_buffer.cr
│ ├── module.cr
│ ├── module_pass_manager.cr
│ ├── operand_bundle_def.cr
│ ├── orc/
│ │ ├── jit_dylib.cr
│ │ ├── lljit.cr
│ │ ├── lljit_builder.cr
│ │ ├── thread_safe_context.cr
│ │ └── thread_safe_module.cr
│ ├── parameter_collection.cr
│ ├── pass_builder_options.cr
│ ├── pass_manager_builder.cr
│ ├── pass_registry.cr
│ ├── phi_table.cr
│ ├── target.cr
│ ├── target_data.cr
│ ├── target_machine.cr
│ ├── type.cr
│ ├── value.cr
│ └── value_methods.cr
├── llvm.cr
├── log/
│ ├── backend.cr
│ ├── broadcast_backend.cr
│ ├── builder.cr
│ ├── dispatch.cr
│ ├── entry.cr
│ ├── format.cr
│ ├── io_backend.cr
│ ├── json.cr
│ ├── log.cr
│ ├── main.cr
│ ├── memory_backend.cr
│ ├── metadata.cr
│ ├── setup.cr
│ └── spec.cr
├── log.cr
├── macros.cr
├── math/
│ ├── libm.cr
│ └── math.cr
├── mime/
│ ├── media_type.cr
│ ├── multipart/
│ │ ├── builder.cr
│ │ ├── parser.cr
│ │ └── state.cr
│ └── multipart.cr
├── mime.cr
├── mutex.cr
├── named_tuple.cr
├── nil.cr
├── number.cr
├── oauth/
│ ├── access_token.cr
│ ├── authorization_header.cr
│ ├── consumer.cr
│ ├── error.cr
│ ├── oauth.cr
│ ├── request_token.cr
│ └── signature.cr
├── oauth.cr
├── oauth2/
│ ├── access_token/
│ │ ├── access_token.cr
│ │ ├── bearer.cr
│ │ └── mac.cr
│ ├── auth_scheme.cr
│ ├── client.cr
│ ├── error.cr
│ ├── error_response.cr
│ ├── oauth2.cr
│ └── session.cr
├── oauth2.cr
├── object/
│ └── properties.cr
├── object.cr
├── openssl/
│ ├── algorithm.cr
│ ├── bio.cr
│ ├── cipher.cr
│ ├── digest.cr
│ ├── error.cr
│ ├── hmac.cr
│ ├── ktls.cr
│ ├── lib_crypto.cr
│ ├── lib_ssl.cr
│ ├── md5.cr
│ ├── pkcs5.cr
│ ├── sha1.cr
│ ├── ssl/
│ │ ├── context.cr
│ │ ├── defaults.cr
│ │ ├── hostname_validation.cr
│ │ ├── server.cr
│ │ └── socket.cr
│ └── x509/
│ ├── certificate.cr
│ ├── extension.cr
│ ├── name.cr
│ └── x509.cr
├── openssl.cr
├── option_parser.cr
├── path.cr
├── pointer.cr
├── prelude.cr
├── pretty_print.cr
├── primitives.cr
├── proc.cr
├── process/
│ ├── executable_path.cr
│ ├── shell.cr
│ └── status.cr
├── process.cr
├── raise.cr
├── random/
│ ├── isaac.cr
│ ├── pcg32.cr
│ └── secure.cr
├── random.cr
├── range/
│ └── bsearch.cr
├── range.cr
├── reference.cr
├── reference_storage.cr
├── regex/
│ ├── engine.cr
│ ├── lib_pcre.cr
│ ├── lib_pcre2.cr
│ ├── match_data.cr
│ ├── pcre.cr
│ └── pcre2.cr
├── regex.cr
├── semantic_version.cr
├── set.cr
├── signal.cr
├── slice/
│ └── sort.cr
├── slice.cr
├── socket/
│ ├── address.cr
│ ├── addrinfo.cr
│ ├── common.cr
│ ├── ip_socket.cr
│ ├── server.cr
│ ├── tcp_server.cr
│ ├── tcp_socket.cr
│ ├── udp_socket.cr
│ ├── unix_server.cr
│ └── unix_socket.cr
├── socket.cr
├── spec/
│ ├── cli.cr
│ ├── context.cr
│ ├── dsl.cr
│ ├── example/
│ │ └── procsy.cr
│ ├── example.cr
│ ├── example_group/
│ │ └── procsy.cr
│ ├── expectations.cr
│ ├── filters.cr
│ ├── formatter.cr
│ ├── helpers/
│ │ ├── iterate.cr
│ │ └── string.cr
│ ├── item.cr
│ ├── junit_formatter.cr
│ ├── methods.cr
│ ├── source.cr
│ └── tap_formatter.cr
├── spec.cr
├── static_array.cr
├── steppable.cr
├── string/
│ ├── builder.cr
│ ├── formatter.cr
│ ├── grapheme/
│ │ ├── grapheme.cr
│ │ └── properties.cr
│ ├── grapheme.cr
│ └── utf16.cr
├── string.cr
├── string_pool.cr
├── string_scanner.cr
├── struct.cr
├── symbol.cr
├── sync/
│ ├── condition_variable.cr
│ ├── cv.cr
│ ├── errors.cr
│ ├── exclusive.cr
│ ├── lockable.cr
│ ├── mu.cr
│ ├── mutex.cr
│ ├── rw_lock.cr
│ ├── shared.cr
│ ├── sync.cr
│ ├── type.cr
│ └── waiter.cr
├── syscall/
│ ├── aarch64-linux.cr
│ ├── arm-linux.cr
│ ├── i386-linux.cr
│ └── x86_64-linux.cr
├── syscall.cr
├── system/
│ ├── group.cr
│ └── user.cr
├── system.cr
├── system_error.cr
├── termios.cr
├── time/
│ ├── format/
│ │ ├── custom/
│ │ │ ├── http_date.cr
│ │ │ ├── iso_8601.cr
│ │ │ ├── rfc_2822.cr
│ │ │ ├── rfc_3339.cr
│ │ │ └── yaml_date.cr
│ │ ├── formatter.cr
│ │ ├── parser.cr
│ │ └── pattern.cr
│ ├── format.cr
│ ├── instant.cr
│ ├── location/
│ │ └── loader.cr
│ ├── location.cr
│ ├── span.cr
│ └── tz.cr
├── time.cr
├── tuple.cr
├── unicode/
│ ├── data.cr
│ └── unicode.cr
├── union.cr
├── uri/
│ ├── encoding.cr
│ ├── json.cr
│ ├── params/
│ │ ├── from_www_form.cr
│ │ ├── serializable.cr
│ │ └── to_www_form.cr
│ ├── params.cr
│ ├── punycode.cr
│ ├── uri_parser.cr
│ └── yaml.cr
├── uri.cr
├── uuid/
│ ├── json.cr
│ └── yaml.cr
├── uuid.cr
├── va_list.cr
├── value.cr
├── wait_group.cr
├── wasi_error.cr
├── weak_ref.cr
├── winerror.cr
├── xml/
│ ├── attribute_type.cr
│ ├── attributes.cr
│ ├── builder.cr
│ ├── document.cr
│ ├── error.cr
│ ├── html_parser_options.cr
│ ├── libxml2.cr
│ ├── namespace.cr
│ ├── node/
│ │ └── type.cr
│ ├── node.cr
│ ├── node_set.cr
│ ├── parser_options.cr
│ ├── reader/
│ │ └── type.cr
│ ├── reader.cr
│ ├── save_options.cr
│ └── xpath_context.cr
├── xml.cr
├── yaml/
│ ├── any.cr
│ ├── builder.cr
│ ├── enums.cr
│ ├── from_yaml.cr
│ ├── lib_yaml.cr
│ ├── nodes/
│ │ ├── builder.cr
│ │ ├── nodes.cr
│ │ └── parser.cr
│ ├── nodes.cr
│ ├── parse_context.cr
│ ├── parser.cr
│ ├── pull_parser.cr
│ ├── schema/
│ │ ├── core/
│ │ │ └── parser.cr
│ │ ├── core.cr
│ │ └── fail_safe.cr
│ ├── serialization.cr
│ └── to_yaml.cr
└── yaml.cr
================================================
FILE CONTENTS
================================================
================================================
FILE: .ameba.yml
================================================
# This configuration file was generated by `ameba --gen-config`
# on 2025-06-02 13:57:07 UTC using Ameba version 1.7.0-dev.
# The point is for the user to remove these configuration records
# one by one as the reported problems are removed from the code base.
#
# For more details on any individual rule, run `ameba --only RuleName`.
# Indicators for comment annotations:
#
# * `Disabled`: The rule is disabled because it does not seem useful for this repo (or in general).
# * `BUG`: A bug in ameba prevents using this rule either entirely or for specific files.
# * `FIXME`: The rule seems useful, but requires some effort to resolve. That's deferred for later.
# * `TODO`: The rule might be useful, but we need to investigate whether we want to use it or not.
Version: "1.7.0-dev"
# Documentation
# =========================
# Disabled: What's the point in alerting about existing TODOs in code?
Documentation/DocumentationAdmonition:
Enabled: false
# Lint
# =========================
Lint/DebugCalls:
Excluded:
# Samples may legitimately use DebugCalls
- samples/**/*
# Explicit tests
- spec/std/pp_spec.cr
Lint/DebuggerStatement:
Excluded:
# Explicit tests
- spec/debug/**/*
# Disabled: `else nil` can be useful to explicitly show the consequence of the else branch
Lint/ElseNil:
Enabled: false
# Disabled: We have an explicit CI job for testing the formatter (both latest
# and head). No reason to run it through ameba.
Lint/Formatting:
Enabled: false
Lint/LiteralInCondition:
Excluded:
# Samples may legitimately use literals in conditions
- samples/**/*
Lint/LiteralInInterpolation:
Excluded:
- spec/std/random_spec.cr # BUG: https://github.com/crystal-ameba/ameba/issues/611
Lint/LiteralsComparison:
Excluded:
# Explicit tests for case equality on literals
- spec/std/{array,char,int,number,regex,string,symbol,tuple,uint}_spec.cr
# TODO: Investigate if some `not_nil!` calls can be avoided.
Lint/NotNil:
Enabled: false
# BUG: https://github.com/crystal-ameba/ameba/issues/605
Lint/SpecFocus:
Enabled: false
Lint/RandZero:
Excluded:
# Explicit tests
- spec/std/random_spec.cr
# FIXME: Resolve shadowing.
Lint/ShadowingOuterLocalVar:
Enabled: false
Lint/SpecFilename:
Excluded:
- spec/compiler/data/**/*
- spec/compiler/lexer/lexer_objects/strings.cr
- spec/debug/**/*
- spec/llvm-ir/**/*
- spec/std/float_printer/ryu_printf_test_cases.cr
# BUG: https://github.com/crystal-ameba/ameba/issues/612
Lint/TopLevelOperatorDefinition:
Enabled: false
# Disabled: We have an explicit CI job for `typos`. No reason to run it through
# ameba.
Lint/Typos:
Enabled: false
# TODO: Investigate unused arguments.
Lint/UnusedArgument:
Enabled: false
# TODO: Investigate unused block arguments.
Lint/UnusedBlockArgument:
Enabled: false
Lint/UselessAssign:
# BUG: https://github.com/crystal-ameba/ameba/issues/447
# This setting is to avoid false positives from the common use of type
# declarations in macro arguments.
ExcludeTypeDeclarations: true
Excluded:
- spec/debug/**/*
- samples/mt_gc_test.cr
# BUG: https://github.com/crystal-ameba/ameba/issues/624
- spec/std/concurrent/select_spec.cr
# Generators assign top-level variables to pass to ECR templates
- scripts/generate_*
# BUG: https://github.com/crystal-ameba/ameba/issues/623
- scripts/github-changelog.cr
# Metrics
# =========================
# Disabled: Lot's of violations. Complexity is very individual.
Metrics/CyclomaticComplexity:
Enabled: false
# Naming
# =========================
# All disabled. There are many violations and some of the rules are questionable.
# TODO: Consider enabling some of these rules.
Naming/AccessorMethodName:
Enabled: false
Naming/BinaryOperatorParameterName:
Enabled: false
Naming/BlockParameterName:
Enabled: false
# Disabled: All violations follow the spelling of identifiers in upstream
# projects, e.g. for lib bindings.
Naming/ConstantNames:
Enabled: false
Naming/MethodNames:
Enabled: false
Naming/PredicateName:
Enabled: false
Naming/QueryBoolMethods:
Enabled: false
Naming/RescuedExceptionsVariableName:
Enabled: false
Naming/TypeNames:
Enabled: false
Naming/VariableNames:
Enabled: false
# Performance
# =========================
Performance/AnyInsteadOfEmpty:
Excluded:
# These specs explicitly test `#any?` implementations
- spec/std/bit_array_spec.cr
- spec/std/enumerable_spec.cr
- spec/std/hash_spec.cr
# Style
# =========================
# All disabled. There are many violations and some of the rules are questionable.
# TODO: Consider enabling some of these rules.
Style/HeredocEscape:
Enabled: false
Style/HeredocIndent:
Enabled: false
Style/MultilineCurlyBlock:
Enabled: false
# Disabled: This rule seems too strict when any negation inside a complex condition is
# considered a violation. https://github.com/crystal-ameba/ameba/issues/621
Style/NegatedConditionsInUnless:
Enabled: false
# BUG: https://github.com/crystal-ameba/ameba/issues/614
Style/ParenthesesAroundCondition:
Enabled: false
Style/PercentLiteralDelimiters:
Enabled: false
Style/RedundantNext:
Enabled: false
Style/RedundantReturn:
Enabled: false
Style/RedundantSelf:
Enabled: false
Style/VerboseBlock:
Enabled: false
Style/WhileTrue:
Enabled: false
================================================
FILE: .circleci/config.yml
================================================
version: 2.1
parameters:
distribution-scripts-repo:
description: "Git url https://github.com/crystal-lang/distribution-scripts/"
type: string
default: "https://github.com/crystal-lang/distribution-scripts.git"
distribution-scripts-version:
description: "Git ref for version of https://github.com/crystal-lang/distribution-scripts/"
type: string
default: "4205934e01733848a559a2908a14dcb16be7f38f"
previous_crystal_base_url:
description: "Prefix for URLs to Crystal bootstrap compiler"
type: string
default: "https://github.com/crystal-lang/crystal/releases/download/1.19.1/crystal-1.19.1-1"
defaults:
environment: &env
TRAVIS_BRANCH: $CIRCLE_BRANCH
TRAVIS_PULL_REQUEST: $CI_PULL_REQUEST || "false"
steps: &ci_steps
- checkout
- run: bin/ci prepare_system
- run: echo 'export CURRENT_TAG="$CIRCLE_TAG"' >> $BASH_ENV
- run: bin/ci prepare_build
- run:
command: bin/ci build
no_output_timeout: 30m
- run:
when: always
command: |
mkdir -p ~/test-results/spec
cp .junit/*.xml ~/test-results/spec/
- store_test_results:
path: ~/test-results
- store_artifacts:
path: ~/test-results/spec
jobs:
test_linux:
machine:
image: default
environment:
<<: *env
TRAVIS_OS_NAME: linux
ARCH: x86_64
ARCH_CMD: linux64
resource_class: large
steps:
- checkout
- run: bin/ci prepare_system
- run: echo 'export CURRENT_TAG="$CIRCLE_TAG"' >> $BASH_ENV
- run: bin/ci prepare_build
- run:
command: bin/ci build
no_output_timeout: 30m
- run:
when: always
command: |
mkdir -p ~/test-results/spec
cp .junit/*.xml ~/test-results/spec/
- store_test_results:
path: ~/test-results
- store_artifacts:
path: ~/test-results/spec
- persist_to_workspace:
root: .
paths:
- docs
test_alpine:
machine:
image: default
environment:
<<: *env
TRAVIS_OS_NAME: linux
ARCH: x86_64-musl
ARCH_CMD: linux64
resource_class: large
steps: *ci_steps
test_darwin:
macos:
xcode: 16.4.0
environment:
<<: *env
TRAVIS_OS_NAME: osx
LLVM_CONFIG: /usr/local/opt/llvm/bin/llvm-config
steps:
- restore_cache:
keys:
- brew-cache-v1
- checkout
- run: bin/ci prepare_system
- run: echo 'export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/opt/openssl@1.1/lib/pkgconfig"' >> $BASH_ENV
- run: echo 'export CURRENT_TAG="$CIRCLE_TAG"' >> $BASH_ENV
- run: bin/ci prepare_build
- run:
command: bin/ci build
no_output_timeout: 30m
- run:
when: always
command: |
mkdir -p ~/test-results/spec
cp .junit/*.xml ~/test-results/spec/
- store_test_results:
path: ~/test-results
- store_artifacts:
path: ~/test-results/spec
- save_cache:
key: brew-cache-v1
paths:
- /usr/local/Homebrew
- ~/Library/Caches/Homebrew/downloads
test_preview_mt:
machine:
image: default
resource_class: large
environment:
<<: *env
TRAVIS_OS_NAME: linux
ARCH: x86_64
ARCH_CMD: linux64
steps:
- checkout
- run: bin/ci prepare_system
- run: echo 'export CURRENT_TAG="$CIRCLE_TAG"' >> $BASH_ENV
- run: bin/ci prepare_build
- run: bin/ci with_build_env 'make crystal'
- run:
command: bin/ci with_build_env 'CRYSTAL_WORKERS=4 make std_spec threads=1 FLAGS="-D preview_mt" junit_output=.junit/std_spec.xml'
no_output_timeout: 30m
- run:
when: always
command: |
mkdir -p ~/test-results/spec
cp .junit/*.xml ~/test-results/spec/
- store_test_results:
path: ~/test-results
- store_artifacts:
path: ~/test-results/spec
prepare_common:
docker:
- image: docker:stable-git
steps:
# checkout specific distribution-scripts version to perform releases and nightly
- run: |
git clone << pipeline.parameters.distribution-scripts-repo >> ~/distribution-scripts
cd ~/distribution-scripts
git checkout << pipeline.parameters.distribution-scripts-version >>
# persist relevant information for build process
- run: |
cd ~/distribution-scripts
touch build.env
echo "export DOCKER_REPOSITORY=crystallang/crystal" >> build.env
# What to build
echo "export CRYSTAL_SHA1=$CIRCLE_SHA1" >> build.env
# Which previous version use
echo "export PREVIOUS_CRYSTAL_RELEASE_DARWIN_TARGZ=<< pipeline.parameters.previous_crystal_base_url >>-darwin-universal.tar.gz" >> build.env
cat build.env
- persist_to_workspace:
root: ../
paths:
- distribution-scripts
# prepare build for tagged releases
prepare_tagged:
docker:
- image: docker:stable-git
steps:
- attach_workspace:
at: /tmp/workspace
- run: |
cd /tmp/workspace/distribution-scripts
# How to brand it
echo "export CRYSTAL_VERSION=$CIRCLE_TAG" >> build.env
echo "export DOCKER_TAG=$CIRCLE_TAG" >> build.env
# Snapcraft configuration
echo "export SNAP_GRADE=stable" >> build.env
echo "export SNAP_CHANNEL=edge" >> build.env
cat build.env
- persist_to_workspace:
root: /tmp/workspace
paths:
- distribution-scripts
# prepare build for nightly releases
prepare_nightly:
docker:
- image: docker:stable-git
steps:
- attach_workspace:
at: /tmp/workspace
- checkout
- run: |
# We need CRYSTAL_VERSION in prepare_nightly to use src/VERSION so we publish them as x.y.z-dev in apt/rpm
#
# How to brand it
echo "export CRYSTAL_VERSION=$(cat src/VERSION)" >> /tmp/workspace/distribution-scripts/build.env
#
# TODO: We might want to do that on docker images also to support updates on multiple development versions the same date.
- run: |
cd /tmp/workspace/distribution-scripts
echo "export DOCKER_TAG=nightly" >> build.env
# Build from working directory (needed for omnibus and when version does not match branch/tag)
echo "export FORCE_GIT_TAGGED=0" >> build.env
# Snapcraft configuration
echo "export SNAP_GRADE=devel" >> build.env
echo "export SNAP_CHANNEL=edge" >> build.env
cat build.env
- persist_to_workspace:
root: /tmp/workspace
paths:
- distribution-scripts
# prepare build for manual triggered releases like ci branches, maintenance releases, etc.
prepare_maintenance:
docker:
- image: docker:stable-git
steps:
- attach_workspace:
at: /tmp/workspace
- run: |
cd /tmp/workspace/distribution-scripts
# The version is based on the branch name.
VERSION=$CIRCLE_BRANCH
# We need to sanitize it because there are restrictions on some places
# where the version is use (Mac pkg names, snap branch).
VERSION=${VERSION/release\//}
VERSION=${VERSION//_/-}
VERSION=${VERSION//\//-}-dev
export VERSION
echo "export CRYSTAL_VERSION=$VERSION" >> build.env
echo "export DOCKER_TAG=$VERSION" >> build.env
# Build from working directory (needed for omnibus and when version does not match branch/tag)
echo "export FORCE_GIT_TAGGED=0" >> build.env
# Snapcraft configuration
echo "export SNAP_GRADE=devel" >> build.env
echo "export SNAP_CHANNEL=edge/$VERSION" >> build.env
cat build.env
- persist_to_workspace:
root: /tmp/workspace
paths:
- distribution-scripts
dist_linux:
parameters:
arch:
type: string
machine:
image: default
resource_class: << parameters.arch >>
steps:
- attach_workspace:
at: /tmp/workspace
- run:
no_output_timeout: 20m
command: |
cd /tmp/workspace/distribution-scripts
source build.env
export PREVIOUS_CRYSTAL_RELEASE_LINUX64_TARGZ="<< pipeline.parameters.previous_crystal_base_url >>-linux-$(uname -m).tar.gz"
cd linux
make all64 release=true
- store_artifacts:
path: /tmp/workspace/distribution-scripts/linux/build
destination: build
- persist_to_workspace:
root: /tmp/workspace/distribution-scripts/linux/
paths:
- build
dist_darwin:
macos:
xcode: 16.4.0
shell: /bin/bash --login -eo pipefail
steps:
- restore_cache:
keys:
- brew-cache-v1
- run:
name: Setup environment
command: |
brew unlink python@2 || true
brew install ruby@3 libffi pkgconfig libtool automake
sudo mkdir -p /opt/crystal
sudo chown $(whoami) /opt/crystal/
sudo mkdir -p /var/cache
sudo chown $(whoami) /var/cache
- attach_workspace:
at: /tmp/workspace
- run:
no_output_timeout: 40m
command: |
cd /tmp/workspace/distribution-scripts
source build.env
cd omnibus
ruby --version
gem install bundler -v "$(grep -A 1 "BUNDLED WITH" Gemfile.lock | tail -n 1)"
bundle check || bundle install --binstubs
cd ../darwin
make
- store_artifacts:
path: /tmp/workspace/distribution-scripts/darwin/build
destination: build
- persist_to_workspace:
root: /tmp/workspace/distribution-scripts/darwin/
paths:
- build
push_obs_nightly:
docker:
- image: crystallang/osc
steps:
- attach_workspace:
at: /tmp/workspace
- run:
command: |
cd /tmp/workspace/distribution-scripts
source build.env
packages/obs-setup.sh
packages/obs-push.sh devel:languages:crystal:nightly ${CRYSTAL_VERSION%-*} $(date '+%Y%m%d') $CRYSTAL_SHA1 \
/tmp/workspace/build/crystal-*-linux-x86_64.tar.gz \
/tmp/workspace/build/crystal-*-docs.tar.gz
dist_docker:
machine:
image: default
steps:
- attach_workspace:
at: /tmp/workspace
- run:
name: Enable buildx for multiarch builds
command: docker buildx create --use
- run:
name: Build and push multiarch images
command: |
cd /tmp/workspace/distribution-scripts
source build.env
cd docker
docker login -u ${DOCKER_USER} -p ${DOCKER_PASS}
make all TARBALLS=/tmp/workspace/build/ VERSION=${CRYSTAL_VERSION} PUSH=1
- run:
name: Smoke tests
command: |
cd /tmp/workspace/distribution-scripts
source build.env
cd docker
make smoke-all VERSION=${CRYSTAL_VERSION}
dist_snap:
machine:
image: "ubuntu-2204:current"
environment:
SNAPCRAFT_BUILD_ENVIRONMENT: host
steps:
- attach_workspace:
at: /tmp/workspace
- run:
command: |
sudo apt-get update
sudo apt-get install -y make snapd
sudo snap install snapcraft --classic
cd /tmp/workspace/distribution-scripts
source build.env
cd snapcraft/
sudo -E make ARCH=amd64 CRYSTAL_TARBALL=/tmp/workspace/build/crystal-$CRYSTAL_VERSION-1-linux-x86_64.tar.gz GRADE=$SNAP_GRADE
sudo -E make ARCH=arm64 CRYSTAL_TARBALL=/tmp/workspace/build/crystal-$CRYSTAL_VERSION-1-linux-aarch64.tar.gz GRADE=$SNAP_GRADE
sudo -E make push CHANNEL=$SNAP_CHANNEL
dist_docs:
machine:
image: default
steps:
- attach_workspace:
at: /tmp/workspace
- run: |
cd /tmp/workspace/distribution-scripts
source build.env
cd docs
make CRYSTAL_DOCKER_IMAGE=${DOCKER_REPOSITORY}:${DOCKER_TAG}-build
- store_artifacts:
path: /tmp/workspace/distribution-scripts/docs/build
destination: build
- persist_to_workspace:
root: /tmp/workspace/distribution-scripts/docs/
paths:
- build
publish_nightly_artifacts:
docker:
- image: manastech/s3cmd:2.2-alpine
environment:
<<: *env
AWS_ACCESS_KEY_ID: AKIA2EEIIRCJDEDGK6MQ
steps:
- attach_workspace:
at: /tmp/workspace
- run: |
mkdir -p /tmp/upload
cd /tmp/workspace/build
cp crystal-*-darwin-universal.tar.gz /tmp/upload/crystal-nightly-darwin-universal.tar.gz
cp crystal-*-linux-x86_64.tar.gz /tmp/upload/crystal-nightly-linux-x86_64.tar.gz
cp crystal-*-linux-aarch64.tar.gz /tmp/upload/crystal-nightly-linux-aarch64.tar.gz
- run: s3cmd put --recursive /tmp/upload/* s3://artifacts.crystal-lang.org/dist/
dist_artifacts:
docker:
- image: buildpack-deps:xenial
steps:
- attach_workspace:
at: /tmp/workspace
- store_artifacts:
path: /tmp/workspace/build
destination: dist_packages
workflows:
version: 2
release:
jobs:
- test_linux:
filters: &release
branches:
only:
- /release\/.+/
- /.*\bci\b.*/
tags:
only: /.*/
- test_alpine:
filters: *release
# - test_darwin: # See https://github.com/crystal-lang/crystal/pull/9763
# filters: *release
- test_preview_mt:
filters: *release
- prepare_common:
filters: *release
- prepare_maintenance:
filters: &maintenance
branches:
only:
- /release\/.+/
- /.*\bci\b.*/
requires:
- prepare_common
- prepare_tagged:
filters: &tagged
branches:
ignore: /.*/
tags:
only: /.*/
requires:
- prepare_common
- dist_linux:
matrix:
parameters:
arch: [large, arm.medium]
filters: *release
requires:
- prepare_maintenance
- prepare_tagged
- dist_darwin:
filters: *release
requires:
- prepare_maintenance
- prepare_tagged
- dist_docker:
filters: *release
requires:
- dist_linux
- dist_snap:
filters: *release
requires:
- dist_linux
- dist_docs:
filters: *release
requires:
- dist_docker
- dist_artifacts:
filters: *release
requires:
- dist_linux
- dist_darwin
- dist_docs
nightly_release:
triggers:
- schedule:
cron: "0 0 * * *"
filters:
branches:
only:
- master
jobs:
- test_linux
- test_alpine
# - test_darwin # See https://github.com/crystal-lang/crystal/pull/9763
- test_preview_mt
- prepare_common
- prepare_nightly:
requires:
- prepare_common
- dist_linux:
matrix:
parameters:
arch: [large, arm.medium]
requires:
- prepare_nightly
- dist_darwin:
requires:
- prepare_nightly
- push_obs_nightly:
requires:
- dist_linux
- dist_docs
- dist_docker:
requires:
- dist_linux
- dist_snap:
requires:
- dist_linux
- dist_docs:
requires:
- dist_docker
- publish_nightly_artifacts:
requires:
- dist_linux
- dist_darwin
- dist_artifacts:
requires:
- dist_linux
- dist_darwin
- dist_docs
================================================
FILE: .editorconfig
================================================
root = true
[*.{cr,ecr}]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
================================================
FILE: .gitattributes
================================================
## Sources
*.cr text eol=lf
## Sourced-in dependencies
lib/** linguist-vendored
## Generated files
# produced by scripts/generate_windows_zone_names.cr
src/crystal/system/win32/zone_names.cr linguist-generated
# produced by scripts/generate_object_properties.cr
src/object/properties.cr
# produced by scripts/generate_html_entities.cr
src/html/entities.cr linguist-generated
# produced by scripts/generate_ssl_server_defaults.cr
src/openssl/ssl/defaults.cr linguist-generated
# produced by scripts/generate_grapheme_properties.cr
src/string/grapheme/properties.cr linguist-generated
# produced by scripts/generate_unicode_data.cr
src/unicode/data.cr linguist-generated
# produced by scripts/generate_glob_specs.cr
spec/std/file/match-fast-glob_spec.cr
# produced by scripts/generate_grapheme_break_specs.cr
spec/std/string/grapheme_break_spec.cr linguist-generated
# produced by spec/generate_wasm32_spec.sh
spec/wasm32_std_spec.cr linguist-generated
# devenv
.devenv.flake.nix -merge linguist-generated
devenv.lock -merge linguist-generated
## Syntax highlighting
Makefile.win linguist-language=makefile
================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.md
================================================
---
name: "\U0001F41B Bug Report"
about: I want to report a bug.
labels: kind:bug
type: Bug
---
# Bug Report
Make sure to review these points before submitting issues - thank you!
- Make sure a similar issue does not exist yet: use the search box, search engine and look at [Stack Overflow](https://stackoverflow.com/questions/tagged/crystal-lang).
- **Include reproducible code**: we should be able to paste it into an editor, compile and run it and get the same error as you. Otherwise it's impossible for us to reproduce the bug.
- Don't **only** use `play.crystal-lang.org` or `carc.in`: code might be lost and the issue will remain incomplete. Write code in the issue itself.
- Reduce code, if possible, to the minimum size that reproduces the bug.
- If all of the above is impossible due to a large project, create a branch that reproduces the bug and point us to it.
- Include Crystal compiler version (`crystal -v`) and OS. If possible, try to see if the bug still reproduces on master.
---
Add a :+1: [reaction] to [issues you find important].
[reaction]: https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/
[issues you find important]:
https://github.com/crystal-lang/crystal/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: "\U00002753 Crystal Community Forum"
url: https://forum.crystal-lang.org/c/help-support
about: Questions about installing, using Crystal and any related issues.
- name: "\U0001F4AC Crystal Community Chat"
url: https://gitter.im/crystal-lang/crystal
about: "Get in touch with the community, ask for help and talk about Crystal. (IRC: #crystal-lang on libera.chat)"
================================================
FILE: .github/ISSUE_TEMPLATE/discussion.md
================================================
---
name: "\U0001F914 Language Improvement Discussion"
about: I want to start a new discussion about improving the language.
labels: status:discussion
---
# Discussion
- What aspect of the language would you like to see improved?
- What are the reasons?
- Include practical examples to illustrate your points.
- Optionally add one (or more) proposals to improve the current situation.
---
Add a :+1: [reaction] to [issues you find important].
[reaction]: https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/
[issues you find important]:
https://github.com/crystal-lang/crystal/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc
================================================
FILE: .github/ISSUE_TEMPLATE/feature-request.md
================================================
---
name: "\U0001F680 Feature Request"
about: I want to propose a new language feature.
labels: kind:feature
type: Feature
---
# Feature Request
- Is your feature request related to a problem? Please describe clearly and concisely what is it.
- Describe the feature you would like, optionally illustrated by examples, and how it will solve the above problem.
- Describe considered alternative solutions, and the reasons why you have not proposed them as a solution here.
- Does it break backward compatibility, if yes then what's the migration path?
In case this proposal includes a substantial change to the language, we ask you to go through an [RFC process](https://github.com/crystal-lang/rfcs).
The best place to start an open discussion about potential changes is the [Crystal forum](https://forum.crystal-lang.org/c/crystal-contrib/6).
---
Add a :+1: [reaction] to [issues you find important].
[reaction]: https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/
[issues you find important]: https://github.com/crystal-lang/crystal/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc
================================================
FILE: .github/PULL_REQUEST_TEMPLATE/pull_request_template.md
================================================
# Pull Request
We thank you for helping improve Crystal. In order to ease the reviewing process, we invite you to read the [guidelines](https://github.com/crystal-lang/crystal/blob/master/CONTRIBUTING.md#making-good-pull-requests) and ask you to consider the following points before submitting a PR:
1. We prefer to discuss the underlying issue _prior_ to discussing the code. Therefore, we kindly ask you to refer to an existing issue, or an existing discussion in a public space with members of the Core Team (forum, Gitter, Discord, ...). In few cases, we acknowledge that this might not be necessary, for instance when refactoring code or small bug fixes. In this case, the PR must include the same information an issue would have: a clear explanation of the issue, reproducible code, etc.
2. Focus the PR to the referred issue, and restraint from adding unrelated changes/additions. We do welcome another PR if you fixed another issue.
3. If your change is big, consider breaking it into several smaller PRs. In general, the smaller the change, the quicker we can review it.
4. ⚠️ Please do not amend previous commits and force push to the PR branch. This makes reviews much harder because reference to previous state is hidden.
---
Add a :+1: [reaction] to [pull requests you find important].
[reaction]: https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/
[pull requests you find important]:
https://github.com/crystal-lang/crystal/pulls?q=is%3Aopen+sort%3Areactions-%2B1-desc
================================================
FILE: .github/actionlint.yaml
================================================
self-hosted-runner:
# Labels of self-hosted runner in array of strings.
labels:
- runs-on
- runner=*
- family=*
- ram=*
- windows-11-arm # actionlint doesn't understand this label yet
# Configuration variables in array of strings defined in your repository or
# organization. `null` means disabling configuration variables check.
# Empty array means no configuration variable is allowed.
config-variables: null
# Configuration for file paths. The keys are glob patterns to match to file
# paths relative to the repository root. The values are the configurations for
# the file paths. Note that the path separator is always '/'.
# The following configurations are available.
#
# "ignore" is an array of regular expression patterns. Matched error messages
# are ignored. This is similar to the "-ignore" command line option.
paths:
# .github/workflows/**/*.yml:
# ignore: []
================================================
FILE: .github/renovate.json
================================================
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended"
],
"separateMajorMinor": false,
"packageRules": [
{
"matchDatasources": [
"docker"
],
"enabled": false
},
{
"groupName": "GH Actions",
"matchManagers": [
"github-actions"
],
"schedule": [
"after 5am and before 8am on Wednesday"
]
}
],
"labels": [
"topic:infrastructure/ci"
]
}
================================================
FILE: .github/workflows/aarch64.yml
================================================
name: AArch64 CI
on: [push, pull_request]
permissions: {}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
jobs:
aarch64-musl-build:
runs-on: [runs-on, runner=2cpu-linux-arm64, "run-id=${{ github.run_id }}"]
if: github.repository == 'crystal-lang/crystal'
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Build Crystal
uses: docker://crystallang/crystal:1.13.2-alpine-84codes-build
with:
args: make crystal
- name: Upload Crystal executable
uses: actions/upload-artifact@v7
with:
name: crystal-aarch64-musl
path: |
.build/crystal
src/llvm/ext/llvm_ext.o
aarch64-musl-test-stdlib:
needs: aarch64-musl-build
runs-on: [runs-on, runner=4cpu-linux-arm64, "family=m7g", ram=16, "run-id=${{ github.run_id }}"]
if: github.repository == 'crystal-lang/crystal'
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Download Crystal executable
uses: actions/download-artifact@v8
with:
name: crystal-aarch64-musl
- name: Mark downloaded compiler as executable
run: chmod +x .build/crystal
- name: Run stdlib specs
uses: docker://crystallang/crystal:1.13.2-alpine-84codes-build
with:
args: make std_spec
aarch64-musl-test-compiler:
needs: aarch64-musl-build
runs-on: [runs-on, runner=4cpu-linux-arm64, "family=m7g", ram=16, "run-id=${{ github.run_id }}"]
if: github.repository == 'crystal-lang/crystal'
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Download Crystal executable
uses: actions/download-artifact@v8
with:
name: crystal-aarch64-musl
- name: Mark downloaded compiler as executable
run: chmod +x .build/crystal
- name: Run compiler specs
uses: docker://crystallang/crystal:1.13.2-alpine-84codes-build
with:
args: make primitives_spec compiler_spec FLAGS=-Dwithout_ffi
aarch64-gnu-build:
runs-on: [runs-on, runner=2cpu-linux-arm64, "run-id=${{ github.run_id }}"]
if: github.repository == 'crystal-lang/crystal'
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Build Crystal
uses: docker://crystallang/crystal:1.13.2-ubuntu-84codes-build
with:
args: make crystal
- name: Upload Crystal executable
uses: actions/upload-artifact@v7
with:
name: crystal-aarch64-gnu
path: |
.build/crystal
src/llvm/ext/llvm_ext.o
aarch64-gnu-test-stdlib:
needs: aarch64-gnu-build
runs-on: [runs-on, runner=4cpu-linux-arm64, "family=m7g", ram=16, "run-id=${{ github.run_id }}"]
if: github.repository == 'crystal-lang/crystal'
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Download Crystal executable
uses: actions/download-artifact@v8
with:
name: crystal-aarch64-gnu
- name: Mark downloaded compiler as executable
run: chmod +x .build/crystal
- name: Run stdlib specs
uses: docker://crystallang/crystal:1.13.2-ubuntu-84codes-build
with:
args: make std_spec
aarch64-gnu-test-compiler:
needs: aarch64-gnu-build
runs-on: [runs-on, runner=4cpu-linux-arm64, "family=m7g", ram=16, "run-id=${{ github.run_id }}"]
if: github.repository == 'crystal-lang/crystal'
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Download Crystal executable
uses: actions/download-artifact@v8
with:
name: crystal-aarch64-gnu
- name: Mark downloaded compiler as executable
run: chmod +x .build/crystal
- name: Run compiler specs
uses: docker://crystallang/crystal:1.13.2-ubuntu-84codes-build
with:
args: make primitives_spec compiler_spec
================================================
FILE: .github/workflows/backport.yml
================================================
# WARNING:
# When extending this action, be aware that $GITHUB_TOKEN allows write access to
# the GitHub repository. This means that it should not evaluate user input in a
# way that allows code injection.
name: Backport
on:
pull_request_target:
types: [closed, labeled]
branches: [master, release/*]
permissions:
contents: write # so it can comment
pull-requests: write # so it can create pull requests
jobs:
backport:
name: Backport Pull Request
if: github.repository_owner == 'crystal-lang' && github.event.pull_request.merged == true && (github.event_name != 'labeled' || startsWith('backport', github.event.label.name))
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
token: ${{ secrets.BACKPORT_ACTION_GITHUB_PAT }}
persist-credentials: false
- name: Create backport PR
uses: korthout/backport-action@4aaf0e03a94ff0a619c9a511b61aeb42adea5b02 # v4.2.0
with:
github_token: ${{ secrets.BACKPORT_ACTION_GITHUB_PAT }}
# Config README: https://github.com/korthout/backport-action#backport-action
copy_labels_pattern: '^(breaking-change|security|topic:.*|kind:.*|platform:.*)$'
copy_milestone: true
pull_description: |-
Automated backport of #${pull_number} to `${target_branch}`, triggered by a label.
================================================
FILE: .github/workflows/docs.yml
================================================
name: Docs
on:
push:
branches:
- master
permissions: {}
env:
TRAVIS_OS_NAME: linux
jobs:
deploy_api_docs:
if: github.repository_owner == 'crystal-lang'
env:
ARCH: x86_64
ARCH_CMD: linux64
runs-on: ubuntu-latest
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Prepare System
run: bin/ci prepare_system
- name: Prepare Build
run: bin/ci prepare_build
- name: Build docs
run: bin/ci with_build_env 'make crystal docs threads=1'
- name: Set revision
run: echo "$GITHUB_SHA" > ./docs/revision.txt
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 # v6.0.0
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Deploy API docs to S3
run: |
aws s3 sync ./docs s3://crystal-api/api/master --delete
================================================
FILE: .github/workflows/forward-compatibility.yml
================================================
name: Forward Compatibility
on:
push:
paths:
- .github/workflows/forward-compatibility.yml
schedule:
- cron: '0 3 * * *'
workflow_dispatch:
permissions: {}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
env:
TRAVIS_OS_NAME: linux
SPEC_SPLIT_DOTS: 160
jobs:
# Test against *each* supported Crystal version for forward compatibility.
#
# This workflow runs on a nightly schedule on `master`.
# It can also be dispatched manually when necessary.
#
# We run a basic version of this test on every commit which covers only the earliest and latest supported versions in `linux.yml#x86_64-gnu-test`.
x86_64-gnu-test-forward_compatibility:
env:
ARCH: x86_64
ARCH_CMD: linux64
CRYSTAL_BOOTSTRAP_VERSION: ${{ matrix.crystal_bootstrap_version }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
crystal_bootstrap_version: [1.7.3, 1.8.2, 1.9.2, 1.10.1, 1.11.2, 1.12.2, 1.13.3, 1.14.1, 1.15.1, 1.16.3, 1.17.1, 1.18.2]
env: [{}]
include:
# libffi is only available starting from the 1.2.2 build images
# pcre2 is only available starting from the 1.7.0 build images
- crystal_bootstrap_version: 1.1.1
env:
FLAGS: -Dwithout_ffi
USE_PCRE1: true
- crystal_bootstrap_version: 1.2.2
env:
USE_PCRE1: true
- crystal_bootstrap_version: 1.3.2
env:
USE_PCRE1: true
- crystal_bootstrap_version: 1.4.1
env:
USE_PCRE1: true
- crystal_bootstrap_version: 1.5.1
env:
USE_PCRE1: true
- crystal_bootstrap_version: 1.6.2
env:
USE_PCRE1: true
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Prepare System
run: bin/ci prepare_system
- name: Prepare Build
run: bin/ci prepare_build
- name: Test
run: bin/ci build
env: ${{ matrix.env }}
================================================
FILE: .github/workflows/interpreter.yml
================================================
name: Interpreter Test
on: [push, pull_request]
permissions: {}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
env:
SPEC_SPLIT_DOTS: 160
jobs:
test-interpreter_spec:
runs-on: ubuntu-24.04
container:
image: crystallang/crystal:1.19.1-build
name: "Test Interpreter"
steps:
- uses: actions/checkout@v6
with:
persist-credentials: false
- name: Test interpreter_spec
run: make interpreter_spec junit_output=.junit/interpreter_spec.xml
build-interpreter:
runs-on: ubuntu-24.04
container:
image: crystallang/crystal:1.19.1-build
name: Build interpreter
steps:
- uses: actions/checkout@v6
with:
persist-credentials: false
- name: Build compiler
run: make interpreter=1 release=1
- name: Upload compiler artifact
uses: actions/upload-artifact@v7
with:
name: crystal-interpreter
path: |
.build/crystal
test-interpreter-std_spec:
needs: build-interpreter
runs-on: ubuntu-24.04
container:
image: crystallang/crystal:1.19.1-build
strategy:
fail-fast: false
matrix:
part: [0, 1, 2, 3]
name: "Test std_spec with interpreter (${{ matrix.part }})"
steps:
- uses: actions/checkout@v6
with:
persist-credentials: false
- name: Download compiler artifact
uses: actions/download-artifact@v8
with:
name: crystal-interpreter
path: .build/
- name: Mark downloaded compiler as executable
run: chmod +x .build/crystal
- name: Run std_spec with interpreter
run: SPEC_SPLIT="${{ matrix.part }}%4" bin/crystal i spec/std_spec.cr -- --junit_output .junit/interpreter-std_spec.${{ matrix.part }}.xml
test-interpreter-primitives_spec:
needs: build-interpreter
runs-on: ubuntu-24.04
container:
image: crystallang/crystal:1.19.1-build
name: "Test primitives_spec with interpreter"
steps:
- uses: actions/checkout@v6
with:
persist-credentials: false
- name: Download compiler artifact
uses: actions/download-artifact@v8
with:
name: crystal-interpreter
path: .build/
- name: Mark downloaded compiler as executable
run: chmod +x .build/crystal
- name: Run primitives_spec with interpreter
run: bin/crystal i spec/primitives_spec.cr -- --junit_output .junit/interpreter-primitives_spec.xml
================================================
FILE: .github/workflows/lint.yml
================================================
name: Lint
on:
push:
pull_request:
workflow_dispatch:
permissions: {}
jobs:
prek:
runs-on: ubuntu-latest
steps:
- name: Download source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
fetch-depth: 0
- uses: cachix/install-nix-action@1ca7d21a94afc7c957383a2d217460d980de4934 # v31
with:
nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/e99215c1a21cab2a995a3d01fe20d5714addea27.tar.gz # nixpkgs-unstable@2026-03-06 (with devenv 2.0)
- uses: cachix/cachix-action@3ba601ff5bbb07c7220846facfa2cd81eeee15a1 # v16
with:
name: devenv
- name: Install devenv.sh
run: nix profile install nixpkgs#devenv
- name: "Download target branch: ${{ github.base_ref || 'master' }}"
run: git fetch origin "${TARGET_BRANCH}"
- name: Check whether to run full test on all files
id: test_full_run
if: ${{ github.event_name != 'workflow_dispatch' }}
run: |
# Trigger full run if devenv.lock or this workflow file changed
if git diff --quiet "origin/${TARGET_BRANCH}" HEAD -- devenv.lock .github/workflows/lint.yml; then
echo "test_full_run=false" >> "$GITHUB_OUTPUT"
else
echo "test_full_run=true" >> "$GITHUB_OUTPUT"
fi
- name: Run prek on all files
id: run_full
run: prek run --all-files
shell: devenv --profile lint shell bash -- -e {0}
if: ${{ github.event_name == 'workflow_dispatch' || steps.test_full_run.outputs.test_full_run == 'true' }}
- name: Run prek hooks for changes against target branch (${{ github.base_ref || 'master' }})
run: prek run --from-ref "origin/${TARGET_BRANCH}" --to-ref HEAD
shell: devenv --profile lint shell bash -- -e {0}
if: "${{ steps.run_full.outcome == 'skipped' }}"
env:
TARGET_BRANCH: "${{ github.base_ref || 'master' }}"
================================================
FILE: .github/workflows/linux.yml
================================================
name: Linux CI
on: [push, pull_request]
permissions: {}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
env:
TRAVIS_OS_NAME: linux
SPEC_SPLIT_DOTS: 160
jobs:
# Test against latest release and the earliest supported Crystal version for forward compatibility.
#
# A more advanced test which runs against *each* supported version is available in `forward-compatibility.yml` and
# runs regularly on a nightly schedule.
test:
env:
ARCH: ${{ matrix.arch }}
ARCH_CMD: linux64
runs-on: ${{ case(startsWith(matrix.arch, 'aarch64'), 'ubuntu-24.04-arm', 'ubuntu-latest') }}
strategy:
fail-fast: false
matrix:
arch:
- x86_64
- x86_64-musl
- aarch64
- aarch64-musl
env: [{}]
include:
- arch: x86_64
env:
CRYSTAL_BOOTSTRAP_VERSION: 1.0.0
# libffi is only available starting from the 1.2.2 build images
FLAGS: "-Dwithout_ffi"
# pcre2 is only available starting from the 1.7.0 build images
USE_PCRE1: true
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Prepare System
run: bin/ci prepare_system
- name: Prepare Build
run: bin/ci prepare_build
- name: Test
run: bin/ci build
env: ${{ matrix.env }}
test-std:
env:
ARCH: ${{ matrix.arch }}
ARCH_CMD: linux64
runs-on: ${{ case(startsWith(matrix.arch, 'aarch64'), 'ubuntu-24.04-arm', 'ubuntu-latest') }}
strategy:
fail-fast: false
matrix:
arch:
- x86_64
- aarch64
opts:
- flags: "-Dexecution_context -Dpreview_mt" # execution_context: concurrent
workers: 1
- flags: "-Dexecution_context -Dpreview_mt" # execution_context: parallel
workers: 4
include:
- arch: x86_64
opts:
flags: "-Devloop=libevent"
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Prepare System
run: bin/ci prepare_system
- name: Prepare Build
run: |
bin/ci prepare_build
bin/ci with_build_env crystal version
- name: Test
run: bin/ci with_build_env 'CRYSTAL_WORKERS=${{ matrix.opts.workers || 1 }} make std_spec threads=1 FLAGS="${{ matrix.opts.flags }}"'
check_format:
env:
ARCH: x86_64
ARCH_CMD: linux64
runs-on: ubuntu-latest
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Prepare System
run: bin/ci prepare_system
- name: Prepare Build
run: bin/ci prepare_build
- name: Check Format
run: bin/ci format
lint_spellcheck:
name: Spell Check with Typos
runs-on: ubuntu-latest
steps:
- name: Checkout Actions Repository
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Spell Check Repo
uses: crate-ci/typos@631208b7aac2daa8b707f55e7331f9112b0e062d # v1.44.0
env:
CLICOLOR: 1
lint_ameba:
runs-on: ubuntu-latest
container: ghcr.io/crystal-ameba/ameba:sha-d861f4ed0f904e0ecdad11c26f98e968f7d95afa # 1.7.0-dev
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- run: ameba
================================================
FILE: .github/workflows/llvm.yml
================================================
name: LLVM CI
on:
push:
paths:
- 'src/compiler/crystal/codegen/**'
- 'src/llvm/**'
- 'spec/std/llvm/**'
- 'spec/llvm-ir/**'
- 'spec/compiler/codegen/**'
- '.github/workflows/llvm.yml'
pull_request:
paths:
- 'src/compiler/crystal/codegen/**'
- 'src/llvm/**'
- 'spec/std/llvm/**'
- 'spec/llvm-ir/**'
- 'spec/compiler/codegen/**'
- '.github/workflows/llvm.yml'
schedule:
- cron: '0 3 * * *'
workflow_dispatch:
permissions: {}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
env:
SPEC_SPLIT_DOTS: 160
jobs:
llvm_test:
runs-on: ${{ matrix.runs-on }}
strategy:
fail-fast: false
matrix:
include:
- {llvm_version: 13, runs-on: ubuntu-22.04, codename: jammy}
- {llvm_version: 14, runs-on: ubuntu-22.04, codename: jammy}
- {llvm_version: 15, runs-on: ubuntu-22.04, codename: jammy}
- {llvm_version: 16, runs-on: ubuntu-22.04, codename: jammy}
- {llvm_version: 17, runs-on: ubuntu-24.04, codename: noble}
- {llvm_version: 18, runs-on: ubuntu-24.04, codename: noble}
- {llvm_version: 19, runs-on: ubuntu-24.04, codename: noble}
- {llvm_version: 20, runs-on: ubuntu-24.04, codename: noble}
- {llvm_version: 21, runs-on: ubuntu-24.04, codename: noble}
- {llvm_version: 22, runs-on: ubuntu-24.04, codename: noble}
- {runs-on: ubuntu-24.04, codename: noble}
name: "LLVM ${{ matrix.llvm_version || 'Nightly' }}"
steps:
- name: Checkout Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Install LLVM ${{ matrix.llvm_version || 'Nightly' }}
run: |
sudo apt remove 'llvm-*' 'libllvm*'
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
sudo apt-add-repository -y \
deb \
http://apt.llvm.org/${{ matrix.codename }}/ \
llvm-toolchain-${{ matrix.codename }}${{ matrix.llvm_version && format('-{0}', matrix.llvm_version) || '' }} \
main
sudo apt install -y llvm${{ matrix.llvm_version && format('-{0}', matrix.llvm_version) || '' }}-dev lld
- name: Install Crystal
uses: crystal-lang/install-crystal@v1
with:
crystal: "1.19.1"
- name: Build libllvm_ext
run: make -B deps
- name: Test compiler_spec
run: make compiler_spec junit_output=.junit/compiler_spec.xml
- name: Integration test
run: make crystal std_spec threads=1 junit_output=.junit/std_spec.xml
================================================
FILE: .github/workflows/macos.yml
================================================
name: macOS CI
on: [push, pull_request]
permissions: {}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
env:
SPEC_SPLIT_DOTS: 160
CI_NIX_SHELL: true
jobs:
darwin-test:
runs-on: ${{ matrix.runs-on }}
name: "${{ matrix.runs-on }} (${{ matrix.arch }})"
strategy:
fail-fast: false
matrix:
include:
- runs-on: macos-15-intel
arch: x86_64-darwin
- runs-on: macos-14
arch: aarch64-darwin
- runs-on: macos-15
arch: aarch64-darwin
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- uses: cachix/install-nix-action@1ca7d21a94afc7c957383a2d217460d980de4934 # v31
with:
extra_nix_config: |
experimental-features = nix-command
- uses: cachix/cachix-action@3ba601ff5bbb07c7220846facfa2cd81eeee15a1 # v16
with:
name: crystal-ci
signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
- name: Prepare System
run: bin/ci prepare_system
- name: Prepare Build
run: bin/ci prepare_build
- name: Test
run: bin/ci build
- name: Test interpreter
run: bin/ci with_build_env 'make interpreter_spec'
test-std:
runs-on: macos-15
strategy:
fail-fast: false
matrix:
opts:
- flags: "-Dexecution_context -Dpreview_mt" # execution_context: concurrent
workers: 1
- flags: "-Dexecution_context -Dpreview_mt" # execution_context: parallel
workers: 4
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- uses: cachix/install-nix-action@1ca7d21a94afc7c957383a2d217460d980de4934 # v31
with:
extra_nix_config: |
experimental-features = nix-command
- uses: cachix/cachix-action@3ba601ff5bbb07c7220846facfa2cd81eeee15a1 # v16
with:
name: crystal-ci
signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
- name: Prepare System
run: bin/ci prepare_system
- name: Prepare Build
run: bin/ci prepare_build
- name: Test
run: bin/ci with_build_env 'CRYSTAL_WORKERS=${{ matrix.opts.workers || 1 }} make std_spec threads=1 FLAGS="${{ matrix.opts.flags }}"'
================================================
FILE: .github/workflows/mingw-w64-steps.yml
================================================
name: MinGW-w64 CI / Build
on:
workflow_call:
inputs:
arch:
required: true
type: string
runs-on:
required: true
type: string
msystem:
required: true
type: string
mingw-package-prefix:
required: true
type: string
permissions: {}
jobs:
build:
runs-on: ${{ inputs.runs-on }}
steps:
- name: Setup MSYS2
id: msys2
uses: msys2/setup-msys2@4f806de0a5a7294ffabaff804b38a9b435a73bda # v2.30.0
with:
msystem: ${{ inputs.msystem }}
update: true
install: >-
git
make
${{ inputs.mingw-package-prefix }}-pkgconf
${{ inputs.mingw-package-prefix }}-llvm
${{ inputs.mingw-package-prefix }}-crystal
- name: Disable CRLF line ending substitution
run: |
git config --global core.autocrlf false
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Build Crystal
shell: msys2 {0}
run: make crystal interpreter=1 release=1
- name: Package Crystal
shell: msys2 {0}
run: make install install_dlls deref_symlinks=1 PREFIX="$(pwd)/crystal"
- name: Download shards release
uses: actions/checkout@v6
with:
repository: crystal-lang/shards
ref: v0.20.0
path: shards
persist-credentials: false
- name: Build shards release
shell: msys2 {0}
working-directory: ./shards
run: make CRYSTAL=$(pwd)/../crystal/bin/crystal SHARDS=false release=1
- name: Package Shards
shell: msys2 {0}
working-directory: ./shards
run: |
make install PREFIX="$(pwd)/../crystal" SHARDS=false
# FIXME: remove after crystal-lang/shards#668
ldd bin/shards.exe | grep -iv ' => /c/windows/system32' | sed 's/.* => //; s/ (.*//' | xargs -t -i /usr/bin/install -m 0755 '{}' "$(pwd)/../crystal/bin/"
- name: Upload Crystal executable
uses: actions/upload-artifact@v7
with:
name: ${{ inputs.arch }}-mingw-w64-crystal
path: crystal
test-stdlib:
runs-on: ${{ inputs.runs-on }}
steps:
- name: Setup MSYS2
id: msys2
uses: msys2/setup-msys2@4f806de0a5a7294ffabaff804b38a9b435a73bda # v2.30.0
with:
msystem: ${{ inputs.msystem }}
update: true
install: >-
git
make
${{ inputs.mingw-package-prefix }}-pkgconf
${{ inputs.mingw-package-prefix }}-llvm
${{ inputs.mingw-package-prefix }}-crystal
- name: Disable CRLF line ending substitution
run: |
git config --global core.autocrlf false
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Run stdlib specs
shell: msys2 {0}
run: |
export CRYSTAL_SPEC_COMPILER_BIN="$(which crystal.exe)"
make std_spec
test-compiler:
runs-on: ${{ inputs.runs-on }}
needs: [build]
steps:
- name: Setup MSYS2
id: msys2
uses: msys2/setup-msys2@4f806de0a5a7294ffabaff804b38a9b435a73bda # v2.30.0
with:
msystem: ${{ inputs.msystem }}
update: true
install: >-
git
make
${{ inputs.mingw-package-prefix }}-pkgconf
${{ inputs.mingw-package-prefix }}-llvm
${{ inputs.mingw-package-prefix }}-crystal
- name: Disable CRLF line ending substitution
run: |
git config --global core.autocrlf false
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Download Crystal executable
uses: actions/download-artifact@v8
with:
name: ${{ inputs.arch }}-mingw-w64-crystal
path: crystal
- name: Copy compiler build into place
run: mkdir .build/ && cp crystal/bin/crystal.exe .build/
- name: Run compiler specs
shell: msys2 {0}
run: |
export CRYSTAL_SPEC_COMPILER_BIN="$(which crystal.exe)"
make compiler_spec
- name: Run interpreter specs
shell: msys2 {0}
run: |
export CRYSTAL_SPEC_COMPILER_BIN="$(which crystal.exe)"
make interpreter_spec
- name: Run primitives specs
shell: msys2 {0}
run: |
export CRYSTAL_SPEC_COMPILER_BIN="$(which crystal.exe)"
make -o .build/crystal.exe primitives_spec # we know the compiler is fresh; do not rebuild it here
env:
SPEC_FLAGS: --tag=~external_commands # skip exec_external_command spec because it doesn't work with this setup
================================================
FILE: .github/workflows/mingw-w64.yml
================================================
name: MinGW-w64 CI
on: [push, pull_request]
permissions: {}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
env:
SPEC_SPLIT_DOTS: 160
jobs:
x86_64-mingw-w64:
name: UCRT64
uses: ./.github/workflows/mingw-w64-steps.yml
with:
arch: x86_64
runs-on: windows-2025
msystem: UCRT64
mingw-package-prefix: mingw-w64-ucrt-x86_64
aarch64-mingw-w64:
name: CLANGARM64
uses: ./.github/workflows/mingw-w64-steps.yml
with:
arch: aarch64
runs-on: windows-11-arm
msystem: CLANGARM64
mingw-package-prefix: mingw-w64-clang-aarch64
================================================
FILE: .github/workflows/openssl.yml
================================================
name: OpenSSL CI
on:
push:
paths:
- 'src/openssl/**'
- 'spec/std/digest/**'
- 'spec/std/openssl/**'
- '.github/workflows/openssl.yml'
pull_request:
paths:
- 'src/openssl/**'
- 'spec/std/digest/**'
- 'spec/std/openssl/**'
- '.github/workflows/openssl.yml'
schedule:
- cron: '0 3 * * *'
workflow_dispatch:
permissions: {}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
jobs:
libssl_test:
runs-on: ubuntu-latest
name: "${{ matrix.pkg }}"
container: crystallang/crystal:1.19.1-alpine
strategy:
fail-fast: false
matrix:
include:
- pkg: "openssl1.1-compat-dev=~1.1.1"
repository: http://dl-cdn.alpinelinux.org/alpine/v3.18/community
- pkg: "openssl-dev=~3.0"
repository: http://dl-cdn.alpinelinux.org/alpine/v3.17/main
- pkg: "openssl-dev=~3.3"
repository: http://dl-cdn.alpinelinux.org/alpine/v3.20/main
- pkg: "openssl-dev"
repository: http://dl-cdn.alpinelinux.org/alpine/edge/main
- pkg: "libressl-dev=~3.4"
repository: http://dl-cdn.alpinelinux.org/alpine/v3.15/community
- pkg: "libressl-dev=~3.5"
repository: http://dl-cdn.alpinelinux.org/alpine/v3.16/community
- pkg: "libressl-dev=~3.8"
repository: http://dl-cdn.alpinelinux.org/alpine/v3.20/community
- pkg: "libressl-dev"
repository: http://dl-cdn.alpinelinux.org/alpine/edge/community
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Uninstall openssl and conflicts
run: apk del openssl-dev openssl-libs-static libxml2-static
- name: Install ${{ matrix.pkg }}
run: apk add "${{ matrix.pkg }}" --repository=${{ matrix.repository }}
- name: Print LibSSL version
run: bin/crystal eval 'require "openssl"; p! LibSSL::OPENSSL_VERSION, LibSSL::LIBRESSL_VERSION'
- name: Run OpenSSL specs
run: bin/crystal spec --order=random spec/std/openssl/
================================================
FILE: .github/workflows/regex-engine.yml
================================================
name: Regex Engine CI
on:
push:
paths:
- 'src/regex.cr'
- 'src/regex/**'
- 'spec/std/regex_spec.cr'
- 'spec/std/regex/**'
- '.github/workflows/regex-engine.yml'
pull_request:
paths:
- 'src/regex.cr'
- 'src/regex/**'
- 'spec/std/regex_spec.cr'
- 'spec/std/regex/**'
- '.github/workflows/regex-engine.yml'
schedule:
- cron: '0 3 * * *'
workflow_dispatch:
permissions: {}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
jobs:
pcre:
runs-on: ubuntu-latest
name: "PCRE"
container: crystallang/crystal:1.19.1-alpine
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Remove PCRE2
run: apk del pcre2-dev
- name: Assert using PCRE
run: bin/crystal eval 'abort unless Regex::Engine == Regex::PCRE'
- name: Show PCRE config
run: bin/crystal scripts/print_regex_config.cr
- name: Run Regex specs
run: bin/crystal spec --order=random spec/std/regex*
pcre2:
runs-on: ubuntu-latest
name: "PCRE2"
container: crystallang/crystal:1.19.1-alpine
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Assert using PCRE2
run: bin/crystal eval 'abort unless Regex::Engine == Regex::PCRE2'
- name: Assert select PCRE
run: bin/crystal eval -Duse_pcre 'abort unless Regex::Engine == Regex::PCRE'
- name: Show PCRE2 config
run: bin/crystal scripts/print_regex_config.cr
- name: Run Regex specs
run: bin/crystal spec --order=random spec/std/regex*
================================================
FILE: .github/workflows/smoke.yml
================================================
# These jobs are smoke tests for platforms where we don't run full tests.
# They ensure that std_spec, compiler_spec and the compiler itself at least
# compile for the target with --cross-compile. But the binaries are not linked
# and executed. So this does not validate correct behaviour.
#
# The list of supported platforms is extracted from the lib_c bindings:
#
# ```terminal-session
# $ find src/lib_c -maxdepth 1 -mindepth 1 -type d -printf '%P\n' | sort
# aarch64-android
# aarch64-darwin
# aarch64-linux-gnu
# aarch64-linux-musl
# arm-linux-gnueabihf
# i386-linux-gnu
# i386-linux-musl
# wasm32-wasi
# x86_64-darwin
# x86_64-dragonfly
# x86_64-freebsd
# x86_64-linux-gnu
# x86_64-linux-musl
# x86_64-netbsd
# x86_64-openbsd
# x86_64-solaris
# x86_64-windows-msvc
# ```
#
# Platforms for which we currently run full tests are excluded from this workflow.
name: Smoke tests
on:
push:
paths:
- 'src/lib_c/**'
- 'src/crystal/system/**'
- '.github/workflows/smoke.yml'
pull_request:
paths:
- 'src/lib_c/**'
- 'src/crystal/system/**'
- '.github/workflows/smoke.yml'
schedule:
- cron: '0 3 * * *'
workflow_dispatch:
permissions: {}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
env:
TRAVIS_OS_NAME: linux
ARCH: x86_64
ARCH_CMD: linux64
jobs:
smoke-test:
name: ${{ matrix.target }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
max-parallel: 2
matrix:
target:
- aarch64-linux-android
- arm-linux-gnueabihf
- i386-linux-gnu
- i386-linux-musl
- x86_64-dragonfly
- x86_64-freebsd
- x86_64-netbsd
- x86_64-openbsd
- x86_64-solaris
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Build fresh compiler
run: bin/ci with_build_env make
- name: Run smoke test
run: bin/ci with_build_env make simple_smoke_test target=${{ matrix.target }}
================================================
FILE: .github/workflows/update-devenv.yml
================================================
name: Update devenv
on:
schedule:
- cron: "0 3 * * 2" # Weekly on Tuesdays
push:
branches:
- master
paths:
- '.github/workflows/update-devenv.yml'
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
update-devenv:
if: github.repository == 'crystal-lang/crystal'
runs-on: ubuntu-latest
steps:
- name: Download source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
ref: master
persist-credentials: false
- uses: cachix/install-nix-action@1ca7d21a94afc7c957383a2d217460d980de4934 # v31
- uses: cachix/cachix-action@3ba601ff5bbb07c7220846facfa2cd81eeee15a1 # v16
with:
name: devenv
- name: Install devenv.sh
run: nix profile add nixpkgs#devenv
- name: Update devenv.lock
run: devenv update
- name: Check for changes
id: changes
run: |
git add devenv.lock
if git diff --cached --quiet; then
echo "changed=false" >>"$GITHUB_OUTPUT"
else
echo "changed=true" >>"$GITHUB_OUTPUT"
fi
- name: Create PR
if: steps.changes.outputs.changed == 'true'
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8
with:
commit-message: "Update `devenv.lock`"
title: "Update `devenv.lock`"
body: ""
labels: "topic:infrastructure"
branch: infra/update-devenv
delete-branch: true
================================================
FILE: .github/workflows/wasm32.yml
================================================
name: WebAssembly CI
on: [push, pull_request]
permissions: {}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
env:
SPEC_SPLIT_DOTS: 160
jobs:
wasm32-test:
runs-on: ubuntu-24.04
container: crystallang/crystal:1.19.1-build
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Install wasmtime
uses: mwilliamson/setup-wasmtime-action@bf814d7d8fc3c3a77dfe114bd9fb8a2c575f6ad6 #v2
with:
wasmtime-version: "2.0.0"
- name: Install LLVM
run: |
apt-get update
apt-get remove -y 'llvm-*' 'libllvm*'
apt-get install -y curl software-properties-common
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
apt-add-repository -y deb http://apt.llvm.org/noble/ llvm-toolchain-noble-18 main
apt-get install -y llvm-18-dev lld-18
ln -s "$(which wasm-ld-18)" /usr/bin/wasm-ld
- name: Download wasm32 libs
run: |
mkdir wasm32-wasi-libs
curl -LO https://github.com/lbguilherme/wasm-libs/releases/download/0.0.3/wasm32-wasi-libs.tar.gz
echo "cd36f319f8f9f9cd08f723d10e6ec2b92f2e44d3ce3b20344b8041386d85c261 wasm32-wasi-libs.tar.gz" | sha256sum -c -
tar -f wasm32-wasi-libs.tar.gz -C wasm32-wasi-libs -xz
rm wasm32-wasi-libs.tar.gz
- name: Build spec/wasm32_std_spec.cr
run: bin/crystal build spec/wasm32_std_spec.cr -o wasm32_std_spec.wasm --target wasm32-wasi -Dwithout_iconv -Dwithout_openssl
env:
CRYSTAL_LIBRARY_PATH: ${{ github.workspace }}/wasm32-wasi-libs
- name: Run wasm32_std_spec.wasm
run: |
wasmtime run wasm32_std_spec.wasm
================================================
FILE: .github/workflows/win.yml
================================================
name: Windows CI
on: [push, pull_request, workflow_dispatch]
permissions: {}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
env:
SPEC_SPLIT_DOTS: 160
CI_LLVM_VERSION: "20.1.7"
CI_LLVM_TARGETS: "X86,AArch64"
CI_LLVM_LDFLAGS: "psapi.lib shell32.lib ole32.lib uuid.lib advapi32.lib ws2_32.lib ntdll.lib"
jobs:
x86_64-windows-libs:
runs-on: windows-2025
steps:
- name: Disable CRLF line ending substitution
run: |
git config --global core.autocrlf false
- name: Enable Developer Command Prompt
uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Cache libraries
id: cache-libs
uses: actions/cache@v5
with:
path: | # openssl and llvm take much longer to build so they are cached separately
libs/pcre.lib
libs/pcre2-8.lib
libs/iconv.lib
libs/gc.lib
libs/ffi.lib
libs/z.lib
libs/mpir.lib
libs/yaml.lib
libs/xml2.lib
libs/libxml_VERSION
key: win-libs-${{ hashFiles('.github/workflows/win.yml', 'etc/win-ci/*.ps1') }}-msvc
- name: Set up Cygwin
if: steps.cache-libs.outputs.cache-hit != 'true'
uses: cygwin/cygwin-install-action@711d29f3da23c9f4a1798e369a6f01198c13b11a # v6
with:
packages: make
install-dir: C:\cygwin64
add-to-path: false
- name: Build libgc
if: steps.cache-libs.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-gc.ps1 -BuildTree deps\gc -Version 8.2.8 -AtomicOpsVersion 7.8.2
- name: Build libpcre
if: steps.cache-libs.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-pcre.ps1 -BuildTree deps\pcre -Version 8.45
- name: Build libpcre2
if: steps.cache-libs.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-pcre2.ps1 -BuildTree deps\pcre2 -Version 10.45
- name: Build libiconv
if: steps.cache-libs.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-iconv.ps1 -BuildTree deps\iconv -Version 1.18
- name: Build libffi
if: steps.cache-libs.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-ffi.ps1 -BuildTree deps\ffi -Version 3.5.1
- name: Build zlib
if: steps.cache-libs.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-z.ps1 -BuildTree deps\z -Version 1.3.1
- name: Build mpir
if: steps.cache-libs.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-mpir.ps1 -BuildTree deps\mpir
- name: Build libyaml
if: steps.cache-libs.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-yaml.ps1 -BuildTree deps\yaml -Version 0.2.5
- name: Build libxml2
if: steps.cache-libs.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-xml2.ps1 -BuildTree deps\xml2 -Version 2.13.8
- name: Cache OpenSSL
id: cache-openssl
uses: actions/cache@v5
with:
path: |
libs/crypto.lib
libs/ssl.lib
libs/openssl_VERSION
key: win-openssl-libs-3.4.1-${{ hashFiles('etc/win-ci/build-openssl.ps1') }}-msvc
- name: Set up NASM
if: steps.cache-openssl.outputs.cache-hit != 'true'
uses: ilammy/setup-nasm@72793074d3c8cdda771dba85f6deafe00623038b # v1.5.2
- name: Build OpenSSL
if: steps.cache-openssl.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-openssl.ps1 -BuildTree deps\openssl -Version 3.5.0
x86_64-windows-dlls:
runs-on: windows-2025
steps:
- name: Disable CRLF line ending substitution
run: |
git config --global core.autocrlf false
- name: Enable Developer Command Prompt
uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Cache libraries
id: cache-dlls
uses: actions/cache@v5
with:
path: | # openssl and llvm take much longer to build so they are cached separately
libs/pcre-dynamic.lib
libs/pcre2-8-dynamic.lib
libs/iconv-dynamic.lib
libs/gc-dynamic.lib
libs/ffi-dynamic.lib
libs/z-dynamic.lib
libs/mpir-dynamic.lib
libs/yaml-dynamic.lib
libs/xml2-dynamic.lib
dlls/pcre.dll
dlls/pcre2-8.dll
dlls/iconv-2.dll
dlls/gc.dll
dlls/libffi.dll
dlls/zlib1.dll
dlls/mpir.dll
dlls/yaml.dll
dlls/libxml2.dll
key: win-dlls-${{ hashFiles('.github/workflows/win.yml', 'etc/win-ci/*.ps1') }}-msvc
- name: Set up Cygwin
if: steps.cache-dlls.outputs.cache-hit != 'true'
uses: cygwin/cygwin-install-action@711d29f3da23c9f4a1798e369a6f01198c13b11a # v6
with:
packages: make
install-dir: C:\cygwin64
add-to-path: false
- name: Build libgc
if: steps.cache-dlls.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-gc.ps1 -BuildTree deps\gc -Version 8.2.8 -AtomicOpsVersion 7.8.2 -Dynamic
- name: Build libpcre
if: steps.cache-dlls.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-pcre.ps1 -BuildTree deps\pcre -Version 8.45 -Dynamic
- name: Build libpcre2
if: steps.cache-dlls.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-pcre2.ps1 -BuildTree deps\pcre2 -Version 10.45 -Dynamic
- name: Build libiconv
if: steps.cache-dlls.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-iconv.ps1 -BuildTree deps\iconv -Version 1.18 -Dynamic
- name: Build libffi
if: steps.cache-dlls.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-ffi.ps1 -BuildTree deps\ffi -Version 3.4.7 -Dynamic
- name: Build zlib
if: steps.cache-dlls.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-z.ps1 -BuildTree deps\z -Version 1.3.1 -Dynamic
- name: Build mpir
if: steps.cache-dlls.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-mpir.ps1 -BuildTree deps\mpir -Dynamic
- name: Build libyaml
if: steps.cache-dlls.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-yaml.ps1 -BuildTree deps\yaml -Version 0.2.5 -Dynamic
- name: Build libxml2
if: steps.cache-dlls.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-xml2.ps1 -BuildTree deps\xml2 -Version 2.13.6 -Dynamic
- name: Cache OpenSSL
id: cache-openssl-dlls
uses: actions/cache@v5
with:
path: |
libs/crypto-dynamic.lib
libs/ssl-dynamic.lib
dlls/libcrypto-3-x64.dll
dlls/libssl-3-x64.dll
key: win-openssl-dlls-3.4.1-${{ hashFiles('etc/win-ci/build-openssl.ps1') }}-msvc
- name: Set up NASM
if: steps.cache-openssl-dlls.outputs.cache-hit != 'true'
uses: ilammy/setup-nasm@72793074d3c8cdda771dba85f6deafe00623038b # v1.5.2
- name: Build OpenSSL
if: steps.cache-openssl-dlls.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-openssl.ps1 -BuildTree deps\openssl -Version 3.4.1 -Dynamic
x86_64-windows-llvm-dlls:
runs-on: windows-2025
steps:
- name: Disable CRLF line ending substitution
run: |
git config --global core.autocrlf false
- name: Enable Developer Command Prompt
uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Cache LLVM
id: cache-llvm-dlls
uses: actions/cache@v5
with:
path: |
libs/llvm_VERSION
libs/llvm-dynamic.lib
dlls/LLVM-C.dll
key: llvm-dlls-${{ env.CI_LLVM_VERSION }}-${{ hashFiles('etc/win-ci/build-llvm.ps1') }}-msvc
- name: Build LLVM
if: steps.cache-llvm-dlls.outputs.cache-hit != 'true'
run: .\etc\win-ci\build-llvm.ps1 -BuildTree deps\llvm -Version ${{ env.CI_LLVM_VERSION }} -TargetsToBuild ${{ env.CI_LLVM_TARGETS }} -Dynamic
x86_64-windows-release:
needs: [x86_64-windows-libs, x86_64-windows-dlls, x86_64-windows-llvm-dlls]
uses: ./.github/workflows/win_build_portable.yml
with:
release: true
llvm_version: "20.1.7"
llvm_targets: "X86,AArch64"
llvm_ldflags: "psapi.lib shell32.lib ole32.lib uuid.lib advapi32.lib ws2_32.lib ntdll.lib"
x86_64-windows-test:
runs-on: windows-2025
needs: [x86_64-windows-release]
steps:
- name: Disable CRLF line ending substitution
run: |
git config --global core.autocrlf false
- name: Enable Developer Command Prompt
uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Download Crystal executable
uses: actions/download-artifact@v8
with:
name: crystal
path: build
- name: Set up environment
run: |
Add-Content $env:GITHUB_PATH "$(pwd)\build"
Add-Content $env:GITHUB_ENV "CRYSTAL_SPEC_COMPILER_BIN=$(pwd)\build\crystal.exe"
Add-Content $env:GITHUB_ENV "LLVM_VERSION=${{ env.CI_LLVM_VERSION }}"
Add-Content $env:GITHUB_ENV "LLVM_TARGETS=${{ env.CI_LLVM_TARGETS }}"
Add-Content $env:GITHUB_ENV "LLVM_LDFLAGS=${{ env.CI_LLVM_LDFLAGS }}"
- name: Run stdlib specs
run: make -f Makefile.win std_spec
- name: Run compiler specs
run: make -f Makefile.win compiler_spec
- name: Run interpreter specs
run: make -f Makefile.win interpreter_spec
- name: Run primitives specs
run: make -f Makefile.win -o .build\crystal.exe primitives_spec # we know the compiler is fresh; do not rebuild it here
- name: Build samples
run: make -f Makefile.win samples
test-std:
runs-on: windows-2025
needs: [x86_64-windows-release]
strategy:
fail-fast: false
matrix:
opts:
- flags: "-Dexecution_context -Dpreview_mt" # execution_context: concurrent
workers: 1
- flags: "-Dexecution_context -Dpreview_mt" # execution_context: parallel
workers: 4
steps:
- name: Disable CRLF line ending substitution
run: git config --global core.autocrlf false
- name: Enable Developer Command Prompt
uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Download Crystal executable
uses: actions/download-artifact@v8
with:
name: crystal
path: build
- name: Set up environment
run: |
Add-Content $env:GITHUB_PATH "$(pwd)\build"
Add-Content $env:GITHUB_ENV "CRYSTAL_SPEC_COMPILER_BIN=$(pwd)\build\crystal.exe"
Add-Content $env:GITHUB_ENV "LLVM_VERSION=${{ env.CI_LLVM_VERSION }}"
Add-Content $env:GITHUB_ENV "LLVM_TARGETS=${{ env.CI_LLVM_TARGETS }}"
Add-Content $env:GITHUB_ENV "LLVM_LDFLAGS=${{ env.CI_LLVM_LDFLAGS }}"
- name: Test
run: make -f Makefile.win std_spec FLAGS="${{ matrix.opts.flags }}"
env:
CRYSTAL_WORKERS: ${{ matrix.opts.workers || 1 }}
x86_64-windows-test-interpreter:
runs-on: windows-2025
needs: [x86_64-windows-release]
steps:
- name: Disable CRLF line ending substitution
run: |
git config --global core.autocrlf false
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Download Crystal executable
uses: actions/download-artifact@v8
with:
name: crystal
path: build
- name: Set up environment
run: |
Add-Content $env:GITHUB_PATH "$(pwd)\build"
Add-Content $env:GITHUB_ENV "CRYSTAL_SPEC_COMPILER_BIN=$(pwd)\build\crystal.exe"
Add-Content $env:GITHUB_ENV "LLVM_VERSION=${{ env.CI_LLVM_VERSION }}"
Add-Content $env:GITHUB_ENV "LLVM_TARGETS=${{ env.CI_LLVM_TARGETS }}"
Add-Content $env:GITHUB_ENV "LLVM_LDFLAGS=${{ env.CI_LLVM_LDFLAGS }}"
- name: Run stdlib specs with interpreter
run: bin\crystal i spec\std_spec.cr
- name: Run primitives specs with interpreter
run: bin\crystal i spec\primitives_spec.cr
x86_64-windows-installer:
if: github.repository_owner == 'crystal-lang' && (startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/heads/ci/'))
runs-on: windows-2025
needs: [x86_64-windows-release]
steps:
- name: Disable CRLF line ending substitution
run: |
git config --global core.autocrlf false
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Download Crystal executable
uses: actions/download-artifact@v8
with:
name: crystal
path: etc/win-ci/portable
- name: Set up Inno Setup
run: |
Invoke-WebRequest -Uri https://jrsoftware.org/download.php/is.exe -OutFile C:\is.exe
C:\is.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART
- name: Set up environment
run: |
Add-Content $env:GITHUB_PATH "$(pwd)\etc\win-ci\portable"
Add-Content $env:GITHUB_ENV "LLVM_VERSION=${{ env.CI_LLVM_VERSION }}"
Add-Content $env:GITHUB_ENV "LLVM_TARGETS=${{ env.CI_LLVM_TARGETS }}"
Add-Content $env:GITHUB_ENV "LLVM_LDFLAGS=${{ env.CI_LLVM_LDFLAGS }}"
- name: Build docs
run: make -f Makefile.win install_docs prefix=etc\win-ci\portable
- name: Build installer
working-directory: ./etc/win-ci
run: |
& "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" crystal.iss
- name: Upload Crystal installer
uses: actions/upload-artifact@v7
with:
name: crystal-installer
path: etc/win-ci/Output/crystal-setup.exe
================================================
FILE: .github/workflows/win_build_portable.yml
================================================
name: Windows CI / Build Portable Package
on:
workflow_call:
inputs:
release:
required: true
type: boolean
llvm_version:
required: true
type: string
llvm_targets:
required: true
type: string
llvm_ldflags:
required: true
type: string
permissions: {}
jobs:
build:
runs-on: windows-2025
steps:
- name: Disable CRLF line ending substitution
run: |
git config --global core.autocrlf false
- name: Enable Developer Command Prompt
uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
- name: Install Crystal
uses: crystal-lang/install-crystal@v1
id: install-crystal
with:
crystal: "1.19.1"
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Restore libraries
uses: actions/cache/restore@v5
with:
path: |
libs/pcre.lib
libs/pcre2-8.lib
libs/iconv.lib
libs/gc.lib
libs/ffi.lib
libs/z.lib
libs/mpir.lib
libs/yaml.lib
libs/xml2.lib
libs/libxml_VERSION
key: win-libs-${{ hashFiles('.github/workflows/win.yml', 'etc/win-ci/*.ps1') }}-msvc
fail-on-cache-miss: true
- name: Restore OpenSSL
uses: actions/cache/restore@v5
with:
path: |
libs/crypto.lib
libs/ssl.lib
libs/openssl_VERSION
key: win-openssl-libs-3.4.1-${{ hashFiles('etc/win-ci/build-openssl.ps1') }}-msvc
fail-on-cache-miss: true
- name: Restore DLLs
uses: actions/cache/restore@v5
with:
path: |
libs/pcre-dynamic.lib
libs/pcre2-8-dynamic.lib
libs/iconv-dynamic.lib
libs/gc-dynamic.lib
libs/ffi-dynamic.lib
libs/z-dynamic.lib
libs/mpir-dynamic.lib
libs/yaml-dynamic.lib
libs/xml2-dynamic.lib
dlls/pcre.dll
dlls/pcre2-8.dll
dlls/iconv-2.dll
dlls/gc.dll
dlls/libffi.dll
dlls/zlib1.dll
dlls/mpir.dll
dlls/yaml.dll
dlls/libxml2.dll
key: win-dlls-${{ hashFiles('.github/workflows/win.yml', 'etc/win-ci/*.ps1') }}-msvc
fail-on-cache-miss: true
- name: Restore OpenSSL DLLs
uses: actions/cache/restore@v5
with:
path: |
libs/crypto-dynamic.lib
libs/ssl-dynamic.lib
dlls/libcrypto-3-x64.dll
dlls/libssl-3-x64.dll
key: win-openssl-dlls-3.4.1-${{ hashFiles('etc/win-ci/build-openssl.ps1') }}-msvc
fail-on-cache-miss: true
- name: Restore LLVM DLLs
uses: actions/cache/restore@v5
with:
path: |
libs/llvm_VERSION
libs/llvm-dynamic.lib
dlls/LLVM-C.dll
key: llvm-dlls-${{ inputs.llvm_version }}-${{ hashFiles('etc/win-ci/build-llvm.ps1') }}-msvc
fail-on-cache-miss: true
- name: Set up environment
run: |
Add-Content $env:GITHUB_ENV "CRYSTAL_LIBRARY_PATH=$(pwd)\libs"
Add-Content $env:GITHUB_ENV "LLVM_VERSION=$env:INPUTS_LLVM_VERSION"
Add-Content $env:GITHUB_ENV "LLVM_TARGETS=$env:INPUTS_LLVM_TARGETS"
Add-Content $env:GITHUB_ENV "LLVM_LDFLAGS=$env:INPUTS_LLVM_LDFLAGS"
env:
INPUTS_LLVM_VERSION: ${{ inputs.llvm_version }}
INPUTS_LLVM_TARGETS: ${{ inputs.llvm_targets }}
INPUTS_LLVM_LDFLAGS: ${{ inputs.llvm_ldflags }}
- name: Build LLVM extensions
run: make -f Makefile.win deps
- name: Build Crystal
run: |
bin/crystal.bat env
make -f Makefile.win -B ${{ inputs.release && 'release=1' || '' }} interpreter=1
- name: Download shards release
uses: actions/checkout@v6
with:
repository: crystal-lang/shards
ref: v0.20.0
path: shards
persist-credentials: false
- name: Build shards release
working-directory: ./shards
run: make -f Makefile.win ${{ inputs.release && 'release=1' || '' }}
- name: Gather Crystal binaries
run: |
make -f Makefile.win install prefix=crystal
mkdir crystal/lib
cp shards/bin/shards.exe crystal/
cp shards/bin/shards.pdb crystal/
cp libs/* crystal/lib/
cp dlls/* crystal/
cp README.md crystal/
- name: Upload Crystal binaries
uses: actions/upload-artifact@v7
with:
name: crystal
path: crystal
================================================
FILE: .github/workflows/xml.yml
================================================
name: XML CI
on:
push:
paths:
- 'spec/std/xml/**'
- 'src/xml/**'
- '.github/workflows/xml.yml'
pull_request:
paths:
- 'spec/std/xml/**'
- 'src/xml/**'
- '.github/workflows/xml.yml'
schedule:
- cron: '0 3 * * *'
workflow_dispatch:
permissions: {}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
jobs:
libssl_test:
runs-on: ubuntu-latest
name: "${{ matrix.pkg }}"
container: crystallang/crystal:1.19.1-alpine
strategy:
fail-fast: false
matrix:
include:
- pkg: "libxml2-dev=~2.9"
repository: http://dl-cdn.alpinelinux.org/alpine/v3.16/main
- pkg: "libxml2-dev=~2.12"
repository: http://dl-cdn.alpinelinux.org/alpine/v3.20/main
- pkg: "libxml2-dev=~2.13"
repository: http://dl-cdn.alpinelinux.org/alpine/v3.22/main
- pkg: "libxml2-dev"
repository: http://dl-cdn.alpinelinux.org/alpine/edge/main
steps:
- name: Download Crystal source
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Uninstall libxml2 and conflicts
run: apk del libxml2-dev
- name: Install ${{ matrix.pkg }}
run: apk add "${{ matrix.pkg }}" --repository=${{ matrix.repository }}
- name: Print LibXML2 version
run: bin/crystal eval 'require "xml"; p! XML.libxml2_version'
- name: Run XML specs
run: bin/crystal spec --order=random spec/std/xml/
================================================
FILE: .github/zizmor.yml
================================================
rules:
dangerous-triggers:
ignore:
- backport.yml
unpinned-uses:
config:
policies:
actions/*: ref-pin
crystal-lang/*: ref-pin
================================================
FILE: .gitignore
================================================
# Environment configuration
/Makefile.local
/Makefile.win.local
.env
.env.*
.envrc
.envrc.*
# Build artifacts
*.o
*.ll
*.s
*.obj
*.dwo
*.dwarf
*.pdb
*.exe
/.build/
/samples/.build/
/docs/
/man/*.gz
# CI
/coverage/
/tmp/
/.junit/
# Devenv
.devenv*
devenv.local.nix
devenv.local.yaml
# direnv
.direnv
# pre-commit
.pre-commit-config.yaml
================================================
FILE: .mailmap
================================================
Ary Borenszweig <asterite@gmail.com> <aborenszweig@manas.com.ar>
Ary Borenszweig <asterite@gmail.com> <ary@esperanto.org.ar>
Ary Borenszweig <asterite@gmail.com> <asterite@gmail.com>
Brian J. Cardiff <bcardiff@gmail.com> <bcardiff@manas.com.ar>
Brian J. Cardiff <bcardiff@gmail.com> <bcardiff@manas.tech>
George Dietrich <dev@dietrich.pub> <yomoejoe@gmail.com>
George Dietrich <dev@dietrich.pub> <george@dietrich.app>
Gustavo Giráldez <ggiraldez@manas.tech> <ggiraldez@manas.com.ar>
Johannes Müller <straightshoota@gmail.com> <johannes.mueller@smj-fulda.org>
Juan Wajnerman <juan.wajnerman@gmail.com> <jwajnerman@manas.com.ar>
Juan Wajnerman <juan.wajnerman@gmail.com> <waj@manas.com.ar>
Juan Wajnerman <juan.wajnerman@gmail.com> <waj@manas.tech>
Julien Reichardt <git@jrei.ch> <mi@jrei.ch>
Martin Verzilli <mverzilli@manas.tech> <mverzilli@manas.com.ar>
Matías García Isaía <mgarcia@manas.tech> <mgarcia@manas.com.ar>
Matías García Isaía <mgarcia@manas.tech> <mgarcia@manas.tech>
Stephanie Hobbs <steph@rx14.co.uk> <chris@rx14.co.uk>
================================================
FILE: .markdownlint.yaml
================================================
default: true
heading-style: "setext"
no-inline-html: false
line-length: false
ol-prefix:
style: "ordered"
ul-style:
style: "dash"
ul-indent:
indent: 2
no-blanks-blockquote: false
emphasis-style:
style: "underscore"
strong-style:
style: "asterisk"
no-duplicate-heading:
siblings_only: true
no-bare-urls: false
fenced-code-language: false
commands-show-output: false
first-line-h1:
front_matter_title: "^\\s*(page_)?title\\s*[:=]"
exclude:
.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
no-alt-text: false
hard_tab:
code_blocks: false
================================================
FILE: .markdownlintignore
================================================
/lib/
================================================
FILE: .well-known/funding-manifest-urls
================================================
https://crystal-lang.org/funding.json
================================================
FILE: Brewfile
================================================
brew "gmp"
brew "libevent"
brew "pcre"
brew "pkg-config"
brew "openssl@1.1"
brew "llvm@11", link: true, conflicts_with: ["python@2"]
================================================
FILE: CHANGELOG.md
================================================
# Changelog
For information on prior releases, refer to the changelogs in [./doc/changelogs](./doc/changelogs/README.md)
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery and unwelcome sexual attention or
advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic
address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project maintainers in private or by sending an email to [crystal@manas.tech](mailto:crystal@manas.tech). All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Crystal
So you've decided to contribute to Crystal. Excellent!
## Using the issue tracker
The [issue tracker](https://github.com/crystal-lang/crystal/issues) is the heart of Crystal's work. Use it for bugs, questions, proposals and feature requests.
Please always **open a new issue before sending a pull request** if you want to add a new feature to Crystal, unless it is a minor fix, and wait until someone from the core team approves it before you actually start working on it. Otherwise, you risk having the pull request rejected, and the effort implementing it goes to waste. And if you start working on an implementation for an issue, please **let everyone know in the comments** so someone else does not start working on the same thing.
Regardless of the kind of issue, please make sure to look for similar existing issues before posting; otherwise, your issue may be flagged as `duplicated` and closed in favour of the original one. Also, once you open a new issue, please make sure to honour the items listed in the issue template.
If you open a question, remember to close the issue once you are satisfied with the answer and you think
there's no more room for discussion. We'll anyway close the issue after some days.
If something is missing from the language it might be that it's not yet implemented or that it was purposely left out. If in doubt, just ask.
Substantial changes go through an [RFC process](https://github.com/crystal-lang/rfcs).
The best place to start an open discussion about potential changes is the [Crystal forum](https://forum.crystal-lang.org/c/crystal-contrib/6).
### What's needed right now
You can find a list of tasks that we consider suitable for a first time contribution with
the [good first issue label](https://github.com/crystal-lang/crystal/contribute).
As you feel more confident, you can keep an eye out for open issues with the following labels:
- [`community:to-research`](https://github.com/crystal-lang/crystal/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Acommunity%3Ato-research): Help needed on **researching and investigating** the issue at hand; could be from going through an RFC to figure out how something _should_ be working, to go through details on a C-library we'd like to bind.
- [`community:to-design`](https://github.com/crystal-lang/crystal/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Acommunity%3Ato-design): As an issue has been accepted, we are looking for **ideas on how it could be implemented**, this is, a high-level design for the feature at hand.
- [`community:to-implement`](https://github.com/crystal-lang/crystal/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Acommunity%3Ato-implement): After a design has been agreed upon, the remaining task is to actually **code** it and send a PR!
- [`community:to-document`](https://github.com/crystal-lang/crystal/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Acommunity%3Ato-document): Similar to the one above, but this one is for those awesome devs that are happy to **contribute with documentation** instead of just code.
Furthermore, these are the most important general topics in need right now, so if you are interested open an issue to start working on it:
- Documenting the language
- Documenting the standard library
- Adding missing bits of the standard library, and/or improving its performance
### Labels
Issue tracker labels are sorted by category: community, kind, pr, status and topic.
#### Community
These are the issues where help from the community is most welcome. See above for a description on `newcomer`, `to-research`, `to-design`, `to-implement` and `to-document`.
Label `in-progress` is used to signal that someone from the community is already working on the issue (since GitHub does not allow for a non-team member to be _assigned_ to an issue).
The label `shard-idea` refers to a feature proposal that, albeit good, is better suited as a separate shard rather than as part of the core library; so if you are looking for a shard of your own to start working on, these issues are good starting points.
#### Kind
The most basic category is the kind of the issue: `bug`, `feature` and `question` speak for themselves, while `refactor` is left for changes that do not actually introduce a new a feature, and are not fixing something that is broken, but rather clean up the code (or documentation!).
#### PR
Pull-request only labels, used to signal that a pull request `needs-review` by a core team member, or that is still `wip` (work in progress).
#### Topic
Topic encompasses the broad aspect of the language that the issue refers to: could be performance, the compiler, the type system, the code formatter, concurrency, and quite a large etc.
#### Status
Status labels attempt to capture the lifecycle of an issue:
- A detailed proposal on a feature is marked as `draft`, while a more general argument is usually labelled as `discussion` until a consensus is achieved.
- An issue is `accepted` when it describes a feature or bugfix that a core team member has agreed to have added to the language, so as soon as a design is discussed (if needed), it's safe to start working on a pull request.
- Bug reports are marked as `needs-more-info`, where the author is requested to provide the info required; note that the issue may be closed after some time if it is not supplied.
- Issues that are batched in an epic to be worked on as a group are typically marked as `deferred`, while low-prio issues or tasks far away in the roadmap are marked as `someday`.
- Closed issues are marked as `implemented`, `invalid`, `duplicate` or `wontfix`, depending on their resolution.
## Contributing
### The documentation
The language reference is available at <https://crystal-lang.org/reference/>.
See the repository at [crystal-lang/crystal-book](https://github.com/crystal-lang/crystal-book) for contributing to it.
The [standard library documentation](https://crystal-lang.org/api/) is on the code itself, in this repository.
The [`master` version](https://crystal-lang.org/api/master/) is updated with every push to the master branch.
It uses a subset of [Markdown](http://daringfireball.net/projects/markdown/). You can [use Ruby as a source
of inspiration](https://twitter.com/yukihiro_matz/status/549317901002342400) whenever applicable. To generate
the docs execute `make docs`. Please follow the guidelines described in our
[language documentation](https://crystal-lang.org/reference/conventions/documenting_code.html), like the use of the third person.
Additionally, all official documentation can be found on [the Crystal website](https://crystal-lang.org/docs/).
### The standard library
1. [Fork](https://github.com/crystal-lang/crystal/fork) and checkout the
repository <https://github.com/crystal-lang/crystal/>
Once in the cloned directory, and once you [installed Crystal](https://crystal-lang.org/install/),
you can execute `bin/crystal` instead of `crystal`. This is a wrapper that will use the cloned repository
as the standard library. Otherwise the barebones `crystal` executable uses the standard library that comes in
your installation.
Next, make changes to the standard library, making sure you also provide corresponding specs. To run
the specs for the standard library, run `make std_spec`. To run a particular spec: `bin/crystal spec spec/std/array_spec.cr`.
You can use `make help` for a list of available make targets.
Note: at this point you might get long compile error that include "library not found for: ...". This means
you are [missing some libraries](https://github.com/crystal-lang/crystal/wiki/All-required-libraries).
Make sure that your changes follow the recommended [Coding Style](https://crystal-lang.org/reference/conventions/coding_style.html).
You can run `crystal tool format` to automate this.
Then push your changes and create a pull request.
### The compiler itself
If you want to add/change something in the compiler,
the first thing you will need to do is to [install the compiler](https://crystal-lang.org/install/).
Once you have a compiler up and running, check that executing `crystal` on the command line prints its usage.
Now you can setup your environment to compile Crystal itself, which is itself written in Crystal.
The compiler needs [LLVM](https://llvm.org) and some other libraries. See [list of all required libraries](https://github.com/crystal-lang/crystal/wiki/All-required-libraries).
Executing `make crystal` builds the compiler into `.build/compiler` and you can run it using the wrapper script at `bin/crystal`.
The script sets up the proper environment variables that the compiler can find the standard library source files in `src/`.
`make compiler_spec` runs the compiler specs. `make std_spec` runs the standard library specs.
`make primitives_spec` runs the specs for primitive methods with an up-to-date Crystal compiler.
You can use `make help` for a list of available make targets.
## This guide
If this guide is not clear and it needs improvements, please send pull requests against it. Thanks! :-)
## Making good pull requests
The commit history should consist of commits that transform the codebase from one state into another one, motivated by something that
should change, be it a bugfix, a new feature or some ground work to support a new feature, like changing an existing API or introducing
a new isolated class that is later used in the same pull request.
Review history should be preserved in a pull request. If you need to push a change to an open pull request (for example
because specs broke and required a fix, or for applying a review suggestion) these changes should be added as individual
fixup commits. Please do not amend previous commits and force push to the PR branch. This makes reviews much harder
because reference to previous state is hidden.
If changes introduced to `master` branch result in conflicts, it should be merged with a merge commit (`git fetch upstream/master; git merge upstream/master`).
### Minimum requirements
1. Describe reasons and result of the change in the pull request comment.
2. Do not force push to a pull request. The development history should be easily traceable.
3. Any change to a public API requires appropriate documentation: params (and particularly interesting combinations of them if the method is complex), results, interesting, self-contained examples.
4. Any change to behaviour needs to be reflected and validated with specs.
5. Any change affecting the compiler or performance-critical features in the standard library
should be checked with benchmarks how it affects performance.
### Reviews
Reviews are conducted by community members to validate a contribution and ensure quality standards are met.
Approvals from Core Team members are required for accepting a pull requests. Other community members are encouraged to do reviews as well. Leave suggestions for improvements or approve a change when it looks good to you.
1. Make sure the [formal minimum requirements](#minimum-requirements) are met, for the change itself and the PR. Cross check with the referenced issue(s).
2. Check if CI is successful. If not, try to figure out what's wrong and add a comment about it. If a failure seems unrelated, maintainers can try to rerun the job.
3. Leave inline comments when you want to request changes or ask for clarification. Suggestions are often understood as requirements, so make it clear if a proposal is optional or you're just asking for feedback.
### Accepting a Pull Request
The process of accepting a pull request entails the following check list:
1. At least two approvals by Core Team members; one approval if the author is a Core Team member. Only approvals based on the most recent code version count (ignoring minor changes like fixing a typo).
2. There are no outstanding questions nor requested changes in the pull request and associated issues.
3. Title and description appropriately represent the final state of the change.
4. Proper labels are applied (usually at least a `topic:` and `kind:` label).
5. Change is based on a fairly recent commit of the `master` branch. When in doubt, merge `master` and wait for CI.
6. CI is green.
When these conditions are met, a Core Team member can mark the pull request as accepted by adding it to the current development milestone.
This signals that the PR is scheduled to be merged soon and gives another chance for final reviews.
The current [development milestone](https://github.com/crystal-lang/crystal/milestones) is typically the milestone for the next release.
During the freeze period of a release, feature enhancements are added to the milestone of the next release.
Freeze periods are announced on the community forums and usually span two weeks before the scheduled date of a minor release.
### Merge Queue
The current [development milestone](https://github.com/crystal-lang/crystal/milestones) serves as a merge queue. Open pull requests on that milestone
are eligible for being merged.
Pending pull requests should usually stay in the queue for at least one full business day, allowing other reviewers to take a final look at it.
This wait time can be extended, for example for big changes or when there was a lot of recent activity in the discussion.
Urgent bug and regression fixes can skip the line.
If reasonable objection or questions arise while waiting for merge, the pull request must be removed from the milestone until they are resolved.
It's good practice to have a single maintainer responsible for operating the merge queue.
### Merging
Before merging, make sure the pull request has been on the merge queue for some time (usually 1+ business days) and there has not been any
more recent discussion that questions the current state of the change.
If conditions are met, the pull request can finally be merged. Use squash merge to not pollute the version history of the main branch with
details of the pull request process. For non-trivial changes, the merge commit should contain a short description.
### For maintainers with push access
1. Do not directly commit to the `master` branch. Always create a feature branch and pull request.
2. Feature branches should typically be created in your fork. The main repo should only contain essential branches.
- CI changes affecting circle CI only run for branches on the main repo. They should be prefixed `ci/` to trigger a maintenance release.
- Long-running feature branches that accept contributions must be pushed to the main repo in order to allow PRs targeting that branch.
## Git pre-commit hook
Code submitted to this repository should be formatted according to `crystal tool format`.
A pre-commit hook can be installed into the local git repo to ensure the formatter validates every commit: <https://github.com/crystal-lang/crystal/blob/master/scripts/git/pre-commit>
Install the pre-commit hook:
```sh
ln -s scripts/git/pre-commit .git/hooks
```
## Code of Conduct
Please note that this project is released with a [Contributor Code of Conduct][ccoc].
By participating in this project you agree to abide by its terms.
[ccoc]: https://github.com/crystal-lang/crystal/blob/master/CODE_OF_CONDUCT.md
================================================
FILE: 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.
----------------------------------------------------------------------------
Runtime Library Exception to the Apache 2.0 License:
As an exception, if you use this Software to compile your source code
and portions of this Software are embedded into the binary product as a
result, you may redistribute such product without providing attribution
as would otherwise be required by Sections 4(a), 4(b) and 4(d) of the
License.
================================================
FILE: LICENSES/Apache-2.0.txt
================================================
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.
================================================
FILE: LICENSES/MIT.txt
================================================
MIT License
Copyright (c) <year> <copyright holders>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: LICENSES/Swift-exception.txt
================================================
### Runtime Library Exception to the Apache 2.0 License: ###
As an exception, if you use this Software to compile your source code and
portions of this Software are embedded into the binary product as a result,
you may redistribute such product without providing attribution as would
otherwise be required by Sections 4(a), 4(b) and 4(d) of the License.
================================================
FILE: Makefile
================================================
all:
-include Makefile.local # for optional local options e.g. threads
# Recipes for this Makefile
## Build the compiler
## $ make
## Build the compiler with progress output
## $ make progress=1
## Clean up built files then build the compiler
## $ make clean crystal
## Build the compiler in release mode
## $ make crystal release=1 interpreter=1
## Run tests
## $ make test
## Run stdlib tests
## $ make std_spec
## Run compiler tests
## $ make compiler_spec
## Run generators (Unicode, SSL config, ...)
## $ make -B generate_data
CRYSTAL ?= crystal## which previous crystal compiler use
release ?= ## Compile in release mode
stats ?= ## Enable statistics output
progress ?= ## Enable progress output
threads ?= ## Maximum number of threads to use
debug ?= ## Add symbolic debug info
verbose ?= ## Run specs in verbose mode
junit_output ?= ## Path to output junit results
static ?= ## Enable static linking
target ?= ## Cross-compilation target
interpreter ?= ## Enable interpreter feature
check ?= ## Enable only check when running format
order ?=random ## Enable order for spec execution (values: "default" | "random" | seed number)
deref_symlinks ?= ## Dereference symbolic links for `make install`
docs_sanitizer ?= ## Enable sanitization for documentation generation
sequential_codegen ?=$(if $(filter 0,$(supports_preview_mt)),true,)## Enforce sequential codegen in compiler builds. Base compiler before Crystal 1.8 cannot build with `-Dpreview_mt -Dexecution_context`
O := .build
SOURCES := $(shell find src -name '*.cr')
SPEC_SOURCES := $(shell find spec -name '*.cr')
MAN1PAGES := $(patsubst doc/man/%.adoc,man/%.1,$(wildcard doc/man/*.adoc))
override FLAGS += -D strict_multi_assign -D preview_overload_order $(if $(release),--release )$(if $(stats),--stats )$(if $(progress),--progress )$(if $(threads),--threads $(threads) )$(if $(debug),-d )$(if $(static),--static )$(if $(LDFLAGS),--link-flags="$(LDFLAGS)" )$(if $(target),--cross-compile --target $(target) )
# NOTE: USE_PCRE1 is only used for testing compatibility with legacy environments that don't provide libpcre2.
# Newly built compilers should never be distributed with libpcre to ensure syntax consistency.
override COMPILER_FLAGS += $(if $(interpreter),,-Dwithout_interpreter )$(if $(docs_sanitizer),,-Dwithout_libxml2 ) -Dwithout_openssl -Dwithout_zlib$(if $(sequential_codegen),, -Dpreview_mt -Dexecution_context) $(if $(USE_PCRE1),-Duse_pcre,-Duse_pcre2)
SPEC_WARNINGS_OFF := --exclude-warnings spec/std --exclude-warnings spec/compiler --exclude-warnings spec/primitives --exclude-warnings src/float/printer --exclude-warnings src/random.cr
override SPEC_FLAGS += $(if $(verbose),-v )$(if $(junit_output),--junit_output $(junit_output) )$(if $(order),--order=$(order) )
CRYSTAL_CONFIG_LIBRARY_PATH := '$$ORIGIN/../lib/crystal'
ifndef CRYSTAL_CONFIG_BUILD_COMMIT
CRYSTAL_CONFIG_BUILD_COMMIT := $(shell git rev-parse --short HEAD 2> /dev/null)
endif
CRYSTAL_CONFIG_PATH := '$$ORIGIN/../share/crystal/src'
ifndef BASE_CRYSTAL_VERSION
BASE_CRYSTAL_VERSION := $(shell $(CRYSTAL) env CRYSTAL_VERSION)
endif
ifndef CRYSTAL_VERSION
CRYSTAL_VERSION := $(shell cat src/VERSION)
endif
ifndef SOURCE_DATE_EPOCH
SOURCE_DATE_EPOCH := $(shell (cat src/SOURCE_DATE_EPOCH || (git show -s --format=%ct HEAD || stat -c "%Y" Makefile ||stat -f "%m" Makefile)) 2> /dev/null)
endif
check_lld := command -v ld.lld >/dev/null && case "$$(uname -s)" in MINGW32*|MINGW64*|Linux) echo 1;; esac
ifeq ($(shell $(check_lld)),1)
EXPORT_CC ?= CC="$(CC) -fuse-ld=lld"
endif
override EXPORTS += \
CRYSTAL_CONFIG_BUILD_COMMIT="$(CRYSTAL_CONFIG_BUILD_COMMIT)" \
CRYSTAL_CONFIG_PATH=$(CRYSTAL_CONFIG_PATH) \
SOURCE_DATE_EPOCH="$(SOURCE_DATE_EPOCH)"
override EXPORTS_BUILD += \
$(EXPORT_CC) \
CRYSTAL_CONFIG_LIBRARY_PATH=$(CRYSTAL_CONFIG_LIBRARY_PATH)
SHELL = sh
ifeq ($(LLVM_VERSION),)
ifndef LLVM_CONFIG
LLVM_CONFIG := $(shell src/llvm/ext/find-llvm-config.sh)
endif
LLVM_VERSION := $(if $(LLVM_CONFIG),$(shell "$(LLVM_CONFIG)" --version 2> /dev/null))
endif
# Crystal versions before 1.8 cannot build a functional compiler with `-Dpreview_mt` (https://github.com/crystal-lang/crystal/pull/16380)
supports_preview_mt := $(if $(filter 1.8.0,$(shell printf "%s\n%s" "1.8.0" "$(BASE_CRYSTAL_VERSION)" | sort -V | tail -n1)),0,1)
LLVM_EXT_DIR = src/llvm/ext
LLVM_EXT_OBJ = $(LLVM_EXT_DIR)/llvm_ext.o
CXXFLAGS += $(if $(debug),-g -O0)
# MSYS2 support (native Windows should use `Makefile.win` instead)
ifeq ($(OS),Windows_NT)
EXE := .exe
WINDOWS := 1
else
EXE :=
WINDOWS :=
endif
CRYSTAL_BIN := crystal$(EXE)
DESTDIR ?=
PREFIX ?= /usr/local
BINDIR ?= $(PREFIX)/bin
LIBDIR ?= $(PREFIX)/lib
DATADIR ?= $(PREFIX)/share
DOCDIR ?= $(DATADIR)/doc/crystal
MANDIR ?= $(DATADIR)/man
INSTALL ?= /usr/bin/install
ifeq ($(or $(TERM),$(TERM),dumb),dumb)
colorize = $(shell printf "%s" "$1" >&2)
else
colorize = $(shell printf "\033[33m%s\033[0m\n" "$1" >&2)
endif
DEPS = $(LLVM_EXT_OBJ)
ifneq ($(LLVM_VERSION),)
ifeq ($(shell test $(firstword $(subst ., ,$(LLVM_VERSION))) -ge 18; echo $$?),0)
DEPS =
endif
endif
check_llvm_config = $(eval \
check_llvm_config := $(if $(LLVM_VERSION),\
$(call colorize,Using $(or $(LLVM_CONFIG),externally configured LLVM) [version=$(LLVM_VERSION)]),\
$(error "Could not locate compatible llvm-config, make sure it is installed and in your PATH, or set LLVM_VERSION / LLVM_CONFIG. Compatible versions: $(shell cat src/llvm/ext/llvm-versions.txt)))\
)
.PHONY: all
all: crystal ## Build all files (currently crystal only) [default]
.PHONY: test
test: spec ## Run tests
.PHONY: spec
spec: std_spec primitives_spec compiler_spec
.PHONY: std_spec
std_spec: $(O)/std_spec$(EXE) ## Run standard library specs
$(O)/std_spec$(EXE) $(SPEC_FLAGS)
.PHONY: compiler_spec
compiler_spec: $(O)/compiler_spec$(EXE) ## Run compiler specs
$(O)/compiler_spec$(EXE) $(SPEC_FLAGS)
.PHONY: primitives_spec
primitives_spec: $(O)/primitives_spec$(EXE) ## Run primitives specs
$(O)/primitives_spec$(EXE) $(SPEC_FLAGS)
.PHONY: interpreter_spec
interpreter_spec: $(O)/interpreter_spec$(EXE) ## Run interpreter specs
$(O)/interpreter_spec$(EXE) $(SPEC_FLAGS)
.PHONY: simple_smoke_test
simple_smoke_test: ## Build std specs as a smoke test
simple_smoke_test: $(O)/std_spec$(EXE)
.PHONY: smoke_test
smoke_test: ## Build std specs, compiler specs and compiler as a smoke test
smoke_test: $(O)/std_spec$(EXE) $(O)/compiler_spec$(EXE) $(O)/$(CRYSTAL_BIN)
SHELLCHECK_SOURCES := $(wildcard **/*.sh) $(wildcard **/*.bash) bin/crystal bin/ci bin/check-compiler-flag scripts/git/pre-commit
.PHONY: lint-shellcheck
lint-shellcheck:
shellcheck --severity=warning $(SHELLCHECK_SOURCES)
.PHONY: all_spec
all_spec: $(O)/all_spec$(EXE) ## Run all specs (note: this builds a huge program; `test` recipe builds individual binaries and is recommended for reduced resource usage)
$(O)/all_spec$(EXE) $(SPEC_FLAGS)
.PHONY: samples
samples: ## Build example programs
$(MAKE) -C samples
.PHONY: docs
docs: ## Generate standard library documentation
$(call check_llvm_config)
./bin/crystal docs src/docs_main.cr $(DOCS_OPTIONS) --project-name=Crystal --project-version=$(CRYSTAL_VERSION) --source-refname=$(CRYSTAL_CONFIG_BUILD_COMMIT)
cp -R -P -p doc/ docs/
.PHONY: crystal
crystal: $(O)/$(CRYSTAL_BIN) ## Build the compiler
.PHONY: deps llvm_ext
deps: $(DEPS) ## Build dependencies
llvm_ext: $(LLVM_EXT_OBJ)
.PHONY: format
format: ## Format sources
./bin/crystal tool format$(if $(check), --check) src spec samples scripts
.PHONY: generate_data
generate_data: ## Run generator scripts for Unicode, SSL config, ...
$(MAKE) -B -f scripts/generate_data.mk
.PHONY: install
install: $(O)/$(CRYSTAL_BIN) man/crystal.1.gz ## Install the compiler at DESTDIR
$(INSTALL) -d -m 0755 "$(DESTDIR)$(BINDIR)/"
$(INSTALL) -m 0755 "$(O)/$(CRYSTAL_BIN)" "$(DESTDIR)$(BINDIR)/$(CRYSTAL_BIN)"
$(INSTALL) -d -m 0755 $(DESTDIR)$(DATADIR)/crystal
cp -R -p $(if $(deref_symlinks),-L,-P) src "$(DESTDIR)$(DATADIR)/crystal/src"
rm -rf "$(DESTDIR)$(DATADIR)/crystal/$(LLVM_EXT_OBJ)" # Don't install llvm_ext.o
$(INSTALL) -d -m 0755 "$(DESTDIR)$(MANDIR)/man1/"
$(INSTALL) -m 644 man/crystal.1.gz "$(DESTDIR)$(MANDIR)/man1/crystal.1.gz"
$(INSTALL) -d -m 0755 "$(DESTDIR)$(DATADIR)/licenses/crystal/"
$(INSTALL) -m 644 LICENSE "$(DESTDIR)$(DATADIR)/licenses/crystal/LICENSE"
$(INSTALL) -d -m 0755 "$(DESTDIR)$(DATADIR)/bash-completion/completions/"
$(INSTALL) -m 644 etc/completion.bash "$(DESTDIR)$(DATADIR)/bash-completion/completions/crystal"
$(INSTALL) -d -m 0755 "$(DESTDIR)$(DATADIR)/zsh/site-functions/"
$(INSTALL) -m 644 etc/completion.zsh "$(DESTDIR)$(DATADIR)/zsh/site-functions/_crystal"
$(INSTALL) -d -m 0755 "$(DESTDIR)$(DATADIR)/fish/vendor_completions.d/"
$(INSTALL) -m 644 etc/completion.fish "$(DESTDIR)$(DATADIR)/fish/vendor_completions.d/crystal.fish"
ifeq ($(WINDOWS),1)
.PHONY: install_dlls
install_dlls: $(O)/$(CRYSTAL_BIN) ## Install the compiler's dependent DLLs at DESTDIR (Windows only)
$(INSTALL) -d -m 0755 "$(DESTDIR)$(BINDIR)/"
@ldd $(O)/$(CRYSTAL_BIN) | grep -iv ' => /c/windows/system32' | sed 's/.* => //; s/ (.*//' | xargs -t -i $(INSTALL) -m 0755 '{}' "$(DESTDIR)$(BINDIR)/"
endif
.PHONY: uninstall
uninstall: ## Uninstall the compiler from DESTDIR
rm -f "$(DESTDIR)$(BINDIR)/$(CRYSTAL_BIN)"
rm -rf "$(DESTDIR)$(DATADIR)/crystal/src"
rm -f "$(DESTDIR)$(MANDIR)/man1/crystal.1.gz"
rm -f "$(DESTDIR)$(DATADIR)/licenses/crystal/LICENSE"
rm -f "$(DESTDIR)$(DATADIR)/bash-completion/completions/crystal"
rm -f "$(DESTDIR)$(DATADIR)/zsh/site-functions/_crystal"
rm -f "$(DESTDIR)$(DATADIR)/fish/vendor_completions.d/crystal.fish"
.PHONY: install_docs
install_docs: docs ## Install docs at DESTDIR
$(INSTALL) -d -m 0755 $(DESTDIR)$(DOCDIR)
cp -R -P -p docs "$(DESTDIR)$(DOCDIR)/docs"
cp -R -P -p samples "$(DESTDIR)$(DOCDIR)/examples"
.PHONY: uninstall_docs
uninstall_docs: ## Uninstall docs from DESTDIR
rm -rf "$(DESTDIR)$(DOCDIR)/docs"
rm -rf "$(DESTDIR)$(DOCDIR)/examples"
$(O)/all_spec$(EXE): $(DEPS) $(SOURCES) $(SPEC_SOURCES)
$(call check_llvm_config)
@mkdir -p $(O)
$(EXPORT_CC) $(EXPORTS) ./bin/crystal build $(FLAGS) $(SPEC_WARNINGS_OFF) -o $@ spec/all_spec.cr
$(O)/std_spec$(EXE): $(DEPS) $(SOURCES) $(SPEC_SOURCES)
$(call check_llvm_config)
@mkdir -p $(O)
$(EXPORT_CC) ./bin/crystal build $(FLAGS) $(SPEC_WARNINGS_OFF) -o $@ spec/std_spec.cr
$(O)/compiler_spec$(EXE): $(DEPS) $(SOURCES) $(SPEC_SOURCES)
$(call check_llvm_config)
@mkdir -p $(O)
$(EXPORT_CC) $(EXPORTS) ./bin/crystal build $(FLAGS) $(COMPILER_FLAGS) $(SPEC_WARNINGS_OFF) -o $@ spec/compiler_spec.cr --release
$(O)/primitives_spec$(EXE): $(O)/$(CRYSTAL_BIN) $(DEPS) $(SOURCES) $(SPEC_SOURCES)
@mkdir -p $(O)
$(EXPORT_CC) ./bin/crystal build $(FLAGS) $(SPEC_WARNINGS_OFF) -o $@ spec/primitives_spec.cr
$(O)/interpreter_spec$(EXE): $(DEPS) $(SOURCES) $(SPEC_SOURCES)
$(eval interpreter=1)
@mkdir -p $(O)
$(EXPORT_CC) ./bin/crystal build $(FLAGS) $(COMPILER_FLAGS) $(SPEC_WARNINGS_OFF) -o $@ spec/compiler/interpreter_spec.cr
$(O)/$(CRYSTAL_BIN): $(DEPS) $(SOURCES)
$(call check_llvm_config)
@mkdir -p $(O)
$(EXPORTS) $(EXPORTS_BUILD) ./bin/crystal build $(FLAGS) $(COMPILER_FLAGS) -o $(if $(WINDOWS),$(O)/crystal-next.exe,$@) src/compiler/crystal.cr
@# NOTE: on MSYS2 it is not possible to overwrite a running program, so the compiler must be first built with
@# a different filename and then moved to the final destination.
$(if $(WINDOWS),mv $(O)/crystal-next.exe $@)
$(LLVM_EXT_OBJ): $(LLVM_EXT_DIR)/llvm_ext.cc
$(call check_llvm_config)
$(CXX) -c $(CXXFLAGS) -o $@ $< $(if $(LLVM_CONFIG),$(shell $(LLVM_CONFIG) --cxxflags))
man/: $(MAN1PAGES)
man/%.gz: man/%
gzip -c -9 $< > $@
man/%.1: doc/man/%.adoc
SOURCE_DATE_EPOCH=$(SOURCE_DATE_EPOCH) asciidoctor -a crystal_version=$(CRYSTAL_VERSION) $< -b manpage -o $@
.PHONY: clean
clean: clean_crystal ## Clean up built directories and files
rm -rf $(LLVM_EXT_OBJ)
rm -rf man/*.gz
.PHONY: clean_crystal
clean_crystal: ## Clean up crystal built files
rm -rf $(O)
rm -rf ./docs
.PHONY: clean_cache
clean_cache: ## Clean up CRYSTAL_CACHE_DIR files
rm -rf $(shell ./bin/crystal env CRYSTAL_CACHE_DIR)
.PHONY: help
help: ## Show this help
@echo
@printf '\033[34mtargets:\033[0m\n'
@grep -hE '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) |\
sort |\
awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}'
@echo
@printf '\033[34moptional variables:\033[0m\n'
@grep -hE '^[a-zA-Z_-]+ \?=.*?## .*$$' $(MAKEFILE_LIST) |\
sort |\
awk 'BEGIN {FS = " \\?=.*?## "}; {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}'
@echo
@printf '\033[34mrecipes:\033[0m\n'
@grep -hE '^##.*$$' $(MAKEFILE_LIST) |\
awk 'BEGIN {FS = "## "}; /^## [a-zA-Z_-]/ {printf " \033[36m%s\033[0m\n", $$2}; /^## / {printf " %s\n", $$2}'
================================================
FILE: Makefile.win
================================================
all:
-include Makefile.win.local # for optional local options e.g. threads
# Recipes for this Makefile
## Build the compiler
## $ make -f Makefile.win
## Build the compiler with progress output
## $ make -f Makefile.win progress=1
## Clean up built files then build the compiler
## $ make -f Makefile.win clean crystal
## Build the compiler in release mode
## $ make -f Makefile.win crystal release=1 interpreter=1
## Run tests
## $ make -f Makefile.win test
## Run stdlib tests
## $ make -f Makefile.win std_spec
## Run compiler tests
## $ make -f Makefile.win compiler_spec
## Run generators (Unicode, SSL config, ...)
## $ make -B generate_data
CRYSTAL ?= crystal ## which previous crystal compiler use
release ?= ## Compile in release mode
stats ?= ## Enable statistics output
progress ?= ## Enable progress output
threads ?= ## Maximum number of threads to use
debug ?= ## Add symbolic debug info
verbose ?= ## Run specs in verbose mode
junit_output ?= ## Path to output junit results
static ?= ## Enable static linking
target ?= ## Cross-compilation target
interpreter ?= ## Enable interpreter feature
check ?= ## Enable only check when running format
order ?=random ## Enable order for spec execution (values: "default" | "random" | seed number)
docs_sanitizer ?= ## Enable sanitization for documentation generation
sequential_codegen ?= ## Enforce sequential codegen in compiler builds. Base compiler before Crystal 1.8 cannot build with `-Dpreview_mt`
MAKEFLAGS += --no-builtin-rules
.SUFFIXES:
SHELL := cmd.exe
CXX := cl.exe
RC := rc.exe
GLOB = $(shell dir $1 /B /S)
MKDIR = if not exist $1 mkdir $1
CP = copy /B /Y $1 $2
CPDIR = robocopy /E /NJH /NJS /NS /NC /NP $1 $2 & if %%ERRORLEVEL%% GEQ 8 exit /B 1
INSTALL = copy /B /Y $1 $2
INSTALLDIR = robocopy /E /NJH /NJS /NS /NC /NP $1 $2 & if %%ERRORLEVEL%% GEQ 8 exit /B 1
MV = move /Y $1 $2
RM = if exist $1 del /F /Q $1
RMDIR = if exist $1 rd /S /Q $1
O := .build
SOURCES := $(call GLOB,src\\*.cr)
SPEC_SOURCES := $(call GLOB,spec\\*.cr)
override FLAGS += -D strict_multi_assign -D preview_overload_order $(if $(release),--release )$(if $(stats),--stats )$(if $(progress),--progress )$(if $(threads),--threads $(threads) )$(if $(debug),-d )$(if $(static),--static )$(if $(LDFLAGS),--link-flags="$(LDFLAGS)" )$(if $(target),--cross-compile --target $(target) )
# NOTE: USE_PCRE1 is only used for testing compatibility with legacy environments that don't provide libpcre2.
# Newly built compilers should never be distributed with libpcre to ensure syntax consistency.
override COMPILER_FLAGS += $(if $(interpreter),,-Dwithout_interpreter )$(if $(docs_sanitizer),,-Dwithout_libxml2 ) -Dwithout_openssl -Dwithout_zlib$(if $(sequential_codegen),, -Dpreview_mt -Dexecution_context) $(if $(USE_PCRE1),-Duse_pcre,-Duse_pcre2)
SPEC_WARNINGS_OFF := --exclude-warnings spec\std --exclude-warnings spec\compiler --exclude-warnings spec\primitives --exclude-warnings src\float\printer
SPEC_FLAGS := $(if $(verbose),-v )$(if $(junit_output),--junit_output $(junit_output) )$(if $(order),--order=$(order) )
CRYSTAL_CONFIG_LIBRARY_PATH := $$ORIGIN\lib
CRYSTAL_CONFIG_BUILD_COMMIT := $(shell git rev-parse --short HEAD)
CRYSTAL_CONFIG_PATH := $$ORIGIN\src
ifndef CRYSTAL_VERSION
CRYSTAL_VERSION := $(shell type src\VERSION)
endif
ifndef SOURCE_DATE_EPOCH
SOURCE_DATE_EPOCH := $(or $(shell type src\SOURCE_DATE_EPOCH 2>NUL),$(shell git show -s --format=%ct HEAD))
endif
export_vars = $(eval export CRYSTAL_CONFIG_BUILD_COMMIT CRYSTAL_CONFIG_PATH SOURCE_DATE_EPOCH)
export_build_vars = $(eval export CRYSTAL_CONFIG_LIBRARY_PATH)
ifeq ($(LLVM_VERSION),)
LLVM_CONFIG ?=
LLVM_VERSION := $(if $(LLVM_CONFIG),$(shell "$(LLVM_CONFIG)" --version))
endif
LLVM_EXT_DIR = src\llvm\ext
LLVM_EXT_OBJ = $(LLVM_EXT_DIR)\llvm_ext.obj
CXXFLAGS += $(if $(static),$(if $(debug),/MTd /Od ,/MT ),$(if $(debug),/MDd /Od ,/MD ))
prefix ?= $(or $(ProgramW6432),$(ProgramFiles))\crystal
BINDIR ?= $(prefix)
LIBDIR ?= $(prefix)\lib
SRCDIR ?= $(prefix)\src
DATADIR ?= $(prefix)
colorize = $(info $1)
DEPS = $(LLVM_EXT_OBJ)
ifneq ($(LLVM_VERSION),)
ifeq ($(shell if $(firstword $(subst ., ,$(LLVM_VERSION))) GEQ 18 echo 0),0)
DEPS =
endif
endif
check_llvm_config = $(eval \
check_llvm_config := $(if $(LLVM_VERSION),\
$(call colorize,Using $(or $(LLVM_CONFIG),externally configured LLVM) [version=$(LLVM_VERSION)]),\
$(error "Could not locate compatible llvm-config, make sure it is installed and in your PATH, or set LLVM_VERSION / LLVM_CONFIG. Compatible versions: $(shell type src\llvm\ext\llvm-versions.txt)))\
)
.PHONY: all
all: crystal ## Build all files (currently crystal only) [default]
.PHONY: test
test: spec ## Run tests
.PHONY: spec
spec: std_spec primitives_spec compiler_spec
.PHONY: std_spec
std_spec: $(O)\std_spec.exe ## Run standard library specs
$(O)\std_spec $(SPEC_FLAGS)
.PHONY: compiler_spec
compiler_spec: $(O)\compiler_spec.exe ## Run compiler specs
$(O)\compiler_spec $(SPEC_FLAGS)
.PHONY: primitives_spec
primitives_spec: $(O)\primitives_spec.exe ## Run primitives specs
$(O)\primitives_spec $(SPEC_FLAGS)
.PHONY: interpreter_spec
interpreter_spec: $(O)\interpreter_spec ## Run interpreter specs
$(O)\interpreter_spec $(SPEC_FLAGS)
.PHONY: smoke_test
smoke_test: ## Build specs as a smoke test
smoke_test: $(O)\std_spec.exe $(O)\compiler_spec.exe $(O)\crystal.exe
.PHONY: all_spec
all_spec: $(O)\all_spec.exe ## Run all specs (note: this builds a huge program; `test` recipe builds individual binaries and is recommended for reduced resource usage)
$(O)\all_spec $(SPEC_FLAGS)
.PHONY: samples
samples: ## Build example programs
$(MAKE) -C samples -f $(MAKEFILE_LIST)
.PHONY: docs
docs: ## Generate standard library documentation
$(call check_llvm_config)
.\bin\crystal docs src\docs_main.cr $(DOCS_OPTIONS) --project-name=Crystal --project-version=$(CRYSTAL_VERSION) --source-refname=$(CRYSTAL_CONFIG_BUILD_COMMIT)
.PHONY: crystal
crystal: $(O)\crystal.exe ## Build the compiler
.PHONY: deps llvm_ext
deps: $(DEPS) ## Build dependencies
llvm_ext: $(LLVM_EXT_OBJ)
.PHONY: format
format: ## Format sources
.\bin\crystal tool format$(if $(check), --check) src spec samples scripts
.PHONY: generate_data
generate_data: ## Run generator scripts for Unicode, SSL config, ...
$(MAKE) -B -f scripts/generate_data.mk
.PHONY: install
install: $(O)\crystal.exe ## Install the compiler at prefix
$(call MKDIR,"$(BINDIR)")
$(call INSTALL,"$(O)\crystal.exe","$(BINDIR)\crystal.exe")
$(call INSTALL,"$(O)\crystal.pdb","$(BINDIR)\crystal.pdb")
$(call MKDIR,"$(DATADIR)")
$(call INSTALLDIR,src,"$(DATADIR)\src")
$(call RM,"$(DATADIR)\$(LLVM_EXT_OBJ)")
$(call INSTALL,LICENSE,"$(DATADIR)\LICENSE.txt")
.PHONY: uninstall
uninstall: ## Uninstall the compiler from prefix
$(call RM,"$(DATADIR)\LICENSE.txt")
$(call RMDIR,"$(DATADIR)\src")
$(call RM,"$(BINDIR)\crystal.exe")
$(call RM,"$(BINDIR)\crystal.pdb")
.PHONY: install_docs
install_docs: docs ## Install docs at prefix
$(call MKDIR,"$(DATADIR)")
$(call INSTALLDIR,docs,"$(DATADIR)\docs")
$(call INSTALLDIR,samples,"$(DATADIR)\examples")
.PHONY: uninstall_docs
uninstall_docs: ## Uninstall docs from prefix
$(call RMDIR,"$(DATADIR)\docs")
$(call RMDIR,"$(DATADIR)\examples")
$(O)\all_spec.exe: $(DEPS) $(SOURCES) $(SPEC_SOURCES)
$(call check_llvm_config)
@$(call MKDIR,"$(O)")
$(call export_vars)
.\bin\crystal build $(FLAGS) $(SPEC_WARNINGS_OFF) -o "$@" spec\all_spec.cr
$(O)\std_spec.exe: $(DEPS) $(SOURCES) $(SPEC_SOURCES)
$(call check_llvm_config)
@$(call MKDIR,"$(O)")
.\bin\crystal build $(FLAGS) $(SPEC_WARNINGS_OFF) -o "$@" spec\std_spec.cr
$(O)\compiler_spec.exe: $(DEPS) $(SOURCES) $(SPEC_SOURCES)
$(call check_llvm_config)
@$(call MKDIR,"$(O)")
$(call export_vars)
.\bin\crystal build $(FLAGS) $(COMPILER_FLAGS) $(SPEC_WARNINGS_OFF) -o "$@" spec\compiler_spec.cr --release
$(O)\primitives_spec.exe: $(O)\crystal.exe $(DEPS) $(SOURCES) $(SPEC_SOURCES)
@$(call MKDIR,"$(O)")
.\bin\crystal build $(FLAGS) $(SPEC_WARNINGS_OFF) -o "$@" spec\primitives_spec.cr
$(O)\interpreter_spec: $(DEPS) $(SOURCES) $(SPEC_SOURCES)
$(eval interpreter=1)
@$(call MKDIR, "$(O)")
.\bin\crystal build $(FLAGS) $(COMPILER_FLAGS) $(SPEC_WARNINGS_OFF) -o $@ spec\compiler\interpreter_spec.cr
$(O)\crystal.exe: $(DEPS) $(SOURCES) $(O)\crystal.res
$(call check_llvm_config)
@$(call MKDIR,"$(O)")
$(call export_vars)
$(call export_build_vars)
.\bin\crystal build $(FLAGS) $(COMPILER_FLAGS) -o "$(O)\crystal-next.exe" src\compiler\crystal.cr --link-flags=/PDBALTPATH:crystal.pdb "--link-flags=$(realpath $(O)\crystal.res)"
$(call MV,"$(O)\crystal-next.exe","$@")
$(call MV,"$(O)\crystal-next.pdb","$(O)\crystal.pdb")
$(O)\crystal.res: $(O)\crystal.rc
@$(call MKDIR,"$(O)")
$(RC) /nologo /Fo "$@" "$<"
$(O)\crystal.rc: $(MAKEFILE_LIST)
@$(call MKDIR,"$(O)")
$(MAKE) -s -f $(MAKEFILE_LIST) rc > "$@"
$(LLVM_EXT_OBJ): $(LLVM_EXT_DIR)\llvm_ext.cc
$(call check_llvm_config)
@rem Disable some harmless warnings:
@rem - warning C4244: 'initializing': conversion from '_Ty' to '_Ty2', possible loss of data
@rem - warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
@rem - warning C4624: '...': destructor was implicitly defined as deleted
$(CXX) /nologo /c $(CXXFLAGS) /WX /wd4244 /wd4624 /wd4530 "/Fo$@" "$<" $(if $(LLVM_CONFIG),$(shell $(LLVM_CONFIG) --cxxflags))
.PHONY: clean
clean: clean_crystal ## Clean up built directories and files
$(call RM,"$(LLVM_EXT_OBJ)")
.PHONY: clean_crystal
clean_crystal: ## Clean up crystal built files
$(call RMDIR,"$(O)")
$(call RMDIR,docs)
.PHONY: clean_cache
clean_cache: ## Clean up CRYSTAL_CACHE_DIR files
$(call RMDIR,"$(shell .\bin\crystal env CRYSTAL_CACHE_DIR)")
.PHONY: rc
rc: ## Write compiler resource script to standard output
$(eval comma := ,)
$(eval ver_comma := $(subst .,$(comma),$(subst -dev,,$(CRYSTAL_VERSION))))
$(eval source_date := $(shell git show -s --format=%cs HEAD))
$(eval source_year := $(firstword $(subst -, ,$(source_date))))
$(eval ver_full := $(CRYSTAL_VERSION)$(if $(CRYSTAL_CONFIG_BUILD_COMMIT), [$(CRYSTAL_CONFIG_BUILD_COMMIT)])$(if $(source_date), ($(source_date))))
@setlocal EnableDelayedExpansion &\
echo #include ^<windows.h^>&\
echo.&\
set "_dir=$(dir $(abspath $(lastword $(MAKEFILE_LIST))))" &\
echo 1 ICON ^"!_dir:/=\\!src\\compiler\\crystal\\tools\\playground\\public\\favicon.ico^"&\
echo.&\
echo VS_VERSION_INFO VERSIONINFO&\
echo PRODUCTVERSION $(ver_comma),0&\
echo FILEVERSION $(ver_comma),1&\
echo FILEFLAGSMASK VS_FFI_FILEFLAGSMASK&\
echo FILEFLAGS $(if $(findstring -dev,$(CRYSTAL_VERSION)),VS_FF_PRERELEASE,0)&\
echo FILEOS VOS_NT_WINDOWS32&\
echo FILETYPE VFT_APP&\
echo FILESUBTYPE VFT2_UNKNOWN&\
echo BEGIN&\
echo BLOCK "StringFileInfo"&\
echo BEGIN&\
echo BLOCK "040904B0"&\
echo BEGIN&\
echo VALUE "ProductName", "Crystal"&\
echo VALUE "ProductVersion", "$(ver_full)"&\
echo VALUE "FileVersion", "$(ver_full)"&\
echo VALUE "FileDescription", "Crystal$(if $(LLVM_CONFIG), $(shell $(LLVM_CONFIG) --host-target))"&\
echo VALUE "Comments", "$(if $(LLVM_VERSION),LLVM $(LLVM_VERSION))"&\
echo VALUE "InternalName", "crystal.exe"&\
echo VALUE "OriginalFilename", "crystal.exe"&\
echo VALUE "CompanyName", "Manas Technology Solutions"&\
echo VALUE "LegalCopyright", "Copyright 2012-$(source_year) Manas Technology Solutions"&\
echo END&\
echo END&\
echo BLOCK "VarFileInfo"&\
echo BEGIN&\
echo VALUE "Translation", 0x0409, 0x04B0&\
echo END&\
echo END
.PHONY: help
help: ## Show this help
@setlocal EnableDelayedExpansion &\
echo. &\
echo targets: &\
(for /F "usebackq tokens=1* delims=:" %%g in ($(MAKEFILE_LIST)) do (\
if not "%%h" == "" (\
set "_line=%%g " &\
set "_rest=%%h" &\
set "_comment=!_rest:* ## =!" &\
if not "!_comment!" == "!_rest!"\
if "!_line:_rest=!" == "!_line!"\
echo !_line:~0,16!!_comment!\
)\
)) &\
echo. &\
echo optional variables: &\
(for /F "usebackq tokens=1,3 delims=?#" %%g in ($(MAKEFILE_LIST)) do (\
if not "%%h" == "" (\
set "_var=%%g " &\
echo !_var:~0,14! %%h\
)\
)) &\
echo. &\
echo recipes: &\
(for /F "usebackq tokens=* delims=" %%g in ($(MAKEFILE_LIST)) do (\
set "_line=%%g" &\
if "!_line:~0,7!" == "## $$ " (\
echo !_name! &\
echo !_line:~2!\
) else if "!_line:~0,3!" == "## "\
set "_name= !_line:~3!"\
))
================================================
FILE: NOTICE.md
================================================
# Crystal Programming Language
Copyright 2012-2026 Manas Technology Solutions.
This product includes software developed at Manas Technology Solutions (<https://manas.tech/>).
Apache License v2.0 with Swift exception applies to all works unless specified
otherwise:
Please see [REUSE.toml](REUSE.toml) and [LICENSE](LICENSE) for additional
copyright and licensing information.
- This repository includes vendored libraries (shards) in `/lib/` which have
their own licenses. See [REUSE.toml](REUSE.toml) for details.
- Crystal playground includes vendored libraries with their own licenses. See
[src/compiler/crystal/tools/playground/public/vendor/REUSE.toml](src/compiler/crystal/tools/playground/public/vendor/REUSE.toml)
for details.
## External libraries information
Crystal compiler links the following libraries, which have their own license:
- [LLVM][] - [Apache-2.0 with LLVM exceptions][]
- [PCRE or PCRE2][] - [BSD-3][]
- [libevent2][] - [BSD-3][]
- [libiconv][] - [LGPLv3][]
- [bdwgc][] - [MIT][]
Crystal compiler calls the following tools as external process on compiling, which have their own license:
- [pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/) - [GPLv3]
Crystal standard library uses the following libraries, which have their own licenses:
- [LLVM][] - [Apache-2.0 with LLVM exceptions][]
- [PCRE or PCRE2][] - [BSD-3][]
- [libevent2][] - [BSD-3][]
- [libiconv][] - [LGPLv3][]
- [bdwgc][] - [MIT][]
- [Zlib][] - [Zlib][Zlib-license]
- [OpenSSL][] - [Apache-2.0][]
- [Libxml2][] - [MIT][]
- [LibYAML][] - [MIT][]
- [readline][] - [GPLv3][]
- [GMP][] - [LGPLv3][]
<!-- licenses -->
[Apache-2.0]: https://www.openssl.org/source/apache-license-2.0.txt
[Apache-2.0 with LLVM exceptions]: https://raw.githubusercontent.com/llvm/llvm-project/main/llvm/LICENSE.TXT
[BSD-3]: https://opensource.org/licenses/BSD-3-Clause
[GPLv3]: https://www.gnu.org/licenses/gpl-3.0.en.html
[LGPLv3]: https://www.gnu.org/licenses/lgpl-3.0.en.html
[MIT]: https://opensource.org/licenses/MIT
[Zlib-license]: https://opensource.org/licenses/Zlib
<!-- libraries -->
[bdwgc]: http://www.hboehm.info/gc/
[GMP]: https://gmplib.org/
[libevent2]: http://libevent.org/
[libiconv]: https://www.gnu.org/software/libiconv/
[Libxml2]: http://xmlsoft.org/
[LibYAML]: http://pyyaml.org/wiki/LibYAML
[LLVM]: http://llvm.org/
[OpenSSL]: https://www.openssl.org/
[PCRE or PCRE2]: http://pcre.org/
[readline]: https://tiswww.case.edu/php/chet/readline/rltop.html
[Zlib]: http://www.zlib.net/
================================================
FILE: README.md
================================================
# Crystal
[](https://github.com/crystal-lang/crystal/actions?query=workflow%3A%22Linux+CI%22+event%3Apush+branch%3Amaster)
[](https://github.com/crystal-lang/crystal/actions?query=workflow%3A%22macOS+CI%22+event%3Apush+branch%3Amaster)
[](https://github.com/crystal-lang/crystal/actions?query=workflow%3A%22AArch64+CI%22+event%3Apush+branch%3Amaster)
[](https://github.com/crystal-lang/crystal/actions?query=workflow%3A%22Windows+CI%22+event%3Apush+branch%3Amaster)
[](https://circleci.com/gh/crystal-lang/crystal)
[](https://gitter.im/crystal-lang/crystal)
[](https://www.codetriage.com/crystal-lang/crystal)
---
[](https://manas.tech/)
Crystal is a programming language with the following goals:
- Have a syntax similar to Ruby (but compatibility with it is not a goal)
- Statically type-checked but without having to specify the type of variables or method arguments.
- Be able to call C code by writing bindings to it in Crystal.
- Have compile-time evaluation and generation of code, to avoid boilerplate code.
- Compile to efficient native code.
## Why?
We love Ruby's efficiency for writing code.
We love C's efficiency for running code.
We want the best of both worlds.
We want the compiler to understand what we mean without having to specify types everywhere.
We want full OOP.
Oh, and we don't want to write C code to make the code run faster.
## Project Status
Within a major version, language features won't be removed or changed in any way that could prevent a Crystal program written with that version from compiling and working. The built-in standard library might be enriched, but it will always be done with backwards compatibility in mind.
Development of the Crystal language is possible thanks to the community's effort and the continued support of [84codes](https://www.84codes.com/) and every other [sponsor](https://crystal-lang.org/sponsors).
## Installing
[Follow these installation instructions](https://crystal-lang.org/install)
## Try it online
[play.crystal-lang.org](https://play.crystal-lang.org/)
## Documentation
- [Language Reference](http://crystal-lang.org/reference)
- [Standard library API](https://crystal-lang.org/api)
- [Roadmap](https://github.com/crystal-lang/crystal/wiki/Roadmap)
## Community
Have any questions or suggestions? Ask on the [Crystal Forum](https://forum.crystal-lang.org), on our [Gitter channel](https://gitter.im/crystal-lang/crystal) or IRC channel [#crystal-lang](https://web.libera.chat/#crystal-lang) at irc.libera.chat, or on Stack Overflow under the [crystal-lang](http://stackoverflow.com/questions/tagged/crystal-lang) tag. There is also an archived [Google Group](https://groups.google.com/forum/?fromgroups#!forum/crystal-lang).
## Contributing
The Crystal repository is hosted at [crystal-lang/crystal](https://github.com/crystal-lang/crystal) on GitHub.
Read the general [Contributing guide](https://github.com/crystal-lang/crystal/blob/master/CONTRIBUTING.md), and then:
1. Fork it (<https://github.com/crystal-lang/crystal/fork>)
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create a new Pull Request
================================================
FILE: REUSE.toml
================================================
version = 1
# All original code in this repository is licensed under Apache 2.0 with Swift
# exception.
[[annotations]]
path = ["**"]
SPDX-FileCopyrightText = "Copyright 2012-2026 Manas Technology Solutions."
SPDX-License-Identifier = "Apache-2.0 WITH Swift-exception"
# Unset license information for vendored libraries ("shards"). They either
# provide their own information or there's a specific section in this file.
[[annotations]]
path = ["lib/*/**"]
[[annotations]]
path = "lib/markd/**"
SPDX-FileCopyrightText = "Copyright (c) 2017-present icyleaf"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "lib/reply/**"
SPDX-FileCopyrightText = "Copyright (c) 2022 I3oris <boris31.resch@gmail.com>"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "lib/sanitize/**"
SPDX-FileCopyrightText = "Copyright (c) 2020 Johannes Müller <straightshoota@gmail.com>"
SPDX-License-Identifier = "Apache-2.0"
================================================
FILE: SECURITY.md
================================================
# Reporting a Vulnerability
Should you find any security-related issue, please _do not share them openly_ in
the issue tracker. We have a dedicated mailbox where we keep track of them:
<security@manas.tech>
You can encrypt your message via [Keybase](https://keybase.io/encrypt) (set
recipient `crystal`) or with our [PGP key](https://crystal-lang.org/community/crystal-pgp-key.txt)
(fingerprint `5995 C83C D754 BE44 8164 1929 0961 7FD3 7CC0 6B54`)
also available on [Keybase server](https://keybase.io/crystal/pgp_keys.asc).
================================================
FILE: UPGRADING.md
================================================
# Upgrading
This guide provides instructions for upgrading Crystal from one release to the next.
Upgrades must be run sequentially, meaning you should not skip minor/major releases while upgrading.
Crystal commits to a backwards-compatibility guarantee that code should continue
to work with all future minor releases of the same major release series.
Still, even bug fixes introduce changes that may break existing code in some edge cases.
We're only listing the most relevant changes here that could have a relevant impact.
The [changelogs](./doc/changelogs/README.md) contain more information about all changes in
a specific release.
## Crystal 1.13
- `CRYSTAL_LIBRARY_RPATH` and the `preview_win32_delay_load` feature flag have
been removed. Individual DLLs can be explicitly delay-loaded with the MSVC
toolchain by using `/DELAYLOAD` as a linker flag. Similarly RPATH can be added
with GCC or Clang toolchains by adding `-Wl,-rpath`.
## Crystal 1.9
- The implementation of the comparison operator `#<=>` between `Big*` (`BigDecimal`,
`BigFloat`, `BigInt`, `BigRational`) and `Float` (`Float32`, `Float64`) number types
is now nilable. When invoking these comparisons, `Nil` values must be handled.
================================================
FILE: _typos.toml
================================================
[default.extend-words]
flate = "flate"
[default.extend-identifiers]
ACCES = "ACCES"
ba = "ba"
ba2 = "ba2"
bui = "bui"
category_Nd = "category_Nd"
DW_AT_endianity = "DW_AT_endianity"
EXTA = "EXTA"
GC_get_thr_restart_signal = "GC_get_thr_restart_signal"
get_thr_restart_signal = "get_thr_restart_signal"
IPPROTO_ND = "IPPROTO_ND"
IST = "IST"
iTolen = "iTolen"
iy = "iy"
larg = "larg"
Nd = "Nd"
numer = "numer"
OLT = "OLT"
pendings = "pendings"
RELA = "RELA"
RPC_S_CALL_FAILED_DNE = "RPC_S_CALL_FAILED_DNE"
SEH = "SEH"
setup_seh_handler = "setup_seh_handler"
usri4_parms = "usri4_parms"
msg_controllen = "msg_controllen"
__crystal_sigfault_handler = "__crystal_sigfault_handler"
TunkShif = "TunkShif"
[default]
extend-ignore-re = [
# numeric literals
'0x[0-9a-fA-F_\.\+]+([fiu](8|16|32|64|128))?',
'\\u\{[0-9a-fA-F]+\}',
# proper names
'FLE Standard Time',
'Universally Unique IDentifier',
# constants
'ERROR_\w+',
'EVP_CIPH.*',
# fixed test values
'FOO|/Fo',
'rCVZVOThsIa97pEDOxvGu',
'\w*AAAAAAAA\w*',
# several string specs
'"(Fo-ur|thi|abd|alo|tro|tring|ue)"',
'"(aGFo|hel|Hel|thr|noe|Noe|BaR|fo|FO)', '(hel|Hel|worl|Worl|fo)"',
'/fo|/FO', "'fo", "/\\(fo",
'tr‸ue|fo‸o',
"\"[^\"]+\"\\.to_slice\\s*=> [\"']\\\\u", # src/html/entities.cr
" ([a-zA-Z.]{8} ){4}->", # src/bit_array.cr
"[A-z]+[0-9]+", # words including a number are likely some kind of identifier
"sha256[:-][0-9A-z=]+", # shell.nix
]
[files]
extend-exclude = [
".git/**",
"lib/**",
"man/**",
"spec/compiler/semantic/did_you_mean_spec.cr",
"spec/std/string_scanner_spec.cr",
"spec/std/data/**",
"spec/std/string/grapheme_break_spec.cr",
"src/compiler/crystal/tools/playground/public/vendor/",
]
================================================
FILE: bin/check-compiler-flag
================================================
#!/bin/sh
# Use `./bin/check-compiler-flag FLAG` to check the behaviour of the given compiler flag.
# This is useful if `crystal build` is affected when using `-DFLAG` option.
#
# This script will
# * run the compiler_spec using the flag
# * build the compiler to have the flag available (in case the flag is introduced in this version)
# * run the std_spec and primitives_spec with and without the flag
# * check the compiler_spec built with and without the flag (eg: the specs build with the flag can generate a compiler without the flag)
# * build a 2nd generation of the compiler using the flag
# * repeat the checks for the spec suites with and without the flag
set -eux
COMPILER_FLAG=$1
# test compiler_specs
make clean_cache clean_crystal
CRYSTAL_LIBRARY_PATH=$(./bin/crystal env CRYSTAL_LIBRARY_PATH) CRYSTAL_SPEC_COMPILER_FLAGS="$COMPILER_FLAG" make compiler_spec
# first gen compiler
make clean_cache clean_crystal crystal
./bin/crystal --version
md5 .build/crystal
# run specs
make clean_cache std_spec
make clean_cache std_spec FLAGS="-D$COMPILER_FLAG"
make clean_cache primitives_spec
make clean_cache primitives_spec FLAGS="-D$COMPILER_FLAG"
# test compiler_specs
make clean_cache
CRYSTAL_LIBRARY_PATH=$(./bin/crystal env CRYSTAL_LIBRARY_PATH) CRYSTAL_SPEC_COMPILER_FLAGS="$COMPILER_FLAG" make compiler_spec FLAGS="-D$COMPILER_FLAG"
make clean_cache
CRYSTAL_LIBRARY_PATH=$(./bin/crystal env CRYSTAL_LIBRARY_PATH) make compiler_spec FLAGS="-D$COMPILER_FLAG"
make clean_cache
CRYSTAL_LIBRARY_PATH=$(./bin/crystal env CRYSTAL_LIBRARY_PATH) make compiler_spec
# building 2nd gen compiler
make clean_crystal clean_cache crystal # first
md5 .build/crystal
touch src/compiler/crystal.cr
sleep 2
make clean_cache crystal FLAGS="-D$COMPILER_FLAG" # second
md5 .build/crystal
# run specs
make clean_cache std_spec
make clean_cache std_spec FLAGS="-D$COMPILER_FLAG"
make clean_cache primitives_spec
make clean_cache primitives_spec FLAGS="-D$COMPILER_FLAG"
# run compiler specs
make clean_cache
CRYSTAL_LIBRARY_PATH=$(./bin/crystal env CRYSTAL_LIBRARY_PATH) CRYSTAL_SPEC_COMPILER_FLAGS="$COMPILER_FLAG" make compiler_spec FLAGS="-D$COMPILER_FLAG"
make clean_cache
CRYSTAL_LIBRARY_PATH=$(./bin/crystal env CRYSTAL_LIBRARY_PATH) make compiler_spec FLAGS="-D$COMPILER_FLAG"
make clean_cache
CRYSTAL_LIBRARY_PATH=$(./bin/crystal env CRYSTAL_LIBRARY_PATH) make compiler_spec
================================================
FILE: bin/ci
================================================
#!/bin/sh
fail() {
echo "${*}" >&2
exit 1
}
on_tag() {
if [ -n "$CURRENT_TAG" ]; then
echo "${*}"
eval "${*}"
return $?
else
return 0
fi
}
fail_on_error() {
"${@}"
exit=$?
if [ "$exit" -ne "0" ]; then
fail "${*} exited with $exit"
fi
return 0
}
verify_environment() {
if [ -z "$TRAVIS_OS_NAME" ]; then
fail "\$TRAVIS_OS_NAME is not set or empty."
fi
}
verify_linux_environment() {
if [ -z "$ARCH" ]; then
fail "\$ARCH is not set or empty."
fi
if [ -z "$ARCH_CMD" ]; then
fail "\$ARCH_CMD is not set or empty."
fi
}
on_os() {
os="$1"
shift
if [ -z "$CI_NIX_SHELL" ]; then
verify_environment
if [ "$TRAVIS_OS_NAME" = "$os" ]; then
echo "${*}"
eval "${*}"
return $?
else
return 0
fi
else
return 0
fi
}
on_linux() {
fail_on_error on_os "linux" "${*}"
}
on_osx() {
fail_on_error on_os "osx" "${*}"
}
on_nix_shell_eval() {
if [ -n "$CI_NIX_SHELL" ]; then
echo "${*}"
eval "${*}"
return $?
else
return 0
fi
}
on_nix_shell() {
fail_on_error on_nix_shell_eval "${*}"
}
on_github() {
if [ "$GITHUB_ACTIONS" = "true" ]; then
eval "${*}"
return $?
else
return 0
fi
}
prepare_system() {
on_linux 'echo '"'"'{"ipv6":true, "fixed-cidr-v6":"2001:db8:1::/64"}'"'"' | sudo tee /etc/docker/daemon.json'
on_linux sudo service docker restart
}
build() {
with_build_env 'bin/crystal scripts/print_regex_config.cr'
with_build_env 'make std_spec clean threads=1 junit_output=.junit/std_spec.xml'
case $ARCH in
i386)
with_build_env 'make crystal threads=1'
with_build_env 'SPEC_SPLIT="0%4" make std_spec threads=1 junit_output=.junit/std_spec.0.xml'
with_build_env 'SPEC_SPLIT="1%4" make std_spec threads=1 junit_output=.junit/std_spec.1.xml'
with_build_env 'SPEC_SPLIT="2%4" make std_spec threads=1 junit_output=.junit/std_spec.2.xml'
with_build_env 'SPEC_SPLIT="3%4" make std_spec threads=1 junit_output=.junit/std_spec.3.xml'
parts=16
i=0
while [ $i -lt $parts ]; do
with_build_env "CRYSTAL_SPEC_COMPILER_THREADS=1 SPEC_SPLIT=\"$i%$parts\" make compiler_spec threads=1 junit_output=.junit/compiler_spec.$i.xml"
i=$((i + 1))
done
with_build_env 'make primitives_spec threads=1 junit_output=.junit/primitives_spec.xml'
with_build_env 'make docs threads=1'
;;
*)
with_build_env 'make crystal primitives_spec std_spec compiler_spec docs threads=1 junit_output=.junit/spec.xml DOCS_OPTIONS="--json-config-url=/api/versions.json --canonical-base-url=https://crystal-lang.org/api/latest/"'
;;
esac
with_build_env 'make samples'
with_build_env 'CRYSTAL_OPTS=--debug make samples'
}
format() {
with_build_env 'make clean crystal format threads=1 check=1'
}
prepare_build() {
on_linux verify_linux_environment
on_osx curl -L https://github.com/crystal-lang/crystal/releases/download/1.19.1/crystal-1.19.1-1-darwin-universal.tar.gz -o ~/crystal.tar.gz
on_osx 'pushd ~;gunzip -c ~/crystal.tar.gz | tar xopf -;mv crystal-1.19.1-1 crystal;popd'
# These commands may take a few minutes to run due to the large size of the repositories.
# This restriction has been made on GitHub's request because updating shallow
# clones is an extremely expensive operation due to the tree layout and
# traffic of Homebrew/homebrew-core and Homebrew/homebrew-cask. We don't do
# this for you automatically to avoid repeatedly performing an expensive
# unshallow operation in CI systems (which should instead be fixed to not use
# shallow clones). Sorry for the inconvenience!
on_osx git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
on_osx git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask fetch --unshallow
on_osx brew update --preinstall
on_osx brew bundle --no-lock
# Install a recent bash version for nix-shell.
# macos ships with an ancient one.
if [ "$(uname)" = "Darwin" ]; then
on_nix_shell "brew install bash"
fi
# initialize nix environment
on_nix_shell nix-shell
# Note: brew link --force might show:
# Warning: Refusing to link macOS-provided software: llvm
#
# If you need to have llvm first in your PATH run:
# echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.bash_profile
#
# This is added in the .circleci/config.yml
on_tag verify_version
}
verify_version() {
# If building a tag, check it matches with file
FILE_VERSION=$(cat ./src/VERSION)
if [ "$FILE_VERSION" != "$CURRENT_TAG" ]
then
fail "VERSION ($FILE_VERSION) does not match GIT TAG ($CURRENT_TAG)"
fi
}
with_build_env() {
command="$1"
on_github "echo '::group::$1'"
# Ensure non GMT timezone
export TZ="America/New_York"
on_linux verify_linux_environment
export DOCKER_TEST_PREFIX="${DOCKER_TEST_PREFIX:="crystallang/crystal:${CRYSTAL_BOOTSTRAP_VERSION:-1.19.1}"}"
case $ARCH in
aarch64|x86_64)
export DOCKER_TEST_IMAGE="$DOCKER_TEST_PREFIX-build"
;;
aarch64-musl|x86_64-musl)
export DOCKER_TEST_IMAGE="$DOCKER_TEST_PREFIX-alpine-build"
;;
i386)
export DOCKER_TEST_IMAGE="$DOCKER_TEST_PREFIX-i386-build"
;;
esac
on_linux docker run \
--rm -t \
-u "$(id -u)" \
-v "$PWD":/mnt \
-v /etc/passwd:/etc/passwd \
-v /etc/group:/etc/group \
-w /mnt \
-e CRYSTAL_CACHE_DIR="/tmp/crystal" \
-e SPEC_SPLIT_DOTS \
-e USE_PCRE1 \
"$DOCKER_TEST_IMAGE" \
"$ARCH_CMD" /bin/sh -c "'$command'"
on_osx sudo systemsetup -settimezone $TZ
on_osx PATH="~/crystal/bin:\$PATH" \
CRYSTAL_LIBRARY_PATH="~/crystal/embedded/lib" \
CRYSTAL_CACHE_DIR="/tmp/crystal" \
/bin/sh -c "'$command'"
# shellcheck disable=SC2086
on_nix_shell nix-shell --pure $CI_NIX_SHELL_ARGS --run "'TZ=$TZ $command'"
on_github echo "::endgroup::"
}
usage() {
cat <<EOF
bin/ci [-h|--help] command [parameter ...]
Helper script to prepare and run the testsuite on Travis CI.
Commands:
prepare_system setup any necessaries repositories etc.
prepare_build download and extract any dependencies needed for the build
build run specs, build crystal, build samples, build the docs
format build crystal, run format check
with_build_env command run command in the build environment
help display this
EOF
}
command="$1"
shift
case $command in
prepare_system)
prepare_system
;;
prepare_build)
prepare_build
;;
with_build_env)
target_command="${*}"
with_build_env "$target_command"
;;
build)
build
;;
format)
format
;;
-h|--help|help)
usage
;;
*)
if [ -n "$command" ]; then
fail "Unknown command $command"
else
usage
exit 1
fi
;;
esac
================================================
FILE: bin/crystal
================================================
#!/bin/sh
################## https://github.com/mkropat/sh-realpath #####################
#
# The MIT License (MIT)
#
# Copyright (c) 2014 Michael Kropat
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
realpath() {
canonicalize_path "$(resolve_symlinks "$1")"
}
resolve_symlinks() {
_resolve_symlinks "$1"
}
_resolve_symlinks() (
_assert_no_path_cycles "$@" || return
if path=$(readlink -- "$1"); then
dir_context=$(dirname -- "$1")
_resolve_symlinks "$(_prepend_dir_context_if_necessary "$dir_context" "$path")" "$@"
else
printf '%s\n' "$1"
fi
)
_prepend_dir_context_if_necessary() {
if [ "$1" = . ]; then
printf '%s\n' "$2"
else
_prepend_path_if_relative "$1" "$2"
fi
}
_prepend_path_if_relative() {
case "$2" in
/* ) printf '%s\n' "$2" ;;
* ) printf '%s\n' "$1/$2" ;;
esac
}
_assert_no_path_cycles() (
target=$1
shift
for path in "$@"; do
if [ "$path" = "$target" ]; then
return 1
fi
done
)
canonicalize_path() {
if [ -d "$1" ]; then
_canonicalize_dir_path "$1"
else
_canonicalize_file_path "$1"
fi
}
_canonicalize_dir_path() {
{ cd "$1" 2>/dev/null && pwd -P; }
}
_canonicalize_file_path() (
dir=$(dirname -- "$1")
file=$(basename -- "$1")
{ cd "$dir" 2>/dev/null >/dev/null && printf '%s/%s\n' "$(pwd -P)" "$file"; }
)
##############################################################################
# Based on http://stackoverflow.com/q/370047/641451
remove_path_item() (
path="$1"
printf "%s" "$path" | awk -v item="$2" -v RS=: -v ORS=: '$0 != item' | sed 's/:$//'
)
##############################################################################
__has_colors() (
num_colors=$(tput colors 2>/dev/null)
if [ -n "$num_colors" ] && [ "$num_colors" -gt 2 ]; then
return 0
else
return 1
fi
)
__error_msg() {
if __has_colors; then
# bold red coloring
printf '%b\n' "\033[31;1m$*\033[0m" 1>&2
else
printf '%b\n' "$@" 1>&2
fi
}
__warning_msg() {
if __has_colors; then
# brown coloring
printf '%b\n' "\033[33m$*\033[0m" 1>&2
else
printf '%b\n' "$@" 1>&2
fi
}
SCRIPT_PATH="$(realpath "$0")"
SCRIPT_ROOT="$(dirname "$SCRIPT_PATH")"
CRYSTAL_ROOT="$(dirname "$SCRIPT_ROOT")"
CRYSTAL_DIR="$CRYSTAL_ROOT/.build"
export CRYSTAL_PATH="${CRYSTAL_PATH:-./lib:$CRYSTAL_ROOT/src}"
if [ -n "${CRYSTAL_PATH##*"$CRYSTAL_ROOT"/src*}" ]; then
__warning_msg "CRYSTAL_PATH env variable does not contain $CRYSTAL_ROOT/src"
fi
export CRYSTAL_HAS_WRAPPER=true
: "${CRYSTAL=crystal}"
PARENT_CRYSTAL="$CRYSTAL"
# check if the parent crystal command is a path that refers to this script
if [ -z "${PARENT_CRYSTAL##*/*}" ] && [ "$(realpath "$PARENT_CRYSTAL")" = "$SCRIPT_PATH" ]; then
# ignore it and use `crystal` as parent compiler command
PARENT_CRYSTAL="crystal"
fi
# check if the parent crystal command refers to this script
if [ "$(realpath "$(command -v "$PARENT_CRYSTAL" 2> /dev/null)" 2> /dev/null)" = "$SCRIPT_PATH" ]; then
# remove the path to this script from PATH
NEW_PATH="$(remove_path_item "$(remove_path_item "$PATH" "$SCRIPT_ROOT")" "bin")"
# if the PATH did not change it will lead to an infinite recursion => display error
if [ "$NEW_PATH" = "$PATH" ]; then
__error_msg 'Could not remove the script bin/crystal from the PATH. Remove it by hand or set the CRYSTAL env variable'
exit 1
fi
PARENT_CRYSTAL=$(PATH=$NEW_PATH command -v "$PARENT_CRYSTAL" 2> /dev/null)
if [ "$(realpath "$PARENT_CRYSTAL" 2> /dev/null)" = "$SCRIPT_PATH" ]; then
__error_msg 'Could not remove the script bin/crystal from the PATH. Remove it by hand or set the CRYSTAL env variable'
exit 1
fi
fi
command -v "$PARENT_CRYSTAL" > /dev/null 2> /dev/null
PARENT_CRYSTAL_EXISTS=$(test !$?)
if ($PARENT_CRYSTAL_EXISTS); then
if [ -z "$CRYSTAL_CONFIG_LIBRARY_PATH" ] || [ -z "$CRYSTAL_LIBRARY_PATH" ]; then
CRYSTAL_INSTALLED_LIBRARY_PATH="$($PARENT_CRYSTAL env CRYSTAL_LIBRARY_PATH 2> /dev/null || echo "")"
export CRYSTAL_LIBRARY_PATH="${CRYSTAL_LIBRARY_PATH:-$CRYSTAL_INSTALLED_LIBRARY_PATH}"
export CRYSTAL_CONFIG_LIBRARY_PATH="${CRYSTAL_CONFIG_LIBRARY_PATH:-$CRYSTAL_INSTALLED_LIBRARY_PATH}"
fi
fi
# CRYSTAL_PATH has all symlinks resolved. In order to avoid issues with duplicate file
# paths when the working directory is a symlink, we cd into the current directory
# with symlinks resolved as well (see https://github.com/crystal-lang/crystal/issues/12969).
cd "$(realpath "$(pwd)")" || exit
case "$(uname -s)" in
CYGWIN*|MSYS_NT*|MINGW32_NT*|MINGW64_NT*)
CRYSTAL_BIN="crystal.exe"
;;
*)
CRYSTAL_BIN="crystal"
;;
esac
# CRYSTAL_EXEC_PATH determines the location of the `crystal` program for external
# compiler commands.
CRYSTAL_EXEC_PATH="$SCRIPT_ROOT"
export CRYSTAL_EXEC_PATH
if [ -x "$CRYSTAL_DIR/${CRYSTAL_BIN}" ]; then
__warning_msg "Using compiled compiler at ${CRYSTAL_DIR#"$PWD/"}/${CRYSTAL_BIN}"
exec "$CRYSTAL_DIR/${CRYSTAL_BIN}" "$@"
elif (! $PARENT_CRYSTAL_EXISTS); then
__error_msg 'You need to have a crystal executable in your path! or set CRYSTAL env variable'
exit 1
else
exec "$PARENT_CRYSTAL" "$@"
fi
================================================
FILE: bin/crystal.bat
================================================
@echo off
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "%~dp0crystal.ps1" --%% %*
================================================
FILE: bin/crystal.ps1
================================================
param(
[Parameter(Position = 0, ValueFromRemainingArguments)] [string[]] $CrystalArgs
)
# https://www.powershellgallery.com/packages/PowerGit/0.6.1/Content/Functions%5CResolve-RealPath.ps1
function Resolve-RealPath {
<#
.SYNOPSIS
Implementation of Unix realpath().
.PARAMETER Path
Must exist
#>
[CmdletBinding()]
[OutputType([string])]
param(
[Parameter(Position = 0, Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]
[Alias('FullName')]
[string] $Path
)
if ($PSVersionTable.PSVersion.Major -lt 6 -or $IsWindows) {
return [IO.Path]::GetFullPath($Path)
}
[string[]] $parts = ($Path.TrimStart([IO.Path]::DirectorySeparatorChar).Split([IO.Path]::DirectorySeparatorChar))
[string] $realPath = ''
foreach ($part in $parts) {
$realPath += [string] ([IO.Path]::DirectorySeparatorChar + $part)
$item = Get-Item $realPath
if ($item.Target) {
$realPath = $item.Target
}
}
$realPath
}
# adopted from https://stackoverflow.com/a/15669365
function Write-StdErr {
<#
.SYNOPSIS
Writes text to stderr when running in a regular console window,
to the host''s error stream otherwise.
.DESCRIPTION
Writing to true stderr allows you to write a well-behaved CLI
as a PS script that can be invoked from a batch file, for instance.
Note that PS by default sends ALL its streams to *stdout* when invoked from
cmd.exe.
#>
param(
[Parameter(Mandatory)] [string] $Line,
$ForegroundColor
)
if ($Host.Name -eq 'ConsoleHost') {
if ($ForegroundColor) {
[Console]::ForegroundColor = $ForegroundColor
}
[Console]::Error.WriteLine($Line)
if ($ForegroundColor) {
[Console]::ResetColor()
}
} else {
[void] $host.ui.WriteErrorLine($Line)
}
}
# https://stackoverflow.com/a/43030126
function Invoke-WithEnvironment {
<#
.SYNOPSIS
Invokes commands with a temporarily modified environment.
.DESCRIPTION
Modifies environment variables temporarily based on a hashtable of values,
invokes the specified script block, then restores the previous environment.
.PARAMETER Environment
A hashtable that defines the temporary environment-variable values.
Assign $null to (temporarily) remove an environment variable that is
currently set.
.PARAMETER ScriptBlock
The command(s) to execute with the temporarily modified environment.
.EXAMPLE
> Invoke-WithEnvironment @{ PORT=8080 } { node index.js }
Runs node with environment variable PORT temporarily set to 8080, with its
previous value, if any
#>
param(
[Parameter(Mandatory)] [System.Collections.IDictionary] $Environment,
[Parameter(Mandatory)] [scriptblock] $ScriptBlock
)
# Modify the environment based on the hashtable and save the original
# one for later restoration.
$htOrgEnv = @{}
foreach ($kv in $Environment.GetEnumerator()) {
$htOrgEnv[$kv.Key] = (Get-Item -EA SilentlyContinue "env:$($kv.Key)").Value
Set-Item "env:$($kv.Key)" $kv.Value
}
# Invoke the script block
try {
& $ScriptBlock
} finally {
# Restore the original environment.
foreach ($kv in $Environment.GetEnumerator()) {
# Note: setting an environment var. to $null or '' *removes* it.
Set-Item "env:$($kv.Key)" $htOrgEnv[$kv.Key]
}
}
}
# Code ported from:
# https://source.dot.net/#System.Diagnostics.Process/System/Diagnostics/ProcessStartInfo.cs
# https://source.dot.net/#System.Diagnostics.Process/PasteArguments.cs
# Licensed to the .NET Foundation under one or more agreements.
# The .NET Foundation licenses this file to you under the MIT license.
function Append-Argument {
param(
[Parameter(Mandatory)] [Text.StringBuilder] $Builder,
[Parameter(Mandatory)] [AllowEmptyString()] [string] $Arg
)
if (-not $Builder.Length -eq 0) {
[void]$Builder.Append(' ')
}
# Parsing rules for non-argv[0] arguments:
# - Backslash is a normal character except followed by a quote.
# - 2N backslashes followed by a quote ==> N literal backslashes followed by unescaped quote
# - 2N+1 backslashes followed by a quote ==> N literal backslashes followed by a literal quote
# - Parsing stops at first whitespace outside of quoted region.
# - (post 2008 rule): A closing quote followed by another quote ==> literal quote, and parsing remains in quoting mode.
if ((-not $Builder.Length -eq 0) -and (ContainsNoWhitespaceOrQuotes $Arg)) {
# Simple case - no quoting or changes needed.
[void]$Builder.Append($Arg)
} else {
[void]$Builder.Append('"')
$idx = 0
while ($idx -lt $Arg.Length) {
$c = $Arg[$idx++]
if ($c -eq '\') {
$numBackSlash = 1
while (($idx -lt $Arg.Length) -and ($Arg[$idx] -eq '\')) {
$idx++
$numBackslash++
}
if ($idx -eq $Arg.Length) {
# We'll emit an end quote after this so must double the number of backslashes.
[void]$Builder.Append('\', $numBackSlash * 2)
} elseif ($Arg[$idx] -eq '"') {
# Backslashes will be followed by a quote. Must double the number of backslashes.
[void]$Builder.Append('\', $numBackSlash * 2 + 1)
[void]$Builder.Append('"')
$idx++
} else {
# Backslash will not be followed by a quote, so emit as normal characters.
[void]$Builder.Append('\', $numBackSlash)
}
continue
}
if ($c -eq '"') {
# Escape the quote so it appears as a literal. This also guarantees that we won't end up generating a closing quote followed
# by another quote (which parses differently pre-2008 vs. post-2008.)
[void]$Builder.Append('\')
[void]$Builder.Append('"')
continue
}
[void]$Builder.Append($c)
}
[void]$Builder.Append('"')
}
}
function ContainsNoWhitespaceOrQuotes {
param(
[Parameter(Mandatory)] [AllowEmptyString()] [string] $s
)
for ($i = 0; $i -lt $s.Length; $i += 1) {
$c = $s[$i]
if ([char]::IsWhiteSpace($c) -or ($c -eq '"')) {
return $False
}
}
$True
}
function Build-Arguments {
param(
[Parameter(Mandatory)] [AllowEmptyString()] [AllowNull()] [string[]] $Args
)
if ($Args.count -eq 0) { return '' }
$Builder =
gitextract_6d0b5p8f/
├── .ameba.yml
├── .circleci/
│ └── config.yml
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.md
│ │ ├── config.yml
│ │ ├── discussion.md
│ │ └── feature-request.md
│ ├── PULL_REQUEST_TEMPLATE/
│ │ └── pull_request_template.md
│ ├── actionlint.yaml
│ ├── renovate.json
│ ├── workflows/
│ │ ├── aarch64.yml
│ │ ├── backport.yml
│ │ ├── docs.yml
│ │ ├── forward-compatibility.yml
│ │ ├── interpreter.yml
│ │ ├── lint.yml
│ │ ├── linux.yml
│ │ ├── llvm.yml
│ │ ├── macos.yml
│ │ ├── mingw-w64-steps.yml
│ │ ├── mingw-w64.yml
│ │ ├── openssl.yml
│ │ ├── regex-engine.yml
│ │ ├── smoke.yml
│ │ ├── update-devenv.yml
│ │ ├── wasm32.yml
│ │ ├── win.yml
│ │ ├── win_build_portable.yml
│ │ └── xml.yml
│ └── zizmor.yml
├── .gitignore
├── .mailmap
├── .markdownlint.yaml
├── .markdownlintignore
├── .well-known/
│ └── funding-manifest-urls
├── Brewfile
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── LICENSES/
│ ├── Apache-2.0.txt
│ ├── MIT.txt
│ └── Swift-exception.txt
├── Makefile
├── Makefile.win
├── NOTICE.md
├── README.md
├── REUSE.toml
├── SECURITY.md
├── UPGRADING.md
├── _typos.toml
├── bin/
│ ├── check-compiler-flag
│ ├── ci
│ ├── crystal
│ ├── crystal.bat
│ └── crystal.ps1
├── devenv.nix
├── devenv.yaml
├── doc/
│ ├── changelogs/
│ │ ├── README.md
│ │ ├── pre-1.0.md
│ │ ├── v1.0.md
│ │ ├── v1.1.md
│ │ ├── v1.10.md
│ │ ├── v1.11.md
│ │ ├── v1.12.md
│ │ ├── v1.13.md
│ │ ├── v1.14.md
│ │ ├── v1.15.md
│ │ ├── v1.16.md
│ │ ├── v1.17.md
│ │ ├── v1.18.md
│ │ ├── v1.19.md
│ │ ├── v1.2.md
│ │ ├── v1.3.md
│ │ ├── v1.4.md
│ │ ├── v1.5.md
│ │ ├── v1.6.md
│ │ ├── v1.7.md
│ │ ├── v1.8.md
│ │ └── v1.9.md
│ └── man/
│ ├── crystal-build.adoc
│ ├── crystal-docs.adoc
│ ├── crystal-env.adoc
│ ├── crystal-eval.adoc
│ ├── crystal-init.adoc
│ ├── crystal-play.adoc
│ ├── crystal-run.adoc
│ ├── crystal-spec.adoc
│ ├── crystal-tool-dependencies.adoc
│ ├── crystal-tool-format.adoc
│ ├── crystal-tool-macro_code_coverage.adoc
│ ├── crystal-tool-unreachable.adoc
│ └── crystal.adoc
├── etc/
│ ├── completion.bash
│ ├── completion.fish
│ ├── completion.zsh
│ ├── gdb/
│ │ └── crystal_formatters.py
│ ├── lldb/
│ │ └── crystal_formatters.py
│ ├── msvc/
│ │ └── crystal.natvis
│ └── win-ci/
│ ├── build-ffi.ps1
│ ├── build-gc.ps1
│ ├── build-iconv.ps1
│ ├── build-llvm.ps1
│ ├── build-mpir.ps1
│ ├── build-openssl.ps1
│ ├── build-pcre.ps1
│ ├── build-pcre2.ps1
│ ├── build-xml2.ps1
│ ├── build-yaml.ps1
│ ├── build-z.ps1
│ ├── crystal.iss
│ ├── cygwin-build-iconv.sh
│ └── setup.ps1
├── lib/
│ └── .shards.info
├── man/
│ └── crystal.1
├── samples/
│ ├── 2048.cr
│ ├── Makefile
│ ├── Makefile.win
│ ├── binary-trees.cr
│ ├── brainfuck.cr
│ ├── channel_primes.cr
│ ├── channel_select.cr
│ ├── compiler/
│ │ ├── formatter_example.cr
│ │ ├── transformer_example.cr
│ │ └── visitor_example.cr
│ ├── conway.cr
│ ├── degree_days.cr
│ ├── egrep.cr
│ ├── fannkuch-redux.cr
│ ├── fibonacci.cr
│ ├── havlak.cr
│ ├── http_server.cr
│ ├── impl.cr
│ ├── llvm/
│ │ └── brainfuck.cr
│ ├── mandelbrot.cr
│ ├── mandelbrot2.cr
│ ├── matmul.cr
│ ├── meteor.cr
│ ├── mt_gc_test.cr
│ ├── nbodies.cr
│ ├── neural_net.cr
│ ├── noise.cr
│ ├── pig.cr
│ ├── pretty_json.cr
│ ├── quine.cr
│ ├── red_black_tree.cr
│ ├── sdl/
│ │ ├── fire.cr
│ │ ├── fire.txt
│ │ ├── raytracer.cr
│ │ ├── sdl/
│ │ │ ├── lib_sdl.cr
│ │ │ ├── sdl.cr
│ │ │ └── surface.cr
│ │ ├── tv.cr
│ │ └── tv.txt
│ ├── sieve.cr
│ ├── spectral-norm.cr
│ ├── sudoku.cr
│ ├── tcp_client.cr
│ ├── tcp_server.cr
│ ├── text_raytracer.cr
│ ├── tree.cr
│ └── wordcount.cr
├── scripts/
│ ├── docs-versions.sh
│ ├── generate_data.mk
│ ├── generate_glob_specs.sh
│ ├── generate_grapheme_break_specs.cr
│ ├── generate_grapheme_properties.cr
│ ├── generate_html_entities.cr
│ ├── generate_llvm_version_info.cr
│ ├── generate_object_properties.cr
│ ├── generate_ssl_server_defaults.cr
│ ├── generate_unicode_data.cr
│ ├── generate_windows_zone_names.cr
│ ├── git/
│ │ └── pre-commit
│ ├── github-changelog.cr
│ ├── grapheme_properties.ecr
│ ├── html_entities.ecr
│ ├── print_regex_config.cr
│ ├── release-update.sh
│ ├── test_ssl_server.cr
│ ├── unicode_data.ecr
│ ├── update-changelog.sh
│ ├── update-distribution-scripts.sh
│ ├── update-shards.sh
│ └── windows_zone_names.ecr
├── shard.yml
├── shell.nix
├── spec/
│ ├── all_spec.cr
│ ├── compiler/
│ │ ├── codegen/
│ │ │ ├── abi/
│ │ │ │ ├── aarch64_spec.cr
│ │ │ │ ├── arm_spec.cr
│ │ │ │ ├── avr_spec.cr
│ │ │ │ ├── x86_64_spec.cr
│ │ │ │ └── x86_spec.cr
│ │ │ ├── alias_spec.cr
│ │ │ ├── and_spec.cr
│ │ │ ├── array_literal_spec.cr
│ │ │ ├── asm_spec.cr
│ │ │ ├── automatic_cast_spec.cr
│ │ │ ├── block_spec.cr
│ │ │ ├── c_abi/
│ │ │ │ ├── c_abi_spec.cr
│ │ │ │ └── c_abi_x86_64_spec.cr
│ │ │ ├── c_enum_spec.cr
│ │ │ ├── c_struct_spec.cr
│ │ │ ├── c_union_spec.cr
│ │ │ ├── case_spec.cr
│ │ │ ├── cast_spec.cr
│ │ │ ├── class_spec.cr
│ │ │ ├── class_var_spec.cr
│ │ │ ├── closure_spec.cr
│ │ │ ├── const_spec.cr
│ │ │ ├── debug_spec.cr
│ │ │ ├── def_default_value_spec.cr
│ │ │ ├── def_spec.cr
│ │ │ ├── double_splat_spec.cr
│ │ │ ├── enum_spec.cr
│ │ │ ├── exception_spec.cr
│ │ │ ├── experimental_spec.cr
│ │ │ ├── extern_spec.cr
│ │ │ ├── fun_spec.cr
│ │ │ ├── generic_class_spec.cr
│ │ │ ├── hash_literal_spec.cr
│ │ │ ├── hooks_spec.cr
│ │ │ ├── if_spec.cr
│ │ │ ├── is_a_spec.cr
│ │ │ ├── lib_spec.cr
│ │ │ ├── macro_spec.cr
│ │ │ ├── magic_constants_spec.cr
│ │ │ ├── method_missing_spec.cr
│ │ │ ├── module_spec.cr
│ │ │ ├── multi_assign_spec.cr
│ │ │ ├── named_args_spec.cr
│ │ │ ├── named_tuple_spec.cr
│ │ │ ├── new_spec.cr
│ │ │ ├── next_spec.cr
│ │ │ ├── nilable_cast_spec.cr
│ │ │ ├── no_return_spec.cr
│ │ │ ├── not_spec.cr
│ │ │ ├── offsetof_spec.cr
│ │ │ ├── op_assign_spec.cr
│ │ │ ├── or_spec.cr
│ │ │ ├── pointer_spec.cr
│ │ │ ├── previous_def_spec.cr
│ │ │ ├── primitives_spec.cr
│ │ │ ├── private_spec.cr
│ │ │ ├── proc_spec.cr
│ │ │ ├── regex_literal_spec.cr
│ │ │ ├── responds_to_spec.cr
│ │ │ ├── return_spec.cr
│ │ │ ├── sizeof_spec.cr
│ │ │ ├── special_vars_spec.cr
│ │ │ ├── splat_spec.cr
│ │ │ ├── ssa_spec.cr
│ │ │ ├── struct_spec.cr
│ │ │ ├── super_spec.cr
│ │ │ ├── target_spec.cr
│ │ │ ├── thread_local_spec.cr
│ │ │ ├── tuple_spec.cr
│ │ │ ├── type_declaration_spec.cr
│ │ │ ├── uninitialized_spec.cr
│ │ │ ├── union_type_spec.cr
│ │ │ ├── until_spec.cr
│ │ │ ├── var_spec.cr
│ │ │ ├── virtual_spec.cr
│ │ │ ├── void_spec.cr
│ │ │ ├── while_spec.cr
│ │ │ └── yield_with_scope_spec.cr
│ │ ├── compiler_spec.cr
│ │ ├── config_spec.cr
│ │ ├── crystal/
│ │ │ ├── commands/
│ │ │ │ └── clear_cache_spec.cr
│ │ │ ├── tools/
│ │ │ │ ├── context_spec.cr
│ │ │ │ ├── doc/
│ │ │ │ │ ├── directives_spec.cr
│ │ │ │ │ ├── doc_renderer_spec.cr
│ │ │ │ │ ├── generator_spec.cr
│ │ │ │ │ ├── macro_spec.cr
│ │ │ │ │ ├── method_spec.cr
│ │ │ │ │ ├── project_info_spec.cr
│ │ │ │ │ └── type_spec.cr
│ │ │ │ ├── doc_spec.cr
│ │ │ │ ├── expand_spec.cr
│ │ │ │ ├── flags_spec.cr
│ │ │ │ ├── format_spec.cr
│ │ │ │ ├── hierarchy_spec.cr
│ │ │ │ ├── implementations_spec.cr
│ │ │ │ ├── init_spec.cr
│ │ │ │ ├── macro_code_coverage_spec.cr
│ │ │ │ ├── playground_spec.cr
│ │ │ │ ├── repl_spec.cr
│ │ │ │ ├── table_print_spec.cr
│ │ │ │ └── unreachable_spec.cr
│ │ │ └── types_spec.cr
│ │ ├── crystal_path/
│ │ │ └── crystal_path_spec.cr
│ │ ├── data/
│ │ │ ├── args_test
│ │ │ ├── build
│ │ │ ├── compiler_sample
│ │ │ ├── crystal_path/
│ │ │ │ ├── foo.cr/
│ │ │ │ │ └── foo.cr
│ │ │ │ ├── other_test_files/
│ │ │ │ │ └── other_test_files.cr
│ │ │ │ ├── simple.cr
│ │ │ │ └── test_files/
│ │ │ │ ├── file_one.cr
│ │ │ │ ├── file_two.cr
│ │ │ │ ├── src/
│ │ │ │ │ ├── file_three.cr
│ │ │ │ │ ├── test_files/
│ │ │ │ │ │ ├── another/
│ │ │ │ │ │ │ └── another.cr
│ │ │ │ │ │ └── file_four.cr
│ │ │ │ │ ├── test_files.cr
│ │ │ │ │ └── yet_another/
│ │ │ │ │ └── yet_another.cr
│ │ │ │ └── test_folder/
│ │ │ │ ├── file_three.cr
│ │ │ │ ├── not_a_crystal_file.txt
│ │ │ │ └── test_folder.cr
│ │ │ ├── ffi/
│ │ │ │ └── sum.c
│ │ │ ├── interpreter/
│ │ │ │ └── sum.c
│ │ │ ├── loader/
│ │ │ │ ├── bar.c
│ │ │ │ ├── foo.c
│ │ │ │ └── foo2.c
│ │ │ └── visibility.h
│ │ ├── ffi/
│ │ │ └── ffi_spec.cr
│ │ ├── formatter/
│ │ │ └── formatter_spec.cr
│ │ ├── interpreter/
│ │ │ ├── autocast_spec.cr
│ │ │ ├── blocks_spec.cr
│ │ │ ├── bugs_spec.cr
│ │ │ ├── calls_spec.cr
│ │ │ ├── casts_spec.cr
│ │ │ ├── class_vars_spec.cr
│ │ │ ├── classes_spec.cr
│ │ │ ├── closures_spec.cr
│ │ │ ├── constants_spec.cr
│ │ │ ├── control_flow_spec.cr
│ │ │ ├── enum_spec.cr
│ │ │ ├── exceptions_spec.cr
│ │ │ ├── extern_spec.cr
│ │ │ ├── integration_spec.cr
│ │ │ ├── is_a_spec.cr
│ │ │ ├── lib_spec.cr
│ │ │ ├── multidispatch_spec.cr
│ │ │ ├── named_tuple_spec.cr
│ │ │ ├── pointers_spec.cr
│ │ │ ├── primitives_spec.cr
│ │ │ ├── procs_spec.cr
│ │ │ ├── responds_to_spec.cr
│ │ │ ├── sizeof_spec.cr
│ │ │ ├── spec_helper.cr
│ │ │ ├── special_vars_spec.cr
│ │ │ ├── structs_spec.cr
│ │ │ ├── symbol_spec.cr
│ │ │ ├── tuple_spec.cr
│ │ │ ├── typeof_spec.cr
│ │ │ ├── types_spec.cr
│ │ │ └── unions_spec.cr
│ │ ├── interpreter_spec.cr
│ │ ├── lexer/
│ │ │ ├── lexer_comment_spec.cr
│ │ │ ├── lexer_doc_spec.cr
│ │ │ ├── lexer_macro_spec.cr
│ │ │ ├── lexer_objects/
│ │ │ │ └── strings.cr
│ │ │ ├── lexer_spec.cr
│ │ │ ├── lexer_string_array_spec.cr
│ │ │ ├── lexer_string_spec.cr
│ │ │ └── location_spec.cr
│ │ ├── loader/
│ │ │ ├── msvc_spec.cr
│ │ │ ├── spec_helper.cr
│ │ │ └── unix_spec.cr
│ │ ├── macro/
│ │ │ ├── macro_expander_spec.cr
│ │ │ └── macro_methods_spec.cr
│ │ ├── normalize/
│ │ │ ├── and_spec.cr
│ │ │ ├── array_literal_spec.cr
│ │ │ ├── block_spec.cr
│ │ │ ├── case_spec.cr
│ │ │ ├── chained_comparisons_spec.cr
│ │ │ ├── def_spec.cr
│ │ │ ├── expressions_spec.cr
│ │ │ ├── hash_literal_spec.cr
│ │ │ ├── multi_assign_spec.cr
│ │ │ ├── op_assign_spec.cr
│ │ │ ├── or_spec.cr
│ │ │ ├── proc_pointer_spec.cr
│ │ │ ├── range_literal_spec.cr
│ │ │ ├── regex_spec.cr
│ │ │ ├── return_next_break_spec.cr
│ │ │ ├── select_spec.cr
│ │ │ ├── string_interpolation_spec.cr
│ │ │ ├── unless_spec.cr
│ │ │ └── until_spec.cr
│ │ ├── parser/
│ │ │ ├── parser_doc_spec.cr
│ │ │ ├── parser_spec.cr
│ │ │ ├── to_s_spec.cr
│ │ │ └── warnings_spec.cr
│ │ ├── semantic/
│ │ │ ├── abstract_def_spec.cr
│ │ │ ├── alias_spec.cr
│ │ │ ├── annotation_spec.cr
│ │ │ ├── array_spec.cr
│ │ │ ├── automatic_cast_spec.cr
│ │ │ ├── block_spec.cr
│ │ │ ├── c_enum_spec.cr
│ │ │ ├── c_struct_spec.cr
│ │ │ ├── c_type_spec.cr
│ │ │ ├── c_union_spec.cr
│ │ │ ├── call_error_spec.cr
│ │ │ ├── case_spec.cr
│ │ │ ├── cast_spec.cr
│ │ │ ├── class_spec.cr
│ │ │ ├── class_var_spec.cr
│ │ │ ├── cleanup_spec.cr
│ │ │ ├── closure_spec.cr
│ │ │ ├── concrete_types_spec.cr
│ │ │ ├── const_spec.cr
│ │ │ ├── def_overload_spec.cr
│ │ │ ├── def_spec.cr
│ │ │ ├── did_you_mean_spec.cr
│ │ │ ├── doc_spec.cr
│ │ │ ├── double_splat_spec.cr
│ │ │ ├── enum_spec.cr
│ │ │ ├── exception_spec.cr
│ │ │ ├── extern_spec.cr
│ │ │ ├── external_internal_spec.cr
│ │ │ ├── fun_spec.cr
│ │ │ ├── generic_class_spec.cr
│ │ │ ├── hooks_spec.cr
│ │ │ ├── if_spec.cr
│ │ │ ├── initialize_spec.cr
│ │ │ ├── instance_var_spec.cr
│ │ │ ├── is_a_spec.cr
│ │ │ ├── lib_spec.cr
│ │ │ ├── macro_overload_spec.cr
│ │ │ ├── macro_spec.cr
│ │ │ ├── metaclass_spec.cr
│ │ │ ├── method_missing_spec.cr
│ │ │ ├── module_spec.cr
│ │ │ ├── multi_assign_spec.cr
│ │ │ ├── named_args_spec.cr
│ │ │ ├── named_tuple_spec.cr
│ │ │ ├── new_spec.cr
│ │ │ ├── nil_spec.cr
│ │ │ ├── nilable_cast_spec.cr
│ │ │ ├── nilable_instance_var_spec.cr
│ │ │ ├── no_return_spec.cr
│ │ │ ├── not_spec.cr
│ │ │ ├── offsetof_spec.cr
│ │ │ ├── pointer_spec.cr
│ │ │ ├── previous_def_spec.cr
│ │ │ ├── primitives_spec.cr
│ │ │ ├── private_spec.cr
│ │ │ ├── proc_spec.cr
│ │ │ ├── recursive_struct_check_spec.cr
│ │ │ ├── reference_storage_spec.cr
│ │ │ ├── require_spec.cr
│ │ │ ├── responds_to_spec.cr
│ │ │ ├── restrictions_augmenter_spec.cr
│ │ │ ├── restrictions_spec.cr
│ │ │ ├── return_spec.cr
│ │ │ ├── sizeof_spec.cr
│ │ │ ├── special_vars_spec.cr
│ │ │ ├── splat_spec.cr
│ │ │ ├── ssa_spec.cr
│ │ │ ├── static_array_spec.cr
│ │ │ ├── struct_spec.cr
│ │ │ ├── super_spec.cr
│ │ │ ├── tuple_spec.cr
│ │ │ ├── uninitialized_spec.cr
│ │ │ ├── union_spec.cr
│ │ │ ├── var_spec.cr
│ │ │ ├── virtual_metaclass_spec.cr
│ │ │ ├── virtual_spec.cr
│ │ │ ├── visibility_modifiers_spec.cr
│ │ │ ├── warnings_spec.cr
│ │ │ ├── while_spec.cr
│ │ │ └── yield_with_scope_spec.cr
│ │ ├── spec_helper.cr
│ │ └── util_spec.cr
│ ├── compiler_spec.cr
│ ├── debug/
│ │ ├── arrays.cr
│ │ ├── blocks.cr
│ │ ├── driver.cr
│ │ ├── extern_unions.cr
│ │ ├── large_enums.cr
│ │ ├── strings.cr
│ │ ├── test.sh
│ │ └── top_level.cr
│ ├── generate_wasm32_spec.sh
│ ├── llvm-ir/
│ │ ├── argless-initialize-debug-loc.cr
│ │ ├── assign-unions.cr
│ │ ├── cast-unions.cr
│ │ ├── class-var-read-debug-loc.cr
│ │ ├── const-read-debug-loc.cr
│ │ ├── memcpy.cr
│ │ ├── memset.cr
│ │ ├── pass-closure-to-c-debug-loc.cr
│ │ ├── proc-call-debug-loc.cr
│ │ ├── proc-pointer-debug-loc.cr
│ │ ├── test.sh
│ │ ├── virtual-class-var-read-debug-loc.cr
│ │ └── virtual-metaclass-var-read-debug-loc.cr
│ ├── manual/
│ │ ├── badssl_spec.cr
│ │ ├── digest_large_file_spec.cr
│ │ ├── find_executable_spec.cr
│ │ ├── gzip_large_file_spec.cr
│ │ ├── hash_large_spec.cr
│ │ ├── https_client_spec.cr
│ │ ├── string_normalize_spec.cr
│ │ ├── string_to_f32_spec.cr
│ │ └── string_to_f_supplemental_spec.cr
│ ├── primitives/
│ │ ├── external_command_spec.cr
│ │ ├── float_spec.cr
│ │ ├── int_spec.cr
│ │ ├── pointer_spec.cr
│ │ ├── reference_spec.cr
│ │ ├── slice_spec.cr
│ │ └── struct_spec.cr
│ ├── primitives_spec.cr
│ ├── spec_helper.cr
│ ├── std/
│ │ ├── array_spec.cr
│ │ ├── atomic_spec.cr
│ │ ├── base64_spec.cr
│ │ ├── benchmark_spec.cr
│ │ ├── big/
│ │ │ ├── big_decimal_spec.cr
│ │ │ ├── big_float_spec.cr
│ │ │ ├── big_int_spec.cr
│ │ │ ├── big_rational_spec.cr
│ │ │ └── number_spec.cr
│ │ ├── bit_array_spec.cr
│ │ ├── bool_spec.cr
│ │ ├── box_spec.cr
│ │ ├── channel_spec.cr
│ │ ├── char/
│ │ │ └── reader_spec.cr
│ │ ├── char_spec.cr
│ │ ├── class_spec.cr
│ │ ├── colorize_spec.cr
│ │ ├── comparable_spec.cr
│ │ ├── complex_spec.cr
│ │ ├── compress/
│ │ │ ├── deflate/
│ │ │ │ └── deflate_spec.cr
│ │ │ ├── gzip/
│ │ │ │ └── gzip_spec.cr
│ │ │ ├── zip/
│ │ │ │ ├── zip_file_spec.cr
│ │ │ │ └── zip_spec.cr
│ │ │ └── zlib/
│ │ │ ├── reader_spec.cr
│ │ │ ├── stress_spec.cr
│ │ │ └── writer_spec.cr
│ │ ├── concurrent/
│ │ │ └── select_spec.cr
│ │ ├── concurrent_spec.cr
│ │ ├── crypto/
│ │ │ ├── bcrypt/
│ │ │ │ ├── base64_spec.cr
│ │ │ │ └── password_spec.cr
│ │ │ ├── bcrypt_spec.cr
│ │ │ ├── blowfish_spec.cr
│ │ │ └── subtle_spec.cr
│ │ ├── crystal/
│ │ │ ├── compiler_rt/
│ │ │ │ ├── ashlti3_spec.cr
│ │ │ │ ├── ashrti3_spec.cr
│ │ │ │ ├── divmod128_spec.cr
│ │ │ │ ├── fixint_spec.cr
│ │ │ │ ├── float_spec.cr
│ │ │ │ ├── lshrti3_spec.cr
│ │ │ │ ├── mulodi4_spec.cr
│ │ │ │ ├── mulosi4_spec.cr
│ │ │ │ ├── muloti4_spec.cr
│ │ │ │ ├── multi3_spec.cr
│ │ │ │ ├── powidf2_spec.cr
│ │ │ │ ├── powisf2_spec.cr
│ │ │ │ └── spec_helper.cr
│ │ │ ├── digest/
│ │ │ │ ├── md5_spec.cr
│ │ │ │ └── sha1_spec.cr
│ │ │ ├── event_loop/
│ │ │ │ ├── polling/
│ │ │ │ │ ├── arena_spec.cr
│ │ │ │ │ ├── poll_descriptor_spec.cr
│ │ │ │ │ └── waiters_spec.cr
│ │ │ │ └── timers_spec.cr
│ │ │ ├── fd_lock_spec.cr
│ │ │ ├── hasher_spec.cr
│ │ │ ├── pointer_linked_list_spec.cr
│ │ │ ├── pointer_pairing_heap_spec.cr
│ │ │ ├── syntax_highlighter/
│ │ │ │ ├── colorize_spec.cr
│ │ │ │ └── html_spec.cr
│ │ │ ├── system/
│ │ │ │ └── cpucount_spec.cr
│ │ │ └── system_spec.cr
│ │ ├── csv/
│ │ │ ├── csv_build_spec.cr
│ │ │ ├── csv_lex_spec.cr
│ │ │ ├── csv_parse_spec.cr
│ │ │ └── csv_spec.cr
│ │ ├── data/
│ │ │ ├── android_tzdata
│ │ │ ├── argf_test_file_1.txt
│ │ │ ├── argf_test_file_2.txt
│ │ │ ├── argf_test_file_3.xml
│ │ │ ├── backtrace_sample
│ │ │ ├── blank_test_file.txt
│ │ │ ├── cipher_spec.ciphertext
│ │ │ ├── collect_within_ensure
│ │ │ ├── crash_backtrace_sample
│ │ │ ├── dir/
│ │ │ │ ├── dots/
│ │ │ │ │ ├── .dot.hidden
│ │ │ │ │ └── .hidden/
│ │ │ │ │ └── f1.txt
│ │ │ │ ├── f1.txt
│ │ │ │ ├── f2.txt
│ │ │ │ ├── f3.txx
│ │ │ │ ├── g2.txt
│ │ │ │ ├── subdir/
│ │ │ │ │ ├── f1.txt
│ │ │ │ │ └── subdir2/
│ │ │ │ │ └── f2.txt
│ │ │ │ └── subdir2/
│ │ │ │ └── .gitkeep
│ │ │ ├── exception_backtrace_sample
│ │ │ ├── io_data_incomplete_multibyte_sequence.txt
│ │ │ ├── io_data_incomplete_multibyte_sequence_2.txt
│ │ │ ├── large_single_line_string.txt
│ │ │ ├── mime.types
│ │ │ ├── openssl/
│ │ │ │ ├── openssl.crt
│ │ │ │ └── openssl.key
│ │ │ ├── static_file_handler/
│ │ │ │ ├── empty.txt
│ │ │ │ ├── foo/
│ │ │ │ │ └── bar.txt
│ │ │ │ ├── range.txt
│ │ │ │ └── test.txt
│ │ │ ├── test_file.ini
│ │ │ ├── test_file.txt
│ │ │ ├── test_template.ecr
│ │ │ ├── test_template2.ecr
│ │ │ ├── test_template3.ecr
│ │ │ ├── test_template4.ecr
│ │ │ ├── test_template5.ecr
│ │ │ ├── test_template6.ecr
│ │ │ ├── test_template7.ecr
│ │ │ └── zoneinfo/
│ │ │ └── Foo/
│ │ │ ├── Bar
│ │ │ └── invalid
│ │ ├── deque_spec.cr
│ │ ├── digest/
│ │ │ ├── adler32_spec.cr
│ │ │ ├── crc32_spec.cr
│ │ │ ├── io_digest_spec.cr
│ │ │ ├── md5_spec.cr
│ │ │ ├── sha1_spec.cr
│ │ │ ├── sha256_spec.cr
│ │ │ ├── sha512_spec.cr
│ │ │ └── spec_helper.cr
│ │ ├── dir_spec.cr
│ │ ├── double_spec.cr
│ │ ├── ecr/
│ │ │ ├── ecr_lexer_spec.cr
│ │ │ └── ecr_spec.cr
│ │ ├── enum_spec.cr
│ │ ├── enumerable_spec.cr
│ │ ├── env_spec.cr
│ │ ├── errno_spec.cr
│ │ ├── exception/
│ │ │ └── call_stack_spec.cr
│ │ ├── exception_spec.cr
│ │ ├── fiber/
│ │ │ ├── execution_context/
│ │ │ │ ├── global_queue_spec.cr
│ │ │ │ ├── parallel_spec.cr
│ │ │ │ ├── runnables_spec.cr
│ │ │ │ └── spec_helper.cr
│ │ │ └── list_spec.cr
│ │ ├── fiber_spec.cr
│ │ ├── file/
│ │ │ ├── match-fast-glob_spec.cr
│ │ │ ├── match_spec.cr
│ │ │ └── tempfile_spec.cr
│ │ ├── file_spec.cr
│ │ ├── file_utils_spec.cr
│ │ ├── float_printer/
│ │ │ ├── diy_fp_spec.cr
│ │ │ ├── grisu3_spec.cr
│ │ │ ├── hexfloat_spec.cr
│ │ │ ├── ieee_spec.cr
│ │ │ ├── ryu_printf_spec.cr
│ │ │ ├── ryu_printf_test_cases.cr
│ │ │ └── shortest_spec.cr
│ │ ├── float_spec.cr
│ │ ├── gc_spec.cr
│ │ ├── hash_spec.cr
│ │ ├── html_spec.cr
│ │ ├── http/
│ │ │ ├── chunked_content_spec.cr
│ │ │ ├── client/
│ │ │ │ ├── client_spec.cr
│ │ │ │ └── response_spec.cr
│ │ │ ├── cookie_spec.cr
│ │ │ ├── cookies_spec.cr
│ │ │ ├── formdata/
│ │ │ │ ├── builder_spec.cr
│ │ │ │ └── parser_spec.cr
│ │ │ ├── formdata_spec.cr
│ │ │ ├── headers_spec.cr
│ │ │ ├── http_spec.cr
│ │ │ ├── params_spec.cr
│ │ │ ├── request_spec.cr
│ │ │ ├── server/
│ │ │ │ ├── handlers/
│ │ │ │ │ ├── compress_handler_spec.cr
│ │ │ │ │ ├── error_handler_spec.cr
│ │ │ │ │ ├── handler_spec.cr
│ │ │ │ │ ├── log_handler_spec.cr
│ │ │ │ │ ├── static_file_handler_spec.cr
│ │ │ │ │ └── websocket_handler_spec.cr
│ │ │ │ ├── request_processor_spec.cr
│ │ │ │ ├── response_spec.cr
│ │ │ │ └── server_spec.cr
│ │ │ ├── spec_helper.cr
│ │ │ ├── status_spec.cr
│ │ │ └── web_socket_spec.cr
│ │ ├── humanize_spec.cr
│ │ ├── indexable/
│ │ │ └── mutable_spec.cr
│ │ ├── indexable_spec.cr
│ │ ├── ini_spec.cr
│ │ ├── int_spec.cr
│ │ ├── io/
│ │ │ ├── argf_spec.cr
│ │ │ ├── buffered_spec.cr
│ │ │ ├── byte_format_spec.cr
│ │ │ ├── delimited_spec.cr
│ │ │ ├── file_descriptor_spec.cr
│ │ │ ├── hexdump_spec.cr
│ │ │ ├── io_spec.cr
│ │ │ ├── memory_spec.cr
│ │ │ ├── multi_writer_spec.cr
│ │ │ ├── sized_spec.cr
│ │ │ └── stapled_spec.cr
│ │ ├── iterator_spec.cr
│ │ ├── json/
│ │ │ ├── any_spec.cr
│ │ │ ├── builder_spec.cr
│ │ │ ├── lexer_spec.cr
│ │ │ ├── parser_spec.cr
│ │ │ ├── pull_parser_spec.cr
│ │ │ ├── serializable_spec.cr
│ │ │ └── serialization_spec.cr
│ │ ├── kernel_spec.cr
│ │ ├── levenshtein_spec.cr
│ │ ├── llvm/
│ │ │ ├── llvm_spec.cr
│ │ │ └── type_spec.cr
│ │ ├── log/
│ │ │ ├── broadcast_backend_spec.cr
│ │ │ ├── builder_spec.cr
│ │ │ ├── context_spec.cr
│ │ │ ├── dispatch_spec.cr
│ │ │ ├── env_config_spec.cr
│ │ │ ├── format_spec.cr
│ │ │ ├── io_backend_spec.cr
│ │ │ ├── log_spec.cr
│ │ │ ├── main_spec.cr
│ │ │ ├── metadata_spec.cr
│ │ │ └── spec_spec.cr
│ │ ├── math_spec.cr
│ │ ├── mime/
│ │ │ ├── media_type_spec.cr
│ │ │ ├── multipart/
│ │ │ │ ├── builder_spec.cr
│ │ │ │ └── parser_spec.cr
│ │ │ └── multipart_spec.cr
│ │ ├── mime_spec.cr
│ │ ├── mutex_spec.cr
│ │ ├── named_tuple_spec.cr
│ │ ├── number_spec.cr
│ │ ├── oauth/
│ │ │ ├── access_token_spec.cr
│ │ │ ├── authorization_header_spec.cr
│ │ │ ├── consumer_spec.cr
│ │ │ ├── request_token_spec.cr
│ │ │ └── signature_spec.cr
│ │ ├── oauth2/
│ │ │ ├── access_token_spec.cr
│ │ │ ├── client_spec.cr
│ │ │ └── session_spec.cr
│ │ ├── object_spec.cr
│ │ ├── openssl/
│ │ │ ├── cipher_spec.cr
│ │ │ ├── digest_spec.cr
│ │ │ ├── hmac_spec.cr
│ │ │ ├── pkcs5_spec.cr
│ │ │ ├── ssl/
│ │ │ │ ├── context_spec.cr
│ │ │ │ ├── hostname_validation_spec.cr
│ │ │ │ ├── server_spec.cr
│ │ │ │ └── socket_spec.cr
│ │ │ └── x509/
│ │ │ ├── certificate_spec.cr
│ │ │ └── name_spec.cr
│ │ ├── option_parser_spec.cr
│ │ ├── path_spec.cr
│ │ ├── pointer/
│ │ │ └── appender_spec.cr
│ │ ├── pointer_spec.cr
│ │ ├── pp_spec.cr
│ │ ├── pretty_print_spec.cr
│ │ ├── proc_spec.cr
│ │ ├── process/
│ │ │ ├── exit_reason_spec.cr
│ │ │ ├── find_executable_spec.cr
│ │ │ ├── status_spec.cr
│ │ │ └── utils_spec.cr
│ │ ├── process_spec.cr
│ │ ├── raise_spec.cr
│ │ ├── random/
│ │ │ ├── isaac_spec.cr
│ │ │ ├── pcg32_spec.cr
│ │ │ └── secure_spec.cr
│ │ ├── random_spec.cr
│ │ ├── range_spec.cr
│ │ ├── record_spec.cr
│ │ ├── reference_spec.cr
│ │ ├── regex/
│ │ │ └── match_data_spec.cr
│ │ ├── regex_spec.cr
│ │ ├── semantic_version_spec.cr
│ │ ├── set_spec.cr
│ │ ├── signal_spec.cr
│ │ ├── slice_spec.cr
│ │ ├── socket/
│ │ │ ├── address_spec.cr
│ │ │ ├── addrinfo_spec.cr
│ │ │ ├── socket_spec.cr
│ │ │ ├── spec_helper.cr
│ │ │ ├── tcp_server_spec.cr
│ │ │ ├── tcp_socket_spec.cr
│ │ │ ├── udp_socket_spec.cr
│ │ │ ├── unix_server_spec.cr
│ │ │ └── unix_socket_spec.cr
│ │ ├── spec/
│ │ │ ├── context_spec.cr
│ │ │ ├── expectations_spec.cr
│ │ │ ├── filters_spec.cr
│ │ │ ├── helpers/
│ │ │ │ └── iterate_spec.cr
│ │ │ ├── hooks_spec.cr
│ │ │ ├── junit_formatter_spec.cr
│ │ │ ├── list_tags_spec.cr
│ │ │ ├── spec_helper.cr
│ │ │ └── tap_formatter_spec.cr
│ │ ├── spec_helper.cr
│ │ ├── spec_spec.cr
│ │ ├── sprintf_spec.cr
│ │ ├── static_array_spec.cr
│ │ ├── string/
│ │ │ ├── grapheme_break_spec.cr
│ │ │ ├── grapheme_spec.cr
│ │ │ ├── spec_helper.cr
│ │ │ └── utf16_spec.cr
│ │ ├── string_builder_spec.cr
│ │ ├── string_pool_spec.cr
│ │ ├── string_scanner_spec.cr
│ │ ├── string_spec.cr
│ │ ├── struct_spec.cr
│ │ ├── symbol_spec.cr
│ │ ├── sync/
│ │ │ ├── condition_variable_spec.cr
│ │ │ ├── exclusive_spec.cr
│ │ │ ├── mutex_spec.cr
│ │ │ ├── rw_lock_spec.cr
│ │ │ ├── shared_spec.cr
│ │ │ └── spec_helper.cr
│ │ ├── syscall_spec.cr
│ │ ├── system/
│ │ │ ├── group_spec.cr
│ │ │ └── user_spec.cr
│ │ ├── system_error_spec.cr
│ │ ├── system_spec.cr
│ │ ├── thread/
│ │ │ ├── condition_variable_spec.cr
│ │ │ └── mutex_spec.cr
│ │ ├── thread_spec.cr
│ │ ├── time/
│ │ │ ├── custom_formats_spec.cr
│ │ │ ├── format_spec.cr
│ │ │ ├── instant_spec.cr
│ │ │ ├── location_spec.cr
│ │ │ ├── span_spec.cr
│ │ │ └── time_spec.cr
│ │ ├── tuple_spec.cr
│ │ ├── uint_spec.cr
│ │ ├── uri/
│ │ │ ├── json_spec.cr
│ │ │ ├── params/
│ │ │ │ ├── from_www_form_spec.cr
│ │ │ │ ├── serializable_spec.cr
│ │ │ │ └── to_www_form_spec.cr
│ │ │ ├── params_spec.cr
│ │ │ └── punycode_spec.cr
│ │ ├── uri_spec.cr
│ │ ├── uuid/
│ │ │ ├── json_spec.cr
│ │ │ └── yaml_spec.cr
│ │ ├── uuid_spec.cr
│ │ ├── va_list_spec.cr
│ │ ├── wait_group_spec.cr
│ │ ├── weak_ref_spec.cr
│ │ ├── winerror_spec.cr
│ │ ├── xml/
│ │ │ ├── builder_spec.cr
│ │ │ ├── html_spec.cr
│ │ │ ├── reader_spec.cr
│ │ │ ├── xml_spec.cr
│ │ │ └── xpath_spec.cr
│ │ └── yaml/
│ │ ├── any_spec.cr
│ │ ├── builder_spec.cr
│ │ ├── nodes/
│ │ │ ├── builder_spec.cr
│ │ │ └── parser_spec.cr
│ │ ├── schema/
│ │ │ ├── core_spec.cr
│ │ │ └── fail_safe_spec.cr
│ │ ├── serializable_spec.cr
│ │ ├── serialization_spec.cr
│ │ ├── yaml_pull_parser_spec.cr
│ │ └── yaml_spec.cr
│ ├── std_spec.cr
│ ├── support/
│ │ ├── channel.cr
│ │ ├── env.cr
│ │ ├── fibers.cr
│ │ ├── finalize.cr
│ │ ├── interpreted.cr
│ │ ├── io.cr
│ │ ├── mt_abort_timeout.cr
│ │ ├── number.cr
│ │ ├── retry.cr
│ │ ├── ssl.cr
│ │ ├── string.cr
│ │ ├── syntax.cr
│ │ ├── tempfile.cr
│ │ ├── thread.cr
│ │ ├── time.cr
│ │ ├── wait_for.cr
│ │ ├── wasm32.cr
│ │ └── win32.cr
│ ├── syntax_spec.cr
│ └── wasm32_std_spec.cr
└── src/
├── VERSION
├── annotations.cr
├── array.cr
├── atomic.cr
├── base64.cr
├── benchmark/
│ ├── bm.cr
│ └── ips.cr
├── benchmark.cr
├── big/
│ ├── big_decimal.cr
│ ├── big_float.cr
│ ├── big_int.cr
│ ├── big_rational.cr
│ ├── json.cr
│ ├── lib_gmp.cr
│ ├── number.cr
│ └── yaml.cr
├── big.cr
├── bit_array.cr
├── bool.cr
├── box.cr
├── channel/
│ ├── select/
│ │ ├── select_action.cr
│ │ └── timeout_action.cr
│ └── select.cr
├── channel.cr
├── char/
│ └── reader.cr
├── char.cr
├── class.cr
├── colorize.cr
├── comparable.cr
├── compiler/
│ ├── crystal/
│ │ ├── annotatable.cr
│ │ ├── codegen/
│ │ │ ├── abi/
│ │ │ │ ├── aarch64.cr
│ │ │ │ ├── arm.cr
│ │ │ │ ├── avr.cr
│ │ │ │ ├── wasm32.cr
│ │ │ │ ├── x86.cr
│ │ │ │ ├── x86_64.cr
│ │ │ │ └── x86_win64.cr
│ │ │ ├── abi.cr
│ │ │ ├── asm.cr
│ │ │ ├── ast.cr
│ │ │ ├── cache_dir.cr
│ │ │ ├── call.cr
│ │ │ ├── cast.cr
│ │ │ ├── class_var.cr
│ │ │ ├── codegen.cr
│ │ │ ├── cond.cr
│ │ │ ├── const.cr
│ │ │ ├── context.cr
│ │ │ ├── crystal_llvm_builder.cr
│ │ │ ├── debug.cr
│ │ │ ├── dump_type_info.cr
│ │ │ ├── exception.cr
│ │ │ ├── experimental.cr
│ │ │ ├── fun.cr
│ │ │ ├── link.cr
│ │ │ ├── llvm_builder_helper.cr
│ │ │ ├── llvm_id.cr
│ │ │ ├── llvm_typer.cr
│ │ │ ├── match.cr
│ │ │ ├── once.cr
│ │ │ ├── phi.cr
│ │ │ ├── primitives.cr
│ │ │ ├── target.cr
│ │ │ ├── type_id.cr
│ │ │ ├── types.cr
│ │ │ └── unions.cr
│ │ ├── command/
│ │ │ ├── clear_cache.cr
│ │ │ ├── cursor.cr
│ │ │ ├── docs.cr
│ │ │ ├── env.cr
│ │ │ ├── eval.cr
│ │ │ ├── format.cr
│ │ │ ├── playground.cr
│ │ │ ├── repl.cr
│ │ │ └── spec.cr
│ │ ├── command.cr
│ │ ├── compiler.cr
│ │ ├── config.cr
│ │ ├── crystal_path.cr
│ │ ├── error.cr
│ │ ├── exception.cr
│ │ ├── ffi/
│ │ │ ├── call_interface.cr
│ │ │ ├── closure.cr
│ │ │ ├── ffi.cr
│ │ │ ├── lib_ffi.cr
│ │ │ └── type.cr
│ │ ├── formatter.cr
│ │ ├── interpreter/
│ │ │ ├── c.cr
│ │ │ ├── cast.cr
│ │ │ ├── class_vars.cr
│ │ │ ├── closure.cr
│ │ │ ├── closure_context.cr
│ │ │ ├── compiled_block.cr
│ │ │ ├── compiled_def.cr
│ │ │ ├── compiled_instructions.cr
│ │ │ ├── compiler.cr
│ │ │ ├── constants.cr
│ │ │ ├── context.cr
│ │ │ ├── debug.cr
│ │ │ ├── disassembler.cr
│ │ │ ├── escaping_exception.cr
│ │ │ ├── ffi_closure_context.cr
│ │ │ ├── instruction.cr
│ │ │ ├── instructions.cr
│ │ │ ├── interpreter.cr
│ │ │ ├── lib_function.cr
│ │ │ ├── local_vars.cr
│ │ │ ├── local_vars_gatherer.cr
│ │ │ ├── multidispatch.cr
│ │ │ ├── op_code.cr
│ │ │ ├── primitives.cr
│ │ │ ├── pry_reader.cr
│ │ │ ├── repl.cr
│ │ │ ├── repl_reader.cr
│ │ │ ├── to_bool.cr
│ │ │ └── value.cr
│ │ ├── interpreter.cr
│ │ ├── loader/
│ │ │ ├── mingw.cr
│ │ │ ├── msvc.cr
│ │ │ └── unix.cr
│ │ ├── loader.cr
│ │ ├── macros/
│ │ │ ├── interpreter.cr
│ │ │ ├── macros.cr
│ │ │ ├── methods.cr
│ │ │ └── types.cr
│ │ ├── macros.cr
│ │ ├── program.cr
│ │ ├── progress_tracker.cr
│ │ ├── semantic/
│ │ │ ├── abstract_def_checker.cr
│ │ │ ├── ast.cr
│ │ │ ├── bindings.cr
│ │ │ ├── call.cr
│ │ │ ├── call_error.cr
│ │ │ ├── class_vars_initializer_visitor.cr
│ │ │ ├── cleanup_transformer.cr
│ │ │ ├── conversions.cr
│ │ │ ├── cover.cr
│ │ │ ├── default_arguments.cr
│ │ │ ├── exception.cr
│ │ │ ├── exhaustiveness_checker.cr
│ │ │ ├── filters.cr
│ │ │ ├── fix_missing_types.cr
│ │ │ ├── flags.cr
│ │ │ ├── hooks.cr
│ │ │ ├── instance_vars_initializer_visitor.cr
│ │ │ ├── lib.cr
│ │ │ ├── literal_expander.cr
│ │ │ ├── main_visitor.cr
│ │ │ ├── match.cr
│ │ │ ├── math_interpreter.cr
│ │ │ ├── method_lookup.cr
│ │ │ ├── method_missing.cr
│ │ │ ├── new.cr
│ │ │ ├── normalizer.cr
│ │ │ ├── path_lookup.cr
│ │ │ ├── recursive_struct_checker.cr
│ │ │ ├── restrictions.cr
│ │ │ ├── restrictions_augmenter.cr
│ │ │ ├── semantic_visitor.cr
│ │ │ ├── suggestions.cr
│ │ │ ├── to_s.cr
│ │ │ ├── top_level_visitor.cr
│ │ │ ├── transformer.cr
│ │ │ ├── type_declaration_processor.cr
│ │ │ ├── type_declaration_visitor.cr
│ │ │ ├── type_guess_visitor.cr
│ │ │ ├── type_intersect.cr
│ │ │ ├── type_lookup.cr
│ │ │ ├── type_merge.cr
│ │ │ ├── type_to_restriction.cr
│ │ │ └── warnings.cr
│ │ ├── semantic.cr
│ │ ├── syntax/
│ │ │ ├── ast.cr
│ │ │ ├── exception.cr
│ │ │ ├── lexer.cr
│ │ │ ├── location.cr
│ │ │ ├── parser.cr
│ │ │ ├── to_s.cr
│ │ │ ├── token.cr
│ │ │ ├── transformer.cr
│ │ │ ├── virtual_file.cr
│ │ │ └── visitor.cr
│ │ ├── syntax.cr
│ │ ├── tools/
│ │ │ ├── context.cr
│ │ │ ├── dependencies.cr
│ │ │ ├── doc/
│ │ │ │ ├── constant.cr
│ │ │ │ ├── generator.cr
│ │ │ │ ├── html/
│ │ │ │ │ ├── 404.html
│ │ │ │ │ ├── _head.html
│ │ │ │ │ ├── _list_items.html
│ │ │ │ │ ├── _macros_inherited.html
│ │ │ │ │ ├── _method_detail.html
│ │ │ │ │ ├── _method_summary.html
│ │ │ │ │ ├── _methods_inherited.html
│ │ │ │ │ ├── _other_types.html
│ │ │ │ │ ├── _sidebar.html
│ │ │ │ │ ├── css/
│ │ │ │ │ │ └── style.css
│ │ │ │ │ ├── js/
│ │ │ │ │ │ ├── _navigator.js
│ │ │ │ │ │ ├── _search.js
│ │ │ │ │ │ ├── _usage-modal.js
│ │ │ │ │ │ ├── _versions.js
│ │ │ │ │ │ └── doc.js
│ │ │ │ │ ├── main.html
│ │ │ │ │ ├── sitemap.xml
│ │ │ │ │ └── type.html
│ │ │ │ ├── item.cr
│ │ │ │ ├── macro.cr
│ │ │ │ ├── main.cr
│ │ │ │ ├── markd_doc_renderer.cr
│ │ │ │ ├── method.cr
│ │ │ │ ├── project_info.cr
│ │ │ │ ├── relative_location.cr
│ │ │ │ ├── templates.cr
│ │ │ │ ├── to_json.cr
│ │ │ │ └── type.cr
│ │ │ ├── doc.cr
│ │ │ ├── expand.cr
│ │ │ ├── flags.cr
│ │ │ ├── formatter.cr
│ │ │ ├── git.cr
│ │ │ ├── implementations.cr
│ │ │ ├── init/
│ │ │ │ └── template/
│ │ │ │ ├── editorconfig.ecr
│ │ │ │ ├── example.cr.ecr
│ │ │ │ ├── example_spec.cr.ecr
│ │ │ │ ├── gitignore.ecr
│ │ │ │ ├── license.ecr
│ │ │ │ ├── readme.md.ecr
│ │ │ │ ├── shard.yml.ecr
│ │ │ │ └── spec_helper.cr.ecr
│ │ │ ├── init.cr
│ │ │ ├── macro_code_coverage.cr
│ │ │ ├── playground/
│ │ │ │ ├── agent.cr
│ │ │ │ ├── agent_instrumentor_transformer.cr
│ │ │ │ ├── public/
│ │ │ │ │ ├── application.css
│ │ │ │ │ ├── application.js
│ │ │ │ │ ├── session.js
│ │ │ │ │ ├── settings.js
│ │ │ │ │ └── vendor/
│ │ │ │ │ ├── REUSE.toml
│ │ │ │ │ ├── ansi_up-1.3.0/
│ │ │ │ │ │ ├── ansi_up.js
│ │ │ │ │ │ └── theme.css
│ │ │ │ │ ├── codemirror-5.38.0/
│ │ │ │ │ │ ├── addon/
│ │ │ │ │ │ │ └── comment/
│ │ │ │ │ │ │ └── comment.js
│ │ │ │ │ │ ├── lib/
│ │ │ │ │ │ │ ├── codemirror.css
│ │ │ │ │ │ │ └── codemirror.js
│ │ │ │ │ │ ├── mode/
│ │ │ │ │ │ │ └── crystal/
│ │ │ │ │ │ │ └── crystal.js
│ │ │ │ │ │ └── theme/
│ │ │ │ │ │ └── neat.css
│ │ │ │ │ └── octicons-19.5.0/
│ │ │ │ │ └── octicons.css
│ │ │ │ ├── server.cr
│ │ │ │ └── views/
│ │ │ │ ├── _about.html
│ │ │ │ ├── _index.html
│ │ │ │ ├── _settings.html
│ │ │ │ ├── _workbook.html.ecr
│ │ │ │ └── layout.html.ecr
│ │ │ ├── playground.cr
│ │ │ ├── print_hierarchy.cr
│ │ │ ├── print_types_visitor.cr
│ │ │ ├── table_print.cr
│ │ │ ├── typed_def_processor.cr
│ │ │ └── unreachable.cr
│ │ ├── types.cr
│ │ ├── util.cr
│ │ └── warnings.cr
│ ├── crystal.cr
│ └── requires.cr
├── complex.cr
├── compress/
│ ├── deflate/
│ │ ├── deflate.cr
│ │ ├── reader.cr
│ │ └── writer.cr
│ ├── gzip/
│ │ ├── gzip.cr
│ │ ├── header.cr
│ │ ├── reader.cr
│ │ └── writer.cr
│ ├── zip/
│ │ ├── checksum_reader.cr
│ │ ├── checksum_writer.cr
│ │ ├── compression_method.cr
│ │ ├── file.cr
│ │ ├── file_info.cr
│ │ ├── reader.cr
│ │ ├── writer.cr
│ │ └── zip.cr
│ └── zlib/
│ ├── reader.cr
│ ├── writer.cr
│ └── zlib.cr
├── concurrent.cr
├── crypto/
│ ├── bcrypt/
│ │ ├── base64.cr
│ │ ├── blowfish.cr
│ │ └── password.cr
│ ├── bcrypt.cr
│ ├── blowfish.cr
│ └── subtle.cr
├── crystal/
│ ├── at_exit_handlers.cr
│ ├── atomic_semaphore.cr
│ ├── compiler_rt/
│ │ ├── divmod128.cr
│ │ ├── fixint.cr
│ │ ├── float.cr
│ │ ├── mul.cr
│ │ ├── multi3.cr
│ │ ├── pow.cr
│ │ └── shift.cr
│ ├── compiler_rt.cr
│ ├── datum.cr
│ ├── digest/
│ │ ├── md5.cr
│ │ └── sha1.cr
│ ├── dwarf/
│ │ ├── abbrev.cr
│ │ ├── info.cr
│ │ ├── line_numbers.cr
│ │ └── strings.cr
│ ├── dwarf.cr
│ ├── elf.cr
│ ├── event_loop/
│ │ ├── epoll.cr
│ │ ├── file_descriptor.cr
│ │ ├── iocp/
│ │ │ ├── fiber_event.cr
│ │ │ └── timer.cr
│ │ ├── iocp.cr
│ │ ├── kqueue.cr
│ │ ├── libevent/
│ │ │ ├── event.cr
│ │ │ └── lib_event2.cr
│ │ ├── libevent.cr
│ │ ├── lock.cr
│ │ ├── polling/
│ │ │ ├── arena.cr
│ │ │ ├── event.cr
│ │ │ ├── fiber_event.cr
│ │ │ ├── poll_descriptor.cr
│ │ │ └── waiters.cr
│ │ ├── polling.cr
│ │ ├── socket.cr
│ │ ├── timers.cr
│ │ └── wasi.cr
│ ├── event_loop.cr
│ ├── fd_lock.cr
│ ├── hasher.cr
│ ├── iconv.cr
│ ├── interpreter.cr
│ ├── lib_iconv.cr
│ ├── mach_o.cr
│ ├── main.cr
│ ├── once.cr
│ ├── pe.cr
│ ├── pointer_linked_list.cr
│ ├── pointer_pairing_heap.cr
│ ├── print_buffered.cr
│ ├── rw_lock.cr
│ ├── scheduler.cr
│ ├── small_deque.cr
│ ├── spin_lock.cr
│ ├── syntax_highlighter/
│ │ ├── colorize.cr
│ │ └── html.cr
│ ├── syntax_highlighter.cr
│ ├── system/
│ │ ├── addrinfo.cr
│ │ ├── dir.cr
│ │ ├── env.cr
│ │ ├── fiber.cr
│ │ ├── file.cr
│ │ ├── file_descriptor.cr
│ │ ├── file_info.cr
│ │ ├── group.cr
│ │ ├── mime.cr
│ │ ├── panic.cr
│ │ ├── path.cr
│ │ ├── print_error.cr
│ │ ├── process.cr
│ │ ├── random.cr
│ │ ├── signal.cr
│ │ ├── socket.cr
│ │ ├── thread.cr
│ │ ├── thread_condition_variable.cr
│ │ ├── thread_linked_list.cr
│ │ ├── thread_mutex.cr
│ │ ├── thread_wait_group.cr
│ │ ├── time.cr
│ │ ├── unix/
│ │ │ ├── addrinfo.cr
│ │ │ ├── arc4random.cr
│ │ │ ├── dir.cr
│ │ │ ├── env.cr
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── fiber.cr
│ │ │ ├── file.cr
│ │ │ ├── file_descriptor.cr
│ │ │ ├── file_info.cr
│ │ │ ├── getrandom.cr
│ │ │ ├── group.cr
│ │ │ ├── hostname.cr
│ │ │ ├── kqueue.cr
│ │ │ ├── linux_cpucount.cr
│ │ │ ├── main.cr
│ │ │ ├── mime.cr
│ │ │ ├── path.cr
│ │ │ ├── process.cr
│ │ │ ├── pthread.cr
│ │ │ ├── pthread_condition_variable.cr
│ │ │ ├── pthread_mutex.cr
│ │ │ ├── signal.cr
│ │ │ ├── socket.cr
│ │ │ ├── spawn.cr
│ │ │ ├── syscall.cr
│ │ │ ├── sysconf_cpucount.cr
│ │ │ ├── sysctl_cpucount.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── urandom.cr
│ │ │ └── user.cr
│ │ ├── unix.cr
│ │ ├── user.cr
│ │ ├── wasi/
│ │ │ ├── addrinfo.cr
│ │ │ ├── cpucount.cr
│ │ │ ├── dir.cr
│ │ │ ├── fiber.cr
│ │ │ ├── file.cr
│ │ │ ├── file_descriptor.cr
│ │ │ ├── group.cr
│ │ │ ├── hostname.cr
│ │ │ ├── lib_wasi.cr
│ │ │ ├── main.cr
│ │ │ ├── path.cr
│ │ │ ├── process.cr
│ │ │ ├── random.cr
│ │ │ ├── signal.cr
│ │ │ ├── socket.cr
│ │ │ ├── thread.cr
│ │ │ ├── thread_condition_variable.cr
│ │ │ ├── thread_mutex.cr
│ │ │ ├── user.cr
│ │ │ └── wasi.cr
│ │ ├── win32/
│ │ │ ├── addrinfo.cr
│ │ │ ├── addrinfo_win7.cr
│ │ │ ├── cpucount.cr
│ │ │ ├── crypto.cr
│ │ │ ├── dir.cr
│ │ │ ├── env.cr
│ │ │ ├── fiber.cr
│ │ │ ├── file.cr
│ │ │ ├── file_descriptor.cr
│ │ │ ├── file_info.cr
│ │ │ ├── group.cr
│ │ │ ├── hostname.cr
│ │ │ ├── iocp.cr
│ │ │ ├── library_archive.cr
│ │ │ ├── mime.cr
│ │ │ ├── path.cr
│ │ │ ├── process.cr
│ │ │ ├── random.cr
│ │ │ ├── signal.cr
│ │ │ ├── socket.cr
│ │ │ ├── thread.cr
│ │ │ ├── thread_condition_variable.cr
│ │ │ ├── thread_mutex.cr
│ │ │ ├── time.cr
│ │ │ ├── user.cr
│ │ │ ├── visual_studio.cr
│ │ │ ├── waitable_timer.cr
│ │ │ ├── windows_registry.cr
│ │ │ ├── windows_sdk.cr
│ │ │ ├── wmain.cr
│ │ │ └── zone_names.cr
│ │ └── windows.cr
│ ├── system.cr
│ ├── thread_local_value.cr
│ ├── tracing.cr
│ └── value_with_finalizer.cr
├── csv/
│ ├── builder.cr
│ ├── error.cr
│ ├── lexer/
│ │ ├── io_based.cr
│ │ └── string_based.cr
│ ├── lexer.cr
│ ├── parser.cr
│ └── token.cr
├── csv.cr
├── deque.cr
├── digest/
│ ├── adler32.cr
│ ├── crc32.cr
│ ├── digest.cr
│ ├── io_digest.cr
│ ├── md5.cr
│ ├── sha1.cr
│ ├── sha256.cr
│ └── sha512.cr
├── digest.cr
├── dir/
│ └── glob.cr
├── dir.cr
├── docs_main.cr
├── docs_pseudo_methods.cr
├── ecr/
│ ├── lexer.cr
│ ├── macros.cr
│ ├── process.cr
│ └── processor.cr
├── ecr.cr
├── empty.cr
├── enum.cr
├── enumerable.cr
├── env.cr
├── errno.cr
├── exception/
│ ├── call_stack/
│ │ ├── dwarf.cr
│ │ ├── elf.cr
│ │ ├── interpreter.cr
│ │ ├── libunwind.cr
│ │ ├── mach_o.cr
│ │ ├── null.cr
│ │ └── stackwalk.cr
│ ├── call_stack.cr
│ └── lib_unwind.cr
├── exception.cr
├── fiber/
│ ├── context/
│ │ ├── aarch64-generic.cr
│ │ ├── aarch64-microsoft.cr
│ │ ├── arm.cr
│ │ ├── i386.cr
│ │ ├── interpreted.cr
│ │ ├── wasm32.cr
│ │ ├── x86_64-microsoft.cr
│ │ └── x86_64-sysv.cr
│ ├── context.cr
│ ├── execution_context/
│ │ ├── concurrent.cr
│ │ ├── global_queue.cr
│ │ ├── isolated.cr
│ │ ├── monitor.cr
│ │ ├── parallel/
│ │ │ └── scheduler.cr
│ │ ├── parallel.cr
│ │ ├── runnables.cr
│ │ ├── scheduler.cr
│ │ └── thread_pool.cr
│ ├── execution_context.cr
│ ├── list.cr
│ ├── pointer_linked_list_node.cr
│ ├── stack.cr
│ └── stack_pool.cr
├── fiber.cr
├── file/
│ ├── error.cr
│ ├── info.cr
│ ├── match.cr
│ ├── preader.cr
│ └── tempfile.cr
├── file.cr
├── file_utils.cr
├── float/
│ ├── fast_float/
│ │ ├── ascii_number.cr
│ │ ├── bigint.cr
│ │ ├── decimal_to_binary.cr
│ │ ├── digit_comparison.cr
│ │ ├── fast_table.cr
│ │ ├── fast_table_slice_literal.cr
│ │ ├── float_common.cr
│ │ └── parse_number.cr
│ ├── fast_float.cr
│ ├── printer/
│ │ ├── cached_powers.cr
│ │ ├── diy_fp.cr
│ │ ├── dragonbox.cr
│ │ ├── dragonbox_cache.cr
│ │ ├── grisu3.cr
│ │ ├── hexfloat.cr
│ │ ├── ieee.cr
│ │ ├── ryu_printf.cr
│ │ └── ryu_printf_table.cr
│ └── printer.cr
├── float.cr
├── gc/
│ ├── boehm.cr
│ └── none.cr
├── gc.cr
├── hash.cr
├── html/
│ └── entities.cr
├── html.cr
├── http/
│ ├── client/
│ │ └── response.cr
│ ├── client.cr
│ ├── common.cr
│ ├── content.cr
│ ├── cookie.cr
│ ├── cookies.cr
│ ├── formdata/
│ │ ├── builder.cr
│ │ ├── parser.cr
│ │ └── part.cr
│ ├── formdata.cr
│ ├── headers.cr
│ ├── log.cr
│ ├── params.cr
│ ├── request.cr
│ ├── server/
│ │ ├── context.cr
│ │ ├── handler.cr
│ │ ├── handlers/
│ │ │ ├── compress_handler.cr
│ │ │ ├── error_handler.cr
│ │ │ ├── log_handler.cr
│ │ │ ├── static_file_handler.cr
│ │ │ ├── static_file_handler.html
│ │ │ └── websocket_handler.cr
│ │ ├── request_processor.cr
│ │ └── response.cr
│ ├── server.cr
│ ├── status.cr
│ ├── web_socket/
│ │ ├── close_code.cr
│ │ └── protocol.cr
│ └── web_socket.cr
├── http.cr
├── humanize.cr
├── indexable/
│ └── mutable.cr
├── indexable.cr
├── ini.cr
├── int.cr
├── intrinsics.cr
├── io/
│ ├── argf.cr
│ ├── buffered.cr
│ ├── byte_format.cr
│ ├── console.cr
│ ├── delimited.cr
│ ├── encoding.cr
│ ├── encoding_stubs.cr
│ ├── error.cr
│ ├── evented.cr
│ ├── file_descriptor.cr
│ ├── hexdump.cr
│ ├── memory.cr
│ ├── multi_writer.cr
│ ├── sized.cr
│ └── stapled.cr
├── io.cr
├── iterable.cr
├── iterator.cr
├── json/
│ ├── any.cr
│ ├── builder.cr
│ ├── from_json.cr
│ ├── lexer/
│ │ ├── io_based.cr
│ │ └── string_based.cr
│ ├── lexer.cr
│ ├── parser.cr
│ ├── pull_parser.cr
│ ├── serialization.cr
│ ├── to_json.cr
│ └── token.cr
├── json.cr
├── kernel.cr
├── levenshtein.cr
├── lib_c/
│ ├── aarch64-darwin/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── event.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── types.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── aarch64-linux-android/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── ioctl.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── syscall.cr
│ │ │ ├── system_properties.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── aarch64-linux-gnu/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── aarch64-linux-musl/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── arm-linux-gnueabihf/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── i386-linux-gnu/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── i386-linux-musl/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── linux/
│ │ └── tls.cr
│ ├── wasm32-wasi/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── iconv.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── sched.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── file.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── times.cr
│ │ │ └── types.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-darwin/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── event.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── types.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-dragonfly/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── event.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── types.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── sysctl.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-freebsd/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── cpuset.cr
│ │ │ ├── event.cr
│ │ │ ├── file.cr
│ │ │ ├── ktls.cr
│ │ │ ├── mman.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── sysctl.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-linux-gnu/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-linux-musl/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── random.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── uio.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-netbsd/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── event.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── types.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── sysctl.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-openbsd/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── event.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── types.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── sysctl.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ ├── x86_64-solaris/
│ │ └── c/
│ │ ├── arpa/
│ │ │ └── inet.cr
│ │ ├── dirent.cr
│ │ ├── dlfcn.cr
│ │ ├── elf.cr
│ │ ├── errno.cr
│ │ ├── fcntl.cr
│ │ ├── grp.cr
│ │ ├── iconv.cr
│ │ ├── limits.cr
│ │ ├── link.cr
│ │ ├── net/
│ │ │ └── if.cr
│ │ ├── netdb.cr
│ │ ├── netinet/
│ │ │ ├── in.cr
│ │ │ └── tcp.cr
│ │ ├── pthread.cr
│ │ ├── pwd.cr
│ │ ├── sched.cr
│ │ ├── signal.cr
│ │ ├── stdarg.cr
│ │ ├── stddef.cr
│ │ ├── stdint.cr
│ │ ├── stdio.cr
│ │ ├── stdlib.cr
│ │ ├── string.cr
│ │ ├── sys/
│ │ │ ├── epoll.cr
│ │ │ ├── eventfd.cr
│ │ │ ├── file.cr
│ │ │ ├── mman.cr
│ │ │ ├── resource.cr
│ │ │ ├── select.cr
│ │ │ ├── socket.cr
│ │ │ ├── stat.cr
│ │ │ ├── time.cr
│ │ │ ├── timerfd.cr
│ │ │ ├── types.cr
│ │ │ ├── un.cr
│ │ │ └── wait.cr
│ │ ├── termios.cr
│ │ ├── time.cr
│ │ └── unistd.cr
│ └── x86_64-windows-msvc/
│ └── c/
│ ├── afunix.cr
│ ├── basetsd.cr
│ ├── combaseapi.cr
│ ├── consoleapi.cr
│ ├── consoleapi2.cr
│ ├── corecrt.cr
│ ├── dbghelp.cr
│ ├── debugapi.cr
│ ├── delayimp.cr
│ ├── direct.cr
│ ├── errhandlingapi.cr
│ ├── errno.cr
│ ├── fcntl.cr
│ ├── fileapi.cr
│ ├── guiddef.cr
│ ├── handleapi.cr
│ ├── heapapi.cr
│ ├── in6addr.cr
│ ├── inaddr.cr
│ ├── int_safe.cr
│ ├── io.cr
│ ├── ioapiset.cr
│ ├── jobapi2.cr
│ ├── knownfolders.cr
│ ├── libloaderapi.cr
│ ├── lm.cr
│ ├── malloc.cr
│ ├── memoryapi.cr
│ ├── minwinbase.cr
│ ├── mswsock.cr
│ ├── netioapi.cr
│ ├── ntdef.cr
│ ├── ntdll.cr
│ ├── ntifs.cr
│ ├── ntsecapi.cr
│ ├── ntstatus.cr
│ ├── process.cr
│ ├── processenv.cr
│ ├── processthreadsapi.cr
│ ├── profileapi.cr
│ ├── regapix.cr
│ ├── sddl.cr
│ ├── sdkddkver.cr
│ ├── security.cr
│ ├── shlobj_core.cr
│ ├── signal.cr
│ ├── stdarg.cr
│ ├── stddef.cr
│ ├── stdint.cr
│ ├── stdio.cr
│ ├── stdlib.cr
│ ├── string.cr
│ ├── stringapiset.cr
│ ├── synchapi.cr
│ ├── sys/
│ │ ├── stat.cr
│ │ ├── types.cr
│ │ └── utime.cr
│ ├── sysinfoapi.cr
│ ├── timezoneapi.cr
│ ├── tlhelp32.cr
│ ├── userenv.cr
│ ├── wdm.cr
│ ├── win_def.cr
│ ├── winbase.cr
│ ├── wincrypt.cr
│ ├── windows.cr
│ ├── winioctl.cr
│ ├── winnls.cr
│ ├── winnt.cr
│ ├── winreg.cr
│ ├── winsock2.cr
│ ├── winternl.cr
│ ├── ws2def.cr
│ ├── ws2ipdef.cr
│ ├── ws2tcpip.cr
│ └── wtypesbase.cr
├── lib_c.cr
├── lib_z/
│ └── lib_z.cr
├── llvm/
│ ├── abi/
│ │ ├── aarch64.cr
│ │ ├── arm.cr
│ │ ├── avr.cr
│ │ ├── wasm32.cr
│ │ ├── x86.cr
│ │ ├── x86_64.cr
│ │ └── x86_win64.cr
│ ├── abi.cr
│ ├── basic_block.cr
│ ├── basic_block_collection.cr
│ ├── builder.cr
│ ├── context.cr
│ ├── di_builder.cr
│ ├── enums/
│ │ └── atomic.cr
│ ├── enums.cr
│ ├── ext/
│ │ ├── find-llvm-config.sh
│ │ ├── llvm-versions.txt
│ │ └── llvm_ext.cc
│ ├── function.cr
│ ├── function_collection.cr
│ ├── function_pass_manager.cr
│ ├── generic_value.cr
│ ├── global_collection.cr
│ ├── instruction_collection.cr
│ ├── jit_compiler.cr
│ ├── lib_llvm/
│ │ ├── analysis.cr
│ │ ├── bit_reader.cr
│ │ ├── bit_writer.cr
│ │ ├── config.cr
│ │ ├── core.cr
│ │ ├── debug_info.cr
│ │ ├── error.cr
│ │ ├── execution_engine.cr
│ │ ├── initialization.cr
│ │ ├── ir_reader.cr
│ │ ├── lljit.cr
│ │ ├── orc.cr
│ │ ├── support.cr
│ │ ├── target.cr
│ │ ├── target_machine.cr
│ │ ├── transforms/
│ │ │ ├── pass_builder.cr
│ │ │ └── pass_manager_builder.cr
│ │ └── types.cr
│ ├── lib_llvm.cr
│ ├── lib_llvm_ext.cr
│ ├── memory_buffer.cr
│ ├── module.cr
│ ├── module_pass_manager.cr
│ ├── operand_bundle_def.cr
│ ├── orc/
│ │ ├── jit_dylib.cr
│ │ ├── lljit.cr
│ │ ├── lljit_builder.cr
│ │ ├── thread_safe_context.cr
│ │ └── thread_safe_module.cr
│ ├── parameter_collection.cr
│ ├── pass_builder_options.cr
│ ├── pass_manager_builder.cr
│ ├── pass_registry.cr
│ ├── phi_table.cr
│ ├── target.cr
│ ├── target_data.cr
│ ├── target_machine.cr
│ ├── type.cr
│ ├── value.cr
│ └── value_methods.cr
├── llvm.cr
├── log/
│ ├── backend.cr
│ ├── broadcast_backend.cr
│ ├── builder.cr
│ ├── dispatch.cr
│ ├── entry.cr
│ ├── format.cr
│ ├── io_backend.cr
│ ├── json.cr
│ ├── log.cr
│ ├── main.cr
│ ├── memory_backend.cr
│ ├── metadata.cr
│ ├── setup.cr
│ └── spec.cr
├── log.cr
├── macros.cr
├── math/
│ ├── libm.cr
│ └── math.cr
├── mime/
│ ├── media_type.cr
│ ├── multipart/
│ │ ├── builder.cr
│ │ ├── parser.cr
│ │ └── state.cr
│ └── multipart.cr
├── mime.cr
├── mutex.cr
├── named_tuple.cr
├── nil.cr
├── number.cr
├── oauth/
│ ├── access_token.cr
│ ├── authorization_header.cr
│ ├── consumer.cr
│ ├── error.cr
│ ├── oauth.cr
│ ├── request_token.cr
│ └── signature.cr
├── oauth.cr
├── oauth2/
│ ├── access_token/
│ │ ├── access_token.cr
│ │ ├── bearer.cr
│ │ └── mac.cr
│ ├── auth_scheme.cr
│ ├── client.cr
│ ├── error.cr
│ ├── error_response.cr
│ ├── oauth2.cr
│ └── session.cr
├── oauth2.cr
├── object/
│ └── properties.cr
├── object.cr
├── openssl/
│ ├── algorithm.cr
│ ├── bio.cr
│ ├── cipher.cr
│ ├── digest.cr
│ ├── error.cr
│ ├── hmac.cr
│ ├── ktls.cr
│ ├── lib_crypto.cr
│ ├── lib_ssl.cr
│ ├── md5.cr
│ ├── pkcs5.cr
│ ├── sha1.cr
│ ├── ssl/
│ │ ├── context.cr
│ │ ├── defaults.cr
│ │ ├── hostname_validation.cr
│ │ ├── server.cr
│ │ └── socket.cr
│ └── x509/
│ ├── certificate.cr
│ ├── extension.cr
│ ├── name.cr
│ └── x509.cr
├── openssl.cr
├── option_parser.cr
├── path.cr
├── pointer.cr
├── prelude.cr
├── pretty_print.cr
├── primitives.cr
├── proc.cr
├── process/
│ ├── executable_path.cr
│ ├── shell.cr
│ └── status.cr
├── process.cr
├── raise.cr
├── random/
│ ├── isaac.cr
│ ├── pcg32.cr
│ └── secure.cr
├── random.cr
├── range/
│ └── bsearch.cr
├── range.cr
├── reference.cr
├── reference_storage.cr
├── regex/
│ ├── engine.cr
│ ├── lib_pcre.cr
│ ├── lib_pcre2.cr
│ ├── match_data.cr
│ ├── pcre.cr
│ └── pcre2.cr
├── regex.cr
├── semantic_version.cr
├── set.cr
├── signal.cr
├── slice/
│ └── sort.cr
├── slice.cr
├── socket/
│ ├── address.cr
│ ├── addrinfo.cr
│ ├── common.cr
│ ├── ip_socket.cr
│ ├── server.cr
│ ├── tcp_server.cr
│ ├── tcp_socket.cr
│ ├── udp_socket.cr
│ ├── unix_server.cr
│ └── unix_socket.cr
├── socket.cr
├── spec/
│ ├── cli.cr
│ ├── context.cr
│ ├── dsl.cr
│ ├── example/
│ │ └── procsy.cr
│ ├── example.cr
│ ├── example_group/
│ │ └── procsy.cr
│ ├── expectations.cr
│ ├── filters.cr
│ ├── formatter.cr
│ ├── helpers/
│ │ ├── iterate.cr
│ │ └── string.cr
│ ├── item.cr
│ ├── junit_formatter.cr
│ ├── methods.cr
│ ├── source.cr
│ └── tap_formatter.cr
├── spec.cr
├── static_array.cr
├── steppable.cr
├── string/
│ ├── builder.cr
│ ├── formatter.cr
│ ├── grapheme/
│ │ ├── grapheme.cr
│ │ └── properties.cr
│ ├── grapheme.cr
│ └── utf16.cr
├── string.cr
├── string_pool.cr
├── string_scanner.cr
├── struct.cr
├── symbol.cr
├── sync/
│ ├── condition_variable.cr
│ ├── cv.cr
│ ├── errors.cr
│ ├── exclusive.cr
│ ├── lockable.cr
│ ├── mu.cr
│ ├── mutex.cr
│ ├── rw_lock.cr
│ ├── shared.cr
│ ├── sync.cr
│ ├── type.cr
│ └── waiter.cr
├── syscall/
│ ├── aarch64-linux.cr
│ ├── arm-linux.cr
│ ├── i386-linux.cr
│ └── x86_64-linux.cr
├── syscall.cr
├── system/
│ ├── group.cr
│ └── user.cr
├── system.cr
├── system_error.cr
├── termios.cr
├── time/
│ ├── format/
│ │ ├── custom/
│ │ │ ├── http_date.cr
│ │ │ ├── iso_8601.cr
│ │ │ ├── rfc_2822.cr
│ │ │ ├── rfc_3339.cr
│ │ │ └── yaml_date.cr
│ │ ├── formatter.cr
│ │ ├── parser.cr
│ │ └── pattern.cr
│ ├── format.cr
│ ├── instant.cr
│ ├── location/
│ │ └── loader.cr
│ ├── location.cr
│ ├── span.cr
│ └── tz.cr
├── time.cr
├── tuple.cr
├── unicode/
│ ├── data.cr
│ └── unicode.cr
├── union.cr
├── uri/
│ ├── encoding.cr
│ ├── json.cr
│ ├── params/
│ │ ├── from_www_form.cr
│ │ ├── serializable.cr
│ │ └── to_www_form.cr
│ ├── params.cr
│ ├── punycode.cr
│ ├── uri_parser.cr
│ └── yaml.cr
├── uri.cr
├── uuid/
│ ├── json.cr
│ └── yaml.cr
├── uuid.cr
├── va_list.cr
├── value.cr
├── wait_group.cr
├── wasi_error.cr
├── weak_ref.cr
├── winerror.cr
├── xml/
│ ├── attribute_type.cr
│ ├── attributes.cr
│ ├── builder.cr
│ ├── document.cr
│ ├── error.cr
│ ├── html_parser_options.cr
│ ├── libxml2.cr
│ ├── namespace.cr
│ ├── node/
│ │ └── type.cr
│ ├── node.cr
│ ├── node_set.cr
│ ├── parser_options.cr
│ ├── reader/
│ │ └── type.cr
│ ├── reader.cr
│ ├── save_options.cr
│ └── xpath_context.cr
├── xml.cr
├── yaml/
│ ├── any.cr
│ ├── builder.cr
│ ├── enums.cr
│ ├── from_yaml.cr
│ ├── lib_yaml.cr
│ ├── nodes/
│ │ ├── builder.cr
│ │ ├── nodes.cr
│ │ └── parser.cr
│ ├── nodes.cr
│ ├── parse_context.cr
│ ├── parser.cr
│ ├── pull_parser.cr
│ ├── schema/
│ │ ├── core/
│ │ │ └── parser.cr
│ │ ├── core.cr
│ │ └── fail_safe.cr
│ ├── serialization.cr
│ └── to_yaml.cr
└── yaml.cr
SYMBOL INDEX (494 symbols across 19 files)
FILE: etc/gdb/crystal_formatters.py
class CrystalStringPrinter (line 3) | class CrystalStringPrinter:
method __init__ (line 4) | def __init__(self, val):
method to_string (line 7) | def to_string(self):
method display_hint (line 12) | def display_hint(self):
class CrystalArrayPrinter (line 15) | class CrystalArrayPrinter:
method __init__ (line 16) | def __init__(self, val):
method to_string (line 19) | def to_string(self):
method children (line 25) | def children(self):
method display_hint (line 29) | def display_hint(self):
class CrystalReferenceSubPrinter (line 32) | class CrystalReferenceSubPrinter:
method __init__ (line 33) | def __init__(self, name, cls):
method recognize (line 38) | def recognize(self, val):
class CrystalPrettyPrinter (line 49) | class CrystalPrettyPrinter(gdb.printing.PrettyPrinter):
method __init__ (line 50) | def __init__(self):
method __call__ (line 55) | def __call__(self, val):
FILE: etc/lldb/crystal_formatters.py
class CrystalArraySyntheticProvider (line 3) | class CrystalArraySyntheticProvider:
method __init__ (line 4) | def __init__(self, valobj, internal_dict):
method update (line 9) | def update(self):
method num_children (line 16) | def num_children(self):
method get_child_index (line 20) | def get_child_index(self, name):
method get_child_at_index (line 26) | def get_child_at_index(self,index):
function findType (line 37) | def findType(name, module):
function CrystalString_SummaryProvider (line 46) | def CrystalString_SummaryProvider(value, dict):
function __lldb_init_module (line 59) | def __lldb_init_module(debugger, dict):
FILE: spec/compiler/data/ffi/sum.c
function EXPORT (line 8) | EXPORT int64_t answer()
function EXPORT (line 13) | EXPORT int64_t sum(int32_t a, int32_t b, int32_t c)
function EXPORT (line 18) | EXPORT void sum_primitive_types(
type test_struct (line 29) | struct test_struct
function EXPORT (line 40) | EXPORT int64_t sum_struct(struct test_struct s)
function EXPORT (line 47) | EXPORT int64_t sum_array(int32_t ary[4])
function EXPORT (line 57) | EXPORT int64_t sum_variadic(int32_t count, ...)
function test_struct (line 73) | test_struct make_struct(int8_t b, int16_t s, int32_t i, int64_t j, float...
FILE: spec/compiler/data/interpreter/sum.c
function EXPORT (line 4) | EXPORT float sum_float(int count, ...) {
function sum_int (line 17) | EXPORT long sum_int(int count, ...) {
function EXPORT (line 30) | EXPORT int simple_sum_int(int a, int b) {
FILE: spec/compiler/data/loader/bar.c
function LOCAL (line 3) | LOCAL int foo() {
function EXPORT (line 7) | EXPORT int bar() {
FILE: spec/compiler/data/loader/foo.c
function EXPORT (line 3) | EXPORT int foo() {
FILE: spec/compiler/data/loader/foo2.c
function LOCAL (line 3) | LOCAL int a() {
function EXPORT (line 7) | EXPORT int foo() {
FILE: src/compiler/crystal/tools/doc/html/js/_navigator.js
function delayWhileSearching (line 20) | function delayWhileSearching(callback) {
function clearMoveTimeout (line 33) | function clearMoveTimeout() {
function startMoveTimeout (line 38) | function startMoveTimeout(upwards){
function scrollCenter (line 51) | function scrollCenter(element) {
function handleKeyUp (line 109) | function handleKeyUp(event) {
function handleKeyDown (line 126) | function handleKeyDown(event) {
function handleInputKeyUp (line 176) | function handleInputKeyUp(event) {
function handleInputKeyDown (line 186) | function handleInputKeyDown(event) {
FILE: src/compiler/crystal/tools/doc/html/js/_search.js
function searchType (line 5) | function searchType(type, query, results) {
function searchMethod (line 76) | function searchMethod(method, type, kind, query, results) {
function searchConstant (line 122) | function searchConstant(constant, type, query, results) {
function uniqueArray (line 162) | function uniqueArray(ar) {
function sanitize (line 295) | function sanitize(html){
function runMatcher (line 385) | function runMatcher(field, matcher) {
function namespaceMatcher (line 409) | function namespaceMatcher(normalized, term){
function escapeRegExp (line 464) | function escapeRegExp(s) {
function loadJSON (line 516) | function loadJSON(file, callback) {
function loadScript (line 528) | function loadScript(file) {
function parseJSON (line 534) | function parseJSON(json) {
function crystal_doc_search_index_callback (line 557) | function crystal_doc_search_index_callback(data) {
FILE: src/compiler/crystal/tools/doc/html/js/_versions.js
function loadJSON (line 2) | function loadJSON(file, callback) {
function parseJSON (line 14) | function parseJSON(json) {
FILE: src/compiler/crystal/tools/doc/html/js/doc.js
function handleShortkeys (line 156) | function handleShortkeys(event) {
FILE: src/compiler/crystal/tools/playground/public/application.js
function saveAsLastCode (line 38) | function saveAsLastCode() {
function initDemoPlayground (line 118) | function initDemoPlayground(dom) {
FILE: src/compiler/crystal/tools/playground/public/session.js
function ModalDialog (line 15) | function ModalDialog(options) {
function cdiv (line 54) | function cdiv(cssClass) {
function run (line 633) | function run() {
function stop (line 645) | function stop() {
FILE: src/compiler/crystal/tools/playground/public/settings.js
function hasStorage (line 5) | function hasStorage() {
FILE: src/compiler/crystal/tools/playground/public/vendor/ansi_up-1.3.0/ansi_up.js
function Ansi_Up (line 42) | function Ansi_Up() {
FILE: src/compiler/crystal/tools/playground/public/vendor/codemirror-5.38.0/addon/comment/comment.js
function firstNonWS (line 18) | function firstNonWS(str) {
function probablyInsideString (line 48) | function probablyInsideString(cm, pos, line) {
function getMode (line 52) | function getMode(cm, pos) {
FILE: src/compiler/crystal/tools/playground/public/vendor/codemirror-5.38.0/lib/codemirror.js
function classTest (line 50) | function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)...
function removeChildren (line 61) | function removeChildren(e) {
function removeChildrenAndAdd (line 67) | function removeChildrenAndAdd(parent, e) {
function elt (line 71) | function elt(tag, content, className, style) {
function eltP (line 80) | function eltP(tag, content, className, style) {
function contains (line 103) | function contains(parent, child) {
function activeElt (line 114) | function activeElt() {
function addClass (line 129) | function addClass(node, cls) {
function joinClasses (line 133) | function joinClasses(a, b) {
function bind (line 146) | function bind(f) {
function copyObj (line 151) | function copyObj(obj, target, overwrite) {
function countColumn (line 161) | function countColumn(string, end, tabSize, startIndex, startValue) {
function indexOf (line 182) | function indexOf(array, elt) {
function findColumn (line 201) | function findColumn(string, goal, tabSize) {
function spaceStr (line 216) | function spaceStr(n) {
function lst (line 222) | function lst(arr) { return arr[arr.length-1] }
function map (line 224) | function map(array, f) {
function insertSorted (line 230) | function insertSorted(array, value, score) {
function nothing (line 236) | function nothing() {}
function createObj (line 238) | function createObj(base, props) {
function isWordCharBasic (line 251) | function isWordCharBasic(ch) {
function isWordChar (line 255) | function isWordChar(ch, helper) {
function isEmpty (line 261) | function isEmpty(obj) {
function isExtendingChar (line 272) | function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendi...
function skipExtendingChars (line 275) | function skipExtendingChars(str, pos, dir) {
function findFirst (line 283) | function findFirst(pred, from, to) {
function Display (line 300) | function Display(place, doc, input) {
function getLine (line 400) | function getLine(doc, n) {
function getBetween (line 416) | function getBetween(doc, start, end) {
function getLines (line 428) | function getLines(doc, from, to) {
function updateLineHeight (line 436) | function updateLineHeight(line, height) {
function lineNo (line 443) | function lineNo(line) {
function lineAtHeight (line 457) | function lineAtHeight(chunk, h) {
function isLine (line 477) | function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}
function lineNumberFor (line 479) | function lineNumberFor(options, i) {
function Pos (line 484) | function Pos(line, ch, sticky) {
function cmp (line 495) | function cmp(a, b) { return a.line - b.line || a.ch - b.ch }
function equalCursorPos (line 497) | function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b)...
function copyPos (line 499) | function copyPos(x) {return Pos(x.line, x.ch)}
function maxPos (line 500) | function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }
function minPos (line 501) | function minPos(a, b) { return cmp(a, b) < 0 ? a : b }
function clipLine (line 505) | function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.fi...
function clipPos (line 506) | function clipPos(doc, pos) {
function clipToLen (line 512) | function clipToLen(pos, linelen) {
function clipPosArray (line 518) | function clipPosArray(doc, array) {
function seeReadOnlySpans (line 527) | function seeReadOnlySpans() {
function seeCollapsedSpans (line 531) | function seeCollapsedSpans() {
function MarkedSpan (line 537) | function MarkedSpan(marker, from, to) {
function getMarkedSpanFor (line 543) | function getMarkedSpanFor(spans, marker) {
function removeMarkedSpan (line 551) | function removeMarkedSpan(spans, span) {
function addMarkedSpan (line 558) | function addMarkedSpan(line, span) {
function markedSpansBefore (line 567) | function markedSpansBefore(old, startCh, isInsert) {
function markedSpansAfter (line 579) | function markedSpansAfter(old, endCh, isInsert) {
function stretchSpansOverChange (line 599) | function stretchSpansOverChange(doc, change) {
function clearEmptySpans (line 661) | function clearEmptySpans(spans) {
function removeReadOnlyRanges (line 672) | function removeReadOnlyRanges(doc, from, to) {
function detachMarkedSpans (line 701) | function detachMarkedSpans(line) {
function attachMarkedSpans (line 708) | function attachMarkedSpans(line, spans) {
function extraLeft (line 717) | function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }
function extraRight (line 718) | function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }
function compareCollapsedMarkers (line 723) | function compareCollapsedMarkers(a, b) {
function collapsedSpanAtSide (line 736) | function collapsedSpanAtSide(line, start) {
function collapsedSpanAtStart (line 746) | function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, t...
function collapsedSpanAtEnd (line 747) | function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, fal...
function collapsedSpanAround (line 749) | function collapsedSpanAround(line, ch) {
function conflictingCollapsedRange (line 762) | function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
function visualLine (line 782) | function visualLine(line) {
function visualLineEnd (line 789) | function visualLineEnd(line) {
function visualLineContinued (line 798) | function visualLineContinued(line) {
function visualLineNo (line 809) | function visualLineNo(doc, lineN) {
function visualLineEndNo (line 817) | function visualLineEndNo(doc, lineN) {
function lineIsHidden (line 829) | function lineIsHidden(doc, line) {
function lineIsHiddenInner (line 840) | function lineIsHiddenInner(doc, line, span) {
function heightAtLine (line 857) | function heightAtLine(lineObj) {
function lineLength (line 879) | function lineLength(line) {
function findMaxLine (line 898) | function findMaxLine(cm) {
function iterateBidiSections (line 914) | function iterateBidiSections(order, from, to, f) {
function getBidiPartAt (line 928) | function getBidiPartAt(order, ch, sticky) {
function charType (line 974) | function charType(code) {
function BidiSpan (line 987) | function BidiSpan(level, from, to) {
function getOrder (line 1119) | function getOrder(line, direction) {
function getHandlers (line 1143) | function getHandlers(emitter, type) {
function off (line 1147) | function off(emitter, type, f) {
function signal (line 1162) | function signal(emitter, type /*, values...*/) {
function signalDOMEvent (line 1172) | function signalDOMEvent(cm, e, override) {
function signalCursorActivity (line 1179) | function signalCursorActivity(cm) {
function hasHandler (line 1187) | function hasHandler(emitter, type) {
function eventMixin (line 1193) | function eventMixin(ctor) {
function e_preventDefault (line 1201) | function e_preventDefault(e) {
function e_stopPropagation (line 1205) | function e_stopPropagation(e) {
function e_defaultPrevented (line 1209) | function e_defaultPrevented(e) {
function e_stop (line 1212) | function e_stop(e) {e_preventDefault(e); e_stopPropagation(e)}
function e_target (line 1214) | function e_target(e) {return e.target || e.srcElement}
function e_button (line 1215) | function e_button(e) {
function zeroWidthElement (line 1236) | function zeroWidthElement(measure) {
function hasBadBidiRects (line 1251) | function hasBadBidiRects(measure) {
function hasBadZoomedRects (line 1300) | function hasBadZoomedRects(measure) {
function defineMode (line 1313) | function defineMode(name, mode) {
function defineMIME (line 1319) | function defineMIME(mime, spec) {
function resolveMode (line 1325) | function resolveMode(spec) {
function getMode (line 1344) | function getMode(options, spec) {
function extendMode (line 1368) | function extendMode(mode, properties) {
function copyState (line 1373) | function copyState(mode, state) {
function innerMode (line 1387) | function innerMode(mode, state) {
function startState (line 1398) | function startState(mode, a1, a2) {
function highlightLine (line 1542) | function highlightLine(cm, line, context, forceToEnd) {
function getLineStyles (line 1587) | function getLineStyles(cm, line, updateFrontier) {
function getContextBefore (line 1603) | function getContextBefore(cm, n, precise) {
function processLine (line 1623) | function processLine(cm, text, context, startAt) {
function callBlankLine (line 1634) | function callBlankLine(mode, state) {
function readToken (line 1641) | function readToken(mode, stream, state, inner) {
function takeToken (line 1658) | function takeToken(cm, pos, precise, asArray) {
function extractLineClasses (line 1672) | function extractLineClasses(type, output) {
function runMode (line 1687) | function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {
function findStartLine (line 1731) | function findStartLine(cm, n, precise) {
function retreatFrontier (line 1748) | function retreatFrontier(doc, n) {
function updateLine (line 1781) | function updateLine(line, text, markedSpans, estimateHeight) {
function cleanUpLine (line 1793) | function cleanUpLine(line) {
function interpretTokenStyle (line 1803) | function interpretTokenStyle(style, options) {
function buildLineContent (line 1815) | function buildLineContent(cm, lineView) {
function defaultSpecialCharPlaceholder (line 1873) | function defaultSpecialCharPlaceholder(ch) {
function buildToken (line 1882) | function buildToken(builder, text, style, startStyle, endStyle, title, c...
function splitSpaces (line 1944) | function splitSpaces(text, trailingBefore) {
function buildTokenBadBidi (line 1959) | function buildTokenBadBidi(inner, order) {
function buildCollapsedSpan (line 1979) | function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
function insertLineContent (line 1997) | function insertLineContent(line, builder, styles) {
function LineView (line 2069) | function LineView(doc, line, lineN) {
function buildViewArray (line 2081) | function buildViewArray(cm, from, to) {
function pushOperation (line 2093) | function pushOperation(op) {
function fireCallbacksForOps (line 2104) | function fireCallbacksForOps(group) {
function finishOperation (line 2120) | function finishOperation(op, endCb) {
function signalLater (line 2140) | function signalLater(emitter, type /*, values...*/) {
function fireOrphanDelayed (line 2160) | function fireOrphanDelayed() {
function updateLineForChanges (line 2169) | function updateLineForChanges(cm, lineView, lineN, dims) {
function ensureLineWrapped (line 2182) | function ensureLineWrapped(lineView) {
function updateLineBackground (line 2193) | function updateLineBackground(cm, lineView) {
function getLineContent (line 2208) | function getLineContent(cm, lineView) {
function updateLineText (line 2221) | function updateLineText(cm, lineView) {
function updateLineClasses (line 2236) | function updateLineClasses(cm, lineView) {
function updateLineGutter (line 2246) | function updateLineGutter(cm, lineView, lineN, dims) {
function updateLineWidgets (line 2284) | function updateLineWidgets(cm, lineView, dims) {
function buildLineElement (line 2295) | function buildLineElement(cm, lineView, lineN, dims) {
function insertLineWidgets (line 2309) | function insertLineWidgets(cm, lineView, dims) {
function insertLineWidgetsFor (line 2315) | function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
function positionLineWidget (line 2331) | function positionLineWidget(widget, node, lineView, dims) {
function widgetHeight (line 2349) | function widgetHeight(widget) {
function eventInWidget (line 2365) | function eventInWidget(display, e) {
function paddingTop (line 2375) | function paddingTop(display) {return display.lineSpace.offsetTop}
function paddingVert (line 2376) | function paddingVert(display) {return display.mover.offsetHeight - displ...
function paddingH (line 2377) | function paddingH(display) {
function scrollGap (line 2386) | function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }
function displayWidth (line 2387) | function displayWidth(cm) {
function displayHeight (line 2390) | function displayHeight(cm) {
function ensureLineHeights (line 2398) | function ensureLineHeights(cm, lineView, rect) {
function mapFromLineView (line 2419) | function mapFromLineView(lineView, line, lineN) {
function updateExternalMeasurement (line 2432) | function updateExternalMeasurement(cm, line) {
function measureChar (line 2445) | function measureChar(cm, line, ch, bias) {
function findViewForLine (line 2450) | function findViewForLine(cm, lineN) {
function prepareMeasureForLine (line 2463) | function prepareMeasureForLine(cm, line) {
function measureCharPrepared (line 2485) | function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
function nodeAndOffsetInLineMap (line 2507) | function nodeAndOffsetInLineMap(map, ch, bias) {
function getUsefulRect (line 2545) | function getUsefulRect(rects, bias) {
function measureCharInner (line 2555) | function measureCharInner(cm, prepared, ch, bias) {
function maybeUpdateRectForZooming (line 2608) | function maybeUpdateRectForZooming(measure, rect) {
function clearLineMeasurementCacheFor (line 2618) | function clearLineMeasurementCacheFor(lineView) {
function clearLineMeasurementCache (line 2627) | function clearLineMeasurementCache(cm) {
function clearCaches (line 2634) | function clearCaches(cm) {
function pageScrollX (line 2641) | function pageScrollX() {
function pageScrollY (line 2648) | function pageScrollY() {
function widgetTopHeight (line 2653) | function widgetTopHeight(lineObj) {
function intoCoordSystem (line 2664) | function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {
function fromCoordSystem (line 2686) | function fromCoordSystem(cm, coords, context) {
function charCoords (line 2703) | function charCoords(cm, pos, context, lineObj, bias) {
function cursorCoords (line 2724) | function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHei...
function estimateCoords (line 2755) | function estimateCoords(cm, pos) {
function PosWithInfo (line 2770) | function PosWithInfo(line, ch, sticky, outside, xRel) {
function coordsChar (line 2779) | function coordsChar(cm, x, y) {
function wrappedLineExtent (line 2799) | function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {
function wrappedLineExtentChar (line 2807) | function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {
function boxIsAfter (line 2815) | function boxIsAfter(box, x, y, left) {
function coordsCharInner (line 2819) | function coordsCharInner(cm, lineObj, lineNo, x, y) {
function coordsBidiPart (line 2886) | function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, ...
function coordsBidiPartWrapped (line 2910) | function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, or...
function textHeight (line 2945) | function textHeight(display) {
function charWidth (line 2965) | function charWidth(display) {
function getDimensions (line 2977) | function getDimensions(cm) {
function compensateForHScroll (line 2994) | function compensateForHScroll(display) {
function estimateHeight (line 3001) | function estimateHeight(cm) {
function estimateLineHeights (line 3019) | function estimateLineHeights(cm) {
function posFromMouse (line 3032) | function posFromMouse(cm, e, liberal, forRect) {
function findViewIndex (line 3050) | function findViewIndex(cm, n) {
function updateSelection (line 3061) | function updateSelection(cm) {
function prepareSelection (line 3065) | function prepareSelection(cm, primary) {
function drawSelectionCursor (line 3086) | function drawSelectionCursor(cm, head, output) {
function cmpCoords (line 3104) | function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }
function drawSelectionRange (line 3107) | function drawSelectionRange(cm, range, output) {
function restartBlink (line 3200) | function restartBlink(cm) {
function ensureFocus (line 3213) | function ensureFocus(cm) {
function delayBlurEvent (line 3217) | function delayBlurEvent(cm) {
function onFocus (line 3225) | function onFocus(cm, e) {
function onBlur (line 3244) | function onBlur(cm, e) {
function updateHeightsInViewport (line 3258) | function updateHeightsInViewport(cm) {
function updateWidgetHeight (line 3285) | function updateWidgetHeight(line) {
function visibleLines (line 3295) | function visibleLines(display, doc, viewport) {
function alignHorizontally (line 3318) | function alignHorizontally(cm) {
function maybeUpdateLineNumberWidth (line 3341) | function maybeUpdateLineNumberWidth(cm) {
function maybeScrollWindow (line 3363) | function maybeScrollWindow(cm, rect) {
function scrollPosIntoView (line 3380) | function scrollPosIntoView(cm, pos, end, margin) {
function scrollIntoView (line 3414) | function scrollIntoView(cm, rect) {
function calculateScrollPos (line 3424) | function calculateScrollPos(cm, rect) {
function addToScrollTop (line 3454) | function addToScrollTop(cm, top) {
function ensureCursorVisible (line 3462) | function ensureCursorVisible(cm) {
function scrollToCoords (line 3468) | function scrollToCoords(cm, x, y) {
function scrollToRange (line 3474) | function scrollToRange(cm, range) {
function resolveScrollToPos (line 3483) | function resolveScrollToPos(cm) {
function scrollToCoordsRange (line 3492) | function scrollToCoordsRange(cm, from, to, margin) {
function updateScrollTop (line 3504) | function updateScrollTop(cm, val) {
function setScrollTop (line 3512) | function setScrollTop(cm, val, forceScroll) {
function setScrollLeft (line 3522) | function setScrollLeft(cm, val, isScroller, forceScroll) {
function measureForScrollbars (line 3535) | function measureForScrollbars(cm) {
function maybeDisable (line 3627) | function maybeDisable() {
function updateScrollbars (line 3656) | function updateScrollbars(cm, measure) {
function updateScrollbarsInner (line 3670) | function updateScrollbarsInner(cm, measure) {
function initScrollbars (line 3692) | function initScrollbars(cm) {
function startOperation (line 3722) | function startOperation(cm) {
function endOperation (line 3744) | function endOperation(cm) {
function endOperations (line 3755) | function endOperations(group) {
function endOperation_R1 (line 3769) | function endOperation_R1(op) {
function endOperation_W1 (line 3782) | function endOperation_W1(op) {
function endOperation_R2 (line 3786) | function endOperation_R2(op) {
function endOperation_W2 (line 3807) | function endOperation_W2(op) {
function endOperation_finish (line 3832) | function endOperation_finish(op) {
function runInOp (line 3871) | function runInOp(cm, f) {
function operation (line 3878) | function operation(cm, f) {
function methodOp (line 3888) | function methodOp(f) {
function docMethodOp (line 3896) | function docMethodOp(f) {
function regChange (line 3912) | function regChange(cm, from, to, lendiff) {
function regLineChange (line 3977) | function regLineChange(cm, line, type) {
function resetView (line 3991) | function resetView(cm) {
function viewCuttingPoint (line 3997) | function viewCuttingPoint(cm, oldN, newN, dir) {
function adjustView (line 4024) | function adjustView(cm, from, to) {
function countDirtyView (line 4045) | function countDirtyView(cm) {
function startWorker (line 4056) | function startWorker(cm, time) {
function highlightWorker (line 4061) | function highlightWorker(cm) {
function maybeClipScrollbars (line 4131) | function maybeClipScrollbars(cm) {
function selectionSnapshot (line 4142) | function selectionSnapshot(cm) {
function restoreSelection (line 4159) | function restoreSelection(snapshot) {
function updateDisplayIfNeeded (line 4175) | function updateDisplayIfNeeded(cm, update) {
function postUpdateDisplay (line 4247) | function postUpdateDisplay(cm, update) {
function updateDisplaySimple (line 4277) | function updateDisplaySimple(cm, viewport) {
function patchDisplay (line 4294) | function patchDisplay(cm, updateNumbersFrom, dims) {
function updateGutterSpace (line 4336) | function updateGutterSpace(cm) {
function setDocumentHeight (line 4341) | function setDocumentHeight(cm, measure) {
function updateGutters (line 4349) | function updateGutters(cm) {
function setGuttersForLineNumbers (line 4367) | function setGuttersForLineNumbers(options) {
function wheelEventDelta (line 4388) | function wheelEventDelta(e) {
function wheelEventPixels (line 4395) | function wheelEventPixels(e) {
function onScrollWheel (line 4402) | function onScrollWheel(cm, e) {
function normalizeSelection (line 4541) | function normalizeSelection(ranges, primIndex) {
function simpleSelection (line 4557) | function simpleSelection(anchor, head) {
function changeEnd (line 4563) | function changeEnd(change) {
function adjustForChange (line 4571) | function adjustForChange(pos, change) {
function computeSelAfterChange (line 4580) | function computeSelAfterChange(doc, change) {
function offsetPos (line 4590) | function offsetPos(pos, old, nw) {
function computeReplacedSel (line 4599) | function computeReplacedSel(doc, changes, hint) {
function loadMode (line 4620) | function loadMode(cm) {
function resetModeState (line 4625) | function resetModeState(cm) {
function isWholeLineUpdate (line 4641) | function isWholeLineUpdate(doc, change) {
function updateDoc (line 4647) | function updateDoc(doc, change, markedSpans, estimateHeight) {
function linkedDocs (line 4699) | function linkedDocs(doc, f, sharedHistOnly) {
function attachDoc (line 4714) | function attachDoc(cm, doc) {
function setDirectionClass (line 4726) | function setDirectionClass(cm) {
function directionChanged (line 4730) | function directionChanged(cm) {
function History (line 4737) | function History(startGen) {
function historyChangeFromChange (line 4754) | function historyChangeFromChange(doc, change) {
function clearSelectionEvents (line 4763) | function clearSelectionEvents(array) {
function lastChangeEvent (line 4773) | function lastChangeEvent(hist, force) {
function addChangeToHistory (line 4788) | function addChangeToHistory(doc, change, selAfter, opId) {
function selectionEventCanBeMerged (line 4831) | function selectionEventCanBeMerged(doc, origin, prev, sel) {
function addSelectionToHistory (line 4844) | function addSelectionToHistory(doc, sel, opId, options) {
function pushSelectionToHistory (line 4866) | function pushSelectionToHistory(sel, dest) {
function attachLocalSpans (line 4873) | function attachLocalSpans(doc, change, from, to) {
function removeClearedSpans (line 4884) | function removeClearedSpans(spans) {
function getOldSpans (line 4895) | function getOldSpans(doc, change) {
function mergeOldSpans (line 4908) | function mergeOldSpans(doc, change) {
function copyHistoryArray (line 4932) | function copyHistoryArray(events, newGroup, instantiateSel) {
function extendRange (line 4964) | function extendRange(range, head, other, extend) {
function extendSelection (line 4983) | function extendSelection(doc, head, other, options, extend) {
function extendSelections (line 4990) | function extendSelections(doc, heads, options) {
function replaceOneSelection (line 5000) | function replaceOneSelection(doc, i, range, options) {
function setSimpleSelection (line 5007) | function setSimpleSelection(doc, anchor, head, options) {
function filterSelectionChange (line 5013) | function filterSelectionChange(doc, sel, options) {
function setSelectionReplaceHistory (line 5032) | function setSelectionReplaceHistory(doc, sel, options) {
function setSelection (line 5043) | function setSelection(doc, sel, options) {
function setSelectionNoUndo (line 5048) | function setSelectionNoUndo(doc, sel, options) {
function setSelectionInner (line 5060) | function setSelectionInner(doc, sel) {
function reCheckSelection (line 5074) | function reCheckSelection(doc) {
function skipAtomicInSelection (line 5080) | function skipAtomicInSelection(doc, sel, bias, mayClear) {
function skipAtomicInner (line 5095) | function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
function skipAtomic (line 5128) | function skipAtomic(doc, pos, oldPos, bias, mayClear) {
function movePos (line 5141) | function movePos(doc, pos, dir, line) {
function selectAll (line 5153) | function selectAll(cm) {
function filterChange (line 5160) | function filterChange(doc, change, update) {
function makeChange (line 5184) | function makeChange(doc, change, ignoreReadOnly) {
function makeChangeInner (line 5206) | function makeChangeInner(doc, change) {
function makeChangeFromHistory (line 5224) | function makeChangeFromHistory(doc, type, allowSelectionOnly) {
function shiftDoc (line 5300) | function shiftDoc(doc, distance) {
function makeChangeSingleDoc (line 5316) | function makeChangeSingleDoc(doc, change, selAfter, spans) {
function makeChangeSingleDocInEditor (line 5349) | function makeChangeSingleDocInEditor(cm, change, spans) {
function replaceRange (line 5407) | function replaceRange(doc, code, from, to, origin) {
function rebaseHistSelSingle (line 5417) | function rebaseHistSelSingle(pos, from, to, diff) {
function rebaseHistArray (line 5433) | function rebaseHistArray(array, from, to, diff) {
function rebaseHist (line 5461) | function rebaseHist(hist, change) {
function changeLine (line 5470) | function changeLine(doc, handle, changeType, op) {
function LeafChunk (line 5492) | function LeafChunk(lines) {
function BranchChunk (line 5545) | function BranchChunk(children) {
function adjustScrollWhenAboveVisible (line 5708) | function adjustScrollWhenAboveVisible(cm, line, diff) {
function addLineWidget (line 5713) | function addLineWidget(doc, handle, node, options) {
function markText (line 5873) | function markText(doc, from, to, options, type) {
function markTextShared (line 5971) | function markTextShared(doc, from, to, options, type) {
function findSharedMarkers (line 5986) | function findSharedMarkers(doc) {
function copySharedMarkers (line 5990) | function copySharedMarkers(doc, markers) {
function detachSharedMarkers (line 6002) | function detachSharedMarkers(markers) {
function onDrop (line 6444) | function onDrop(e) {
function onDragStart (line 6504) | function onDragStart(cm, e) {
function onDragOver (line 6527) | function onDragOver(cm, e) {
function clearDragCursor (line 6539) | function clearDragCursor(cm) {
function forEachCodeMirror (line 6550) | function forEachCodeMirror(f) {
function ensureGlobalHandlers (line 6560) | function ensureGlobalHandlers() {
function registerGlobalHandlers (line 6565) | function registerGlobalHandlers() {
function onResize (line 6578) | function onResize(cm) {
function normalizeKeyName (line 6651) | function normalizeKeyName(name) {
function normalizeKeyMap (line 6675) | function normalizeKeyMap(keymap) {
function lookupKey (line 6702) | function lookupKey(key, map, handle, context) {
function isModifierKey (line 6721) | function isModifierKey(value) {
function addModifierNames (line 6726) | function addModifierNames(name, event, noShift) {
function keyName (line 6736) | function keyName(event, noShift) {
function getKeyMap (line 6746) | function getKeyMap(val) {
function deleteNearSelection (line 6752) | function deleteNearSelection(cm, compute) {
function moveCharLogically (line 6775) | function moveCharLogically(line, ch, dir) {
function moveLogically (line 6780) | function moveLogically(line, start, dir) {
function endOfLine (line 6785) | function endOfLine(visually, cm, lineObj, lineNo, dir) {
function moveVisually (line 6812) | function moveVisually(cm, line, start, dir) {
function lineStart (line 7024) | function lineStart(cm, lineN) {
function lineEnd (line 7030) | function lineEnd(cm, lineN) {
function lineStartSmart (line 7036) | function lineStartSmart(cm, pos) {
function doHandleBinding (line 7049) | function doHandleBinding(cm, bound, dropShift) {
function lookupKeyForEditor (line 7069) | function lookupKeyForEditor(cm, name, handle) {
function dispatchKey (line 7083) | function dispatchKey(cm, name, e, handle) {
function dispatchKeyInner (line 7101) | function dispatchKeyInner(cm, name, e, handle) {
function handleKeyBinding (line 7118) | function handleKeyBinding(cm, e) {
function handleCharBinding (line 7137) | function handleCharBinding(cm, e, ch) {
function onKeyDown (line 7142) | function onKeyDown(e) {
function showCrossHair (line 7163) | function showCrossHair(cm) {
function onKeyUp (line 7178) | function onKeyUp(e) {
function onKeyPress (line 7183) | function onKeyPress(e) {
function clickRepeat (line 7211) | function clickRepeat(pos, button) {
function onMouseDown (line 7232) | function onMouseDown(e) {
function handleMappedButton (line 7269) | function handleMappedButton(cm, button, pos, repeat, event) {
function configureMouse (line 7289) | function configureMouse(cm, repeat, event) {
function leftButtonDown (line 7302) | function leftButtonDown(cm, pos, repeat, event) {
function leftButtonStartDrag (line 7320) | function leftButtonStartDrag(cm, event, pos, behavior) {
function rangeForUnit (line 7359) | function rangeForUnit(cm, pos, unit) {
function leftButtonSelect (line 7368) | function leftButtonSelect(cm, event, start, behavior) {
function bidiSimplify (line 7500) | function bidiSimplify(cm, range) {
function gutterEvent (line 7535) | function gutterEvent(cm, e, type, prevent) {
function clickInGutter (line 7564) | function clickInGutter(cm, e) {
function onContextMenu (line 7573) | function onContextMenu(cm, e) {
function contextMenuInGutter (line 7579) | function contextMenuInGutter(cm, e) {
function themeChanged (line 7584) | function themeChanged(cm) {
function defineOptions (line 7595) | function defineOptions(CodeMirror) {
function guttersChanged (line 7729) | function guttersChanged(cm) {
function dragDropChanged (line 7735) | function dragDropChanged(cm, value, old) {
function wrappingChanged (line 7748) | function wrappingChanged(cm) {
function CodeMirror (line 7766) | function CodeMirror(place, options) {
function registerEventHandlers (line 7842) | function registerEventHandlers(cm) {
function indentLine (line 7957) | function indentLine(cm, n, how, aggressive) {
function setLastCopied (line 8021) | function setLastCopied(newLastCopied) {
function applyTextInput (line 8025) | function applyTextInput(cm, inserted, deleted, sel, origin) {
function handlePaste (line 8073) | function handlePaste(e, cm) {
function triggerElectric (line 8083) | function triggerElectric(cm, inserted) {
function copyableRanges (line 8107) | function copyableRanges(cm) {
function disableBrowserMagic (line 8118) | function disableBrowserMagic(field, spellcheck) {
function hiddenTextarea (line 8124) | function hiddenTextarea() {
function addEditorMethods (line 8147) | function addEditorMethods(CodeMirror) {
function findPosH (line 8590) | function findPosH(doc, pos, dir, unit, visually) {
function findPosV (line 8650) | function findPosV(cm, pos, dir, unit) {
function onCopyCut (line 8713) | function onCopyCut(e) {
function poll (line 8871) | function poll() {
function posToDOM (line 9037) | function posToDOM(cm, pos) {
function isInGutter (line 9053) | function isInGutter(node) {
function badPos (line 9059) | function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }
function domTextBetween (line 9061) | function domTextBetween(cm, from, to, fromLine, toLine) {
function domToPos (line 9114) | function domToPos(cm, node, offset) {
function locateNodeInLineView (line 9133) | function locateNodeInLineView(lineView, node, offset) {
function prepareCopyCut (line 9230) | function prepareCopyCut(e) {
function p (line 9370) | function p() {
function prepareSelectAllHack (line 9473) | function prepareSelectAllHack() {
function rehide (line 9486) | function rehide() {
function fromTextArea (line 9532) | function fromTextArea(textarea, options) {
function addLegacyProps (line 9589) | function addLegacyProps(CodeMirror) {
FILE: src/compiler/crystal/tools/playground/public/vendor/codemirror-5.38.0/mode/crystal/crystal.js
function wordRegExp (line 15) | function wordRegExp(words, end) {
function chain (line 19) | function chain(tokenize, stream, state) {
function tokenBase (line 58) | function tokenBase(stream, state) {
function tokenNest (line 237) | function tokenNest(begin, end, style, started) {
function tokenMacro (line 256) | function tokenMacro(begin, end, started) {
function tokenMacroDef (line 274) | function tokenMacroDef(stream, state) {
function tokenFollowIdent (line 291) | function tokenFollowIdent(stream, state) {
function tokenFollowType (line 305) | function tokenFollowType(stream, state) {
function tokenQuote (line 315) | function tokenQuote(end, style, embed) {
function tokenHereDoc (line 354) | function tokenHereDoc(phrase, embed) {
FILE: src/llvm/ext/llvm_ext.cc
type LLVMOpaqueOperandBundle (line 20) | struct LLVMOpaqueOperandBundle
function LLVMMetadataRef (line 27) | LLVMMetadataRef LLVMExtDIBuilderCreateEnumerator(LLVMDIBuilderRef Builder,
function LLVMExtClearCurrentDebugLocation (line 35) | void LLVMExtClearCurrentDebugLocation(LLVMBuilderRef B) {
function LLVMOperandBundleRef (line 41) | LLVMOperandBundleRef LLVMExtCreateOperandBundle(const char *Tag, size_t ...
function LLVMExtDisposeOperandBundle (line 48) | void LLVMExtDisposeOperandBundle(LLVMOperandBundleRef Bundle) {
function LLVMValueRef (line 52) | LLVMValueRef
function LLVMValueRef (line 67) | LLVMValueRef LLVMExtBuildInvokeWithOperandBundles(
function TargetMachine (line 83) | static TargetMachine *unwrap(LLVMTargetMachineRef P) {
function LLVMExtSetTargetMachineGlobalISel (line 87) | void LLVMExtSetTargetMachineGlobalISel(LLVMTargetMachineRef T, LLVMBool ...
Copy disabled (too large)
Download .json
Condensed preview — 2517 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,617K chars).
[
{
"path": ".ameba.yml",
"chars": 5343,
"preview": "# This configuration file was generated by `ameba --gen-config`\n# on 2025-06-02 13:57:07 UTC using Ameba version 1.7.0-d"
},
{
"path": ".circleci/config.yml",
"chars": 16519,
"preview": "version: 2.1\n\nparameters:\n distribution-scripts-repo:\n description: \"Git url https://github.com/crystal-lang/distrib"
},
{
"path": ".editorconfig",
"chars": 156,
"preview": "root = true\n\n[*.{cr,ecr}]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size "
},
{
"path": ".gitattributes",
"chars": 1113,
"preview": "## Sources\n\n*.cr text eol=lf\n\n## Sourced-in dependencies\n\nlib/** linguist-vendored\n\n## Generated files\n\n# produced by sc"
},
{
"path": ".github/ISSUE_TEMPLATE/bug-report.md",
"chars": 1284,
"preview": "---\nname: \"\\U0001F41B Bug Report\"\nabout: I want to report a bug.\nlabels: kind:bug\ntype: Bug\n---\n\n# Bug Report\n\nMake sure"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 435,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: \"\\U00002753 Crystal Community Forum\"\n url: https://forum.crystal"
},
{
"path": ".github/ISSUE_TEMPLATE/discussion.md",
"chars": 673,
"preview": "---\nname: \"\\U0001F914 Language Improvement Discussion\"\nabout: I want to start a new discussion about improving the langu"
},
{
"path": ".github/ISSUE_TEMPLATE/feature-request.md",
"chars": 1129,
"preview": "---\nname: \"\\U0001F680 Feature Request\"\nabout: I want to propose a new language feature.\nlabels: kind:feature\ntype: Featu"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE/pull_request_template.md",
"chars": 1527,
"preview": "# Pull Request\n\nWe thank you for helping improve Crystal. In order to ease the reviewing process, we invite you to read "
},
{
"path": ".github/actionlint.yaml",
"chars": 903,
"preview": "self-hosted-runner:\n # Labels of self-hosted runner in array of strings.\n labels:\n - runs-on\n - runner=*\n - f"
},
{
"path": ".github/renovate.json",
"chars": 489,
"preview": "{\n \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n \"extends\": [\n \"config:recommended\"\n ],\n \"sepa"
},
{
"path": ".github/workflows/aarch64.yml",
"chars": 4408,
"preview": "name: AArch64 CI\n\non: [push, pull_request]\n\npermissions: {}\n\nconcurrency:\n group: ${{ github.workflow }}-${{ github.ref"
},
{
"path": ".github/workflows/backport.yml",
"chars": 1430,
"preview": "# WARNING:\n# When extending this action, be aware that $GITHUB_TOKEN allows write access to\n# the GitHub repository. Thi"
},
{
"path": ".github/workflows/docs.yml",
"chars": 1129,
"preview": "name: Docs\n\non:\n push:\n branches:\n - master\n\npermissions: {}\n\nenv:\n TRAVIS_OS_NAME: linux\n\njobs:\n deploy_api_"
},
{
"path": ".github/workflows/forward-compatibility.yml",
"chars": 2216,
"preview": "name: Forward Compatibility\n\non:\n push:\n paths:\n - .github/workflows/forward-compatibility.yml\n schedule:\n - "
},
{
"path": ".github/workflows/interpreter.yml",
"chars": 2595,
"preview": "name: Interpreter Test\n\non: [push, pull_request]\n\npermissions: {}\n\nconcurrency:\n group: ${{ github.workflow }}-${{ gith"
},
{
"path": ".github/workflows/lint.yml",
"chars": 2008,
"preview": "name: Lint\non:\n push:\n pull_request:\n workflow_dispatch:\n\npermissions: {}\n\njobs:\n prek:\n runs-on: ubuntu-latest\n "
},
{
"path": ".github/workflows/linux.yml",
"chars": 3670,
"preview": "name: Linux CI\n\non: [push, pull_request]\n\npermissions: {}\n\nconcurrency:\n group: ${{ github.workflow }}-${{ github.ref }"
},
{
"path": ".github/workflows/llvm.yml",
"chars": 2754,
"preview": "name: LLVM CI\n\non:\n push:\n paths:\n - 'src/compiler/crystal/codegen/**'\n - 'src/llvm/**'\n - 'spec/std/"
},
{
"path": ".github/workflows/macos.yml",
"chars": 2460,
"preview": "name: macOS CI\n\non: [push, pull_request]\n\npermissions: {}\n\nconcurrency:\n group: ${{ github.workflow }}-${{ github.ref }"
},
{
"path": ".github/workflows/mingw-w64-steps.yml",
"chars": 5050,
"preview": "name: MinGW-w64 CI / Build\r\n\r\non:\r\n workflow_call:\r\n inputs:\r\n arch:\r\n required: true\r\n type: str"
},
{
"path": ".github/workflows/mingw-w64.yml",
"chars": 703,
"preview": "name: MinGW-w64 CI\r\n\r\non: [push, pull_request]\r\n\r\npermissions: {}\r\n\r\nconcurrency:\r\n group: ${{ github.workflow }}-${{ g"
},
{
"path": ".github/workflows/openssl.yml",
"chars": 2207,
"preview": "name: OpenSSL CI\n\non:\n push:\n paths:\n - 'src/openssl/**'\n - 'spec/std/digest/**'\n - 'spec/std/openssl"
},
{
"path": ".github/workflows/regex-engine.yml",
"chars": 1802,
"preview": "name: Regex Engine CI\n\non:\n push:\n paths:\n - 'src/regex.cr'\n - 'src/regex/**'\n - 'spec/std/regex_spec"
},
{
"path": ".github/workflows/smoke.yml",
"chars": 2136,
"preview": "# These jobs are smoke tests for platforms where we don't run full tests.\n# They ensure that std_spec, compiler_spec and"
},
{
"path": ".github/workflows/update-devenv.yml",
"chars": 1567,
"preview": "name: Update devenv\n\non:\n schedule:\n - cron: \"0 3 * * 2\" # Weekly on Tuesdays\n push:\n branches:\n - master\n "
},
{
"path": ".github/workflows/wasm32.yml",
"chars": 1888,
"preview": "name: WebAssembly CI\n\non: [push, pull_request]\n\npermissions: {}\n\nconcurrency:\n group: ${{ github.workflow }}-${{ github"
},
{
"path": ".github/workflows/win.yml",
"chars": 14646,
"preview": "name: Windows CI\n\non: [push, pull_request, workflow_dispatch]\n\npermissions: {}\n\nconcurrency:\n group: ${{ github.workflo"
},
{
"path": ".github/workflows/win_build_portable.yml",
"chars": 4817,
"preview": "name: Windows CI / Build Portable Package\n\non:\n workflow_call:\n inputs:\n release:\n required: true\n "
},
{
"path": ".github/workflows/xml.yml",
"chars": 1580,
"preview": "name: XML CI\n\non:\n push:\n paths:\n - 'spec/std/xml/**'\n - 'src/xml/**'\n - '.github/workflows/xml.yml'\n"
},
{
"path": ".github/zizmor.yml",
"chars": 166,
"preview": "rules:\n dangerous-triggers:\n ignore:\n - backport.yml\n unpinned-uses:\n config:\n policies:\n actio"
},
{
"path": ".gitignore",
"chars": 341,
"preview": "# Environment configuration\n/Makefile.local\n/Makefile.win.local\n.env\n.env.*\n.envrc\n.envrc.*\n\n# Build artifacts\n*.o\n*.ll\n"
},
{
"path": ".mailmap",
"chars": 1035,
"preview": "Ary Borenszweig <asterite@gmail.com> <aborenszweig@manas.com.ar>\nAry Borenszweig <asterite@gmail.com> <ary@esperanto.org"
},
{
"path": ".markdownlint.yaml",
"chars": 574,
"preview": "default: true\n\nheading-style: \"setext\"\n\nno-inline-html: false\nline-length: false\n\nol-prefix:\n style: \"ordered\"\nul-style"
},
{
"path": ".markdownlintignore",
"chars": 6,
"preview": "/lib/\n"
},
{
"path": ".well-known/funding-manifest-urls",
"chars": 38,
"preview": "https://crystal-lang.org/funding.json\n"
},
{
"path": "Brewfile",
"chars": 133,
"preview": "brew \"gmp\"\nbrew \"libevent\"\nbrew \"pcre\"\nbrew \"pkg-config\"\nbrew \"openssl@1.1\"\nbrew \"llvm@11\", link: true, conflicts_with: "
},
{
"path": "CHANGELOG.md",
"chars": 122,
"preview": "# Changelog\n\nFor information on prior releases, refer to the changelogs in [./doc/changelogs](./doc/changelogs/README.md"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3296,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
},
{
"path": "CONTRIBUTING.md",
"chars": 15278,
"preview": "# Contributing to Crystal\n\nSo you've decided to contribute to Crystal. Excellent!\n\n## Using the issue tracker\n\nThe [issu"
},
{
"path": "LICENSE",
"chars": 11798,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "LICENSES/Apache-2.0.txt",
"chars": 10280,
"preview": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AN"
},
{
"path": "LICENSES/MIT.txt",
"chars": 1078,
"preview": "MIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtai"
},
{
"path": "LICENSES/Swift-exception.txt",
"chars": 355,
"preview": "### Runtime Library Exception to the Apache 2.0 License: ###\n\nAs an exception, if you use this Software to compile your "
},
{
"path": "Makefile",
"chars": 12929,
"preview": "all:\n\n-include Makefile.local # for optional local options e.g. threads\n\n# Recipes for this Makefile\n\n## Build the compi"
},
{
"path": "Makefile.win",
"chars": 13090,
"preview": "all:\r\n\r\n-include Makefile.win.local # for optional local options e.g. threads\r\n\r\n# Recipes for this Makefile\r\n\r\n## Build"
},
{
"path": "NOTICE.md",
"chars": 2504,
"preview": "# Crystal Programming Language\n\nCopyright 2012-2026 Manas Technology Solutions.\n\nThis product includes software develope"
},
{
"path": "README.md",
"chars": 4010,
"preview": "# Crystal\n\n[](https://gi"
},
{
"path": "REUSE.toml",
"chars": 911,
"preview": "version = 1\n\n# All original code in this repository is licensed under Apache 2.0 with Swift\n# exception.\n[[annotations]]"
},
{
"path": "SECURITY.md",
"chars": 528,
"preview": "# Reporting a Vulnerability\n\nShould you find any security-related issue, please _do not share them openly_ in\nthe issue "
},
{
"path": "UPGRADING.md",
"chars": 1221,
"preview": "# Upgrading\n\nThis guide provides instructions for upgrading Crystal from one release to the next.\nUpgrades must be run s"
},
{
"path": "_typos.toml",
"chars": 1719,
"preview": "[default.extend-words]\nflate = \"flate\"\n\n[default.extend-identifiers]\nACCES = \"ACCES\"\nba = \"ba\"\nba2 = \"ba2\"\nbui = \"bui\"\nc"
},
{
"path": "bin/check-compiler-flag",
"chars": 2395,
"preview": "#!/bin/sh\n\n# Use `./bin/check-compiler-flag FLAG` to check the behaviour of the given compiler flag.\n# This is useful if"
},
{
"path": "bin/ci",
"chars": 6882,
"preview": "#!/bin/sh\n\nfail() {\n echo \"${*}\" >&2\n exit 1\n}\n\non_tag() {\n if [ -n \"$CURRENT_TAG\" ]; then\n echo \"${*}\"\n eval \""
},
{
"path": "bin/crystal",
"chars": 6248,
"preview": "#!/bin/sh\n\n################## https://github.com/mkropat/sh-realpath #####################\n#\n# The MIT License (MIT)\n#\n#"
},
{
"path": "bin/crystal.bat",
"chars": 98,
"preview": "@echo off\r\npowershell.exe -NoProfile -ExecutionPolicy Bypass -Command \"%~dp0crystal.ps1\" --%% %*\r\n"
},
{
"path": "bin/crystal.ps1",
"chars": 10856,
"preview": "param(\r\n [Parameter(Position = 0, ValueFromRemainingArguments)] [string[]] $CrystalArgs\r\n)\r\n\r\n# https://www.powershel"
},
{
"path": "devenv.nix",
"chars": 1249,
"preview": "{ pkgs, lib, config, inputs, ... }:\n\n{\n dotenv.enable = true;\n\n git-hooks.hooks = {\n actionlint.enable = true;\n "
},
{
"path": "devenv.yaml",
"chars": 115,
"preview": "inputs:\n git-hooks:\n url: github:cachix/git-hooks.nix\n nixpkgs:\n url: github:cachix/devenv-nixpkgs/rolling\n"
},
{
"path": "doc/changelogs/README.md",
"chars": 563,
"preview": "# Changelog\n\n## Historical changelogs\n\n- [pre-1.0](pre-1.0.md)\n- [1.0 series](v1.0.md)\n- [1.1 series](v1.1.md)\n- [1.2 se"
},
{
"path": "doc/changelogs/pre-1.0.md",
"chars": 366560,
"preview": "# Changelog pre 1.0\n\n## 0.36.1 (2021-02-02)\n\n### Standard library\n\n- Fix `Enum.from_value?` for flag enum with non `Int3"
},
{
"path": "doc/changelogs/v1.0.md",
"chars": 9310,
"preview": "# Changelog 1.0\n\n## [1.0.0] - 2021-03-22\n\n[1.0.0]: https://github.com/crystal-lang/crystal/releases/1.0.0\n\n### Language "
},
{
"path": "doc/changelogs/v1.1.md",
"chars": 23254,
"preview": "# Changelog 1.1\n\n## [1.1.1] - 2021-07-26\n\n[1.1.1]: https://github.com/crystal-lang/crystal/releases/1.1.1\n\n### Language "
},
{
"path": "doc/changelogs/v1.10.md",
"chars": 12233,
"preview": "# Changelog 1.10\n\n## [1.10.1] (2023-10-13)\n\n[1.10.1]: https://github.com/crystal-lang/crystal/releases/1.10.1\n\n### Bugfi"
},
{
"path": "doc/changelogs/v1.11.md",
"chars": 27960,
"preview": "# Changelog 1.11\n\n## [1.11.2] (2024-01-18)\n\n[1.11.2]: https://github.com/crystal-lang/crystal/releases/1.11.2\n\n### Bugfi"
},
{
"path": "doc/changelogs/v1.12.md",
"chars": 22866,
"preview": "# Changelog 1.12\n\n## [1.12.2] (2024-05-31)\n\n_Patch release with a bug fix necessary for support of latest libgc._\n\n[1.12"
},
{
"path": "doc/changelogs/v1.13.md",
"chars": 30697,
"preview": "# Changelog 1.13\n\n## [1.13.3] (2024-09-18)\n\n[1.13.3]: https://github.com/crystal-lang/crystal/releases/1.13.3\n\n### Bugfi"
},
{
"path": "doc/changelogs/v1.14.md",
"chars": 21709,
"preview": "# Changelog 1.14\n\n## [1.14.1] (2025-01-08)\n\n[1.14.1]: https://github.com/crystal-lang/crystal/releases/1.14.1\n\n### Bugfi"
},
{
"path": "doc/changelogs/v1.15.md",
"chars": 26273,
"preview": "# Changelog 1.15\n\n## [1.15.1] (2025-02-04)\n\n[1.15.1]: https://github.com/crystal-lang/crystal/releases/1.15.1\n\n### Bugfi"
},
{
"path": "doc/changelogs/v1.16.md",
"chars": 29457,
"preview": "# Changelog 1.16\n\n## [1.16.3] (2025-05-12)\n\n[1.16.3]: https://github.com/crystal-lang/crystal/releases/1.16.3\n\n### Bugfi"
},
{
"path": "doc/changelogs/v1.17.md",
"chars": 27833,
"preview": "# Changelog 1.17\n\n## [1.17.1] (2025-07-22)\n\n[1.17.1]: https://github.com/crystal-lang/crystal/releases/1.17.1\n\n### Bugfi"
},
{
"path": "doc/changelogs/v1.18.md",
"chars": 27479,
"preview": "# Changelog 1.18\n\n## [1.18.2] (2025-10-21)\n\n[1.18.2]: https://github.com/crystal-lang/crystal/releases/1.18.2\n\n### Bugfi"
},
{
"path": "doc/changelogs/v1.19.md",
"chars": 35636,
"preview": "# Changelog 1.19\n\n## [1.19.1] (2026-01-20)\n\n[1.19.1]: https://github.com/crystal-lang/crystal/releases/1.19.1\n\n### Bugfi"
},
{
"path": "doc/changelogs/v1.2.md",
"chars": 27612,
"preview": "# Changelog 1.2\n\n## [1.2.2] - 2021-11-10\n\n[1.2.2]: https://github.com/crystal-lang/crystal/releases/1.2.2\n\n### Compiler\n"
},
{
"path": "doc/changelogs/v1.3.md",
"chars": 25105,
"preview": "# Changelog 1.3\n\n## [1.3.2] - 2022-01-18\n\n[1.3.2]: https://github.com/crystal-lang/crystal/releases/1.3.2\n\n### Standard "
},
{
"path": "doc/changelogs/v1.4.md",
"chars": 18833,
"preview": "# Changelog 1.4\n\n## [1.4.1] - 2022-04-22\n\n[1.4.1]: https://github.com/crystal-lang/crystal/releases/1.4.1\n\n### Standard "
},
{
"path": "doc/changelogs/v1.5.md",
"chars": 15668,
"preview": "# Changelog 1.5\n\n## [1.5.1] - 2022-09-07\n\n[1.5.1]: https://github.com/crystal-lang/crystal/releases/1.5.1\n\n### Standard "
},
{
"path": "doc/changelogs/v1.6.md",
"chars": 27952,
"preview": "# Changelog 1.6\n\n## [1.6.2] - 2022-11-03\n\n[1.6.2]: https://github.com/crystal-lang/crystal/releases/1.6.2\n\n### Language\n"
},
{
"path": "doc/changelogs/v1.7.md",
"chars": 23429,
"preview": "# Changelog 1.7\n\n## [1.7.3] - 2023-03-07\n\n[1.7.3]: https://github.com/crystal-lang/crystal/releases/1.7.3\n\n### Standard "
},
{
"path": "doc/changelogs/v1.8.md",
"chars": 26282,
"preview": "# Changelog 1.8\n\n## [1.8.2] - 2023-05-08\n\n[1.8.2]: https://github.com/crystal-lang/crystal/releases/1.8.2\n\n### Standard "
},
{
"path": "doc/changelogs/v1.9.md",
"chars": 24504,
"preview": "# Changelog 1.9\n\n## [1.9.2] - 2023-07-19\n\n[1.9.2]: https://github.com/crystal-lang/crystal/releases/1.9.2\n\n### Bugfixes\n"
},
{
"path": "doc/man/crystal-build.adoc",
"chars": 5211,
"preview": "= crystal-build(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compile"
},
{
"path": "doc/man/crystal-docs.adoc",
"chars": 2349,
"preview": "= crystal-docs(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler"
},
{
"path": "doc/man/crystal-env.adoc",
"chars": 986,
"preview": "= crystal-env(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler "
},
{
"path": "doc/man/crystal-eval.adoc",
"chars": 1537,
"preview": "= crystal-eval(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler"
},
{
"path": "doc/man/crystal-init.adoc",
"chars": 839,
"preview": "= crystal-init(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler"
},
{
"path": "doc/man/crystal-play.adoc",
"chars": 616,
"preview": "= crystal-play(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler"
},
{
"path": "doc/man/crystal-run.adoc",
"chars": 416,
"preview": "= crystal-run(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler "
},
{
"path": "doc/man/crystal-spec.adoc",
"chars": 1420,
"preview": "= crystal-spec(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler"
},
{
"path": "doc/man/crystal-tool-dependencies.adoc",
"chars": 1212,
"preview": "= crystal-tool-dependencies(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Cry"
},
{
"path": "doc/man/crystal-tool-format.adoc",
"chars": 499,
"preview": "= crystal-tool-format(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal C"
},
{
"path": "doc/man/crystal-tool-macro_code_coverage.adoc",
"chars": 1641,
"preview": "= crystal-tool-macro_code_coverage(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manu"
},
{
"path": "doc/man/crystal-tool-unreachable.adoc",
"chars": 1640,
"preview": "= crystal-tool-unreachable(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crys"
},
{
"path": "doc/man/crystal.adoc",
"chars": 5422,
"preview": "= crystal(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler Comm"
},
{
"path": "etc/completion.bash",
"chars": 3883,
"preview": "# Bash completion for \"crystal\" command.\n# Written by Sergey Potapov <blake131313@gmail.com>.\n\n# Return list of options,"
},
{
"path": "etc/completion.fish",
"chars": 26211,
"preview": "set -l crystal_commands init build clear_cache docs env eval i interactive play run spec tool help version\nset -l tool_s"
},
{
"path": "etc/completion.zsh",
"chars": 8759,
"preview": "#compdef crystal\n\n_crystal() {\n\n_crystal_commands() {\n local -a commands\n commands=(\n \"init:generate new crystal pr"
},
{
"path": "etc/gdb/crystal_formatters.py",
"chars": 2011,
"preview": "import gdb\n\nclass CrystalStringPrinter:\n def __init__(self, val):\n self.val = val\n\n def to_string(self):\n "
},
{
"path": "etc/lldb/crystal_formatters.py",
"chars": 2127,
"preview": "import lldb\n\nclass CrystalArraySyntheticProvider:\n def __init__(self, valobj, internal_dict):\n self.valobj = v"
},
{
"path": "etc/msvc/crystal.natvis",
"chars": 1312,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010"
},
{
"path": "etc/win-ci/build-ffi.ps1",
"chars": 1048,
"preview": "param(\r\n [Parameter(Mandatory)] [string] $BuildTree,\r\n [Parameter(Mandatory)] [string] $Version,\r\n [switch] $Dy"
},
{
"path": "etc/win-ci/build-gc.ps1",
"chars": 1618,
"preview": "param(\r\n [Parameter(Mandatory)] [string] $BuildTree,\r\n [Parameter(Mandatory)] [string] $Version,\r\n [Parameter(M"
},
{
"path": "etc/win-ci/build-iconv.ps1",
"chars": 1101,
"preview": "param(\r\n [Parameter(Mandatory)] [string] $BuildTree,\r\n [Parameter(Mandatory)] [string] $Version,\r\n [switch] $Dy"
},
{
"path": "etc/win-ci/build-llvm.ps1",
"chars": 1774,
"preview": "param(\r\n [Parameter(Mandatory)] [string] $BuildTree,\r\n [Parameter(Mandatory)] [string] $Version,\r\n [Parameter(M"
},
{
"path": "etc/win-ci/build-mpir.ps1",
"chars": 1851,
"preview": "param(\r\n [Parameter(Mandatory)] [string] $BuildTree,\r\n [switch] $Dynamic\r\n)\r\n\r\n. \"$(Split-Path -Parent $MyInvocati"
},
{
"path": "etc/win-ci/build-openssl.ps1",
"chars": 1315,
"preview": "param(\r\n [Parameter(Mandatory)] [string] $BuildTree,\r\n [Parameter(Mandatory)] [string] $Version,\r\n [switch] $Dy"
},
{
"path": "etc/win-ci/build-pcre.ps1",
"chars": 1698,
"preview": "param(\r\n [Parameter(Mandatory)] [string] $BuildTree,\r\n [Parameter(Mandatory)] [string] $Version,\r\n [switch] $Dy"
},
{
"path": "etc/win-ci/build-pcre2.ps1",
"chars": 1291,
"preview": "param(\r\n [Parameter(Mandatory)] [string] $BuildTree,\r\n [Parameter(Mandatory)] [string] $Version,\r\n [switch] $Dy"
},
{
"path": "etc/win-ci/build-xml2.ps1",
"chars": 1313,
"preview": "param(\r\n [Parameter(Mandatory)] [string] $BuildTree,\r\n [Parameter(Mandatory)] [string] $Version,\r\n [switch] $Dy"
},
{
"path": "etc/win-ci/build-yaml.ps1",
"chars": 1084,
"preview": "param(\r\n [Parameter(Mandatory)] [string] $BuildTree,\r\n [Parameter(Mandatory)] [string] $Version,\r\n [switch] $Dy"
},
{
"path": "etc/win-ci/build-z.ps1",
"chars": 1129,
"preview": "param(\r\n [Parameter(Mandatory)] [string] $BuildTree,\r\n [Parameter(Mandatory)] [string] $Version,\r\n [switch] $Dy"
},
{
"path": "etc/win-ci/crystal.iss",
"chars": 16460,
"preview": "#define MyAppName \"Crystal\"\r\n#define VersionFile FileOpen(\"portable\\src\\VERSION\")\r\n#define MyAppVersion FileRead(Version"
},
{
"path": "etc/win-ci/cygwin-build-iconv.sh",
"chars": 1105,
"preview": "#!/bin/sh\n# shellcheck disable=SC2155\n\nset -e\n\nDynamic=$1\n\nexport PATH=\"$(pwd)/build-aux:$PATH\"\nexport CC=\"$(pwd)/build-"
},
{
"path": "etc/win-ci/setup.ps1",
"chars": 2436,
"preview": "function Run-InDirectory {\r\n param(\r\n [Parameter(Mandatory)] [string] $Path,\r\n [Parameter(Mandatory)] ["
},
{
"path": "lib/.shards.info",
"chars": 364,
"preview": "---\nversion: 1.0\nshards:\n markd:\n git: https://github.com/icyleaf/markd.git\n version: 0.5.0\n reply:\n git: htt"
},
{
"path": "man/crystal.1",
"chars": 21545,
"preview": "'\\\" t\n.\\\" Title: crystal\n.\\\" Author: [see the \"AUTHOR(S)\" section]\n.\\\" Generator: Asciidoctor 2.0.23\n.\\\" Dat"
},
{
"path": "samples/2048.cr",
"chars": 7918,
"preview": "# Based on 2048 by Gabriele Cirulli - gabrielecirulli.github.io/2048\n\nrequire \"colorize\"\n\nenum Action\n Up\n Down\n Left"
},
{
"path": "samples/Makefile",
"chars": 1311,
"preview": "CRYSTAL := ../bin/crystal## Crystal compiler to use\nO := .build## Output directory\n\nBUILDABLE_SOURCES := $(wildcard *.cr"
},
{
"path": "samples/Makefile.win",
"chars": 1796,
"preview": "all:\r\n\r\nMAKEFLAGS += --no-builtin-rules\r\n.SUFFIXES:\r\n\r\nSHELL := cmd.exe\r\n\r\nMKDIR = if not exist $1 mkdir $1\r\nRMDIR = if "
},
{
"path": "samples/binary-trees.cr",
"chars": 1380,
"preview": "# Copied with little modifications from: https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/binarytrees"
},
{
"path": "samples/brainfuck.cr",
"chars": 1888,
"preview": "# Brainf*ck interpreter\n\nstruct Tape\n def initialize\n @tape = [0]\n @pos = 0\n end\n\n def get\n @tape[@pos]\n en"
},
{
"path": "samples/channel_primes.cr",
"chars": 553,
"preview": "# Ported from Go sample from this page: https://web.archive.org/web/20160602135806/http://dancallahan.info/journal/go-co"
},
{
"path": "samples/channel_select.cr",
"chars": 370,
"preview": "def generator(n : T) forall T\n channel = Channel(T).new\n spawn do\n loop do\n sleep n.seconds\n channel.send"
},
{
"path": "samples/compiler/formatter_example.cr",
"chars": 283,
"preview": "# This is a small sample on how to use a Crystal's\n# formatter programmatically.\n\n# Use `require \"compiler/crystal/forma"
},
{
"path": "samples/compiler/transformer_example.cr",
"chars": 530,
"preview": "# This is a small sample on how to use a Crystal::Transformer\n# to transform source code.\n#\n# Here we transform all numb"
},
{
"path": "samples/compiler/visitor_example.cr",
"chars": 662,
"preview": "# This is a small sample on how to use a Crystal::Visitor\n# to traverse an AST.\n#\n# Here we count the number of NumberLi"
},
{
"path": "samples/conway.cr",
"chars": 2029,
"preview": "# Ported from http://arthurtw.github.io/2015/01/12/quick-comparison-nim-vs-rust.html\n\nstruct ANSI\n def initialize(@io :"
},
{
"path": "samples/degree_days.cr",
"chars": 2533,
"preview": "# Copied with little modifications from: https://github.com/rubinius/rubinius-benchmark/blob/master/real_world/bench_deg"
},
{
"path": "samples/egrep.cr",
"chars": 155,
"preview": "if ARGV.empty?\n abort \"Usage: cat somefile | egrep 'some'\"\nend\n\nregex = Regex.new(ARGV[0])\nwhile str = STDIN.gets\n STD"
},
{
"path": "samples/fannkuch-redux.cr",
"chars": 1452,
"preview": "# Copied with little modifications from: https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/fannkuchred"
},
{
"path": "samples/fibonacci.cr",
"chars": 220,
"preview": "def fibonacci(n : Int32) : Int32\n return 0 if n < 0\n return n if n <= 1\n\n fibonacci(n - 1) + fibonacci(n - 2)\nend\n\npu"
},
{
"path": "samples/havlak.cr",
"chars": 11110,
"preview": "# Havlak benchmark: https://code.google.com/p/multi-language-bench/\n# Crystal Implementation (translated from Python ver"
},
{
"path": "samples/http_server.cr",
"chars": 264,
"preview": "# A very basic HTTP server\nrequire \"http/server\"\n\nserver = HTTP::Server.new do |context|\n context.response.content_type"
},
{
"path": "samples/impl.cr",
"chars": 1015,
"preview": "class Foo\n property lorem : Int32?\n\n def foo\n 1\n end\nend\n\nclass Bar\n def foo\n 2\n end\nend\n\ndef bar(o)\n while "
},
{
"path": "samples/llvm/brainfuck.cr",
"chars": 7416,
"preview": "# Ported from https://github.com/Wilfred/Brainfrack/blob/5a2f613f9e82bfd57be687aa6a67aca15d3d9861/llvm/compiler.cpp\n\nreq"
},
{
"path": "samples/mandelbrot.cr",
"chars": 828,
"preview": "def print_density(d)\n if d > 8\n print ' '\n elsif d > 4\n print '.'\n elsif d > 2\n print '*'\n else\n print '"
},
{
"path": "samples/mandelbrot2.cr",
"chars": 245,
"preview": "require \"complex\"\n\ndef mandelbrot(a)\n Iterator.of(a).first(100).reduce(a) { |z, c| z*z + c }\nend\n\n(1.0).step(to: -1, by"
},
{
"path": "samples/matmul.cr",
"chars": 863,
"preview": "# Copied with little modifications from: https://github.com/attractivechaos/plb/blob/master/matmul/matmul_v1.rb\n\ndef mat"
},
{
"path": "samples/meteor.cr",
"chars": 4139,
"preview": "# Translated from: https://gitlab.redox-os.org/redox-os/rust/blob/a59de37e99060162a2674e3ff45409ac73595c0e/src/test/benc"
},
{
"path": "samples/mt_gc_test.cr",
"chars": 5885,
"preview": "# Experiment to stress the GC with multi-threading.\n# The experiment manually allocates multiple times a queue of fibers"
},
{
"path": "samples/nbodies.cr",
"chars": 3079,
"preview": "# Copied with little modifications from: https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/nbody-yarv-"
},
{
"path": "samples/neural_net.cr",
"chars": 3523,
"preview": "# Copied with little modifications from: https://github.com/jruby/rubybench/blob/master/time/bench_neural_net.rb\n\nclass "
},
{
"path": "samples/noise.cr",
"chars": 1978,
"preview": "# Perlin noise benchmark: https://github.com/nsf/pnoise\n\nrecord Vec2, x : Float64, y : Float64\n\ndef lerp(a, b, v)\n a * "
},
{
"path": "samples/pig.cr",
"chars": 2796,
"preview": "# Translated from Go: http://golang.org/doc/codewalk/functions/\n\nWin = 100 # The winning score in a game of P"
},
{
"path": "samples/pretty_json.cr",
"chars": 2053,
"preview": "# JSON pretty printer\n# ~~~~~~~~~~~~~~~~~~~\n#\n# Reads JSON from STDIN and outputs it formatted and colored to STDOUT.\n#\n"
},
{
"path": "samples/quine.cr",
"chars": 64,
"preview": "s = \"s = @; puts s.sub(\\\"@\\\", s.dump)\"; puts s.sub(\"@\", s.dump)\n"
},
{
"path": "samples/red_black_tree.cr",
"chars": 7909,
"preview": "# Copied with little modifications from: https://github.com/rubinius/rubinius-benchmark/blob/cf4a2468f46d23cc300815afabc"
},
{
"path": "samples/sdl/fire.cr",
"chars": 9991,
"preview": "require \"./sdl/sdl\"\n\nclass Point\n MAX_LIFE = 50\n HALF_LIFE = MAX_LIFE / 2\n\n property x : Float64\n property y : Floa"
},
{
"path": "samples/sdl/fire.txt",
"chars": 627,
"preview": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n xxxxxx xxxxx xx xx xxxxxx xxxxxx xxxxxx xx\n xxxxxx xxxxxx xx xx xxxxxx "
},
{
"path": "samples/sdl/raytracer.cr",
"chars": 5699,
"preview": "# Ported from Nimrod: https://gist.github.com/AdrianV/5774141\n\nrequire \"./sdl/sdl\"\n\nWIDTH = 1280\nHEIGHT = 720\nFO"
},
{
"path": "samples/sdl/sdl/lib_sdl.cr",
"chars": 3449,
"preview": "{% if flag?(:darwin) %}\n @[Link(\"SDL\")]\n @[Link(\"SDLMain\")]\n @[Link(framework: \"Cocoa\")]\n{% else %}\n @[Link(\"SDL\")]\n"
},
{
"path": "samples/sdl/sdl/sdl.cr",
"chars": 795,
"preview": "require \"./*\"\n\nmodule SDL\n def self.init(flags = LibSDL::INIT_EVERYTHING)\n if LibSDL.init(flags) != 0\n raise \"C"
},
{
"path": "samples/sdl/sdl/surface.cr",
"chars": 652,
"preview": "class SDL::Surface\n getter :surface\n getter :width\n getter :height\n getter :bpp\n\n def initialize(@surface : LibSDL:"
},
{
"path": "samples/sdl/tv.cr",
"chars": 3116,
"preview": "require \"./sdl/sdl\"\n\nclass ColorMaker\n enum State\n BlueUp\n BlueDown\n GreenUp\n GreenDown\n RedUp\n RedDo"
},
{
"path": "samples/sdl/tv.txt",
"chars": 595,
"preview": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n xxxxx xxxx x x xxxxx xxxxx xxxxx x\n x..... x...x x. x. x..... .x... "
},
{
"path": "samples/sieve.cr",
"chars": 352,
"preview": "# Compute prime numbers up to 100 with the Sieve of Eratosthenes\nmax = 100\n\nsieve = Array.new(max + 1, true)\nsieve[0] = "
},
{
"path": "samples/spectral-norm.cr",
"chars": 827,
"preview": "# Copied with little modifications from: https://github.com/wmoxam/Ruby-Benchmarks-Game/blob/master/benchmarks/spectral-"
},
{
"path": "samples/sudoku.cr",
"chars": 5039,
"preview": "# Copied with little modifications from: https://github.com/attractivechaos/plb/blob/master/sudoku/sudoku_v1.rb\n\ndef sd_"
},
{
"path": "samples/tcp_client.cr",
"chars": 183,
"preview": "require \"socket\"\n\n# goes with tcp_server.cr\n\nsocket = TCPSocket.new \"127.0.0.1\", 9000\n10.times do |i|\n socket.puts i\n "
},
{
"path": "samples/tcp_server.cr",
"chars": 432,
"preview": "require \"socket\"\n\n# goes with tcp_client.cr\n\ndef process(client)\n client_addr = client.remote_address\n puts \"#{client_"
},
{
"path": "samples/text_raytracer.cr",
"chars": 2703,
"preview": "# Ported from Rust from https://gist.github.com/joshmarinacci/c84d0979e100d107f685\n\nrecord Vector, x : Float64, y : Floa"
},
{
"path": "samples/tree.cr",
"chars": 518,
"preview": "class Node\n @left : self?\n @right : self?\n\n def initialize(@value : Char)\n end\n\n def add(x)\n if x < @value\n "
},
{
"path": "samples/wordcount.cr",
"chars": 1200,
"preview": "# Ported from http://arthurtw.github.io/2015/01/12/quick-comparison-nim-vs-rust.html\n\nrequire \"option_parser\"\n\ndef do_wo"
},
{
"path": "scripts/docs-versions.sh",
"chars": 379,
"preview": "#! /usr/bin/env sh\n\ngit tag --list | \\\ngrep -v -E '0\\.1?[0-9]\\.' | \\\ngrep '^[0-9]' | \\\nsort -rV | \\\nawk '\n BEGIN {\n "
},
{
"path": "scripts/generate_data.mk",
"chars": 1732,
"preview": "\n## Run all data generators\n## $ make -f scripts/generate_data.mk\n## Generate time zone database for stdlib specs\n## "
},
{
"path": "scripts/generate_glob_specs.sh",
"chars": 2399,
"preview": "#!/bin/env bash\n\n# This tool generates the tests in spec/std/file/match-fast-glob_spec.cr\n# from https://github.com/oxc-"
},
{
"path": "scripts/generate_grapheme_break_specs.cr",
"chars": 2064,
"preview": "#! /usr/bin/env crystal\n#\n# This script generates the file spec/std/string/graphemes_break_spec.cr\n# that contains test "
},
{
"path": "scripts/generate_grapheme_properties.cr",
"chars": 2179,
"preview": "#! /usr/bin/env crystal\n#\n# This script generates the file src/string/grapheme/properties.cr\n# that contains compact rep"
},
{
"path": "scripts/generate_html_entities.cr",
"chars": 1154,
"preview": "#! /usr/bin/env crystal\n\nrequire \"http\"\nrequire \"json\"\nrequire \"ecr\"\n\nrecord Entity, characters : String, codepoints : A"
},
{
"path": "scripts/generate_llvm_version_info.cr",
"chars": 2322,
"preview": "#! /usr/bin/env crystal\n#\n# This script generates the `lib/llvm_VERSION` file from LLVM-C.dll, needed for\n# dynamically "
},
{
"path": "scripts/generate_object_properties.cr",
"chars": 9005,
"preview": "#! /usr/bin/env crystal\n#\n# This script generates the `src/object/properties.cr` file with the whole set\n# of `[class_]("
},
{
"path": "scripts/generate_ssl_server_defaults.cr",
"chars": 2846,
"preview": "#! /usr/bin/env crystal\n#\n# This helper fetches the Mozilla recommendations for default TLS ciphers\n# (https://wiki.mozi"
},
{
"path": "scripts/generate_unicode_data.cr",
"chars": 10947,
"preview": "#! /usr/bin/env crystal\n#\n# This script generates the file src/unicode/data.cr\n# that contains compact representations o"
},
{
"path": "scripts/generate_windows_zone_names.cr",
"chars": 1884,
"preview": "#! /usr/bin/env crystal\n#\n# This script generates the file src/crystal/system/win32/zone_names.cr\n# that contains mappin"
},
{
"path": "scripts/git/pre-commit",
"chars": 1196,
"preview": "#! /bin/sh\n#\n# This script ensures Crystal code is correctly formatted before committing it.\n# It won't apply any format"
},
{
"path": "scripts/github-changelog.cr",
"chars": 10765,
"preview": "#! /usr/bin/env crystal\n\n# This helper queries merged pull requests for a given milestone from the GitHub API\n# and crea"
},
{
"path": "scripts/grapheme_properties.ecr",
"chars": 1990,
"preview": "# This file was automatically generated by running:\n#\n# scripts/generate_grapheme_properties.cr\n#\n# DO NOT EDIT\n\nstruc"
},
{
"path": "scripts/html_entities.ecr",
"chars": 662,
"preview": "# This file was automatically generated by running:\n#\n# scripts/generate_html_entities.cr\n#\n# DO NOT EDIT\n\nmodule HTML"
},
{
"path": "scripts/print_regex_config.cr",
"chars": 4758,
"preview": "#! /usr/bin/env crystal\n\n{% if Regex::Engine.resolve.name == \"Regex::PCRE2\" %}\n enum LibPCRE2::BSR : UInt32\n UNICODE"
},
{
"path": "scripts/release-update.sh",
"chars": 3101,
"preview": "#!/usr/bin/env sh\n#\n# This helper updates all references to the previous Crystal release as bootstrap version with a new"
},
{
"path": "scripts/test_ssl_server.cr",
"chars": 898,
"preview": "#! /usr/bin/env crystal\n#\n# This helper runs a default `HTTP::Server` instance and checks its behaviour\n# using [testssl"
},
{
"path": "scripts/unicode_data.ecr",
"chars": 9635,
"preview": "# This file was automatically generated by running:\n#\n# scripts/generate_unicode_data.cr\n#\n# DO NOT EDIT\n\nmodule Unico"
},
{
"path": "scripts/update-changelog.sh",
"chars": 2787,
"preview": "#! /bin/sh\n\n# This script automates generating changelog with `scripts/github-changelog.cr`,\n# editing it into `doc/chan"
},
{
"path": "scripts/update-distribution-scripts.sh",
"chars": 2047,
"preview": "#!/usr/bin/env sh\n#\n# This helper updates the reference of [distribution-scripts](https://github.com/crystal-lang/distri"
},
{
"path": "scripts/update-shards.sh",
"chars": 808,
"preview": "#!/usr/bin/env sh\n\n# Update shards release.\n#\n# Usage:\n#\n# scripts/update-shards.sh [<version>]\n#\n# This helper scrip"
},
{
"path": "scripts/windows_zone_names.ecr",
"chars": 1611,
"preview": "# This file was automatically generated by running:\n#\n# scripts/generate_windows_zone_names.cr\n#\n# DO NOT EDIT\n\nmodule"
},
{
"path": "shard.yml",
"chars": 582,
"preview": "name: crystal\nversion: 1.20.0-dev\n\nauthors:\n - Crystal Core Team <crystal@manas.tech>\n\ndescription: |\n The Crystal sta"
},
{
"path": "shell.nix",
"chars": 3575,
"preview": "# This nix-shell script can be used to get a complete development environment\n# for the Crystal compiler.\n#\n# You can ch"
},
{
"path": "spec/all_spec.cr",
"chars": 75,
"preview": "require \"./compiler_spec\"\nrequire \"./std_spec\"\nrequire \"./primitives_spec\"\n"
},
{
"path": "spec/compiler/codegen/abi/aarch64_spec.cr",
"chars": 5250,
"preview": "require \"spec\"\nrequire \"llvm\"\nrequire \"compiler/crystal/codegen/abi/aarch64\"\n\n{% if LibLLVM::BUILT_TARGETS.includes?(:aa"
},
{
"path": "spec/compiler/codegen/abi/arm_spec.cr",
"chars": 4792,
"preview": "require \"spec\"\nrequire \"llvm\"\nrequire \"compiler/crystal/codegen/abi/arm\"\n\n{% if LibLLVM::BUILT_TARGETS.includes?(:arm) %"
},
{
"path": "spec/compiler/codegen/abi/avr_spec.cr",
"chars": 7001,
"preview": "require \"spec\"\nrequire \"llvm\"\nrequire \"compiler/crystal/codegen/abi/avr\"\n\n{% if LibLLVM::BUILT_TARGETS.includes?(:avr) %"
},
{
"path": "spec/compiler/codegen/abi/x86_64_spec.cr",
"chars": 10277,
"preview": "require \"spec\"\nrequire \"llvm\"\nrequire \"compiler/crystal/codegen/abi/x86_64\"\nrequire \"compiler/crystal/codegen/abi/x86_wi"
},
{
"path": "spec/compiler/codegen/abi/x86_spec.cr",
"chars": 5040,
"preview": "{% skip_file if flag?(:win32) %} # 32-bit windows is not supported\n\nrequire \"spec\"\nrequire \"llvm\"\nrequire \"compiler/crys"
},
{
"path": "spec/compiler/codegen/alias_spec.cr",
"chars": 3323,
"preview": "require \"../../spec_helper\"\n\ndescribe \"Code gen: alias\" do\n it \"invokes methods on empty array of recursive alias (1)\" "
},
{
"path": "spec/compiler/codegen/and_spec.cr",
"chars": 4406,
"preview": "require \"../../spec_helper\"\n\ndescribe \"Code gen: and\" do\n it \"codegens and with bool false and false\" do\n run(\"false"
},
{
"path": "spec/compiler/codegen/array_literal_spec.cr",
"chars": 5041,
"preview": "require \"../../spec_helper\"\n\ndescribe \"Code gen: array literal spec\" do\n it \"creates custom non-generic array\" do\n r"
},
{
"path": "spec/compiler/codegen/asm_spec.cr",
"chars": 1506,
"preview": "require \"../../spec_helper\"\n\ndescribe \"Code gen: asm\" do\n # TODO: arm asm tests\n {% if flag?(:i386) || flag?(:x86_64) "
},
{
"path": "spec/compiler/codegen/automatic_cast_spec.cr",
"chars": 4836,
"preview": "require \"../../spec_helper\"\n\ndescribe \"Code gen: automatic cast\" do\n it \"casts literal integer (Int32 -> Int64)\" do\n "
},
{
"path": "spec/compiler/codegen/block_spec.cr",
"chars": 26309,
"preview": "require \"../../spec_helper\"\n\ndescribe \"Code gen: block\" do\n it \"generate inline\" do\n run(<<-CRYSTAL).to_i.should eq("
}
]
// ... and 2317 more files (download for full content)
About this extraction
This page contains the full source code of the crystal-lang/crystal GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2517 files (16.3 MB), approximately 4.1M tokens, and a symbol index with 494 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.