crystal v0.36.0 Release Notes

Release Date: 2021-01-26 // about 3 years ago
  • Language changes

    • (breaking-change) Reject annotations on ivars defined in base class. (#9502, thanks @waj)
    • (breaking-change) Make ** be right associative. (#9684, thanks @asterite)

    Macros

    • (breaking-change) Deprecate TypeNode#has_attribute? in favor of #annotation. (#9950, thanks @HertzDevil)
    • ๐Ÿ‘Œ Support heredoc literal in macro. (#9467, thanks @MakeNowJust)
    • ๐Ÿ‘Œ Support %Q, %i, %w, and %x literals in macros. (#9811, thanks @toddsundsted)
    • ๐Ÿ‘ Allow executing multi-assignments in macros. (#9440, thanks @MakeNowJust)

    Standard library

    • (breaking-change) Drop deprecated CRC32, Adler32 top-level. (#9530, thanks @bcardiff)
    • (breaking-change) Drop deprecated Flate, Gzip, Zip, Zlib top-level. (#9529, thanks @bcardiff)
    • (breaking-change) Drop deprecated with_color top-level method. (#9531, thanks @bcardiff)
    • (breaking-change) Make SemanticVersion parsing more strict. (#9868, thanks @hugopl)
    • Respect explicitly provided type vars for Tuple.new and NamedTuple.new. (#10047, thanks @HertzDevil)
    • ๐Ÿ›  Fix OptionParser to handle sub-commands with hyphen. (#9465, thanks @erdnaxeli)
    • ๐Ÿ›  Fix OptionParser to not call handler if value is given to none value handler. (#9603, thanks @MakeNowJust)
    • ๐Ÿ‘‰ Make def_equals compare first by reference. (#9650, thanks @waj)
    • โœ‚ Remove unnecessary def ==(other) fallbacks. (#9571, thanks @MakeNowJust)
    • ๐Ÿ›  Fix OptionParser indentation of option descriptions. (#10183, thanks @wonderix)
    • โž• Add #hash to Log::Metadata, Path, SemanticVersion, Socket::Address, URI::Params, and UUID. (#10119, thanks @straight-shoota)
    • ๐Ÿ”จ Refactor several case statements with exhaustive case/in. (#9656, thanks @Sija)
    • โœ‚ Remove Kernel mentions in docs. (#9549, thanks @toddsundsted)
    • ๐Ÿ‘Œ Improve docs for Object#dup. (#10053, thanks @straight-shoota)
    • ๐Ÿ›  Fix example codes in multiple places. (#9818, thanks @maiha)
    • ๐Ÿ›  Fix typos, misspelling and styling. (#9636, #9638, #9561, #9786, #9840, #9844, #9854, #9869, #10068, #10123, #10102, #10116, #10229, #10252, thanks @kubo, @m-o-e, @mgomes, @philipp-classen, @dukeraphaelng, @camreeves, @docelic, @ilmanzo, @Sija, @pxeger, @oprypin)

    Macros

    • ๐Ÿ›  Fix documentation for #[]= macro methods. (#10025, thanks @HertzDevil)

    Numeric

    • (breaking-change) Move Complex#exp, Complex#log, etc. to Math.exp, Math.log overloads. (#9739, thanks @cristian-lsdb)
    • ๐ŸŽ (performance) Use unchecked arithmetics in Int#times. (#9511, thanks @waj)
    • Check for overflow when extending signed integers to unsigned integers. (#10000, thanks @HertzDevil)
    • ๐Ÿ›  Fix sprintf for zero left padding a negative number. (#9725, thanks @asterite)
    • ๐Ÿ›  Fix BigInt#to_64 and BigInt#hash. (#10121, thanks @oprypin)
    • ๐Ÿ›  Fix BigDecimal#to_s for numbers between -1 and 0. (#9897, thanks @dukeraphaelng)
    • ๐Ÿ›  Fix Number#step. (#10130, #10295, thanks @straight-shoota, @bcardiff)
    • ๐Ÿ‘‰ Make Complex unary plus returns self. (#9719, thanks @asterite)
    • ๐Ÿ‘Œ Improve Int#lcm and Int#gcd. (#9999, thanks @HertzDevil)
    • โž• Add Math::TAU. (#10179, thanks @j8r)
    • โž• Add wrapped unary negation to unsigned integer types to allow &- x expressions. (#9947, thanks @HertzDevil)
    • ๐Ÿ‘Œ Improve documentation of mathematical functions. (#9994, thanks @HertzDevil)

    Text

    • (breaking-change) Fix String#index not working well for broken UTF-8 sequences. (#9713, thanks @asterite)
    • ๐ŸŽ (performance) String: Don't materialize Regex match[0] if not needed. (#9615, thanks @asterite)
    • ๐Ÿ›  Fix String#rindex default offset for matching empty regex correctly. (#9690, thanks @MakeNowJust)
    • โž• Add various String#delete_at methods. (#9398, thanks @asterite)
    • Raise if passing null Pointer to String. (#9653, thanks @jgaskins)
    • โž• Add Regex#capture_count. (#9746, thanks @Sija)
    • โž• Add Regex::MatchData#[] overloading to Range. (#10076, thanks @MakeNowJust)
    • ๐Ÿ›  Fix duplicates in String documentation. (#9987, thanks @Nicolab)
    • โž• Add docs for substitution to Kernel.sprintf. (#10227, thanks @straight-shoota)

    Collections

    • (breaking-change) Make Hash#reject!, Hash#select!, and Hash#compact! consistent with Array and return self. (#9904, thanks @caspiano)
    • (breaking-change) Deprecate Hash#delete_if in favor of Hash#reject!, add Dequeue#reject! and Dequeue#select!. (#9878, thanks @caspiano)
    • (breaking-change) Change Set#delete to return Bool. (#9590, thanks @j8r)
    • (breaking-change) Drop deprecated Enumerable#grep. (#9711, thanks @j8r)
    • (breaking-change) Remove Hash#key_index . (#10016, thanks @asterite)
    • (breaking-change) Deprecate StaticArray#[]=(value) in favor of StaticArray#fill. (#10027, thanks @HertzDevil)
    • (breaking-change) Rename Set#{sub,super}set? to {sub,super}set_of?. (#10187, thanks @straight-shoota)
    • ๐ŸŽ (performance) Optimize Array#shift and Array#unshift. (#10081, thanks @asterite)
    • ๐ŸŽ (performance) Array#rotate optimization for small arrays. (#8516, thanks @wontruefree)
    • โช Fix Hash#dup and Hash#clone to return correct type for subclasses. (#9871, thanks @vlazar) (Reverted by #10331 in 0.36.1)
    • ๐Ÿ›  Fix Iterator#cons_pair return type. (#9788, thanks @asterite)
    • ๐Ÿ›  Fix key type restriction of Hash#merge block. (#9495, thanks @MakeNowJust)
    • ๐Ÿ›  Fix Range#step. (#10203, thanks @straight-shoota)
    • Let Range#step delegate to begin.step and allow float based ranges to be stepped. (#10209, thanks @straight-shoota)
    • ๐Ÿ›  Fix Indexable#join with IO. (#10152, thanks @straight-shoota)
    • ๐Ÿ›  Fix Flatten for value-type iterators. (#10096, thanks @f-fr)
    • Fix Indexable.range_to_index_and_count to not raise IndexError. (#10191, thanks @straight-shoota)
    • ๐Ÿ‘ฏ Handle recursive structures in def_clone, Hash, Array, Dequeue. (#9800, thanks @asterite)
    • โž• Add BitArray#dup. (#9550, thanks @andremedeiros)
    • ๐Ÿ‘ Allow Iterator#zip to take multiple Iterator arguments. (#9944, thanks @HertzDevil)
    • โž• Add Iterator#with_object(obj, &). (#9956, thanks @HertzDevil)
    • Always clear unused bits of BitArrays. (#10008, thanks @HertzDevil)
    • โšก๏ธ Update Enumerable#sum(initial, &) docs. (#9860, thanks @jage)
    • โž• Add Array#unsafe_build. (#10092, thanks @straight-shoota)
    • โž• Add identity methods for #sum and #product. (#10151, thanks @straight-shoota)
    • ๐Ÿšš Move combinations, permutations, etc., from Array to Indexable. (#10235, thanks @wonderix)
    • ๐Ÿšš Move sampling methods to Enumerable. (#10129, thanks @HertzDevil)
    • ๐Ÿ“š Use Set#add in Set#add documentation. (#9441, thanks @hugopl)
    • ๐Ÿ‘Œ Improve Hash#values_at docs. (#9955, thanks @j8r)

    Serialization

    • (breaking-change) Drop deprecated JSON.mapping. (#9527, thanks @bcardiff)
    • (breaking-change) Drop deprecated YAML.mapping. (#9526, thanks @bcardiff)
    • ๐Ÿ›  Fix flag enum deserialization from Int64. (#10145, thanks @straight-shoota)
    • โž• Add support for selective JSON and YAML serialization. (#9567, thanks @stakach)
    • YAML: correctly serialize infinity and NaN. (#9780, thanks @asterite)
    • YAML: allow using discriminator in contained types. (#9851, thanks @asterite)
    • Support more literal types in JSON::Serializable.use_json_discriminator macro. (#9222, thanks @voximity)
    • Support more literal types in YAML::Serializable.use_yaml_discriminator macro. (#10149, thanks @straight-shoota)
    • โž• Add JSON serialization to big number types. (#9898, #10054, thanks @dukeraphaelng, @Sija)
    • 0๏ธโƒฃ Handle namespaced defaults in JSON::Serializable and YAML::Serializable. (#9733, thanks @jgaskins)
    • Standardize YAML error location. (#9273, thanks @straight-shoota)
    • โšก๏ธ Update YAML::Field(converter) argument docs. (#9557, thanks @dscottboggs)
    • ๐Ÿ‘‰ Use content instead of value when inspect XML::Attribute. (#9592, thanks @asterite)
    • ๐Ÿ“œ Let JSON::PullParser#on_key yield self and return value. (#10028, thanks @straight-shoota)
    • Cleanup YAML/JSON Any#dig methods. (#9415, thanks @j8r)
    • ๐Ÿ“œ Document JSON::PullParser. (#9983, thanks @erdnaxeli)
    • Clarify Serialization Converter requirements and examples. (#10202, thanks @Daniel-Worrall)

    Time

    • (breaking-change) Drop deprecated Time::Span.new variants. (#10051, thanks @Sija)
    • (breaking-change) Deprecate Time::Span#duration, use Time::Span#abs. (#10144, thanks @straight-shoota)
    • โž• Add %Z time format directive. (#10141, thanks @straight-shoota)
    • ๐Ÿ‘Œ Improve handling edge cases for Time::Location#load. (#10140, thanks @straight-shoota)
    • Enable pending specs. (#10093, thanks @straight-shoota)
    • ๐Ÿ‘Œ Improve Time::Span arithmetic specs. (#10143, thanks @straight-shoota)

    Files

    • (breaking-change) Make File.size and FileInfo#size be Int64 instead of UInt64. (#10015, thanks @asterite)
    • (breaking-change) Fix FileUtils.cp_r when destination is a directory. (#10180, thanks @wonderix)
    • ๐Ÿง Enable large-file support on i386-linux-gnu. (#9478, thanks @kubo)
    • ๐Ÿ›  Fix glob not following symdir directories. (#9910, thanks @straight-shoota)
    • ๐Ÿ Windows: allow creating symlinks without admin rights. (#9767, thanks @oprypin)
    • ๐Ÿ Windows: allow touching directories. (#10284, thanks @straight-shoota)
    • ๐Ÿ›  Fix Dir.glob when readdir doesn't report file type. (#9877, thanks @straight-shoota)
    • โž• Add Path#stem. (#10037, thanks @straight-shoota)
    • Move File#fsync, File#flock_exclusive, File#flock_shared, and File#flock_unlock methods to IO::FileDescriptor. (#9794, thanks @naqvis)
    • ๐Ÿ— Call IO#flush on builder finish methods. (#9321, thanks @straight-shoota)
    • ๐Ÿ‘Œ Support using Path in MIME and File::Error APIs. (#10034, thanks @Blacksmoke16)
    • ๐Ÿ Windows: enable FileUtils specs. (#9902, thanks @oprypin)

    Networking

    • (breaking-change) Rename HTTP::Params to URI::Params. (#10098, thanks @straight-shoota)
    • (breaking-change) Rename URI#full_path to URI#request_target. (#10099, thanks @straight-shoota)
    • (breaking-change) URI::Params#[]= replaces all values. (#9605, thanks @asterite)
    • ๐Ÿ›  Fix type of HTTP::Server::Response#closed? to Bool. (#9489, thanks @straight-shoota)
    • ๐Ÿ›  Fix Socket#accept to obey read_timeout. (#9538, thanks @waj)
    • ๐Ÿ›  Fix Socket to allow datagram over unix sockets. (#9838, thanks @bcardiff)
    • ๐Ÿ›  Fix HTTP::Headers#== and HTTP::Headers#hash. (#10186, thanks @straight-shoota)
    • ๐Ÿ‘‰ Make HTTP::StaticFileHandler serve pre-gzipped content. (#9626, thanks @waj)
    • โœ‚ Delete Content-Encoding and Content-Length headers after decompression in HTTP::Client::Response. (#5212, thanks @maiha)
    • Delay setup of HTTP::CompressHandler until content is written. (#9625, thanks @waj)
    • ๐Ÿ‘ Allow HTTP::Client to work with any IO. (#9543, thanks @waj)
    • ๐Ÿ‘‰ Make HTTP::Server don't override content-length if already set. (#9726, thanks @asterite)
    • Do not share underlying hash between URI::Params. (#9641, thanks @jgaskins)
    • โž• Add HTTP::Cookie::SameSite::None. (#9262, thanks @j8r)
    • โž• Add HTTP::Client logging and basic instrumentation. (#9756, thanks @bcardiff)
    • โž• Add HTTP::Request#hostname+ utils. (#10029, thanks @straight-shoota)
    • โž• Add URI#authority. (#10100, thanks @straight-shoota)
    • โž• Add Socket::IPAddress#private?. (#9517, thanks @jgillich)
    • ๐Ÿ‘‰ Make Socket::IpAddress a bit more type-friendly. (#9528, thanks @asterite)
    • ๐Ÿ‘‰ Make specs pass in non-IPv6 environments. (#9438, thanks @jhass)
    • ๐Ÿ‘‰ Make specs pending instead of failing in no multi-cast environments. (#9566, thanks @jhass)
    • โœ‚ Remove invalid optimization on Encoding. (#9724, thanks @asterite)
    • โฌ‡๏ธ Drop RemoteAddressType private alias. (#9777, thanks @bcardiff)
    • โž• Add documentation for HTTP::WebSocket. (#9761, #9778, thanks @ibraheemdev, @bcardiff)
    • ๐Ÿ›  Fix HTTP docs. (#9612, #9627, #9717, thanks @RX14, @asterite, @3n-k1)
    • ๐Ÿ›  Fix reference to TCP protocol in docs. (#9457, thanks @dprobinson)

    ๐ŸŒฒ Logging

    • (breaking-change) Drop deprecated Logger. (#9525, thanks @bcardiff)
    • ๐ŸŽ (performance) Add logging dispatcher to defer entry dispatch from current fiber. (#9432, thanks @waj)
    • ๐ŸŒฒ Take timestamp as an argument in Log::Entry initializer. (#9570, thanks @Sija)
    • ๐Ÿ‘Œ Improve docs regarding Log.setup. (#9497, #9559, thanks @caspiano, @jjlorenzo)

    Crypto

    • ๐Ÿ”’ (security) Fix "force-peer" verify_mode setup. (#9668, thanks @PhilAtWysdom)
    • ๐Ÿ”’ (security) Force secure renegotiation on server to prevent Secure Client-Initiated Renegotiation vulnerability attack. (#9815, thanks @bcardiff)
    • (breaking-change) Refactor Digest and introduce Digest::MD5, Digest::SHA1, Digest::SHA256, Digest::SHA512 backed by openssl. (#9864, thanks @bcardiff)
    • ๐Ÿ›  Fix overflows in MD5 and SHA1. (#9781, thanks @bcardiff)
    • Add OpenSSL::SSL::Context#set_modern_ciphers and related methods to set ciphers and cipher suites in a more portable fashion. (#9814, #10298, thanks @bcardiff)
    • โž• Add OpenSSL::SSL::Context#security_level. (#9831, thanks @bcardiff)
    • OpenSSL::digest add require for OpenSSL::Error. (#10173, thanks @wonderix)

    Concurrency

    • (breaking-change) Hide Channel internal implementation methods. (#9564, thanks @j8r)
    • Channel#close returns true unless the channel was already closed. (#9443, thanks @waj)
    • ๐Ÿ‘Œ Support splat expressions inside spawn macro. (#10234, thanks @HertzDevil)
    • โœ‚ Remove incorrect note about negative timeout not triggering. (#10131, thanks @straight-shoota)

    System

    • ๐Ÿ›  Fix Process.find_executable to check the found path is executable and add Windows support. (#9365, thanks @oprypin)
    • Add Process.parse_arguments and fix CRYSTAL_OPTS parsing. (#9518, thanks @MakeNowJust)
    • Port to NetBSD. (#9360, thanks @niacat)
    • โž• Add note about raising IO::Error to Process methods. (#9894, thanks @straight-shoota)
    • Handle errors in User/Group from_name?/from_id? as not found. (#10182, thanks @wonderix)
    • define the SC_PAGESIZE constant on more platforms. (#9821, thanks @carlhoerberg)

    โš™ Runtime

    • ๐Ÿ›  Fix bug with passing many args then a struct in Win64 C lib ABI. (#9520, thanks @oprypin)
    • ๐Ÿ›  Fix C ABI for AArch64. (#9430, thanks @jhass)
    • Disable LLVM Global Isel. (#9401, #9562, thanks @jhass, @bcardiff)
    • ๐Ÿ–จ Print original exception after failing to raise it. (#9220, thanks @jhass)
    • ๐Ÿ–จ Use Dwarf information on Exception::CallStack.print_frame and crash stacktraces. (#9792, #9852, thanks @bcardiff)
    • MachO: Handle missing LC_UUID. (#9706, thanks @bcardiff)
    • ๐Ÿ‘ Allow WeakRef to compile with -Dgc_none. (#9806, thanks @bcardiff)
    • ๐Ÿ›  Fix example in Crystal.main docs. (#9736, thanks @hugopl)
    • โž• Add a C ABI spec for accepting a large struct - failing on Win32, AArch64. (#9534, thanks @oprypin)
    • Don't relativize paths outside of current directory in backtrace. (#10177, thanks @Sija)
    • Avoid loading DWARF if env var CRYSTAL_LOAD_DWARF=0. (#10261, thanks @bcardiff)
    • ๐Ÿ›  Fix DWARF loading in FreeBSD. (#10259, thanks @bcardiff)
    • Print unhandled exceptions from main routine with #inspect_with_backtrace. (#10086, thanks @straight-shoota)

    Spec

    • (breaking-change) Add support for custom failure messages in expectations. (#10127, #10289, thanks @Fryguy, @straight-shoota)
    • ๐Ÿ‘ Allow absolute file paths in crystal spec CLI. (#9951, thanks @KevinSjoberg)
    • ๐Ÿ‘ Allow --link-flags to be used. (#6243, thanks @bcardiff)
    • ๐Ÿ‘Œ Improve duration display in spec --profile. (#10044, thanks @straight-shoota)
    • โž• Add exception handler in spec at_exit. (#10106, thanks @straight-shoota)

    Compiler

    • ๐ŸŽ (performance) Don't use init check for constants that are declared before read. (#9801, thanks @asterite)
    • ๐ŸŽ (performance) Don't use init check for class vars initialized before read. (#9995, thanks @asterite)
    • ๐ŸŽ (performance) Don't use init flag for string constants. (#9808, thanks @asterite)
    • โš™ Run side effects for class var with constant initializer. (#10010, thanks @asterite)
    • ๐Ÿ›  Fix VaList and disable va_arg for AArch64. (#9422, thanks @jhass)
    • ๐Ÿ›  Fix cache corrupted when compilation is cancelled. (#9558, thanks @waj)
    • Consider select as an openning keyword in macros. (#9624, thanks @asterite)
    • ๐Ÿ‘‰ Use function attribute frame-pointer. (#9361, thanks @kubo39)
    • Make missing __crystal_raise_overflow error more clear. (#9686, thanks @3n-k1)
    • Forbid calls with both block arg and block. (#10026, thanks @HertzDevil)
    • โž• Add method name to frozen type error. (#10057, thanks @straight-shoota)
    • ๐Ÿ”’ Use file lock to avoid clashes between compilations. (#10050, thanks @asterite)
    • โž• Add a couple of missing end locations to some nodes. (#10012, thanks @asterite)
    • Don't visit enum member expanded by macro twice. (#10105, thanks @asterite)
    • ๐Ÿ›  Fix crash when matching arguments against splat restriction after positional parameters. (#10172, thanks @HertzDevil)
    • ๐Ÿ›  Fix parsing of do end blocks inside parenthesis. (#10189, #10207, thanks @straight-shoota, @Sija)
    • ๐Ÿ›  Fix regex parsing after then in case/when. (#10274, thanks @asterite)
    • ๐Ÿ›  Fix error message for non-exhaustive case statements of 3 or more Bool/Enum values. (#10194, thanks @HertzDevil)
    • Forbid reopening generic types with different type var splats. (#10167, thanks @HertzDevil)
    • Apply stricter checks to macro names. (#10069, thanks @HertzDevil)
    • Reword error message when including/inheriting generic type without type vars. (#10206, thanks @HertzDevil)
    • ๐Ÿ–จ Print a message pointing to the online playground if compiled without it. (#9622, thanks @deiv)
    • ๐Ÿ– Handle typedef type restriction against alias type correctly. (#9490, thanks @MakeNowJust)
    • ๐ŸŽ‰ Initial support LLVM 11.0 with known issue regarding optimizations #10220. (#9829, #10293, thanks @bcardiff)
    • โž• Add support for --mcpu native. (#10264, #10276, thanks @BlobCodes, @bcardiff)
    • ๐Ÿ›  Fix Process.run uses in compiler to handle exec failure. (#9893, #9911, #9913, thanks @straight-shoota, @bcardiff, @oprypin)
    • ๐Ÿ›  Fix Command#report_warnings to gracefully handle missing Compiler#program. (#9866, thanks @straight-shoota)
    • โž• Add Program#host_compiler. (#9920, thanks @straight-shoota)
    • โž• Add Crystal::Path#name_size implementation. (#9380, thanks @straight-shoota)
    • ๐Ÿ”จ Refactor helper methods in call_error.cr. (#9376, thanks @straight-shoota)
    • Delegate def error location to implementing type. (#10159, thanks @straight-shoota)
    • ๐Ÿ”จ Refactor Crystal::Exception to Crystal::CodeError. (#10197, thanks @straight-shoota)
    • Refactor check_single_def_error_message. (#10196, thanks @straight-shoota)
    • Code clean-ups. (#9468, thanks @MakeNowJust)
    • ๐Ÿ”จ Refactors for compiler specs. (#9379, thanks @straight-shoota)
    • ๐Ÿ Windows CI: Fix and enable compiler specs. (#9348, #9560, thanks @oprypin)

    Language semantics

    • (breaking-change) Handle union restrictions with free vars properly. (#10267, thanks @HertzDevil)
    • (breaking-change) Disallow keywords as block argument name. (#9704, thanks @asterite)
    • (breaking-change) Fix a-b -c incorrectly parsed as a - (b - c). (#9652, #9884, thanks @asterite, @bcardiff)
    • (breaking-change) Check abstract def implementations with splats, default values and keyword arguments. (#9585, thanks @waj)
    • (breaking-change) Make abstract def return type warning an error. (#9810, thanks @bcardiff)
    • (breaking-change) Error when abstract def implementation adds a type restriction. (#9634, thanks @waj)
    • (breaking-change) Don't interpret Proc typedefs as aliases. (#10254, thanks @HertzDevil)
    • (breaking-change) Remove the special logic of union of pointer and nil. (#9872, thanks @asterite)
    • Check abstract def implementations with double splats. (#9633, thanks @waj)
    • ๐Ÿ‘‰ Make inherited hook work through generic instances. (#9701, thanks @asterite)
    • Attach doc comment to annotation in macro expansion. (#9630, thanks @MakeNowJust)
    • Marks else branch of exhaustive case as unreachable, improving resulting type. (#9659, thanks @Sija)
    • ๐Ÿ‘‰ Make Pointer(T)#value= stricter for generic arguments. (#10224, thanks @asterite)
    • Extend type filtering of conditional clauses to arbitrary logical connectives. (#10147, thanks @HertzDevil)
    • ๐Ÿ‘Œ Support NamedTuple instance restrictions in redefinition checks. (#10245, thanks @HertzDevil)
    • Respect block arg restriction when given block has a splat parameter. (#10242, thanks @HertzDevil)
    • ๐Ÿ‘‰ Make overloads without double splat more specialized than overloads with one. (#10185, thanks @HertzDevil)
    • ๐Ÿ‘Œ Support type splats inside explicit Unions in type restrictions. (#10174, thanks @HertzDevil)
    • ๐Ÿ›  Fix splats on generic arguments. (#9859, thanks @asterite)
    • Correctly compute line number after macro escape. (#9858, thanks @asterite)
    • ๐Ÿ›  Fix bug for C structs assigned to a type. (#9743, thanks @matthewmcgarvey)
    • Promote C variadic args as needed. (#9747, thanks @asterite)
    • ๐Ÿ›  Fix parsing of def self./ and def self.%. (#9721, thanks @asterite)
    • ๐Ÿ›  Fix ASTNode#to_s for parenthesized expression in block. (#9629, thanks @MakeNowJust)
    • Don't form a closure on typeof(@ivar). (#9723, thanks @asterite)
    • โž• Add a few missing expanded.transform self. (#9506, thanks @asterite)
    • Treat super as special only if it doesn't have a receiver (i.e.: allow super user defined methods). (#10011, thanks @asterite)
    • ๐Ÿ‘ Implement auto-casting in a better way. (#9501, thanks @asterite)
    • Try literal type first when autocasting to unions types. (#9610, thanks @asterite)
    • Correctly pass named arguments for previous_def and super. (#9834, thanks @asterite)
    • Turn proc pointer into proc literal in some cases to closure needed variables. (#9824, thanks @asterite)
    • ๐Ÿ›  Fix proc of self causing multi-dispatch. (#9972, thanks @asterite)
    • ๐Ÿ›  Fixes and improvements to closured variables. (#9986, thanks @asterite)
    • ๐Ÿ”€ Don't merge proc types but allow assigning them if they are compatible. (#9971, thanks @asterite)
    • Reset nilable vars inside block method. (#10091, thanks @asterite)
    • ๐Ÿ†“ Reset free vars before attempting each overload match. (#10271, thanks @HertzDevil)
    • ๐Ÿ‘ Let offsetof support Tuples. (#10218, thanks @hugopl)

    Tools

    • Fetch git config correctly. (#9640, thanks @dorianmariefr)

    Formatter

    • Avoid adding a newline after comment before end. (#9722, thanks @asterite)
    • Apply string pieces combination even if heredoc has no indent. (#9475, thanks @MakeNowJust)
    • Correctly format named arguments like foo:bar. (#9740, thanks @asterite)
    • ๐Ÿ– Handle comment before do in a separate line. (#9762, thanks @asterite)
    • ๐Ÿ›  Fix indent for the first comment of select when/else. (#10002, thanks @MakeNowJust)
    • โฌ‡๏ธ Reduce redundant newlines at end of begin ... end. (#9741, thanks @MakeNowJust)
    • Let formatter normalize crystal language tag for code blocks in doc comments. (#10156, thanks @straight-shoota)
    • ๐Ÿ›  Fix indentation of trailing comma in call with a block. (#10223, thanks @MakeNowJust)

    Doc generator

    • ๐Ÿ”— Linkification: refactor, fix edge cases and add specs. (#9817, thanks @oprypin)
    • ๐Ÿ“„ Exclude types from docs who are in nodoc namespaces. (#9819, thanks @Blacksmoke16)
    • ๐Ÿ›  Fix link generation for lib type reference. (#9931, thanks @straight-shoota)
    • Correctly render underscores in code blocks. (#9822, thanks @Blacksmoke16)
    • ๐Ÿ›  Fix some HTML in docs generator. (#9918, thanks @straight-shoota)
    • Correctly handle broken source code on syntax highlighting. (#9416, thanks @MakeNowJust)
    • ๐Ÿ“„ Re-introduce canonical URL for docs generator. (#9917, thanks @straight-shoota)
    • ๐Ÿ”ฆ Expose "location" and "args_html" in doc JSON. (#10122, #10200, thanks @oprypin)
    • ๐Ÿ”ฆ Expose "aliased_html" in doc JSON, make "aliased" field nullable. (#10117, thanks @oprypin)
    • ๐Ÿ‘Œ Support linking to section headings in same tab. (#9826, thanks @Blacksmoke16)
    • Do not highlight undef as a keyword, it's not. (#10216, thanks @rhysd)

    Others

    • CI improvements and housekeeping. (#9507, #9513, #9512, #9515, #9514, #9609, #9642, #9758, #9763, #9850, #9906, #9907, #9912, #10078, #10217, #10255, thanks @jhass, @bcardiff, @waj, @oprypin, @j8r, @Sija)
    • โž• Add timeout to individual specs on multi-threading. (#9865, thanks @bcardiff)
    • ๐ŸŽ‰ Initial AArch64 CI. (#9508, #9582, thanks @jhass, @waj)
    • โšก๏ธ Update distribution-scripts and use LLVM 10 on Linux packages. (#9710, thanks @bcardiff)
    • โšก๏ธ Update distribution-scripts and publish nightly packages to bintray. (#9663, thanks @bcardiff)
    • โšก๏ธ Update distribution-scripts to use Shards v0.13.0. (#10280, thanks @bcardiff)
    • ๐ŸŽ‰ Initial Nix development environment. Use Nix for OSX CI instead of homebrew. (#9727, #9776, thanks @bcardiff)
    • Prevent recursive call in bin/crystal wrapper. (#9505, thanks @jhass)
    • ๐Ÿ‘ Allow overriding CRYSTAL_PATH in bin/crystal wrapper . (#9632, thanks @bcardiff)
    • ๐Ÿ‘‰ Makefile: support changing the current crystal via env var and argument. (#9471, thanks @bcardiff)
    • ๐Ÿ‘‰ Makefile: improve supported LLVM versions message. (#10221, #10269, thanks @rdp, @straight-shoota)
    • โšก๏ธ Update CONTRIBUTING.md. (#9448, #10249, #10250, thanks @wontruefree, @sanks64, @straight-shoota)
    • ๐Ÿ”จ Refactor RedBlackTree sample to use an enum instead of symbols. (#10233, thanks @Sija)
    • โž• Add security policy. (#9984, thanks @straight-shoota)
    • ๐Ÿ“„ Use name: nightly in docs-versions.sh for HEAD. (#9915, thanks @straight-shoota)
    • ๐Ÿ“„ Use canonical base url for generating docs. (#10007, thanks @straight-shoota)
    • โœ‚ Remove Vagrantfile. (#10033, thanks @straight-shoota)
    • โšก๏ธ Update NOTICE's copyright year to 2021. (#10166, thanks @matiasgarciaisaia)