I: pbuilder: network access will be disabled during build I: Current time: Fri Jul 18 06:43:35 +14 2025 I: pbuilder-time-stamp: 1752770615 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/trixie-reproducible-base.tgz] I: copying local configuration W: --override-config is not set; not updating apt.conf Read the manpage for details. I: mounting /proc filesystem I: mounting /sys filesystem I: creating /{dev,run}/shm I: mounting /dev/pts filesystem I: redirecting /dev/ptmx to /dev/pts/ptmx I: policy-rc.d already exists I: Copying source file I: copying [crystal_1.12.1+dfsg-1.dsc] I: copying [./crystal_1.12.1+dfsg.orig.tar.xz] I: copying [./crystal_1.12.1+dfsg-1.debian.tar.xz] I: Extracting source gpgv: Signature made Fri May 17 19:11:29 2024 gpgv: using RSA key C450196033B24682EFE44C9D7CB6E83D8605423A gpgv: issuer "deiv@debian.org" gpgv: Can't check signature: No public key dpkg-source: warning: cannot verify inline signature for ./crystal_1.12.1+dfsg-1.dsc: no acceptable signature found dpkg-source: info: extracting crystal in crystal-1.12.1+dfsg dpkg-source: info: unpacking crystal_1.12.1+dfsg.orig.tar.xz dpkg-source: info: unpacking crystal_1.12.1+dfsg-1.debian.tar.xz dpkg-source: info: using patch list from debian/patches/series dpkg-source: info: applying disable-udp-multicast-specs.diff dpkg-source: info: applying remove-check-in-random-failing-test.diff dpkg-source: info: applying update-packaged-javascript-links.patch I: Not using root during the build. I: Installing the build-deps I: user script /srv/workspace/pbuilder/667784/tmp/hooks/D01_modify_environment starting debug: Running on ionos15-amd64. I: Changing host+domainname to test build reproducibility I: Adding a custom variable just for the fun of it... I: Changing /bin/sh to bash '/bin/sh' -> '/bin/bash' lrwxrwxrwx 1 root root 9 Jul 17 16:43 /bin/sh -> /bin/bash I: Setting pbuilder2's login shell to /bin/bash I: Setting pbuilder2's GECOS to second user,second room,second work-phone,second home-phone,second other I: user script /srv/workspace/pbuilder/667784/tmp/hooks/D01_modify_environment finished I: user script /srv/workspace/pbuilder/667784/tmp/hooks/D02_print_environment starting I: set BASH=/bin/sh BASHOPTS=checkwinsize:cmdhist:complete_fullquote:extquote:force_fignore:globasciiranges:globskipdots:hostcomplete:interactive_comments:patsub_replacement:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() BASH_LINENO=([0]="12" [1]="0") BASH_LOADABLES_PATH=/usr/local/lib/bash:/usr/lib/bash:/opt/local/lib/bash:/usr/pkg/lib/bash:/opt/pkg/lib/bash:. BASH_SOURCE=([0]="/tmp/hooks/D02_print_environment" [1]="/tmp/hooks/D02_print_environment") BASH_VERSINFO=([0]="5" [1]="2" [2]="21" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu") BASH_VERSION='5.2.21(1)-release' BUILDDIR=/build/reproducible-path BUILDUSERGECOS='second user,second room,second work-phone,second home-phone,second other' BUILDUSERNAME=pbuilder2 BUILD_ARCH=amd64 DEBIAN_FRONTEND=noninteractive DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=42 ' DIRSTACK=() DISTRIBUTION=trixie EUID=0 FUNCNAME=([0]="Echo" [1]="main") GROUPS=() HOME=/root HOSTNAME=i-capture-the-hostname HOSTTYPE=x86_64 HOST_ARCH=amd64 IFS=' ' INVOCATION_ID=204ca5bfd66243468fe340bf80626896 LANG=C LANGUAGE=et_EE:et LC_ALL=C MACHTYPE=x86_64-pc-linux-gnu MAIL=/var/mail/root OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path PBCURRENTCOMMANDLINEOPERATION=build PBUILDER_OPERATION=build PBUILDER_PKGDATADIR=/usr/share/pbuilder PBUILDER_PKGLIBDIR=/usr/lib/pbuilder PBUILDER_SYSCONFDIR=/etc PIPESTATUS=([0]="0") POSIXLY_CORRECT=y PPID=667784 PS4='+ ' PWD=/ SHELL=/bin/bash SHELLOPTS=braceexpand:errexit:hashall:interactive-comments:posix SHLVL=3 SUDO_COMMAND='/usr/bin/timeout -k 24.1h 24h /usr/bin/ionice -c 3 /usr/bin/nice -n 11 /usr/bin/unshare --uts -- /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.tXQjwX0d/pbuilderrc_6Kws --distribution trixie --hookdir /etc/pbuilder/rebuild-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/trixie-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.tXQjwX0d/b2 --logfile b2/build.log crystal_1.12.1+dfsg-1.dsc' SUDO_GID=111 SUDO_UID=106 SUDO_USER=jenkins TERM=unknown TZ=/usr/share/zoneinfo/Etc/GMT-14 UID=0 USER=root _='I: set' http_proxy=http://213.165.73.152:3128 I: uname -a Linux i-capture-the-hostname 6.7.12+bpo-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.7.12-1~bpo12+1 (2024-05-06) x86_64 GNU/Linux I: ls -l /bin lrwxrwxrwx 1 root root 7 Jul 15 17:46 /bin -> usr/bin I: user script /srv/workspace/pbuilder/667784/tmp/hooks/D02_print_environment finished -> Attempting to satisfy build-dependencies -> Creating pbuilder-satisfydepends-dummy package Package: pbuilder-satisfydepends-dummy Version: 0.invalid.0 Architecture: amd64 Maintainer: Debian Pbuilder Team Description: Dummy package to satisfy dependencies with aptitude - created by pbuilder This package was created automatically by pbuilder to satisfy the build-dependencies of the package being currently built. Depends: debhelper-compat (= 13), git, libbsd-dev, libedit-dev, libevent-dev, libgc-dev (>= 1:7.6.0), libgmp-dev, libpcre2-dev, libssl-dev, libtool, libxml2-dev, libyaml-dev, libz-dev, lld-17, llvm-17-dev, pkgconf, crystal (>= 1.6.0) dpkg-deb: building package 'pbuilder-satisfydepends-dummy' in '/tmp/satisfydepends-aptitude/pbuilder-satisfydepends-dummy.deb'. Selecting previously unselected package pbuilder-satisfydepends-dummy. (Reading database ... 19696 files and directories currently installed.) Preparing to unpack .../pbuilder-satisfydepends-dummy.deb ... Unpacking pbuilder-satisfydepends-dummy (0.invalid.0) ... dpkg: pbuilder-satisfydepends-dummy: dependency problems, but configuring anyway as you requested: pbuilder-satisfydepends-dummy depends on debhelper-compat (= 13); however: Package debhelper-compat is not installed. pbuilder-satisfydepends-dummy depends on git; however: Package git is not installed. pbuilder-satisfydepends-dummy depends on libbsd-dev; however: Package libbsd-dev is not installed. pbuilder-satisfydepends-dummy depends on libedit-dev; however: Package libedit-dev is not installed. pbuilder-satisfydepends-dummy depends on libevent-dev; however: Package libevent-dev is not installed. pbuilder-satisfydepends-dummy depends on libgc-dev (>= 1:7.6.0); however: Package libgc-dev is not installed. pbuilder-satisfydepends-dummy depends on libgmp-dev; however: Package libgmp-dev is not installed. pbuilder-satisfydepends-dummy depends on libpcre2-dev; however: Package libpcre2-dev is not installed. pbuilder-satisfydepends-dummy depends on libssl-dev; however: Package libssl-dev is not installed. pbuilder-satisfydepends-dummy depends on libtool; however: Package libtool is not installed. pbuilder-satisfydepends-dummy depends on libxml2-dev; however: Package libxml2-dev is not installed. pbuilder-satisfydepends-dummy depends on libyaml-dev; however: Package libyaml-dev is not installed. pbuilder-satisfydepends-dummy depends on libz-dev; however: Package libz-dev is not installed. pbuilder-satisfydepends-dummy depends on lld-17; however: Package lld-17 is not installed. pbuilder-satisfydepends-dummy depends on llvm-17-dev; however: Package llvm-17-dev is not installed. pbuilder-satisfydepends-dummy depends on pkgconf; however: Package pkgconf is not installed. pbuilder-satisfydepends-dummy depends on crystal (>= 1.6.0); however: Package crystal is not installed. Setting up pbuilder-satisfydepends-dummy (0.invalid.0) ... Reading package lists... Building dependency tree... Reading state information... Initializing package states... Writing extended state information... Building tag database... pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0) pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0) The following NEW packages will be installed: autoconf{a} automake{a} autopoint{a} autotools-dev{a} bsdextrautils{a} crystal{a} debhelper{a} dh-autoreconf{a} dh-strip-nondeterminism{a} dwz{a} file{a} gettext{a} gettext-base{a} git{a} git-man{a} groff-base{a} icu-devtools{a} intltool-debian{a} libarchive-zip-perl{a} libbrotli1{a} libbsd-dev{a} libbsd0{a} libclang-cpp17t64{a} libcom-err2{a} libcurl3t64-gnutls{a} libcurl4t64{a} libdebhelper-perl{a} libedit-dev{a} libedit2{a} libelf1t64{a} liberror-perl{a} libevent-2.1-7t64{a} libevent-core-2.1-7t64{a} libevent-dev{a} libevent-extra-2.1-7t64{a} libevent-openssl-2.1-7t64{a} libevent-pthreads-2.1-7t64{a} libexpat1{a} libffi-dev{a} libfile-stripnondeterminism-perl{a} libgc-dev{a} libgc1{a} libgmp-dev{a} libgmpxx4ldbl{a} libgssapi-krb5-2{a} libicu-dev{a} libicu72{a} libjs-codemirror{a} libjs-jquery{a} libk5crypto3{a} libkeyutils1{a} libkrb5-3{a} libkrb5support0{a} libldap-2.5-0{a} libllvm17t64{a} libmagic-mgc{a} libmagic1t64{a} libmd-dev{a} libncurses-dev{a} libncurses6{a} libnghttp2-14{a} libpcre2-16-0{a} libpcre2-32-0{a} libpcre2-dev{a} libpcre2-posix3{a} libpfm4{a} libpipeline1{a} libpkgconf3{a} libpsl5t64{a} libpython3-stdlib{a} libpython3.11-minimal{a} libpython3.11-stdlib{a} libreadline8t64{a} librtmp1{a} libsasl2-2{a} libsasl2-modules-db{a} libssh2-1t64{a} libssl-dev{a} libtool{a} libuchardet0{a} libxml2{a} libxml2-dev{a} libyaml-0-2{a} libyaml-dev{a} libz3-4{a} libz3-dev{a} lld-17{a} llvm-17{a} llvm-17-dev{a} llvm-17-linker-tools{a} llvm-17-runtime{a} llvm-17-tools{a} m4{a} man-db{a} media-types{a} netbase{a} pkgconf{a} pkgconf-bin{a} po-debconf{a} python3{a} python3-minimal{a} python3-pkg-resources{a} python3-pygments{a} python3-yaml{a} python3.11{a} python3.11-minimal{a} readline-common{a} sensible-utils{a} tzdata{a} zlib1g-dev{a} The following packages are RECOMMENDED but will NOT be installed: binfmt-support ca-certificates curl javascript-common krb5-locales less libarchive-cpio-perl libgpm2 libldap-common libltdl-dev libmail-sendmail-perl libsasl2-modules lynx openssh-client publicsuffix systemd wget 0 packages upgraded, 110 newly installed, 0 to remove and 0 not upgraded. Need to get 171 MB of archives. After unpacking 951 MB will be used. Writing extended state information... Get: 1 http://deb.debian.org/debian trixie/main amd64 libpython3.11-minimal amd64 3.11.9-1 [817 kB] Get: 2 http://deb.debian.org/debian trixie/main amd64 libexpat1 amd64 2.6.2-1 [103 kB] Get: 3 http://deb.debian.org/debian trixie/main amd64 python3.11-minimal amd64 3.11.9-1 [1879 kB] Get: 4 http://deb.debian.org/debian trixie/main amd64 python3-minimal amd64 3.11.8-1 [26.3 kB] Get: 5 http://deb.debian.org/debian trixie/main amd64 media-types all 10.1.0 [26.9 kB] Get: 6 http://deb.debian.org/debian trixie/main amd64 netbase all 6.4 [12.8 kB] Get: 7 http://deb.debian.org/debian trixie/main amd64 tzdata all 2024a-4 [255 kB] Get: 8 http://deb.debian.org/debian trixie/main amd64 readline-common all 8.2-4 [69.3 kB] Get: 9 http://deb.debian.org/debian trixie/main amd64 libreadline8t64 amd64 8.2-4 [167 kB] Get: 10 http://deb.debian.org/debian trixie/main amd64 libpython3.11-stdlib amd64 3.11.9-1 [1792 kB] Get: 11 http://deb.debian.org/debian trixie/main amd64 python3.11 amd64 3.11.9-1 [602 kB] Get: 12 http://deb.debian.org/debian trixie/main amd64 libpython3-stdlib amd64 3.11.8-1 [9332 B] Get: 13 http://deb.debian.org/debian trixie/main amd64 python3 amd64 3.11.8-1 [27.4 kB] Get: 14 http://deb.debian.org/debian trixie/main amd64 sensible-utils all 0.0.22 [22.4 kB] Get: 15 http://deb.debian.org/debian trixie/main amd64 libmagic-mgc amd64 1:5.45-3 [314 kB] Get: 16 http://deb.debian.org/debian trixie/main amd64 libmagic1t64 amd64 1:5.45-3 [105 kB] Get: 17 http://deb.debian.org/debian trixie/main amd64 file amd64 1:5.45-3 [42.9 kB] Get: 18 http://deb.debian.org/debian trixie/main amd64 gettext-base amd64 0.21-14+b1 [161 kB] Get: 19 http://deb.debian.org/debian trixie/main amd64 libuchardet0 amd64 0.0.8-1+b1 [68.8 kB] Get: 20 http://deb.debian.org/debian trixie/main amd64 groff-base amd64 1.23.0-4 [1180 kB] Get: 21 http://deb.debian.org/debian trixie/main amd64 bsdextrautils amd64 2.40.1-8.1 [96.2 kB] Get: 22 http://deb.debian.org/debian trixie/main amd64 libpipeline1 amd64 1.5.7-2 [38.0 kB] Get: 23 http://deb.debian.org/debian trixie/main amd64 man-db amd64 2.12.1-1 [1411 kB] Get: 24 http://deb.debian.org/debian trixie/main amd64 m4 amd64 1.4.19-4 [287 kB] Get: 25 http://deb.debian.org/debian trixie/main amd64 autoconf all 2.71-3 [332 kB] Get: 26 http://deb.debian.org/debian trixie/main amd64 autotools-dev all 20220109.1 [51.6 kB] Get: 27 http://deb.debian.org/debian trixie/main amd64 automake all 1:1.16.5-1.3 [823 kB] Get: 28 http://deb.debian.org/debian trixie/main amd64 autopoint all 0.21-14 [496 kB] Get: 29 http://deb.debian.org/debian trixie/main amd64 libevent-2.1-7t64 amd64 2.1.12-stable-10 [181 kB] Get: 30 http://deb.debian.org/debian trixie/main amd64 libgc1 amd64 1:8.2.6-1 [244 kB] Get: 31 http://deb.debian.org/debian trixie/main amd64 libbsd0 amd64 0.12.2-1 [131 kB] Get: 32 http://deb.debian.org/debian trixie/main amd64 libedit2 amd64 3.1-20240517-1 [93.3 kB] Get: 33 http://deb.debian.org/debian trixie/main amd64 libicu72 amd64 72.1-4+b1 [9395 kB] Get: 34 http://deb.debian.org/debian trixie/main amd64 libxml2 amd64 2.9.14+dfsg-1.3+b3 [692 kB] Get: 35 http://deb.debian.org/debian trixie/main amd64 libz3-4 amd64 4.8.12-3.1+b2 [7346 kB] Get: 36 http://deb.debian.org/debian trixie/main amd64 libllvm17t64 amd64 1:17.0.6-12 [23.7 MB] Get: 37 http://deb.debian.org/debian trixie/main amd64 libgc-dev amd64 1:8.2.6-1 [410 kB] Get: 38 http://deb.debian.org/debian trixie/main amd64 libpkgconf3 amd64 1.8.1-1+b2 [36.4 kB] Get: 39 http://deb.debian.org/debian trixie/main amd64 pkgconf-bin amd64 1.8.1-1+b2 [29.7 kB] Get: 40 http://deb.debian.org/debian trixie/main amd64 pkgconf amd64 1.8.1-1+b2 [26.2 kB] Get: 41 http://deb.debian.org/debian trixie/main amd64 libpcre2-16-0 amd64 10.42-4+b1 [246 kB] Get: 42 http://deb.debian.org/debian trixie/main amd64 libpcre2-32-0 amd64 10.42-4+b1 [234 kB] Get: 43 http://deb.debian.org/debian trixie/main amd64 libpcre2-posix3 amd64 10.42-4+b1 [55.8 kB] Get: 44 http://deb.debian.org/debian trixie/main amd64 libpcre2-dev amd64 10.42-4+b1 [755 kB] Get: 45 http://deb.debian.org/debian trixie/main amd64 libevent-core-2.1-7t64 amd64 2.1.12-stable-10 [131 kB] Get: 46 http://deb.debian.org/debian trixie/main amd64 libevent-extra-2.1-7t64 amd64 2.1.12-stable-10 [107 kB] Get: 47 http://deb.debian.org/debian trixie/main amd64 libevent-pthreads-2.1-7t64 amd64 2.1.12-stable-10 [53.9 kB] Get: 48 http://deb.debian.org/debian trixie/main amd64 libevent-openssl-2.1-7t64 amd64 2.1.12-stable-10 [60.8 kB] Get: 49 http://deb.debian.org/debian trixie/main amd64 libevent-dev amd64 2.1.12-stable-10 [305 kB] Get: 50 http://deb.debian.org/debian trixie/main amd64 libjs-codemirror all 5.65.0+~cs5.83.9-3 [774 kB] Get: 51 http://deb.debian.org/debian trixie/main amd64 libjs-jquery all 3.6.1+dfsg+~3.5.14-1 [326 kB] Get: 52 http://deb.debian.org/debian trixie/main amd64 crystal amd64 1.12.1+dfsg-1 [4314 kB] Get: 53 http://deb.debian.org/debian trixie/main amd64 libdebhelper-perl all 13.15.3 [88.0 kB] Get: 54 http://deb.debian.org/debian trixie/main amd64 libtool all 2.4.7-7 [517 kB] Get: 55 http://deb.debian.org/debian trixie/main amd64 dh-autoreconf all 20 [17.1 kB] Get: 56 http://deb.debian.org/debian trixie/main amd64 libarchive-zip-perl all 1.68-1 [104 kB] Get: 57 http://deb.debian.org/debian trixie/main amd64 libfile-stripnondeterminism-perl all 1.14.0-1 [19.5 kB] Get: 58 http://deb.debian.org/debian trixie/main amd64 dh-strip-nondeterminism all 1.14.0-1 [8448 B] Get: 59 http://deb.debian.org/debian trixie/main amd64 libelf1t64 amd64 0.191-1+b1 [189 kB] Get: 60 http://deb.debian.org/debian trixie/main amd64 dwz amd64 0.15-1+b1 [110 kB] Get: 61 http://deb.debian.org/debian trixie/main amd64 gettext amd64 0.21-14+b1 [1301 kB] Get: 62 http://deb.debian.org/debian trixie/main amd64 intltool-debian all 0.35.0+20060710.6 [22.9 kB] Get: 63 http://deb.debian.org/debian trixie/main amd64 po-debconf all 1.0.21+nmu1 [248 kB] Get: 64 http://deb.debian.org/debian trixie/main amd64 debhelper all 13.15.3 [901 kB] Get: 65 http://deb.debian.org/debian trixie/main amd64 libbrotli1 amd64 1.1.0-2+b3 [305 kB] Get: 66 http://deb.debian.org/debian trixie/main amd64 libkrb5support0 amd64 1.20.1-6+b1 [33.3 kB] Get: 67 http://deb.debian.org/debian trixie/main amd64 libcom-err2 amd64 1.47.1-1 [22.9 kB] Get: 68 http://deb.debian.org/debian trixie/main amd64 libk5crypto3 amd64 1.20.1-6+b1 [79.8 kB] Get: 69 http://deb.debian.org/debian trixie/main amd64 libkeyutils1 amd64 1.6.3-3 [8952 B] Get: 70 http://deb.debian.org/debian trixie/main amd64 libkrb5-3 amd64 1.20.1-6+b1 [333 kB] Get: 71 http://deb.debian.org/debian trixie/main amd64 libgssapi-krb5-2 amd64 1.20.1-6+b1 [135 kB] Get: 72 http://deb.debian.org/debian trixie/main amd64 libsasl2-modules-db amd64 2.1.28+dfsg1-6 [19.5 kB] Get: 73 http://deb.debian.org/debian trixie/main amd64 libsasl2-2 amd64 2.1.28+dfsg1-6 [56.9 kB] Get: 74 http://deb.debian.org/debian trixie/main amd64 libldap-2.5-0 amd64 2.5.17+dfsg-1 [186 kB] Get: 75 http://deb.debian.org/debian trixie/main amd64 libnghttp2-14 amd64 1.62.1-1 [75.5 kB] Get: 76 http://deb.debian.org/debian trixie/main amd64 libpsl5t64 amd64 0.21.2-1.1 [56.8 kB] Get: 77 http://deb.debian.org/debian trixie/main amd64 librtmp1 amd64 2.4+20151223.gitfa8646d.1-2+b4 [58.5 kB] Get: 78 http://deb.debian.org/debian trixie/main amd64 libssh2-1t64 amd64 1.11.0-5 [215 kB] Get: 79 http://deb.debian.org/debian trixie/main amd64 libcurl3t64-gnutls amd64 8.8.0-1 [434 kB] Get: 80 http://deb.debian.org/debian trixie/main amd64 liberror-perl all 0.17029-2 [29.0 kB] Get: 81 http://deb.debian.org/debian trixie/main amd64 git-man all 1:2.43.0-1 [2112 kB] Get: 82 http://deb.debian.org/debian trixie/main amd64 git amd64 1:2.43.0-1+b1 [7541 kB] Get: 83 http://deb.debian.org/debian trixie/main amd64 icu-devtools amd64 72.1-4+b1 [208 kB] Get: 84 http://deb.debian.org/debian trixie/main amd64 libmd-dev amd64 1.1.0-2 [54.9 kB] Get: 85 http://deb.debian.org/debian trixie/main amd64 libbsd-dev amd64 0.12.2-1 [258 kB] Get: 86 http://deb.debian.org/debian trixie/main amd64 libclang-cpp17t64 amd64 1:17.0.6-12 [11.8 MB] Get: 87 http://deb.debian.org/debian trixie/main amd64 libcurl4t64 amd64 8.8.0-1 [441 kB] Get: 88 http://deb.debian.org/debian trixie/main amd64 libncurses6 amd64 6.5-2 [104 kB] Get: 89 http://deb.debian.org/debian trixie/main amd64 libncurses-dev amd64 6.5-2 [349 kB] Get: 90 http://deb.debian.org/debian trixie/main amd64 libedit-dev amd64 3.1-20240517-1 [114 kB] Get: 91 http://deb.debian.org/debian trixie/main amd64 libffi-dev amd64 3.4.6-1 [60.6 kB] Get: 92 http://deb.debian.org/debian trixie/main amd64 libgmpxx4ldbl amd64 2:6.3.0+dfsg-2+b1 [329 kB] Get: 93 http://deb.debian.org/debian trixie/main amd64 libgmp-dev amd64 2:6.3.0+dfsg-2+b1 [640 kB] Get: 94 http://deb.debian.org/debian trixie/main amd64 libicu-dev amd64 72.1-4+b1 [10.4 MB] Get: 95 http://deb.debian.org/debian trixie/main amd64 libpfm4 amd64 4.13.0+git32-g0d4ed0e-1 [341 kB] Get: 96 http://deb.debian.org/debian trixie/main amd64 libssl-dev amd64 3.2.1-3 [2699 kB] Get: 97 http://deb.debian.org/debian trixie/main amd64 libxml2-dev amd64 2.9.14+dfsg-1.3+b3 [787 kB] Get: 98 http://deb.debian.org/debian trixie/main amd64 libyaml-0-2 amd64 0.2.5-1+b1 [52.6 kB] Get: 99 http://deb.debian.org/debian trixie/main amd64 libyaml-dev amd64 0.2.5-1+b1 [63.2 kB] Get: 100 http://deb.debian.org/debian trixie/main amd64 libz3-dev amd64 4.8.12-3.1+b2 [90.9 kB] Get: 101 http://deb.debian.org/debian trixie/main amd64 lld-17 amd64 1:17.0.6-12 [1248 kB] Get: 102 http://deb.debian.org/debian trixie/main amd64 llvm-17-runtime amd64 1:17.0.6-12 [525 kB] Get: 103 http://deb.debian.org/debian trixie/main amd64 llvm-17-linker-tools amd64 1:17.0.6-12 [1250 kB] Get: 104 http://deb.debian.org/debian trixie/main amd64 llvm-17 amd64 1:17.0.6-12 [21.6 MB] Get: 105 http://deb.debian.org/debian trixie/main amd64 python3-pkg-resources all 68.1.2-2 [241 kB] Get: 106 http://deb.debian.org/debian trixie/main amd64 python3-pygments all 2.18.0+dfsg-1 [836 kB] Get: 107 http://deb.debian.org/debian trixie/main amd64 python3-yaml amd64 6.0.1-2 [177 kB] Get: 108 http://deb.debian.org/debian trixie/main amd64 llvm-17-tools amd64 1:17.0.6-12 [489 kB] Get: 109 http://deb.debian.org/debian trixie/main amd64 llvm-17-dev amd64 1:17.0.6-12 [38.8 MB] Get: 110 http://deb.debian.org/debian trixie/main amd64 zlib1g-dev amd64 1:1.3.dfsg+really1.3.1-1 [919 kB] Fetched 171 MB in 4s (44.0 MB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package libpython3.11-minimal:amd64. (Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 19696 files and directories currently installed.) Preparing to unpack .../libpython3.11-minimal_3.11.9-1_amd64.deb ... Unpacking libpython3.11-minimal:amd64 (3.11.9-1) ... Selecting previously unselected package libexpat1:amd64. Preparing to unpack .../libexpat1_2.6.2-1_amd64.deb ... Unpacking libexpat1:amd64 (2.6.2-1) ... Selecting previously unselected package python3.11-minimal. Preparing to unpack .../python3.11-minimal_3.11.9-1_amd64.deb ... Unpacking python3.11-minimal (3.11.9-1) ... Setting up libpython3.11-minimal:amd64 (3.11.9-1) ... Setting up libexpat1:amd64 (2.6.2-1) ... Setting up python3.11-minimal (3.11.9-1) ... Selecting previously unselected package python3-minimal. (Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 20012 files and directories currently installed.) Preparing to unpack .../0-python3-minimal_3.11.8-1_amd64.deb ... Unpacking python3-minimal (3.11.8-1) ... Selecting previously unselected package media-types. Preparing to unpack .../1-media-types_10.1.0_all.deb ... Unpacking media-types (10.1.0) ... Selecting previously unselected package netbase. Preparing to unpack .../2-netbase_6.4_all.deb ... Unpacking netbase (6.4) ... Selecting previously unselected package tzdata. Preparing to unpack .../3-tzdata_2024a-4_all.deb ... Unpacking tzdata (2024a-4) ... Selecting previously unselected package readline-common. Preparing to unpack .../4-readline-common_8.2-4_all.deb ... Unpacking readline-common (8.2-4) ... Selecting previously unselected package libreadline8t64:amd64. Preparing to unpack .../5-libreadline8t64_8.2-4_amd64.deb ... Adding 'diversion of /lib/x86_64-linux-gnu/libhistory.so.8 to /lib/x86_64-linux-gnu/libhistory.so.8.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/x86_64-linux-gnu/libhistory.so.8.2 to /lib/x86_64-linux-gnu/libhistory.so.8.2.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/x86_64-linux-gnu/libreadline.so.8 to /lib/x86_64-linux-gnu/libreadline.so.8.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/x86_64-linux-gnu/libreadline.so.8.2 to /lib/x86_64-linux-gnu/libreadline.so.8.2.usr-is-merged by libreadline8t64' Unpacking libreadline8t64:amd64 (8.2-4) ... Selecting previously unselected package libpython3.11-stdlib:amd64. Preparing to unpack .../6-libpython3.11-stdlib_3.11.9-1_amd64.deb ... Unpacking libpython3.11-stdlib:amd64 (3.11.9-1) ... Selecting previously unselected package python3.11. Preparing to unpack .../7-python3.11_3.11.9-1_amd64.deb ... Unpacking python3.11 (3.11.9-1) ... Selecting previously unselected package libpython3-stdlib:amd64. Preparing to unpack .../8-libpython3-stdlib_3.11.8-1_amd64.deb ... Unpacking libpython3-stdlib:amd64 (3.11.8-1) ... Setting up python3-minimal (3.11.8-1) ... Selecting previously unselected package python3. (Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 21004 files and directories currently installed.) Preparing to unpack .../00-python3_3.11.8-1_amd64.deb ... Unpacking python3 (3.11.8-1) ... Selecting previously unselected package sensible-utils. Preparing to unpack .../01-sensible-utils_0.0.22_all.deb ... Unpacking sensible-utils (0.0.22) ... Selecting previously unselected package libmagic-mgc. Preparing to unpack .../02-libmagic-mgc_1%3a5.45-3_amd64.deb ... Unpacking libmagic-mgc (1:5.45-3) ... Selecting previously unselected package libmagic1t64:amd64. Preparing to unpack .../03-libmagic1t64_1%3a5.45-3_amd64.deb ... Unpacking libmagic1t64:amd64 (1:5.45-3) ... Selecting previously unselected package file. Preparing to unpack .../04-file_1%3a5.45-3_amd64.deb ... Unpacking file (1:5.45-3) ... Selecting previously unselected package gettext-base. Preparing to unpack .../05-gettext-base_0.21-14+b1_amd64.deb ... Unpacking gettext-base (0.21-14+b1) ... Selecting previously unselected package libuchardet0:amd64. Preparing to unpack .../06-libuchardet0_0.0.8-1+b1_amd64.deb ... Unpacking libuchardet0:amd64 (0.0.8-1+b1) ... Selecting previously unselected package groff-base. Preparing to unpack .../07-groff-base_1.23.0-4_amd64.deb ... Unpacking groff-base (1.23.0-4) ... Selecting previously unselected package bsdextrautils. Preparing to unpack .../08-bsdextrautils_2.40.1-8.1_amd64.deb ... Unpacking bsdextrautils (2.40.1-8.1) ... Selecting previously unselected package libpipeline1:amd64. Preparing to unpack .../09-libpipeline1_1.5.7-2_amd64.deb ... Unpacking libpipeline1:amd64 (1.5.7-2) ... Selecting previously unselected package man-db. Preparing to unpack .../10-man-db_2.12.1-1_amd64.deb ... Unpacking man-db (2.12.1-1) ... Selecting previously unselected package m4. Preparing to unpack .../11-m4_1.4.19-4_amd64.deb ... Unpacking m4 (1.4.19-4) ... Selecting previously unselected package autoconf. Preparing to unpack .../12-autoconf_2.71-3_all.deb ... Unpacking autoconf (2.71-3) ... Selecting previously unselected package autotools-dev. Preparing to unpack .../13-autotools-dev_20220109.1_all.deb ... Unpacking autotools-dev (20220109.1) ... Selecting previously unselected package automake. Preparing to unpack .../14-automake_1%3a1.16.5-1.3_all.deb ... Unpacking automake (1:1.16.5-1.3) ... Selecting previously unselected package autopoint. Preparing to unpack .../15-autopoint_0.21-14_all.deb ... Unpacking autopoint (0.21-14) ... Selecting previously unselected package libevent-2.1-7t64:amd64. Preparing to unpack .../16-libevent-2.1-7t64_2.1.12-stable-10_amd64.deb ... Unpacking libevent-2.1-7t64:amd64 (2.1.12-stable-10) ... Selecting previously unselected package libgc1:amd64. Preparing to unpack .../17-libgc1_1%3a8.2.6-1_amd64.deb ... Unpacking libgc1:amd64 (1:8.2.6-1) ... Selecting previously unselected package libbsd0:amd64. Preparing to unpack .../18-libbsd0_0.12.2-1_amd64.deb ... Unpacking libbsd0:amd64 (0.12.2-1) ... Selecting previously unselected package libedit2:amd64. Preparing to unpack .../19-libedit2_3.1-20240517-1_amd64.deb ... Unpacking libedit2:amd64 (3.1-20240517-1) ... Selecting previously unselected package libicu72:amd64. Preparing to unpack .../20-libicu72_72.1-4+b1_amd64.deb ... Unpacking libicu72:amd64 (72.1-4+b1) ... Selecting previously unselected package libxml2:amd64. Preparing to unpack .../21-libxml2_2.9.14+dfsg-1.3+b3_amd64.deb ... Unpacking libxml2:amd64 (2.9.14+dfsg-1.3+b3) ... Selecting previously unselected package libz3-4:amd64. Preparing to unpack .../22-libz3-4_4.8.12-3.1+b2_amd64.deb ... Unpacking libz3-4:amd64 (4.8.12-3.1+b2) ... Selecting previously unselected package libllvm17t64:amd64. Preparing to unpack .../23-libllvm17t64_1%3a17.0.6-12_amd64.deb ... Unpacking libllvm17t64:amd64 (1:17.0.6-12) ... Selecting previously unselected package libgc-dev:amd64. Preparing to unpack .../24-libgc-dev_1%3a8.2.6-1_amd64.deb ... Unpacking libgc-dev:amd64 (1:8.2.6-1) ... Selecting previously unselected package libpkgconf3:amd64. Preparing to unpack .../25-libpkgconf3_1.8.1-1+b2_amd64.deb ... Unpacking libpkgconf3:amd64 (1.8.1-1+b2) ... Selecting previously unselected package pkgconf-bin. Preparing to unpack .../26-pkgconf-bin_1.8.1-1+b2_amd64.deb ... Unpacking pkgconf-bin (1.8.1-1+b2) ... Selecting previously unselected package pkgconf:amd64. Preparing to unpack .../27-pkgconf_1.8.1-1+b2_amd64.deb ... Unpacking pkgconf:amd64 (1.8.1-1+b2) ... Selecting previously unselected package libpcre2-16-0:amd64. Preparing to unpack .../28-libpcre2-16-0_10.42-4+b1_amd64.deb ... Unpacking libpcre2-16-0:amd64 (10.42-4+b1) ... Selecting previously unselected package libpcre2-32-0:amd64. Preparing to unpack .../29-libpcre2-32-0_10.42-4+b1_amd64.deb ... Unpacking libpcre2-32-0:amd64 (10.42-4+b1) ... Selecting previously unselected package libpcre2-posix3:amd64. Preparing to unpack .../30-libpcre2-posix3_10.42-4+b1_amd64.deb ... Unpacking libpcre2-posix3:amd64 (10.42-4+b1) ... Selecting previously unselected package libpcre2-dev:amd64. Preparing to unpack .../31-libpcre2-dev_10.42-4+b1_amd64.deb ... Unpacking libpcre2-dev:amd64 (10.42-4+b1) ... Selecting previously unselected package libevent-core-2.1-7t64:amd64. Preparing to unpack .../32-libevent-core-2.1-7t64_2.1.12-stable-10_amd64.deb ... Unpacking libevent-core-2.1-7t64:amd64 (2.1.12-stable-10) ... Selecting previously unselected package libevent-extra-2.1-7t64:amd64. Preparing to unpack .../33-libevent-extra-2.1-7t64_2.1.12-stable-10_amd64.deb ... Unpacking libevent-extra-2.1-7t64:amd64 (2.1.12-stable-10) ... Selecting previously unselected package libevent-pthreads-2.1-7t64:amd64. Preparing to unpack .../34-libevent-pthreads-2.1-7t64_2.1.12-stable-10_amd64.deb ... Unpacking libevent-pthreads-2.1-7t64:amd64 (2.1.12-stable-10) ... Selecting previously unselected package libevent-openssl-2.1-7t64:amd64. Preparing to unpack .../35-libevent-openssl-2.1-7t64_2.1.12-stable-10_amd64.deb ... Unpacking libevent-openssl-2.1-7t64:amd64 (2.1.12-stable-10) ... Selecting previously unselected package libevent-dev. Preparing to unpack .../36-libevent-dev_2.1.12-stable-10_amd64.deb ... Unpacking libevent-dev (2.1.12-stable-10) ... Selecting previously unselected package libjs-codemirror. Preparing to unpack .../37-libjs-codemirror_5.65.0+~cs5.83.9-3_all.deb ... Unpacking libjs-codemirror (5.65.0+~cs5.83.9-3) ... Selecting previously unselected package libjs-jquery. Preparing to unpack .../38-libjs-jquery_3.6.1+dfsg+~3.5.14-1_all.deb ... Unpacking libjs-jquery (3.6.1+dfsg+~3.5.14-1) ... Selecting previously unselected package crystal. Preparing to unpack .../39-crystal_1.12.1+dfsg-1_amd64.deb ... Unpacking crystal (1.12.1+dfsg-1) ... Selecting previously unselected package libdebhelper-perl. Preparing to unpack .../40-libdebhelper-perl_13.15.3_all.deb ... Unpacking libdebhelper-perl (13.15.3) ... Selecting previously unselected package libtool. Preparing to unpack .../41-libtool_2.4.7-7_all.deb ... Unpacking libtool (2.4.7-7) ... Selecting previously unselected package dh-autoreconf. Preparing to unpack .../42-dh-autoreconf_20_all.deb ... Unpacking dh-autoreconf (20) ... Selecting previously unselected package libarchive-zip-perl. Preparing to unpack .../43-libarchive-zip-perl_1.68-1_all.deb ... Unpacking libarchive-zip-perl (1.68-1) ... Selecting previously unselected package libfile-stripnondeterminism-perl. Preparing to unpack .../44-libfile-stripnondeterminism-perl_1.14.0-1_all.deb ... Unpacking libfile-stripnondeterminism-perl (1.14.0-1) ... Selecting previously unselected package dh-strip-nondeterminism. Preparing to unpack .../45-dh-strip-nondeterminism_1.14.0-1_all.deb ... Unpacking dh-strip-nondeterminism (1.14.0-1) ... Selecting previously unselected package libelf1t64:amd64. Preparing to unpack .../46-libelf1t64_0.191-1+b1_amd64.deb ... Unpacking libelf1t64:amd64 (0.191-1+b1) ... Selecting previously unselected package dwz. Preparing to unpack .../47-dwz_0.15-1+b1_amd64.deb ... Unpacking dwz (0.15-1+b1) ... Selecting previously unselected package gettext. Preparing to unpack .../48-gettext_0.21-14+b1_amd64.deb ... Unpacking gettext (0.21-14+b1) ... Selecting previously unselected package intltool-debian. Preparing to unpack .../49-intltool-debian_0.35.0+20060710.6_all.deb ... Unpacking intltool-debian (0.35.0+20060710.6) ... Selecting previously unselected package po-debconf. Preparing to unpack .../50-po-debconf_1.0.21+nmu1_all.deb ... Unpacking po-debconf (1.0.21+nmu1) ... Selecting previously unselected package debhelper. Preparing to unpack .../51-debhelper_13.15.3_all.deb ... Unpacking debhelper (13.15.3) ... Selecting previously unselected package libbrotli1:amd64. Preparing to unpack .../52-libbrotli1_1.1.0-2+b3_amd64.deb ... Unpacking libbrotli1:amd64 (1.1.0-2+b3) ... Selecting previously unselected package libkrb5support0:amd64. Preparing to unpack .../53-libkrb5support0_1.20.1-6+b1_amd64.deb ... Unpacking libkrb5support0:amd64 (1.20.1-6+b1) ... Selecting previously unselected package libcom-err2:amd64. Preparing to unpack .../54-libcom-err2_1.47.1-1_amd64.deb ... Unpacking libcom-err2:amd64 (1.47.1-1) ... Selecting previously unselected package libk5crypto3:amd64. Preparing to unpack .../55-libk5crypto3_1.20.1-6+b1_amd64.deb ... Unpacking libk5crypto3:amd64 (1.20.1-6+b1) ... Selecting previously unselected package libkeyutils1:amd64. Preparing to unpack .../56-libkeyutils1_1.6.3-3_amd64.deb ... Unpacking libkeyutils1:amd64 (1.6.3-3) ... Selecting previously unselected package libkrb5-3:amd64. Preparing to unpack .../57-libkrb5-3_1.20.1-6+b1_amd64.deb ... Unpacking libkrb5-3:amd64 (1.20.1-6+b1) ... Selecting previously unselected package libgssapi-krb5-2:amd64. Preparing to unpack .../58-libgssapi-krb5-2_1.20.1-6+b1_amd64.deb ... Unpacking libgssapi-krb5-2:amd64 (1.20.1-6+b1) ... Selecting previously unselected package libsasl2-modules-db:amd64. Preparing to unpack .../59-libsasl2-modules-db_2.1.28+dfsg1-6_amd64.deb ... Unpacking libsasl2-modules-db:amd64 (2.1.28+dfsg1-6) ... Selecting previously unselected package libsasl2-2:amd64. Preparing to unpack .../60-libsasl2-2_2.1.28+dfsg1-6_amd64.deb ... Unpacking libsasl2-2:amd64 (2.1.28+dfsg1-6) ... Selecting previously unselected package libldap-2.5-0:amd64. Preparing to unpack .../61-libldap-2.5-0_2.5.17+dfsg-1_amd64.deb ... Unpacking libldap-2.5-0:amd64 (2.5.17+dfsg-1) ... Selecting previously unselected package libnghttp2-14:amd64. Preparing to unpack .../62-libnghttp2-14_1.62.1-1_amd64.deb ... Unpacking libnghttp2-14:amd64 (1.62.1-1) ... Selecting previously unselected package libpsl5t64:amd64. Preparing to unpack .../63-libpsl5t64_0.21.2-1.1_amd64.deb ... Unpacking libpsl5t64:amd64 (0.21.2-1.1) ... Selecting previously unselected package librtmp1:amd64. Preparing to unpack .../64-librtmp1_2.4+20151223.gitfa8646d.1-2+b4_amd64.deb ... Unpacking librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2+b4) ... Selecting previously unselected package libssh2-1t64:amd64. Preparing to unpack .../65-libssh2-1t64_1.11.0-5_amd64.deb ... Unpacking libssh2-1t64:amd64 (1.11.0-5) ... Selecting previously unselected package libcurl3t64-gnutls:amd64. Preparing to unpack .../66-libcurl3t64-gnutls_8.8.0-1_amd64.deb ... Unpacking libcurl3t64-gnutls:amd64 (8.8.0-1) ... Selecting previously unselected package liberror-perl. Preparing to unpack .../67-liberror-perl_0.17029-2_all.deb ... Unpacking liberror-perl (0.17029-2) ... Selecting previously unselected package git-man. Preparing to unpack .../68-git-man_1%3a2.43.0-1_all.deb ... Unpacking git-man (1:2.43.0-1) ... Selecting previously unselected package git. Preparing to unpack .../69-git_1%3a2.43.0-1+b1_amd64.deb ... Unpacking git (1:2.43.0-1+b1) ... Selecting previously unselected package icu-devtools. Preparing to unpack .../70-icu-devtools_72.1-4+b1_amd64.deb ... Unpacking icu-devtools (72.1-4+b1) ... Selecting previously unselected package libmd-dev:amd64. Preparing to unpack .../71-libmd-dev_1.1.0-2_amd64.deb ... Unpacking libmd-dev:amd64 (1.1.0-2) ... Selecting previously unselected package libbsd-dev:amd64. Preparing to unpack .../72-libbsd-dev_0.12.2-1_amd64.deb ... Unpacking libbsd-dev:amd64 (0.12.2-1) ... Selecting previously unselected package libclang-cpp17t64. Preparing to unpack .../73-libclang-cpp17t64_1%3a17.0.6-12_amd64.deb ... Unpacking libclang-cpp17t64 (1:17.0.6-12) ... Selecting previously unselected package libcurl4t64:amd64. Preparing to unpack .../74-libcurl4t64_8.8.0-1_amd64.deb ... Unpacking libcurl4t64:amd64 (8.8.0-1) ... Selecting previously unselected package libncurses6:amd64. Preparing to unpack .../75-libncurses6_6.5-2_amd64.deb ... Unpacking libncurses6:amd64 (6.5-2) ... Selecting previously unselected package libncurses-dev:amd64. Preparing to unpack .../76-libncurses-dev_6.5-2_amd64.deb ... Unpacking libncurses-dev:amd64 (6.5-2) ... Selecting previously unselected package libedit-dev:amd64. Preparing to unpack .../77-libedit-dev_3.1-20240517-1_amd64.deb ... Unpacking libedit-dev:amd64 (3.1-20240517-1) ... Selecting previously unselected package libffi-dev:amd64. Preparing to unpack .../78-libffi-dev_3.4.6-1_amd64.deb ... Unpacking libffi-dev:amd64 (3.4.6-1) ... Selecting previously unselected package libgmpxx4ldbl:amd64. Preparing to unpack .../79-libgmpxx4ldbl_2%3a6.3.0+dfsg-2+b1_amd64.deb ... Unpacking libgmpxx4ldbl:amd64 (2:6.3.0+dfsg-2+b1) ... Selecting previously unselected package libgmp-dev:amd64. Preparing to unpack .../80-libgmp-dev_2%3a6.3.0+dfsg-2+b1_amd64.deb ... Unpacking libgmp-dev:amd64 (2:6.3.0+dfsg-2+b1) ... Selecting previously unselected package libicu-dev:amd64. Preparing to unpack .../81-libicu-dev_72.1-4+b1_amd64.deb ... Unpacking libicu-dev:amd64 (72.1-4+b1) ... Selecting previously unselected package libpfm4:amd64. Preparing to unpack .../82-libpfm4_4.13.0+git32-g0d4ed0e-1_amd64.deb ... Unpacking libpfm4:amd64 (4.13.0+git32-g0d4ed0e-1) ... Selecting previously unselected package libssl-dev:amd64. Preparing to unpack .../83-libssl-dev_3.2.1-3_amd64.deb ... Unpacking libssl-dev:amd64 (3.2.1-3) ... Selecting previously unselected package libxml2-dev:amd64. Preparing to unpack .../84-libxml2-dev_2.9.14+dfsg-1.3+b3_amd64.deb ... Unpacking libxml2-dev:amd64 (2.9.14+dfsg-1.3+b3) ... Selecting previously unselected package libyaml-0-2:amd64. Preparing to unpack .../85-libyaml-0-2_0.2.5-1+b1_amd64.deb ... Unpacking libyaml-0-2:amd64 (0.2.5-1+b1) ... Selecting previously unselected package libyaml-dev:amd64. Preparing to unpack .../86-libyaml-dev_0.2.5-1+b1_amd64.deb ... Unpacking libyaml-dev:amd64 (0.2.5-1+b1) ... Selecting previously unselected package libz3-dev:amd64. Preparing to unpack .../87-libz3-dev_4.8.12-3.1+b2_amd64.deb ... Unpacking libz3-dev:amd64 (4.8.12-3.1+b2) ... Selecting previously unselected package lld-17. Preparing to unpack .../88-lld-17_1%3a17.0.6-12_amd64.deb ... Unpacking lld-17 (1:17.0.6-12) ... Selecting previously unselected package llvm-17-runtime. Preparing to unpack .../89-llvm-17-runtime_1%3a17.0.6-12_amd64.deb ... Unpacking llvm-17-runtime (1:17.0.6-12) ... Selecting previously unselected package llvm-17-linker-tools. Preparing to unpack .../90-llvm-17-linker-tools_1%3a17.0.6-12_amd64.deb ... Unpacking llvm-17-linker-tools (1:17.0.6-12) ... Selecting previously unselected package llvm-17. Preparing to unpack .../91-llvm-17_1%3a17.0.6-12_amd64.deb ... Unpacking llvm-17 (1:17.0.6-12) ... Selecting previously unselected package python3-pkg-resources. Preparing to unpack .../92-python3-pkg-resources_68.1.2-2_all.deb ... Unpacking python3-pkg-resources (68.1.2-2) ... Selecting previously unselected package python3-pygments. Preparing to unpack .../93-python3-pygments_2.18.0+dfsg-1_all.deb ... Unpacking python3-pygments (2.18.0+dfsg-1) ... Selecting previously unselected package python3-yaml. Preparing to unpack .../94-python3-yaml_6.0.1-2_amd64.deb ... Unpacking python3-yaml (6.0.1-2) ... Selecting previously unselected package llvm-17-tools. Preparing to unpack .../95-llvm-17-tools_1%3a17.0.6-12_amd64.deb ... Unpacking llvm-17-tools (1:17.0.6-12) ... Selecting previously unselected package llvm-17-dev. Preparing to unpack .../96-llvm-17-dev_1%3a17.0.6-12_amd64.deb ... Unpacking llvm-17-dev (1:17.0.6-12) ... Selecting previously unselected package zlib1g-dev:amd64. Preparing to unpack .../97-zlib1g-dev_1%3a1.3.dfsg+really1.3.1-1_amd64.deb ... Unpacking zlib1g-dev:amd64 (1:1.3.dfsg+really1.3.1-1) ... Setting up media-types (10.1.0) ... Setting up libpipeline1:amd64 (1.5.7-2) ... Setting up libkeyutils1:amd64 (1.6.3-3) ... Setting up libicu72:amd64 (72.1-4+b1) ... Setting up bsdextrautils (2.40.1-8.1) ... Setting up libmagic-mgc (1:5.45-3) ... Setting up libarchive-zip-perl (1.68-1) ... Setting up libyaml-0-2:amd64 (0.2.5-1+b1) ... Setting up libdebhelper-perl (13.15.3) ... Setting up libbrotli1:amd64 (1.1.0-2+b3) ... Setting up libmagic1t64:amd64 (1:5.45-3) ... Setting up libpsl5t64:amd64 (0.21.2-1.1) ... Setting up libnghttp2-14:amd64 (1.62.1-1) ... Setting up gettext-base (0.21-14+b1) ... Setting up m4 (1.4.19-4) ... Setting up libevent-2.1-7t64:amd64 (2.1.12-stable-10) ... Setting up libcom-err2:amd64 (1.47.1-1) ... Setting up file (1:5.45-3) ... Setting up libffi-dev:amd64 (3.4.6-1) ... Setting up libpcre2-16-0:amd64 (10.42-4+b1) ... Setting up libelf1t64:amd64 (0.191-1+b1) ... Setting up libkrb5support0:amd64 (1.20.1-6+b1) ... Setting up libsasl2-modules-db:amd64 (2.1.28+dfsg1-6) ... Setting up tzdata (2024a-4) ... Current default time zone: 'Etc/UTC' Local time is now: Thu Jul 17 16:44:36 UTC 2025. Universal Time is now: Thu Jul 17 16:44:36 UTC 2025. Run 'dpkg-reconfigure tzdata' if you wish to change it. Setting up liberror-perl (0.17029-2) ... Setting up autotools-dev (20220109.1) ... Setting up libz3-4:amd64 (4.8.12-3.1+b2) ... Setting up libpcre2-32-0:amd64 (10.42-4+b1) ... Setting up libpkgconf3:amd64 (1.8.1-1+b2) ... Setting up libgmpxx4ldbl:amd64 (2:6.3.0+dfsg-2+b1) ... Setting up libpfm4:amd64 (4.13.0+git32-g0d4ed0e-1) ... Setting up librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2+b4) ... Setting up libncurses6:amd64 (6.5-2) ... Setting up libjs-codemirror (5.65.0+~cs5.83.9-3) ... Setting up libssl-dev:amd64 (3.2.1-3) ... Setting up autopoint (0.21-14) ... Setting up icu-devtools (72.1-4+b1) ... Setting up pkgconf-bin (1.8.1-1+b2) ... Setting up libk5crypto3:amd64 (1.20.1-6+b1) ... Setting up libgc1:amd64 (1:8.2.6-1) ... Setting up libsasl2-2:amd64 (2.1.28+dfsg1-6) ... Setting up autoconf (2.71-3) ... Setting up zlib1g-dev:amd64 (1:1.3.dfsg+really1.3.1-1) ... Setting up libpcre2-posix3:amd64 (10.42-4+b1) ... Setting up dwz (0.15-1+b1) ... Setting up sensible-utils (0.0.22) ... Setting up libuchardet0:amd64 (0.0.8-1+b1) ... Setting up libmd-dev:amd64 (1.1.0-2) ... Setting up git-man (1:2.43.0-1) ... Setting up netbase (6.4) ... Setting up libkrb5-3:amd64 (1.20.1-6+b1) ... Setting up libevent-core-2.1-7t64:amd64 (2.1.12-stable-10) ... Setting up libssh2-1t64:amd64 (1.11.0-5) ... Setting up libjs-jquery (3.6.1+dfsg+~3.5.14-1) ... Setting up libgc-dev:amd64 (1:8.2.6-1) ... Setting up libbsd0:amd64 (0.12.2-1) ... Setting up readline-common (8.2-4) ... Setting up libicu-dev:amd64 (72.1-4+b1) ... Setting up libxml2:amd64 (2.9.14+dfsg-1.3+b3) ... Setting up libbsd-dev:amd64 (0.12.2-1) ... Setting up automake (1:1.16.5-1.3) ... update-alternatives: using /usr/bin/automake-1.16 to provide /usr/bin/automake (automake) in auto mode Setting up libfile-stripnondeterminism-perl (1.14.0-1) ... Setting up libz3-dev:amd64 (4.8.12-3.1+b2) ... Setting up libncurses-dev:amd64 (6.5-2) ... Setting up gettext (0.21-14+b1) ... Setting up libgmp-dev:amd64 (2:6.3.0+dfsg-2+b1) ... Setting up libpcre2-dev:amd64 (10.42-4+b1) ... Setting up libyaml-dev:amd64 (0.2.5-1+b1) ... Setting up libtool (2.4.7-7) ... Setting up libevent-pthreads-2.1-7t64:amd64 (2.1.12-stable-10) ... Setting up libedit2:amd64 (3.1-20240517-1) ... Setting up libevent-openssl-2.1-7t64:amd64 (2.1.12-stable-10) ... Setting up libldap-2.5-0:amd64 (2.5.17+dfsg-1) ... Setting up pkgconf:amd64 (1.8.1-1+b2) ... Setting up intltool-debian (0.35.0+20060710.6) ... Setting up dh-autoreconf (20) ... Setting up libxml2-dev:amd64 (2.9.14+dfsg-1.3+b3) ... Setting up libllvm17t64:amd64 (1:17.0.6-12) ... Setting up libedit-dev:amd64 (3.1-20240517-1) ... Setting up libgssapi-krb5-2:amd64 (1.20.1-6+b1) ... Setting up libevent-extra-2.1-7t64:amd64 (2.1.12-stable-10) ... Setting up libreadline8t64:amd64 (8.2-4) ... Setting up dh-strip-nondeterminism (1.14.0-1) ... Setting up groff-base (1.23.0-4) ... Setting up lld-17 (1:17.0.6-12) ... Setting up llvm-17-runtime (1:17.0.6-12) ... Setting up llvm-17-linker-tools (1:17.0.6-12) ... Setting up libcurl4t64:amd64 (8.8.0-1) ... Setting up po-debconf (1.0.21+nmu1) ... Setting up libpython3.11-stdlib:amd64 (3.11.9-1) ... Setting up libcurl3t64-gnutls:amd64 (8.8.0-1) ... Setting up man-db (2.12.1-1) ... Not building database; man-db/auto-update is not 'true'. Setting up libclang-cpp17t64 (1:17.0.6-12) ... Setting up libevent-dev (2.1.12-stable-10) ... Setting up git (1:2.43.0-1+b1) ... Setting up llvm-17 (1:17.0.6-12) ... Setting up libpython3-stdlib:amd64 (3.11.8-1) ... Setting up python3.11 (3.11.9-1) ... Setting up crystal (1.12.1+dfsg-1) ... Setting up debhelper (13.15.3) ... Setting up python3 (3.11.8-1) ... Setting up python3-pkg-resources (68.1.2-2) ... Setting up python3-yaml (6.0.1-2) ... Setting up python3-pygments (2.18.0+dfsg-1) ... Setting up llvm-17-tools (1:17.0.6-12) ... Setting up llvm-17-dev (1:17.0.6-12) ... Processing triggers for libc-bin (2.38-13) ... Reading package lists... Building dependency tree... Reading state information... Reading extended state information... Initializing package states... Writing extended state information... Building tag database... -> Finished parsing the build-deps I: Building the package I: user script /srv/workspace/pbuilder/667784/tmp/hooks/A99_set_merged_usr starting Not re-configuring usrmerge for trixie I: user script /srv/workspace/pbuilder/667784/tmp/hooks/A99_set_merged_usr finished hostname: Name or service not known I: Running cd /build/reproducible-path/crystal-1.12.1+dfsg/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path" HOME="/nonexistent/second-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path" HOME="/nonexistent/second-build" dpkg-genchanges -S > ../crystal_1.12.1+dfsg-1_source.changes dpkg-buildpackage: info: source package crystal dpkg-buildpackage: info: source version 1.12.1+dfsg-1 dpkg-buildpackage: info: source distribution unstable dpkg-buildpackage: info: source changed by David Suárez dpkg-source --before-build . dpkg-buildpackage: info: host architecture amd64 debian/rules clean dh clean dh_auto_clean make -j42 clean make[1]: Entering directory '/build/reproducible-path/crystal-1.12.1+dfsg' rm -rf .build rm -rf ./docs rm -rf src/llvm/ext/llvm_ext.o rm -rf man/*.gz make[1]: Leaving directory '/build/reproducible-path/crystal-1.12.1+dfsg' debian/rules override_dh_clean make[1]: Entering directory '/build/reproducible-path/crystal-1.12.1+dfsg' dh_clean rm -f man/*.gz make[1]: Leaving directory '/build/reproducible-path/crystal-1.12.1+dfsg' debian/rules binary dh binary dh_update_autotools_config dh_autoreconf dh_auto_configure debian/rules override_dh_auto_build make[1]: Entering directory '/build/reproducible-path/crystal-1.12.1+dfsg' dh_auto_build -- release=1 verbose=1 progress=1 threads=42 CRYSTAL_CONFIG_PATH="lib:/usr/lib/crystal/lib" CRYSTAL_CACHE_DIR="/tmp/crystal" interpreter=1 make -j42 "INSTALL=install --strip-program=true" release=1 verbose=1 progress=1 threads=42 CRYSTAL_CONFIG_PATH=lib:/usr/lib/crystal/lib CRYSTAL_CACHE_DIR=/tmp/crystal interpreter=1 make[2]: Entering directory '/build/reproducible-path/crystal-1.12.1+dfsg' Using /usr/bin/llvm-config-17 [version=17.0.6] g++ -c -g -O2 -ffile-prefix-map=/build/reproducible-path/crystal-1.12.1+dfsg=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -o src/llvm/ext/llvm_ext.o src/llvm/ext/llvm_ext.cc -I/usr/lib/llvm-17/include -std=c++17 -fno-exceptions -funwind-tables -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS CRYSTAL_CONFIG_BUILD_COMMIT="" CRYSTAL_CONFIG_PATH=lib:/usr/lib/crystal/lib SOURCE_DATE_EPOCH="1715970619" CRYSTAL_CONFIG_LIBRARY_PATH='$ORIGIN/../lib/crystal' ./bin/crystal build -D strict_multi_assign -D preview_overload_order --release --progress --threads 42 --link-flags="-Wl,-z,relro" -o .build/crystal src/compiler/crystal.cr -D without_openssl -D without_zlib -D use_pcre2 [1/13] Parse [1/13] Parse [2/13] Semantic (top level) [2/13] Semantic (top level) [3/13] Semantic (new) [3/13] Semantic (new) [4/13] Semantic (type declarations) [4/13] Semantic (type declarations) [5/13] Semantic (abstract def check) [5/13] Semantic (abstract def check) [6/13] Semantic (restrictions augmenter) [6/13] Semantic (restrictions augmenter) [7/13] Semantic (ivars initializers) [7/13] Semantic (ivars initializers) [8/13] Semantic (cvars initializers) [8/13] Semantic (cvars initializers) [9/13] Semantic (main) [9/13] Semantic (main) [10/13] Semantic (cleanup) [10/13] Semantic (cleanup) [11/13] Semantic (recursive struct check) [11/13] Semantic (recursive struct check) [12/13] Codegen (crystal) [12/13] Codegen (crystal) [13/13] Codegen (bc+obj) [13/13] [0/1] Codegen (bc+obj) [13/13] [0/1] Codegen (bc+obj) [14/13] Codegen (linking) [14/13] Codegen (linking) make[2]: Leaving directory '/build/reproducible-path/crystal-1.12.1+dfsg' make[1]: Leaving directory '/build/reproducible-path/crystal-1.12.1+dfsg' debian/rules override_dh_auto_test make[1]: Entering directory '/build/reproducible-path/crystal-1.12.1+dfsg' make release=1 verbose=1 progress=1 threads=42 CRYSTAL_CONFIG_PATH="lib:/usr/lib/crystal/lib" CRYSTAL_CACHE_DIR="/tmp/crystal" interpreter=1 compiler_spec make[2]: Entering directory '/build/reproducible-path/crystal-1.12.1+dfsg' Using /usr/bin/llvm-config-17 [version=17.0.6] CRYSTAL_CONFIG_BUILD_COMMIT="" CRYSTAL_CONFIG_PATH=lib:/usr/lib/crystal/lib SOURCE_DATE_EPOCH="1715970619" ./bin/crystal build -D strict_multi_assign -D preview_overload_order --release --progress --threads 42 --link-flags="-Wl,-z,relro" --exclude-warnings spec/std --exclude-warnings spec/compiler --exclude-warnings spec/primitives -o .build/compiler_spec spec/compiler_spec.cr --release Using compiled compiler at .build/crystal In lib/markd/src/markd/renderers/html_renderer.cr:238:7 238 | {% if Crystal::VERSION < "1.2.0" %} ^ Warning: expanding macro There was a problem expanding macro 'macro_140292385211712' Called macro defined in lib/markd/src/markd/renderers/html_renderer.cr:238:7 238 | {% if Crystal::VERSION < "1.2.0" %} Which expanded to: 1 | > 2 | title = URI.encode(node.first_child.text) 3 | @output_io << %() 4 | Warning: Deprecated URI.encode. Use `.encode_path` instead. A total of 1 warnings were found. [1/13] Parse [1/13] Parse [2/13] Semantic (top level) [2/13] Semantic (top level) [3/13] Semantic (new) [3/13] Semantic (new) [4/13] Semantic (type declarations) [4/13] Semantic (type declarations) [5/13] Semantic (abstract def check) [5/13] Semantic (abstract def check) [6/13] Semantic (restrictions augmenter) [6/13] Semantic (restrictions augmenter) [7/13] Semantic (ivars initializers) [7/13] Semantic (ivars initializers) [8/13] Semantic (cvars initializers) [8/13] Semantic (cvars initializers) [9/13] Semantic (main) [9/13] Semantic (main) [10/13] Semantic (cleanup) [10/13] Semantic (cleanup) [11/13] Semantic (recursive struct check) [11/13] Semantic (recursive struct check) [12/13] Codegen (crystal) [12/13] Codegen (crystal) [13/13] Codegen (bc+obj) [13/13] [0/1] Codegen (bc+obj) [13/13] [0/1] Codegen (bc+obj) [14/13] Codegen (linking) [14/13] Codegen (linking) .build/compiler_spec -v --order=random Randomized with seed: 81207 Semantic: NoReturn types union of NoReturns types union of NoReturns computes NoReturn in a lazy way inside if then (#314) (2) computes NoReturn in a lazy way inside if then (#314) (2) assumes if condition's type filters when else is no return assumes if condition's type filters when else is no return computes NoReturn in a lazy way inside if then (#314) (5) computes NoReturn in a lazy way inside if then (#314) (5) computes NoReturn in a lazy way inside if else (#314) (4) computes NoReturn in a lazy way inside if else (#314) (4) types union of NoReturn and something else types union of NoReturn and something else types call to LibC.exit as NoReturn types call to LibC.exit as NoReturn computes NoReturn in a lazy way inside if else (#314) (2) computes NoReturn in a lazy way inside if else (#314) (2) types as NoReturn even if Nil return type is forced (#3096) types as NoReturn even if Nil return type is forced (#3096) types exception handler as NoReturn if ensure is NoReturn types exception handler as NoReturn if ensure is NoReturn computes NoReturn in a lazy way inside if then (#314) (4) computes NoReturn in a lazy way inside if then (#314) (4) computes NoReturn in a lazy way inside if else (#314) (3) computes NoReturn in a lazy way inside if else (#314) (3) computes NoReturn in a lazy way inside if then (#314) (1) computes NoReturn in a lazy way inside if then (#314) (1) types with no return even if code follows types with no return even if code follows types raise as NoReturn types raise as NoReturn types as NoReturn if typeof(exp)'s exp is NoReturn types as NoReturn if typeof(exp)'s exp is NoReturn computes NoReturn in a lazy way inside if then (#314) (3) computes NoReturn in a lazy way inside if then (#314) (3) computes NoReturn in a lazy way inside if else (#314) (5) computes NoReturn in a lazy way inside if else (#314) (5) computes NoReturn in a lazy way inside if else (#314) (1) computes NoReturn in a lazy way inside if else (#314) (1) Crystal::Playground::Session assert assert Semantic: require file not found wildcard wildcard relative require relative require require require relative wildcard relative wildcard Compiler treats all arguments post-filename as program arguments treats all arguments post-filename as program arguments compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename has a valid version has a valid version Crystal::Repl::Interpreter closures does nested closure inside proc does nested closure inside proc sets ivar of self closured struct (#12341) sets ivar of self closured struct (#12341) closures self in proc literal (implicit self) closures self in proc literal (implicit self) does nested closure inside captured blocks does nested closure inside captured blocks does closure inside proc, capture proc argument does closure inside proc, capture proc argument closures struct and calls method on it closures struct and calls method on it does closure inside block does closure inside block closures block args after 8 bytes (the closure var) closures block args after 8 bytes (the closure var) does closure without args that captures and modifies two local variables does closure without args that captures and modifies two local variables does closure without args that captures and modifies one local variable does closure without args that captures and modifies one local variable does closure inside const does closure inside const does closure inside def does closure inside def does closure with two args that captures and modifies two local variables does closure with two args that captures and modifies two local variables does closure with pointerof local var does closure with pointerof local var does closure and accesses it inside block does closure and accesses it inside block closures self in proc literal closures self in proc literal closures closured block arg closures closured block arg passes closured struct instance var as self passes closured struct instance var as self does closure inside block, capture block arg does closure inside block, capture block arg does closure inside proc does closure inside proc closures def arguments closures def arguments does closure inside class variable initializer does closure inside class variable initializer closures self and modifies instance var closures self and modifies instance var reads self closured struct (#12341) reads self closured struct (#12341) gets ivar of self closured struct (#12341) gets ivar of self closured struct (#12341) does next inside captured block (#12226) does next inside captured block (#12226) doesn't mix local vars with closured vars doesn't mix local vars with closured vars does nested closure inside methods and blocks does nested closure inside methods and blocks Parser warnings warns on missing space before colon in type declaration in type declaration in return type restriction in return type restriction in anonymous block param type restriction in anonymous block param type restriction in block param type restriction in block param type restriction warns on suffix-less UInt64 literals > Int64::MAX warns on suffix-less UInt64 literals > Int64::MAX Code gen: offsetof returns offset allowing manual access of tuple items returns offset allowing manual access of tuple items returns offset allowing manual access of class field that isn't first returns offset allowing manual access of class field that isn't first returns offset of extern union returns offset of extern union returns offset of `StaticArray#@buffer` returns offset of `StaticArray#@buffer` returns offset allowing manual access of struct field that isn't first returns offset allowing manual access of struct field that isn't first returns offset allowing manual access of first class field returns offset allowing manual access of first class field returns offset allowing manual access of first struct field returns offset allowing manual access of first struct field Code gen: lib casts C fun to Crystal proc when accessing instance var (#2515) casts C fun to Crystal proc when accessing instance var (#2515) refers to lib type (#960) refers to lib type (#960) doesn't crash with nil and varargs (#4414) doesn't crash with nil and varargs (#4414) codegens lib var set and get codegens lib var set and get allows passing type to LibC if it has a converter with to_unsafe (bug) allows passing type to LibC if it has a converter with to_unsafe (bug) can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use enum as fun return can use enum as fun return allows invoking out with underscore allows invoking out with underscore uses static array in lib extern (#5688) uses static array in lib extern (#5688) doesn't crash when casting -1 to UInt32 (#3594) doesn't crash when casting -1 to UInt32 (#3594) passes int as another float type in literal passes int as another float type in literal get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) allows passing type to LibC if it has a converter with to_unsafe allows passing type to LibC if it has a converter with to_unsafe call to void function call to void function can use enum as fun argument can use enum as fun argument passes nil to varargs (#1570) passes nil to varargs (#1570) allows setting/getting external variable as function pointer allows setting/getting external variable as function pointer get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) Semantic: instance var uses virtual types in self uses virtual types in self doesn't consider instance var as nilable if assigned before self access (#4981) doesn't consider instance var as nilable if assigned before self access (#4981) errors on undefined instance var and subclass calling super errors on undefined instance var and subclass calling super infers from another instance var infers from another instance var instance variables initializers are used in class variables initialized objects (#3988) instance variables initializers are used in class variables initialized objects (#3988) errors if adds instance variable to Object via guess errors if adds instance variable to Object via guess doesn't error if not initializes in all initialize because declared as nilable doesn't error if not initializes in all initialize because declared as nilable infers type from number literal infers type from number literal infers from another instance var in generic type with type declaration infers from another instance var in generic type with type declaration errors if declaring instance var and turns out to be nilable, in generic type errors if declaring instance var and turns out to be nilable, in generic type declares instance var of generic type, with no type parameter declares instance var of generic type, with no type parameter guesses from array literal with of, with subclass guesses from array literal with of, with subclass infers type from range literal infers type from range literal guesses inside macro for guesses inside macro for infers type to be nilable if self is used before assigning to a variable infers type to be nilable if self is used before assigning to a variable doesn't solve instance var initializer in instance context (2) (#5876) doesn't solve instance var initializer in instance context (2) (#5876) cannot guess the type from double-splat argument with not double-splatted type cannot guess the type from double-splat argument with not double-splatted type infers type from included module, outside def infers type from included module, outside def infers type for generic class, with assign (2) infers type for generic class, with assign (2) errors when overriding inherited instance variable with incompatible type errors when overriding inherited instance variable with incompatible type declares instance var of generic type, with metaclass declares instance var of generic type, with metaclass guesses virtual array type (3) (#5342) guesses virtual array type (3) (#5342) guesses inside macro if guesses inside macro if infers type from proc literal with return type infers type from proc literal with return type errors when redeclaring subclass variable with a different type errors when redeclaring subclass variable with a different type infers type from assign (1) infers type from assign (1) errors if declaring generic type without type vars errors if declaring generic type without type vars infers from restriction using virtual type infers from restriction using virtual type doesn't error if not initializing nilable var in subclass doesn't error if not initializing nilable var in subclass errors if declaring var in Enum errors if declaring var in Enum infers type for generic class, with if infers type for generic class, with if infers type from array literal in generic type infers type from array literal in generic type declares instance var of generic type, with static array declares instance var of generic type, with static array infers type from path that is a constant infers type from path that is a constant infers type from regex literal with interpolation infers type from regex literal with interpolation errors if declaring var in Reference errors if declaring var in Reference infers type from lib fun call infers type from lib fun call can type ivar from class inherited by generic class (#5281) can type ivar from class inherited by generic class (#5281) infers from class method that invokes new infers from class method that invokes new declares instance var of generic class declares instance var of generic class guesses from hash literal with of, with subclass guesses from hash literal with of, with subclass says can't infer (#2536) says can't infer (#2536) infers from assign to local var (#2467) infers from assign to local var (#2467) infers type from custom generic hash literal infers type from custom generic hash literal declares instance var with initial value declares instance var with initial value infers type from as infers type from as doesn't infer unbound generic type on generic method called from generic's subclass doesn't infer unbound generic type on generic method called from generic's subclass guesses virtual array type (1) (#5342) guesses virtual array type (1) (#5342) infer from class method where new is redefined infer from class method where new is redefined errors if declaring var in Int32 errors if declaring var in Int32 declares instance var multiple times, last one wins declares instance var multiple times, last one wins cannot guess type from argument assigned in body cannot guess type from argument assigned in body doesn't solve instance var initializer in instance context (3) (#5876) doesn't solve instance var initializer in instance context (3) (#5876) is more permissive with macro def initialize, bug with named args is more permissive with macro def initialize, bug with named args allows nil instance var because it's a generic type allows nil instance var because it's a generic type declares instance var of generic module declares instance var of generic module infers type for generic class, with begin infers type for generic class, with begin infers type from lib out (2) infers type from lib out (2) infers from Pointer.malloc in generic type infers from Pointer.malloc in generic type is more permissive with macro def initialize is more permissive with macro def initialize infers type from all call matches infers type from all call matches considers var as assigned in multi-assign considers var as assigned in multi-assign infers type for generic class, with T.new and literal infers type for generic class, with T.new and literal guesses from as.(typeof(...)) guesses from as.(typeof(...)) guesses from splat (#3149) guesses from splat (#3149) errors with macro def but another def doesn't initialize all errors with macro def but another def doesn't initialize all infers type from argument default value infers type from argument default value says undefined instance variable on read says undefined instance variable on read infers from new with return type in generic type infers from new with return type in generic type infers type from as? infers type from as? infers type from responds_to? infers type from responds_to? transfers initializer from generic module to class transfers initializer from generic module to class guesses virtual array type (3) (#5342) guesses virtual array type (3) (#5342) infers type from string interpolation infers type from string interpolation errors if unknown ivar through macro (#4050) errors if unknown ivar through macro (#4050) uses virtual types in union uses virtual types in union infers type from char literal infers type from char literal infers type to be non-nilable if initialized in all initialize infers type to be non-nilable if initialized in all initialize doesn't infer from class method with multiple statements and return, on non-easy return (2) doesn't infer from class method with multiple statements and return, on non-easy return (2) infers type in multi assign infers type in multi assign can guess the type from double-splat argument with double-splatted type variable can guess the type from double-splat argument with double-splatted type variable errors if declaring var in NamedTuple(T) errors if declaring var in NamedTuple(T) errors if not initializing super variables (3) errors if not initializing super variables (3) infers from Pointer.null in generic type infers from Pointer.null in generic type infers type from ||= inside another assignment infers type from ||= inside another assignment ignores redefined initialize (#456) ignores redefined initialize (#456) is more permissive with macro def initialize, other initialize is more permissive with macro def initialize, other initialize infers type by removing nil from || left side infers type by removing nil from || left side can declare type even if included module has a guessed var can declare type even if included module has a guessed var infers type from is_a? infers type from is_a? infers type from case infers type from case infers type from argument with restriction, in generic infers type from argument with restriction, in generic errors if declaring var in Int errors if declaring var in Int infers type from array literal with literals in generic type infers type from array literal with literals in generic type doesn't error if initializing var in superclass, and then empty initialize doesn't error if initializing var in superclass, and then empty initialize infers type from regex literal infers type from regex literal errors if declaring var in StaticArray(T, N) errors if declaring var in StaticArray(T, N) guesses virtual hash type (2) (#5342) guesses virtual hash type (2) (#5342) doesn't error if calling initialize from another initialize (1) doesn't error if calling initialize from another initialize (1) infers type from named tuple literal infers type from named tuple literal doesn't error when redeclaring subclass variable with the same type doesn't error when redeclaring subclass variable with the same type doesn't error if not calling super but initializing all variables doesn't error if not calling super but initializing all variables looks up return type restriction in defining type, not instantiated type (#11961) looks up return type restriction in defining type, not instantiated type (#11961) doesn't infer from class method with multiple statements and return, on non-easy return doesn't infer from class method with multiple statements and return, on non-easy return errors if declaring instance var and turns out to be nilable, in generic module type in generic type errors if declaring instance var and turns out to be nilable, in generic module type in generic type is more permissive with macro def initialize, multiple is more permissive with macro def initialize, multiple declares instance var in module, inherits to type declares instance var in module, inherits to type infers in multiple assign for tuple type (1) infers in multiple assign for tuple type (1) infers type from lib out (1) infers type from lib out (1) doesn't error if not initializing variables but calling super for generic module doesn't error if not initializing variables but calling super for generic module infers from generic class method that has type annotation infers from generic class method that has type annotation inferrs Proc(Void) to Proc(Nil) inferrs Proc(Void) to Proc(Nil) doesn't infer unbound generic type on generic method called from generic's subclass, metaclass context doesn't infer unbound generic type on generic method called from generic's subclass, metaclass context infers type from two literals infers type from two literals can guess the type from splat argument with splatted type can guess the type from splat argument with splatted type infers type from || infers type from || infers from another instance var with type declaration infers from another instance var with type declaration doesn't complain if declared type is recursive alias that's nilable doesn't complain if declared type is recursive alias that's nilable allow usage of instance variable initializer from instance variable initializer allow usage of instance variable initializer from instance variable initializer can't infer type from initializer in non-generic module can't infer type from initializer in non-generic module infers type for generic class, with assign (1) infers type for generic class, with assign (1) doesn't find T in generic type that's not the current type (#4460) doesn't find T in generic type that's not the current type (#4460) errors on undefined constant errors on undefined constant doesn't error if not initializing variables but calling super in parent parent doesn't error if not initializing variables but calling super in parent parent doesn't crash on #3580 doesn't crash on #3580 infers type from custom array literal infers type from custom array literal declares instance var of generic type, with proc declares instance var of generic type, with proc obeys super module initialize (#456) obeys super module initialize (#456) guesses inside macro expression guesses inside macro expression errors when typing an instance variable inside a method errors when typing an instance variable inside a method infers type from included module recursively infers type from included module recursively says can't infer type if only nil was assigned, in generic type says can't infer type if only nil was assigned, in generic type infers type from block argument infers type from block argument infers from class method that has type annotation infers from class method that has type annotation infers type from offsetof infers type from offsetof declares instance var of generic type, with tuple declares instance var of generic type, with tuple declares instance var of generic type declares instance var of generic type doesn't infer for subclass if assigns another type (1) doesn't infer for subclass if assigns another type (1) doesn't check call of non-self instance (#4830) doesn't check call of non-self instance (#4830) doesn't consider var as nilable if conditionally assigned inside initialize, but has initializer (#3669) doesn't consider var as nilable if conditionally assigned inside initialize, but has initializer (#3669) doesn't error when using generic in generic type because guessed elsewhere doesn't error when using generic in generic type because guessed elsewhere infers type from ||= infers type from ||= says undefined instance variable on assign says undefined instance variable on assign declares instance var of generic type, with virtual metaclass declares instance var of generic type, with virtual metaclass infers type for generic module infers type for generic module declares instance var with self, on generic declares instance var with self, on generic infers from new with return type infers from new with return type infers type from custom generic array literal infers type from custom generic array literal declares instance var of generic type subclass declares instance var of generic type subclass infers type for generic class, with && infers type for generic class, with && infers type from hash literal from elements infers type from hash literal from elements infers type from self as virtual type (#2575) infers type from self as virtual type (#2575) declares instance var with union type with a virtual member declares instance var with union type with a virtual member declares instance var with initial value, with subclass declares instance var with initial value, with subclass infers type from string literal infers type from string literal infers type from unless infers type from unless infers type from hash literal with of infers type from hash literal with of ignores super module initialize (#456) ignores super module initialize (#456) infers type from new expression infers type from new expression declares instance var in module, inherits to type recursively declares instance var in module, inherits to type recursively can guess the type from splat argument with splatted type variable can guess the type from splat argument with splatted type variable errors if declaring instance var and turns out to be nilable, in generic module type errors if declaring instance var and turns out to be nilable, in generic module type infers type from redefined method if calls previous_def infers type from redefined method if calls previous_def looks up self restriction in instantiated type, not defined type looks up self restriction in instantiated type, not defined type infers type from && infers type from && errors if not initialized in all initialize errors if not initialized in all initialize guesses from new on abstract class guesses from new on abstract class infers from Pointer.null infers from Pointer.null infers from Pointer.malloc with two arguments infers from Pointer.malloc with two arguments doesn't duplicate instance var in subclass doesn't duplicate instance var in subclass infers type from bool literal infers type from bool literal infers type from array literal from its literals infers type from array literal from its literals declares instance var of generic type, with union declares instance var of generic type, with union errors if declaring instance variable in module included in Object errors if declaring instance variable in module included in Object infers type from uninitialized infers type from uninitialized declares instance var of generic type, with splat declares instance var of generic type, with splat errors when using Class in generic type errors when using Class in generic type infers type from custom array literal in generic infers type from custom array literal in generic errors if not initializing super variables (2) errors if not initializing super variables (2) instance variable inherited from multiple parents with incompatible type module and class, with declarations module and class, with declarations module and class, with definitions module and class, with definitions errors module and module, with declarations errors module and module, with declarations errors module and module, with definitions errors module and module, with definitions with compatible type accepts module and module, with declarations accepts module and module, with declarations module and class, with declarations (3) module and class, with declarations (3) module and class, with definitions module and class, with definitions accepts module and module, with definitions accepts module and module, with definitions module and class, with declarations module and class, with declarations module and class, with declarations (2) module and class, with declarations (2) doesn't error when using Class but specifying type doesn't error when using Class but specifying type infers type for generic class, with T.new infers type for generic class, with T.new infers type from symbol literal infers type from symbol literal infers type from lib variable infers type from lib variable doesn't infer type to be nilable if using self.class doesn't infer type to be nilable if using self.class infers type for non-generic class, with assign infers type for non-generic class, with assign infers type from argument restriction infers type from argument restriction declares instance var of generic type, with splat inside Tuple declares instance var of generic type, with splat inside Tuple infers type from hash literal with literals in generic type infers type from hash literal with literals in generic type errors if declaring var in Object errors if declaring var in Object errors if can't find lib call, before erroring on instance var (#2579) errors if can't find lib call, before erroring on instance var (#2579) cannot guess the type from splat argument with not splatted type cannot guess the type from splat argument with not splatted type infers from assign to local var in generic type (#2467) infers from assign to local var in generic type (#2467) doesn't error if initializes via super in macro def doesn't error if initializes via super in macro def guesses virtual hash type (1) (#5342) guesses virtual hash type (1) (#5342) doesn't combine union of Number and Number subclass (#5073) doesn't combine union of Number and Number subclass (#5073) infers nilable instance var of generic type infers nilable instance var of generic type infers type for generic class, with literal infers type for generic class, with literal infers type from hash literal in generic type infers type from hash literal in generic type errors if declaring var in Number errors if declaring var in Number can't infer type of generic method that returns self (#5383) can't infer type of generic method that returns self (#5383) errors when assigning instance variable at top level block errors when assigning instance variable at top level block errors if adds instance variable to Object via guess via included module errors if adds instance variable to Object via guess via included module errors when using Class (#2605) errors when using Class (#2605) can't infer type from initializer in generic class type can't infer type from initializer in generic class type infers type from literal outside def infers type from literal outside def gives correct error when trying to use Int as an instance variable type gives correct error when trying to use Int as an instance variable type guesses virtual array type (2) (#5342) guesses virtual array type (2) (#5342) infers from method on integer literal, with type annotation infers from method on integer literal, with type annotation guesses from as.(typeof(...)) in generic type guesses from as.(typeof(...)) in generic type can't infer type from initializer can't infer type from initializer declares instance var of generic class after reopen declares instance var of generic class after reopen accepts overriding inherited instance variable with compatible type accepts overriding inherited instance variable with compatible type declares instance var of generic type, with splat inside Proc declares instance var of generic type, with splat inside Proc errors when assigning instance variable at top level control block errors when assigning instance variable at top level control block infers type from begin infers type from begin infers type from assign (2) infers type from assign (2) errors when assigning instance variable inside nested expression errors when assigning instance variable inside nested expression doesn't error if not initializing variables but calling super and previous_def doesn't error if not initializing variables but calling super and previous_def errors if declaring var in Tuple(*T) errors if declaring var in Tuple(*T) can type ivar from module included by generic class (#5281) can type ivar from module included by generic class (#5281) errors if declaring var in Union(*T) errors if declaring var in Union(*T) declares instance var of generic module from non-generic module declares instance var of generic module from non-generic module shouldn't error when accessing instance var in initialized that's always initialized (#2953) shouldn't error when accessing instance var in initialized that's always initialized (#2953) infers from class method that has type annotation, with overload infers from class method that has type annotation, with overload declares with `self` declares with `self` doesn't consider self.initialize as initializer (#3239) doesn't consider self.initialize as initializer (#3239) errors if not initializing super variable in generic errors if not initializing super variable in generic infers type from enum member infers type from enum member doesn't infer type to be nilable if using self.class in call in assign doesn't infer type to be nilable if using self.class in call in assign doesn't error if inheriting generic instance (#3635) doesn't error if inheriting generic instance (#3635) solves instance var initializer in metaclass context (#5876) solves instance var initializer in metaclass context (#5876) infers from another instance var in generic type infers from another instance var in generic type infers type from literal outside def with initialize and type restriction infers type from literal outside def with initialize and type restriction declares as named tuple declares as named tuple infers from method in generic type, with type annotation infers from method in generic type, with type annotation infers from new with return type returning generic infers from new with return type returning generic can't infer type from initializer in generic module type can't infer type from initializer in generic module type errors if declaring var in Value errors if declaring var in Value infers type from array literal with of metaclass infers type from array literal with of metaclass doesn't error if calling initialize from another initialize (2) doesn't error if calling initialize from another initialize (2) infers type from instance_sizeof infers type from instance_sizeof infers from Pointer.malloc with two arguments in generic type infers from Pointer.malloc with two arguments in generic type infers type from included module infers type from included module doesn't error if uses typeof(@var) doesn't error if uses typeof(@var) errors if declaring var in Float errors if declaring var in Float errors if not initializing super variables errors if not initializing super variables declares instance var of generic type through module declares instance var of generic type through module can guess the type from double-splat argument with double-splatted type can guess the type from double-splat argument with double-splatted type doesn't complain if not initialized in one initialize, but has initializer (#2465) doesn't complain if not initialized in one initialize, but has initializer (#2465) doesn't crash when inferring from new without matches (#2538) doesn't crash when inferring from new without matches (#2538) declares instance var declares instance var infers type from array literal with of infers type from array literal with of types generic instance as virtual type if generic type has subclasses (#3805) types generic instance as virtual type if generic type has subclasses (#3805) infers type to be nilable if self is used in same assign infers type to be nilable if self is used in same assign declares instance var of generic type, with generic type declares instance var of generic type, with generic type errors if declaring instance var and turns out to be nilable errors if declaring instance var and turns out to be nilable infers type from ! infers type from ! errors if finally not initialized in macro def errors if finally not initialized in macro def doesn't error if not initializing variables but calling previous_def (#3210) doesn't error if not initializing variables but calling previous_def (#3210) doesn't error if not initializing variables but calling super for module doesn't error if not initializing variables but calling super for module doesn't complain in second part of #2575 doesn't complain in second part of #2575 doesn't error when using generic because guessed elsewhere doesn't error when using generic because guessed elsewhere infers from generic class method that has type annotation, without instantiating infers from generic class method that has type annotation, without instantiating guesses from splat (2) (#3149) guesses from splat (2) (#3149) infers type from tuple literal infers type from tuple literal doesn't infer type from redefined method doesn't infer type from redefined method infers type from custom hash literal in generic infers type from custom hash literal in generic infers type from path that is a type infers type from path that is a type uses virtual types in fun uses virtual types in fun infers from class method that has type annotation, in generic class infers from class method that has type annotation, in generic class infers type for generic class, with case infers type for generic class, with case says can't infer type if only nil was assigned says can't infer type if only nil was assigned infers type from if infers type from if infer from class method with multiple statements and return infer from class method with multiple statements and return infers type to be nilable if not initialized infers type to be nilable if not initialized infers type from custom hash literal infers type from custom hash literal infers type from block argument without restriction infers type from block argument without restriction infers from class method that has number literal infers from class method that has number literal errors if declaring var in Class errors if declaring var in Class declares instance var of generic module (2) declares instance var of generic module (2) errors if declaring variable with number errors if declaring variable with number infers type from lib out (3) infers type from lib out (3) doesn't infer unbound generic type on non-generic call (#6390) doesn't infer unbound generic type on non-generic call (#6390) infers nilable instance var of generic module infers nilable instance var of generic module doesn't error if not initialized in macro def but outside it doesn't error if not initialized in macro def but outside it doesn't crash on missing var on subclass, with superclass not specifying a type doesn't crash on missing var on subclass, with superclass not specifying a type infers from Pointer.malloc infers from Pointer.malloc doesn't crash on recursive method call doesn't crash on recursive method call errors if declaring var in Proc(*T, R) errors if declaring var in Proc(*T, R) doesn't infer for subclass if assigns another type (2) doesn't infer for subclass if assigns another type (2) doesn't error if not initializing variables but calling previous_def (2) (#3210) doesn't error if not initializing variables but calling previous_def (2) (#3210) uses T.new (#4291) uses T.new (#4291) transfers initializer from module to generic class transfers initializer from module to generic class doesn't error if declaring instance var and doesn't out to be nilable, in generic module type doesn't error if declaring instance var and doesn't out to be nilable, in generic module type doesn't solve instance var initializer in instance context (1) (#5876) doesn't solve instance var initializer in instance context (1) (#5876) can't infer type when using operation on const (#4054) can't infer type when using operation on const (#4054) doesn't infer generic type without type argument inside generic doesn't infer generic type without type argument inside generic doesn't if declaring nilable instance var and turns out to be nilable doesn't if declaring nilable instance var and turns out to be nilable infers from class method that has type annotation, with multiple overloads matching, all with the same type infers from class method that has type annotation, with multiple overloads matching, all with the same type declares instance var which appears in initialize declares instance var which appears in initialize errors if declaring var in Pointer(T) errors if declaring var in Pointer(T) infers type from sizeof infers type from sizeof doesn't error if not initializing variables but calling super doesn't error if not initializing variables but calling super infers type for generic class, with lib call infers type for generic class, with lib call infers type from self (#2575) infers type from self (#2575) infers from class method that refers to constant infers from class method that refers to constant Semantic: ReferenceStorage errors if T is a nilable type errors if T is a nilable type errors if T is a value type errors if T is a value type allows a different name allows a different name errors if T is a union type errors if T is a union type errors if T is a struct type errors if T is a struct type Normalize: hash literal hoists complex element expressions hoists complex element expressions normalizes empty with of normalizes empty with of normalizes non-empty without of normalizes non-empty without of hoists complex element expressions, hash-like generic hoists complex element expressions, hash-like generic hoists complex element expressions, hash-like hoists complex element expressions, hash-like normalizes non-empty with of normalizes non-empty with of Code gen: next codegens next with break (2) codegens next with break (2) codegens next with break (1) codegens next with break (1) codegens next with while inside block codegens next with while inside block codegens next with break (3) codegens next with break (3) codegens next conditionally codegens next conditionally codegens next codegens next codegens next conditionally with int type (2) codegens next conditionally with int type (2) codegens next without expressions codegens next without expressions Code gen: union type codegens union type when obj union but arg is not codegens union type when obj union but arg is not codegens union type as return value codegens union type as return value codegens union type when no obj codegens union type when no obj assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 codegens if with same nested union codegens if with same nested union assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 codegens union type when no obj and restrictions codegens union type when no obj and restrictions assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union provides T as a tuple literal provides T as a tuple literal codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s sorts restrictions when there are unions sorts restrictions when there are unions codegens union type when obj is union and no args codegens union type when obj is union and no args assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union codegens union type when obj is not union but arg is codegens union type when obj is not union but arg is codegens union type for instance var codegens union type for instance var codegens union type when obj is union and arg is union codegens union type when obj is union and arg is union dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable Normalize: def expands a def with double splat and no args expands a def with double splat and no args expands a def on request with default arguments that yields expands a def on request with default arguments that yields expands with magic constant with named arg with yield expands with magic constant with named arg with yield expands a def with external names (1) expands a def with external names (1) expands a def on request with default arguments (external names) expands a def on request with default arguments (external names) expands with magic constant specifying one when all are magic expands with magic constant specifying one when all are magic expands a def on request with default arguments (2) expands a def on request with default arguments (2) expands with named argument and yield expands with named argument and yield expands a def with external names (2) expands a def with external names (2) expands default value after splat index expands default value after splat index expands with magic constant expands with magic constant expands with splat with one arg before expands with splat with one arg before expands a def on request with default arguments that yields (2) expands a def on request with default arguments that yields (2) expands with one named arg that is the only one (1) expands with one named arg that is the only one (1) expands a def on request with default arguments and type restrictions expands a def on request with default arguments and type restrictions expands with splat and default argument expands with splat and default argument expands a def with double splat and two named args expands a def with double splat and two named args expands with magic constant with named arg expands with magic constant with named arg expands with more named arg which come in the correct order expands with more named arg which come in the correct order expands a def with double splat and two named args and regular args expands a def with double splat and two named args and regular args uses bare * uses bare * expands with splat expands with splat expands with one named arg that is the only one (2) expands with one named arg that is the only one (2) expands arg with default value after splat expands arg with default value after splat expands with two named argument expands with two named argument expands with named argument expands with named argument expands with two named argument and one not expands with two named argument and one not gives correct body location with splat arg, without body splat arg, without body splat arg, with body splat arg, with body default arg with restriction, without body default arg with restriction, without body default arg, without body default arg, without body default arg with restriction, with body default arg with restriction, with body block instance var arg, without body block instance var arg, without body default arg, with body default arg, with body block instance var arg, with body block instance var arg, with body expands a def on request with default arguments that yields (external names) expands a def on request with default arguments that yields (external names) expands def with reserved external name (#6559) expands def with reserved external name (#6559) expands a def on request with default arguments expands a def on request with default arguments expands a def with splat and double splat expands a def with splat and double splat expands a new def with double splat and two named args and regular args expands a new def with double splat and two named args and regular args expands a def on request with default arguments and type restrictions (2) expands a def on request with default arguments and type restrictions (2) expands with splat and zero expands with splat and zero expands with magic constant specifying one when not all are magic expands with magic constant specifying one when not all are magic Code gen: proc codegens proc with another var codegens proc with another var allows redefining fun allows redefining fun call simple proc literal with return call simple proc literal with return assigns nil and proc to nilable proc type assigns nil and proc to nilable proc type allows invoking a function with a subtype allows invoking a function with a subtype saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` saves receiver value of proc pointer `->@@cvar.foo` allows proc pointer where self is a class allows proc pointer where self is a class call proc literal with return type call proc literal with return type does new on proc type does new on proc type call proc literal with arguments call proc literal with arguments calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer calls function pointer passes proc as &->expr to method that yields passes proc as &->expr to method that yields mangles strings in such a way they don't conflict with funs (#1006) mangles strings in such a way they don't conflict with funs (#1006) codegens proc that references struct (bug) codegens proc that references struct (bug) calls proc pointer with union (passed by value) arg calls proc pointer with union (passed by value) arg codegens nilable proc type dispatch (1) codegens nilable proc type dispatch (1) casts from function pointer to proc casts from function pointer to proc codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens nilable proc type dispatch (2) codegens nilable proc type dispatch (2) codegens captured block that returns tuple codegens captured block that returns tuple codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) codegens proc literal hard type inference (1) builds proc type from fun builds proc type from fun codegens proc that accepts a union and is called with a single type codegens proc that accepts a union and is called with a single type call simple proc literal call simple proc literal codegens proc in instance var initialize (#3016) codegens proc in instance var initialize (#3016) takes pointerof function pointer takes pointerof function pointer passes block to another function (bug: mangling of both methods was the same) passes block to another function (bug: mangling of both methods was the same) allows proc type of enum type allows proc type of enum type allows using proc arg name shadowing local variable allows using proc arg name shadowing local variable doesn't crash when taking a proc pointer that multidispatches on a module (#3822) doesn't crash when taking a proc pointer that multidispatches on a module (#3822) allows invoking a function with a subtype when defined as block spec allows invoking a function with a subtype when defined as block spec closures var on ->var.call (#8584) closures var on ->var.call (#8584) gets proc to lib fun (#504) gets proc to lib fun (#504) saves receiver value of proc pointer `->var.foo` saves receiver value of proc pointer `->var.foo` codegens nilable proc type (1) codegens nilable proc type (1) can pass Proc(T) to Proc(Nil) in type restriction (#8964) can pass Proc(T) to Proc(Nil) in type restriction (#8964) executes proc pointer on primitive executes proc pointer on primitive uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) uses alias of proc with virtual type (#1347) builds nilable proc type from fun builds nilable proc type from fun call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method call proc pointer of instance method doesn't crash when taking a proc pointer that multidispatches on the top-level (#3822) doesn't crash when taking a proc pointer that multidispatches on the top-level (#3822) can assign proc that returns anything to proc that returns nil, using union type (#3655) can assign proc that returns anything to proc that returns nil, using union type (#3655) codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type codegens proc that accepts array of type gets proc pointer using virtual type (#1337) gets proc pointer using virtual type (#1337) doesn't crash on #2196 doesn't crash on #2196 call proc pointer with args call proc pointer with args call proc pointer call proc pointer accesses T in macros as a TupleLiteral accesses T in macros as a TupleLiteral codegens proc that returns a virtual type codegens proc that returns a virtual type doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) saves receiver value of proc pointer `->@ivar.foo` saves receiver value of proc pointer `->@ivar.foo` codegens proc of generic type codegens proc of generic type allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically binds function pointer to associated call binds function pointer to associated call makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference makes sure that proc pointer is transformed after type inference automatically casts proc that returns something to proc that returns void automatically casts proc that returns something to proc that returns void codegens proc with union type that returns itself codegens proc with union type that returns itself allows proc type of enum type with base type allows proc type of enum type with base type can assign proc that returns anything to proc that returns nil (#3655) can assign proc that returns anything to proc that returns nil (#3655) allows invoking proc literal with smaller type allows invoking proc literal with smaller type codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens proc to implicit self in constant (#647) codegens nilable proc type (2) codegens nilable proc type (2) Codegen: responds_to? codegens responds_to? with nilable gives false because other type 2 codegens responds_to? with nilable gives false because other type 2 codegens responds_to? false for simple type codegens responds_to? false for simple type works with generic virtual module (2) (#8334) works with generic virtual module (2) (#8334) works with generic virtual superclass (1) works with generic virtual superclass (1) codegens responds_to? with nilable gives true codegens responds_to? with nilable gives true works with virtual class type (1) (#1926) works with virtual class type (1) (#1926) codegens responds_to? with generic class (1) codegens responds_to? with generic class (1) works with virtual class type (2) (#1926) works with virtual class type (2) (#1926) doesn't error if result is discarded (#14113) doesn't error if result is discarded (#14113) codegens responds_to? true for simple type codegens responds_to? true for simple type codegens responds_to? with union gives true codegens responds_to? with union gives true does for generic instance type metaclass (#4353) does for generic instance type metaclass (#4353) works with generic virtual module (1) works with generic virtual module (1) codegens responds_to? with union gives false codegens responds_to? with union gives false works with virtual type works with virtual type codegens responds_to? with generic class (2) codegens responds_to? with generic class (2) works with module works with module works with generic virtual superclass (2) works with generic virtual superclass (2) codegens responds_to? with nilable gives false because other type 1 codegens responds_to? with nilable gives false because other type 1 works with two virtual types works with two virtual types Crystal::Repl::Interpreter enum does enum new does enum new does enum value does enum value Crystal::Repl::Interpreter responds_to? does responds_to? does responds_to? doesn't crash if def body ends up with no type (#12219) doesn't crash if def body ends up with no type (#12219) Semantic: cast should error if can't cast even if not instantiated should error if can't cast even if not instantiated allows casting NoReturn to any type (#2132) allows casting NoReturn to any type (#2132) doesn't cast to unbound generic type (as?) (#5927) doesn't cast to unbound generic type (as?) (#5927) allows casting reference union to void pointer allows casting reference union to void pointer casts to bigger union casts to bigger union disallows casting to Reference disallows casting to Reference doesn't allow upcast of generic type var (#996) doesn't allow upcast of generic type var (#996) disallows casting int to pointer disallows casting int to pointer errors if casting nil to Object inside typeof (#2403) errors if casting nil to Object inside typeof (#2403) doesn't cast to virtual primitive (bug) doesn't cast to virtual primitive (bug) can cast to metaclass (bug) can cast to metaclass (bug) casts to base class making it virtual (2) casts to base class making it virtual (2) casts uninstantiated generic class to itself (#10882) casts uninstantiated generic class to itself (#10882) casts to compatible type and use it casts to compatible type and use it casts to module casts to module doesn't crash with typeof no-type (#7441) doesn't crash with typeof no-type (#7441) doesn't eagerly try to check cast type (#12268) doesn't eagerly try to check cast type (#12268) disallows casting to Object (#815) disallows casting to Object (#815) casts from union to compatible union casts from union to compatible union disallows casting to Class disallows casting to Class considers else to be unreachable (#9658) considers else to be unreachable (#9658) casts to generic virtual type casts to generic virtual type casts to target type even if can't infer casted value type (obsolete) casts to target type even if can't infer casted value type (obsolete) casts pointer of one type to another type casts pointer of one type to another type casts to incompatible type gives error casts to incompatible type gives error allows casting object to void pointer allows casting object to void pointer doesn't error if casting to a generic type doesn't error if casting to a generic type casts to same type is ok casts to same type is ok can cast to metaclass (2) (#11121) can cast to metaclass (2) (#11121) can cast from Void* to virtual type (#3014) can cast from Void* to virtual type (#3014) casts from union to incompatible union gives error casts from union to incompatible union gives error casts to base class making it virtual (1) casts to base class making it virtual (1) disallows casting fun to pointer disallows casting fun to pointer doesn't cast to unbound generic type (as) (#5927) doesn't cast to unbound generic type (as) (#5927) casts pointer to another type casts pointer to another type disallows casting pointer to fun disallows casting pointer to fun casts from pointer to generic class gives error casts from pointer to generic class gives error errors on cast inside a call that can't be instantiated errors on cast inside a call that can't be instantiated Code gen: cast allows casting object to pointer and back allows casting object to pointer and back casts with block var that changes type (#3341) casts with block var that changes type (#3341) can cast to metaclass (#11121) can cast to metaclass (#11121) downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int codegens class method when type id is available but not a virtual type (#3490) codegens class method when type id is available but not a virtual type (#3490) casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type allows casting nilable type to Void* (1) allows casting nilable type to Void* (1) casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type can cast from Void* to virtual type (#3014) can cast from Void* to virtual type (#3014) allows casting nil to Void* allows casting nil to Void* casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError upcasts type to virtual (#3304) upcasts type to virtual (#3304) sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer cast virtual metaclass type to nilable virtual instance type (#12628) cast virtual metaclass type to nilable virtual instance type (#12628) casts to module casts to module casts to module casts to module casts to module casts to module casts to module casts to module casts to module casts to module upcasts from non-generic to generic upcasts from non-generic to generic allows casting nilable type to Void* (2) allows casting nilable type to Void* (2) allows casting nilable type to Void* (3) allows casting nilable type to Void* (3) casts to bigger union casts to bigger union doesn't corrupt stack when downcasting union to union with different alignment (#14285) doesn't corrupt stack when downcasting union to union with different alignment (#14285) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts to base class making it virtual casts to base class making it virtual casts between union types, where union has a tuple type (#3377) casts between union types, where union has a tuple type (#3377) casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError upcasts type to virtual (2) (#3304) upcasts type to virtual (2) (#3304) upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) Semantic: pointer can't do Pointer.malloc without type var can't do Pointer.malloc without type var detects recursive pointerof expansion (#551) (#553) detects recursive pointerof expansion (#551) (#553) types int pointer types int pointer doesn't crash if pointerof expansion type has generic splat parameter (#11808) doesn't crash if pointerof expansion type has generic splat parameter (#11808) types pointer of constant types pointer of constant errors if doing Pointer.allocate errors if doing Pointer.allocate errors with non-matching generic value with value=, generic type (#10211) errors with non-matching generic value with value=, generic type (#10211) types pointer value types pointer value type pointer casting type pointer casting pointer malloc creates new type pointer malloc creates new type can assign pointerof virtual type (#8216) can assign pointerof virtual type (#8216) types realloc types realloc types pointer value on typedef types pointer value on typedef create pointer by address create pointer by address types pointer diff types pointer diff takes pointerof lib external var takes pointerof lib external var detects recursive pointerof expansion (4) detects recursive pointerof expansion (4) can pass any pointer to something expecting void* in lib call, with to_unsafe can pass any pointer to something expecting void* in lib call, with to_unsafe errors with non-matching generic value with value= (#10211) errors with non-matching generic value with value= (#10211) can assign nil to void pointer can assign nil to void pointer types pointer add types pointer add can pass any pointer to something expecting void* in lib call can pass any pointer to something expecting void* in lib call pointer of class raises error pointer of class raises error type pointer casting of object type type pointer casting of object type detects recursive pointerof expansion (2) (#1654) detects recursive pointerof expansion (2) (#1654) detects recursive pointerof expansion (3) detects recursive pointerof expansion (3) types Pointer.malloc types Pointer.malloc errors with non-matching generic value with value=, union of generic types (#10544) errors with non-matching generic value with value=, union of generic types (#10544) says undefined variable (#7556) says undefined variable (#7556) allows using pointer with subclass allows using pointer with subclass pointer of value error pointer of value error Normalize: case normalizes select with else normalizes select with else normalizes select with assign normalizes select with assign normalizes select with assign and bang method normalizes select with assign and bang method normalizes select with call normalizes select with call normalizes select with assign and question method normalizes select with assign and question method Normalize: op assign normalizes var &+= normalizes var &+= normalizes var += normalizes var += normalizes var &-= normalizes var &-= normalizes var &&= normalizes var &&= normalizes exp[0] += normalizes exp[0] += normalizes var *= normalizes var *= normalizes var[0] += normalizes var[0] += normalizes @@var.value += normalizes @@var.value += normalizes @var[0] += normalizes @var[0] += normalizes exp.value ||= normalizes exp.value ||= normalizes var.value += normalizes var.value += normalizes @@var[0] += normalizes @@var[0] += normalizes var -= normalizes var -= normalizes @var.value += normalizes @var.value += normalizes exp[value] ||= normalizes exp[value] ||= normalizes exp[value] &&= normalizes exp[value] &&= normalizes var ||= normalizes var ||= normalizes exp[value] += normalizes exp[value] += normalizes var &*= normalizes var &*= normalizes exp.value &&= normalizes exp.value &&= normalizes exp.value += normalizes exp.value += Code gen: macro expands macro with default arg and splat (2) (#784) expands macro with default arg and splat (2) (#784) uses invocation context uses invocation context expands macro expands macro gets enum members as constants gets enum members as constants passes #826 passes #826 keeps line number with no block keeps line number with no block fixes empty types of macro expansions (#1379) fixes empty types of macro expansions (#1379) can use constants can use constants doesn't reuse macro nodes (bug) doesn't reuse macro nodes (bug) can iterate union types can iterate union types codegens macro def with splat (#496) codegens macro def with splat (#496) resolves alias in macro resolves alias in macro keeps heredoc contents inside macro keeps heredoc contents inside macro expands def macro with @type.name with virtual expands def macro with @type.name with virtual recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added recalculates method when virtual metaclass type is added errors if dynamic constant assignment after macro expansion errors if dynamic constant assignment after macro expansion forwards file location forwards file location expands macro and resolves type correctly expands macro and resolves type correctly runs macro with splat runs macro with splat runs macro with arg and splat runs macro with arg and splat expands def macro with @type.name expands def macro with @type.name expands inline macro for expands inline macro for doesn't replace %s in string (#2178) doesn't replace %s in string (#2178) executes subclasses executes subclasses determines if overrides, with macro method (false) determines if overrides, with macro method (false) can access type variables of a module can access type variables of a module doesn't skip abstract classes when defining macro methods doesn't skip abstract classes when defining macro methods gets default value of instance variable of inherited type that also includes module gets default value of instance variable of inherited type that also includes module can refer to types can refer to types executes with named arguments executes with named arguments can refer to abstract (1) can refer to abstract (1) uses tuple T in method with free vars uses tuple T in method with free vars expands macro defined in class expands macro defined in class expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) expands macro with op assign inside assign (#5568) determines if overrides, through another class (true) determines if overrides, through another class (true) gets constant gets constant gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type gets default value of instance variable of generic type expands @type.name in virtual metaclass (1) expands @type.name in virtual metaclass (1) determines if method exists (false) determines if method exists (false) declares constant in macro (#838) declares constant in macro (#838) executes with named arguments for positional arg (2) executes with named arguments for positional arg (2) expands def macro with @type.instance_vars expands def macro with @type.instance_vars expands def macro expands def macro can refer to abstract (2) can refer to abstract (2) expands inline macro if (true) expands inline macro if (true) expands def macro with @type.name with virtual (2) expands def macro with @type.name with virtual (2) expands @def in inline macro expands @def in inline macro determines if overrides (true) determines if overrides (true) expands @def in macro expands @def in macro can access type variables of a tuple can access type variables of a tuple expands macro with arguments expands macro with arguments executes with named arguments for positional arg (3) executes with named arguments for positional arg (3) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) replaces %s inside string inside interpolation (#2178) checks if macro expansion returns (#821) checks if macro expansion returns (#821) initializes class var in macro initializes class var in macro gets default value of instance variable gets default value of instance variable can access type variables can access type variables expands macro def with return (#1040) expands macro def with return (#1040) gets methods gets methods expands def macro with @type.instance_vars with virtual expands def macro with @type.instance_vars with virtual stringifies type without virtual marker stringifies type without virtual marker expands macro as class method and accesses @type expands macro as class method and accesses @type surrounds {{yield}} with begin/end surrounds {{yield}} with begin/end expands macro with escaped quotes (#895) expands macro with escaped quotes (#895) expands def macro with @type.instance_vars with subclass expands def macro with @type.instance_vars with subclass expands inline macro expands inline macro uses indexed macro variable uses indexed macro variable uses indexed macro variable with many keys uses indexed macro variable with many keys correctly resolves constant inside block in macro def correctly resolves constant inside block in macro def executes with named arguments for positional arg (1) executes with named arguments for positional arg (1) forwards line number forwards line number can refer to @type can refer to @type can refer to union (1) can refer to union (1) expands macro that invokes another macro expands macro that invokes another macro responds correctly to has_constant? with @top_level responds correctly to has_constant? with @top_level allows overriding macro definition when redefining base class allows overriding macro definition when redefining base class allows macro with default arguments allows macro with default arguments expands macro with default arg and splat (3) (#784) expands macro with default arg and splat (3) (#784) expands macro defined in base class expands macro defined in base class gets correct class name when there are classes in the middle gets correct class name when there are classes in the middle says that enum has Flags annotation says that enum has Flags annotation replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) retains original yield expression (#2923) retains original yield expression (#2923) correctly recomputes call (bug) correctly recomputes call (bug) says that enum doesn't have Flags annotation says that enum doesn't have Flags annotation codegens macro def with default arg (similar to #496) codegens macro def with default arg (similar to #496) gets enum members with @type.constants gets enum members with @type.constants can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal transforms hooks (bug) transforms hooks (bug) can access free variables can access free variables doesn't override local variable when using macro variable (2) doesn't override local variable when using macro variable (2) keeps line number with a block keeps line number with a block forwards dir location forwards dir location finds macro in class finds macro in class expands def macro with instance var and method call (bug) expands def macro with instance var and method call (bug) expands @type.name in virtual metaclass (2) expands @type.name in virtual metaclass (2) expands macro as class method expands macro as class method copies base macro def to sub-subtype even after it was copied to a subtype (#448) copies base macro def to sub-subtype even after it was copied to a subtype (#448) can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal can use macro inside hash literal receives &block receives &block determines if overrides, through module (true) determines if overrides, through module (true) doesn't override local variable when using macro variable doesn't override local variable when using macro variable determines if method exists (true) determines if method exists (true) types macro expansion bug (#1734) types macro expansion bug (#1734) implicitly marks method as macro def when using @type implicitly marks method as macro def when using @type expands macro that yields expands macro that yields can access type variables that are not types can access type variables that are not types devirtualizes @type devirtualizes @type initializes instance var in macro initializes instance var in macro finds macro from virtual type finds macro from virtual type access to the program with @top_level access to the program with @top_level determines if overrides (false) determines if overrides (false) determines if variable has default value determines if variable has default value expands inline macro if (false) expands inline macro if (false) keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro keeps heredoc contents with interpolation inside macro can access type variables of a generic type can access type variables of a generic type expands macro with default arg and splat (#784) expands macro with default arg and splat (#784) expands Path with resolve method expands Path with resolve method can refer to union (2) can refer to union (2) codegens macro with comment (bug) (#1396) codegens macro with comment (bug) (#1396) does block unpacking inside macro expression (#13707) does block unpacking inside macro expression (#13707) expands def macro with var expands def macro with var doesn't replace %q() (#2178) doesn't replace %q() (#2178) executes all_subclasses executes all_subclasses Semantic: did you mean suggests a better alternative to logical operators (#2715) suggests a better alternative to logical operators (#2715) says did you mean for instance var says did you mean for instance var says did you mean finds most similar in type says did you mean finds most similar in type says did you mean for global method without parenthesis says did you mean for global method without parenthesis says did you mean for two mistakes in long word in instance method says did you mean for two mistakes in long word in instance method says did you mean for one mistake in short word in instance method says did you mean for one mistake in short word in instance method doesn't suggest when declaring var inside macro (#466) doesn't suggest when declaring var inside macro (#466) suggests for class variable suggests for class variable doesn't suggest for operator doesn't suggest for operator suggest that there might be a typo for an initialize method with overload suggest that there might be a typo for an initialize method with overload doesn't suggest when declaring var with suffix if and using it (#946) doesn't suggest when declaring var with suffix if and using it (#946) says did you mean in instance var declaration says did you mean in instance var declaration says did you mean for named argument says did you mean for named argument suggest that there might be a typo for an initialize method suggest that there might be a typo for an initialize method says did you mean for nested class says did you mean for nested class says did you mean finds most similar in def says did you mean finds most similar in def says did you mean for instance var in subclass says did you mean for instance var in subclass says did you mean for global method with parenthesis says did you mean for global method with parenthesis says did you mean for class says did you mean for class suggest that there might be a typo for an initialize method in inherited class suggest that there might be a typo for an initialize method in inherited class says did you mean for variable says did you mean for variable Crystal::Repl::Interpreter pointers interprets pointerof and mutates memory (there are more variables) interprets pointerof and mutates memory (there are more variables) discards pointer get discards pointer get interprets pointer set and get (union type, setter value) interprets pointer set and get (union type, setter value) interprets pointer set and get (clear stack) interprets pointer set and get (clear stack) discards pointer set discards pointer set interprets pointer new and pointer address interprets pointer new and pointer address interprets pointer realloc interprets pointer realloc discards pointer diff discards pointer diff interprets nilable pointer truthiness interprets nilable pointer truthiness discards pointer new discards pointer new interprets pointer add interprets pointer add pointerof read `StaticArray#@buffer` (1) pointerof read `StaticArray#@buffer` (1) interprets pointer set and get (int) interprets pointer set and get (int) discards pointer realloc discards pointer realloc discards pointer malloc discards pointer malloc pointerof read instance var pointerof read instance var discards pointer add discards pointer add discards pointerof discards pointerof interprets pointerof, mutates pointer, read var interprets pointerof, mutates pointer, read var interprets pointer diff interprets pointer diff pointerof instance var pointerof instance var interprets pointer set and get (union type) interprets pointer set and get (union type) pointerof class var pointerof class var pointerof read `StaticArray#@buffer` (2) pointerof read `StaticArray#@buffer` (2) interprets pointerof, mutates var, read pointer interprets pointerof, mutates var, read pointer interprets pointer set and get (bool) interprets pointer set and get (bool) interprets pointer diff, negative interprets pointer diff, negative interprets pointer realloc wrapper interprets pointer realloc wrapper Lexer: location assigns correct loc location to node assigns correct loc location to node uses two consecutive loc pragma uses two consecutive loc pragma locations with virtual files should be comparable locations with virtual files should be comparable overrides location with pragma overrides location with pragma stores column numbers stores column numbers locations in same files are comparable based on line locations in same files are comparable based on line Location.parse raises ArgumentError if line number is invalid raises ArgumentError if line number is invalid raises ArgumentError if missing colon raises ArgumentError if missing colon raises ArgumentError if missing part raises ArgumentError if missing part parses location from string parses location from string raises ArgumentError if column number is invalid raises ArgumentError if column number is invalid stores line numbers stores line numbers pushes and pops its location pushes and pops its location locations in different files have no order locations in different files have no order parses var/call right after loc (#491) parses var/call right after loc (#491) Normalize: return next break removes nodes after return removes nodes after return removes nodes after if that returns in both branches removes nodes after if that returns in both branches doesn't remove nodes after if that returns in one branch doesn't remove nodes after if that returns in one branch doesn't remove after return when there's an unless doesn't remove after return when there's an unless removes nodes after break removes nodes after break removes nodes after next removes nodes after next Semantic: new evaluates initialize default value at the instance scope (6) (#731) evaluates initialize default value at the instance scope (6) (#731) evaluates initialize default value at the instance scope (3) (#731) evaluates initialize default value at the instance scope (3) (#731) doesn't have default new for inherited class from generic type doesn't have default new for inherited class from generic type uses correct receiver for `initialize` in namespaced generic classes (#4086) uses correct receiver for `initialize` in namespaced generic classes (#4086) doesn't incorrectly redefines new for generic class doesn't incorrectly redefines new for generic class evaluates initialize default value at the instance scope (5) (#731) evaluates initialize default value at the instance scope (5) (#731) evaluates initialize default value at the instance scope (2) (#731) evaluates initialize default value at the instance scope (2) (#731) evaluates initialize default value at the instance scope (1) (#731) evaluates initialize default value at the instance scope (1) (#731) evaluates initialize default value at the instance scope (4) (#731) evaluates initialize default value at the instance scope (4) (#731) errors if using self call in default argument (3) errors if using self call in default argument (3) errors if using self call in default argument (1) errors if using self call in default argument (1) inherits initialize and new methods if doesn't define new (#3238) inherits initialize and new methods if doesn't define new (#3238) errors if using self call in default argument (2) errors if using self call in default argument (2) types to_s of nilable value type nilable value type nilable type with more than two elements, Nil at the end nilable type with more than two elements, Nil at the end does for type contained in generic module does for type contained in generic module union of simple types union of simple types union types should not have extra parens in arrays in arrays in pointers in pointers in tuples in tuples should have parens as return type as return type as arg type as arg type named tuple named tuple array of simple types array of simple types non-instantiated array non-instantiated array nilable reference type nilable reference type does for type contained in generic class does for type contained in generic class Semantic: tuples errors if non-tuple is splatted inside tuple errors if non-tuple is splatted inside tuple #[](RangeLiteral) types, inbound begin, nilable types, inbound begin, nilable types, begin-less, end-less types, begin-less, end-less types, metaclass index types, metaclass index gives error when begin index is out of range gives error when begin index is out of range types, exclusive range types, exclusive range types, inbound begin types, inbound begin types, inbound begin, end-less types, inbound begin, end-less types, begin-less types, begin-less types, out of bound begin, nilable types, out of bound begin, nilable accept tuple in type restriction accept tuple in type restriction doesn't crash on tuple in not executed block (#6718) doesn't crash on tuple in not executed block (#6718) errors on tuple too big (#3816) errors on tuple too big (#3816) errors if non-tuple is splatted inside tuple (2) errors if non-tuple is splatted inside tuple (2) matches tuple with splat (2) (#2932) matches tuple with splat (2) (#2932) types T as a tuple of metaclasses types T as a tuple of metaclasses #[](Path) works for named tuple indexer works for named tuple indexer works for tuple indexer works for tuple indexer gives error when using named args on Tuple gives error when using named args on Tuple can name a tuple type can name a tuple type types tuple of one element and then two elements types tuple of one element and then two elements types tuple of three elements types tuple of three elements matches tuple with splat (#2932) matches tuple with splat (#2932) types tuple with splats inside types tuple with splats inside types tuple of one element types tuple of one element errors on recursive splat expansion (1) (#361) errors on recursive splat expansion (1) (#361) errors on named tuple too big errors on named tuple too big errors on recursive splat expansion (#218) errors on recursive splat expansion (#218) can iterate T can iterate T can call [] on T can call [] on T accepts tuple covariance in array accepts tuple covariance in array doesn't error if Tuple has no args doesn't error if Tuple has no args merges two tuple types of same size merges two tuple types of same size doesn't unify tuple metaclasses (#5384) doesn't unify tuple metaclasses (#5384) doesn't trigger recursive splat expansion error (#7164) doesn't trigger recursive splat expansion error (#7164) errors if using two splat indices on restriction errors if using two splat indices on restriction allows tuple covariance allows tuple covariance #[](NumberLiteral) gives error when indexing out of range gives error when indexing out of range types, out of bound, nilable types, out of bound, nilable types, metaclass index types, metaclass index gives error when indexing out of range on empty tuple gives error when indexing out of range on empty tuple types, inbound index, nilable types, inbound index, nilable types, inbound index types, inbound index errors on recursive splat expansion (2) (#361) errors on recursive splat expansion (2) (#361) Crystal::Repl::Interpreter typeof interprets typeof virtual type interprets typeof virtual type interprets typeof metaclass type interprets typeof metaclass type interprets typeof instance type interprets typeof instance type Code gen: virtual type dispatches on virtual metaclass (3) dispatches on virtual metaclass (3) dispatches on virtual metaclass (2) dispatches on virtual metaclass (2) assign instance variable in virtual type assign instance variable in virtual type call base overwritten method call base overwritten method casts union to virtual casts union to virtual codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type codegens call to Object#to_s from nilable type doesn't lookup in Value+ when virtual type is Object+ doesn't lookup in Value+ when virtual type is Object+ codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens new for virtual class with one type codegens virtual method of abstract metaclass codegens virtual method of abstract metaclass dispatch call with virtual type argument dispatch call with virtual type argument codegens new for simple type, then for virtual codegens new for simple type, then for virtual codegens virtual call with explicit self and nilable type codegens virtual call with explicit self and nilable type correctly dispatch call with block when the obj is a virtual type correctly dispatch call with block when the obj is a virtual type returns type with virtual type def type returns type with virtual type def type casts metaclass union type to virtual metaclass type (#6298) casts metaclass union type to virtual metaclass type (#6298) codegens virtual call with explicit self codegens virtual call with explicit self calls class method 2 calls class method 2 calls class method 1 calls class method 1 codegens new twice for virtual codegens new twice for virtual lookup instance variables in parent types lookup instance variables in parent types dispatch call with nilable virtual arg dispatch call with nilable virtual arg dispatches on virtual metaclass (1) dispatches on virtual metaclass (1) codegens non-virtual call that calls virtual call to another virtual call codegens non-virtual call that calls virtual call to another virtual call initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated initializes ivars to nil even if object never instantiated codegens allocate for virtual type with custom new codegens allocate for virtual type with custom new codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) codegens new for new on virtual abstract class (#3835) call overwritten method call overwritten method calls class method 3 calls class method 3 call base method call base method codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types casts virtual type to union casts virtual type to union can belong to union can belong to union casts virtual type to base virtual type casts virtual type to base virtual type Lexer macro lexes macro with semicolon before end lexes macro with semicolon before end lexes macro with nested abstract def lexes macro with nested abstract def lexes macro with curly escape in comment lexes macro with curly escape in comment lexes macro with slash not followed by curly lexes macro with slash not followed by curly lexes macro with nested lib lexes macro with nested lib keeps correct column and line numbers keeps correct column and line numbers skips whitespace skips whitespace lexes macro var lexes macro var lexes macro with expression lexes macro with expression lexes macro with embedded char and sharp lexes macro with embedded char and sharp lexes macro with nested select lexes macro with nested select lexes macro with embedded string with %< lexes macro with embedded string with %< lexes macro with embedded string and expression lexes macro with embedded string and expression lexes macro without nested if lexes macro without nested if lexes macro with comments lexes macro with comments lexes macro with if after assign lexes macro with if after assign lexes macro with nested case lexes macro with nested case lexes escaped quote inside string (#895) lexes escaped quote inside string (#895) lexes macro with nested struct lexes macro with nested struct lexes macro with nested do lexes macro with nested do lexes macro with embedded string and backslash lexes macro with embedded string and backslash lexes macro with embedded string with %( lexes macro with embedded string with %( lexes macro with nested embedded string with %( lexes macro with nested embedded string with %( lexes macro with nested if lexes macro with nested if lexes macro with nested while lexes macro with nested while lexes simple macro lexes simple macro doesn't lex macro var if escaped doesn't lex macro var if escaped lexes macro with nested macro lexes macro with nested macro lexes macro with nested union lexes macro with nested union lexes macro with if as suffix after return lexes macro with if as suffix after return lexes macro with embedded string with %( ignores begin lexes macro with embedded string with %( ignores begin lexes macro with curly escape lexes macro with curly escape lexes macro with nested fun lexes macro with nested fun lexes macro with embedded string with %< ignores begin lexes macro with embedded string with %< ignores begin lexes macro with nested enum lexes macro with nested enum lexes macro with string interpolation and double curly brace lexes macro with string interpolation and double curly brace lexes macro with embedded string lexes macro with embedded string lexes bug #654 lexes bug #654 lexes macro with nested def lexes macro with nested def lexes macro with nested begin lexes macro with nested begin lexes macro with comments and expressions lexes macro with comments and expressions lexes macro with nested until lexes macro with nested until lexes with for inside escaped macro (#1029) lexes with for inside escaped macro (#1029) lexes macro with nested annotation lexes macro with nested annotation lexes macro with nested class lexes macro with nested class lexes macro with nested abstract class lexes macro with nested abstract class lexes macro with nested unless lexes macro with nested unless lexes begin end lexes begin end reaches end reaches end lexes with if/end inside escaped macro (#1029) lexes with if/end inside escaped macro (#1029) lexes macro with control lexes macro with control lexes macro with nested module lexes macro with nested module keeps correct line number after lexes the part of keyword and newline (#4656) keeps correct line number after lexes the part of keyword and newline (#4656) lexes macro with embedded string with %[ lexes macro with embedded string with %[ lexes macro with nested abstract struct lexes macro with nested abstract struct lexes with unless inside escaped macro (#5664) lexes with unless inside escaped macro (#5664) lexes macro with if as suffix lexes macro with if as suffix lexes macro with embedded string with %[ ignores begin lexes macro with embedded string with %[ ignores begin Codegen: extern struct codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret sets callback on extern struct sets callback on extern struct sets callback on extern struct sets callback on extern struct sets callback on extern struct sets callback on extern struct sets callback on extern struct sets callback on extern struct sets callback on extern struct sets callback on extern struct declares extern union, sets and gets instance var declares extern union, sets and gets instance var declares extern struct with no constructor declares extern struct with no constructor declares extern struct, sets and gets instance var declares extern struct, sets and gets instance var invokes proc with extern struct with sret invokes proc with extern struct with sret codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens extern proc call twice (#4982) codegens extern proc call twice (#4982) codegens proc that takes and returns large extern struct by value codegens proc that takes and returns large extern struct by value codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) codegens proc that takes an extern struct with C ABI (2) sets callback on extern union sets callback on extern union sets callback on extern union sets callback on extern union sets callback on extern union sets callback on extern union sets callback on extern union sets callback on extern union sets callback on extern union sets callback on extern union declares extern union with no constructor declares extern union with no constructor invokes proc with extern struct invokes proc with extern struct codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil declares extern struct with no constructor, assigns var declares extern struct with no constructor, assigns var doesn't crash with proc with extern struct that's a closure doesn't crash with proc with extern struct that's a closure Semantic: generic class errors if invoking new on private new in generic type (#3485) errors if invoking new on private new in generic type (#3485) errors if inheriting from generic when it is non-generic errors if inheriting from generic when it is non-generic splats generic type var splats generic type var doesn't crash when matching restriction against number literal (2) (#3157) doesn't crash when matching restriction against number literal (2) (#3157) inherits from generic with forwarding (1) inherits from generic with forwarding (1) inherits class methods from generic class inherits class methods from generic class can use virtual type for generic class can use virtual type for generic class errors if using Value in a generic type errors if using Value in a generic type errors if using Number in a generic type errors if using Number in a generic type subclasses twice with same generic class (#3423) subclasses twice with same generic class (#3423) errors if using Float in a generic type errors if using Float in a generic type restricts non-generic to generic restricts non-generic to generic errors if splatting a non-tuple (#9853) errors if splatting a non-tuple (#9853) inherits non-generic to generic (1) inherits non-generic to generic (1) errors if using Proc in a generic type errors if using Proc in a generic type allows T::Type with T a generic type allows T::Type with T a generic type gives helpful error message when generic type var is missing (#1526) gives helpful error message when generic type var is missing (#1526) errors if using Tuple in a generic type errors if using Tuple in a generic type errors if passing integer literal to Proc as generic argument (#1120) errors if passing integer literal to Proc as generic argument (#1120) never types Path as virtual outside generic type parameter (#3989) never types Path as virtual outside generic type parameter (#3989) disallow using a non-instantiated generic type as a generic type argument disallow using a non-instantiated generic type as a generic type argument errors if using Class in a generic type errors if using Class in a generic type unifies generic metaclass types unifies generic metaclass types can use type var that resolves to number in restriction (#6502) can use type var that resolves to number in restriction (#6502) doesn't find T type parameter of current type in superclass (#4604) doesn't find T type parameter of current type in superclass (#4604) replaces type parameters in virtual metaclasses (#10691) replaces type parameters in virtual metaclasses (#10691) can define instance var forward declared (#962) can define instance var forward declared (#962) replaces type parameters for virtual types (#3235) replaces type parameters for virtual types (#3235) errors if using Number in alias errors if using Number in alias finds generic type argument from method with default value finds generic type argument from method with default value errors if using Enum in a generic type errors if using Enum in a generic type initializes instance variable of generic type using type var (#961) initializes instance variable of generic type using type var (#961) inherits non-generic to generic (2) inherits non-generic to generic (2) errors if using Reference in a generic type errors if using Reference in a generic type creates pointer of generic type and uses it creates pointer of generic type and uses it doesn't crash when matching restriction against number literal (#3157) doesn't crash when matching restriction against number literal (#3157) allows initializing instance variable (#665) allows initializing instance variable (#665) restricts virtual generic instance type against generic (#3351) restricts virtual generic instance type against generic (#3351) inherits instance var type annotation from generic to concrete inherits instance var type annotation from generic to concrete doesn't allow union of generic class with module to be assigned to a generic class with module (#2425) doesn't allow union of generic class with module to be assigned to a generic class with module (#2425) instantiates generic variadic class, accesses T from instance method through superclass, more args instantiates generic variadic class, accesses T from instance method through superclass, more args inherits from generic with forwarding (2) inherits from generic with forwarding (2) instantiates generic class with default argument in initialize (#394) instantiates generic class with default argument in initialize (#394) instantiates generic variadic class, accesses T from class method through superclass instantiates generic variadic class, accesses T from class method through superclass errors if passing integer literal to Tuple as generic argument (#1120) errors if passing integer literal to Tuple as generic argument (#1120) virtual metaclass type implements super virtual metaclass type (#3007) virtual metaclass type implements super virtual metaclass type (#3007) doesn't consider unbound generic instantiations as concrete (#7200) doesn't consider unbound generic instantiations as concrete (#7200) error on T::Type with T a generic type that's a union error on T::Type with T a generic type that's a union disallow using a non-instantiated module type as a generic type argument disallow using a non-instantiated module type as a generic type argument inherits instance var type annotation from generic to generic to concrete inherits instance var type annotation from generic to generic to concrete instantiates generic variadic class, accesses T from instance method through superclass instantiates generic variadic class, accesses T from instance method through superclass creates pointer of generic type and uses it (2) creates pointer of generic type and uses it (2) instantiates generic variadic class, accesses T from instance method instantiates generic variadic class, accesses T from instance method instantiates generic variadic class, accesses T from class method instantiates generic variadic class, accesses T from class method errors if using Object in a generic type errors if using Object in a generic type calls super on generic type when superclass has no initialize (#933) calls super on generic type when superclass has no initialize (#933) restricts non-generic to generic with free var restricts non-generic to generic with free var errors if using Number | String in a generic type errors if using Number | String in a generic type errors if using Struct in a generic type errors if using Struct in a generic type errors if using Pointer in a generic type errors if using Pointer in a generic type recomputes on new subclass recomputes on new subclass doesn't duplicate overload on generic class with class method (#2385) doesn't duplicate overload on generic class with class method (#2385) errors if using StaticArray in a generic type errors if using StaticArray in a generic type instantiates generic variadic class, accesses T from instance method, more args instantiates generic variadic class, accesses T from instance method, more args restricts generic to generic with free var restricts generic to generic with free var errors if passing integer literal to Union as generic argument errors if passing integer literal to Union as generic argument allows initializing instance variable in inherited generic type allows initializing instance variable in inherited generic type doesn't compute generic instance var initializers in formal superclass's context (#4753) doesn't compute generic instance var initializers in formal superclass's context (#4753) restricts generic type argument through alias in a non-strict way restricts generic type argument through alias in a non-strict way shows error due to generic instantiation (#7083) shows error due to generic instantiation (#7083) doesn't find unbound type parameter in main code inside generic type (#6168) doesn't find unbound type parameter in main code inside generic type (#6168) errors if inheriting from generic and incorrect number of type vars errors if inheriting from generic and incorrect number of type vars errors if inheriting generic type and not specifying type vars (#460) errors if inheriting generic type and not specifying type vars (#460) errors on too nested tuple instance errors on too nested tuple instance errors if using Number in recursive alias errors if using Number in recursive alias types macro def with generic instance types macro def with generic instance inherits twice inherits twice inherits from generic with instantiation with instance var inherits from generic with instantiation with instance var resolves T through metaclass inheritance (#7914) resolves T through metaclass inheritance (#7914) instantiates generic variadic class, accesses T from instance method, more args (2) instantiates generic variadic class, accesses T from instance method, more args (2) nests generics with the same type var (#3297) nests generics with the same type var (#3297) errors if using Int in a generic type errors if using Int in a generic type can use type var that resolves to number in restriction using Int128 can use type var that resolves to number in restriction using Int128 errors on too nested generic instance, with union type errors on too nested generic instance, with union type never types Generic as virtual outside generic type parameter (#3989) never types Generic as virtual outside generic type parameter (#3989) inherits instance var type annotation from generic to concrete with T inherits instance var type annotation from generic to concrete with T errors on too nested generic instance errors on too nested generic instance gives helpful error message when generic type var is missing in block spec (#1526) gives helpful error message when generic type var is missing in block spec (#1526) defines empty initialize on inherited generic class defines empty initialize on inherited generic class correctly checks argument count when target type has a splat (#9855) correctly checks argument count when target type has a splat (#9855) inherits from generic with instantiation inherits from generic with instantiation Crystal::Doc::ProjectInfo .read_shard_properties without name and version properties without name and version properties strip whitespace strip whitespace name and version name and version empty properties empty properties only name only name no shard.yml no shard.yml strip quotes strip quotes ignores comments ignores comments duplicate properties uses first one duplicate properties uses first one indented properties indented properties #fill_with_defaults empty folder empty folder no shard.yml, but git tagged version no shard.yml, but git tagged version with shard.yml git untracked file doesn't prevent detection git untracked file doesn't prevent detection git tagged version dirty git tagged version dirty git non-tagged commit git non-tagged commit git tagged version git tagged version not in a git folder not in a git folder git non-tagged commit dirty git non-tagged commit dirty git with remote git with remote git but no commit git but no commit git missing git missing #source_url fails if refname is missing fails if refname is missing fails if pattern is missing fails if pattern is missing returns nil for empty pattern returns nil for empty pattern fails if pattern is missing fails if pattern is missing builds url builds url builds url builds url .find_git_version .find_git_version .find_source_url_pattern .find_source_url_pattern .git_remote simple origin simple origin no origin remote no origin remote origin plus other origin plus other no remote no remote no git workdir no git workdir Code gen: array literal spec creates custom non-generic array creates custom non-generic array assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works creates custom generic array, with splats creates custom generic array, with splats creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates custom generic array with type var creates custom generic array with type var creates custom generic array via alias (2) creates custom generic array via alias (2) creates custom generic array in module (#5684) creates custom generic array in module (#5684) creates custom generic array creates custom generic array creates custom generic array via alias creates custom generic array via alias creates custom non-generic array in module creates custom non-generic array in module creates custom non-generic array in nested module creates custom non-generic array in nested module creates custom non-generic array, with splats creates custom non-generic array, with splats Codegen: while doesn't crash on #2767 (3) doesn't crash on #2767 (3) endless break with value endless break with value codegens def with while codegens def with while doesn't crash on a = NoReturn doesn't crash on a = NoReturn codegens while with false codegens while with false break with value, condition fails break with value, condition fails doesn't crash on #2767 (2) doesn't crash on #2767 (2) codegens endless while codegens endless while codegens while with declared var 2 codegens while with declared var 2 break with value break with value endless conditional break with value endless conditional break with value break without value break without value skip block with next skip block with next codegens while with declared var 1 codegens while with declared var 1 doesn't crash on #2767 doesn't crash on #2767 doesn't crash on while true begin break rescue (#7786) doesn't crash on while true begin break rescue (#7786) conditional break without value conditional break without value codegens while with non-false condition codegens while with non-false condition codegens while with declared var 3 codegens while with declared var 3 conditional break with value conditional break with value doesn't crash on #2767 (4) doesn't crash on #2767 (4) error reporting reports wrong number of arguments, with optional parameters reports wrong number of arguments, with optional parameters reports wrong number of arguments reports wrong number of arguments reports unexpected named argument (2) reports unexpected named argument (2) uses correct name for top-level macro methods uses correct name for top-level macro methods reports missing block reports missing block reports unexpected block reports unexpected block reports unexpected named argument reports unexpected named argument Semantic: macro errors if using macro that is defined later errors if using macro that is defined later errors if macro def type doesn't match found errors if macro def type doesn't match found solves named macro expression arguments before macro expansion (type) (#2423) solves named macro expression arguments before macro expansion (type) (#2423) gets named arguments in double splat gets named arguments in double splat looks up argument types in macro owner, not in subclass (#2395) looks up argument types in macro owner, not in subclass (#2395) errors if find macros but wrong arguments errors if find macros but wrong arguments gives correct error when method is invoked but macro exists at the same scope gives correct error when method is invoked but macro exists at the same scope expands macro with block expands macro with block can use macro in instance var initializer (#7666) can use macro in instance var initializer (#7666) show macro trace in errors (1) show macro trace in errors (1) errors if macro uses undefined variable errors if macro uses undefined variable solves macro expression arguments before macro expansion (type) solves macro expression arguments before macro expansion (type) declares multi-assign vars for macro declares multi-assign vars for macro finds generic in macro code finds generic in macro code errors if declares macro inside if errors if declares macro inside if can access variable inside macro expansion (#2057) can access variable inside macro expansion (#2057) finds macro in inherited generic class finds macro in inherited generic class uses bare * uses bare * can define constant via macro included can define constant via macro included executes OpAssign (#9356) executes OpAssign (#9356) finds macro and method at the same scope inside included module finds macro and method at the same scope inside included module expands macro with break inside while (#1852) expands macro with break inside while (#1852) finds macro in included generic module finds macro in included generic module expands multiline macro expression in verbatim (#6643) expands multiline macro expression in verbatim (#6643) errors if requires inside if through macro expansion errors if requires inside if through macro expansion doesn't include parameters with default values in missing arguments error doesn't include parameters with default values in missing arguments error types macro def types macro def allows generic return types for macro def allows generic return types for macro def types macro def that calls another method inside a class types macro def that calls another method inside a class finds generic type argument of included module finds generic type argument of included module expands macro with block and argument to yield expands macro with block and argument to yield allows return values that include the return type of the macro def allows return values that include the return type of the macro def declares variable for macro with out declares variable for macro with out finds macro through alias (#2706) finds macro through alias (#2706) allows specifying self as macro def return type (2) allows specifying self as macro def return type (2) uses bare *, doesn't let more args uses bare *, doesn't let more args uses uninitialized variable with macros uses uninitialized variable with macros uses bare *, doesn't let more args uses bare *, doesn't let more args unpacks block parameters inside macros (#13742) unpacks block parameters inside macros (#13742) allows named args after splat allows named args after splat says missing argument because positional args don't match past splat says missing argument because positional args don't match past splat finds metaclass instance of instance method (#4639) finds metaclass instance of instance method (#4639) raise inside method without node renders both frames (#7147) renders both frames (#7147) inside macro with node points to caller when missing node location information (#7147) points to caller when missing node location information (#7147) pointing at the correct node in complex/nested macro (#7147) pointing at the correct node in complex/nested macro (#7147) renders both frames (#7147) renders both frames (#7147) contains the message and not `expanding macro` (#5669) contains the message and not `expanding macro` (#5669) without node supports an empty message (#8631) supports an empty message (#8631) renders both frames (#7147) renders both frames (#7147) does not contain `expanding macro` does not contain `expanding macro` finds free type vars finds free type vars double splat and regular args double splat and regular args allows declaring class with inline macro expression (#1333) allows declaring class with inline macro expression (#1333) can't define new variables (#466) can't define new variables (#466) gives precise location info when doing yield inside macro gives precise location info when doing yield inside macro allows declaring class with macro if allows declaring class with macro if allows union return types for macro def allows union return types for macro def solves named macro expression arguments before macro expansion (constant) (#2423) solves named macro expression arguments before macro expansion (constant) (#2423) types macro def that calls another method types macro def that calls another method evaluates yield expression (#2924) evaluates yield expression (#2924) can use macro in instance var initializer (just assignment) (#7666) can use macro in instance var initializer (just assignment) (#7666) can return class type in macro def can return class type in macro def can override macro (#2773) can override macro (#2773) can lookup type parameter when macro is called inside class (#5343) can lookup type parameter when macro is called inside class (#5343) does macro verbatim outside macro does macro verbatim outside macro types macro def that calls another method inside a class types macro def that calls another method inside a class types macro types macro does macro verbatim inside macro does macro verbatim inside macro finds macro in included module at class level (#4639) finds macro in included module at class level (#4639) allows specifying self as macro def return type allows specifying self as macro def return type finds var in proc for macros finds var in proc for macros works inside proc literal (#2984) works inside proc literal (#2984) errors if requires inside class through macro expansion errors if requires inside class through macro expansion types macro def with argument types macro def with argument errors if applying protected modifier to macro errors if applying protected modifier to macro doesn't die on && inside if (bug) doesn't die on && inside if (bug) declares rescue variable inside for macro declares rescue variable inside for macro matches with default value after splat matches with default value after splat can specify tuple as return type can specify tuple as return type cannot lookup type defined in caller class cannot lookup type defined in caller class can return virtual class type in macro def can return virtual class type in macro def errors if missing one argument errors if missing one argument errors if named arg matches splat parameter errors if named arg matches splat parameter errors if missing two arguments errors if missing two arguments finds method before macro (#236) finds method before macro (#236) shows correct error message in macro expansion (#7083) shows correct error message in macro expansion (#7083) doesn't affect self restrictions outside the macro def being instantiated in subtypes doesn't affect self restrictions outside the macro def being instantiated in subtypes @caller provides access to the `Call` information provides access to the `Call` information returns an array of each call returns an array of each call returns nil if no stack is available returns nil if no stack is available finds generic in macro code using free var finds generic in macro code using free var finds type for global path shared with free var finds type for global path shared with free var checks if macro expansion returns (#821) checks if macro expansion returns (#821) errors if named arg matches single splat parameter errors if named arg matches single splat parameter executes MultiAssign executes MultiAssign preserves correct self in restriction when macro def is to be instantiated in subtypes (#5044) preserves correct self in restriction when macro def is to be instantiated in subtypes (#5044) show macro trace in errors (2) show macro trace in errors (2) allows declaring class with macro for allows declaring class with macro for clones default value before expanding clones default value before expanding executes MultiAssign with ArrayLiteral value executes MultiAssign with ArrayLiteral value allows subclasses of return type for macro def allows subclasses of return type for macro def transforms with {{yield}} and call transforms with {{yield}} and call finds generic type argument of included module with self finds generic type argument of included module with self errors if find macros but missing argument errors if find macros but missing argument finds metaclass instance of instance method (#4739) finds metaclass instance of instance method (#4739) doesn't error when adding macro call to constant (#2457) doesn't error when adding macro call to constant (#2457) solves macro expression arguments before macro expansion (constant) solves macro expression arguments before macro expansion (constant) doesn't crash on syntax error inside macro (regression, #8038) doesn't crash on syntax error inside macro (regression, #8038) uses splat and double splat uses splat and double splat errors if non-existent named arg errors if non-existent named arg skip_file macro directive skips expanding the rest of the current file skips expanding the rest of the current file skips file inside an if macro expression skips file inside an if macro expression finds macro and method at the same scope finds macro and method at the same scope errors if named arg already specified errors if named arg already specified applies visibility modifier only to first level applies visibility modifier only to first level errors if macro def type not found errors if macro def type not found errors when trying to define def inside def with macro expansion errors when trying to define def inside def with macro expansion finds macro in included module finds macro in included module finds macro in module in Object finds macro in module in Object has correct location after expanding assignment after instance var has correct location after expanding assignment after instance var Code gen: ssa codegens a redefined var codegens a redefined var codegens ssa bug (2) codegens ssa bug (2) codegens declaration of var inside then when true codegens declaration of var inside then when true codegens a var that is declared in a block (1) codegens a var that is declared in a block (1) codegens a var that is re-assigned in a block (2) codegens a var that is re-assigned in a block (2) codegens a redefined var inside method with argument codegens a redefined var inside method with argument codegens a redefined var inside method codegens a redefined var inside method codegens declaration of var inside then when false codegens declaration of var inside then when false codegens a var that is declared in a block (2) codegens a var that is declared in a block (2) codegens ssa bug with if/else on var codegens ssa bug with if/else on var codegens ssa bug (1) codegens ssa bug (1) codegens a var that is re-assigned in a block codegens a var that is re-assigned in a block codegens a var that is re-assigned in a block (1) codegens a var that is re-assigned in a block (1) Crystal::TextHierarchyPrinter shows correct size for Proc inside extern struct shows correct size for Proc inside extern struct shows correct total size of generic class if known shows correct total size of generic class if known shows correct size for members with bound types shows correct size for members with bound types works works shows correct size for Bool member shows correct size for Bool member Crystal::Repl can parse and evaluate snippets can parse and evaluate snippets Code gen: pointer can dereference pointer to func can dereference pointer to func codegens nilable pointer type (1) codegens nilable pointer type (1) passes arguments correctly for typedef metaclass (#8544) passes arguments correctly for typedef metaclass (#8544) codegens pointer as if condition codegens pointer as if condition compares pointers through typedef compares pointers through typedef does pointerof class variable with class does pointerof class variable with class codegens nilable pointer type dispatch (2) codegens nilable pointer type dispatch (2) increments pointer increments pointer codegens pointer cast codegens pointer cast set pointer value set pointer value can pass any pointer to something expecting void* in lib call, with to_unsafe can pass any pointer to something expecting void* in lib call, with to_unsafe sets value of pointer to union sets value of pointer to union codegens malloc codegens malloc codegens realloc codegens realloc passes pointer of pointer to method passes pointer of pointer to method gets pointer of argument that is never assigned to gets pointer of argument that is never assigned to gets pointer of instance variable in virtual type gets pointer of instance variable in virtual type assigns nil and pointer to nilable pointer type assigns nil and pointer to nilable pointer type generates correct code for Pointer.malloc(0) (#2905) generates correct code for Pointer.malloc(0) (#2905) get pointer and value of it get pointer and value of it can pass any pointer to something expecting void* in lib call can pass any pointer to something expecting void* in lib call calculates pointer diff calculates pointer diff codegens pointer as if condition inside union (1) codegens pointer as if condition inside union (1) gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant gets pointer to constant changes through var and reads from pointer changes through var and reads from pointer codegens nilable pointer type dispatch (1) codegens nilable pointer type dispatch (1) codegens pointer cast to Nil (#8015) codegens pointer cast to Nil (#8015) codegens nilable pointer type (2) codegens nilable pointer type (2) codegens pointer as if condition inside union (2) codegens pointer as if condition inside union (2) does pointerof class variable does pointerof class variable sets value of pointer to struct sets value of pointer to struct codegens null pointer as if condition codegens null pointer as if condition creates pointer by address creates pointer by address get pointer of instance var get pointer of instance var can assign nil to void pointer can assign nil to void pointer get value of pointer to union get value of pointer to union can use typedef pointer value get and set (#630) can use typedef pointer value get and set (#630) takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var takes pointerof lib external var uses correct llvm module for typedef metaclass (#2877) uses correct llvm module for typedef metaclass (#2877) does pointerof read variable does pointerof read variable Code gen: sizeof instance_alignof gets instance_alignof class gets instance_alignof class gets instance_alignof a generic type with type vars gets instance_alignof a generic type with type vars gets sizeof Bool (#8272) gets sizeof Bool (#8272) alignof gets alignof union gets alignof union alignof mixed union is not less than alignof its variant types alignof mixed union is not less than alignof its variant types gets alignof struct gets alignof struct gets alignof primitive types gets alignof primitive types gets alignof class gets alignof class gets sizeof struct gets sizeof struct can use instance_sizeof in type argument can use instance_sizeof in type argument doesn't precompute sizeof of module (#7741) doesn't precompute sizeof of module (#7741) can use sizeof in type argument (2) can use sizeof in type argument (2) returns correct sizeof for abstract struct (#4319) returns correct sizeof for abstract struct (#4319) doesn't precompute sizeof of abstract struct (#7741) doesn't precompute sizeof of abstract struct (#7741) can use sizeof in type argument (1) can use sizeof in type argument (1) gets sizeof class gets sizeof class can use instance_sizeof of virtual type can use instance_sizeof of virtual type gets instance_sizeof class gets instance_sizeof class gets instance_sizeof a generic type with type vars gets instance_sizeof a generic type with type vars gets sizeof union gets sizeof union gets sizeof Nil (#7644) gets sizeof Nil (#7644) gets sizeof NoReturn gets sizeof NoReturn gets sizeof Void gets sizeof Void gets sizeof int gets sizeof int can use sizeof of virtual type can use sizeof of virtual type implementations find implementation in generic class find implementation in generic class find class defined by macro find class defined by macro find implementors of different classes find implementors of different classes find method calls inside while find method calls inside while can display json output can display json output find implementation in class methods find implementation in class methods find method calls inside if find method calls inside if find implementation inside a module class find implementation inside a module class find struct implementation find struct implementation find method calls inside rescue find method calls inside rescue find implementation inside contained file private class' class method find implementation inside contained file private class' class method find method calls inside trailing if find method calls inside trailing if find implementation inside contained class' class method find implementation inside contained class' class method find enum value implementation find enum value implementation find enum implementation find enum implementation find const implementation find const implementation find class implementation find class implementation find module implementation find module implementation find open class implementation find open class implementation find implementation inside contained file private method find implementation inside contained file private method find implementation from macro expansions find implementation from macro expansions find alias implementation find alias implementation find full trace for macro expansions find full trace for macro expansions can display text output can display text output find class inside method find class inside method find implementors of classes that are only used find implementors of classes that are only used find method calls inside while cond find method calls inside while cond find implementation in generic class methods find implementation in generic class methods find top level method calls find top level method calls Code gen: alias doesn't crash on cast to as recursive alias (#639) doesn't crash on cast to as recursive alias (#639) doesn't break with alias for link attributes doesn't break with alias for link attributes overloads alias against generic (1) (#3261) overloads alias against generic (1) (#3261) casts to recursive alias casts to recursive alias casts to recursive alias casts to recursive alias casts to recursive alias casts to recursive alias casts to recursive alias casts to recursive alias casts to recursive alias casts to recursive alias codegens cast to alias that includes bool codegens cast to alias that includes bool overloads alias against generic (2) (#3261) overloads alias against generic (2) (#3261) lazily solves aliases (#1346) lazily solves aliases (#1346) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) invokes methods on empty array of recursive alias (3) casts to recursive alias casts to recursive alias Crystal::Repl::Interpreter casts casts from nilable type to mixed union type (2) casts from nilable type to mixed union type (2) casts from reference to nilable reference casts from reference to nilable reference puts tuple type inside union of different tuple type (#12243) puts tuple type inside union of different tuple type (#12243) casts to filtered type, not type in as(...) casts to filtered type, not type in as(...) upcasts mixed union with tuple to mixed union with compatible tuple (2) (#12331) upcasts mixed union with tuple to mixed union with compatible tuple (2) (#12331) upcasts between tuple types, respects alignment (#14036) upcasts between tuple types, respects alignment (#14036) does is_a? with virtual type (struct) does is_a? with virtual type (struct) casts nilable from mixed union type to primitive type (non-nil case) casts nilable from mixed union type to primitive type (non-nil case) puts named tuple type inside union of different named tuple type (#12243) puts named tuple type inside union of different named tuple type (#12243) casts from nilable type to mixed union type casts from nilable type to mixed union type does as? with a type that can't match (#12346) does as? with a type that can't match (#12346) upcasts virtual type to union upcasts virtual type to union casts from mixed union type to nilable proc type (#12283) casts from mixed union type to nilable proc type (#12283) upcasts mixed union with tuple to mixed union with compatible tuple (3) (#12331) upcasts mixed union with tuple to mixed union with compatible tuple (3) (#12331) upcasts GenericClassInstanceMetaclassType to VirtualMetaclassType upcasts GenericClassInstanceMetaclassType to VirtualMetaclassType casts nil to Void* casts nil to Void* casts from mixed union type to primitive type casts from mixed union type to primitive type upcasts to module type upcasts to module type upcasts between tuple types upcasts between tuple types casts nilable from mixed union type to primitive type (nil case) casts nilable from mixed union type to primitive type (nil case) does is_a? with virtual metaclass does is_a? with virtual metaclass raises when as fails raises when as fails does as? with no resulting type, not from nil (#12327) does as? with no resulting type, not from nil (#12327) discards cast discards cast casts from mixed union type to another mixed union type for caller casts from mixed union type to another mixed union type for caller upcasts between named tuple types, respects alignment (#14036) upcasts between named tuple types, respects alignment (#14036) does as? with no resulting type (#12327) does as? with no resulting type (#12327) upcasts mixed union with tuple to mixed union with compatible tuple (1) (#12331) upcasts mixed union with tuple to mixed union with compatible tuple (1) (#12331) upcasts in nilable cast (#12532) upcasts in nilable cast (#12532) upcasts between named tuple types, different order upcasts between named tuple types, different order puts virtual metaclass into union (#12162) puts virtual metaclass into union (#12162) upcasts between named tuple types, same order upcasts between named tuple types, same order casts from reference to pointer and back casts from reference to pointer and back Crystal::Repl::Interpreter classes discards allocate discards allocate does allocate, set instance var and get instance var does allocate, set instance var and get instance var does object_id does object_id calls implicit class self method calls implicit class self method calls explicit struct self method calls explicit struct self method does constructor does constructor calls implicit struct self method calls implicit struct self method interprets read instance var interprets read instance var inlines instance var access from virtual type with a single type (#39520) inlines instance var access from virtual type with a single type (#39520) downcasts virtual type to its only type (#12351) downcasts virtual type to its only type (#12351) Crystal::Doc::Macro args_to_s shows simple arg and double splat arg shows simple arg and double splat arg shows block arg shows block arg shows simple arg and splat arg shows simple arg and splat arg shows default value with highlighting shows default value with highlighting shows simple args shows simple args shows splat arg shows splat arg shows double splat arg shows double splat arg shows external name of arg shows external name of arg shows external name of arg with quotes and escaping shows external name of arg with quotes and escaping shows double splat arg shows double splat arg shows simple arg and block arg shows simple arg and block arg Code gen: generic class type recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) declares instance var with virtual T (#1675) declares instance var with virtual T (#1675) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) allows initializing instance variable in inherited generic type allows initializing instance variable in inherited generic type doesn't consider abstract generic instantiation when restricting type (#5190) doesn't consider abstract generic instantiation when restricting type (#5190) codegens static array size after instantiating codegens static array size after instantiating allows initializing instance variable (#665) allows initializing instance variable (#665) runs generic instance var initializers in superclass's metaclass context (2) (#6482) runs generic instance var initializers in superclass's metaclass context (2) (#6482) codegens inherited generic class instance var codegens inherited generic class instance var instantiates generic class with default argument in initialize (#394) instantiates generic class with default argument in initialize (#394) inherited instance var initialize from generic to concrete (#2128) inherited instance var initialize from generic to concrete (#2128) doesn't run generic instance var initializers in formal superclass's context (#4753) doesn't run generic instance var initializers in formal superclass's context (#4753) doesn't crash on generic type restriction with no subtypes (#7583) doesn't crash on generic type restriction with no subtypes (#7583) doesn't use virtual + in type arguments (#2839) doesn't use virtual + in type arguments (#2839) inherited instance var initialize from generic to generic to concrete (#2128) inherited instance var initialize from generic to generic to concrete (#2128) doesn't override guessed instance var in generic type if already declared in superclass (#9431) doesn't override guessed instance var in generic type if already declared in superclass (#9431) codegens virtual generic metaclass macro method call codegens virtual generic metaclass macro method call codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 doesn't crash on generic type restriction with initially no subtypes (#8411) doesn't crash on generic type restriction with initially no subtypes (#8411) invokes super in generic class (#2354) invokes super in generic class (#2354) runs generic instance var initializers in superclass's metaclass context (#4753) runs generic instance var initializers in superclass's metaclass context (#4753) doesn't consider abstract types for including types (#7200) doesn't consider abstract types for including types (#7200) doesn't use virtual + in type arguments for Tuple (#2839) doesn't use virtual + in type arguments for Tuple (#2839) doesn't use virtual + in type arguments for NamedTuple (#2839) doesn't use virtual + in type arguments for NamedTuple (#2839) Semantic: static array errors on negative static array size errors on negative static array size doesn't crash on restriction (#584) doesn't crash on restriction (#584) allows instantiating static array instance var in initialize of generic type allows instantiating static array instance var in initialize of generic type doesn't crash on sizeof (#8858) doesn't crash on sizeof (#8858) types static array new with size being a computed constant types static array new with size being a computed constant types static array new with size being a constant types static array new with size being a constant can match number type argument of static array (#1203) can match number type argument of static array (#1203) errors if trying to instantiate static array with N not an integer errors if trying to instantiate static array with N not an integer types static array with type as size types static array with type as size can match N type argument of static array (#1203) can match N type argument of static array (#1203) types static array with var declaration types static array with var declaration types static array new with size being a computed constant, and use N (bug) types static array new with size being a computed constant, and use N (bug) doesn't match other number type argument of static array (#1203) doesn't match other number type argument of static array (#1203) doesn't crash on instance_sizeof (#8858) doesn't crash on instance_sizeof (#8858) doesn't crash on offsetof (#8858) doesn't crash on offsetof (#8858) types static array new with size being a nested constant inside type declaration (#5426) types static array new with size being a nested constant inside type declaration (#5426) types static array new types static array new Crystal::FFI::CallInterface .variadic validates args size validates args size zero varargs zero varargs basic basic .new all primitive arg types all primitive arg types with args with args sum struct sum struct make struct make struct simple call simple call array array Lexer string array lexes string array with new line gives correct column for next token lexes string array with new line gives correct column for next token lexes string array with new line lexes string array with new line lexes simple string array lexes simple string array using < as delimiter lexes simple string array lexes simple string array using { as delimiter lexes simple string array lexes simple string array using | as delimiter lexes simple string array lexes simple string array using [ as delimiter lexes simple string array lexes simple string array Code gen: block codegens block with nilable type with return (1) codegens block with nilable type with return (1) doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s doesn't crash on untyped array to_s can use self inside a block called from dispatch can use self inside a block called from dispatch nexts in var assignment (#3364) nexts in var assignment (#3364) codegens bug with block and arg and var codegens bug with block and arg and var return from block that always returns from function that conditionally yields return from block that always returns from function that conditionally yields can access instance vars from yielder function can access instance vars from yielder function uses block var with same name as local var uses block var with same name as local var codegens captured block that returns union, but proc only returns a single type codegens captured block that returns union, but proc only returns a single type union value of yielder function union value of yielder function codegens block call when argument type changes codegens block call when argument type changes return from yielder function (2) return from yielder function (2) codegens block with repeated underscore and different types (#4711) codegens block with repeated underscore and different types (#4711) allows modifying yielded value (with literal) allows modifying yielded value (with literal) allows modifying yielded value (with variable) allows modifying yielded value (with variable) break from block returns from yielder break from block returns from yielder codegens block with union arg (1) codegens block with union arg (1) codegens bug with yield not_nil! that is never not nil codegens bug with yield not_nil! that is never not nil returns from block with value returns from block with value returns from block with value returns from block with value returns from block with value returns from block with value returns from block with value returns from block with value returns from block with value returns from block with value doesn't crash on yield exp without a type (#8100) doesn't crash on yield exp without a type (#8100) uses block splat argument with union types uses block splat argument with union types codegens while/break inside block codegens while/break inside block codegens nested return codegens nested return nested yields nested yields codegens captured block with next inside yielded block (#2097) codegens captured block with next inside yielded block (#2097) uses splat in block argument uses splat in block argument uses splat in block argument, many args uses splat in block argument, many args codegens block with multiple underscores (#3054) codegens block with multiple underscores (#3054) codegens nested break codegens nested break codegens if with call with block (ssa issue) codegens if with call with block (ssa issue) block with nilable type block with nilable type breaks from while in function called from block breaks from while in function called from block can call methods from block when yielder is an instance method can call methods from block when yielder is an instance method return from block called from dispatch return from block called from dispatch pass arguments to yielder function pass arguments to yielder function return from block return from block assigns yield to argument assigns yield to argument allows access to local variables allows access to local variables can set instance vars from yielder function can set instance vars from yielder function codegens call with block with call with arg that yields codegens call with block with call with arg that yields doesn't crash if yield exp has no type (#12670) doesn't crash if yield exp has no type (#12670) doesn't codegen after while that always yields and breaks doesn't codegen after while that always yields and breaks codegens block with nilable type with return (2) codegens block with nilable type with return (2) yields more exps than block arg, through splat yields more exps than block arg, through splat doesn't codegen call if arg yields and always breaks doesn't codegen call if arg yields and always breaks allow return from function called from yielder function allow return from function called from yielder function pass self and arguments to yielder function pass self and arguments to yielder function it yields nil from another call it yields nil from another call break without value returns nil break without value returns nil returns from proc literal returns from proc literal allows initialize with yield (#224) allows initialize with yield (#224) yields splat yields splat allows using var as block arg with outer var allows using var as block arg with outer var codegens block with virtual type arg codegens block with virtual type arg passes yield arguments passes yield arguments pass self to yielder function pass self to yielder function (bug) doesn't set needs_value to true on every yield (#12442) (bug) doesn't set needs_value to true on every yield (#12442) call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars call block from dispatch and use local vars allows yield from dispatch call allows yield from dispatch call break from block with value break from block with value break from block with value break from block with value break from block with value break from block with value break from block with value break from block with value break from block with value break from block with value return from block that always returns from function that always yields inside if block return from block that always returns from function that always yields inside if block uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) generate inline generate inline codegens block bug with conditional next and unconditional break (3) codegens block bug with conditional next and unconditional break (3) codegens block bug with conditional next and unconditional break (1) codegens block bug with conditional next and unconditional break (1) break from block with value break from block with value does next from captured block does next from captured block unpacks tuple but doesn't override local variables unpacks tuple but doesn't override local variables yields inside yield (#682) yields inside yield (#682) can break without value from yielder that returns nilable (1) can break without value from yielder that returns nilable (1) codegens block with return and yield and no return codegens block with return and yield and no return dispatches with captured and non-captured block (#3969) dispatches with captured and non-captured block (#3969) executes yield expression if no arg is given for block executes yield expression if no arg is given for block clears nilable var before inlining block method (#10087) clears nilable var before inlining block method (#10087) breaks in var assignment (#3364) breaks in var assignment (#3364) can break without value from yielder that returns nilable (2) can break without value from yielder that returns nilable (2) codegens call with blocks of different type without args codegens call with blocks of different type without args call block from dispatch call block from dispatch can use global constant can use global constant can use instance methods from yielder function can use instance methods from yielder function block with nilable type 2 block with nilable type 2 codegens block bug with conditional next and unconditional break (2) codegens block bug with conditional next and unconditional break (2) codegens block bug with conditional next and unconditional break (4) codegens block bug with conditional next and unconditional break (4) returns void when called with block returns void when called with block codegens block which always breaks but never enters (#494) codegens block which always breaks but never enters (#494) break with value from yielder that returns a nilable break with value from yielder that returns a nilable codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (2) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) auto-unpacks tuple auto-unpacks tuple break block with yielder inside while break block with yielder inside while break block with yielder inside while break block with yielder inside while break block with yielder inside while break block with yielder inside while break block with yielder inside while break block with yielder inside while break block with yielder inside while break block with yielder inside while codegens block with union arg (2) codegens block with union arg (2) codegens method invocation on a object of a captured block with a type that was never instantiated (2) codegens method invocation on a object of a captured block with a type that was never instantiated (2) codegens method invocation on a object of a captured block with a type that was never instantiated codegens method invocation on a object of a captured block with a type that was never instantiated return from yielder function return from yielder function codegens block with union with return codegens block with union with return Semantic: array types array literal size correctly types array literal size correctly types non-empty typed array literal of int types non-empty typed array literal of int types array literal of union types array literal of union types non-empty typed array literal of int types non-empty typed array literal of int types empty typed array literal of int32 types empty typed array literal of int32 types array literal with splats types array literal with splats types array literal of int with splats types array literal of int with splats types array literal with splats (2) types array literal with splats (2) types array literal of int types array literal of int assignment in array literal works (#3195) assignment in array literal works (#3195) Semantic: class allows instantiating generic class with number allows instantiating generic class with number types as no return if calling method on abstract generic class (#6996) types as no return if calling method on abstract generic class (#6996) reports undefined instance method reports undefined instance method errors on no method found on abstract class, class method (#2241) errors on no method found on abstract class, class method (#2241) reports superclass mismatch reports superclass mismatch errors when wrong arguments for new errors when wrong arguments for new doesn't crash on instance variable assigned a proc, and never instantiated (#923) doesn't crash on instance variable assigned a proc, and never instantiated (#923) uses number type var in class method uses number type var in class method can't use implicit initialize if defined in parent can't use implicit initialize if defined in parent types recursive type types recursive type doesn't crash with top-level initialize (#2601) doesn't crash with top-level initialize (#2601) types as no return if calling method on generic class with subclasses (#6996) types as no return if calling method on generic class with subclasses (#6996) doesn't error on new on abstract virtual type class doesn't error on new on abstract virtual type class errors if inherits from module errors if inherits from module errors if reopening non-generic class as generic errors if reopening non-generic class as generic can invoke method on abstract generic type with subclasses but no instances can invoke method on abstract generic type with subclasses but no instances says no overload matches for class new says no overload matches for class new errors if reopening generic class with different type vars errors if reopening generic class with different type vars types as no return if calling method on abstract class with all abstract subclasses (#6996) types as no return if calling method on abstract class with all abstract subclasses (#6996) reports wrong number of arguments for initialize reports wrong number of arguments for initialize types class inside class types class inside class errors if reopening generic class with different type vars (2) errors if reopening generic class with different type vars (2) types class and subclass as one type types class and subclass as one type says wrong number of arguments for abstract class new says wrong number of arguments for abstract class new types type var union types type var union reports unknown class when extending reports unknown class when extending inherits Gen(self) (#2890) inherits Gen(self) (#2890) errors if using underscore in generic class errors if using underscore in generic class finds in global scope if includes module finds in global scope if includes module errors when creating Number errors when creating Number types instance variable types instance variable errors if reopening generic class with different splat index errors if reopening generic class with different splat index allows declaring a variable in an initialize and using it allows declaring a variable in an initialize and using it types class and subclass as one type types class and subclass as one type preserves order of instance vars (#3050) preserves order of instance vars (#3050) errors if declares class inside if errors if declares class inside if types bug #168 (it inherits instance var even if not mentioned in initialize) types bug #168 (it inherits instance var even if not mentioned in initialize) errors if inheriting Gen(self) and there's no self (#2890) errors if inheriting Gen(self) and there's no self (#2890) can use short name for top-level type can use short name for top-level type says wrong number of arguments for abstract class new (2) says wrong number of arguments for abstract class new (2) types instance variable on getter types instance variable on getter reports can't instantiate abstract class on allocate reports can't instantiate abstract class on allocate types class and subclass as one type types class and subclass as one type uses self as type var uses self as type var hoists instance variable initializer hoists instance variable initializer does automatic inference of new for generic types does automatic inference of new for generic types can invoke method on abstract type without subclasses nor instances can invoke method on abstract type without subclasses nor instances doesn't mix classes on definition (#2352) doesn't mix classes on definition (#2352) reports uninitialized constant reports uninitialized constant doesn't lookup new in supermetaclass doesn't lookup new in supermetaclass errors if reopening generic class with different splat index (3) errors if reopening generic class with different splat index (3) can't reopen as struct can't reopen as struct types virtual method of generic class types virtual method of generic class types Const#new#method types Const#new#method types instance variable types instance variable infers generic type after instance was created with explicit type infers generic type after instance was created with explicit type doesn't use initialize from base class doesn't use initialize from base class errors when creating Value errors when creating Value types Const#new types Const#new allows using self in class scope allows using self in class scope types as no return if calling method on abstract class with generic subclasses but no instances (#6996) types as no return if calling method on abstract class with generic subclasses but no instances (#6996) types Const#allocate types Const#allocate errors if reading non-existent ivar errors if reading non-existent ivar reads an object instance var reads an object instance var can mark initialize as private can mark initialize as private errors if creating instance before typing instance variable errors if creating instance before typing instance variable does automatic type inference of new for generic types 2 does automatic type inference of new for generic types 2 correctly types #680 correctly types #680 reports can't instantiate abstract class on new reports can't instantiate abstract class on new errors if using read-instance-var with non-typed variable errors if using read-instance-var with non-typed variable doesn't mark instance variable as nilable if calling another initialize doesn't mark instance variable as nilable if calling another initialize errors if assigning superclass to declared instance var errors if assigning superclass to declared instance var does automatic type inference of new for nested generic type does automatic type inference of new for nested generic type allows defining classes inside modules or classes with :: allows defining classes inside modules or classes with :: errors if inherits from metaclass errors if inherits from metaclass inherits self twice (#5495) inherits self twice (#5495) inherits self (#2890) inherits self (#2890) reads a virtual type instance var reads a virtual type instance var can invoke method on abstract generic type without subclasses nor instances can invoke method on abstract generic type without subclasses nor instances doesn't use initialize from base class with virtual type doesn't use initialize from base class with virtual type can't reopen as module can't reopen as module reports undefined method when method inside a class reports undefined method when method inside a class reads an object instance var from a union type reads an object instance var from a union type errors if reopening generic class with different splat index (2) errors if reopening generic class with different splat index (2) types self inside method call without obj types self inside method call without obj correctly types #680 (2) correctly types #680 (2) uses self as type var uses self as type var types generic of generic type types generic of generic type doesn't lookup type in parents' namespaces, and lookups and in program doesn't lookup type in parents' namespaces, and lookups and in program says that instance vars are not allowed in metaclass says that instance vars are not allowed in metaclass errors if reading ivar from non-ivar container errors if reading ivar from non-ivar container Code gen: automatic cast casts Int32 -> Int64 in arg restriction casts Int32 -> Int64 in arg restriction casts Int32 to Int64 in ivar assignment casts Int32 to Int64 in ivar assignment casts literal integer (Int32 -> Float32) casts literal integer (Int32 -> Float32) casts literal float (Float32 -> Float64) casts literal float (Float32 -> Float64) casts Int32 to Int64 in cvar type declaration casts Int32 to Int64 in cvar type declaration casts Int32 to Int64 in ivar type declaration in generic casts Int32 to Int64 in ivar type declaration in generic does multidispatch with automatic casting (2) (#8217) does multidispatch with automatic casting (2) (#8217) casts literal integer (Int32 -> Float64) casts literal integer (Int32 -> Float64) casts Symbol to Enum in ivar type declaration casts Symbol to Enum in ivar type declaration casts integer variable to larger type (#9565) casts integer variable to larger type (#9565) doesn't autocast number on union (#8655) doesn't autocast number on union (#8655) casts literal integer (Int32 -> Int64) casts literal integer (Int32 -> Int64) casts literal float (Float64 -> Float32) casts literal float (Float64 -> Float32) casts Int32 to Int64 in lvar assignment casts Int32 to Int64 in lvar assignment casts Int32 to Int64 in cvar assignment casts Int32 to Int64 in cvar assignment casts Symbol to Enum in ivar assignment casts Symbol to Enum in ivar assignment casts Int32 to Int64 in ivar type declaration casts Int32 to Int64 in ivar type declaration does multidispatch with automatic casting (3) does multidispatch with automatic casting (3) casts literal integer (Int64 -> Int32, ok) casts literal integer (Int64 -> Int32, ok) casts symbol literal to enum casts symbol literal to enum does multidispatch with automatic casting (1) (#8217) does multidispatch with automatic casting (1) (#8217) Semantic: closure marks method as self closured if used inside a block marks method as self closured if used inside a block is considered as closure if assigned once but comes from a method arg is considered as closure if assigned once but comes from a method arg marks variable as closured in program marks variable as closured in program marks variable as closured in def marks variable as closured in def errors if sending closured proc literal to C errors if sending closured proc literal to C does assign all types to metavar if closured but only assigned to once in a loop through block does assign all types to metavar if closured but only assigned to once in a loop through block doesn't crash for non-existing variable (#3789) doesn't crash for non-existing variable (#3789) lookups return type in correct scope lookups return type in correct scope gives error when doing yield inside proc literal gives error when doing yield inside proc literal errors if sending closured proc pointer to C (1.2) errors if sending closured proc pointer to C (1.2) marks outer fun inside a block as closured marks outer fun inside a block as closured correctly detects previous var as closured (#5609) correctly detects previous var as closured (#5609) unifies types of closured var (2) unifies types of closured var (2) doesn't mark var as closured if only used in two block doesn't mark var as closured if only used in two block transforms block to proc literal with free var transforms block to proc literal with free var marks method as self closured if instance var is read marks method as self closured if instance var is read doesn't closure typeof instance var (#9479) doesn't closure typeof instance var (#9479) errors if forwarding block param doesn't match input type errors if forwarding block param doesn't match input type doesn't assign all types to metavar if closured but declared inside block and re-assigned inside the same context before the closure doesn't assign all types to metavar if closured but declared inside block and re-assigned inside the same context before the closure marks method as self closured if instance var is written marks method as self closured if instance var is written doesn't mark self var as closured, but marks method as self closured doesn't mark self var as closured, but marks method as self closured doesn't closure typeof local var doesn't closure typeof local var marks variable as closured in program on assign marks variable as closured in program on assign allows passing block as proc literal to new and to initialize allows passing block as proc literal to new and to initialize doesn't mark var as closured if only used in block doesn't mark var as closured if only used in block can use fun typedef as block type can use fun typedef as block type allows giving less block args when transforming block to proc literal allows giving less block args when transforming block to proc literal errors if sending closured proc pointer to C (3) errors if sending closured proc pointer to C (3) errors if forwarding block param doesn't match input type size errors if forwarding block param doesn't match input type size doesn't assign all types to metavar if closured but declared inside block and never re-assigned doesn't assign all types to metavar if closured but declared inside block and never re-assigned considers var as closure-readonly if it was assigned multiple times before it was closured considers var as closure-readonly if it was assigned multiple times before it was closured marks method as self closured if implicit self call is made marks method as self closured if implicit self call is made marks outer fun as closured when using self marks outer fun as closured when using self says can't send closure to C with captured block says can't send closure to C with captured block gives error when doing yield inside proc literal gives error when doing yield inside proc literal marks method as self closured if explicit self call is made marks method as self closured if explicit self call is made errors when transforming block to proc literal if type mismatch errors when transforming block to proc literal if type mismatch correctly captures type of closured block arg correctly captures type of closured block arg transforms block to proc literal transforms block to proc literal says can't send closure to C with new notation says can't send closure to C with new notation errors if giving more block args when transforming block to proc literal errors if giving more block args when transforming block to proc literal transforms block to proc literal without parameters transforms block to proc literal without parameters errors if sending closured proc pointer to C (1) errors if sending closured proc pointer to C (1) unifies types of closured var (1) unifies types of closured var (1) doesn't assign all types to metavar if closured but only assigned to once doesn't assign all types to metavar if closured but only assigned to once transforms block to proc literal with void type transforms block to proc literal with void type errors if sending closured proc pointer to C (2) errors if sending closured proc pointer to C (2) marks variable as closured in block marks variable as closured in block does assign all types to metavar if closured but only assigned to once in a loop through captured block does assign all types to metavar if closured but only assigned to once in a loop through captured block does assign all types to metavar if closured but only assigned to once in a loop does assign all types to metavar if closured but only assigned to once in a loop marks variable as closured inside block in fun marks variable as closured inside block in fun passes #227 passes #227 file_exists? with absolute path returns true if file exists returns true if file exists returns false if file doesn't exist returns false if file doesn't exist with relative path reads file (exists) reads file (exists) reads file (doesn't exist) reads file (doesn't exist) Semantic: ssa types if with return in both branches types if with return in both branches types a var inside an if without change in then types a var inside an if without change in then types a var inside an if without definition in then types a var inside an if without definition in then doesn't change type to nilable inside if doesn't change type to nilable inside if types a var that is declared in a while condition with break before re-assignment types a var that is declared in a while condition with break before re-assignment types a var that is declared in a while condition types a var that is declared in a while condition types a var with an if with nested if types a var with an if with nested if types a var that is re-assigned in a while in next and used in condition types a var that is re-assigned in a while in next and used in condition types block with break doesn't infect initial vars types block with break doesn't infect initial vars types a var inside an if without definition in else types a var inside an if without definition in else types a var that is declared in a while with out types a var that is declared in a while with out types if with unreachable in then types if with unreachable in then types if with break in then types if with break in then doesn't error if same variable is used in multiple arguments of same typeof doesn't error if same variable is used in multiple arguments of same typeof types a var after begin ensure as having last type (2) types a var after begin ensure as having last type (2) types a var with an if but without change types a var with an if but without change preserves type filters after block (bug) preserves type filters after block (bug) types a var inside an if with previous definition types a var inside an if with previous definition types if with restricted type in else types if with restricted type in else types if with return in else with assign types if with return in else with assign types a var that is declared in a while condition with break after re-assignment types a var that is declared in a while condition with break after re-assignment types while with break types while with break types a var that is re-assigned in a while condition types a var that is re-assigned in a while condition types block with next types block with next types re-assign inside while (bug) types re-assign inside while (bug) types if with restricted type in then types if with restricted type in then types a var that is declared in a while types a var that is declared in a while types a redefined variable types a redefined variable types a var after begin ensure as having last type types a var after begin ensure as having last type types a var inside an if without previous definition types a var inside an if without previous definition errors if accessing variable declared inside typeof errors if accessing variable declared inside typeof types while with break doesn't infect initial vars types while with break doesn't infect initial vars doesn't error if same variable is declared in multiple typeofs doesn't error if same variable is declared in multiple typeofs types a var that is re-assigned in a while types a var that is re-assigned in a while types re-assign inside if (bug) types re-assign inside if (bug) types while with next types while with next types if with return in then with assign types if with return in then with assign types a var that is re-assigned in a block types a var that is re-assigned in a block types while with break with new var types while with break with new var types if with return in else types if with return in else types if with return in then types if with return in then types block with break types block with break types if/else with var (bug) types if/else with var (bug) types if with next in then types if with next in then types a var inside an if without change in else types a var inside an if without change in else types a var that is re-assigned in a while and used in condition types a var that is re-assigned in a while and used in condition Crystal::Repl::Interpreter bugs doesn't override local variable value with block var with the same name doesn't override local variable value with block var with the same name doesn't pass self to top-level method (FileNode) doesn't pass self to top-level method (FileNode) does multidispatch on virtual struct does multidispatch on virtual struct does multidispatch on virtual struct union nil does multidispatch on virtual struct union nil breaks from current block, not from outer block breaks from current block, not from outer block correctly puts virtual metaclass type in union correctly puts virtual metaclass type in union doesn't pass self to top-level method doesn't pass self to top-level method doesn't incorrectly consider a non-closure as closure doesn't incorrectly consider a non-closure as closure does leading zeros does leading zeros Codegen: special vars preserves special vars in macro expansion with call with default arguments (#824) preserves special vars in macro expansion with call with default arguments (#824) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) allows with primitive allows with primitive codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens after block 2 codegens after block 2 codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $~ codegens $~ codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block codegens $~ two levels codegens $~ two levels codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens with default argument codegens with default argument works lazily works lazily works lazily works lazily works lazily works lazily works lazily works lazily works lazily works lazily codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens $? codegens $? codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block preserves special vars if initialized inside block (#2194) preserves special vars if initialized inside block (#2194) allows with struct allows with struct semantic: case checks exhaustiveness of single type checks exhaustiveness of single type checks exhaustiveness for tuple literal of 2 elements, first is bool checks exhaustiveness for tuple literal of 2 elements, first is bool checks exhaustiveness of single type (generic) checks exhaustiveness of single type (generic) checks exhaustiveness for tuple literal with bool and underscore at first position, partial match checks exhaustiveness for tuple literal with bool and underscore at first position, partial match checks exhaustiveness of single type (Foo(T).class) checks exhaustiveness of single type (Foo(T).class) checks exhaustiveness for tuple literal of 3 elements, all bool checks exhaustiveness for tuple literal of 3 elements, all bool checks exhaustiveness of union type with virtual type checks exhaustiveness of union type with virtual type checks exhaustiveness of enum combined with another type checks exhaustiveness of enum combined with another type errors if casing against a constant errors if casing against a constant doesn't check exhaustiveness when using 'when' doesn't check exhaustiveness when using 'when' checks exhaustiveness for tuple literal with bool and underscore at second position, partial match checks exhaustiveness for tuple literal with bool and underscore at second position, partial match can't prove case is exhaustive for @[Flags] enum can't prove case is exhaustive for @[Flags] enum checks exhaustiveness of enum via question method checks exhaustiveness of enum via question method checks exhaustiveness, covers in base type covers (generic type) checks exhaustiveness, covers in base type covers (generic type) can't prove case is exhaustive for @[Flags] enum, tuple case can't prove case is exhaustive for @[Flags] enum, tuple case checks exhaustiveness for tuple literal with bool and underscore at first position checks exhaustiveness for tuple literal with bool and underscore at first position checks exhaustiveness for tuple literal with types and underscore at second position checks exhaustiveness for tuple literal with types and underscore at second position checks exhaustiveness of bool type (missing false) checks exhaustiveness of bool type (missing false) checks exhaustiveness of enum through method (all cases covered) checks exhaustiveness of enum through method (all cases covered) checks exhaustiveness, covers in base type covers checks exhaustiveness, covers in base type covers checks exhaustiveness of bool type (missing true) checks exhaustiveness of bool type (missing true) checks exhaustiveness of enum (all cases covered) checks exhaustiveness of enum (all cases covered) checks exhaustiveness of bool type with other types checks exhaustiveness of bool type with other types checks exhaustiveness of nil type with nil literal checks exhaustiveness of nil type with nil literal checks exhaustiveness of single type (T.class) checks exhaustiveness of single type (T.class) checks exhaustiveness of nilable type with nil literal checks exhaustiveness of nilable type with nil literal checks exhaustiveness of union with bool checks exhaustiveness of union with bool checks exhaustiveness for tuple literal with bool and underscore at second position checks exhaustiveness for tuple literal with bool and underscore at second position can prove case is exhaustive for @[Flags] enum when matching type can prove case is exhaustive for @[Flags] enum when matching type checks exhaustiveness for tuple literal, and passes checks exhaustiveness for tuple literal, and passes checks exhaustiveness of enum via const checks exhaustiveness of enum via const checks exhaustiveness for tuple literal of 3 elements, and warns checks exhaustiveness for tuple literal of 3 elements, and warns checks exhaustiveness for tuple literal, with call checks exhaustiveness for tuple literal, with call checks exhaustiveness for tuple literal of 2 elements, and warns checks exhaustiveness for tuple literal of 2 elements, and warns checks exhaustiveness for tuple literal with types and underscore at first position checks exhaustiveness for tuple literal with types and underscore at first position checks exhaustiveness for tuple literal of 2 elements, first is enum checks exhaustiveness for tuple literal of 2 elements, first is enum checks exhaustiveness for tuple literal with bool and underscore at second position, with partial match checks exhaustiveness for tuple literal with bool and underscore at second position, with partial match checks exhaustiveness for tuple literal with bool and underscore at first position checks exhaustiveness for tuple literal with bool and underscore at first position checks exhaustiveness for tuple literal with bool and underscore at first position, with partial match checks exhaustiveness for tuple literal with bool and underscore at first position, with partial match checks exhaustiveness for tuple literal with bool and underscore at second position checks exhaustiveness for tuple literal with bool and underscore at second position covers all types covers all types checks exhaustiveness for tuple literal of 3 elements, all enums checks exhaustiveness for tuple literal of 3 elements, all enums Crystal::Repl::Interpreter sizeof interprets sizeof typeof interprets sizeof typeof alignof interprets alignof typeof interprets alignof typeof instance_alignof interprets instance_alignof typeof interprets instance_alignof typeof instance_sizeof interprets instance_sizeof typeof interprets instance_sizeof typeof Crystal::Loader .read_ld_conf basic basic with include with include .parse parses directory paths parses directory paths parses static parses static parses file paths parses file paths prepends directory paths before default search paths prepends directory paths before default search paths parses library names parses library names .default_search_paths DYLD_LIBRARY_PATH DYLD_LIBRARY_PATH LD_LIBRARY_PATH LD_LIBRARY_PATH dynlib #load_file? finds function symbol finds function symbol #load_library? lookup in order lookup in order full path full path library name library name does not implicitly find dependencies does not implicitly find dependencies does not find global symbols does not find global symbols validate that lib handles are properly closed validate that lib handles are properly closed Semantic: concrete_types VirtualMetaclassType with abstract base VirtualMetaclassType with abstract base VirtualType with abstract base VirtualType with abstract base VirtualMetaclassType with concrete base VirtualMetaclassType with concrete base UnionType of structs UnionType of structs ModuleType ModuleType VirtualType with concrete base VirtualType with concrete base GenericModuleInstanceType GenericModuleInstanceType Semantic: enum marks as flags with base type (#2185) marks as flags with base type (#2185) can use macro expression inside enum can use macro expression inside enum errors if using instance var inside enum (#991) errors if using instance var inside enum (#991) errors if reopen and tries to define constant errors if reopen and tries to define constant errors if invoking private enum method errors if invoking private enum method disallows redefining None to non-0 for @[Flags] enum disallows redefining None to non-0 for @[Flags] enum reopens enum with same base type (1) reopens enum with same base type (1) gives error on unsigned flags enum overflow after a member with value gives error on unsigned flags enum overflow after a member with value doesn't error when defining a non-flags enum with None or All doesn't error when defining a non-flags enum with None or All errors if declaring type inside enum, nested (#3127) errors if declaring type inside enum, nested (#3127) doesn't break assigned values in enum flags when a member has value 0 (#5767) doesn't break assigned values in enum flags when a member has value 0 (#5767) gives error on flags enum overflow gives error on flags enum overflow gives error on signed flags enum overflow after a member with value gives error on signed flags enum overflow after a member with value gives error on enum overflow after a member with value gives error on enum overflow after a member with value can use macro for inside enum can use macro for inside enum reopens enum without base type (2) reopens enum without base type (2) attaches annotation to enum method (#6690) attaches annotation to enum method (#6690) doesn't overflow on flags member (#7877) doesn't overflow on flags member (#7877) doesn't error when defining a method for an enum with flags doesn't error when defining a method for an enum with flags disallows All value for @[Flags] enum disallows All value for @[Flags] enum errors if enum value is too big for type (#678) errors if enum value is too big for type (#678) types enum types enum types enum value types enum value errors on enum without members (#3447) errors on enum without members (#3447) errors if declaring type inside enum (#3127) errors if declaring type inside enum (#3127) finds class method in enum type finds class method in enum type allows class vars in enum allows class vars in enum creates enum from value creates enum from value defines method on enum defines method on enum doesn't overflow when going from negative to zero (#7874) doesn't overflow when going from negative to zero (#7874) gives error on enum overflow gives error on enum overflow disallows implicit conversion of int to enum disallows implicit conversion of int to enum errors if reopening enum with different base type (1) errors if reopening enum with different base type (1) errors if defining initialize in Enum (#7238) errors if defining initialize in Enum (#7238) has All value when defined as @[Flags] has All value when defined as @[Flags] errors if reopen but not enum errors if reopen but not enum doesn't error when defining a flags enum in a lib with None or All doesn't error when defining a flags enum in a lib with None or All allows redefining None to 0 for @[Flags] enum allows redefining None to 0 for @[Flags] enum errors if inheriting Enum (#3592) errors if inheriting Enum (#3592) defines class method on enum defines class method on enum doesn't visit enum members generated by macros twice (#10104) doesn't visit enum members generated by macros twice (#10104) finds method in enum type finds method in enum type reopens enum with same base type (2) reopens enum with same base type (2) reopens an enum reopens an enum errors if using a name twice errors if using a name twice reopens enum without base type (1) reopens enum without base type (1) has None value when defined as @[Flags] has None value when defined as @[Flags] can redefine Enum.new can redefine Enum.new errors if reopening enum with different base type (2) errors if reopening enum with different base type (2) Code gen: tuple codegens tuple metaclass [1..0] codegens tuple metaclass [1..0] codegens union of tuple of float with tuple of tuple of float codegens union of tuple of float with tuple of tuple of float downcasts union to mixed tuple type downcasts union to mixed tuple type codegens tuple metaclass [0..0] codegens tuple metaclass [0..0] codegens tuple [0..1] codegens tuple [0..1] codegens tuple [0] codegens tuple [0] assigns tuple inside union to union with compatible tuple assigns tuple inside union to union with compatible tuple codegens tuple [1] (2) codegens tuple [1] (2) codegens tuple [2]? codegens tuple [2]? codegens tuple [1..1] codegens tuple [1..1] codegens tuple [0..0]? codegens tuple [0..0]? downcasts union inside tuple to value (#3907) downcasts union inside tuple to value (#3907) codegens tuple [2..2]? codegens tuple [2..2]? codegens tuple metaclass [2]? codegens tuple metaclass [2]? codegens splats inside tuples codegens splats inside tuples assigns tuple union to compatible tuple assigns tuple union to compatible tuple codegens tuple metaclass [0..1] codegens tuple metaclass [0..1] codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) assigns two same-size tuple types to a same var (#3132) assigns two same-size tuple types to a same var (#3132) merges two tuple types of same size (2) merges two tuple types of same size (2) codegens tuple [1..0] codegens tuple [1..0] codegens tuple metaclass [0] codegens tuple metaclass [0] codegens tuple [0..1]? codegens tuple [0..1]? downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types codegens tuple [2..2] codegens tuple [2..2] upcasts tuple inside compatible tuple upcasts tuple inside compatible tuple passed tuple to def passed tuple to def codegens tuple [1..0]? codegens tuple [1..0]? accesses T and creates instance from it accesses T and creates instance from it codegens tuple metaclass [3..2]? codegens tuple metaclass [3..2]? codegens tuple [0..2] codegens tuple [0..2] codegens tuple [1]? codegens tuple [1]? codegens tuple [1..1]? codegens tuple [1..1]? codegens tuple [3..2]? codegens tuple [3..2]? upcasts tuple inside union to union with compatible tuple upcasts tuple inside union to union with compatible tuple codegens tuple [1] codegens tuple [1] codegens tuple class codegens tuple class allows tuple covariance allows tuple covariance provides T as a tuple literal provides T as a tuple literal upcasts tuple union to compatible tuple upcasts tuple union to compatible tuple codegens tuple [-3..2]? codegens tuple [-3..2]? gets size at compile time gets size at compile time merges two tuple types of same size (1) merges two tuple types of same size (1) codegens tuple metaclass [1] codegens tuple metaclass [1] allows malloc pointer of tuple allows malloc pointer of tuple codegens tuple [0]? codegens tuple [0]? assigns tuple to compatible tuple assigns tuple to compatible tuple codegens tuple [0..0] codegens tuple [0..0] passes empty tuple and empty named tuple to a method (#2852) passes empty tuple and empty named tuple to a method (#2852) codegens tuple [0..2]? codegens tuple [0..2]? Code gen: def with default value codegens def with one default value codegens def with one default value resolves expanded call to current type, not to virtual type resolves expanded call to current type, not to virtual type doesn't mix types of instance vars with initialize and new doesn't mix types of instance vars with initialize and new codegens def new with one default value codegens def new with one default value considers first the one with a restriction considers first the one with a restriction considers first the one with more arguments considers first the one with more arguments Codegen: double splat double splats named argument into arguments (2) double splats named argument into arguments (2) matches double splat on method with named args matches double splat on method with named args matches double splat with regular splat matches double splat with regular splat removes literal types in all matches (#6239) removes literal types in all matches (#6239) matches double splat on method with named args and regular args matches double splat on method with named args and regular args double splats named argument into arguments (1) double splats named argument into arguments (1) double splats named argument with positional arguments double splats named argument with positional arguments double splats named argument with named args (1) double splats named argument with named args (1) evaluates double splat argument just once (#2677) evaluates double splat argument just once (#2677) double splats named argument with named args (2) double splats named argument with named args (2) double splats twice double splats twice Code gen: C ABI x86_64 passes struct bigger than128 bits with byval passes struct bigger than128 bits with byval passes struct less than 64 bits as { i64 } in varargs passes struct less than 64 bits as { i64 } in varargs passes struct less than 64 bits as { i64 } passes struct less than 64 bits as { i64 } passes struct between 64 and 128 bits as { i64, i64 } (with multiple modules/contexts) passes struct between 64 and 128 bits as { i64, i64 } (with multiple modules/contexts) passes struct between 64 and 128 bits as { i64, i64 } passes struct between 64 and 128 bits as { i64, i64 } returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct less than 64 bits as { i64 } returns struct less than 64 bits as { i64 } returns struct between 64 and 128 bits as { i64, i64 } returns struct between 64 and 128 bits as { i64, i64 } Code gen: class never considers read instance var as closure (#12181) never considers read instance var as closure (#12181) builds generic class bug builds generic class bug codegens assignment of generic metaclasses, base is non-generic (2) (#10394) codegens assignment of generic metaclasses, base is non-generic (2) (#10394) runs instance variable initializer at the class level runs instance variable initializer at the class level reads a union type instance var (mixed union, second type) reads a union type instance var (mixed union, second type) assigns type to reference union type assigns type to reference union type codegens virtual call that calls another method codegens virtual call that calls another method runs instance variable initializer at the class level, for generic type runs instance variable initializer at the class level, for generic type allows initializing var with constant allows initializing var with constant doesn't crash if not using undefined instance variable in superclass doesn't crash if not using undefined instance variable in superclass reads other instance var reads other instance var codegens assignment of generic metaclasses, base is non-generic (1) (#10394) codegens assignment of generic metaclasses, base is non-generic (1) (#10394) doesn't crash on instance variable assigned a proc, and never instantiated (#923) doesn't crash on instance variable assigned a proc, and never instantiated (#923) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) invokes class method inside instance method (#1119) invokes class method inside instance method (#1119) makes .class always be a virtual type even if no subclasses makes .class always be a virtual type even if no subclasses codegens recursive type codegens recursive type doesn't crash on #1216 (reduced) doesn't crash on #1216 (reduced) changes instance variable in method (ssa bug) changes instance variable in method (ssa bug) codegens method call of instance var codegens method call of instance var transfers initializer from generic module to non-generic class transfers initializer from generic module to non-generic class codegens virtual metaclass union bug (#2597) codegens virtual metaclass union bug (#2597) codegens new which calls initialize codegens new which calls initialize works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) codegens virtual class method codegens virtual class method runs with nil instance var when inheriting runs with nil instance var when inheriting reads a union type instance var (reference union, first type) reads a union type instance var (reference union, first type) reads a union type instance var (reference union, second type) reads a union type instance var (reference union, second type) allows using self in class scope allows using self in class scope doesn't crash on #1216 with pointerof doesn't crash on #1216 with pointerof doesn't crash on abstract class never instantiated (#2840) doesn't crash on abstract class never instantiated (#2840) notifies superclass recursively on inheritance (#576) notifies superclass recursively on inheritance (#576) codegens singleton (#718) codegens singleton (#718) doesn't crash on #1216 doesn't crash on #1216 codegens initialize with instance var codegens initialize with instance var calls class method without self calls class method without self calls class method without self (2) calls class method without self (2) codegens class with recursive tuple to class (#4520) codegens class with recursive tuple to class (#4520) doesn't skip false initializers (#3272) doesn't skip false initializers (#3272) codegens class method codegens class method reads a union type instance var (mixed union, first type) reads a union type instance var (mixed union, first type) codegens method of class union including Int (#1476) codegens method of class union including Int (#1476) codegens virtual generic class instance metaclass (#3819) codegens virtual generic class instance metaclass (#3819) codegens bug #168 codegens bug #168 can assign virtual metaclass to virtual metaclass (#3007) can assign virtual metaclass to virtual metaclass (#3007) doesn't skip zero initializers (#3272) doesn't skip zero initializers (#3272) codegens virtual method of generic class codegens virtual method of generic class codegens assignment of generic metaclasses (4) (#10394) codegens assignment of generic metaclasses (4) (#10394) codegens call to same instance codegens call to same instance resolves type declaration when accessing instance var (#348) resolves type declaration when accessing instance var (#348) codegens method from another method without obj and accesses instance vars codegens method from another method without obj and accesses instance vars runs with nilable instance var runs with nilable instance var gets class of virtual type gets class of virtual type does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) reads a virtual type instance var reads a virtual type instance var transfers initializer from generic module to generic class transfers initializer from generic module to generic class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class codegens assignment of generic metaclasses (1) (#10394) codegens assignment of generic metaclasses (1) (#10394) codegens instance var codegens instance var allows fixing an instance variable's type allows fixing an instance variable's type allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) uses number type var uses number type var codegens assignment of generic metaclasses (3) (#10394) codegens assignment of generic metaclasses (3) (#10394) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) codegens assignment of generic metaclasses (2) (#10394) codegens assignment of generic metaclasses (2) (#10394) calls method on Class class calls method on Class class transfers initializer from module to generic class transfers initializer from module to generic class Crystal::Config .host_target .host_target .linux_runtime_libc .linux_runtime_libc Code gen: no return codegens no return variable declaration (#1508) codegens no return variable declaration (#1508) codegens if with no return and variable used afterwards codegens if with no return and variable used afterwards codegens no return instance variable declaration (#1508) codegens no return instance variable declaration (#1508) codegen types exception handler as NoReturn if ensure is NoReturn codegen types exception handler as NoReturn if ensure is NoReturn codegens Pointer(NoReturn).malloc codegens Pointer(NoReturn).malloc codegens if with NoReturn on then and union on else codegens if with NoReturn on then and union on else codegens untyped typeof (#5105) codegens untyped typeof (#5105) codegens call with no return because of falsey if (#3661) codegens call with no return because of falsey if (#3661) Crystal normalize_path assert assert assert assert assert assert assert assert Code gen: debug codegens extern union (#7335) codegens extern union (#7335) doesn't emit debug info for unused variable declarations (#9882) doesn't emit debug info for unused variable declarations (#9882) codegens correct debug info for untyped expression (#4007 and #4008) codegens correct debug info for untyped expression (#4007 and #4008) has debug info in closure inside if (#5593) has debug info in closure inside if (#5593) stores and restores debug location after jumping to main (2) stores and restores debug location after jumping to main (2) doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on constant read calls (#11416) doesn't fail on constant read calls (#11416) stores and restores debug location after jumping to main (#6920) stores and restores debug location after jumping to main (#6920) codegens abstract struct (#3578) codegens abstract struct (#3578) stores and restores debug location after jumping to main (3) stores and restores debug location after jumping to main (3) codegens lib union (#7335) codegens lib union (#7335) doesn't emit incorrect debug info for closured self doesn't emit incorrect debug info for closured self codegens correct debug info for new with custom allocate (#3945) codegens correct debug info for new with custom allocate (#3945) inlines instance var access through getter in debug mode inlines instance var access through getter in debug mode correctly restores debug location after fun change (#4254) correctly restores debug location after fun change (#4254) has correct debug location after constant initialization in call with block (#4719) has correct debug location after constant initialization in call with block (#4719) Code gen: C ABI returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) returns struct between 64 and 128 bits (for real) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) accepts large struct in a callback (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (i16 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) Crystal::Repl::Interpreter special vars does special var that's a reference when there are optional arguments does special var that's a reference when there are optional arguments does special var that's a struct does special var that's a struct sets special var inside call inside block (#12250) sets special var inside call inside block (#12250) does special var that's a reference for multidispatch does special var that's a reference for multidispatch does special var that's a reference inside block does special var that's a reference inside block does special var that's a reference does special var that's a reference Crystal::Doc::Generator crystal repo inserts pseudo methods inserts pseudo methods generates sitemap generates sitemap #collect_constants returns empty array when constants are private returns empty array when constants are private #formatted_summary should generate the first sentence should generate the first sentence should generate the first line should generate the first line with a Experimental annotation, and docs should generate both the docs and Experimental tag should generate both the docs and Experimental tag with a Deprecated annotation, and no docs should generate just the Deprecated tag should generate just the Deprecated tag with a Deprecated annotation, and docs should generate both the docs and Deprecated tag should generate both the docs and Deprecated tag with a Experimental annotation, and no docs should generate just the Experimental tag should generate just the Experimental tag should exclude whitespace before the summary line should exclude whitespace before the summary line with no annotation, and no docs should generate nothing should generate nothing #formatted_doc with a Deprecated annotation, and docs should generate both the docs and Deprecated tag should generate both the docs and Deprecated tag with a Experimental annotation, and docs should generate both the docs and Experimental tag should generate both the docs and Experimental tag with a Deprecated annotation, and no docs should generate just the Deprecated tag should generate just the Deprecated tag should generate the full document should generate the full document with a Experimental annotation, and no docs should generate just the Experimental tag should generate just the Experimental tag with no annotation, and no docs should generate nothing should generate nothing should generate the full document should generate the full document #must_include_toplevel? returns true if program has constant returns true if program has constant returns false if program has nothing returns false if program has nothing returns false if program has constant which is defined in other place returns false if program has constant which is defined in other place returns false if program has macro which is defined in other place returns false if program has macro which is defined in other place returns false if program has method which is defined in other place returns false if program has method which is defined in other place returns true if program has macro returns true if program has macro returns true if program has method returns true if program has method Code gen: hooks does included macro does included macro does extended macro does extended macro does inherited macro does inherited macro fixes empty types in hooks (#3946) fixes empty types in hooks (#3946) does inherited macro recursively does inherited macro recursively does finished does finished does added method macro does added method macro does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body does inherited macro before class body Semantic: union treats void as nil in union treats void as nil in union commutativity uninstantiated generic super-metaclass v.s. uninstantiated generic sub-metaclass uninstantiated generic super-metaclass v.s. uninstantiated generic sub-metaclass superclass v.s. uninstantiated generic subclass superclass v.s. uninstantiated generic subclass generic module instance v.s. including module generic module instance v.s. including module module v.s. extending generic module instance metaclass module v.s. extending generic module instance metaclass module v.s. including generic module instance module v.s. including generic module instance generic module instance v.s. extending generic module instance metaclass generic module instance v.s. extending generic module instance metaclass generic module instance v.s. including generic module instance generic module instance v.s. including generic module instance virtual metaclass v.s. generic subclass instance metaclass virtual metaclass v.s. generic subclass instance metaclass module v.s. including module module v.s. including module doesn't run virtual lookup on unbound unions (#9173) doesn't run virtual lookup on unbound unions (#9173) errors if instantiates union errors if instantiates union can reopen Union and access T can reopen Union and access T supports macro if inside union supports macro if inside union types union when arg is union types union when arg is union doesn't virtualize union elements (#7814) doesn't virtualize union elements (#7814) can reopen Union can reopen Union types union when obj is union types union when obj is union types union of same type types union of same type finds method in Object finds method in Object can iterate T can iterate T types union types union assigns to union and keeps new union type in call assigns to union and keeps new union type in call doesn't crash with union of no-types (#5805) doesn't crash with union of no-types (#5805) types union of classes types union of classes looks up type in union type with free var looks up type in union type with free var merges types in the same hierarchy with Union merges types in the same hierarchy with Union can use Union in type restriction (#2988) can use Union in type restriction (#2988) types union when both obj and arg are union types union when both obj and arg are union finds method in Value finds method in Value Crystal::Doc::Method args_to_s shows typeof restriction of arg with highlighting shows typeof restriction of arg with highlighting shows block args shows block args shows block args with underscore shows block args with underscore shows return type restriction shows return type restriction shows double splat args shows double splat args shows block args if a def has `yield` shows block args if a def has `yield` shows external name of arg with quotes and escaping shows external name of arg with quotes and escaping shows splat args shows splat args shows default value of arg with highlighting shows default value of arg with highlighting shows simple args shows simple args shows external name of arg shows external name of arg shows underscore restriction shows underscore restriction shows args and return type restriction shows args and return type restriction doc inherits doc from previous def (no extra comment) inherits doc from previous def (no extra comment) trailing comment is not a doc comment trailing comment is not a doc comment inherits doc from ancestor (no extra comment) inherits doc from ancestor (no extra comment) trailing comment is not part of a doc comment trailing comment is not part of a doc comment gets doc from underlying method gets doc from underlying method inherits doc from ancestor (use :inherit: plus more content) inherits doc from ancestor (use :inherit: plus more content) inherits doc from ancestor (use :inherit:) inherits doc from ancestor (use :inherit:) Semantic: restrictions augmenter augments Char | Int32 | String augments Char | Int32 | String augments Char | Int32 | String augments Char | Int32 | String doesn't augment if the no_restrictions_augmenter flag is present doesn't augment if the no_restrictions_augmenter flag is present augments String augments String augments Symbol augments Symbol augments Char augments Char doesn't augment if assigned inside if doesn't augment if assigned inside if augments generic uninstantiated type augments generic uninstantiated type augments StaticArray(Int32, 8) augments StaticArray(Int32, 8) augments relative public type augments relative public type augments for class var augments for class var augments Tuple(Int32, Char) augments Tuple(Int32, Char) augments relative private type augments relative private type doesn't augment if assigned inside block doesn't augment if assigned inside block augments NoReturn augments NoReturn augments Array(Int32).class augments Array(Int32).class augments typedef augments typedef doesn't augment if assigned inside while doesn't augment if assigned inside while augments Float32 augments Float32 augments Int32 augments Int32 augments Proc(Int32, Char) augments Proc(Int32, Char) augments recursive alias type (#12134) augments recursive alias type (#12134) augments Bool augments Bool augments type splat augments type splat augments Pointer(Void) augments Pointer(Void) augments Enumerable(Int32).class augments Enumerable(Int32).class augments NamedTuple(a: Int32, b: Char) augments NamedTuple(a: Int32, b: Char) augments for Union(*T) (#12435) augments for Union(*T) (#12435) augments Nil augments Nil augments virtual type augments virtual type augments Proc(Int32, Nil) augments Proc(Int32, Nil) augments relative private type in same namespace augments relative private type in same namespace augments Int32.class augments Int32.class augments Array(String) augments Array(String) doesn't crash on macro that yields and defines class (#12142) doesn't crash on macro that yields and defines class (#12142) augments virtual metaclass type augments virtual metaclass type Codegen: class var doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) accesses class var from proc literal accesses class var from proc literal codegens class var as nil codegens class var as nil codegens class var codegens class var codegens class var with nilable reference type codegens class var with nilable reference type doesn't use nilable type for initializer doesn't use nilable type for initializer doesn't inherit class var value in module doesn't inherit class var value in module codegens class var with begin and vars codegens class var with begin and vars initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var gets pointerof class var gets pointerof class var reads class var from virtual type reads class var from virtual type initializes class var of union with single type initializes class var of union with single type codegens class var as nil if assigned for the first time inside method codegens class var as nil if assigned for the first time inside method declares and initializes declares and initializes gets pointerof class var complex constant gets pointerof class var complex constant inline initialization of simple class var inline initialization of simple class var codegens second class var initializer codegens second class var initializer runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) reads class var before initializing it (hoisting) reads class var before initializing it (hoisting) doesn't inherit class var value in subclass doesn't inherit class var value in subclass codegens class var inside module codegens class var inside module initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer codegens class var with type declaration begin and vars codegens class var with type declaration begin and vars reads class var from virtual type metaclass reads class var from virtual type metaclass codegens class var inside instance method codegens class var inside instance method codegens generic class with class var codegens generic class with class var reads simple class var before another complex one reads simple class var before another complex one declares var as uninitialized and initializes it unsafely declares var as uninitialized and initializes it unsafely uses var in class var initializer uses var in class var initializer writes class var from virtual type writes class var from virtual type initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal immutability of returned container literals (#10818) Annotation#args Annotation#args When#conds When#conds Generic#type_vars Generic#type_vars MultiAssign#targets MultiAssign#targets ProcPointer#args ProcPointer#args StringInterpolation#expressions StringInterpolation#expressions Union#types Union#types MultiAssign#values MultiAssign#values ProcNotation#inputs ProcNotation#inputs Crystal::Repl::Interpreter calls inlines method that just reads an instance var (2) inlines method that just reads an instance var (2) puts struct pointer after tuple indexer puts struct pointer after tuple indexer mutates through pointer (1) mutates through pointer (1) mutates through pointer (3) mutates through pointer (3) does call on instance var that's a struct, from a struct does call on instance var that's a struct, from a struct mutates call argument mutates call argument calls a top-level method without arguments and no local vars calls a top-level method without arguments and no local vars does call with struct as obj (2) does call with struct as obj (2) does Assign var with wants_struct_pointer does Assign var with wants_struct_pointer discards call with struct as obj discards call with struct as obj does call on ivar that's a struct, takes a pointer to instance var, inside if does call on ivar that's a struct, takes a pointer to instance var, inside if does call on read instance var that's a struct, takes a pointer to instance var does call on read instance var that's a struct, takes a pointer to instance var mutates through inlined instance var with receiver mutates through inlined instance var with receiver inlines call that returns self inlines call that returns self interprets self for primitive types interprets self for primitive types interprets explicit self call for primitive types interprets explicit self call for primitive types mutates through read instance var mutates through read instance var does call on constant that's a struct, takes a pointer to instance var, inside if does call on constant that's a struct, takes a pointer to instance var, inside if inlines method that just reads an instance var, but produces side effects of args inlines method that just reads an instance var, but produces side effects of args inlines method that just reads an instance var inlines method that just reads an instance var calls a top-level method without arguments but with local vars calls a top-level method without arguments but with local vars mutates through inlined instance var without receiver mutates through inlined instance var without receiver does Assign instance var with wants_struct_pointer does Assign instance var with wants_struct_pointer does call on constant that's a struct, takes a pointer to instance var does call on constant that's a struct, takes a pointer to instance var interprets call with default values interprets call with default values does call on var that's a struct, takes a pointer to instance var, inside if does call on var that's a struct, takes a pointer to instance var, inside if does call with struct as obj does call with struct as obj does Assign class var with wants_struct_pointer does Assign class var with wants_struct_pointer interprets implicit self call for pointer interprets implicit self call for pointer interprets call with if interprets call with if interprets call with named arguments interprets call with named arguments calls a top-level method with two arguments calls a top-level method with two arguments does call on self that's a struct, takes a pointer to instance var, inside if does call on self that's a struct, takes a pointer to instance var, inside if does call on Pointer#value that's a struct, takes a pointer to instance var does call on Pointer#value that's a struct, takes a pointer to instance var does call on instance var that's a struct, from a class does call on instance var that's a struct, from a class mutates through pointer (2) mutates through pointer (2) does ReadInstanceVar with wants_struct_pointer does ReadInstanceVar with wants_struct_pointer inlines call that returns self (2) inlines call that returns self (2) Code gen: struct builds struct setter with fun type (1) builds struct setter with fun type (1) builds struct setter with fun type (2) builds struct setter with fun type (2) automatically converts numeric union type in struct field assignment automatically converts numeric union type in struct field assignment codegens struct property setter via pointer codegens struct property setter via pointer codegens struct set inside struct codegens struct set inside struct can access instance var from the outside (#1092) can access instance var from the outside (#1092) sets instance var to proc sets instance var to proc sets instance var to proc sets instance var to proc sets instance var to proc sets instance var to proc sets instance var to proc sets instance var to proc sets instance var to proc sets instance var to proc passes struct to method (2) passes struct to method (2) codegens struct property default value codegens struct property default value codegens passing pointerof(struct) to fun codegens passing pointerof(struct) to fun automatically converts numeric type in struct field assignment automatically converts numeric type in struct field assignment passes struct to method (1) passes struct to method (1) yields struct via -> yields struct via -> codegens struct get inside struct codegens struct get inside struct does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s automatically converts nil to pointer automatically converts nil to pointer codegens union inside struct codegens union inside struct codegens set struct value with constant codegens set struct value with constant codegens struct property setter via pointer codegens struct property setter via pointer codegens assign struct to union codegens assign struct to union codegens pointer malloc of struct codegens pointer malloc of struct automatically converts by invoking to_unsafe automatically converts by invoking to_unsafe codegens struct property setter codegens struct property setter allows using named arguments for new allows using named arguments for new codegens struct access with -> and then . codegens struct access with -> and then . can access member of uninitialized struct behind type (#8774) can access member of uninitialized struct behind type (#8774) Code gen: op assign evaluates exps once (#3398) evaluates exps once (#3398) evaluates exps once, [] (#3398) evaluates exps once, [] (#3398) Semantic: offsetof errors on offsetof element of uninstantiated generic type errors on offsetof element of uninstantiated generic type gives error if using offsetof on non-Tuples with an index gives error if using offsetof on non-Tuples with an index errors on typeof inside offsetof expression errors on typeof inside offsetof expression errors on undefined instance variable errors on undefined instance variable types offsetof types offsetof gives error if using offsetof on something that can't have instance variables gives error if using offsetof on something that can't have instance variables can be used with generic types can be used with generic types can be used with classes can be used with classes gives error if using offsetof on Tuples with instance variables gives error if using offsetof on Tuples with instance variables gives error if using offsetof on something that's neither a class, a struct nor a Tuple gives error if using offsetof on something that's neither a class, a struct nor a Tuple gives error if using offsetof on Tuples with indexes greater than tuple size gives error if using offsetof on Tuples with indexes greater than tuple size gives error if using offsetof on Tuples with negative indexes gives error if using offsetof on Tuples with negative indexes Semantic: annotation #annotations all types finds annotations on a module finds annotations on a module finds annotations on a lib finds annotations on a lib finds annotations on a struct finds annotations on a struct finds annotations on a enum finds annotations on a enum finds annotations in generic parent (#7885) finds annotations in generic parent (#7885) adds annotations on def adds annotations on def finds annotations in instance var (declaration, generic) finds annotations in instance var (declaration, generic) find annotations on method parameters find annotations on method parameters returns an empty array if there are none defined returns an empty array if there are none defined finds annotations on a class finds annotations on a class finds annotations in instance var (declaration) finds annotations in instance var (declaration) of a specific type returns an empty array if there are none defined returns an empty array if there are none defined finds annotations in instance var (declaration) finds annotations in instance var (declaration) overrides annotations value in type overrides annotations value in type finds annotations on a module finds annotations on a module finds annotations in lib finds annotations in lib can't find annotations on def, when other annotations are present can't find annotations on def, when other annotations are present finds annotations in instance var (declaration, generic) finds annotations in instance var (declaration, generic) collects annotations values in type collects annotations values in type finds annotations in generic parent (#7885) finds annotations in generic parent (#7885) adds annotations on def adds annotations on def finds annotations in enum finds annotations in enum uses annotations value, positional uses annotations value, positional uses annotations value, keyword uses annotations value, keyword finds annotations in class finds annotations in class finds annotations in struct finds annotations in struct can't find annotations in instance var can't find annotations in instance var can't find annotations on def can't find annotations on def can't find annotations in instance var, when other annotations are present can't find annotations in instance var, when other annotations are present find annotations on method parameters find annotations on method parameters errors when annotate instance variable in subclass errors when annotate instance variable in subclass arguments #args returns an empty TupleLiteral if there are none defined returns an empty TupleLiteral if there are none defined returns a TupleLiteral if there are positional arguments defined returns a TupleLiteral if there are positional arguments defined #named_args returns a NamedTupleLiteral if there are named arguments defined returns a NamedTupleLiteral if there are named arguments defined returns an empty NamedTupleLiteral if there are none defined returns an empty NamedTupleLiteral if there are none defined returns a correctly with named and positional args returns a correctly with named and positional args declares annotation declares annotation errors if wanting to add type inside annotation (2) (#8614) errors if wanting to add type inside annotation (2) (#8614) doesn't bleed annotation from class into class variable (#8314) doesn't bleed annotation from class into class variable (#8314) #annotation finds annotation on method arg finds annotation on method arg finds annotation in enum finds annotation in enum finds annotation on method double splat arg finds annotation on method double splat arg finds annotation in class finds annotation in class finds annotation in generic parent (#7885) finds annotation in generic parent (#7885) can't find annotation in instance var, when other annotations are present can't find annotation in instance var, when other annotations are present finds annotation in module finds annotation in module can't find annotation on def, when other annotations are present can't find annotation on def, when other annotations are present can't find annotation in module can't find annotation in module finds annotation in lib finds annotation in lib errors if using annotation other than ThreadLocal for class vars errors if using annotation other than ThreadLocal for class vars doesn't carry link annotation from lib to fun doesn't carry link annotation from lib to fun finds annotation in instance var (assignment) finds annotation in instance var (assignment) finds annotation in instance var (declaration, generic) finds annotation in instance var (declaration, generic) adds annotation on def adds annotation on def errors if annotation doesn't exist errors if annotation doesn't exist errors if using invalid annotation on fun errors if using invalid annotation on fun uses annotation value, positional uses annotation value, positional finds annotation on an restricted method block arg finds annotation on an restricted method block arg finds annotation in instance var (declaration) finds annotation in instance var (declaration) finds annotation in struct finds annotation in struct uses annotation value, keyword uses annotation value, keyword overrides annotation value in type overrides annotation value in type overrides annotation in instance var overrides annotation in instance var can't find annotation in module, when other annotations are present can't find annotation in module, when other annotations are present can't find annotation on def can't find annotation on def errors if annotation doesn't point to an annotation type errors if annotation doesn't point to an annotation type finds annotation on method splat arg finds annotation on method splat arg can't find annotation in instance var can't find annotation in instance var errors if wanting to add type inside annotation (1) (#8614) errors if wanting to add type inside annotation (1) (#8614) Semantic: exception types var as nilable if previously nilable (1) types var as nilable if previously nilable (1) gets a non-nilable type if all rescue are unreachable (#8751) gets a non-nilable type if all rescue are unreachable (#8751) correctly types #1988 correctly types #1988 marks method calling method that raises as raises marks method calling method that raises as raises says syntax error on "begin; else; 1; end" says syntax error on "begin; else; 1; end" doesn't crash on break inside rescue, in while (#2441) doesn't crash on break inside rescue, in while (#2441) can't use break inside block inside ensure (#4470) can't use break inside block inside ensure (#4470) type union with empty main block type union with empty main block types a var after begin rescue as having all possible types and nil in begin if read (2) types a var after begin rescue as having all possible types and nil in begin if read (2) doesn't infect type to variable before handler (#4002) doesn't infect type to variable before handler (#4002) marks method that calls another method that raises as raises, recursively marks method that calls another method that raises as raises, recursively doesn't type instance variable as nilable if assigned inside an exception handler after being assigned doesn't type instance variable as nilable if assigned inside an exception handler after being assigned transform nodes in else block transform nodes in else block can't use break inside while inside ensure (#4470) can't use break inside while inside ensure (#4470) errors if caught exception is not a subclass of Exception without var errors if caught exception is not a subclass of Exception without var says syntax error on "begin; rescue ex; rescue ex : Foo; end; ex" says syntax error on "begin; rescue ex; rescue ex : Foo; end; ex" assigns var inside ensure (2) (#3919) assigns var inside ensure (2) (#3919) types var as nilable if previously nilable (2) types var as nilable if previously nilable (2) types exception var with no types types exception var with no types errors if caught exception is not a subclass of Exception errors if caught exception is not a subclass of Exception marks fun as raises marks fun as raises can't return from ensure (#4470) can't return from ensure (#4470) shadows local variable (1) shadows local variable (1) types a var after begin rescue as having all possible types in begin and rescue types a var after begin rescue as having all possible types in begin and rescue types var as not nil if defined inside begin and defined inside rescue types var as not nil if defined inside begin and defined inside rescue types a var after begin rescue as having all possible types in begin and rescue (2) types a var after begin rescue as having all possible types in begin and rescue (2) types code with abstract exception that delegates method types code with abstract exception that delegates method correctly types variables inside conditional inside exception handler with no-return rescue (#8012) correctly types variables inside conditional inside exception handler with no-return rescue (#8012) doesn't consider vars as nilable inside else (#610) doesn't consider vars as nilable inside else (#610) detects reading nil-if-read variable after exception handler (#4723) detects reading nil-if-read variable after exception handler (#4723) can use break inside while inside ensure (#4470) can use break inside while inside ensure (#4470) can't return from while inside ensure (#4470) can't return from while inside ensure (#4470) marks proc literal as raises marks proc literal as raises says syntax error on "begin; rescue ex; rescue; end; ex" says syntax error on "begin; rescue ex; rescue; end; ex" marks def as raises marks def as raises marks method calling lib fun that raises as raises marks method calling lib fun that raises as raises can use break inside block inside ensure (#4470) can use break inside block inside ensure (#4470) can't return from block inside ensure (#4470) can't return from block inside ensure (#4470) types var as nilable inside ensure (1) types var as nilable inside ensure (1) can use next inside block inside ensure (#4470) can use next inside block inside ensure (#4470) assigns var inside ensure (1) (#3919) assigns var inside ensure (1) (#3919) types var as nilable inside ensure (2) types var as nilable inside ensure (2) types instance variable as nilable if assigned inside an exception handler (#1845) types instance variable as nilable if assigned inside an exception handler (#1845) types a var after begin rescue with no-return in rescue types a var after begin rescue with no-return in rescue can use next inside while inside ensure (#4470) can use next inside while inside ensure (#4470) type for exception handler for explicit types type for exception handler for explicit types type is union of main and rescue blocks type is union of main and rescue blocks types a var after rescue as being nilable types a var after rescue as being nilable remains nilable after rescue remains nilable after rescue types exception with type types exception with type type union with empty rescue block type union with empty rescue block marks instance variable as nilable if assigned inside rescue inside initialize marks instance variable as nilable if assigned inside rescue inside initialize correctly types variable assigned inside nested exception handler (#9769) correctly types variable assigned inside nested exception handler (#9769) can't use next inside block inside ensure (#4470) can't use next inside block inside ensure (#4470) types var assignment inside block inside exception handler (#3324) types var assignment inside block inside exception handler (#3324) can't use next inside while inside ensure (#4470) can't use next inside while inside ensure (#4470) Code gen: regex literal spec works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) works in a class variable (#10951) Crystal::Repl::Interpreter overflow conversion overlows on -1_i16.to_u16 overlows on -1_i16.to_u16 overlows on -1_i64.to_u32 overlows on -1_i64.to_u32 overlows on -1.to_u64 overlows on -1.to_u64 overlows on -1_i8.to_u16 overlows on -1_i8.to_u16 overlows on 2147483648_u64.to_i32 overlows on 2147483648_u64.to_i32 overlows on -1_i16.to_u64 overlows on -1_i16.to_u64 overlows on 128_f64.to_i8 overlows on 128_f64.to_i8 overlows on 128_u32.to_i8 overlows on 128_u32.to_i8 overlows on 128_u8.to_i8 overlows on 128_u8.to_i8 overlows on 256_f64.to_u8 overlows on 256_f64.to_u8 overlows on -1_i64.to_u64 overlows on -1_i64.to_u64 overlows on 4294967296_f64.to_u32 overlows on 4294967296_f64.to_u32 overlows on 32768_f32.to_i16 overlows on 32768_f32.to_i16 overlows on 32768_f64.to_i16 overlows on 32768_f64.to_i16 overlows on 65536_f64.to_u16 overlows on 65536_f64.to_u16 overlows on -1_i8.to_u32 overlows on -1_i8.to_u32 overlows on 256_f32.to_u8 overlows on 256_f32.to_u8 overlows on -1_i64.to_u8 overlows on -1_i64.to_u8 overlows on -1_i64.to_u16 overlows on -1_i64.to_u16 overlows on -1.to_u16 overlows on -1.to_u16 overlows on 65536_f32.to_u16 overlows on 65536_f32.to_u16 overlows on 128_u64.to_i8 overlows on 128_u64.to_i8 overlows on 32768_u16.to_i16 overlows on 32768_u16.to_i16 overlows on -1.to_u8 overlows on -1.to_u8 overlows on 9223372036854775808_u64.to_i64 overlows on 9223372036854775808_u64.to_i64 overlows on 2147483648_f64.to_i32 overlows on 2147483648_f64.to_i32 overlows on -1_i16.to_u32 overlows on -1_i16.to_u32 overlows on -1.to_u32 overlows on -1.to_u32 overlows on -1_i16.to_u8 overlows on -1_i16.to_u8 overlows on 128_f32.to_i8 overlows on 128_f32.to_i8 overlows on 2147483648_u32.to_i32 overlows on 2147483648_u32.to_i32 overlows on 1.7976931348623157e+308.to_f32 overlows on 1.7976931348623157e+308.to_f32 overlows on -1_i8.to_u64 overlows on -1_i8.to_u64 overlows on 32768_u64.to_i16 overlows on 32768_u64.to_i16 overlows on -1_i8.to_u8 overlows on -1_i8.to_u8 overlows on 128_u16.to_i8 overlows on 128_u16.to_i8 overlows on 32768_u32.to_i16 overlows on 32768_u32.to_i16 + overlows on 1_i16 + 32767 overlows on 1_i16 + 32767 overlows on 1_i8 + 128 overlows on 1_i8 + 128 overlows on 1_i64 + 9223372036854775807_i64 overlows on 1_i64 + 9223372036854775807_i64 overlows on 1_u32 + 4294967295_i64 overlows on 1_u32 + 4294967295_i64 overlows on 1_u64 + 18446744073709551615_u64 overlows on 1_u64 + 18446744073709551615_u64 overlows on 1_u16 + 65535 overlows on 1_u16 + 65535 overlows on 1 + 2147483647 overlows on 1 + 2147483647 overlows on 1_u8 + 255 overlows on 1_u8 + 255 - overlows on 1_u64 - 2 overlows on 1_u64 - 2 overlows on 1_i8 - 256 overlows on 1_i8 - 256 overlows on 1_u8 - 2 overlows on 1_u8 - 2 overlows on 1_i16 - 32770 overlows on 1_i16 - 32770 overlows on 1_i64 - 9223372036854775810_u64 overlows on 1_i64 - 9223372036854775810_u64 overlows on 1_u32 - 2 overlows on 1_u32 - 2 overlows on 1 - 2147483650_i64 overlows on 1 - 2147483650_i64 overlows on 1_u16 - 2 overlows on 1_u16 - 2 * overlows on 20_u64 * 1844674407370955161_i64 overlows on 20_u64 * 1844674407370955161_i64 overlows on 10_u16 * 6600 overlows on 10_u16 * 6600 overlows on 10_i16 * 3300 overlows on 10_i16 * 3300 overlows on 20_u32 * 429496729 overlows on 20_u32 * 429496729 overlows on 10_u8 * 26 overlows on 10_u8 * 26 overlows on 10_i8 * 14 overlows on 10_i8 * 14 overlows on 20_i64 * 922337203685477580_i64 overlows on 20_i64 * 922337203685477580_i64 overlows on 20 * 214748364 overlows on 20 * 214748364 literals interprets a String literal interprets a String literal interprets an Int64 interprets an Int64 interprets a Float64 interprets a Float64 interprets an Int32 interprets an Int32 interprets an UInt128 interprets an UInt128 uses a string pool uses a string pool interprets an UInt64 interprets an UInt64 precomputes string literal length precomputes string literal length interprets an Int8 interprets an Int8 interprets an UInt16 interprets an UInt16 interprets nil interprets nil interprets a Float32 interprets a Float32 interprets an Int16 interprets an Int16 interprets a bool (true) interprets a bool (true) interprets a char interprets a char interprets an UInt8 interprets an UInt8 interprets an UInt32 interprets an UInt32 interprets a bool (false) interprets a bool (false) interprets an Int128 interprets an Int128 local variables doesn't declare variable with no type doesn't declare variable with no type interprets variable set and get interprets variable set and get doesn't discard underscore right hand side doesn't discard underscore right hand side interprets variable set interprets variable set interprets local variable declaration (#12229) interprets local variable declaration (#12229) assigns to underscore assigns to underscore interprets variable set and get with operations interprets variable set and get with operations doesn't declare variable with no type inside method doesn't declare variable with no type inside method interprets uninitialized interprets uninitialized interprets at the class level interprets at the class level interprets variable set and get, second local var interprets variable set and get, second local var interprets variable set with type restriction (#13023) interprets variable set with type restriction (#13023) math interprets UInt64 & Int32 interprets UInt64 & Int32 interprets Int32 &- Int32 interprets Int32 &- Int32 interprets Int32 + Int32 interprets Int32 + Int32 interprets Float32 + Float64 interprets Float32 + Float64 interprets Int32 &+ Int32 interprets Int32 &+ Int32 interprets Float64 + Float64 interprets Float64 + Float64 interprets Int32 + Float64 interprets Int32 + Float64 interprets Int128 + Int32 interprets Int128 + Int32 interprets Int32 * Int32 interprets Int32 * Int32 interprets Float64 - Float64 interprets Float64 - Float64 interprets UInt64 | UInt32 interprets UInt64 | UInt32 discards math discards math interprets Int8 + Int8 interprets Int8 + Int8 interprets UInt8 | Int32 interprets UInt8 | Int32 interprets Int32 - Int32 interprets Int32 - Int32 interprets UInt64 * Int32 interprets UInt64 * Int32 interprets UInt32 - Int32 interprets UInt32 - Int32 interprets Float64 + Int32 interprets Float64 + Int32 interprets Float64 * Float64 interprets Float64 * Float64 interprets Int32.unsafe_shl(Int32) with self interprets Int32.unsafe_shl(Int32) with self interprets Int64 + Int64 interprets Int64 + Int64 interprets Int32 &* Int32 interprets Int32 &* Int32 comparisons interprets Int32 < Float64 interprets Int32 < Float64 interprets UInt64 == Int32 (true when Int32 >= 0) interprets UInt64 == Int32 (true when Int32 >= 0) interprets UInt64 == Int32 (false when Int32 < 0) interprets UInt64 == Int32 (false when Int32 < 0) interprets Bool != Bool (true) interprets Bool != Bool (true) interprets Float64 < Float64 interprets Float64 < Float64 interprets Int32 == Float64 (false) interprets Int32 == Float64 (false) interprets UInt64.unsafe_mod(UInt64) interprets UInt64.unsafe_mod(UInt64) interprets Char == Char (true) interprets Char == Char (true) interprets UInt64 != Int32 (false) interprets UInt64 != Int32 (false) interprets UInt32 < Int32 (false) interprets UInt32 < Int32 (false) interprets Int32 != Int32 (true) interprets Int32 != Int32 (true) interprets Float32 / Float32 interprets Float32 / Float32 interprets UInt64 > UInt32 (true) interprets UInt64 > UInt32 (true) interprets Int32 < Int32 interprets Int32 < Int32 interprets UInt64 < Int32 (true, right is greater than zero) interprets UInt64 < Int32 (true, right is greater than zero) interprets UInt8 < Int32 (false, right is less than zero) interprets UInt8 < Int32 (false, right is less than zero) interprets Int32 != UInt64 (true) interprets Int32 != UInt64 (true) interprets UInt8 < Int32 (false, right is greater than zero) interprets UInt8 < Int32 (false, right is greater than zero) interprets Bool == Bool (true) interprets Bool == Bool (true) interprets Int32 == Int32 (true) interprets Int32 == Int32 (true) interprets UInt64 < Int32 (false, right is less than zero) interprets UInt64 < Int32 (false, right is less than zero) interprets Char == Char (false) interprets Char == Char (false) interprets UInt64 == Int32 (false when Int32 >= 0) interprets UInt64 == Int32 (false when Int32 >= 0) interprets Int32 != UInt64 (false) interprets Int32 != UInt64 (false) interprets UInt64 > UInt32 (false) interprets UInt64 > UInt32 (false) interprets Int32 == Int32 (false) interprets Int32 == Int32 (false) interprets Int32 > Float64 (true) interprets Int32 > Float64 (true) interprets Float64 fdiv Float32 interprets Float64 fdiv Float32 interprets Int32 == Float64 (true) interprets Int32 == Float64 (true) interprets Float64 / Float64 interprets Float64 / Float64 interprets Int32 > Float64 (false) interprets Int32 > Float64 (false) interprets Float64 < Int32 interprets Float64 < Int32 interprets UInt64 < Int32 (false, right is greater than zero) interprets UInt64 < Int32 (false, right is greater than zero) interprets UInt64 != Int32 (true) interprets UInt64 != Int32 (true) interprets Int32 == UInt64 (false) interprets Int32 == UInt64 (false) interprets Bool != Bool (false) interprets Bool != Bool (false) interprets Bool == Bool (false) interprets Bool == Bool (false) interprets Int32 == UInt64 (true) interprets Int32 == UInt64 (true) interprets Int32 != Int32 (false) interprets Int32 != Int32 (false) interprets UInt32 < Int32 (true) interprets UInt32 < Int32 (true) interprets Int128 == Int128 (false) interprets Int128 == Int128 (false) interprets Float32 / Int32 interprets Float32 / Int32 interprets Float32 fdiv Float64 interprets Float32 fdiv Float64 discards comparison discards comparison interprets Int128 == Int128 (true) interprets Int128 == Int128 (true) interprets UInt8 < Int32 (true, right is greater than zero) interprets UInt8 < Int32 (true, right is greater than zero) logical operations interprets not for bool false interprets not for bool false interprets not for generic class instance metaclass interprets not for generic class instance metaclass interprets not for generic module metaclass interprets not for generic module metaclass interprets not for mixed union (false) interprets not for mixed union (false) interprets not for mixed union (nil) interprets not for mixed union (nil) discards bool not discards bool not interprets not for nilable type (true) interprets not for nilable type (true) interprets not for nilable type (false) interprets not for nilable type (false) interprets not for nilable proc type (true) interprets not for nilable proc type (true) interprets not for nil type interprets not for nil type interprets not for bool true interprets not for bool true interprets not for nil interprets not for nil interprets not for generic class instance type interprets not for generic class instance type interprets not for nilable type (false) interprets not for nilable type (false) interprets not for mixed union (other) interprets not for mixed union (other) interprets not for nilable proc type (false) interprets not for nilable proc type (false) interprets not for bool false interprets not for bool false interprets not for mixed union (true) interprets not for mixed union (true) does math convert on union does math convert on union interprets not for generic module interprets not for generic module discards nil not discards nil not does math primitive on union does math primitive on union interprets not for module (#12918) interprets not for module (#12918) interprets not for nilable type (true) interprets not for nilable type (true) conversion interprets Int8::MAX#to_i8! interprets Int8::MAX#to_i8! interprets Int64::MIN#to_i64! interprets Int64::MIN#to_i64! interprets Int32::MIN#to_f32! interprets Int32::MIN#to_f32! interprets UInt64::MAX#to_u8! interprets UInt64::MAX#to_u8! interprets Int16::MIN#to_f64! interprets Int16::MIN#to_f64! interprets Float64#to_i64! (negative) interprets Float64#to_i64! (negative) interprets UInt8::MAX#to_i! interprets UInt8::MAX#to_i! interprets UInt8::MAX#to_i16! interprets UInt8::MAX#to_i16! interprets Int16::MAX#to_u64! interprets Int16::MAX#to_u64! interprets Int16::MAX#to_i! interprets Int16::MAX#to_i! interprets Float64#to_u! (positive) interprets Float64#to_u! (positive) interprets Int32::MAX#to_u64! interprets Int32::MAX#to_u64! interprets Int64::MIN#to_u16! interprets Int64::MIN#to_u16! interprets UInt16::MAX#to_f32! interprets UInt16::MAX#to_f32! interprets Int16::MAX#to_u8! interprets Int16::MAX#to_u8! interprets UInt64::MAX#to_i64! interprets UInt64::MAX#to_i64! interprets UInt16::MAX#to_i! interprets UInt16::MAX#to_i! interprets Float32#to_i32! (negative) interprets Float32#to_i32! (negative) interprets Int64::MIN#to_u32! interprets Int64::MIN#to_u32! interprets Float32#to_f64! (positive) interprets Float32#to_f64! (positive) interprets Float32#to_i16! (negative) interprets Float32#to_i16! (negative) interprets UInt64::MAX#to_i32! interprets UInt64::MAX#to_i32! interprets UInt32::MAX#to_f32! interprets UInt32::MAX#to_f32! interprets UInt16::MAX#to_i64! interprets UInt16::MAX#to_i64! interprets Float32#to_u8! (positive) interprets Float32#to_u8! (positive) interprets Int32::MIN#to_f64! interprets Int32::MIN#to_f64! interprets Float64#to_u64! (positive) interprets Float64#to_u64! (positive) interprets Int64::MAX#to_u16! interprets Int64::MAX#to_u16! interprets Int64::MIN#to_i8! interprets Int64::MIN#to_i8! interprets Int8::MIN#to_f32! interprets Int8::MIN#to_f32! interprets Float32#to_f32! (negative) interprets Float32#to_f32! (negative) discards conversion with local var discards conversion with local var interprets Float64#to_u32! (positive) interprets Float64#to_u32! (positive) interprets Int64::MIN#to_u64! interprets Int64::MIN#to_u64! interprets Int64::MIN#to_i16! interprets Int64::MIN#to_i16! interprets Int16::MIN#to_i! interprets Int16::MIN#to_i! interprets UInt8::MAX#to_u! interprets UInt8::MAX#to_u! interprets Float32#to_u! (positive) interprets Float32#to_u! (positive) interprets UInt16::MAX#to_u32! interprets UInt16::MAX#to_u32! interprets UInt32::MAX#to_f64! interprets UInt32::MAX#to_f64! interprets Int32::MAX#to_i16! interprets Int32::MAX#to_i16! interprets Int64::MAX#to_u! interprets Int64::MAX#to_u! interprets UInt32::MAX#to_u8! interprets UInt32::MAX#to_u8! interprets Float64#to_i8! (negative) interprets Float64#to_i8! (negative) interprets UInt16::MAX#to_i16! interprets UInt16::MAX#to_i16! interprets Float64#to_f32! (negative) interprets Float64#to_f32! (negative) interprets Int8::MIN#to_u64! interprets Int8::MIN#to_u64! interprets UInt32::MAX#to_i8! interprets UInt32::MAX#to_i8! interprets UInt32::MAX#to_i64! interprets UInt32::MAX#to_i64! interprets Int16::MAX#to_i8! interprets Int16::MAX#to_i8! interprets UInt16::MAX#to_u! interprets UInt16::MAX#to_u! interprets Int64::MAX#to_f64! interprets Int64::MAX#to_f64! interprets Float64#to_u8! (positive) interprets Float64#to_u8! (positive) interprets Int32::MAX#to_u32! interprets Int32::MAX#to_u32! interprets Int16::MIN#to_u! interprets Int16::MIN#to_u! interprets UInt8::MAX#to_u32! interprets UInt8::MAX#to_u32! interprets Float64#to_i32! (negative) interprets Float64#to_i32! (negative) interprets Float32#to_u32! (positive) interprets Float32#to_u32! (positive) interprets Float64#to_i16! (negative) interprets Float64#to_i16! (negative) interprets Float64#to_f32! (positive) interprets Float64#to_f32! (positive) interprets Int32::MAX#to_u! interprets Int32::MAX#to_u! interprets Int8::MAX#to_u16! interprets Int8::MAX#to_u16! interprets Int16::MIN#to_i8! interprets Int16::MIN#to_i8! interprets Int64::MAX#to_u8! interprets Int64::MAX#to_u8! interprets Int16::MIN#to_u16! interprets Int16::MIN#to_u16! UInt8#unsafe_chr UInt8#unsafe_chr interprets UInt16::MAX#to_u16! interprets UInt16::MAX#to_u16! interprets Int64::MIN#to_u! interprets Int64::MIN#to_u! interprets Int64::MAX#to_i! interprets Int64::MAX#to_i! discards conversion discards conversion interprets UInt8::MAX#to_f64! interprets UInt8::MAX#to_f64! interprets Int16::MAX#to_f32! interprets Int16::MAX#to_f32! interprets Float32#to_u16! (positive) interprets Float32#to_u16! (positive) interprets Int16::MIN#to_u32! interprets Int16::MIN#to_u32! interprets Float64#to_i! (positive) interprets Float64#to_i! (positive) interprets UInt8::MAX#to_u8! interprets UInt8::MAX#to_u8! interprets UInt16::MAX#to_i8! interprets UInt16::MAX#to_i8! interprets Int8::MAX#to_f64! interprets Int8::MAX#to_f64! interprets Int16::MAX#to_u! interprets Int16::MAX#to_u! interprets Int8::MAX#to_i64! interprets Int8::MAX#to_i64! interprets Int16::MIN#to_i64! interprets Int16::MIN#to_i64! Int32#unsafe_chr Int32#unsafe_chr interprets Int32::MIN#to_u64! interprets Int32::MIN#to_u64! interprets Int16::MAX#to_u32! interprets Int16::MAX#to_u32! interprets UInt16::MAX#to_f64! interprets UInt16::MAX#to_f64! interprets Float32#to_i64! (negative) interprets Float32#to_i64! (negative) interprets Int8::MIN#to_i16! interprets Int8::MIN#to_i16! interprets Int32::MAX#to_u8! interprets Int32::MAX#to_u8! interprets UInt8::MAX#to_f32! interprets UInt8::MAX#to_f32! interprets UInt8::MAX#to_u64! interprets UInt8::MAX#to_u64! interprets Int8::MAX#to_i32! interprets Int8::MAX#to_i32! interprets Float32#to_f32! (positive) interprets Float32#to_f32! (positive) interprets Int32::MIN#to_i! interprets Int32::MIN#to_i! interprets Float64#to_i! (negative) interprets Float64#to_i! (negative) interprets Int32::MIN#to_i16! interprets Int32::MIN#to_i16! interprets Int16::MIN#to_u64! interprets Int16::MIN#to_u64! interprets Int32::MIN#to_i32! interprets Int32::MIN#to_i32! interprets Int8::MIN#to_u16! interprets Int8::MIN#to_u16! interprets Int16::MAX#to_f64! interprets Int16::MAX#to_f64! interprets Char#ord interprets Char#ord interprets Float64#to_i32! (positive) interprets Float64#to_i32! (positive) interprets UInt64::MAX#to_i8! interprets UInt64::MAX#to_i8! interprets Int64::MAX#to_u64! interprets Int64::MAX#to_u64! interprets UInt32::MAX#to_i32! interprets UInt32::MAX#to_i32! interprets Int64::MIN#to_f64! interprets Int64::MIN#to_f64! interprets Int8::MIN#to_u8! interprets Int8::MIN#to_u8! interprets UInt64::MAX#to_i! interprets UInt64::MAX#to_i! interprets UInt8::MAX#to_i8! interprets UInt8::MAX#to_i8! interprets Int32::MAX#to_i! interprets Int32::MAX#to_i! interprets UInt64::MAX#to_u64! interprets UInt64::MAX#to_u64! interprets Int8::MIN#to_u32! interprets Int8::MIN#to_u32! interprets Int32::MIN#to_i64! interprets Int32::MIN#to_i64! interprets Int8::MIN#to_i64! interprets Int8::MIN#to_i64! interprets Float64#to_i8! (positive) interprets Float64#to_i8! (positive) interprets UInt32::MAX#to_u32! interprets UInt32::MAX#to_u32! interprets Int64::MAX#to_f32! interprets Int64::MAX#to_f32! interprets UInt64::MAX#to_f64! interprets UInt64::MAX#to_f64! interprets Int8::MIN#to_i32! interprets Int8::MIN#to_i32! interprets UInt64::MAX#to_f32! interprets UInt64::MAX#to_f32! interprets Int8::MAX#to_u! interprets Int8::MAX#to_u! interprets Int8::MAX#to_u32! interprets Int8::MAX#to_u32! interprets UInt32::MAX#to_u64! interprets UInt32::MAX#to_u64! interprets UInt32::MAX#to_i! interprets UInt32::MAX#to_i! interprets Int16::MIN#to_f32! interprets Int16::MIN#to_f32! interprets Int32::MIN#to_i8! interprets Int32::MIN#to_i8! interprets Int16::MAX#to_i64! interprets Int16::MAX#to_i64! interprets Float64#to_i64! (positive) interprets Float64#to_i64! (positive) interprets Int8::MAX#to_u64! interprets Int8::MAX#to_u64! interprets UInt16::MAX#to_u8! interprets UInt16::MAX#to_u8! interprets Int32::MIN#to_u32! interprets Int32::MIN#to_u32! interprets Int16::MIN#to_u8! interprets Int16::MIN#to_u8! interprets Float64#to_f64! (negative) interprets Float64#to_f64! (negative) interprets Int32::MAX#to_i32! interprets Int32::MAX#to_i32! interprets Int16::MIN#to_i16! interprets Int16::MIN#to_i16! interprets Int8::MIN#to_i8! interprets Int8::MIN#to_i8! interprets Int64::MAX#to_i16! interprets Int64::MAX#to_i16! interprets Int8::MAX#to_u8! interprets Int8::MAX#to_u8! interprets UInt32::MAX#to_u16! interprets UInt32::MAX#to_u16! interprets UInt32::MAX#to_u! interprets UInt32::MAX#to_u! interprets Float64#to_u16! (positive) interprets Float64#to_u16! (positive) interprets UInt16::MAX#to_i32! interprets UInt16::MAX#to_i32! interprets UInt64::MAX#to_u16! interprets UInt64::MAX#to_u16! interprets Int8::MIN#to_u! interprets Int8::MIN#to_u! interprets Int8::MIN#to_i! interprets Int8::MIN#to_i! interprets Int32::MIN#to_u8! interprets Int32::MIN#to_u8! interprets Float32#to_i8! (positive) interprets Float32#to_i8! (positive) interprets Int16::MAX#to_i16! interprets Int16::MAX#to_i16! interprets Int64::MIN#to_i! interprets Int64::MIN#to_i! interprets UInt8::MAX#to_i32! interprets UInt8::MAX#to_i32! interprets Float32#to_i32! (positive) interprets Float32#to_i32! (positive) interprets UInt64::MAX#to_i16! interprets UInt64::MAX#to_i16! interprets Int64::MAX#to_i32! interprets Int64::MAX#to_i32! interprets Float32#to_i! (negative) interprets Float32#to_i! (negative) interprets Int64::MAX#to_u32! interprets Int64::MAX#to_u32! interprets UInt8::MAX#to_u16! interprets UInt8::MAX#to_u16! interprets Int8::MAX#to_f32! interprets Int8::MAX#to_f32! interprets UInt16::MAX#to_u64! interprets UInt16::MAX#to_u64! interprets Int32::MAX#to_i8! interprets Int32::MAX#to_i8! interprets Int64::MIN#to_i32! interprets Int64::MIN#to_i32! interprets UInt8::MAX#to_i64! interprets UInt8::MAX#to_i64! interprets Int64::MIN#to_f32! interprets Int64::MIN#to_f32! interprets Float32#to_f64! (negative) interprets Float32#to_f64! (negative) interprets Int32::MAX#to_i64! interprets Int32::MAX#to_i64! interprets Float32#to_i16! (positive) interprets Float32#to_i16! (positive) interprets UInt32::MAX#to_i16! interprets UInt32::MAX#to_i16! interprets Int64::MAX#to_i8! interprets Int64::MAX#to_i8! interprets Int32::MIN#to_u16! interprets Int32::MIN#to_u16! interprets Float64#to_i16! (positive) interprets Float64#to_i16! (positive) interprets Float32#to_u64! (positive) interprets Float32#to_u64! (positive) interprets Float32#to_i64! (positive) interprets Float32#to_i64! (positive) interprets Int32::MAX#to_f64! interprets Int32::MAX#to_f64! interprets UInt64::MAX#to_u! interprets UInt64::MAX#to_u! interprets Int32::MIN#to_u! interprets Int32::MIN#to_u! interprets Int8::MIN#to_f64! interprets Int8::MIN#to_f64! interprets Int32::MAX#to_u16! interprets Int32::MAX#to_u16! interprets Int64::MIN#to_u8! interprets Int64::MIN#to_u8! interprets Int8::MAX#to_i16! interprets Int8::MAX#to_i16! interprets Float32#to_i8! (negative) interprets Float32#to_i8! (negative) interprets Float64#to_f64! (positive) interprets Float64#to_f64! (positive) interprets Int32::MAX#to_f32! interprets Int32::MAX#to_f32! interprets Int16::MAX#to_i32! interprets Int16::MAX#to_i32! interprets Int64::MAX#to_i64! interprets Int64::MAX#to_i64! interprets Int16::MAX#to_u16! interprets Int16::MAX#to_u16! interprets Int16::MIN#to_i32! interprets Int16::MIN#to_i32! interprets UInt64::MAX#to_u32! interprets UInt64::MAX#to_u32! interprets Int8::MAX#to_i! interprets Int8::MAX#to_i! interprets Float32#to_i! (positive) interprets Float32#to_i! (positive) Code gen: and codegens and with primitive type other than bool with union codegens and with primitive type other than bool with union codegens and with bool and int 2 codegens and with bool and int 2 codegens and with primitive type other than bool codegens and with primitive type other than bool codegens and with bool false and false codegens and with bool false and false codegens and with nilable as left node 1 codegens and with nilable as left node 1 codegens and with bool union as left node 1 codegens and with bool union as left node 1 codegens assign in right node, inside if must not be nil codegens assign in right node, inside if must not be nil codegens and with bool union as left node 4 codegens and with bool union as left node 4 codegens and with bool true and false codegens and with bool true and false codegens and with bool false and true codegens and with bool false and true codegens and with bool union as left node 1 codegens and with bool union as left node 1 codegens and with bool and int 1 codegens and with bool and int 1 codegens assign in right node, after must be nilable codegens assign in right node, after must be nilable codegens and with non-false union as left node codegens and with non-false union as left node codegens and with bool true and true codegens and with bool true and true codegens and with primitive type other than bool codegens and with primitive type other than bool codegens and with bool union as left node 3 codegens and with bool union as left node 3 codegens and with nilable as left node 2 codegens and with nilable as left node 2 codegens and with bool union as left node 3 codegens and with bool union as left node 3 codegens and with nil union as left node 2 codegens and with nil union as left node 2 codegens and with bool union as left node 2 codegens and with bool union as left node 2 codegens and with nil union as left node 1 codegens and with nil union as left node 1 codegens assign in right node, after if must be nilable codegens assign in right node, after if must be nilable codegens and with bool union as left node 2 codegens and with bool union as left node 2 Crystal::Repl::Interpreter blocks captures non-closure block captures non-closure block interprets simplest block interprets simplest block counts with ... yield scope in block args bytesize (#12316) counts with ... yield scope in block args bytesize (#12316) interprets break inside block interprets break inside block interprets break inside block (union, through normal flow) interprets break inside block (union, through normal flow) interprets yield expression interprets yield expression interprets next inside block interprets next inside block interprets block with splat interprets block with splat caches method with captured block (#12276) caches method with captured block (#12276) interprets with ... yield with struct interprets with ... yield with struct interprets yield with splat, block with splat interprets yield with splat, block with splat interprets yield return value interprets yield return value interprets yield with splat (1) interprets yield with splat (1) interprets yield with splat, block with splat (#12227) interprets yield with splat, block with splat (#12227) interprets next inside block (union, through next) interprets next inside block (union, through next) considers block arg without type as having NoReturn type (#12270) considers block arg without type as having NoReturn type (#12270) interprets with ... yield with extra arguments (#12296) interprets with ... yield with extra arguments (#12296) interprets break inside block (union, through return) interprets break inside block (union, through return) clears block local variables when calling block (2) clears block local variables when calling block (2) returns from block returns from block interprets yield inside another block interprets yield inside another block interprets yield inside def with arguments interprets yield inside def with arguments interprets block with multiple yields interprets block with multiple yields casts yield expression to block var type (not block arg type) casts yield expression to block var type (not block arg type) interprets break inside block (union, through break) interprets break inside block (union, through break) interprets yield with splat (2) interprets yield with splat (2) interprets block with args that conflict with a local var interprets block with args that conflict with a local var interprets yield expressions interprets yield expressions interprets yield with splat, less block arguments interprets yield with splat, less block arguments interprets block with args that conflict with a local var interprets block with args that conflict with a local var discards yield expression discards yield expression interprets next inside block (union, through normal exit) interprets next inside block (union, through normal exit) yields different values to form a union yields different values to form a union interprets with ... yield interprets with ... yield clears block local variables when calling block clears block local variables when calling block considers block arg without type as having NoReturn type (2) (#12270) considers block arg without type as having NoReturn type (2) (#12270) Semantic: const errors on dynamic constant assignment inside block errors on dynamic constant assignment inside block doesn't errors if constant depends on another one defined later through method, but constant is simple (1) doesn't errors if constant depends on another one defined later through method, but constant is simple (1) errors if using return inside constant value (#5391) errors if using return inside constant value (#5391) doesn't crash with const used in initialize (bug) doesn't crash with const used in initialize (bug) errors on dynamic constant assignment inside if errors on dynamic constant assignment inside if doesn't share variables with global scope doesn't share variables with global scope finds current type first finds current type first finds constant in class that extends class (#205) finds constant in class that extends class (#205) types a global constant reference in static method types a global constant reference in static method can use constant defined later (#2906) can use constant defined later (#2906) doesn't errors if constant depends on another one defined later through method, but constant is simple ("foo") doesn't errors if constant depends on another one defined later through method, but constant is simple ("foo") finds const from restriction finds const from restriction errors if using const in uninitialized errors if using const in uninitialized creates container module if not exist when using Path creates container module if not exist when using Path doesn't errors if constant depends on another one defined later through method, but constant is simple (~ 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (~ 2) finds current type only for first path item (2) finds current type only for first path item (2) types a constant types a constant finds current type before parents (#4086) finds current type before parents (#4086) doesn't errors if constant depends on another one defined later through method, but constant is simple (true) doesn't errors if constant depends on another one defined later through method, but constant is simple (true) doesn't errors if constant depends on another one defined later through method, but constant is simple (nil) doesn't errors if constant depends on another one defined later through method, but constant is simple (nil) types a global constant reference in method types a global constant reference in method doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED &* 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED &* 2) errors if using const in proc notation parameter type errors if using const in proc notation parameter type types a nested constant using Path types a nested constant using Path doesn't errors if constant depends on another one defined later through method, but constant is simple (+ 1) doesn't errors if constant depends on another one defined later through method, but constant is simple (+ 1) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED // 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED // 2) errors if using const in var declaration errors if using const in var declaration errors if can't infer constant type (#3240, #3948) errors if can't infer constant type (#3240, #3948) finds constant in module that includes module (#205) finds constant in module that includes module (#205) doesn't count parent types as current type doesn't count parent types as current type doesn't errors if constant depends on another one defined later through method, but constant is simple (- 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (- 2) types a constant reference types a constant reference types a constant inside a def types a constant inside a def types a constant using Path types a constant using Path types a nested constant types a nested constant doesn't errors if constant depends on another one defined later through method, but constant is simple (1 &+ ZED) doesn't errors if constant depends on another one defined later through method, but constant is simple (1 &+ ZED) doesn't error if using c enum doesn't error if using c enum types a nested type with same name types a nested type with same name errors if using constant as generic type (#3240) errors if using constant as generic type (#3240) doesn't errors if constant depends on another one defined later through method, but constant is simple (1 + 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (1 + 2) keeps type of container when using Path keeps type of container when using Path finds nearest constant first finds nearest constant first finds current type only for first path item (1) finds current type only for first path item (1) errors if using const in proc notation return type errors if using const in proc notation return type errors if constant has NoReturn type (#6139) errors if constant has NoReturn type (#6139) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED &- 1) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED &- 1) errors if using const in type declaration errors if using const in type declaration doesn't errors if constant depends on another one defined later through method, but constant is simple (1 + ZED) doesn't errors if constant depends on another one defined later through method, but constant is simple (1 + ZED) errors if using const in restriction errors if using const in restriction doesn't errors if constant depends on another one defined later through method, but constant is simple ('a') doesn't errors if constant depends on another one defined later through method, but constant is simple ('a') doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED - 1) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED - 1) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED * 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED * 2) Semantic: double splat uses restriction on double splat, doesn't match with empty named tuple (2) uses restriction on double splat, doesn't match with empty named tuple (2) matches named args producing an empty double splat (#2678) matches named args producing an empty double splat (#2678) uses double splat restriction with concrete type uses double splat restriction with concrete type errors missing argument with double splat errors missing argument with double splat uses double splat in new uses double splat in new matches double splat on method with named args and regular args matches double splat on method with named args and regular args uses restriction on double splat, doesn't match with empty named tuple uses restriction on double splat, doesn't match with empty named tuple errors if duplicate keys on call side with two double splats errors if duplicate keys on call side with two double splats uses double splat restriction uses double splat restriction double splats named argument into arguments (1) double splats named argument into arguments (1) uses restriction on double splat, means all types must be that type uses restriction on double splat, means all types must be that type errors if duplicate keys on call side with double splat and named args errors if duplicate keys on call side with double splat and named args uses double splat restriction, matches empty uses double splat restriction, matches empty matches double splat on method (empty) matches double splat on method (empty) matches double splat on method with named args matches double splat on method with named args overloads based on double splat restriction overloads based on double splat restriction double splats named argument into arguments (2) double splats named argument into arguments (2) matches double splat with regular splat matches double splat with regular splat unreachable finds initializer finds initializer finds method with free variable finds method with free variable finds method called from proc finds method called from proc tallies calls tallies calls finds instance methods finds instance methods finds method with `super` finds method with `super` finds class methods finds class methods finds methods called from reachable code finds methods called from reachable code finds yielding methods finds yielding methods finds instance methods in nested types finds instance methods in nested types finds method called from expanded macro finds method called from expanded macro finds methods in generic type finds methods in generic type finds methods with proc parameter finds methods with proc parameter finds method with `previous_def` finds method with `previous_def` finds method in abstract type finds method in abstract type finds virtual method finds virtual method finds shadowed method finds shadowed method finds method called from instance variable initializer finds method called from instance variable initializer ignores autogenerated enum predicates ignores autogenerated enum predicates finds top level methods finds top level methods finds abstract method finds abstract method finds method called from block finds method called from block finds method called from expanded macro expression finds method called from expanded macro expression Code gen: if codegens if without an else with false codegens if without an else with false doesn't crash no NoReturn var (non-true left cond) (#1823) doesn't crash no NoReturn var (non-true left cond) (#1823) codegens if inside def without an else with true codegens if inside def without an else with true codegens if of nilable type in then 2 codegens if of nilable type in then 2 codegens if with virtual codegens if with virtual codegens #3104 codegens #3104 codegens if with an else with false codegens if with an else with false codegens bug #1729 codegens bug #1729 codegens if with return in both branches codegens if with return in both branches codegens if without an else with true codegens if without an else with true codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter restricts with || always falsey restricts with || always falsey codegens if with int codegens if with int codegens if with nil codegens if with nil codegen if with union type and then without type codegen if with union type and then without type codegen if with nested if that returns codegen if with nested if that returns codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises codegens if with nested if that raises doesn't crash no NoReturn var (true left cond) (#1823) doesn't crash no NoReturn var (true left cond) (#1823) codegens nested if with var (ssa bug) codegens nested if with var (ssa bug) codegens if of nilable type in else 3 codegens if of nilable type in else 3 doesn't crash with if !is_a? using var in then doesn't crash with if !is_a? using var in then codegens if value from then codegens if value from then codegens if with return and no else codegens if with return and no else codegens if with union codegens if with union codegens if of nilable type in then codegens if of nilable type in then codegens if with an else with true codegens if with an else with true codes if with two whiles codes if with two whiles codegen if inside if codegen if inside if codegens if of nilable type in else codegens if of nilable type in else considers or truthy/falsey right considers or truthy/falsey right doesn't crash with if !var using var in else doesn't crash with if !var using var in else codegens if with pointer 0x100000000 pointer codegens if with pointer 0x100000000 pointer codegen if with union type and else without type codegen if with union type and else without type doesn't generate truthy if branch if doesn't need value (bug) doesn't generate truthy if branch if doesn't need value (bug) Crystal::Command::FormatCommand formats stdin (bug + show-backtrace) formats stdin (bug + show-backtrace) formats stdin (invalid byte sequence error) formats stdin (invalid byte sequence error) formats files formats files checks files format (excludes + includes) checks files format (excludes + includes) formats stdin (formatted) formats stdin (formatted) formats files (bug) formats files (bug) formats stdin (bug) formats stdin (bug) formats stdin formats stdin formats files (dir) formats files (dir) formats files (error) formats files (error) checks files format checks files format checks files format (excludes) checks files format (excludes) formats files (bug + show-stacktrace) formats files (bug + show-stacktrace) checks files format (ok) checks files format (ok) formats stdin (syntax error) formats stdin (syntax error) Semantic: struct includes another struct includes another struct errors if includes non-cstruct type errors if includes non-cstruct type types struct getter types struct getter errors if includes unknown type errors if includes unknown type errors if invoking to_i32! and got wrong type errors if invoking to_i32! and got wrong type errors if already defined with another type errors if already defined with another type types struct getter to struct types struct getter to struct types struct getter on pointer type types struct getter on pointer type types struct getter multiple levels via new types struct getter multiple levels via new errors on struct setter if different type via new errors on struct setter if different type via new errors if setting closure errors if setting closure errors if already defined errors if already defined errors if using void in struct field type errors if using void in struct field type errors if invoking to_unsafe and got error in that call errors if invoking to_unsafe and got error in that call errors if invoking to_unsafe and got different type errors if invoking to_unsafe and got different type errors on empty c struct (#633) errors on empty c struct (#633) errors if includes and field already exists errors if includes and field already exists allows inline forward declaration allows inline forward declaration errors if includes and field already exists, the other way around errors if includes and field already exists, the other way around types struct setter types struct setter errors on struct if no field errors on struct if no field errors if already defined with another type (2) errors if already defined with another type (2) types Struct#new types Struct#new errors on struct setter if different type errors on struct setter if different type types struct getter with keyword name types struct getter with keyword name can access instance var from the outside (#1092) can access instance var from the outside (#1092) errors if using void via typedef in struct field type errors if using void via typedef in struct field type marks as packed marks as packed types struct types struct supports macro if inside struct supports macro if inside struct errors if invoking to_i32! and got error in that call errors if invoking to_i32! and got error in that call automatically converts numeric type in struct field assignment automatically converts numeric type in struct field assignment Crystal::Repl::Interpreter tuple interprets tuple literal of different types (1) interprets tuple literal of different types (1) interprets tuple range indexer (2) interprets tuple range indexer (2) extends sign when doing to_i32 extends sign when doing to_i32 interprets tuple literal of different types (2) interprets tuple literal of different types (2) interprets tuple metaclass range indexer interprets tuple metaclass range indexer does tuple indexer on union does tuple indexer on union interprets tuple literal and access by known index interprets tuple literal and access by known index interprets tuple self interprets tuple self interprets tuple range indexer interprets tuple range indexer interprets tuple metaclass indexer interprets tuple metaclass indexer discards tuple (#12383) discards tuple (#12383) unpacks tuple in block arguments unpacks tuple in block arguments discards tuple access discards tuple access Code gen: type declaration codegens initialize instance var with var declaration codegens initialize instance var with var declaration codegens initialize instance var of superclass codegens initialize instance var of superclass codegens initialize instance var codegens initialize instance var declares and initializes declares and initializes declares and initializes var declares and initializes var Semantic: multi assign strict_multi_assign errors if assigning tuple to fewer targets errors if assigning tuple to fewer targets errors if assigning union of tuples to fewer targets errors if assigning union of tuples to fewer targets doesn't error if some type in union has no constant size doesn't error if some type in union has no constant size errors if assigning tuple to more targets errors if assigning tuple to more targets errors if assigning non-Indexable to splat (#11414) errors if assigning non-Indexable to splat (#11414) doesn't error if some type in union matches target count doesn't error if some type in union matches target count errors if assigning non-Indexable (#11414) errors if assigning non-Indexable (#11414) can pass splat variable at top-level to macros (#11596) can pass splat variable at top-level to macros (#11596) without strict_multi_assign errors if assigning non-Indexable to splat (#11414) errors if assigning non-Indexable to splat (#11414) doesn't error if assigning tuple to fewer targets doesn't error if assigning tuple to fewer targets doesn't error if assigning non-Indexable (#11414) doesn't error if assigning non-Indexable (#11414) Code gen: splat splats with default value (3) splats with default value (3) splats splats splats with default value splats with default value splats without args splats without args splats with another arg splats with another arg evaluates splat argument just once (#2677) evaluates splat argument just once (#2677) splats on call splats on call does #2407 does #2407 splats in initialize splats in initialize splats with default value (2) splats with default value (2) Semantic: proc disallows Number in proc pointer disallows Number in proc pointer allows metaclass in procs allows metaclass in procs can match *T in block argument can match *T in block argument disallows Object in proc notation parameter type disallows Object in proc notation parameter type says wrong number of block params in new on proc type says wrong number of block params in new on proc type types proc type spec types proc type spec disallows Number in proc notation parameter type disallows Number in proc notation parameter type disallows Proc in proc notation parameter type disallows Proc in proc notation parameter type disallows Value in proc pointer disallows Value in proc pointer uses array argument of proc arg (1) uses array argument of proc arg (1) disallows Value in proc notation parameter type disallows Value in proc notation parameter type disallows Struct in proc notation return type disallows Struct in proc notation return type disallows Int in proc return types disallows Int in proc return types disallows StaticArray in proc pointer disallows StaticArray in proc pointer finds method of object finds method of object allows passing nil as proc callback if it is a lib alias allows passing nil as proc callback if it is a lib alias types proc pointer types proc pointer can assign proc that returns anything to proc that returns nil, with class var (#3655) can assign proc that returns anything to proc that returns nil, with class var (#3655) disallows Class in proc notation parameter type disallows Class in proc notation parameter type passes proc pointer as block with arguments passes proc pointer as block with arguments casts to Proc(Nil) when specified in return type casts to Proc(Nil) when specified in return type disallows Proc in proc pointer disallows Proc in proc pointer doesn't let passing an non-covariant generic argument doesn't let passing an non-covariant generic argument types proc literal hard type inference (1) types proc literal hard type inference (1) types int proc literal types int proc literal disallows Float in procs disallows Float in procs types proc call with return type types proc call with return type gives correct error message when proc return type is incorrect (#219) gives correct error message when proc return type is incorrect (#219) *doesn't* merge Proc that returns Nil with another one that returns something else (#3655) (this was reverted) *doesn't* merge Proc that returns Nil with another one that returns something else (#3655) (this was reverted) allows passing function to LibC without specifying types, using a global method allows passing function to LibC without specifying types, using a global method disallows Object in proc pointer disallows Object in proc pointer disallows Proc in proc notation return type disallows Proc in proc notation return type errors when using local variable with proc argument name errors when using local variable with proc argument name doesn't cause upcast bug (#8428) doesn't cause upcast bug (#8428) allows implicit cast of proc to return void in LibC function allows implicit cast of proc to return void in LibC function types proc pointer with a type that was never instantiated types proc pointer with a type that was never instantiated disallows Tuple in proc pointer disallows Tuple in proc pointer disallows casting a proc type to one accepting same size argument but different input disallows casting a proc type to one accepting same size argument but different input disallows Enum in proc notation parameter type disallows Enum in proc notation parameter type disallows Number in proc return types disallows Number in proc return types allows passing union including module to proc allows passing union including module to proc errors if missing argument type in proc literal errors if missing argument type in proc literal can pass proc that returns T as Void with named args (#7523) can pass proc that returns T as Void with named args (#7523) disallows Object in captured block disallows Object in captured block can pass Proc(T) to Proc(Nil) in type restriction (#8964) can pass Proc(T) to Proc(Nil) in type restriction (#8964) can pass Proc(X, T) to Proc(X, Nil) in type restriction (#8964) can pass Proc(X, T) to Proc(X, Nil) in type restriction (#8964) types int -> int proc call types int -> int proc call uses array argument of proc arg (3) uses array argument of proc arg (3) allows metaclass in proc notation parameter type allows metaclass in proc notation parameter type disallows Tuple in procs disallows Tuple in procs allows new on proc type with less block params allows new on proc type with less block params disallows StaticArray in procs disallows StaticArray in procs types proc literal with return type (1) types proc literal with return type (1) can use @ivar as pointer syntax receiver (#9239) can use @ivar as pointer syntax receiver (#9239) uses array argument of proc arg (2) uses array argument of proc arg (2) uses array argument of proc arg (4) uses array argument of proc arg (4) allows casting a proc type to one with void argument allows casting a proc type to one with void argument says wrong return type in new on proc type says wrong return type in new on proc type disallows Enum in proc notation return type disallows Enum in proc notation return type disallows Reference in proc return types disallows Reference in proc return types disallows Value in proc notation return type disallows Value in proc notation return type disallows Int in procs disallows Int in procs allows passing proc type if it is typedef'd allows passing proc type if it is typedef'd disallows Float in proc pointer disallows Float in proc pointer has proc literal as restriction and errors if sizes are different has proc literal as restriction and errors if sizes are different allows metaclass in proc return types allows metaclass in proc return types errors when using macro as proc value (top-level with obj) (#7465) errors when using macro as proc value (top-level with obj) (#7465) disallows Int in proc notation return type disallows Int in proc notation return type disallows Reference in procs disallows Reference in procs merges return type merges return type doesn't capture closured var if using typeof doesn't capture closured var if using typeof disallows Reference in proc pointer disallows Reference in proc pointer says wrong number of arguments says wrong number of arguments disallows StaticArray in proc return types disallows StaticArray in proc return types disallows Pointer in procs disallows Pointer in procs ... ... disallows Struct in procs disallows Struct in procs doesn't need to deduce type of block if return is void doesn't need to deduce type of block if return is void disallows Enum in proc pointer disallows Enum in proc pointer allows using Proc as restriction (1) allows using Proc as restriction (1) disallows Value in captured block disallows Value in captured block allows passing NoReturn type for any return type (1) allows passing NoReturn type for any return type (1) disallows Object in procs disallows Object in procs allows passing NoReturn type for any return type, with Proc notation (#12126) allows passing NoReturn type for any return type, with Proc notation (#12126) accesses T and R accesses T and R allows passing function to LibC without specifying types, using a class method allows passing function to LibC without specifying types, using a class method disallows Struct in captured block disallows Struct in captured block disallows Tuple in proc notation parameter type disallows Tuple in proc notation parameter type types nil or proc type types nil or proc type allows implicit cast of proc to return void in generic restriction allows implicit cast of proc to return void in generic restriction disallows Enum in procs disallows Enum in procs binds proc literal to arguments and body binds proc literal to arguments and body disallows Pointer in proc notation parameter type disallows Pointer in proc notation parameter type disallows casting a proc type to one accepting same size argument but different output disallows casting a proc type to one accepting same size argument but different output disallows Enum in proc return types disallows Enum in proc return types passes proc pointer as block passes proc pointer as block sets proc type as void if explicitly told so, when using new sets proc type as void if explicitly told so, when using new allows using Proc as restriction (2) allows using Proc as restriction (2) disallows Struct in proc return types disallows Struct in proc return types allows using Proc as restriction (3) allows using Proc as restriction (3) disallows Float in proc notation return type disallows Float in proc notation return type can assign NoReturn proc to other proc (#3032) can assign NoReturn proc to other proc (#3032) has proc literal as restriction and works has proc literal as restriction and works disallows Class in proc return types disallows Class in proc return types disallows Pointer in proc return types disallows Pointer in proc return types disallows Pointer in proc notation return type disallows Pointer in proc notation return type errors when using macro as proc value (top-level) (#7465) errors when using macro as proc value (top-level) (#7465) disallows Number in captured block disallows Number in captured block allows implicit cast of proc to return void in non-generic restriction allows implicit cast of proc to return void in non-generic restriction allows metaclass in proc pointer allows metaclass in proc pointer disallows Int in captured block disallows Int in captured block types proc literal with return type (2) types proc literal with return type (2) has proc literal as restriction and works when output not specified has proc literal as restriction and works when output not specified *doesn't* merge Proc that returns NoReturn with another one that returns something else (#9971) *doesn't* merge Proc that returns NoReturn with another one that returns something else (#9971) types proc literal with a type that was never instantiated types proc literal with a type that was never instantiated disallows Object in proc return types disallows Object in proc return types allows passing function to LibC without specifying types allows passing function to LibC without specifying types allows passing NoReturn type for any return type (2) allows passing NoReturn type for any return type (2) disallows Value in procs disallows Value in procs disallows Number in proc notation return type disallows Number in proc notation return type allows invoking a function with a generic subtype (1) allows invoking a function with a generic subtype (1) disallows casting a proc type to one accepting more arguments disallows casting a proc type to one accepting more arguments disallows Float in captured block disallows Float in captured block allows new on proc type that is a lib alias allows new on proc type that is a lib alias disallows Reference in captured block disallows Reference in captured block accesses T inside variadic generic (2) accesses T inside variadic generic (2) accesses T inside variadic generic accesses T inside variadic generic disallows Class in proc pointer disallows Class in proc pointer disallows Int in proc notation parameter type disallows Int in proc notation parameter type allows passing virtual type including module to proc allows passing virtual type including module to proc disallows Class in proc notation return type disallows Class in proc notation return type disallows Pointer in proc pointer disallows Pointer in proc pointer declares an instance variable with splat in proc notation declares an instance variable with splat in proc notation disallows Proc in captured block disallows Proc in captured block disallows Proc in proc return types disallows Proc in proc return types disallows Class in procs disallows Class in procs types proc pointer to instance method types proc pointer to instance method unpacks tuple but doesn't override local variables, when using new (#9813) unpacks tuple but doesn't override local variables, when using new (#9813) disallows Value in proc return types disallows Value in proc return types accesses T inside variadic generic, in proc notation accesses T inside variadic generic, in proc notation disallows Object in proc notation return type disallows Object in proc notation return type can use @@cvar as pointer syntax receiver (#9239) can use @@cvar as pointer syntax receiver (#9239) disallows Number in procs disallows Number in procs forwards block and computes correct type (bug) forwards block and computes correct type (bug) disallows casting a proc type to one accepting less arguments disallows casting a proc type to one accepting less arguments virtualizes proc type (#6789) virtualizes proc type (#6789) allows metaclass in proc notation return type allows metaclass in proc notation return type disallows Tuple in proc return types disallows Tuple in proc return types types proc pointer with types types proc pointer with types disallows Tuple in proc notation return type disallows Tuple in proc notation return type can assign proc that returns anything to proc that returns nil, with local var (#3655) can assign proc that returns anything to proc that returns nil, with local var (#3655) gets pointer to lib fun without specifying types gets pointer to lib fun without specifying types allows metaclass in captured block allows metaclass in captured block disallows Class in captured block disallows Class in captured block has proc literal as restriction and errors if output is different has proc literal as restriction and errors if output is different disallows Int in proc pointer disallows Int in proc pointer errors if inferred return type doesn't match return type restriction (1) errors if inferred return type doesn't match return type restriction (1) errors if inferred return type doesn't match return type restriction (2) errors if inferred return type doesn't match return type restriction (2) allows invoking a function with a generic subtype (2) allows invoking a function with a generic subtype (2) disallows Float in proc notation parameter type disallows Float in proc notation parameter type types proc call types proc call disallows Float in proc return types disallows Float in proc return types allows passing proc type if it is a lib alias allows passing proc type if it is a lib alias disallows Reference in proc notation parameter type disallows Reference in proc notation parameter type disallows StaticArray in proc notation parameter type disallows StaticArray in proc notation parameter type allows passing NoReturn type for any return type (3) allows passing NoReturn type for any return type (3) allows new on proc type allows new on proc type has proc literal as restriction and errors if input is different has proc literal as restriction and errors if input is different disallows Tuple in captured block disallows Tuple in captured block types empty proc literal types empty proc literal disallows Proc in procs disallows Proc in procs types int -> int proc literal types int -> int proc literal disallows StaticArray in captured block disallows StaticArray in captured block types Proc(*T, Void) as Proc(*T, Nil) types Proc(*T, Void) as Proc(*T, Nil) virtualizes proc type with -> (#8730) virtualizes proc type with -> (#8730) disallows StaticArray in proc notation return type disallows StaticArray in proc notation return type allows writing a function type with Proc allows writing a function type with Proc can assign proc that returns anything to proc that returns nil, with instance var (#3655) can assign proc that returns anything to proc that returns nil, with instance var (#3655) doesn't crash on constant to proc pointer doesn't crash on constant to proc pointer errors when using macro as proc value (inside method) (#7465) errors when using macro as proc value (inside method) (#7465) disallows Enum in captured block disallows Enum in captured block disallows Struct in proc pointer disallows Struct in proc pointer allows using proc arg name shadowing local variable allows using proc arg name shadowing local variable disallows Reference in proc notation return type disallows Reference in proc notation return type disallows Struct in proc notation parameter type disallows Struct in proc notation parameter type disallows Pointer in captured block disallows Pointer in captured block types a proc pointer with generic types types a proc pointer with generic types Crystal::Init::InitProject has proper contents has proper contents correctly uses git config correctly uses git config Crystal::Macro control expression methods executes exp (nop) executes exp (nop) executes exp executes exp unary expression methods executes is_a? executes is_a? executes exp executes exp symbol methods executes symbol == symbol executes symbol == symbol executes symbol != symbol executes symbol != symbol forwards methods to string forwards methods to string uninitialized var methods executes type executes type executes var executes var Crystal::ExternalVar executes real_name executes real_name executes type executes type executes name executes name #warning emits a top level warning emits a top level warning Crystal::EnumDef executes kind executes kind executes name executes name executes body executes body executes base_type executes base_type visibility modifier methods executes visibility executes visibility executes exp executes exp macro methods executes args executes args executes double_splat executes double_splat executes splat_index executes splat_index executes body executes body executes block_arg executes block_arg executes name executes name executes visibility executes visibility proc notation methods gets single input gets single input gets empty output gets empty output executes resolve executes resolve gets single output gets single output gets multiple inputs gets multiple inputs executes resolve? executes resolve? call methods executes named args name executes named args name executes receiver executes receiver executes block executes block executes args executes args executes name executes name executes global? executes global? executes named args value executes named args value executes block arg executes block arg executes block arg (nop) executes block arg (nop) executes named args executes named args compares versions compares versions printing pp! pp! puts puts print print p p pp pp p! p! #parse_type path path raises on extra unparsed tokens after the type raises on extra unparsed tokens after the type union - | union - | raises on extra unparsed tokens before the type raises on extra unparsed tokens before the type union - Union union - Union exposes syntax warnings exposes syntax warnings union - in generic union - in generic generic generic proc proc raises on empty string raises on empty string raises on non StringLiteral arguments raises on non StringLiteral arguments metaclass metaclass executes assign without output executes assign without output expressions methods executes expressions executes expressions Crystal::TypeNode executes class_vars on metaclass executes class_vars on metaclass executes class vars (with inheritance) executes class vars (with inheritance) executes >= executes >= #id does not include trailing + for virtual type does not include trailing + for virtual type executes ancestors (with generic) executes ancestors (with generic) executes != executes != executes instance_vars on metaclass executes instance_vars on metaclass executes instance_vars executes instance_vars executes methods executes methods executes size of tuple executes size of tuple executes size of tuple metaclass executes size of tuple metaclass executes type_vars executes type_vars #name generic type includes the generic_args of the type by default includes the generic_args of the type by default includes the generic_args of the instantiated type by default includes the generic_args of the instantiated type by default generic_args false does not include the generic_args of the instantiated type does not include the generic_args of the instantiated type does not include the generic_args of the type does not include the generic_args of the type true includes the generic_args of the instantiated type includes the generic_args of the instantiated type includes the generic_args of the type includes the generic_args of the type with an invalid type argument should raise the proper exception should raise the proper exception generic instance does not print extra commas for empty splat type var (3) does not print extra commas for empty splat type var (3) prints empty splat type var prints empty splat type var prints multiple arguments for splat type var prints multiple arguments for splat type var does not print extra commas for empty splat type var (2) does not print extra commas for empty splat type var (2) does not print extra commas for empty splat type var (1) does not print extra commas for empty splat type var (1) prints generic type arguments prints generic type arguments simple type returns the name of the type returns the name of the type namespaced type should return the FQN of the type should return the FQN of the type executes == executes == executes instance_vars on symbol type executes instance_vars on symbol type #warning emits a warning at a specific node emits a warning at a specific node executes union_types (union) executes union_types (union) #union? true true false false executes superclass executes superclass executes union_types (non-union) executes union_types (non-union) executes instance executes instance executes class executes class executes resolve executes resolve executes ancestors executes ancestors #class? Crystal::NonGenericClassType class class struct struct Crystal::NonGenericModuleType Crystal::NonGenericModuleType Crystal::GenericClassType struct struct class class Crystal::GenericModuleType Crystal::GenericModuleType executes class_vars on symbol type executes class_vars on symbol type executes class vars executes class vars #includers returns an array of types `self` is directly included in returns an array of types `self` is directly included in #module? Crystal::GenericModuleType Crystal::GenericModuleType Crystal::NonGenericClassType struct struct class class Crystal::GenericClassType struct struct class class Crystal::NonGenericModuleType Crystal::NonGenericModuleType executes resolve? executes resolve? #struct? Crystal::NonGenericModuleType Crystal::NonGenericModuleType Crystal::GenericClassType class class struct struct Crystal::GenericModuleType Crystal::GenericModuleType Crystal::NonGenericClassType struct struct class class == and != devirtualize generic type arguments (#10730) == and != devirtualize generic type arguments (#10730) #abstract? Crystal::NonGenericClassType struct abstract abstract non-abstract non-abstract class non-abstract non-abstract abstract abstract Crystal::GenericClassType struct abstract abstract non-abstract non-abstract class non-abstract non-abstract abstract abstract Crystal::GenericModuleType Crystal::GenericModuleType Crystal::NonGenericModuleType Crystal::NonGenericModuleType executes <= executes <= executes > executes > #nilable? true true false false executes class methods executes class methods executes < executes < instancevar methods executes name executes name require methods executes path executes path Crystal::AnnotationDef executes kind executes kind executes name executes name executes body executes body or methods executes left executes left executes right executes right regex methods executes source executes source executes options executes options env has key has key doesn't have key doesn't have key Crystal::Asm executes alignstack? executes alignstack? executes outputs executes outputs executes can_throw? executes can_throw? executes inputs executes inputs executes intel? executes intel? executes text executes text executes volatile? executes volatile? executes clobbers executes clobbers generic methods executes named_args executes named_args executes resolve? executes resolve? executes types executes types executes type_vars executes type_vars executes resolve executes resolve executes name executes name readinstancevar methods executes name executes name executes obj executes obj Crystal::ModuleDef executes body executes body executes name executes name executes splat_index executes splat_index executes kind executes kind executes type_vars executes type_vars proc literal methods executes return_type executes return_type executes args executes args executes body executes body case methods in executes whens executes whens executes when exhaustive? executes when exhaustive? executes exhaustive? executes exhaustive? when executes when exhaustive? executes when exhaustive? executes whens executes whens executes when body executes when body executes else executes else executes exhaustive? executes exhaustive? executes when conds executes when conds executes cond executes cond Crystal::Primitive executes name executes name block methods executes body executes body executes splat_index executes splat_index executes args executes args while methods executes cond executes cond executes body executes body yield methods executes expressions executes expressions executes scope executes scope executes scope (nop) executes scope (nop) offsetof methods executes type executes type executes offset executes offset Crystal::AsmOperand executes exp executes exp executes constraint executes constraint Crystal::Extend executes name executes name macro for methods executes vars executes vars executes exp executes exp executes body executes body is_a methods executes receiver executes receiver executes arg executes arg Crystal::NamedTupleLiteral executes double splat with arg executes double splat with arg #each without either argument builds the correct array builds the correct array with both arguments builds the correct array builds the correct array without the key argument builds the correct array builds the correct array without the value argument builds the correct array builds the correct array executes is_a? executes is_a? executes [] executes [] executes map executes map executes keys executes keys executes size executes size executes to_a executes to_a executes empty? executes empty? executes double splat executes double splat executes values executes values creates a named tuple literal with a var creates a named tuple literal with a var executes double splat executes double splat executes [] not found executes [] not found executes [] with invalid key type executes [] with invalid key type executes []= executes []= Crystal::CStructOrUnionDef executes body executes body executes union? executes union? executes kind executes kind executes name executes name Crystal::LibDef executes name executes name executes kind executes kind executes body executes body Crystal::HashLiteral executes map executes map executes empty? executes empty? executes sort_by executes sort_by executes of_key (nop) executes of_key (nop) executes double splat executes double splat executes is_a? executes is_a? executes double splat executes double splat #each without either argument builds the correct array builds the correct array with both arguments builds the correct array builds the correct array without the key argument builds the correct array builds the correct array without the value argument builds the correct array builds the correct array executes to_a executes to_a executes double splat with arg executes double splat with arg executes of_key executes of_key executes []= executes []= executes type (nop) executes type (nop) executes size executes size executes [] not found executes [] not found executes type executes type executes [] executes [] creates a hash literal with a var creates a hash literal with a var executes of_value executes of_value executes of_value (nop) executes of_value (nop) executes values executes values executes keys executes keys union methods executes types executes types executes resolve executes resolve executes resolve? executes resolve? responds_to methods executes receiver executes receiver executes name executes name Crystal::RangeLiteral executes to_a executes to_a executes excludes_end? executes excludes_end? executes map executes map executes end executes end executes begin executes begin #each #each char methods executes ord executes ord classvar methods executes name executes name def methods executes free_vars executes free_vars executes name executes name executes splat_index executes splat_index executes receiver executes receiver executes accepts_block? executes accepts_block? executes abstract? executes abstract? executes return_type executes return_type executes body executes body executes args executes args executes block_arg executes block_arg executes visibility executes visibility executes double_splat executes double_splat Crystal::FunDef executes body executes body executes name executes name executes return_type executes return_type executes args executes args executes variadic? executes variadic? executes has_body? executes has_body? executes real_name executes real_name Crystal::Alias executes name executes name executes type executes type Crystal::Include executes name executes name splat methods executes exp executes exp string methods executes camelcase executes camelcase executes upcase executes upcase executes to_i executes to_i executes string includes? string (false) executes string includes? string (false) executes strip executes strip executes [] with computed range executes [] with computed range executes string includes? char (true) executes string includes? char (true) executes empty executes empty executes split without arguments executes split without arguments executes string == string executes string == string executes camelcase with lower executes camelcase with lower executes split with char argument executes split with char argument executes [] with incomplete range executes [] with incomplete range executes capitalize executes capitalize executes titleize executes titleize executes string chomp executes string chomp executes count executes count executes to_i(base) executes to_i(base) executes string ends_with? string (false) executes string ends_with? string (false) executes string ends_with? char (false) executes string ends_with? char (false) executes size executes size executes string includes? string (true) executes string includes? string (true) executes string < string executes string < string executes [] with inclusive range executes [] with inclusive range executes string > macroid executes string > macroid executes tr executes tr executes string ends_with? string (true) executes string ends_with? string (true) executes downcase executes downcase executes string includes? char (false) executes string includes? char (false) executes string > string executes string > string executes string < macroid executes string < macroid executes [] with exclusive range executes [] with exclusive range executes string starts_with? char (false) executes string starts_with? char (false) executes string ends_with? char (true) executes string ends_with? char (true) executes split with argument executes split with argument executes string starts_with? string (true) executes string starts_with? string (true) executes string starts_with? char (true) executes string starts_with? char (true) executes string starts_with? string (false) executes string starts_with? string (false) executes camelcase with invalid lower arg type executes camelcase with invalid lower arg type executes string =~ (true) executes string =~ (true) executes string =~ (false) executes string =~ (false) executes underscore executes underscore executes string + string executes string + string executes string != string executes string != string executes lines executes lines executes string + char executes string + char executes chars executes chars executes gsub executes gsub arg methods executes default_value executes default_value executes restriction executes restriction executes internal_name executes internal_name executes name executes name Crystal::TypeDef executes type executes type executes name executes name cast methods executes obj executes obj executes to executes to type declaration methods executes var executes var executes type executes type executes value executes value executes var when instance var executes var when instance var metaclass methods executes instance executes instance executes resolve executes resolve executes resolve? executes resolve? and methods executes left executes left executes right executes right path methods executes global executes global executes global? executes global? executes resolve? executes resolve? executes types executes types executes names executes names executes resolve executes resolve proc pointer methods executes global? executes global? executes name executes name executes obj when present executes obj when present executes args when not empty executes args when not empty executes args when empty executes args when empty executes obj when absent executes obj when absent executes assign executes assign flag? doesn't have flag doesn't have flag has flag has flag nilable cast methods executes obj executes obj executes to executes to instancevar methods executes name executes name assign methods executes target executes target executes value executes value Crystal::TupleLiteral executes sort with ids and strings executes sort with ids and strings executes find (finds) executes find (finds) executes map with arg executes map with arg #each #each #- with ArrayLiteral argument removes the elements in RHS from LHS into a TupleLiteral removes the elements in RHS from LHS into a TupleLiteral with TupleLiteral argument removes the elements in RHS from LHS into a TupleLiteral removes the elements in RHS from LHS into a TupleLiteral executes size executes size executes find (doesn't find) executes find (doesn't find) creates a tuple literal with a var creates a tuple literal with a var executes [] with range executes [] with range executes select executes select executes [] with 0 executes [] with 0 executes [] with incomplete range executes [] with incomplete range executes sort with numbers executes sort with numbers executes any? (true) executes any? (true) executes all? (false) executes all? (false) executes any? (false) executes any? (false) executes reject executes reject #+ with ArrayLiteral argument concatenates the literals into a TupleLiteral concatenates the literals into a TupleLiteral with TupleLiteral argument concatenates the literals into a TupleLiteral concatenates the literals into a TupleLiteral executes map with constants executes map with constants executes empty? executes empty? executes [] with computed range executes [] with computed range #map_with_index with both arguments returns the resulting tuple returns the resulting tuple without the element argument returns the resulting tuple returns the resulting tuple without either argument returns the resulting tuple returns the resulting tuple without the index argument returns the resulting tuple returns the resulting tuple executes sort with strings executes sort with strings executes unshift executes unshift executes is_a? executes is_a? executes push executes push executes join executes join executes splat with splat executes splat with splat executes splat with symbols and strings executes splat with symbols and strings executes first executes first executes includes? executes includes? executes uniq executes uniq #each_with_index without either argument builds the correct array builds the correct array without the index argument builds the correct array builds the correct array with both arguments builds the correct array builds the correct array without the element argument builds the correct array builds the correct array executes splat with arg executes splat with arg executes join with strings executes join with strings executes last executes last executes all? (true) executes all? (true) executes [] with 1 executes [] with 1 executes [] out of bounds executes [] out of bounds executes splat executes splat executes map executes map executes sort with ids executes sort with ids exception handler methods executes ensure executes ensure executes else (nop) executes else (nop) executes body executes body executes rescues executes rescues executes rescue types executes rescue types executes rescue name executes rescue name executes rescue body executes rescue body executes ensure (nop) executes ensure (nop) executes else executes else Crystal::TypeOf executes args executes args multi_assign methods executes targets executes targets executes values executes values macro if methods executes cond executes cond executes else executes else executes then executes then Crystal::ClassDef executes body executes body executes abstract? executes abstract? executes superclass executes superclass executes struct? executes struct? executes kind executes kind executes type_vars executes type_vars executes name executes name executes splat_index executes splat_index if methods executes cond executes cond executes else executes else executes else (nop) executes else (nop) executes then executes then number methods executes kind executes kind executes // executes // executes + with float executes + with float executes & executes & executes - executes - executes + and preserves type executes + and preserves type executes unary + executes unary + executes <= (false) executes <= (false) executes > (true) executes > (true) executes ** executes ** executes unary - executes unary - executes math operations using U/Int128 executes math operations using U/Int128 executes <=> (returns nil) executes <=> (returns nil) executes > (false) executes > (false) executes | executes | executes << executes << #to_number #to_number executes < (true) executes < (true) executes <= (true) executes <= (true) executes >= (false) executes >= (false) executes ^ executes ^ preserves integer size (#10713) preserves integer size (#10713) executes >= (true) executes >= (true) executes < (false) executes < (false) executes >> executes >> executes unary ~ executes unary ~ executes <=> executes <=> executes + executes + executes % executes % executes * executes * node methods executes != on numbers (false) executes != on numbers (false) #doc_comment ensures each newline has a `#` prefix ensures each newline has a `#` prefix returns an empty MacroId if there are no docs on the node (wants_doc = false) returns an empty MacroId if there are no docs on the node (wants_doc = false) returns the call's docs if present as a MacroId (wants_doc = true) returns the call's docs if present as a MacroId (wants_doc = true) executes != on numbers (true) executes != on numbers (true) class_name executes class_name executes class_name executes class_name executes class_name executes class_name executes class_name executes class_name executes class_name executes class_name executes class_name executes class_name executes class_name #nil? Nop Nop NumberLiteral NumberLiteral NilLiteral NilLiteral #doc returns a multiline comment returns a multiline comment returns the call's docs if present (wants_doc = true) returns the call's docs if present (wants_doc = true) returns an empty string if there are no docs on the node (wants_doc = false) returns an empty string if there are no docs on the node (wants_doc = false) executes == on symbols (false) (#240) executes == on symbols (false) (#240) location column number column number filename filename line_number line_number end column number end column number end line_number end line_number executes == on numbers (false) executes == on numbers (false) id expands macro with id call on symbol expands macro with id call on symbol expands macro with id call on string expands macro with id call on string expands macro with id call on call expands macro with id call on call expands macro with id call on number expands macro with id call on number expands macro with id call on char expands macro with id call on char executes == on numbers (true) executes == on numbers (true) symbolize expands macro with symbolize call on string expands macro with symbolize call on string expands macro with symbolize call on symbol expands macro with symbolize call on symbol expands macro with symbolize call on id expands macro with symbolize call on id executes == on symbols (true) (#240) executes == on symbols (true) (#240) #is_a? union argument union argument union argument, unimplemented types union argument, unimplemented types union argument, duplicate type union argument, duplicate type union argument, contains NoReturn union argument, contains NoReturn union argument, undefined types union argument, undefined types union argument, mergeable union argument, mergeable stringify expands macro with stringify call on number expands macro with stringify call on number expands macro with stringify call on symbol expands macro with stringify call on symbol expands macro with stringify call on string expands macro with stringify call on string expands macro with stringify call on call expands macro with stringify call on call metavar methods executes nothing executes nothing executes is_a? executes is_a? executes name executes name executes id executes id annotation methods executes [] with StringLiteral executes [] with StringLiteral executes name executes name executes [] with NumberLiteral executes [] with NumberLiteral executes [] with other ASTNode, but raises an error executes [] with other ASTNode, but raises an error executes [] with MacroId executes [] with MacroId executes [] with SymbolLiteral executes [] with SymbolLiteral global methods executes name executes name macro id methods forwards methods to string forwards methods to string compares with symbol compares with symbol compares with string compares with string Crystal::ArrayLiteral executes push executes push executes map with constants executes map with constants executes all? (false) executes all? (false) executes find (doesn't find) executes find (doesn't find) executes uniq executes uniq executes includes? executes includes? executes join executes join executes sort with strings executes sort with strings executes sort with ids and strings executes sort with ids and strings executes empty? executes empty? executes any? (true) executes any? (true) executes last executes last executes index out of bounds executes index out of bounds executes [] with incomplete range executes [] with incomplete range executes type (nop) executes type (nop) executes find (finds) executes find (finds) executes splat executes splat #each_with_index without either argument builds the correct array builds the correct array without the index argument builds the correct array builds the correct array without the element argument builds the correct array builds the correct array with both arguments builds the correct array builds the correct array executes first executes first executes of executes of executes unshift executes unshift creates an array literal with a var creates an array literal with a var #each #each executes size executes size executes is_a? executes is_a? executes all? (true) executes all? (true) executes reduce with initial value executes reduce with initial value executes any? (false) executes any? (false) executes map with arg executes map with arg executes select executes select executes reject executes reject executes map executes map executes splat with splat executes splat with splat #- with TupleLiteral argument removes the elements in RHS from LHS into an ArrayLiteral removes the elements in RHS from LHS into an ArrayLiteral with ArrayLiteral argument removes the elements in RHS from LHS into an ArrayLiteral removes the elements in RHS from LHS into an ArrayLiteral executes [] with range executes [] with range executes of (nop) executes of (nop) executes type executes type executes join with strings executes join with strings executes index 0 executes index 0 executes [] with computed range executes [] with computed range #+ with TupleLiteral argument concatenates the literals into an ArrayLiteral concatenates the literals into an ArrayLiteral with ArrayLiteral argument concatenates the literals into an ArrayLiteral concatenates the literals into an ArrayLiteral executes index 1 executes index 1 #map_with_index without the index argument returns the resulting array returns the resulting array with both arguments returns the resulting array returns the resulting array without the element argument returns the resulting array returns the resulting array without either argument returns the resulting array returns the resulting array executes identify executes identify executes reduce with no initial value executes reduce with no initial value executes []= executes []= executes sort with numbers executes sort with numbers executes [] with two numbers executes [] with two numbers executes sort with ids executes sort with ids executes splat with symbols and strings executes splat with symbols and strings Crystal::Repl::Interpreter autocast autocasts number literal to float autocasts number literal to float autocasts symbol to enum in multidispatch (#11782) autocasts symbol to enum in multidispatch (#11782) autocasts int in multidispatch autocasts int in multidispatch autocasts integer var to integer (#12560) autocasts integer var to integer (#12560) autocasts symbol to enum autocasts symbol to enum autocasts integer var to float (#12560) autocasts integer var to float (#12560) autocasts number literal to integer autocasts number literal to integer autocasts float32 var to float64 (#12560) autocasts float32 var to float64 (#12560) autocasts symbol to enum in ivar initializer (#12216) autocasts symbol to enum in ivar initializer (#12216) Crystal::Repl::Interpreter multidispatch passes self as pointer when doing multidispatch passes self as pointer when doing multidispatch downcasts self from union to struct (pass pointer to self) downcasts self from union to struct (pass pointer to self) casts multidispatch argument to the def's arg type casts multidispatch argument to the def's arg type initialize multidispatch initialize multidispatch does dispatch on receiver type and argument type does dispatch on receiver type and argument type does multidispatch with captured block (#12217) does multidispatch with captured block (#12217) does dispatch on one argument with block does dispatch on one argument with block does dispatch on one argument inside module with explicit receiver does dispatch on one argument inside module with explicit receiver does dispatch on virtual type does dispatch on virtual type does dispatch on one argument inside module with implicit self does dispatch on one argument inside module with implicit self does multidispatch on virtual metaclass type (1) does multidispatch on virtual metaclass type (1) passes self as pointer when doing multidispatch (2) passes self as pointer when doing multidispatch (2) does dispatch on one argument with struct receiver, and modifies it does dispatch on one argument with struct receiver, and modifies it does dispatch on receiver type and argument type, multiple times does dispatch on receiver type and argument type, multiple times doesn't compile block if it's not used (no yield) doesn't compile block if it's not used (no yield) does dispatch on one argument does dispatch on one argument does multidispatch with mandatory named arguments does multidispatch with mandatory named arguments does multidispatch on virtual metaclass type (2) does multidispatch on virtual metaclass type (2) does dispatch on receiver type does dispatch on receiver type Crystal::Repl::Interpreter integration does Float64#to_s (simple) does Float64#to_s (simple) does CSV does CSV does IO.pipe (checks that StaticArray is passed correctly to C calls) does IO.pipe (checks that StaticArray is passed correctly to C calls) does Range#to_a, Array#to_s does Range#to_a, Array#to_s does YAML::Serializable does YAML::Serializable does Float64#to_s (complex) does Float64#to_s (complex) does caller does caller does XML does XML does JSON::Serializable does JSON::Serializable does YAML does YAML does JSON does JSON does some Hash methods does some Hash methods does String#includes? does String#includes? does Int32#to_s does Int32#to_s Semantic: previous_def types previous def with forwarded arguments, def has parameters types previous def with forwarded arguments, def has parameters types previous def in generic class types previous def in generic class types previous def with named arguments, def has bare splat parameter (2) (#8895) types previous def with named arguments, def has bare splat parameter (2) (#8895) types previous def with named arguments, def has bare splat parameter (#8895) types previous def with named arguments, def has bare splat parameter (#8895) types previous def when inside fun and forwards args types previous def when inside fun and forwards args errors if there's no previous def errors if there's no previous def types previous def with forwarded arguments, different internal names (#8895) types previous def with forwarded arguments, different internal names (#8895) types previous def with explicit arguments types previous def with explicit arguments types previous def with forwarded arguments, def has bare splat parameter (#8895) types previous def with forwarded arguments, def has bare splat parameter (#8895) types previous def when inside fun types previous def when inside fun types previous def types previous def types previous def with named arguments, def has double splat parameter (#8895) types previous def with named arguments, def has double splat parameter (#8895) types previous def with restrictions types previous def with restrictions says wrong number of arguments for previous_def (#1223) says wrong number of arguments for previous_def (#1223) Semantic: private doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) can use class var initializer in private type can use class var initializer in private type doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) finds private class in macro expansion finds private class in macro expansion doesn't find module private macro outside the module doesn't find module private macro outside the module doesn't find private class from outside namespace, long name (#8831) doesn't find private class from outside namespace, long name (#8831) doesn't find private constant from outside namespace, long name (#8831) doesn't find private constant from outside namespace, long name (#8831) doesn't find private class defined through macro (#8715) doesn't find private class defined through macro (#8715) doesn't find private constant in another file (#7850) doesn't find private constant in another file (#7850) doesn't find private thing defined through recursive macro (#8715) doesn't find private thing defined through recursive macro (#8715) finds private type in same file finds private type in same file can use instance var initializer in private type can use instance var initializer in private type doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) doesn't find private module from outside namespace doesn't find private module from outside namespace finds private def in same file finds private def in same file doesn't find private lib from outside namespace doesn't find private lib from outside namespace doesn't find private alias in another file doesn't find private alias in another file doesn't inherit visibility from class node in macro hook (#8794) doesn't inherit visibility from class node in macro hook (#8794) doesn't find private module from outside namespace, long name (#8831) doesn't find private module from outside namespace, long name (#8831) doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) gives private constant error in macro gives private constant error in macro doesn't find private alias from outside namespace doesn't find private alias from outside namespace doesn't find private class from outside namespace doesn't find private class from outside namespace finds private macro in same file finds private macro in same file doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) doesn't define private module with global type name doesn't define private module with global type name doesn't define private enum with global type name doesn't define private enum with global type name doesn't define private constant with global type name doesn't define private constant with global type name finds private macro in same file, invoking from another macro (#1265) finds private macro in same file, invoking from another macro (#1265) can use types in private type can use types in private type doesn't define private class with global type name doesn't define private class with global type name doesn't define private lib with global type name doesn't define private lib with global type name types private def correctly types private def correctly doesn't find private enum from outside namespace, long name (#8831) doesn't find private enum from outside namespace, long name (#8831) doesn't find private enum from outside namespace doesn't find private enum from outside namespace doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) find module private macro inside a module, which is inherited by the module find module private macro inside a module, which is inherited by the module finds private type from inside namespace in subclass finds private type from inside namespace in subclass doesn't find private module defined through macro (#8715) doesn't find private module defined through macro (#8715) finds private def when invoking from inside macro (#2082) finds private def when invoking from inside macro (#2082) doesn't find private lib from outside namespace, long name (#8831) doesn't find private lib from outside namespace, long name (#8831) doesn't find private constant from outside namespace doesn't find private constant from outside namespace doesn't find private def in another file doesn't find private def in another file doesn't find private class in another file doesn't find private class in another file doesn't find private def defined in macro in another file (#7681) doesn't find private def defined in macro in another file (#7681) doesn't find private macro defined through macro (#8715) doesn't find private macro defined through macro (#8715) doesn't define private alias with global type name doesn't define private alias with global type name doesn't find private alias from outside namespace, long name (#8831) doesn't find private alias from outside namespace, long name (#8831) doesn't find private macro in another file doesn't find private macro in another file finds private def in same file that invokes another def finds private def in same file that invokes another def find module private macro inside the module find module private macro inside the module finds private type from inside namespace finds private type from inside namespace Semantic: yield with scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope doesn't explode if specifying &block but never using it (#181) doesn't explode if specifying &block but never using it (#181) uses method of with object uses method of with object it uses self for instance method it uses self for instance method it uses self for instance method it uses self for instance method it uses self for instance method it uses self for instance method it uses self for instance method it uses self for instance method it uses self for instance method it uses self for instance method uses scope in global method uses scope in global method uses scope in global method uses scope in global method uses scope in global method uses scope in global method uses scope in global method uses scope in global method uses scope in global method uses scope in global method generate right code when yielding struct as scope generate right code when yielding struct as scope yields virtual type (#2171) (2) yields virtual type (#2171) (2) yields with dispatch (#2171) (1) yields with dispatch (#2171) (1) uses instance variable of enclosing scope uses instance variable of enclosing scope uses scope in instance method uses scope in instance method uses scope in instance method uses scope in instance method uses scope in instance method uses scope in instance method uses scope in instance method uses scope in instance method uses scope in instance method uses scope in instance method uses method of enclosing scope uses method of enclosing scope Codegen: super calls super with dispatch (#2318) calls super with dispatch (#2318) calls super on an object (#10004) calls super on an object (#10004) codegens super that calls subclass method 5 codegens super that calls subclass method 5 codegens super that calls subclass method 3 codegens super that calls subclass method 3 codegens super that calls subclass method 2 codegens super that calls subclass method 2 calls super in module method (#556) calls super in module method (#556) calls super in generic module method calls super in generic module method calls super from virtual metaclass type (#2841) calls super from virtual metaclass type (#2841) codegens super without arguments codegens super without arguments codegens super without arguments but parent has arguments codegens super without arguments but parent has arguments does super in virtual type including module does super in virtual type including module doesn't invoke super twice in inherited generic types (#942) doesn't invoke super twice in inherited generic types (#942) codegens super that calls subclass method codegens super that calls subclass method codegens super that calls subclass method 6 codegens super that calls subclass method 6 build super on generic class (bug) build super on generic class (bug) codegens super inside closure forwarding args codegens super inside closure forwarding args calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) calls super in metaclass (#1522) codegens super inside closure codegens super inside closure codegens super without arguments and instance variable codegens super without arguments and instance variable codegens super that calls subclass method 4 codegens super that calls subclass method 4 Semantic: lib passes int as another integer type in variable passes int as another integer type in variable types fun returning nothing as nil types fun returning nothing as nil defines lib funs before funs with body defines lib funs before funs with body allows dll argument allows dll argument errors if invoking to_i32! and got wrong type errors if invoking to_i32! and got wrong type types fun returning void as nil types fun returning void as nil reports redefinition of fun with different signature reports redefinition of fun with different signature errors if CallConvention argument is not a valid string errors if CallConvention argument is not a valid string errors if unknown named arg errors if unknown named arg errors if lib fun call is part of dispatch errors if lib fun call is part of dispatch errors if wrong number of arguments for CallConvention errors if wrong number of arguments for CallConvention errors if defining incompatible funs with the same name in different libs (#3045) errors if defining incompatible funs with the same name in different libs (#3045) raises wrong argument type raises wrong argument type errors if using void via typedef as parameter (related to #508) errors if using void via typedef as parameter (related to #508) specifies a call convention to a lib specifies a call convention to a lib reports error when changing var type and something breaks reports error when changing var type and something breaks raises wrong number of arguments raises wrong number of arguments specifies a call convention specifies a call convention can use tuple as fun return can use tuple as fun return passes int as another integer type with literal passes int as another integer type with literal errors if fourth argument is not a bool errors if fourth argument is not a bool allows invoking out with underscore allows invoking out with underscore errors if using out with varargs errors if using out with varargs reopens lib and adds more link annotations reopens lib and adds more link annotations can use out with named args can use out with named args defined fun with aliased type defined fun with aliased type gathers link annotations from macro expression gathers link annotations from macro expression types lib var set types lib var set can use macros inside lib can use macros inside lib doesn't try to invoke unsafe for c struct/union (#1362) doesn't try to invoke unsafe for c struct/union (#1362) errors if missing link arguments errors if missing link arguments can use macros inside struct can use macros inside struct errors if missing argument errors if missing argument warns if @[Link(static: true)] is specified warns if @[Link(static: true)] is specified raises on undefined fun raises on undefined fun types fun returning nil as nil types fun returning nil as nil errors if lib already specified with positional argument errors if lib already specified with positional argument supports forward references with struct inside struct (#399) supports forward references with struct inside struct (#399) errors if too many link arguments errors if too many link arguments correctly attached link flags if there's a macro if correctly attached link flags if there's a macro if reports error on fun argument type not primitive like reports error on fun argument type not primitive like errors if using out with non-pointer errors if using out with non-pointer types lib var get with forward declaration types lib var get with forward declaration disallows passing nil or pointer to arg expecting pointer disallows passing nil or pointer to arg expecting pointer errors if defines def on lib errors if defines def on lib errors if dll argument does not end with '.dll' errors if dll argument does not end with '.dll' errors if third argument is not a bool errors if third argument is not a bool reports error on fun argument type not primitive like, Nil (#2994) reports error on fun argument type not primitive like, Nil (#2994) reopens lib and adds same link annotations reopens lib and adds same link annotations clears annotations after lib clears annotations after lib allows passing double splat to LibC fun allows passing double splat to LibC fun passes float as another integer type in variable passes float as another integer type in variable error if passing type to LibC with to_unsafe but type doesn't match error if passing type to LibC with to_unsafe but type doesn't match supports forward references (#399) supports forward references (#399) errors if using out with void pointer (#2424) errors if using out with void pointer (#2424) errors if using unknown named param errors if using unknown named param errors if invoking to_i32! and got error in that call errors if invoking to_i32! and got error in that call allows passing splat to LibC fun allows passing splat to LibC fun errors if CallConvention argument is not a string errors if CallConvention argument is not a string error if passing non primitive type as varargs invoking to_unsafe error if passing non primitive type as varargs invoking to_unsafe reports error on struct field type not primitive like reports error on struct field type not primitive like overrides definition of fun overrides definition of fun reports error if using out with an already declared variable reports error if using out with an already declared variable errors if parameter already specified errors if parameter already specified types lib var get types lib var get can list lib functions at the top level (#12395) can list lib functions at the top level (#12395) errors if using named args with variadic function errors if using named args with variadic function reports error when changing instance var type and something breaks reports error when changing instance var type and something breaks error if passing non primitive type as varargs error if passing non primitive type as varargs types a varargs external types a varargs external errors if second argument is not a string errors if second argument is not a string errors if missing arguments errors if missing arguments errors if defining incompatible funs with the same name in the same lib (#3045) errors if defining incompatible funs with the same name in the same lib (#3045) reports error on typedef type not primitive like reports error on typedef type not primitive like allows invoking lib call without obj inside lib allows invoking lib call without obj inside lib errors if passing void lib call to call argument (#4414) errors if passing void lib call to call argument (#4414) reports error out can only be used with lib funs reports error out can only be used with lib funs reports error out can only be used with lib funs in named argument reports error out can only be used with lib funs in named argument can use named args can use named args errors if dll argument contains directory separators errors if dll argument contains directory separators warns if Link annotations use positional arguments warns if Link annotations use positional arguments errors if lib named arg is not a String errors if lib named arg is not a String errors if redefining fun with different signature (#2468) errors if redefining fun with different signature (#2468) errors if using out with void pointer through type errors if using out with void pointer through type errors if using void as parameter (related to #508) errors if using void as parameter (related to #508) errors if first argument is not a string errors if first argument is not a string reports error on fun return type not primitive like reports error on fun return type not primitive like errors if assigning void lib call to var (#4414) errors if assigning void lib call to var (#4414) Crystal::Doc::Type ASTNode has no superclass ASTNode has no superclass #class_methods sorts operators first sorts operators first doesn't show types for alias type doesn't show types for alias type #instance_methods sorts operators first sorts operators first ASTNode has no ancestors ASTNode has no ancestors #macros sorts operators first sorts operators first finds construct when searching class method (#8095) finds construct when searching class method (#8095) #node_to_html shows relative generic shows relative generic shows generic path with unnecessary colons shows generic path with unnecessary colons shows named tuples shows named tuples shows tuples shows tuples shows relative path shows relative path shows generic path with necessary colons shows generic path with necessary colons Code gen: experimental errors if missing link arguments errors if missing link arguments compiles with no argument compiles with no argument errors if too many arguments errors if too many arguments compiles with single string argument compiles with single string argument errors if invalid argument type errors if invalid argument type Code gen: uninitialized doesn't break on inherited declared var (#390) doesn't break on inherited declared var (#390) codegens declare var and changes it codegens declare var and changes it works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) codegens declare var and read it codegens declare var and read it codegens declare instance var with static array type codegens declare instance var with static array type works with uninitialized NoReturn (#3314) works with uninitialized NoReturn (#3314) codegens value (#3641) codegens value (#3641) codegens declare instance var codegens declare instance var Semantic: primitives types an int32 types an int32 can invoke binary on primitive typedef (#614) can invoke binary on primitive typedef (#614) types pointer of int types pointer of int types 1 + 2 types 1 + 2 Reference.pre_initialize errors on abstract type errors on abstract type types with reference type types with reference type errors on uninstantiated generic type errors on uninstantiated generic type types with virtual reference type types with virtual reference type types va_arg primitive types va_arg primitive types char ord types char ord types nil types nil types a uint128 types a uint128 types a char types a char types a string types a string types a float64 types a float64 extends from Number and doesn't find to_i method extends from Number and doesn't find to_i method can invoke binary on primitive typedef (2) (#614) can invoke binary on primitive typedef (2) (#614) allows @[Primitive] on method that has body allows @[Primitive] on method that has body errors if @[Primitive] has no args errors if @[Primitive] has no args types a bool types a bool types a symbol types a symbol computes correct hash value type if it's a function literal (#320) computes correct hash value type if it's a function literal (#320) errors if using instance variable inside primitive type errors if using instance variable inside primitive type extends from Number and doesn't find + method extends from Number and doesn't find + method types a float32 types a float32 types @[Primitive] method types @[Primitive] method Slice.literal with element type errors if element is out of range errors if element is out of range types primitive float literal types primitive float literal errors if element type is not primitive int or float errors if element type is not primitive int or float types primitive int literal types primitive int literal types empty literal types empty literal errors if element is not number literal errors if element is not number literal correctly types first hash from type vars (bug) correctly types first hash from type vars (bug) types a int128 types a int128 types a int64 types a int64 looks up return type in correct scope (#13652) looks up return type in correct scope (#13652) errors when comparing void (#225) errors when comparing void (#225) types nop types nop extends from Number and doesn't find >= method extends from Number and doesn't find >= method types an expression types an expression errors if @[Primitive] has non-symbol arg errors if @[Primitive] has non-symbol arg can invoke cast on primitive typedef (#614) can invoke cast on primitive typedef (#614) Crystal::JSONHierarchyPrinter works works Semantic: method_missing does error in method_missing if wrong number of params does error in method_missing if wrong number of params errors if method_missing expands to an incorrect method errors if method_missing expands to an incorrect method doesn't look up method_missing in with_yield_scope if call has a receiver (#12097) doesn't look up method_missing in with_yield_scope if call has a receiver (#12097) errors if method_missing expands to multiple methods errors if method_missing expands to multiple methods finds method_missing with 'with ... yield' finds method_missing with 'with ... yield' does method missing for generic type does method missing for generic type does error in method_missing macro with virtual type does error in method_missing macro with virtual type Codegen: const inlines simple const inlines simple const constants with expression constants with expression codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct supports storing function returning nil supports storing function returning nil gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class gets pointerof constant inside class declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order inlines const with math inlines const with math inlines bool const inlines bool const allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) allows implicit self in constant, called from another class (bug) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) works with variable declared inside if works with variable declared inside if works with variable declared inside if works with variable declared inside if works with variable declared inside if works with variable declared inside if works with variable declared inside if works with variable declared inside if works with variable declared inside if works with variable declared inside if support constant inside a def support constant inside a def initializes simple const via another const initializes simple const via another const define a constant define a constant declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var finds nearest constant first finds nearest constant first uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant gets pointerof complex constant supports closured vars inside initializers (#10474) supports closured vars inside initializers (#10474) inlines enum value inlines enum value doesn't crash if constant is used, but class is never instantiated (#1106) doesn't crash if constant is used, but class is never instantiated (#1106) invokes block in const invokes block in const invokes block in const invokes block in const invokes block in const invokes block in const invokes block in const invokes block in const invokes block in const invokes block in const codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name codegens two consts with same variable name synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants codegens constant that is declared later because of virtual dispatch codegens constant that is declared later because of virtual dispatch initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception initialize const that might raise an exception finds global constant finds global constant initializes ARGC_UNSAFE initializes ARGC_UNSAFE inlines char const inlines char const allows constants with same name allows constants with same name initializes simple const initializes simple const support nested constant support nested constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) inlines const referencing another const inlines const referencing another const define a constant in lib define a constant in lib codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const codegens variable assignment in const Normalize: proc pointer normalizes proc pointer with ivar receiver normalizes proc pointer with ivar receiver normalizes proc pointer with cvar receiver normalizes proc pointer with cvar receiver normalizes proc pointer with variable receiver normalizes proc pointer with variable receiver normalizes proc pointer of global call normalizes proc pointer of global call normalizes proc pointer without object normalizes proc pointer without object normalizes proc pointer with parameters, without object normalizes proc pointer with parameters, without object normalizes proc pointer with const receiver normalizes proc pointer with const receiver normalizes proc pointer with global const receiver normalizes proc pointer with global const receiver Semantic: named args sends two regular arguments as named arguments sends two regular arguments as named arguments errors if missing one argument errors if missing one argument sends two regular arguments as named arguments in inverted position (2) sends two regular arguments as named arguments in inverted position (2) gives correct error message for missing args after * gives correct error message for missing args after * doesn't fail on named argument with NoReturn type (#7760) doesn't fail on named argument with NoReturn type (#7760) allows named arg if there's a splat allows named arg if there's a splat errors if named arg already specified, but multiple overloads (#7281) errors if named arg already specified, but multiple overloads (#7281) errors if named arg not found in new errors if named arg not found in new matches specific overload with named arguments (#2753) matches specific overload with named arguments (#2753) uses bare splat in new uses bare splat in new overloads based on required named args overloads based on required named args errors if named arg matches splat argument errors if named arg matches splat argument errors if named arg matches single splat argument errors if named arg matches single splat argument errors if doesn't pass named arg restriction errors if doesn't pass named arg restriction overloads based on required named args, with restrictions overloads based on required named args, with restrictions gives correct error message with external names (#3934) gives correct error message with external names (#3934) passes #2696 passes #2696 matches specific overload with named arguments (2) (#2753) matches specific overload with named arguments (2) (#2753) doesn't include arguments with default values in missing arguments error doesn't include arguments with default values in missing arguments error errors if named arg not found errors if named arg not found says correct error when forwarding named args (#7491) says correct error when forwarding named args (#7491) says no overload matches with named arg says no overload matches with named arg errors if named arg already specified errors if named arg already specified sends one regular argument as named argument sends one regular argument as named argument sends two regular arguments as named arguments in inverted position (1) sends two regular arguments as named arguments in inverted position (1) errors if missing two arguments errors if missing two arguments errors if named arg already specified but in same position errors if named arg already specified but in same position errors if named arg already specified errors if named arg already specified Crystal::Repl::Interpreter is_a? does is_a? from NilableType to NonGenericClassType (false) does is_a? from NilableType to NonGenericClassType (false) does is_a? from NilableType to NonGenericClassType (true) does is_a? from NilableType to NonGenericClassType (true) does is_a? from VirtualType to NonGenericClassType (true) does is_a? from VirtualType to NonGenericClassType (true) does is_a? from NilableReferenceUnionType to NonGenericClassType (true) does is_a? from NilableReferenceUnionType to NonGenericClassType (true) does is_a? from NilableType to GenericClassInstanceType (true) does is_a? from NilableType to GenericClassInstanceType (true) does is_a? from NilableType to GenericClassInstanceType (false) does is_a? from NilableType to GenericClassInstanceType (false) does is_a? from NilableProcType to non-Nil does is_a? from NilableProcType to non-Nil does is_a? from NilableProcType to Nil does is_a? from NilableProcType to Nil does is_a? from VirtualType to NonGenericClassType (false) does is_a? from VirtualType to NonGenericClassType (false) does is_a? from NilableReferenceUnionType to NonGenericClassType (false) does is_a? from NilableReferenceUnionType to NonGenericClassType (false) context consider different instances of def consider different instances of def does includes args, instance vars, local variables and expressions on instance methods does includes args, instance vars, local variables and expressions on instance methods use type filters from is_a? use type filters from is_a? can display json output can display json output includes block args includes block args includes last call includes last call includes top level vars includes top level vars can get context in generic class can get context in generic class can get context in contained class' class method can get context in contained class' class method can get context inside initialize can get context inside initialize can get context of yielded block can get context of yielded block does not includes temp variables does not includes temp variables can get context of empty def can get context of empty def can handle union types can handle union types can get context inside a module can get context inside a module can get context of empty yielded block can get context of empty yielded block does includes self on classes does includes self on classes use type filters from if var use type filters from if var can get context in file private module can get context in file private module can get context in file private method can get context in file private method includes assignments includes assignments can get context of nested yielded block can get context of nested yielded block does includes regex special variables does includes regex special variables can get context inside class methods can get context inside class methods can't get context from uncalled method can't get context from uncalled method can display text output can display text output includes args includes args Semantic: hooks errors if wrong finished params length errors if wrong finished params length does inherited macro through generic instance type (#9693) does inherited macro through generic instance type (#9693) does not invoke 'method_added' hook recursively does not invoke 'method_added' hook recursively does extended macro does extended macro types macro finished hook bug regarding initialize (#3964) types macro finished hook bug regarding initialize (#3964) errors if wrong extended params length errors if wrong extended params length does inherited macro for generic class does inherited macro for generic class types initializer in inherited types initializer in inherited does inherited macro does inherited macro errors if wrong inherited params size errors if wrong inherited params size errors if wrong included params size errors if wrong included params size includes error message in included hook (#889) includes error message in included hook (#889) does included macro for generic module does included macro for generic module errors if wrong extended params size errors if wrong extended params size does included macro does included macro does added method macro does added method macro Crystal::Doc::Generator .anchor_link generates the correct anchor link generates the correct anchor link Code gen: closure codegens nested closure codegens nested closure transforms block to proc literal transforms block to proc literal codegens closured nested in block codegens closured nested in block doesn't incorrectly consider local as closured (#4948) doesn't incorrectly consider local as closured (#4948) codegens super nested closure codegens super nested closure allows passing proc literal to def that captures block with & allows passing proc literal to def that captures block with & allows mixing yield and block.call allows mixing yield and block.call codegens closure inside initialize inside block with self codegens closure inside initialize inside block with self codegens closure with block codegens closure with block doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self doesn't form a closure if invoking class method with self codegens closure with self and arguments codegens closure with self and arguments codegens nested closure that mentions var in both contexts codegens nested closure that mentions var in both contexts codegens closure with nested context without new closured vars but with block arg codegens closure with nested context without new closured vars but with block arg allows passing block as proc literal to new and to initialize allows passing block as proc literal to new and to initialize codegens closure with def that has an if codegens closure with def that has an if ensures it can raise from the closure check ensures it can raise from the closure check allows giving less block args when transforming block to proc literal allows giving less block args when transforming block to proc literal doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) doesn't free closure memory (bug) codegens closured nested in block with a call with a closure with same names codegens closured nested in block with a call with a closure with same names codegens closure with instance var codegens closure with instance var codegens closure with instance var and var codegens closure with instance var and var codegen closure in instance method without self closured codegen closure in instance method without self closured codegens closure with implicit self and var codegens closure with implicit self and var codegens proc literal with struct codegens proc literal with struct codegens closure with self and var codegens closure with self and var codegens nested closure with nested closured variable codegens nested closure with nested closured variable captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) captures block and accesses local variable (#2050) codegens multiple nested blocks codegens multiple nested blocks doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method doesn't form a closure if invoking class method codegens closure with nested context without new closured vars codegens closure with nested context without new closured vars codegens nested closure with block (1) codegens nested closure with block (1) codegens super nested closure with nested closured variable codegens super nested closure with nested closured variable codegens simple closure in block codegens simple closure in block codegens simple closure in function with argument codegens simple closure in function with argument codegens closured self in block (#3388) codegens closured self in block (#3388) allows passing an external function along (2) allows passing an external function along (2) codegens closure with block that declares same var codegens closure with block that declares same var codegens simple closure at global scope codegens simple closure at global scope allows passing an external function along allows passing an external function along transforms block to proc literal with free var transforms block to proc literal with free var closures struct self closures struct self unifies types of closured var unifies types of closured var codegens closure with nested context without new closured vars codegens closure with nested context without new closured vars codegens closure with instance var and block codegens closure with instance var and block codegens closure with struct codegens closure with struct codegens simple closure in function codegens simple closure in function codegens nested closure with block (2) codegens nested closure with block (2) Normalize: unless normalizes unless normalizes unless Semantic: warnings deprecated annotations detects deprecated namespaced annotations detects deprecated namespaced annotations detects deprecated annotations detects deprecated annotations deprecated methods informs warnings once per call site location (b) informs warnings once per call site location (b) informs warnings once per target type informs warnings once per target type ignore deprecation excluded locations ignore deprecation excluded locations informs warnings once per call site location (a) informs warnings once per call site location (a) informs warnings once per yield informs warnings once per yield detects deprecated class methods detects deprecated class methods detects deprecated generic class methods detects deprecated generic class methods detects top-level deprecated methods detects top-level deprecated methods errors if too many arguments errors if too many arguments ignores nested calls to deprecated methods ignores nested calls to deprecated methods deprecation reason is optional deprecation reason is optional errors if invalid named arguments errors if invalid named arguments errors if invalid argument type errors if invalid argument type detects deprecated initialize with named arguments detects deprecated initialize with named arguments detects deprecated module methods detects deprecated module methods detects deprecated initialize detects deprecated initialize detects deprecated generic instance methods detects deprecated generic instance methods detects deprecated instance methods detects deprecated instance methods detects deprecated methods with named arguments detects deprecated methods with named arguments exposes syntax warnings after macro interpolation exposes syntax warnings after macro interpolation deprecated macros errors if too many arguments errors if too many arguments ignore deprecation excluded locations ignore deprecation excluded locations errors if invalid named argument errors if invalid named argument errors if invalid argument type errors if invalid argument type detects deprecated macros with named arguments detects deprecated macros with named arguments deprecation reason is optional deprecation reason is optional detects deprecated module macros detects deprecated module macros informs warnings once per call site location (a) informs warnings once per call site location (a) detects deprecated generic class macros detects deprecated generic class macros detects top-level deprecated macros detects top-level deprecated macros informs warnings once per call site location (b) informs warnings once per call site location (b) detects deprecated class macros detects deprecated class macros deprecated constants detects deprecated constants in type declarations (3) detects deprecated constants in type declarations (3) detects deprecated constants detects deprecated constants detects deprecated constants inside macros detects deprecated constants inside macros detects deprecated constants in type declarations (2) detects deprecated constants in type declarations (2) detects deprecated constants in type declarations (1) detects deprecated constants in type declarations (1) exposes syntax warnings exposes syntax warnings abstract def positional parameter name mismatch doesn't warn if current type is a module (#12266) doesn't warn if current type is a module (#12266) informs warnings once per matching overload (2) informs warnings once per matching overload (2) stops warning after implementation with matching parameters is found (#12150) exact match exact match reordered named parameters reordered named parameters different single splats different single splats contravariant restrictions contravariant restrictions respects external names of positional parameters (2) respects external names of positional parameters (2) detects mismatch with single parameter detects mismatch with single parameter detects mismatch within many parameters detects mismatch within many parameters doesn't warn if external parameter name matches (2) doesn't warn if external parameter name matches (2) doesn't warn if external parameter name matches (1) doesn't warn if external parameter name matches (1) continues warning if implementation with matching parameters is not found (#12150) not a full implementation not a full implementation double splat double splat single splat single splat respects external names of positional parameters (1) respects external names of positional parameters (1) doesn't compare positional parameters to single splat doesn't compare positional parameters to single splat informs warnings once per matching overload (1) informs warnings once per matching overload (1) detects multiple mismatches detects multiple mismatches doesn't compare single splats doesn't compare single splats doesn't warn if current type is abstract (#12266) doesn't warn if current type is abstract (#12266) .system successful command successful command successful command with output successful command with output sh: line 1: commanddoesnotexist: command not found command does not exist command does not exist failing command failing command Normalize: and normalizes and with variable on the left normalizes and with variable on the left normalizes and with is_a? on var normalizes and with is_a? on var normalizes and without variable normalizes and without variable normalizes and with ! on var.is_a?(...) normalizes and with ! on var.is_a?(...) normalizes and with ! on var normalizes and with ! on var normalizes and with is_a? on exp normalizes and with is_a? on exp normalizes and with assignment normalizes and with assignment Normalize: regex literal options i i x x empty empty imx imx im im Crystal::Repl::Interpreter class vars interprets class var without initializer interprets class var without initializer does class var initializer with union (#12633) does class var initializer with union (#12633) interprets class var for virtual type interprets class var for virtual type finds self in class var initializer (#12439) finds self in class var initializer (#12439) reads class var initializer with union (#12633) reads class var initializer with union (#12633) interprets class var with initializer interprets class var with initializer interprets class var for virtual metaclass type interprets class var for virtual metaclass type Code gen: var works with typeof with assignment (#828) works with typeof with assignment (#828) codegens var with type declaration codegens var with type declaration codegens assignment that can never be reached codegens assignment that can never be reached assigns to underscore assigns to underscore codegens bug with instance vars and ssa codegens bug with instance vars and ssa codegens bug with var, while, if, break and ssa codegens bug with var, while, if, break and ssa codegens ivar assignment when not-nil type filter applies codegens ivar assignment when not-nil type filter applies codegens bug with union of int, nil and string (2): assigning nil to union must fill all zeros codegens bug with union of int, nil and string (2): assigning nil to union must fill all zeros codegens var codegens var codegens bug with union of int, nil and string (1): assigning nil to union must fill all zeros codegens bug with union of int, nil and string (1): assigning nil to union must fill all zeros Code gen: asm passes correct string length to LLVM passes correct string length to LLVM codegens with two inputs codegens with two inputs codegens with intel dialect codegens with intel dialect codegens with one input codegens with one input codegens without inputs codegens without inputs codegens with two outputs codegens with two outputs Crystal::Formatter formats "def foo(x)\n {% if true %}\n x = x + 2\n {% end %}\nend" formats "def foo(x)\n {% if true %}\n x = x + 2\n {% end %}\nend" formats "alias X = (A, B) ->\nbar : C" formats "alias X = (A, B) ->\nbar : C" formats "def /(x)\n 1\nend" formats "def /(x)\n 1\nend" formats "\"\#{foo = 1\n}\"" formats "\"\#{foo = 1\n}\"" formats " {% if 1 %} {% if 2 %} 2 {% end %} {% end %}" formats " {% if 1 %} {% if 2 %} 2 {% end %} {% end %}" formats "" formats "" formats "{\n 1 => 2, 3 => 4,\n 567 => 8910,\n}" formats "{\n 1 => 2, 3 => 4,\n 567 => 8910,\n}" formats "__DIR__" formats "__DIR__" formats "1.=== do\nend" formats "1.=== do\nend" formats "lib Foo\nend" formats "lib Foo\nend" formats "yield *1 , *2" formats "yield *1 , *2" formats "def foo\n 1\nend\n\n# Comment\n\ndef bar\n 2\nend" formats "def foo\n 1\nend\n\n# Comment\n\ndef bar\n 2\nend" formats "->@@foo.foo=" formats "->@@foo.foo=" formats "\n # hello\n\n1" formats "\n # hello\n\n1" formats "asm(\"nop\" : : )" formats "asm(\"nop\" : : )" formats "foo.[] =1" formats "foo.[] =1" formats "[\n # foo\n 1,\n\n # bar\n 2,\n]" formats "[\n # foo\n 1,\n\n # bar\n 2,\n]" formats "{ foo: 1 }" formats "{ foo: 1 }" formats "$?.bar" formats "$?.bar" formats "1" formats "1" formats "a(&.b.c.as C)" formats "a(&.b.c.as C)" formats "foo(A |\nB |\nC)" formats "foo(A |\nB |\nC)" formats "->( x : Int32 , y ) { x }" formats "->( x : Int32 , y ) { x }" formats "foo(\n 1, 2,\n&block)" formats "foo(\n 1, 2,\n&block)" formats "A = 1\nFOO = 2\n\nEX = 3" formats "A = 1\nFOO = 2\n\nEX = 3" formats "->() do x end" formats "->() do x end" formats "def foo(a, &@b)\nend" formats "def foo(a, &@b)\nend" formats "module M\n @[MyAnn(\n 1\n\n )]\nend" formats "module M\n @[MyAnn(\n 1\n\n )]\nend" formats "foo.bar\n.baz" formats "foo.bar\n.baz" formats "foo.bar += \n1" formats "foo.bar += \n1" formats "break { {1, 2}, {3, 4} }, 5" formats "break { {1, 2}, {3, 4} }, 5" formats "if 1 # foo\n2\nend" formats "if 1 # foo\n2\nend" formats ":>>" formats ":>>" formats "foo[ 1 , 2 ] =3" formats "foo[ 1 , 2 ] =3" formats "def foo(\n **a\n # comment\n)\n 1\nend" formats "def foo(\n **a\n # comment\n)\n 1\nend" formats "foo &bar" formats "foo &bar" formats "if 1\n ->{ 1 }\nend" formats "if 1\n ->{ 1 }\nend" formats "@@a" formats "@@a" formats "def foo\n 1\n # Comment\n\n\nend" formats "def foo\n 1\n # Comment\n\n\nend" formats "def foo(@x)\n\nrescue\nend" formats "def foo(@x)\n\nrescue\nend" formats "foo = 1\n->foo.bar=(Int32)" formats "foo = 1\n->foo.bar=(Int32)" formats "x, y = <<-FOO, <<-BAR\n hello\n FOO\n world\n BAR" formats "x, y = <<-FOO, <<-BAR\n hello\n FOO\n world\n BAR" formats "macro foo\n {% if 1 %} 2 {% end %}\nend" formats "macro foo\n {% if 1 %} 2 {% end %}\nend" formats "enum Foo\nA \nend" formats "enum Foo\nA \nend" formats "def foo\n1\nensure\n2\nend" formats "def foo\n1\nensure\n2\nend" formats "a = 1\ndef bar\nend" formats "a = 1\ndef bar\nend" formats "if 1 # foo\nend" formats "if 1 # foo\nend" formats "def a\n b(\n a: 1, # x\n # y\n b: 2\n )\nend" formats "def a\n b(\n a: 1, # x\n # y\n b: 2\n )\nend" formats "foo({\n 1 => 2,\n 3 => {\n 4 => 5,\n },\n})" formats "foo({\n 1 => 2,\n 3 => {\n 4 => 5,\n },\n})" formats "$?" formats "$?" formats "foo &.bar" formats "foo &.bar" formats "\"1\#{\"\#{\"2\"}\"}3\#{\"4\"}5\"" formats "\"1\#{\"\#{\"2\"}\"}3\#{\"4\"}5\"" formats "return 1\n# end" formats "return 1\n# end" formats "Union(Foo::Bar?, Baz?, Qux(T, U?))" formats "Union(Foo::Bar?, Baz?, Qux(T, U?))" formats "あ.い, う.え.お = 1, 2" formats "あ.い, う.え.お = 1, 2" formats "a = 1 if 1 == 2 ||\n 3 == 4\n" formats "a = 1 if 1 == 2 ||\n 3 == 4\n" formats "def foo\n 1 #\nrescue\nend" formats "def foo\n 1 #\nrescue\nend" formats "if 1\n2 # foo\nend" formats "if 1\n2 # foo\nend" formats "foo(1,\n &.bar)" formats "foo(1,\n &.bar)" formats "def func # comment\n (1 + 2) / 3\nend" formats "def func # comment\n (1 + 2) / 3\nend" formats "lib Bar\n enum Foo\n end\nend" formats "lib Bar\n enum Foo\n end\nend" formats "->Foo.foo" formats "->Foo.foo" formats "case 1\nwhen 2\n#comment\nend" formats "case 1\nwhen 2\n#comment\nend" formats "a-1" formats "a-1" formats "a &.b.c.as C" formats "a &.b.c.as C" formats "@[Foo( 1, 2 )]" formats "@[Foo( 1, 2 )]" formats "macro foo\n %foo{x,y}\nend" formats "macro foo\n %foo{x,y}\nend" formats ":&*" formats ":&*" formats "(size - 1).downto(0) do |i|\n yield @buffer[i]\nend" formats "(size - 1).downto(0) do |i|\n yield @buffer[i]\nend" formats "alias Foo= Bar" formats "alias Foo= Bar" formats "class Foo < \n Bar \n\n 1 \n\nend" formats "class Foo < \n Bar \n\n 1 \n\nend" formats "x = {% if flag?(:foo) %}\n foo + bar\n {% else %}\n baz + qux\n {% end %}" formats "x = {% if flag?(:foo) %}\n foo + bar\n {% else %}\n baz + qux\n {% end %}" formats "if 1\nif 2\n3 # foo\nend\nend" formats "if 1\nif 2\n3 # foo\nend\nend" formats "foo(bar([\n 1,\n]))" formats "foo(bar([\n 1,\n]))" formats "<<-HTML\n \#{__FILE__}\n HTML" formats "<<-HTML\n \#{__FILE__}\n HTML" formats "long_variable_name = [{\n :foo => 1,\n}, {\n :bar => 2,\n}]" formats "long_variable_name = [{\n :foo => 1,\n}, {\n :bar => 2,\n}]" formats "x : A?" formats "x : A?" formats "def foo(@[MyAnn] v); end" formats "def foo(@[MyAnn] v); end" formats " .. 2" formats " .. 2" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n\n @[MyAnn] @[MyAnn] baz,\n\n @[MyAnn]\n @[MyAnn]\n biz\n); end" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n\n @[MyAnn] @[MyAnn] baz,\n\n @[MyAnn]\n @[MyAnn]\n biz\n); end" formats "[\n 1, # foo\n 3,\n]" formats "[\n 1, # foo\n 3,\n]" formats "def foo(x, *, z)\nend" formats "def foo(x, *, z)\nend" formats "1.>= do\nend" formats "1.>= do\nend" formats "class Foo\n1\n\n# foo\nend" formats "class Foo\n1\n\n# foo\nend" formats "bar = foo(->{\n 1 + 2\n})" formats "bar = foo(->{\n 1 + 2\n})" formats "case 1\nwhen 1 then\n2\nwhen 3\n4\nend" formats "case 1\nwhen 1 then\n2\nwhen 3\n4\nend" formats "unless a\n2\nelse\nend" formats "unless a\n2\nelse\nend" formats "lib Foo\n fun foo =\n \"bar\"(Int32) : Int32\n # comment\nend" formats "lib Foo\n fun foo =\n \"bar\"(Int32) : Int32\n # comment\nend" formats "foo.[] = 1" formats "foo.[] = 1" formats "select \n when foo \n 2 \n else \n 3 \n end" formats "select \n when foo \n 2 \n else \n 3 \n end" formats "foo &.bar.nil?()" formats "foo &.bar.nil?()" formats "def foo(**a,)\n 1\nend" formats "def foo(**a,)\n 1\nend" formats "<<-HTML\n \#{1}x\n HTML" formats "<<-HTML\n \#{1}x\n HTML" formats "def foo(a : T, b : U) forall T, U #\n #\nend" formats "def foo(a : T, b : U) forall T, U #\n #\nend" formats "case 1 \n when 2 ;\n 3 \n end" formats "case 1 \n when 2 ;\n 3 \n end" formats " <<-EOF\n 1\n 2\n EOF" formats " <<-EOF\n 1\n 2\n EOF" formats "1\n.as(Int32)" formats "1\n.as(Int32)" formats "foo(1, 2,\n)" formats "foo(1, 2,\n)" formats "if 1\n [\n 1,\n ].none?\nend" formats "if 1\n [\n 1,\n ].none?\nend" formats "x : {\"foo bar\": Int32}" formats "x : {\"foo bar\": Int32}" formats "def foo\n # Comment\n\n\nend" formats "def foo\n # Comment\n\n\nend" formats "->Foo.foo?" formats "->Foo.foo?" formats "[/ /, / /]" formats "[/ /, / /]" formats "bla.select(&.all?{ |x| x } )" formats "bla.select(&.all?{ |x| x } )" formats "1 if nil?\na.b + c" formats "1 if nil?\na.b + c" formats "foo . is_a? Bar" formats "foo . is_a? Bar" formats "String???" formats "String???" formats "foo((1..3))" formats "foo((1..3))" formats "instance_sizeof( Int32 )" formats "instance_sizeof( Int32 )" formats "1.<= { 3 }" formats "1.<= { 3 }" formats "[1,\n2,\n3\n]" formats "[1,\n2,\n3\n]" formats "class Foo\n macro foo\n 1 + 2 \n end\n end" formats "class Foo\n macro foo\n 1 + 2 \n end\n end" formats "class Actor\n macro inherited\nend\nend\n" formats "class Actor\n macro inherited\nend\nend\n" formats "lib Foo\nfun foo(x : Int32, y : Float64) : Int32\nend" formats "lib Foo\nfun foo(x : Int32, y : Float64) : Int32\nend" formats "\"\#{\n foo = 1\n}\"" formats "\"\#{\n foo = 1\n}\"" formats "with foo yield bar" formats "with foo yield bar" formats "foo x: 1" formats "foo x: 1" formats "1 ? 2 : 3" formats "1 ? 2 : 3" formats "module Moo \n\n 1 \n\nend" formats "module Moo \n\n 1 \n\nend" formats "lib Foo\nfun foo(x : Int32,\ny : Float64) : Int32\nend" formats "lib Foo\nfun foo(x : Int32,\ny : Float64) : Int32\nend" formats "1 # foo\n2 # bar" formats "1 # foo\n2 # bar" formats "class Foo; 1; end" formats "class Foo; 1; end" formats "foo(\n 1, 2)" formats "foo(\n 1, 2)" formats "def foo(x)\n self // x\nend" formats "def foo(x)\n self // x\nend" formats "enum Foo\nend" formats "enum Foo\nend" formats "1 # foo" formats "1 # foo" formats "break *1 ,2" formats "break *1 ,2" formats "nil?" formats "nil?" formats "alias Foo::Bar =Baz" formats "alias Foo::Bar =Baz" formats "\"\" + <<-END\n bar\n END" formats "\"\" + <<-END\n bar\n END" formats "->( x , y ) { x }" formats "->( x , y ) { x }" formats "{% if z %}\n 1\n{% end %}\n\ndef foo\n z =\n 123 + # foo\n 4 # bar\n\n 1\nend" formats "{% if z %}\n 1\n{% end %}\n\ndef foo\n z =\n 123 + # foo\n 4 # bar\n\n 1\nend" formats "1\n.as?(Int32)" formats "1\n.as?(Int32)" formats "case 1\nwhen \"foo\" then 3\nwhen \"lalalala\" then 4\nelse 5\nend" formats "case 1\nwhen \"foo\" then 3\nwhen \"lalalala\" then 4\nelse 5\nend" formats "macro foo\n {% for x in y %} 2 {% end %}\nend" formats "macro foo\n {% for x in y %} 2 {% end %}\nend" formats "{% if true %}\n <<-FOO\n hello \n FOO\n{% end %}" formats "{% if true %}\n <<-FOO\n hello \n FOO\n{% end %}" formats "begin\n array[\n 0, # Zero\n ]\nend" formats "begin\n array[\n 0, # Zero\n ]\nend" formats "a &.!" formats "a &.!" formats "a+1" formats "a+1" formats "def +(x)\nend" formats "def +(x)\nend" formats "def foo (\nx ,\n y ) \n end" formats "def foo (\nx ,\n y ) \n end" formats "foo.%(bar)" formats "foo.%(bar)" formats "if 1\n2\nelsif\n3\n4\nend" formats "if 1\n2\nelsif\n3\n4\nend" formats "Hash{\n foo => <<-EOF,\n foo\n EOF\n}" formats "Hash{\n foo => <<-EOF,\n foo\n EOF\n}" formats "foo do\n {1 => foo <<-X\n bar\n X\n }\nend" formats "foo do\n {1 => foo <<-X\n bar\n X\n }\nend" formats "foo ((1) ? 2 : 3)" formats "foo ((1) ? 2 : 3)" formats "foo.bar # comment\n .baz" formats "foo.bar # comment\n .baz" formats "def foo(\n @[MyAnn] bar\n); end" formats "def foo(\n @[MyAnn] bar\n); end" formats "enum Foo\nA = 1\nend" formats "enum Foo\nA = 1\nend" formats "macro foo\n {%1 + 2%}\\\nend" formats "macro foo\n {%1 + 2%}\\\nend" formats "foo do;\n1; end" formats "foo do;\n1; end" formats "<<-FOO\nfoobar\nFOO" formats "<<-FOO\nfoobar\nFOO" formats "enum Foo : Int32\nA = 1\ndef foo\n1\nend\nend" formats "enum Foo : Int32\nA = 1\ndef foo\n1\nend\nend" formats "def foo ( ) \n1\nend" formats "def foo ( ) \n1\nend" formats "select\nwhen foo # foo\n # bar\nelse # foo\n # bar\nend" formats "select\nwhen foo # foo\n # bar\nelse # foo\n # bar\nend" formats "x = 1\nx += 1" formats "x = 1\nx += 1" formats "foo : Foo*****" formats "foo : Foo*****" formats "class Foo\n def foo\n # nothing\n end\nend" formats "class Foo\n def foo\n # nothing\n end\nend" formats "a &.!.!" formats "a &.!.!" formats "<<-HTML\n \#{1}x\n y\n HTML" formats "<<-HTML\n \#{1}x\n y\n HTML" formats "[] of Int32\n1" formats "[] of Int32\n1" formats "/ /" formats "/ /" formats "@x[ 1 ] ||= 2" formats "@x[ 1 ] ||= 2" formats "foo : (String -> String?) | (String)" formats "foo : (String -> String?) | (String)" formats ":&+" formats ":&+" formats ":&**" formats ":&**" formats "foo{|x| x}" formats "foo{|x| x}" formats "{\n variables => true,\n query => <<-HEREDOC,\n foo\n HEREDOC\n}" formats "{\n variables => true,\n query => <<-HEREDOC,\n foo\n HEREDOC\n}" formats "yield (1).foo" formats "yield (1).foo" formats "unless a\nunless b\n3\nelse\n4\nend\nend" formats "unless a\nunless b\n3\nelse\n4\nend\nend" formats "case 1\nelse\n 2\nend" formats "case 1\nelse\n 2\nend" formats "foo &.as(T)" formats "foo &.as(T)" formats "[1, 2, 3] of Foo" formats "[1, 2, 3] of Foo" formats "select \n when foo ; 2 \n end" formats "select \n when foo ; 2 \n end" formats "# ```\n# macro foo\n# 1\n# end\n# ```\n" formats "# ```\n# macro foo\n# 1\n# end\n# ```\n" formats "a = while 1\n2\nend" formats "a = while 1\n2\nend" formats "lib LibFoo\n {% begin %}\n fun x = y(Int32)\n {% end %}\nend" formats "lib LibFoo\n {% begin %}\n fun x = y(Int32)\n {% end %}\nend" formats "if 1\n# nothing\nend" formats "if 1\n# nothing\nend" formats "def foo(\n @[MyAnn]\n bar\n); end" formats "def foo(\n @[MyAnn]\n bar\n); end" formats "getter foo : Int32 # comment\n\ndef foo\nend" formats "getter foo : Int32 # comment\n\ndef foo\nend" formats "def run\n\nrescue\n 2\n 3\nend" formats "def run\n\nrescue\n 2\n 3\nend" formats "foo(\n 1,\n # 2,\n 3,\n)" formats "foo(\n 1,\n # 2,\n 3,\n)" formats "lib Foo\nstruct Foo\nx , y , z : Int32\nend\nend" formats "lib Foo\nstruct Foo\nx , y , z : Int32\nend\nend" formats "return { 1 , 2 }" formats "return { 1 , 2 }" formats "\"foo\" \\\n \"bar\" \\\n \"baz\"" formats "\"foo\" \\\n \"bar\" \\\n \"baz\"" formats "#######" formats "#######" formats "foo(\n1,\n\n 2 \n)" formats "foo(\n1,\n\n 2 \n)" formats "as? Foo" formats "as? Foo" formats "foo({\n 1 => 2,\n 3 => 4,\n 5 => 6,\n})" formats "foo({\n 1 => 2,\n 3 => 4,\n 5 => 6,\n})" formats "unless a\nelse\n2\nend" formats "unless a\nelse\n2\nend" formats "def a\n b(\n 1, # x\n # y\n )\nend" formats "def a\n b(\n 1, # x\n # y\n )\nend" formats "->do\nend" formats "->do\nend" formats "foo 1" formats "foo 1" formats "$1?" formats "$1?" formats "asm(\"a\" : \"b\"(c)\n)" formats "asm(\"a\" : \"b\"(c)\n)" formats "begin\n 1 + \\\n 2\n 3\nend" formats "begin\n 1 + \\\n 2\n 3\nend" formats "<<-HTML\n foo\n \#{\"foo\"}\n HTML" formats "<<-HTML\n foo\n \#{\"foo\"}\n HTML" formats "->{}" formats "->{}" formats "foo 1, a: 1,\nb: 2,\nc: 3" formats "foo 1, a: 1,\nb: 2,\nc: 3" formats "foo.% bar" formats "foo.% bar" formats "if a\n2\nend" formats "if a\n2\nend" formats "foo(\n <<-HERE,\n hello\n HERE\n # foo\n foo: 1,\n)" formats "foo(\n <<-HERE,\n hello\n HERE\n # foo\n foo: 1,\n)" formats "enum Foo\n {% begin %}\n A\n B\n C\n {% end %}\nend" formats "enum Foo\n {% begin %}\n A\n B\n C\n {% end %}\nend" formats "foo \"bar\": 1, \"baz qux\": 2" formats "foo \"bar\": 1, \"baz qux\": 2" formats "foo.\nbar" formats "foo.\nbar" formats "<<-HTML\n \#{\"foo\"}\#{1}\n HTML" formats "<<-HTML\n \#{\"foo\"}\#{1}\n HTML" formats "enum Foo\n A = 10\n FOO = 123\n BARBAZ = 1234\nend\n" formats "enum Foo\n A = 10\n FOO = 123\n BARBAZ = 1234\nend\n" formats "-> :: foo=" formats "-> :: foo=" formats "module Foo\n1\n\n# foo\nend" formats "module Foo\n1\n\n# foo\nend" formats "select \n when foo \n 2 \n end" formats "select \n when foo \n 2 \n end" formats "x : Int32**" formats "x : Int32**" formats "Foo( )" formats "Foo( )" formats "if 1\nbegin\n2\nensure\n3\nend\nend" formats "if 1\nbegin\n2\nensure\n3\nend\nend" formats "case nil\nelse nil; nil\n# comment\nend" formats "case nil\nelse nil; nil\n# comment\nend" formats "x = a do\n 1 ||\n 2\nend" formats "x = a do\n 1 ||\n 2\nend" formats "foo.[]" formats "foo.[]" formats " 1" formats " 1" formats "foo : (A -> B)\nbar : C" formats "foo : (A -> B)\nbar : C" formats "[c.x]\n .foo" formats "[c.x]\n .foo" formats " {%\na = 1 %}" formats " {%\na = 1 %}" formats "case 1 \n when 2 ; 3 \n when 4 ; 5\nend" formats "case 1 \n when 2 ; 3 \n when 4 ; 5\nend" formats "a = if 1\n2\n3\nend" formats "a = if 1\n2\n3\nend" formats "0_u64" formats "0_u64" formats "x : (A -> )" formats "x : (A -> )" formats "[\n1,\n2,\n3]" formats "[\n1,\n2,\n3]" formats " ( 1; 2; 3 ) " formats " ( 1; 2; 3 ) " formats "foo { | ( a, *b , c ) | a }" formats "foo { | ( a, *b , c ) | a }" formats "foo{|x|\n x}" formats "foo{|x|\n x}" formats "macro foo\n if 1\n 1 + 2\n end\nend" formats "macro foo\n if 1\n 1 + 2\n end\nend" formats "foo &.bar.as(T)" formats "foo &.bar.as(T)" formats "foo.[1, 2] = 3" formats "foo.[1, 2] = 3" formats "def foo(x) forall T # bar\n # baz\nend" formats "def foo(x) forall T # bar\n # baz\nend" formats "foo self // 1" formats "foo self // 1" formats "def foo( x , & block : ->)\nend" formats "def foo( x , & block : ->)\nend" formats "def foo\n# hello\n1\nend" formats "def foo\n# hello\n1\nend" formats "[\n 1, 2, # foo\n 3, 4,\n]" formats "[\n 1, 2, # foo\n 3, 4,\n]" formats "abstract class Foo\nend" formats "abstract class Foo\nend" formats "asm(\"nop\" : \"a\"(0)\n: \"b\"(1), \"c\"(2) )" formats "asm(\"nop\" : \"a\"(0)\n: \"b\"(1), \"c\"(2) )" formats "1.[]= do\nend" formats "1.[]= do\nend" formats "10**a" formats "10**a" formats "case 1 # foo\nwhen 2\nend" formats "case 1 # foo\nwhen 2\nend" formats "foo a , *b" formats "foo a , *b" formats "alias A = (B(C, (C | D)) | E)" formats "alias A = (B(C, (C | D)) | E)" formats "Foo" formats "Foo" formats "case 1\nwhen 1, # 1\n 2, # 2\n 3 # 3\n 1\nend" formats "case 1\nwhen 1, # 1\n 2, # 2\n 3 # 3\n 1\nend" formats "foo 1,\na: 1,\nb: 2,\nc: 3" formats "foo 1,\na: 1,\nb: 2,\nc: 3" formats "def foo(\n @[MyAnn]\n bar\n); end" formats "def foo(\n @[MyAnn]\n bar\n); end" formats "1 // 2" formats "1 // 2" formats "a = 1;;; b = 2" formats "a = 1;;; b = 2" formats "macro foo( x , y )\nend" formats "macro foo( x , y )\nend" formats "[\n] of \n Foo " formats "[\n] of \n Foo " formats "foo.foo1(\n bar\n .bar1\n .bar2)" formats "foo.foo1(\n bar\n .bar1\n .bar2)" formats "Foo:: Bar" formats "Foo:: Bar" formats "yield(\n1 , \n2)" formats "yield(\n1 , \n2)" formats "def foo(\n foo,\n\n @[MyAnn]\n @[MyAnn]\n & : Nil -> Nil\n); end" formats "def foo(\n foo,\n\n @[MyAnn]\n @[MyAnn]\n & : Nil -> Nil\n); end" formats "foo(\n 1,\n 2\n) do\n 1\nend" formats "foo(\n 1,\n 2\n) do\n 1\nend" formats "next { {1, 2}, {3, 4} }, 5" formats "next { {1, 2}, {3, 4} }, 5" formats "if 1\n[ 1 , 2 , 3 ]\nend" formats "if 1\n[ 1 , 2 , 3 ]\nend" formats "NamedTuple(\n a: Int32,)" formats "NamedTuple(\n a: Int32,)" formats "p = Foo[1, 2, 3,\n 4, 5, 6,\n ]" formats "p = Foo[1, 2, 3,\n 4, 5, 6,\n ]" formats "asm(\"a\" :: \"d\"(e)\n)" formats "asm(\"a\" :: \"d\"(e)\n)" formats "if a\nif b\nelse\n4\nend\nend" formats "if a\nif b\nelse\n4\nend\nend" formats "while 1 # foo\n # bar\n 2\nend" formats "while 1 # foo\n # bar\n 2\nend" formats "if 0\n1 &&\n2 &&\n3\nend" formats "if 0\n1 &&\n2 &&\n3\nend" formats "if 1\n {{1 + 2}}\nend" formats "if 1\n {{1 + 2}}\nend" formats ":/" formats ":/" formats "Set { 1 , 2 }" formats "Set { 1 , 2 }" formats "foo . bar()" formats "foo . bar()" formats "macro foo\n {{1 + 2}}\nend" formats "macro foo\n {{1 + 2}}\nend" formats "break" formats "break" formats "asm(\"nop\")" formats "asm(\"nop\")" formats "foo &.bar.as?(T)" formats "foo &.bar.as?(T)" formats "foo . responds_to? :bar" formats "foo . responds_to? :bar" formats "if 1\n foo(\n bar,\n # comment\n )\nend" formats "if 1\n foo(\n bar,\n # comment\n )\nend" formats "def foo(x : A(B), y)\nend" formats "def foo(x : A(B), y)\nend" formats "a&+1" formats "a&+1" formats "def self . foo\nend" formats "def self . foo\nend" formats "1.== do\nend" formats "1.== do\nend" formats "@[Foo( 1, 2, foo: 3 )]" formats "@[Foo( 1, 2, foo: 3 )]" formats "x = uninitialized Int32" formats "x = uninitialized Int32" formats "x.try &.[]= 123, 456" formats "x.try &.[]= 123, 456" formats "class X\n annotation FooAnnotation \n end \n end" formats "class X\n annotation FooAnnotation \n end \n end" formats "1 + # foo\n2" formats "1 + # foo\n2" formats "next *1 ,2" formats "next *1 ,2" formats "$1" formats "$1" formats "lib Foo\nstruct Foo\nx , y : Int32\nend\nend" formats "lib Foo\nstruct Foo\nx , y : Int32\nend\nend" formats "Foo( x: Int32 )" formats "Foo( x: Int32 )" formats ":-" formats ":-" formats "a = if 1\n2\nelse\n3\nend" formats "a = if 1\n2\nelse\n3\nend" formats "foo . bar = 1" formats "foo . bar = 1" formats "- 1" formats "- 1" formats "a[b] ||= c" formats "a[b] ||= c" formats "case\nelse\n 1\nend" formats "case\nelse\n 1\nend" formats "case 1 \n when 2 \n 3 \n when 4 \n 5 \n end" formats "case 1 \n when 2 \n 3 \n when 4 \n 5 \n end" formats "asm(\"a\" : : : : \"volatile\")" formats "asm(\"a\" : : : : \"volatile\")" formats "if a\nif b\n3\nelse\n4\nend\nend" formats "if a\nif b\n3\nelse\n4\nend\nend" formats "def foo ( x = 1 ) \n end" formats "def foo ( x = 1 ) \n end" formats "enum E\n A # hello\n B # hello; C # hello\nend" formats "enum E\n A # hello\n B # hello; C # hello\nend" formats "module Foo # foo\nend" formats "module Foo # foo\nend" formats "SomeLib.UppercasedFunCall" formats "SomeLib.UppercasedFunCall" formats "\"foo\" \\\n \"bar\"" formats "\"foo\" \\\n \"bar\"" formats "asm(\"nop\" :::: \"volatile\" , \"alignstack\" , \"intel\" )" formats "asm(\"nop\" :::: \"volatile\" , \"alignstack\" , \"intel\" )" formats "foo(\n <<-HERE,\n hello\n HERE\n foo: 1,\n)" formats "foo(\n <<-HERE,\n hello\n HERE\n foo: 1,\n)" formats "<<-FOO\nFOO" formats "<<-FOO\nFOO" formats "yield" formats "yield" formats "foo(\n 1,\n # 2,\n # 3,\n)" formats "foo(\n 1,\n # 2,\n # 3,\n)" formats "->: Int32 do\nx\nend" formats "->: Int32 do\nx\nend" formats "break 1 , 2" formats "break 1 , 2" formats "1.==(2) { 3 }" formats "1.==(2) { 3 }" formats "module Moo ( T )\nend" formats "module Moo ( T )\nend" formats "def foo( & \n )\nend" formats "def foo( & \n )\nend" formats "macro foo\n %foo{x.id+2}\nend" formats "macro foo\n %foo{x.id+2}\nend" formats "def foo(x, **z, &block)\nend" formats "def foo(x, **z, &block)\nend" formats "->@@foo.foo!" formats "->@@foo.foo!" formats "if # some comment\n 2 # another\n 3 # final \n end # end " formats "if # some comment\n 2 # another\n 3 # final \n end # end " formats "lib LibFoo\n {% begin %}\n fun foo : Int32\n {% end %}\nend" formats "lib LibFoo\n {% begin %}\n fun foo : Int32\n {% end %}\nend" formats "a = 1\nb, c = 2, 3\n{% begin %}\n a |= 1\n b |= 2\n c |= 3\n{% end %}" formats "a = 1\nb, c = 2, 3\n{% begin %}\n a |= 1\n b |= 2\n c |= 3\n{% end %}" formats "a &.b[c]?" formats "a &.b[c]?" formats "extend Foo" formats "extend Foo" formats "{% if true %}\n # x\n # y\n{% end %}" formats "{% if true %}\n # x\n # y\n{% end %}" formats "select \n when foo \n 2 \n when bar \n 3 \n end" formats "select \n when foo \n 2 \n when bar \n 3 \n end" formats "def foo(\"bar baz\" qux)\nend" formats "def foo(\"bar baz\" qux)\nend" formats "lib Foo\nstruct Foo\nend\nend" formats "lib Foo\nstruct Foo\nend\nend" formats "foo()" formats "foo()" formats "break {1, 2}, 3" formats "break {1, 2}, 3" formats "def foo( x , & block : Int32 )\nend" formats "def foo( x , & block : Int32 )\nend" formats "->@@foo.foo?" formats "->@@foo.foo?" formats "class Foo\n@x : Int32\nend" formats "class Foo\n@x : Int32\nend" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n @[MyAnn] baz\n); end" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n @[MyAnn] baz\n); end" formats "args.any? &.name.baz" formats "args.any? &.name.baz" formats "begin\n / /\nend" formats "begin\n / /\nend" formats "\n\n1" formats "\n\n1" formats "foo.as(T).bar" formats "foo.as(T).bar" formats "x : Int32*" formats "x : Int32*" formats "def bar\n foo(<<-X,\n a\n X\n 1)\nend" formats "def bar\n foo(<<-X,\n a\n X\n 1)\nend" formats "10 // a" formats "10 // a" formats "def foo(a, # comment\n *b)\nend" formats "def foo(a, # comment\n *b)\nend" formats "def foo(x) # bar\n # baz\nend" formats "def foo(x) # bar\n # baz\nend" formats "def foo(x)\n {% if true %}\n # comment\n Foo = 1\n B = 2\n {% end %}\nend" formats "def foo(x)\n {% if true %}\n # comment\n Foo = 1\n B = 2\n {% end %}\nend" formats "{ \"foo\" => 1 }" formats "{ \"foo\" => 1 }" formats "foo(bar(\n 1,\n 2,\n))" formats "foo(bar(\n 1,\n 2,\n))" formats "1\n..2" formats "1\n..2" formats "Union(Int32, String)?" formats "Union(Int32, String)?" formats "asm(\n# foo\n\"nop\"\n# bar\n)" formats "asm(\n# foo\n\"nop\"\n# bar\n)" formats "(\n a = 1\n a\n)" formats "(\n a = 1\n a\n)" formats "case 1\nwhen 2 # a\n # b\nend" formats "case 1\nwhen 2 # a\n # b\nend" formats "[\n a(), # b\n]" formats "[\n a(), # b\n]" formats "{% if true %}\n # x\n{% end %}" formats "{% if true %}\n # x\n{% end %}" formats "-> :: Foo . foo" formats "-> :: Foo . foo" formats "run(\"a\", 1)" formats "run(\"a\", 1)" formats "->( ){ x }" formats "->( ){ x }" formats "macro foo\n {% 1 + 2 %}\nend" formats "macro foo\n {% 1 + 2 %}\nend" formats "foo(1 + \n2)" formats "foo(1 + \n2)" formats "foo 1, # comment\n # bar\n do\n end" formats "foo 1, # comment\n # bar\n do\n end" formats "1&+2&*3" formats "1&+2&*3" formats "_ = 1" formats "_ = 1" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar\n); end" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar\n); end" formats "{ 1 => 2 ,\n\n 3 => 4 }" formats "{ 1 => 2 ,\n\n 3 => 4 }" formats "# Here is the doc of a method, and contains an example:\n#\n# ```\n# result = foo\n#\n# puts result\n# ```\ndef foo\n # ...\nend\n" formats "# Here is the doc of a method, and contains an example:\n#\n# ```\n# result = foo\n#\n# puts result\n# ```\ndef foo\n # ...\nend\n" formats "1.<= do\nend" formats "1.<= do\nend" formats "def foo\n a = 1; # foo\n a = 2; # bar\nend\n" formats "def foo\n a = 1; # foo\n a = 2; # bar\nend\n" formats "true" formats "true" formats "1\n\n\n2" formats "1\n\n\n2" formats "lib Foo\n fun bar = Bar\nend" formats "lib Foo\n fun bar = Bar\nend" formats "def foo(\n **a\n\n # comment\n)\n 1\nend" formats "def foo(\n **a\n\n # comment\n)\n 1\nend" formats "module Foo\n# nothing\nend" formats "module Foo\n# nothing\nend" formats "case\n# hello\nwhen 1\n 2\nend" formats "case\n# hello\nwhen 1\n 2\nend" formats "->( x )\n:\nInt32 { }" formats "->( x )\n:\nInt32 { }" formats "foo { |x| (x).a }" formats "foo { |x| (x).a }" formats "macro bar\n 1\nend\n\ncase 1\nwhen 2 then 3\nwhen 45 then 6\nend" formats "macro bar\n 1\nend\n\ncase 1\nwhen 2 then 3\nwhen 45 then 6\nend" formats "class Foo\ndef foo (\nx ,\n y ) \n end\nend" formats "class Foo\ndef foo (\nx ,\n y ) \n end\nend" formats "foo.bar / 2\n" formats "foo.bar / 2\n" formats "lib Foo\nfun foo( ... ) : Int32\nend" formats "lib Foo\nfun foo( ... ) : Int32\nend" formats "[] of Foo" formats "[] of Foo" formats "def foo ( @@select) \n end" formats "def foo ( @@select) \n end" formats "foo(\n 1, 2, &block)" formats "foo(\n 1, 2, &block)" formats "foo(1, ) do\nend" formats "foo(1, ) do\nend" formats "case\nend" formats "case\nend" formats "lib Foo\n $foo = hello : Int32 \nend" formats "lib Foo\n $foo = hello : Int32 \nend" formats "def foo(x, *, y, **z)\nend" formats "def foo(x, *, y, **z)\nend" formats "case 1\nend" formats "case 1\nend" formats "foo(\n 1,\n &.foo\n)" formats "foo(\n 1,\n &.foo\n)" formats " Array( {x: Int32, y: String } )" formats " Array( {x: Int32, y: String } )" formats "foo bar, \\\nbaz" formats "foo bar, \\\nbaz" formats "1.==() { 3 }" formats "1.==() { 3 }" formats "\"foo \#{ 1 } \#{ __DIR__ }\"" formats "\"foo \#{ 1 } \#{ __DIR__ }\"" formats "return" formats "return" formats "def foo ( @x, @y) \n end" formats "def foo ( @x, @y) \n end" formats "::StaticArray(T)" formats "::StaticArray(T)" formats "def foo\nend\n\n\n\ndef bar\nend" formats "def foo\nend\n\n\n\ndef bar\nend" formats "1 && 2" formats "1 && 2" formats "alias A = (B) -> C" formats "alias A = (B) -> C" formats "{ {{FOO}}, nil}" formats "{ {{FOO}}, nil}" formats "macro foo\n {% for value, i in values %}\\\n {% if true %}\\\n {% end %}\\\n {{ 1 }}/\n {% end %}\\\nend\n\n{\n 1 => 2,\n 1234 => 5,\n}\n" formats "macro foo\n {% for value, i in values %}\\\n {% if true %}\\\n {% end %}\\\n {{ 1 }}/\n {% end %}\\\nend\n\n{\n 1 => 2,\n 1234 => 5,\n}\n" formats "foo \\\n 1,\n 2\n\nbar \\\n foo: 1,\n bar: 2" formats "foo \\\n 1,\n 2\n\nbar \\\n foo: 1,\n bar: 2" formats "foo([\n 1, 2,\n 3, 4,\n])" formats "foo([\n 1, 2,\n 3, 4,\n])" formats "struct Foo\n # bar\n # baz\n1\nend" formats "struct Foo\n # bar\n # baz\n1\nend" formats "foo = {1, {2,\n 3},\n 4}" formats "foo = {1, {2,\n 3},\n 4}" formats "if 1 &&\n (2 || 3)\n 1\nelse\n 2\nend" formats "if 1 &&\n (2 || 3)\n 1\nelse\n 2\nend" formats "[1, 2,\n 3, 4]\n" formats "[1, 2,\n 3, 4]\n" formats "return *1" formats "return *1" formats "enum Foo\n A; B; C\nend\n" formats "enum Foo\n A; B; C\nend\n" formats "foo(->{\n 1 + 2\n})" formats "foo(->{\n 1 + 2\n})" formats "if 1\n2\nelsif\n3\n4\nelse\n6\nend" formats "if 1\n2\nelsif\n3\n4\nelse\n6\nend" formats "0u64" formats "0u64" formats "%(hello)" formats "%(hello)" formats "def foo(x)\n case //\n when //\n 3\n end\nend" formats "def foo(x)\n case //\n when //\n 3\n end\nend" formats "1 && (\n 2 || 3\n)" formats "1 && (\n 2 || 3\n)" formats "foo(\n# x\n1,\n\n# y\nz: 2\n)" formats "foo(\n# x\n1,\n\n# y\nz: 2\n)" formats "$? = 1" formats "$? = 1" formats "-> : Array(Int32) {}" formats "-> : Array(Int32) {}" formats "@[Foo]\ndef foo\nend" formats "@[Foo]\ndef foo\nend" formats "pointerof( @a )" formats "pointerof( @a )" formats "fun foo(\n x : Int32,\n ...\n) : Int32\n 1\nend" formats "fun foo(\n x : Int32,\n ...\n) : Int32\n 1\nend" formats "1 if 2" formats "1 if 2" formats "lib Foo\nfun foo () : Int32\nend" formats "lib Foo\nfun foo () : Int32\nend" formats "def foo\nend;def bar\nend" formats "def foo\nend;def bar\nend" formats "def foo ( bar @@select) \n end" formats "def foo ( bar @@select) \n end" formats "case 1 \n in Int32 \n 3 \n end" formats "case 1 \n in Int32 \n 3 \n end" formats "$0.bar" formats "$0.bar" formats ":&" formats ":&" formats "def foo : self | Nil\n nil\nend" formats "def foo : self | Nil\n nil\nend" formats "foo : StaticArray(Foo, 12)[34]" formats "foo : StaticArray(Foo, 12)[34]" formats "{ {1, 2, 3} => 4 }" formats "{ {1, 2, 3} => 4 }" Unicode bi-directional control characters formats "\"\u2069\"" formats "\"\u2069\"" formats "<<-EOS\n\u2067\nEOS" formats "<<-EOS\n\u2067\nEOS" formats "/\u202E\#{1}/" formats "/\u202E\#{1}/" formats "\"\\c\u2068\#{1}\"" formats "\"\\c\u2068\#{1}\"" formats "%i(\u2066)" formats "%i(\u2066)" formats "\"\u2066\"" formats "\"\u2066\"" formats "%q(\u2068)" formats "%q(\u2068)" formats "<<-EOS\n\u2069\#{1}\nEOS" formats "<<-EOS\n\u2069\#{1}\nEOS" formats "\"\\c\u202C\"" formats "\"\\c\u202C\"" formats "\"\\c\u202B\"" formats "\"\\c\u202B\"" formats "def foo(\"\u2067\" x)\nend" formats "def foo(\"\u2067\" x)\nend" formats "%Q(\u202D)" formats "%Q(\u202D)" formats "\"\u202B\#{1}\"" formats "\"\u202B\#{1}\"" formats "%q(\u202A)" formats "%q(\u202A)" formats "%Q(\u2068\#{1})" formats "%Q(\u2068\#{1})" formats "<<-EOS\n\u202A\nEOS" formats "<<-EOS\n\u202A\nEOS" formats "%r(\u202A)" formats "%r(\u202A)" formats "{\"\u202D\": 1}" formats "{\"\u202D\": 1}" formats "<<-EOS\n\u202B\#{1}\nEOS" formats "<<-EOS\n\u202B\#{1}\nEOS" formats "\"\\c\u202D\"" formats "\"\\c\u202D\"" formats "\"\\c\u2066\#{1}\"" formats "\"\\c\u2066\#{1}\"" formats "%q(\u2069)" formats "%q(\u2069)" formats "<<-'EOS'\n\u202B\nEOS" formats "<<-'EOS'\n\u202B\nEOS" formats "foo(\"\u202C\": 1)" formats "foo(\"\u202C\": 1)" formats "{\"\u202C\": 1}" formats "{\"\u202C\": 1}" formats "%(\u202A)" formats "%(\u202A)" formats "<<-EOS\n\u2066\#{1}\nEOS" formats "<<-EOS\n\u2066\#{1}\nEOS" formats "\"\u2067\"" formats "\"\u2067\"" formats "<<-EOS\n\u202C\#{1}\nEOS" formats "<<-EOS\n\u202C\#{1}\nEOS" formats "%r(\u2066\#{1})" formats "%r(\u2066\#{1})" formats "%w(\u202A)" formats "%w(\u202A)" formats "\"\u202E\#{1}\"" formats "\"\u202E\#{1}\"" formats "%Q(\u202E\#{1})" formats "%Q(\u202E\#{1})" formats "<<-'EOS'\n\u202E\nEOS" formats "<<-'EOS'\n\u202E\nEOS" formats "/\u202B/" formats "/\u202B/" formats "%w(\u2067)" formats "%w(\u2067)" formats "\"\\c\u202A\"" formats "\"\\c\u202A\"" formats "<<-EOS\n\u202E\nEOS" formats "<<-EOS\n\u202E\nEOS" formats "\"\\c\u202E\"" formats "\"\\c\u202E\"" formats "%(\u2069)" formats "%(\u2069)" formats "%(\u2068)" formats "%(\u2068)" formats "def foo(\"\u202C\" x)\nend" formats "def foo(\"\u202C\" x)\nend" formats "%i(\u202A)" formats "%i(\u202A)" formats "\"\\c\u202B\#{1}\"" formats "\"\\c\u202B\#{1}\"" formats "/\u202C/" formats "/\u202C/" formats "foo(\"\u202B\": 1)" formats "foo(\"\u202B\": 1)" formats "\"\\c\u2066\"" formats "\"\\c\u2066\"" formats "%(\u202C)" formats "%(\u202C)" formats "%i(\u202C)" formats "%i(\u202C)" formats "<<-EOS\n\u202D\nEOS" formats "<<-EOS\n\u202D\nEOS" formats "/\u2066\#{1}/" formats "/\u2066\#{1}/" formats "<<-EOS\n\u202B\nEOS" formats "<<-EOS\n\u202B\nEOS" formats "def foo(\"\u202E\" x)\nend" formats "def foo(\"\u202E\" x)\nend" formats "%w(\u202B)" formats "%w(\u202B)" formats "%Q(\u202C)" formats "%Q(\u202C)" formats "\"\u202B\"" formats "\"\u202B\"" formats "%(\u2067)" formats "%(\u2067)" formats "foo(\"\u202D\": 1)" formats "foo(\"\u202D\": 1)" formats "\"\u2069\#{1}\"" formats "\"\u2069\#{1}\"" formats "%r(\u202B)" formats "%r(\u202B)" formats "/\u2067/" formats "/\u2067/" formats "\"\\c\u2069\#{1}\"" formats "\"\\c\u2069\#{1}\"" formats "\"\u2067\#{1}\"" formats "\"\u2067\#{1}\"" formats "%Q(\u2067\#{1})" formats "%Q(\u2067\#{1})" formats "\"\\c\u2067\#{1}\"" formats "\"\\c\u2067\#{1}\"" formats "<<-EOS\n\u2066\nEOS" formats "<<-EOS\n\u2066\nEOS" formats "<<-EOS\n\u202C\nEOS" formats "<<-EOS\n\u202C\nEOS" formats "%w(\u2069)" formats "%w(\u2069)" formats "%Q(\u2069\#{1})" formats "%Q(\u2069\#{1})" formats "<<-'EOS'\n\u2068\nEOS" formats "<<-'EOS'\n\u2068\nEOS" formats "%r(\u202D)" formats "%r(\u202D)" formats "%r(\u202D\#{1})" formats "%r(\u202D\#{1})" formats "{\"\u202E\": 1}" formats "{\"\u202E\": 1}" formats "%q(\u2067)" formats "%q(\u2067)" formats "%q(\u2066)" formats "%q(\u2066)" formats "foo(\"\u2066\": 1)" formats "foo(\"\u2066\": 1)" formats "foo(\"\u202E\": 1)" formats "foo(\"\u202E\": 1)" formats "NamedTuple(\"\u202E\": Int32)" formats "NamedTuple(\"\u202E\": Int32)" formats "\"\\c\u2068\"" formats "\"\\c\u2068\"" formats "%r(\u2069)" formats "%r(\u2069)" formats "%q(\u202E)" formats "%q(\u202E)" formats "{\"\u2069\": 1}" formats "{\"\u2069\": 1}" formats "%Q(\u202B)" formats "%Q(\u202B)" formats "%r(\u202A\#{1})" formats "%r(\u202A\#{1})" formats "\"\\c\u2069\"" formats "\"\\c\u2069\"" formats "<<-EOS\n\u2069\nEOS" formats "<<-EOS\n\u2069\nEOS" formats "\"\u2068\#{1}\"" formats "\"\u2068\#{1}\"" formats "%w(\u202D)" formats "%w(\u202D)" formats "%Q(\u202C\#{1})" formats "%Q(\u202C\#{1})" formats "def foo(\"\u2066\" x)\nend" formats "def foo(\"\u2066\" x)\nend" formats "/\u202A/" formats "/\u202A/" formats "\"\u202E\"" formats "\"\u202E\"" formats "<<-'EOS'\n\u2067\nEOS" formats "<<-'EOS'\n\u2067\nEOS" formats "/\u2069\#{1}/" formats "/\u2069\#{1}/" formats "%r(\u2068\#{1})" formats "%r(\u2068\#{1})" formats "\"\u202D\"" formats "\"\u202D\"" formats "<<-'EOS'\n\u2066\nEOS" formats "<<-'EOS'\n\u2066\nEOS" formats "/\u2068/" formats "/\u2068/" formats "\"\u202A\"" formats "\"\u202A\"" formats "%Q(\u2069)" formats "%Q(\u2069)" formats "def foo(\"\u202A\" x)\nend" formats "def foo(\"\u202A\" x)\nend" formats "/\u202A\#{1}/" formats "/\u202A\#{1}/" formats "def foo(\"\u202D\" x)\nend" formats "def foo(\"\u202D\" x)\nend" formats "NamedTuple(\"\u202C\": Int32)" formats "NamedTuple(\"\u202C\": Int32)" formats "%Q(\u2067)" formats "%Q(\u2067)" formats "%r(\u202E\#{1})" formats "%r(\u202E\#{1})" formats "%r(\u2069\#{1})" formats "%r(\u2069\#{1})" formats "%(\u202B)" formats "%(\u202B)" formats "{\"\u2068\": 1}" formats "{\"\u2068\": 1}" formats "%Q(\u202A\#{1})" formats "%Q(\u202A\#{1})" formats "%(\u2066)" formats "%(\u2066)" formats "%Q(\u202A)" formats "%Q(\u202A)" formats "%i(\u2069)" formats "%i(\u2069)" formats "%q(\u202C)" formats "%q(\u202C)" formats "foo(\"\u2068\": 1)" formats "foo(\"\u2068\": 1)" formats "<<-EOS\n\u202A\#{1}\nEOS" formats "<<-EOS\n\u202A\#{1}\nEOS" formats "<<-EOS\n\u2068\nEOS" formats "<<-EOS\n\u2068\nEOS" formats "def foo(\"\u2069\" x)\nend" formats "def foo(\"\u2069\" x)\nend" formats "\"\\c\u202E\#{1}\"" formats "\"\\c\u202E\#{1}\"" formats "%i(\u202B)" formats "%i(\u202B)" formats "\"\u202D\#{1}\"" formats "\"\u202D\#{1}\"" formats "%q(\u202B)" formats "%q(\u202B)" formats "%r(\u202C\#{1})" formats "%r(\u202C\#{1})" formats "{\"\u2067\": 1}" formats "{\"\u2067\": 1}" formats "foo(\"\u202A\": 1)" formats "foo(\"\u202A\": 1)" formats "\"\u2066\#{1}\"" formats "\"\u2066\#{1}\"" formats "%i(\u202D)" formats "%i(\u202D)" formats "foo(\"\u2067\": 1)" formats "foo(\"\u2067\": 1)" formats "%w(\u2066)" formats "%w(\u2066)" formats "%(\u202E)" formats "%(\u202E)" formats "\"\\c\u202D\#{1}\"" formats "\"\\c\u202D\#{1}\"" formats "%i(\u2068)" formats "%i(\u2068)" formats "{\"\u2066\": 1}" formats "{\"\u2066\": 1}" formats "%r(\u2067\#{1})" formats "%r(\u2067\#{1})" formats "%Q(\u2068)" formats "%Q(\u2068)" formats "%i(\u2067)" formats "%i(\u2067)" formats "%w(\u202E)" formats "%w(\u202E)" formats "%Q(\u202D\#{1})" formats "%Q(\u202D\#{1})" formats "%Q(\u2066)" formats "%Q(\u2066)" formats "\"\u202C\"" formats "\"\u202C\"" formats "NamedTuple(\"\u2068\": Int32)" formats "NamedTuple(\"\u2068\": Int32)" formats "{\"\u202B\": 1}" formats "{\"\u202B\": 1}" formats "NamedTuple(\"\u202B\": Int32)" formats "NamedTuple(\"\u202B\": Int32)" formats "<<-'EOS'\n\u202D\nEOS" formats "<<-'EOS'\n\u202D\nEOS" formats "%Q(\u202E)" formats "%Q(\u202E)" formats "foo(\"\u2069\": 1)" formats "foo(\"\u2069\": 1)" formats "/\u202D/" formats "/\u202D/" formats "NamedTuple(\"\u202D\": Int32)" formats "NamedTuple(\"\u202D\": Int32)" formats "%r(\u202E)" formats "%r(\u202E)" formats "def foo(\"\u202B\" x)\nend" formats "def foo(\"\u202B\" x)\nend" formats "\"\u202A\#{1}\"" formats "\"\u202A\#{1}\"" formats "%w(\u2068)" formats "%w(\u2068)" formats "<<-EOS\n\u202E\#{1}\nEOS" formats "<<-EOS\n\u202E\#{1}\nEOS" formats "NamedTuple(\"\u2066\": Int32)" formats "NamedTuple(\"\u2066\": Int32)" formats "/\u2066/" formats "/\u2066/" formats "\"\\c\u2067\"" formats "\"\\c\u2067\"" formats "%(\u202D)" formats "%(\u202D)" formats "NamedTuple(\"\u202A\": Int32)" formats "NamedTuple(\"\u202A\": Int32)" formats "<<-'EOS'\n\u202A\nEOS" formats "<<-'EOS'\n\u202A\nEOS" formats "%r(\u202C)" formats "%r(\u202C)" formats "%r(\u2068)" formats "%r(\u2068)" formats "%r(\u2066)" formats "%r(\u2066)" formats "%w(\u202C)" formats "%w(\u202C)" formats "NamedTuple(\"\u2069\": Int32)" formats "NamedTuple(\"\u2069\": Int32)" formats "<<-'EOS'\n\u2069\nEOS" formats "<<-'EOS'\n\u2069\nEOS" formats "<<-EOS\n\u202D\#{1}\nEOS" formats "<<-EOS\n\u202D\#{1}\nEOS" formats "\"\u2068\"" formats "\"\u2068\"" formats "\"\u202C\#{1}\"" formats "\"\u202C\#{1}\"" formats "%r(\u2067)" formats "%r(\u2067)" formats "<<-'EOS'\n\u202C\nEOS" formats "<<-'EOS'\n\u202C\nEOS" formats "<<-EOS\n\u2068\#{1}\nEOS" formats "<<-EOS\n\u2068\#{1}\nEOS" formats "<<-EOS\n\u2067\#{1}\nEOS" formats "<<-EOS\n\u2067\#{1}\nEOS" formats "%q(\u202D)" formats "%q(\u202D)" formats "%Q(\u2066\#{1})" formats "%Q(\u2066\#{1})" formats "/\u2069/" formats "/\u2069/" formats "{\"\u202A\": 1}" formats "{\"\u202A\": 1}" formats "\"\\c\u202A\#{1}\"" formats "\"\\c\u202A\#{1}\"" formats "/\u2067\#{1}/" formats "/\u2067\#{1}/" formats "\"\\c\u202C\#{1}\"" formats "\"\\c\u202C\#{1}\"" formats "%Q(\u202B\#{1})" formats "%Q(\u202B\#{1})" formats "/\u202C\#{1}/" formats "/\u202C\#{1}/" formats "/\u202B\#{1}/" formats "/\u202B\#{1}/" formats "%r(\u202B\#{1})" formats "%r(\u202B\#{1})" formats "/\u202D\#{1}/" formats "/\u202D\#{1}/" formats "%i(\u202E)" formats "%i(\u202E)" formats "/\u2068\#{1}/" formats "/\u2068\#{1}/" formats "NamedTuple(\"\u2067\": Int32)" formats "NamedTuple(\"\u2067\": Int32)" formats "def foo(\"\u2068\" x)\nend" formats "def foo(\"\u2068\" x)\nend" formats "/\u202E/" formats "/\u202E/" formats "macro []=(x, y)\nend" formats "macro []=(x, y)\nend" formats "foo do | x , y | \n x \n end" formats "foo do | x , y | \n x \n end" formats "->foo=" formats "->foo=" formats "lib Foo\n {% if 1 %}\n fun foo\n {% end %}\nend\n\nmacro bar\n 1\nend" formats "lib Foo\n {% if 1 %}\n fun foo\n {% end %}\nend\n\nmacro bar\n 1\nend" formats "next 1, {2, 3}" formats "next 1, {2, 3}" formats "foo\n .bar\n .baz(\n 1\n )" formats "foo\n .bar\n .baz(\n 1\n )" formats "foo { | a, ( b , c, ), | a + b + c }" formats "foo { | a, ( b , c, ), | a + b + c }" formats "foo &.>=(2)" formats "foo &.>=(2)" formats "\"foo\#{\"bar\"} Baz \#{\"qux\"} \"" formats "\"foo\#{\"bar\"} Baz \#{\"qux\"} \"" formats "x : Int32 |\nString" formats "x : Int32 |\nString" formats "@[Foo(\n foo: 1\n)]\ndef foo\nend" formats "@[Foo(\n foo: 1\n)]\ndef foo\nend" formats "foo(\n [\n 1,\n 2,\n ],\n [\n 3,\n 4,\n ]\n)" formats "foo(\n [\n 1,\n 2,\n ],\n [\n 3,\n 4,\n ]\n)" formats "[1, 2, 3]" formats "[1, 2, 3]" formats "<<-FOO\nbarfoo\nFOO" formats "<<-FOO\nbarfoo\nFOO" formats "@x ||= 1" formats "@x ||= 1" formats "-> : Int32 | String { 1 }" formats "-> : Int32 | String { 1 }" formats "def foo ( bar @select) \n end" formats "def foo ( bar @select) \n end" formats "a(&.b.c.as(C))" formats "a(&.b.c.as(C))" formats "x = <<-EOF\n 1\nEOF" formats "x = <<-EOF\n 1\nEOF" formats "$~.bar" formats "$~.bar" formats "a = # foo\n bar(1)" formats "a = # foo\n bar(1)" formats "macro foo\n def bar \n end \n end" formats "macro foo\n def bar \n end \n end" formats "foo &.bar.is_a?(Baz)" formats "foo &.bar.is_a?(Baz)" formats "call(foo <<-X\nbar\nX\n)" formats "call(foo <<-X\nbar\nX\n)" formats "class Actor\n macro inherited\n\nend\nend\n" formats "class Actor\n macro inherited\n\nend\nend\n" formats "1 \\\nrescue 2" formats "1 \\\nrescue 2" formats "foo (1)" formats "foo (1)" formats "bar = foo(->do\n 1 + 2\nend)" formats "bar = foo(->do\n 1 + 2\nend)" formats "def foo(\n foo,\n @[MyAnn]\n &block\n); end" formats "def foo(\n foo,\n @[MyAnn]\n &block\n); end" formats "foo[] =1" formats "foo[] =1" formats "NamedTuple(\n a: Int32,\n)" formats "NamedTuple(\n a: Int32,\n)" formats "{%\n unless true\n 1\n else\n 2\n end\n%}" formats "{%\n unless true\n 1\n else\n 2\n end\n%}" formats "-> :: foo!" formats "-> :: foo!" formats "10 / a" formats "10 / a" formats "abstract def foo \n 1" formats "abstract def foo \n 1" formats "<<-HTML\n hello \n HTML" formats "<<-HTML\n hello \n HTML" formats "\"\#{\"\#{foo}\"}\"" formats "\"\#{\"\#{foo}\"}\"" formats "def foo \n end" formats "def foo \n end" formats "def execute\n begin\n 1\n ensure\n 2\n end\n 3\nend" formats "def execute\n begin\n 1\n ensure\n 2\n end\n 3\nend" formats "asm(\"nop\" : \"a\"(0), \"b\"(1) )" formats "asm(\"nop\" : \"a\"(0), \"b\"(1) )" formats "asm(\"nop\" : \"a\"(0) : \"b\"(1), \"c\"(2) )" formats "asm(\"nop\" : \"a\"(0) : \"b\"(1), \"c\"(2) )" formats "foo : self? | A" formats "foo : self? | A" formats "foo bar # comment\n\n# doc\ndef baz; end" formats "foo bar # comment\n\n# doc\ndef baz; end" formats "def foo(x)\n case 1\n when self // 2\n 3\n end\nend" formats "def foo(x)\n case 1\n when self // 2\n 3\n end\nend" formats "foo do | x | \n x \n end" formats "foo do | x | \n x \n end" formats "def foo(x)\n case self // x\n when 2\n 3\n end\nend" formats "def foo(x)\n case self // x\n when 2\n 3\n end\nend" formats "foo.bar.baz\n.qux" formats "foo.bar.baz\n.qux" formats "foo &.nil?()" formats "foo &.nil?()" formats "<<-HEREDOC\n \#{foo}\n H\#{bar}\n HEREDOC" formats "<<-HEREDOC\n \#{foo}\n H\#{bar}\n HEREDOC" formats "1 &+ 2" formats "1 &+ 2" formats "/foo \#{ bar }/" formats "/foo \#{ bar }/" formats "asm(\"nop\"\n: \"a\"(0) )" formats "asm(\"nop\"\n: \"a\"(0) )" formats "1.!= do\nend" formats "1.!= do\nend" formats "foo.[ 1 , 2 ]" formats "foo.[ 1 , 2 ]" formats "def foo(**z, &block)\nend" formats "def foo(**z, &block)\nend" formats "yield 1 , \n2" formats "yield 1 , \n2" formats "a = foo(baz1 do\nend)" formats "a = foo(baz1 do\nend)" formats "...\n2" formats "...\n2" formats "lib Foo\n fun foo =\n\n\n bar(Int32) : Int32\nend" formats "lib Foo\n fun foo =\n\n\n bar(Int32) : Int32\nend" formats "alias Foo = Bar" formats "alias Foo = Bar" formats "x: Int32" formats "x: Int32" formats "foo.bar=(2)\n1" formats "foo.bar=(2)\n1" formats "begin\n query = <<-HEREDOC\n foo\n HEREDOC\nend" formats "begin\n query = <<-HEREDOC\n foo\n HEREDOC\nend" formats "foo.bar. as? Int32" formats "foo.bar. as? Int32" formats "case 1 # foo\nwhen 2 then 3 # bar\nwhen 4 then 5 # baz\nelse 6 # zzz\nend" formats "case 1 # foo\nwhen 2 then 3 # bar\nwhen 4 then 5 # baz\nelse 6 # zzz\nend" formats "1 + 2" formats "1 + 2" formats "foo(1 &- 2)" formats "foo(1 &- 2)" formats "def foo\n1\n2\n# foo\nend" formats "def foo\n1\n2\n# foo\nend" formats "{ {% begin %}1{% end %}, nil }" formats "{ {% begin %}1{% end %}, nil }" formats "1.===(2) { 3 }" formats "1.===(2) { 3 }" formats "if 1\n return foo(\n 1,\n 2,\n )\nend" formats "if 1\n return foo(\n 1,\n 2,\n )\nend" formats "macro foo\n <<-FOO\n hello \n FOO\nend" formats "macro foo\n <<-FOO\n hello \n FOO\nend" formats "class Foo\nx = 1\nend" formats "class Foo\nx = 1\nend" formats "1 \\\nensure 2" formats "1 \\\nensure 2" formats "case 1\nelse # foo\n # bar\nend" formats "case 1\nelse # foo\n # bar\nend" formats "if 1\n foo(\n bar\n # comment\n )\nend" formats "if 1\n foo(\n bar\n # comment\n )\nend" formats "begin\n 1\n # Comment\n\n\nend" formats "begin\n 1\n # Comment\n\n\nend" formats "1 # foo\n1234 # bar\n\n10 # bar" formats "1 # foo\n1234 # bar\n\n10 # bar" formats "x : { {A, B}, {C, D} }" formats "x : { {A, B}, {C, D} }" formats "case 1\nwhen \"foo\" ; 3\nwhen \"lalalala\"; 4\nelse 5\nend" formats "case 1\nwhen \"foo\" ; 3\nwhen \"lalalala\"; 4\nelse 5\nend" formats "def %(x)\n 1\nend" formats "def %(x)\n 1\nend" formats "[1, 2, 3, ]" formats "[1, 2, 3, ]" formats "unless a\n2\nend" formats "unless a\n2\nend" formats "foo.as ( Int32* )" formats "foo.as ( Int32* )" adds trailing comma to def multi-line normal, splat, and double splat parameters formats "def foo(\n a, b\n)\nend" formats "def foo(\n a, b\n)\nend" formats "macro foo(\n a,\n b\n)\nend" formats "macro foo(\n a,\n b\n)\nend" formats "def foo(\n a,\n @[Ann] b\n)\nend" formats "def foo(\n a,\n @[Ann] b\n)\nend" formats "fun foo(\n a : Int32,\n b : Int32\n)\nend" formats "fun foo(\n a : Int32,\n b : Int32\n)\nend" formats "macro foo(\n a,\n *b\n)\nend" formats "macro foo(\n a,\n *b\n)\nend" formats "def foo(\n a,\n b\n)\nend" formats "def foo(\n a,\n b\n)\nend" formats "def foo(\n a,\n **b\n)\nend" formats "def foo(\n a,\n **b\n)\nend" formats "fun foo(\n a : Int32,\n ...\n)\nend" formats "fun foo(\n a : Int32,\n ...\n)\nend" formats "def foo(\n a : Int32,\n b : Int32 = 1\n)\nend" formats "def foo(\n a : Int32,\n b : Int32 = 1\n)\nend" formats "def foo(\n a : Int32,\n b : Int32\n)\nend" formats "def foo(\n a : Int32,\n b : Int32\n)\nend" formats "def foo(\n a,\n @[Ann]\n b\n)\nend" formats "def foo(\n a,\n @[Ann]\n b\n)\nend" formats "def foo(\n a, # Foo\n b # Bar\n)\nend" formats "def foo(\n a, # Foo\n b # Bar\n)\nend" formats "def foo(\n a,\n &block\n)\nend" formats "def foo(\n a,\n &block\n)\nend" formats "def foo(\n a,\n *b\n)\nend" formats "def foo(\n a,\n *b\n)\nend" formats "def foo(\n a, b,\n c, d\n)\nend" formats "def foo(\n a, b,\n c, d\n)\nend" formats "def foo(\n a,\n b c\n)\nend" formats "def foo(\n a,\n b c\n)\nend" formats "def foo(\n a,\n)\nend" formats "def foo(\n a,\n)\nend" formats "foo &.[a] = 1" formats "foo &.[a] = 1" formats "10/a" formats "10/a" formats "foo &.bar.responds_to?(:baz)" formats "foo &.bar.responds_to?(:baz)" formats "lib Foo\n fun foo =\n bar : Void\nend" formats "lib Foo\n fun foo =\n bar : Void\nend" formats "foo = 1\n->foo.foo" formats "foo = 1\n->foo.foo" formats "foo : (self)?" formats "foo : (self)?" formats "foo(1,\n2,\n)" formats "foo(1,\n2,\n)" formats "unless a\nunless b\nelse\n4\nend\nend" formats "unless a\nunless b\nelse\n4\nend\nend" formats "-> : {Int32, String} {}" formats "-> : {Int32, String} {}" formats "foo(\n <<-HERE,\n hello\n HERE\n 1,\n)" formats "foo(\n <<-HERE,\n hello\n HERE\n 1,\n)" formats "def foo(x : X) forall X , Y; end" formats "def foo(x : X) forall X , Y; end" formats "foo = 1\n->foo.[](Int32)" formats "foo = 1\n->foo.[](Int32)" formats "def foo(@[MyAnn] &block); end" formats "def foo(@[MyAnn] &block); end" formats "return { {1, 2}, {3, 4} }, 5" formats "return { {1, 2}, {3, 4} }, 5" formats "module Foo;end" formats "module Foo;end" formats "next 1 , 2" formats "next 1 , 2" formats "foo { | a, ( _ , c ) | a + c }" formats "foo { | a, ( _ , c ) | a + c }" formats "alias Foo::Bar= Baz" formats "alias Foo::Bar= Baz" formats "\"\\a\\c\\b\\d\"" formats "\"\\a\\c\\b\\d\"" formats "a&-1" formats "a&-1" formats "foo 1, do\n2\nend" formats "foo 1, do\n2\nend" formats "%(\n1\n)\n\n{\n 1 => 2,\n 234 => 5,\n}" formats "%(\n1\n)\n\n{\n 1 => 2,\n 234 => 5,\n}" formats "10//a" formats "10//a" formats "1 ; 2" formats "1 ; 2" formats "foo &.[]?( 1, 2 )" formats "foo &.[]?( 1, 2 )" formats "+ a + d" formats "+ a + d" formats " {% begin %} 2 {% end %}" formats " {% begin %} 2 {% end %}" formats "\"foo \#{ 1 + 2 }\"" formats "\"foo \#{ 1 + 2 }\"" formats "foo(\"bar\" \\\n\"baz\")" formats "foo(\"bar\" \\\n\"baz\")" formats "foo (1; 2)" formats "foo (1; 2)" formats "def foo(a : T) forall T \n #\nend" formats "def foo(a : T) forall T \n #\nend" formats "1*2" formats "1*2" formats "[\n {\n 1 => 2,\n }, {\n 3 => 4,\n }, {\n 5 => 6,\n },\n]" formats "[\n {\n 1 => 2,\n }, {\n 3 => 4,\n }, {\n 5 => 6,\n },\n]" formats " macro foo\n end\n\n :+" formats " macro foo\n end\n\n :+" formats "Foo( A , 1 )" formats "Foo( A , 1 )" formats "<<-HTML\n \#{1}x\n y\n z\n HTML" formats "<<-HTML\n \#{1}x\n y\n z\n HTML" formats "macro foo()\n {% if 1 %} 2 {% end %}\nend" formats "macro foo()\n {% if 1 %} 2 {% end %}\nend" formats "case 1\nwhen a; 2\nelse; b\nend" formats "case 1\nwhen a; 2\nelse; b\nend" formats "begin\n1\nrescue Int32 \n3\nend" formats "begin\n1\nrescue Int32 \n3\nend" formats "if a\n2\n3\nelse\n4\n5\nend" formats "if a\n2\n3\nelse\n4\n5\nend" formats "def a\n {\n 1, # x\n # y\n }\nend" formats "def a\n {\n 1, # x\n # y\n }\nend" formats "-> :: Foo . foo!" formats "-> :: Foo . foo!" formats "break 1, {2, 3}" formats "break 1, {2, 3}" formats "alias Foo =Bar" formats "alias Foo =Bar" formats "begin\n select\n when foo\n # foo\n # bar\n else\n # foo\n # bar\n end\nend" formats "begin\n select\n when foo\n # foo\n # bar\n else\n # foo\n # bar\n end\nend" formats "break *1" formats "break *1" formats "-> : Int32 {}" formats "-> : Int32 {}" formats "foo(/ /)" formats "foo(/ /)" formats "def foo(a,\n **b)\nend" formats "def foo(a,\n **b)\nend" formats "join io, &.inspect" formats "join io, &.inspect" formats "long_variable_name = [\n {\n :foo => 1,\n },\n {\n :bar => 2,\n },\n]" formats "long_variable_name = [\n {\n :foo => 1,\n },\n {\n :bar => 2,\n },\n]" formats "def foo : (A | B(C))\n nil\nend" formats "def foo : (A | B(C))\n nil\nend" formats "1 .. 2" formats "1 .. 2" formats "def foo(@[AnnOne] @[AnnTwo] v); end" formats "def foo(@[AnnOne] @[AnnTwo] v); end" formats "if 1\nelse\n2\nend\n3" formats "if 1\nelse\n2\nend\n3" formats "1.>=() { 3 }" formats "1.>=() { 3 }" formats "while true\n1\n\n# foo\nend" formats "while true\n1\n\n# foo\nend" formats "{ %w() }" formats "{ %w() }" formats "-> :: foo" formats "-> :: foo" formats "asm(\"a\" : :: : \"volatile\")" formats "asm(\"a\" : :: : \"volatile\")" formats "lib Bar\n enum Foo\n A = 1\n end\nend" formats "lib Bar\n enum Foo\n A = 1\n end\nend" formats "sizeof( Int32 )" formats "sizeof( Int32 )" formats "begin\nend\n\n# a\n" formats "begin\nend\n\n# a\n" formats "lib Foo\n fun foo(Int32) : Int32\nend" formats "lib Foo\n fun foo(Int32) : Int32\nend" formats "1_234" formats "1_234" formats "\"\#{\n foo = 1}\"" formats "\"\#{\n foo = 1}\"" formats "asm(\"a\" :::: \"volatile\"\n)" formats "asm(\"a\" :::: \"volatile\"\n)" formats "macro flags\n {% if 1 %}\\\n {% end %}\\\nend" formats "macro flags\n {% if 1 %}\\\n {% end %}\\\nend" formats "begin\n 1 \\\n + 2\n 3\nend" formats "begin\n 1 \\\n + 2\n 3\nend" formats "FOO = 2\nA = 1" formats "FOO = 2\nA = 1" formats "{\n <<-KEY => 1,\n key\n KEY\n}" formats "{\n <<-KEY => 1,\n key\n KEY\n}" formats "x : A | B" formats "x : A | B" formats "@x[ 1 ] += 2" formats "@x[ 1 ] += 2" formats "asm(\n # the assembly template string, following the\n # syntax for LLVM's integrated assembler\n \"nop\" : # output operands\n\"=r\"(foo), \"=r\"(bar) : # input operands\n\"r\"(1), \"r\"(baz) : # names of clobbered registers\n\"eax\", \"memory\" : # optional flags, corresponding to the LLVM IR\n # sideeffect / alignstack / inteldialect / unwind attributes\n\"volatile\", \"alignstack\", \"intel\", \"unwind\"\n)" formats "asm(\n # the assembly template string, following the\n # syntax for LLVM's integrated assembler\n \"nop\" : # output operands\n\"=r\"(foo), \"=r\"(bar) : # input operands\n\"r\"(1), \"r\"(baz) : # names of clobbered registers\n\"eax\", \"memory\" : # optional flags, corresponding to the LLVM IR\n # sideeffect / alignstack / inteldialect / unwind attributes\n\"volatile\", \"alignstack\", \"intel\", \"unwind\"\n)" formats "class Foo # foo\nend" formats "class Foo # foo\nend" formats "case 1 \n when 2 \n 3 \n end" formats "case 1 \n when 2 \n 3 \n end" formats "abstract def foo\nabstract def bar" formats "abstract def foo\nabstract def bar" formats "def foo\n2 # foo\nend" formats "def foo\n2 # foo\nend" formats "if 1\nelse\n2 # foo\nend" formats "if 1\nelse\n2 # foo\nend" formats "foo(\"bar\": 1, \"baz qux\": 2)" formats "foo(\"bar\": 1, \"baz qux\": 2)" formats "%w{one( two( three)}" formats "%w{one( two( three)}" formats "%" formats "%" formats "a = foo(bar(\n 1,\n 2,\n))" formats "a = foo(bar(\n 1,\n 2,\n))" formats "{\n 1 => 2,\n 10 => 30,\n 30 => 40,\n \"foobar\" => 50,\n \"coco\" => 60,\n}" formats "{\n 1 => 2,\n 10 => 30,\n 30 => 40,\n \"foobar\" => 50,\n \"coco\" => 60,\n}" formats "<<-FOO\nbarfoobar\nFOO" formats "<<-FOO\nbarfoobar\nFOO" formats "typeof( 1, 2, 3 )" formats "typeof( 1, 2, 3 )" formats "Foo( x: Int32 , y: Float64 )" formats "Foo( x: Int32 , y: Float64 )" formats "if 1\nelse\n# nothing\nend" formats "if 1\nelse\n# nothing\nend" formats "# Hello\n#\n# ```crystal\n# 1\n# ```\n# Bye" formats "# Hello\n#\n# ```crystal\n# 1\n# ```\n# Bye" formats "$~ = 1" formats "$~ = 1" formats "ary.size = (1).to_i" formats "ary.size = (1).to_i" formats "'\\u{0123}'" formats "'\\u{0123}'" formats "X(typeof(begin\n e.is_a?(Y) ? 1 : 2\nend))" formats "X(typeof(begin\n e.is_a?(Y) ? 1 : 2\nend))" formats "1.>= { 3 }" formats "1.>= { 3 }" formats "10 ** a" formats "10 ** a" formats "asm(\"nop\" :: )" formats "asm(\"nop\" :: )" formats "\"foo \#{bar}\" \\\n \"baz\"" formats "\"foo \#{bar}\" \\\n \"baz\"" formats "{ \"foo\": 1 }" formats "{ \"foo\": 1 }" formats "x : Int32" formats "x : Int32" formats "a = begin\n1\n2\nend" formats "a = begin\n1\n2\nend" formats "foo( )" formats "foo( )" formats "x.is_a? T\n3\n" formats "x.is_a? T\n3\n" formats "macro foo\nend" formats "macro foo\nend" formats "::Foo:: Bar" formats "::Foo:: Bar" formats "if a\n2\n3\nend" formats "if a\n2\n3\nend" formats "@[Foo]" formats "@[Foo]" formats "next {1, 2}, {3, 4}" formats "next {1, 2}, {3, 4}" formats "def foo\n {% for x in y %}\n foo + bar\n {% end %}\nend" formats "def foo\n {% for x in y %}\n foo + bar\n {% end %}\nend" formats "enum Baz\nA = 1\nFOO = 2\n\nEX = 3\nend" formats "enum Baz\nA = 1\nFOO = 2\n\nEX = 3\nend" formats "foo (1), 2" formats "foo (1), 2" formats "`foo \#{ bar }`" formats "`foo \#{ bar }`" formats "alias Foo=\nBar" formats "alias Foo=\nBar" formats "def foo(x : self ?) \n end" formats "def foo(x : self ?) \n end" formats "a = \\\n # foo\n nil" formats "a = \\\n # foo\n nil" formats "begin\n1\nensure\n2\nend" formats "begin\n1\nensure\n2\nend" formats "foo (1).bar" formats "foo (1).bar" formats " <<-HTML\n \#{1} \#{2}\n HTML" formats " <<-HTML\n \#{1} \#{2}\n HTML" formats "[\n [\n 1,\n ], [\n 2,\n ], [\n 3,\n ],\n]" formats "[\n [\n 1,\n ], [\n 2,\n ], [\n 3,\n ],\n]" formats "macro foo\n {{ 1 + 2 }}\nend" formats "macro foo\n {{ 1 + 2 }}\nend" formats "a = \"\n\"\n1 # 1\n12 # 2\n" formats "a = \"\n\"\n1 # 1\n12 # 2\n" formats "macro foo\n def bar\n {{\n 1 + 2\n }}\n end\nend" formats "macro foo\n def bar\n {{\n 1 + 2\n }}\n end\nend" formats "macro foo\n macro bar\n \\{% begin %}\n \\\\{% puts %}\n \\{% end %}\n end\nend" formats "macro foo\n macro bar\n \\{% begin %}\n \\\\{% puts %}\n \\{% end %}\n end\nend" formats "foo 1, a: 1,\nb: 2,\nc: 3,\n&block" formats "foo 1, a: 1,\nb: 2,\nc: 3,\n&block" formats "case 1 \n when 2 then 3 \n end" formats "case 1 \n when 2 then 3 \n end" formats "loop do\n 1\n loop do\n 2\n rescue\n 3\n end\n 4\nend" formats "loop do\n 1\n loop do\n 2\n rescue\n 3\n end\n 4\nend" formats "break *1 , *2" formats "break *1 , *2" formats "1\n# hello\n\n\n" formats "1\n# hello\n\n\n" formats "@[Foo(\n 1,\n)]" formats "@[Foo(\n 1,\n)]" formats "1#foo" formats "1#foo" formats "<<-FOO\n1\nFOO\n\n{\n 1 => 2,\n 10 => 3,\n}" formats "<<-FOO\n1\nFOO\n\n{\n 1 => 2,\n 10 => 3,\n}" formats "def foo(\n a,\n &block\n)\nend" formats "def foo(\n a,\n &block\n)\nend" formats "return 1, {2, 3}" formats "return 1, {2, 3}" formats "foo &.as(T).bar" formats "foo &.as(T).bar" formats "def foo # bar\n # baz\nend" formats "def foo # bar\n # baz\nend" formats "Hash{\n foo => <<-EOF,\n foo\n EOF\n bar => <<-BAR,\n bar\n BAR\n}" formats "Hash{\n foo => <<-EOF,\n foo\n EOF\n bar => <<-BAR,\n bar\n BAR\n}" formats "def foo(**z : Foo)\nend" formats "def foo(**z : Foo)\nend" gives proper line number in syntax error inside macro gives proper line number in syntax error inside macro formats "begin\n #hola\n 1\nend\n" formats "begin\n #hola\n 1\nend\n" formats "1.===() { 3 }" formats "1.===() { 3 }" formats " {% if 1 %} 2 {% end %}" formats " {% if 1 %} 2 {% end %}" formats "case 0\nwhen 0 then 1; 2\n# Comments\nend" formats "case 0\nwhen 0 then 1; 2\n# Comments\nend" formats "x : {A, B, }" formats "x : {A, B, }" formats "{% for a in %w() %}\n <<-FOO\n hello \n FOO\n{% end %}" formats "{% for a in %w() %}\n <<-FOO\n hello \n FOO\n{% end %}" formats "macro foo\n %foo\nend" formats "macro foo\n %foo\nend" formats "foo(1 &+ \n2)" formats "foo(1 &+ \n2)" formats "1 # foo\n1234 # bar" formats "1 # foo\n1234 # bar" formats "a = %w(\n one two\n three four\n)" formats "a = %w(\n one two\n three four\n)" formats "begin\n1 ? 2 : 3\nend" formats "begin\n1 ? 2 : 3\nend" formats "def foo(**z)\nend" formats "def foo(**z)\nend" formats "def foo\na = bar do\n1\nend\nend" formats "def foo\na = bar do\n1\nend\nend" formats "a &.b.c.as(C)" formats "a &.b.c.as(C)" formats "a = foo(1, 2, {\n foo: 1,\n bar: 2,\n})" formats "a = foo(1, 2, {\n foo: 1,\n bar: 2,\n})" formats "class Foo\n macro foo\n 1\n end\nend" formats "class Foo\n macro foo\n 1\n end\nend" formats "lib Foo\n fun foo =\n bar(Int32,\n Int32) : Int32\nend" formats "lib Foo\n fun foo =\n bar(Int32,\n Int32) : Int32\nend" formats "if 1;\n2; end" formats "if 1;\n2; end" formats "#### ###" formats "#### ###" formats "def foo ( x , y ) \n end" formats "def foo ( x , y ) \n end" formats "{x => self // 1}" formats "{x => self // 1}" formats "asm(\"a\" : \"b\"(c) : \"d\"(e)\n : \"f\")" formats "asm(\"a\" : \"b\"(c) : \"d\"(e)\n : \"f\")" formats "while 1\n# nothing\nend" formats "while 1\n# nothing\nend" formats "alias Foo::Bar = Baz" formats "alias Foo::Bar = Baz" formats "\"\\\\\\\"\\#\\a\\b\\n\\r\\t\#{foo}\\v\\f\\e\"" formats "\"\\\\\\\"\\#\\a\\b\\n\\r\\t\#{foo}\\v\\f\\e\"" formats "offsetof( String, @length )" formats "offsetof( String, @length )" formats "1 + \\\n2 + \\\n3" formats "1 + \\\n2 + \\\n3" formats "a.b &.[c]?\n1" formats "a.b &.[c]?\n1" formats "foo.bar do\n baz\n .b\nend" formats "foo.bar do\n baz\n .b\nend" formats "x : (A | B)" formats "x : (A | B)" formats "\"hel\nlo\"" formats "\"hel\nlo\"" formats "a = if 1\n2\nelsif 3\n4\nend" formats "a = if 1\n2\nelsif 3\n4\nend" formats "@[Foo()]" formats "@[Foo()]" formats "def foo\n ((((((((((((((((0_u64\n ) | ptr[0]) << 8\n ) | ptr[1]) << 8\n ) | ptr[2]) << 8\n ) | ptr[3]) << 8\n ) | ptr[4]) << 8\n ) | ptr[5]) << 8\n ) | ptr[6]) << 8\n ) | ptr[7])\nend" formats "def foo\n ((((((((((((((((0_u64\n ) | ptr[0]) << 8\n ) | ptr[1]) << 8\n ) | ptr[2]) << 8\n ) | ptr[3]) << 8\n ) | ptr[4]) << 8\n ) | ptr[5]) << 8\n ) | ptr[6]) << 8\n ) | ptr[7])\nend" formats "{/ / => / /, / / => / /}" formats "{/ / => / /, / / => / /}" formats "{ # foo\n 1,\n}" formats "{ # foo\n 1,\n}" formats "foo do\n {% foo <<-X\n bar\n X\n %}\nend" formats "foo do\n {% foo <<-X\n bar\n X\n %}\nend" formats "\"hello\"" formats "\"hello\"" formats "return {1, 2}, {3, 4}" formats "return {1, 2}, {3, 4}" formats "foo\n \nbar" formats "foo\n \nbar" formats "def foo( x , & block )\nend" formats "def foo( x , & block )\nend" formats "<<-HTML\n \#{\"foo\"}\n HTML" formats "<<-HTML\n \#{\"foo\"}\n HTML" formats "alias A = ( A | B )" formats "alias A = ( A | B )" formats "class Foo\n enum Bar\n A; B; C;\n D; E; F\nend\nend\n" formats "class Foo\n enum Bar\n A; B; C;\n D; E; F\nend\nend\n" formats "-> :: Foo . foo=" formats "-> :: Foo . foo=" formats "foo do # hello\nend" formats "foo do # hello\nend" formats "def foo(&block: Int32)\nend" formats "def foo(&block: Int32)\nend" formats "is_a? Foo" formats "is_a? Foo" formats "/foo/imx" formats "/foo/imx" formats "1.== { 3 }" formats "1.== { 3 }" formats "1 +\n # foo\n 2" formats "1 +\n # foo\n 2" formats "def foo\nend\ndef bar\nend" formats "def foo\nend\ndef bar\nend" formats "a[1] , b[2] = 1 , 2" formats "a[1] , b[2] = 1 , 2" formats "a, b = \nif 1\n2\nend" formats "a, b = \nif 1\n2\nend" formats "if 1\n2\nend\nif 3\nend" formats "if 1\n2\nend\nif 3\nend" formats "def foo ( x , y , ) \n end" formats "def foo ( x , y , ) \n end" formats "::Tuple(T)" formats "::Tuple(T)" formats "next {1, 2}, 3" formats "next {1, 2}, 3" formats "if 1\n {% for x in y %} {% end %}\nend" formats "if 1\n {% for x in y %} {% end %}\nend" formats " * a = 1 " formats " * a = 1 " formats "def foo(\n &block\n)\nend" formats "def foo(\n &block\n)\nend" formats "1.<=() { 3 }" formats "1.<=() { 3 }" formats "1.!= { 3 }" formats "1.!= { 3 }" formats "foo.bar = \n1" formats "foo.bar = \n1" formats "lib Foo\n $foo : Int32 \nend" formats "lib Foo\n $foo : Int32 \nend" formats "a &.b.as C" formats "a &.b.as C" formats "enum Foo : Int32\nA = 1\nend" formats "enum Foo : Int32\nA = 1\nend" formats "page= <<-HTML\n foo\nHTML" formats "page= <<-HTML\n foo\nHTML" formats "foo(<<-X,\na\nX\n 1)" formats "foo(<<-X,\na\nX\n 1)" formats "class Foo\n# nothing\nend" formats "class Foo\n# nothing\nend" formats "foo &.as?(T)" formats "foo &.as?(T)" formats "lib Foo\ntype Foo = Bar\nend" formats "lib Foo\ntype Foo = Bar\nend" formats "NamedTuple(a: Int32,)" formats "NamedTuple(a: Int32,)" formats "lib Foo\n fun foo = bar(Int32) : Int32\nend" formats "lib Foo\n fun foo = bar(Int32) : Int32\nend" formats " <<-HTML\n foo\n HTML" formats " <<-HTML\n foo\n HTML" formats "foo(1, ) { }" formats "foo(1, ) { }" formats "foo do\n [foo <<-X\n bar\n X\n ]\nend" formats "foo do\n [foo <<-X\n bar\n X\n ]\nend" formats "begin\n 1\nend\n\n1\n" formats "begin\n 1\nend\n\n1\n" formats "lib Foo\nfun foo\nend" formats "lib Foo\nfun foo\nend" formats " ((1) + 2)" formats " ((1) + 2)" formats "[1,\n2,\n3]" formats "[1,\n2,\n3]" formats "def //(x)\n 1\nend" formats "def //(x)\n 1\nend" formats "private def foo\nend\nprivate def bar\nend" formats "private def foo\nend\nprivate def bar\nend" formats "Foo::Bar?" formats "Foo::Bar?" formats "next *1" formats "next *1" formats "alias Foo=Bar" formats "alias Foo=Bar" formats "X(typeof(begin\n e.is_a?(Y)\nend))" formats "X(typeof(begin\n e.is_a?(Y)\nend))" formats "1.<=(2) { 3 }" formats "1.<=(2) { 3 }" formats "while 1;\n2; end" formats "while 1;\n2; end" formats "1 #=>2" formats "1 #=>2" formats "getter foo # comment\n\ndef foo\nend" formats "getter foo # comment\n\ndef foo\nend" formats "asm(\n\"nop\"\n)" formats "asm(\n\"nop\"\n)" formats "return { {1, 2}, {3, 4} }" formats "return { {1, 2}, {3, 4} }" formats "case\nend" formats "case\nend" formats "%i{one( two( three)}" formats "%i{one( two( three)}" formats "a = / /" formats "a = / /" formats "next( 1 , 2 )" formats "next( 1 , 2 )" formats "1+2*3" formats "1+2*3" formats "break( 1 , 2 )" formats "break( 1 , 2 )" formats "macro foo\n 1 + 2 \n end" formats "macro foo\n 1 + 2 \n end" formats "[\n a() # b\n]" formats "[\n a() # b\n]" formats "def foo\n 1\n #\n\n\nrescue\nend" formats "def foo\n 1\n #\n\n\nrescue\nend" formats "foo(\n# x\n1,\n\n# y\nz: 2,\n\n# a\nb: 3)" formats "foo(\n# x\n1,\n\n# y\nz: 2,\n\n# a\nb: 3)" formats "asm(\"a\" : \"b\"(c) : \"d\"(e) :: \"volatile\")" formats "asm(\"a\" : \"b\"(c) : \"d\"(e) :: \"volatile\")" formats "if 1;\n2;\nelse;\n3;\nend" formats "if 1;\n2;\nelse;\n3;\nend" formats "next { 1 , 2 }" formats "next { 1 , 2 }" formats "{ } of A => B" formats "{ } of A => B" formats "a = case 1\nwhen 2\n3\nelse\n4\nend" formats "a = case 1\nwhen 2\n3\nelse\n4\nend" formats "foo : self?" formats "foo : self?" formats "1 || 2" formats "1 || 2" formats "1.[]=(2) { 3 }" formats "1.[]=(2) { 3 }" formats "next 1 , *2" formats "next 1 , *2" formats "lib Foo\n fun foo = bar(Int32) : Int32\nend" formats "lib Foo\n fun foo = bar(Int32) : Int32\nend" formats "\"\#{ # foo\n foo = 1\n}\"" formats "\"\#{ # foo\n foo = 1\n}\"" formats "foo &.bar do\n 1 + 2\nend" formats "foo &.bar do\n 1 + 2\nend" formats "foo &.responds_to?(:foo).bar" formats "foo &.responds_to?(:foo).bar" formats " {{\n1 + 2\n }}" formats " {{\n1 + 2\n }}" formats "{\n a: 1,\n foo: bar,\n}" formats "{\n a: 1,\n foo: bar,\n}" formats "while / /\nend" formats "while / /\nend" formats "lib Bar\n enum Foo\n A\n end\nend" formats "lib Bar\n enum Foo\n A\n end\nend" formats "begin\n a\nend.b { }\nc" formats "begin\n a\nend.b { }\nc" formats "if a\n2; 3\nelse\n3\nend" formats "if a\n2; 3\nelse\n3\nend" formats "case 1 \n when 2 ,\n 3 \n 4 \n end" formats "case 1 \n when 2 ,\n 3 \n 4 \n end" formats "foo.as Int32*" formats "foo.as Int32*" formats "+ 1" formats "+ 1" formats " [ 1 , 2 , 3 ] " formats " [ 1 , 2 , 3 ] " formats "x\n# foo\n\n# bar" formats "x\n# foo\n\n# bar" formats "def foo(x)\n {% if true %}\n \\{% if true %}\n x = 1\n \\{% else %}\n x = 2\n \\{% end %}\n \\{% for x in y %}\n x = 1\n \\{% end %}\n \\{{x}}\n \\{% x %}\n {% end %}\nend" formats "def foo(x)\n {% if true %}\n \\{% if true %}\n x = 1\n \\{% else %}\n x = 2\n \\{% end %}\n \\{% for x in y %}\n x = 1\n \\{% end %}\n \\{{x}}\n \\{% x %}\n {% end %}\nend" formats "as Foo" formats "as Foo" formats "a = begin\n 1\nend\n\na =\nbegin\n 1\nend\n\na = if 1\n 2\nend\n\nb = 1\nb ||= begin\n 2\nend\n\nb ||= if 1\n 2\nend\n\nb += if 1\n 2\nend\n\nb +=\nif 1\n 2\nend\n\na, b = begin\n 1\nend\n\na, b =\nbegin\n 1\nend\n\nc[x] = begin\n 2\nend\n\nc[x] =\nbegin\n 2\nend\n\nc[x] = if 1\n 2\nend\n\nc[x] ||= begin 1\n 2\nend\n\nc[x] ||= if 1\n 2\nend\n\nc[x] += if 1\n 2\nend\n\nc[x] += begin 1\n 2\nend\n\nc[x] +=\nbegin\n 1\n 2\nend\n\nfoo.bar = begin\nend\n\nfoo.bar =\nbegin\nend\n\nfoo.bar = if\n 2\nend\n\nfoo.bar += begin\n 2\nend\n\nfoo.bar += if\n 2\nend\n\n" formats "a = begin\n 1\nend\n\na =\nbegin\n 1\nend\n\na = if 1\n 2\nend\n\nb = 1\nb ||= begin\n 2\nend\n\nb ||= if 1\n 2\nend\n\nb += if 1\n 2\nend\n\nb +=\nif 1\n 2\nend\n\na, b = begin\n 1\nend\n\na, b =\nbegin\n 1\nend\n\nc[x] = begin\n 2\nend\n\nc[x] =\nbegin\n 2\nend\n\nc[x] = if 1\n 2\nend\n\nc[x] ||= begin 1\n 2\nend\n\nc[x] ||= if 1\n 2\nend\n\nc[x] += if 1\n 2\nend\n\nc[x] += begin 1\n 2\nend\n\nc[x] +=\nbegin\n 1\n 2\nend\n\nfoo.bar = begin\nend\n\nfoo.bar =\nbegin\nend\n\nfoo.bar = if\n 2\nend\n\nfoo.bar += begin\n 2\nend\n\nfoo.bar += if\n 2\nend\n\n" formats "foo &.[](1, 2)" formats "foo &.[](1, 2)" formats "foo(baz(x, y) do\n 1 + 2\nend)" formats "foo(baz(x, y) do\n 1 + 2\nend)" formats "a = foo(bar(baz3 do\nend))" formats "a = foo(bar(baz3 do\nend))" formats "# Hello\n#\n# ```\n# puts 1+2 # bye\n# 1+2 # hello\n#\n# 1+2\n# ```\n\n# ```\n# puts 1+2\n\n# ```\n# puts 1+2\n\n# Hola\n#\n# 1+2\n# foo do\n# 3+4\n# end\n\n# Hey\n#\n# 1+2\n# foo do\n# 3+4\n# end\n#\n# ```\n# 1+2\n# ```\n#\n# 1+2\n#\n# Bye\n" formats "# Hello\n#\n# ```\n# puts 1+2 # bye\n# 1+2 # hello\n#\n# 1+2\n# ```\n\n# ```\n# puts 1+2\n\n# ```\n# puts 1+2\n\n# Hola\n#\n# 1+2\n# foo do\n# 3+4\n# end\n\n# Hey\n#\n# 1+2\n# foo do\n# 3+4\n# end\n#\n# ```\n# 1+2\n# ```\n#\n# 1+2\n#\n# Bye\n" formats "foo(\n 1, # hola\n2, # chau\n )" formats "foo(\n 1, # hola\n2, # chau\n )" formats "@a" formats "@a" formats "begin\n1\n2\n3\nend" formats "begin\n1\n2\n3\nend" formats "foo bar:baz, qux:other" formats "foo bar:baz, qux:other" formats "1.!=() { 3 }" formats "1.!=() { 3 }" formats "~ 1" formats "~ 1" formats "->Foo.foo!" formats "->Foo.foo!" formats "module Foo\n 1 # bar\nend\n\nmodule Foo\n 1\n # bar\nend\n\nmodule Foo\n 1\n\n # bar\nend\n\nmodule Foo\n 1\n 2\n # bar\nend\n\nmodule Foo\n 1\n 2\n\n # bar\nend\n\nif 1\n 1\n # bar\nend\n\nif 1\n 1\n\n # bar\nend\n\n1\n2\n# foo\n\n1\n2\n\n# foo\n" formats "module Foo\n 1 # bar\nend\n\nmodule Foo\n 1\n # bar\nend\n\nmodule Foo\n 1\n\n # bar\nend\n\nmodule Foo\n 1\n 2\n # bar\nend\n\nmodule Foo\n 1\n 2\n\n # bar\nend\n\nif 1\n 1\n # bar\nend\n\nif 1\n 1\n\n # bar\nend\n\n1\n2\n# foo\n\n1\n2\n\n# foo\n" formats "foo = 1\n->foo.bar(Int32*)" formats "foo = 1\n->foo.bar(Int32*)" formats "macro [](x)\nend" formats "macro [](x)\nend" formats "def foo\n\n1\n\nend" formats "def foo\n\n1\n\nend" formats "{{ foo <<-X\nbar\nX\n}}" formats "{{ foo <<-X\nbar\nX\n}}" formats "# ```text\n# 1 + 2\n# ```\n#\n# ```\n# 3 + 4\n# ```" formats "# ```text\n# 1 + 2\n# ```\n#\n# ```\n# 3 + 4\n# ```" formats "foo.bar += 2" formats "foo.bar += 2" formats "foo(bar(baz3 do\nend))" formats "foo(bar(baz3 do\nend))" formats "{ {1, 2, 3} }" formats "{ {1, 2, 3} }" formats "def foo ( x : self ) \n end" formats "def foo ( x : self ) \n end" formats "macro foo\n 1 \n {{ \n 42 \n }} \n 2 \nend" formats "macro foo\n 1 \n {{ \n 42 \n }} \n 2 \nend" formats "foo([\n 1,\n 2,\n 3,\n])" formats "foo([\n 1,\n 2,\n 3,\n])" formats "foo(\n 1,\n a: 1,\n b: 2,\n)" formats "foo(\n 1,\n a: 1,\n b: 2,\n)" formats "return( *1 , *2 )" formats "return( *1 , *2 )" formats "break 1 , *2" formats "break 1 , *2" formats "def foo\n1\nend" formats "def foo\n1\nend" formats "->@foo.foo!" formats "->@foo.foo!" formats "foo a , b , x: 1" formats "foo a , b , x: 1" formats "1 +\n # foo\n 2" formats "1 +\n # foo\n 2" formats "{ # foo\n 1 => 2,\n}" formats "{ # foo\n 1 => 2,\n}" formats "alias A = (B)" formats "alias A = (B)" formats "asm(\"nop\" ::: \"eax\" )" formats "asm(\"nop\" ::: \"eax\" )" formats "yield( 1 , 2 )" formats "yield( 1 , 2 )" formats "->{}" formats "->{}" formats "foo do \n x \n end" formats "foo do \n x \n end" formats "foo(\n # foo\n1,\n\n # bar\n2, \n)" formats "foo(\n # foo\n1,\n\n # bar\n2, \n)" formats "foo(self // 1)" formats "foo(self // 1)" formats "asm(\"a\" :: : : \"volatile\")" formats "asm(\"a\" :: : : \"volatile\")" formats "1\n..\n2" formats "1\n..\n2" formats "foo( 1 , 2 )" formats "foo( 1 , 2 )" formats "asm(\"a\" : \"b\"(c) : \"d\"(e)\n : \"f\",\n \"g\")" formats "asm(\"a\" : \"b\"(c) : \"d\"(e)\n : \"f\",\n \"g\")" formats "loop do\n 1\nrescue\n 2\nend" formats "loop do\n 1\nrescue\n 2\nend" formats "asm(\"a\" : : :: \"volatile\")" formats "asm(\"a\" : : :: \"volatile\")" formats " <<-HTML\n hello \n world \n HTML" formats " <<-HTML\n hello \n world \n HTML" formats "case 1 \n when 2 , 3 \n 4 \n end" formats "case 1 \n when 2 , 3 \n 4 \n end" formats "%i(one two three)" formats "%i(one two three)" formats "foo &.responds_to?(:foo)" formats "foo &.responds_to?(:foo)" formats "foo.@bar" formats "foo.@bar" formats "if a\n # hello\n 2\nend" formats "if a\n # hello\n 2\nend" formats "def foo( x , & block : Int32->Float64)\nend" formats "def foo( x , & block : Int32->Float64)\nend" formats "def foo(\n **a # comment\n)\n 1\nend" formats "def foo(\n **a # comment\n)\n 1\nend" formats "def foo\n {% if flag?(:foo) %}\n foo + bar\n {% else %}\n baz + qux\n {% end %}\nend" formats "def foo\n {% if flag?(:foo) %}\n foo + bar\n {% else %}\n baz + qux\n {% end %}\nend" formats "asm(\"nop\" ::: \"eax\" , \"ebx\" )" formats "asm(\"nop\" ::: \"eax\" , \"ebx\" )" formats "->do\nx\nend" formats "->do\nx\nend" formats "require \"foo\"" formats "require \"foo\"" formats "SomeLib.UppercasedFunCall 1, 2" formats "SomeLib.UppercasedFunCall 1, 2" formats "macro foo()\nend" formats "macro foo()\nend" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n @[MyAnn] @[MyAnn] baz,\n @[MyAnn]\n @[MyAnn]\n biz\n); end" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n @[MyAnn] @[MyAnn] baz,\n @[MyAnn]\n @[MyAnn]\n biz\n); end" formats "if 1\n2 && 3\nend" formats "if 1\n2 && 3\nend" formats "macro foo\n {% for x in y %}\\ 2 {% end %}\\\nend" formats "macro foo\n {% for x in y %}\\ 2 {% end %}\\\nend" formats "\"foo \#{ __DIR__ }\"" formats "\"foo \#{ __DIR__ }\"" formats "lib LibFoo\n struct Bar\n {% begin %}\n x : Int32\n {% end %}\n end\nend" formats "lib LibFoo\n struct Bar\n {% begin %}\n x : Int32\n {% end %}\n end\nend" formats "&+ 1" formats "&+ 1" formats "#!shebang\n1 + 2" formats "#!shebang\n1 + 2" formats "def foo(\n @[MyAnn]\n bar\n); end" formats "def foo(\n @[MyAnn]\n bar\n); end" formats "return *1 , *2" formats "return *1 , *2" formats "1.>=(2) { 3 }" formats "1.>=(2) { 3 }" formats "->foo" formats "->foo" formats "def foo(&: Int32)\nend" formats "def foo(&: Int32)\nend" formats "if a\n2\nelse\n3\nend" formats "if a\n2\nelse\n3\nend" formats "foo[ 1, 2 ]?" formats "foo[ 1, 2 ]?" formats "def foo(x @@y)\nend" formats "def foo(x @@y)\nend" formats "if a\n b &c\nend" formats "if a\n b &c\nend" formats "foo {;1}" formats "foo {;1}" formats "case foo\nwhen 1\n # A\nelse\n# B\nend\n" formats "case foo\nwhen 1\n # A\nelse\n# B\nend\n" formats "1..\n2" formats "1..\n2" formats "lib Foo\n fun Foo = Bar\nend" formats "lib Foo\n fun Foo = Bar\nend" formats "foo &.@bar" formats "foo &.@bar" formats "$~" formats "$~" formats "{% verbatim do %}\n <<-FOO\n hello \n FOO\n{% end %}" formats "{% verbatim do %}\n <<-FOO\n hello \n FOO\n{% end %}" formats "if 1 &&\n2 &&\n3\n4\nend" formats "if 1 &&\n2 &&\n3\n4\nend" formats "if 1\n foo(\n 1,\n 2 # lala\n )\nend\n" formats "if 1\n foo(\n 1,\n 2 # lala\n )\nend\n" formats "foo do # a\n # b\n bar\nend" formats "foo do # a\n # b\n bar\nend" formats "foo x, self // 1" formats "foo x, self // 1" formats "def foo\n 1 #\nrescue\nend" formats "def foo\n 1 #\nrescue\nend" formats "[ # foo\n 1,\n]" formats "[ # foo\n 1,\n]" formats "case 1 \n when 2 \n 3 \n else \n 4 \n end" formats "case 1 \n when 2 \n 3 \n else \n 4 \n end" formats "while 1 &&\n2 &&\n3\n4\nend" formats "while 1 &&\n2 &&\n3\n4\nend" formats "macro foo( x = 1, y = 2, &block)\nend" formats "macro foo( x = 1, y = 2, &block)\nend" formats "foo 1 , 2" formats "foo 1 , 2" formats "case 1 \n when .foo? \n 3 \n end" formats "case 1 \n when .foo? \n 3 \n end" formats "struct Foo(T)\n# bar\n1\nend" formats "struct Foo(T)\n# bar\n1\nend" formats "foo : (Array(String)?) | String" formats "foo : (Array(String)?) | String" formats "return {1, 2}, 3" formats "return {1, 2}, 3" formats "foo.bar &.baz( 1 , 2 )" formats "foo.bar &.baz( 1 , 2 )" formats "@[::Foo::Bar]" formats "@[::Foo::Bar]" formats "begin\n 0[1] rescue 2 end" formats "begin\n 0[1] rescue 2 end" formats " {{\n1 + 2 }}" formats " {{\n1 + 2 }}" formats "foo { | a, ( b , c ) | a + b + c }" formats "foo { | a, ( b , c ) | a + b + c }" formats "long_variable_name = [1, 2, 3, # foo\n 4, 5, 6]" formats "long_variable_name = [1, 2, 3, # foo\n 4, 5, 6]" formats "def foo : A | B(C)\n nil\nend" formats "def foo : A | B(C)\n nil\nend" formats "bar do\n foo <<-X\n bar\n X\nend" formats "bar do\n foo <<-X\n bar\n X\nend" formats "<<-FOO\nfoo\nfoo\nFOO" formats "<<-FOO\nfoo\nfoo\nFOO" formats "unless a\n # hello\n 2\nend" formats "unless a\n # hello\n 2\nend" formats "x 1, \\\n 2" formats "x 1, \\\n 2" formats "A = 10\nFOO = 123\nBARBAZ = 1234\n" formats "A = 10\nFOO = 123\nBARBAZ = 1234\n" formats "asm(\"nop\" ::: \"eax\" , \"ebx\" : \"volatile\" , \"alignstack\" )" formats "asm(\"nop\" ::: \"eax\" , \"ebx\" : \"volatile\" , \"alignstack\" )" formats "Foo( Bar( ) )" formats "Foo( Bar( ) )" formats "-> : Int32* {}" formats "-> : Int32* {}" adds `&` to yielding methods that don't have a block parameter (#8764) formats "def foo(\nx, y)\n yield\nend" formats "def foo(\nx, y)\n yield\nend" formats "def foo # bar\n yield\nend" formats "def foo # bar\n yield\nend" formats "def foo()\n yield\nend" formats "def foo()\n yield\nend" formats "def foo(x,\ny)\n yield\nend" formats "def foo(x,\ny)\n yield\nend" formats "def foo(\nx,\n)\n yield\nend" formats "def foo(\nx,\n)\n yield\nend" formats "def foo(a, **b)\n yield\nend" formats "def foo(a, **b)\n yield\nend" formats "def foo(x\n)\n yield\nend" formats "def foo(x\n)\n yield\nend" formats "def foo(x)\n yield\nend" formats "def foo(x)\n yield\nend" formats "macro f\n yield\n {{ yield }}\nend" formats "macro f\n yield\n {{ yield }}\nend" formats "def foo(\nx,\ny)\n yield\nend" formats "def foo(\nx,\ny)\n yield\nend" formats "def foo(\n)\n yield\nend" formats "def foo(\n)\n yield\nend" formats "def foo(\nx)\n yield\nend" formats "def foo(\nx)\n yield\nend" formats "def foo(x ,)\n yield\nend" formats "def foo(x ,)\n yield\nend" formats "def foo(x,\n)\n yield\nend" formats "def foo(x,\n)\n yield\nend" formats "def foo\n yield\nend" formats "def foo\n yield\nend" formats "def foo(x,\ny,)\n yield\nend" formats "def foo(x,\ny,)\n yield\nend" formats "while 1\n2\nend" formats "while 1\n2\nend" formats "{\n \"a\" => 1, \"b\" => 2,\n \"foo\" => 3, \"bar\" => 4,\n \"coconio\" => 5, \"lala\" => 6,\n}\n" formats "{\n \"a\" => 1, \"b\" => 2,\n \"foo\" => 3, \"bar\" => 4,\n \"coconio\" => 5, \"lala\" => 6,\n}\n" formats "foo . is_a? ( Bar )" formats "foo . is_a? ( Bar )" formats "foo.responds_to? :bar\n1" formats "foo.responds_to? :bar\n1" formats "bar = foo({\n 1 => 2,\n 3 => 4,\n 5 => 6,\n })" formats "bar = foo({\n 1 => 2,\n 3 => 4,\n 5 => 6,\n })" formats "1\nyield\n2" formats "1\nyield\n2" formats "def a\n b(\n 1, # x\n # y\n a: 1, # x\n # y\n b: 2 # z\n )\nend" formats "def a\n b(\n 1, # x\n # y\n a: 1, # x\n # y\n b: 2 # z\n )\nend" formats "1.!=(2) { 3 }" formats "1.!=(2) { 3 }" formats "foo[bar.baz]\n .qux" formats "foo[bar.baz]\n .qux" formats "asm(\n\"nop\" : \"a\"(0), \"b\"(1) )" formats "asm(\n\"nop\" : \"a\"(0), \"b\"(1) )" formats "yield 1 , 2" formats "yield 1 , 2" formats "if 1\n[\n a() # b\n]\nend" formats "if 1\n[\n a() # b\n]\nend" formats "\"hel\\nlo\"" formats "\"hel\\nlo\"" formats "$1.bar" formats "$1.bar" formats "<<-HTML\n \#{\"foo\"}\n \#{\"bar\"}\n HTML" formats "<<-HTML\n \#{\"foo\"}\n \#{\"bar\"}\n HTML" formats "\"\\\\\\\"\\#\\a\\b\\n\\r\\t\\v\\f\\e\"" formats "\"\\\\\\\"\\#\\a\\b\\n\\r\\t\\v\\f\\e\"" formats "1234 # foo\n1 # bar" formats "1234 # foo\n1 # bar" formats "lib Foo\nfun foo(x : Int32, ... ) : Int32\nend" formats "lib Foo\nfun foo(x : Int32, ... ) : Int32\nend" formats "-> : {Int32} { String }" formats "-> : {Int32} { String }" formats "module Foo ( U, *T ); 1; end" formats "module Foo ( U, *T ); 1; end" formats "asm(\"a\" : \"b\"(1), \"c\"(2) : \"d\"(3) : : \"volatile\")" formats "asm(\"a\" : \"b\"(1), \"c\"(2) : \"d\"(3) : : \"volatile\")" formats "1.as? Int32" formats "1.as? Int32" formats "<<-HTML\n \#{\"fo\#{\"o\"}\"}\n HTML" formats "<<-HTML\n \#{\"fo\#{\"o\"}\"}\n HTML" formats "def foo( & )\nend" formats "def foo( & )\nend" formats "alignof( Int32 )" formats "alignof( Int32 )" formats "enum Baz\nA = 1\nFOO\n\nEX = 3\nend" formats "enum Baz\nA = 1\nFOO\n\nEX = 3\nend" formats "unless a\n2\n3\nend" formats "unless a\n2\n3\nend" formats "return( 1 , 2 )" formats "return( 1 , 2 )" formats " <<-HTML\n foo\nHTML" formats " <<-HTML\n foo\nHTML" formats "def foo\n <<-FOO\n foo \#{1}\n FOO\nend" formats "def foo\n <<-FOO\n foo \#{1}\n FOO\nend" formats "a = 1 + # foo\n2" formats "a = 1 + # foo\n2" formats "-> : Int32 {}" formats "-> : Int32 {}" formats "case / /\nwhen /x/, / /\n / /\nend" formats "case / /\nwhen /x/, / /\n / /\nend" formats "def foo : Int32\n 1\nend" formats "def foo : Int32\n 1\nend" formats "foo a: 1\nb" formats "foo a: 1\nb" formats "select\n# when foo\nwhen bar\n break\nend" formats "select\n# when foo\nwhen bar\n break\nend" formats "{% if flag?(:freebsd) %}\n 1 + 2\n{% end %}\n\ncase x\nwhen 1234 then 1\nelse x\nend" formats "{% if flag?(:freebsd) %}\n 1 + 2\n{% end %}\n\ncase x\nwhen 1234 then 1\nelse x\nend" formats "\"\\a\\c\#{foo}\\b\\d\"" formats "\"\\a\\c\#{foo}\\b\\d\"" formats "{1 => 2, 3 => 4}\n{5234234 => 234098234, 7 => 8}" formats "{1 => 2, 3 => 4}\n{5234234 => 234098234, 7 => 8}" formats "{ {% for x in 1..2 %}3{% end %}, nil }" formats "{ {% for x in 1..2 %}3{% end %}, nil }" formats "macro foo\n {% if 1 %} 2 {% elsif 3 %} 4 {% else %} 5 {% end %}\nend" formats "macro foo\n {% if 1 %} 2 {% elsif 3 %} 4 {% else %} 5 {% end %}\nend" formats "foo &.[]( 1, 2 )" formats "foo &.[]( 1, 2 )" formats "0x1234_u32" formats "0x1234_u32" formats "next" formats "next" formats "{\n query => <<-HEREDOC,\n foo\n HEREDOC\n}" formats "{\n query => <<-HEREDOC,\n foo\n HEREDOC\n}" formats "foo \\\n foo: 1,\n bar: 2" formats "foo \\\n foo: 1,\n bar: 2" formats "begin\n1\nrescue ex : Int32 \n3\nend" formats "begin\n1\nrescue ex : Int32 \n3\nend" formats "def foo\n 1\n 2\nrescue IO\n 1\nend" formats "def foo\n 1\n 2\nrescue IO\n 1\nend" formats "foo = [1, [2,\n 3],\n 4]" formats "foo = [1, [2,\n 3],\n 4]" formats "def foo(x : ( A | B )) : ( A | B )\nend" formats "def foo(x : ( A | B )) : ( A | B )\nend" formats "::NamedTuple()" formats "::NamedTuple()" formats "def foo(a, **b, # comment\n &block)\nend" formats "def foo(a, **b, # comment\n &block)\nend" formats "::NamedTuple(T)" formats "::NamedTuple(T)" formats "private getter foo" formats "private getter foo" formats "a=1" formats "a=1" formats "def foo(x, **z)\nend" formats "def foo(x, **z)\nend" formats "page= <<-HTML\n \#{1}foo\nHTML" formats "page= <<-HTML\n \#{1}foo\nHTML" formats "{ 1 => 2 ,\n 3 => 4 }" formats "{ 1 => 2 ,\n 3 => 4 }" formats "def foo\nselect \n when foo \n 2 \n else \n 3 \nend\nend" formats "def foo\nselect \n when foo \n 2 \n else \n 3 \nend\nend" formats "{%\n unless true\n 1\n end\n%}" formats "{%\n unless true\n 1\n end\n%}" formats "def foo ( @@x) \n end" formats "def foo ( @@x) \n end" formats "struct Foo \n\n 1 \n\nend" formats "struct Foo \n\n 1 \n\nend" formats "def foo(\n\n#foo\nx,\n\n#bar\nz\n)\nend" formats "def foo(\n\n#foo\nx,\n\n#bar\nz\n)\nend" formats "1 ;\n 2" formats "1 ;\n 2" formats "-> : {x: Int32, y: String} {}" formats "-> : {x: Int32, y: String} {}" formats "foo.[1]" formats "foo.[1]" formats "def x(@y = ->(z) {})\nend" formats "def x(@y = ->(z) {})\nend" formats "macro foo\n {% if 1 %}\\ 2 {% else %}\\ 3 {% end %}\\\nend" formats "macro foo\n {% if 1 %}\\ 2 {% else %}\\ 3 {% end %}\\\nend" formats "'\\n'" formats "'\\n'" formats "1.[]= { 3 }" formats "1.[]= { 3 }" formats "if 1\n {% if 2 %} {% end %}\nend" formats "if 1\n {% if 2 %} {% end %}\nend" formats "if 1;\n2;\nelsif 3;\n4;\nend" formats "if 1;\n2;\nelsif 3;\n4;\nend" formats " <<-EOF\n 1\n EOF" formats " <<-EOF\n 1\n EOF" formats "{% if 1 %}\n 2\n{% end %}\ndef foo\nend" formats "{% if 1 %}\n 2\n{% end %}\ndef foo\nend" formats "foo(->do\n 1 + 2\nend)" formats "foo(->do\n 1 + 2\nend)" formats "{1, 2, 3}" formats "{1, 2, 3}" formats "def foo(x : (A | B)) \n end" formats "def foo(x : (A | B)) \n end" formats "{% foo <<-X\nbar\nX\n%}" formats "{% foo <<-X\nbar\nX\n%}" formats "while 1 # foo\nend" formats "while 1 # foo\nend" formats "%w(\n one two\n three four\n)" formats "%w(\n one two\n three four\n)" formats "->foo!" formats "->foo!" formats ":*" formats ":*" formats "a = \\\n # foo\n bar(1)" formats "a = \\\n # foo\n bar(1)" formats "@[ Foo(foo: 1) ]\ndef foo\nend" formats "@[ Foo(foo: 1) ]\ndef foo\nend" formats "class Foo\n NamedTuple(\n a: Int32,\n )\nend" formats "class Foo\n NamedTuple(\n a: Int32,\n )\nend" formats "a = [\n1,\n2]" formats "a = [\n1,\n2]" formats "foo" formats "foo" formats "class Foo \n\n 1 \n\nend" formats "class Foo \n\n 1 \n\nend" formats "1/2" formats "1/2" formats "->{\n # first comment\n puts \"hi\"\n # second comment\n}" formats "->{\n # first comment\n puts \"hi\"\n # second comment\n}" formats "foo\n .foo1(bar\n .bar1\n .bar2)" formats "foo\n .foo1(bar\n .bar1\n .bar2)" formats "->\n:\nInt32\n{\n}" formats "->\n:\nInt32\n{\n}" formats "{ {1}.foo, 2 }" formats "{ {1}.foo, 2 }" formats "instance_alignof( Int32 )" formats "instance_alignof( Int32 )" formats "foo ( )" formats "foo ( )" formats "def foo\n1\nrescue\n2\nend" formats "def foo\n1\nrescue\n2\nend" formats "foo(&.@bar)" formats "foo(&.@bar)" formats "foo : ( A | B )" formats "foo : ( A | B )" formats "case nil\nelse nil; nil # comment\nend" formats "case nil\nelse nil; nil # comment\nend" formats "0i64" formats "0i64" formats "def foo( & block )\nend" formats "def foo( & block )\nend" formats "foo do\n # bar\nend" formats "foo do\n # bar\nend" formats "{ %() }" formats "{ %() }" formats "foo.bar. as Int32" formats "foo.bar. as Int32" formats "def foo\n@x : Int32\nend" formats "def foo\n@x : Int32\nend" formats "unless a\n2; 3\nelse\n3\nend" formats "unless a\n2; 3\nelse\n3\nend" formats "lib Foo\n fun foo =\n\n\n bar : Void\nend" formats "lib Foo\n fun foo =\n\n\n bar : Void\nend" formats "def foo(@[MyAnn] & : String -> Nil); end" formats "def foo(@[MyAnn] & : String -> Nil); end" formats "foo &.[]=( 1, 2 )" formats "foo &.[]=( 1, 2 )" formats "foo &.as?(T).bar" formats "foo &.as?(T).bar" formats "case 1\nwhen a; 2\nelse; ; b\nend" formats "case 1\nwhen a; 2\nelse; ; b\nend" formats "FOO = 2 + 3\nA = 1 - 10" formats "FOO = 2 + 3\nA = 1 - 10" formats "{ {1 => 2} }" formats "{ {1 => 2} }" formats "alias A = ({A, (B)})" formats "alias A = ({A, (B)})" formats "break {1, 2}, {3, 4}" formats "break {1, 2}, {3, 4}" formats "asm(\"nop\" : \"a\"(0),\n\"b\"(1)\n: \"c\"(2), \"d\"(3) )" formats "asm(\"nop\" : \"a\"(0),\n\"b\"(1)\n: \"c\"(2), \"d\"(3) )" formats "1 && # foo\n 2 &&\n 3" formats "1 && # foo\n 2 &&\n 3" formats "/\#{1}/imx" formats "/\#{1}/imx" formats "1 \\\n+ 2" formats "1 \\\n+ 2" formats "def foo(\n foo,\n @[MyAnn] &block\n); end" formats "def foo(\n foo,\n @[MyAnn] &block\n); end" formats "1 rescue 2" formats "1 rescue 2" formats "if 1\n node.is_a?(T)\nend" formats "if 1\n node.is_a?(T)\nend" formats "asm(\"nop\" : \"a\"(0)\n: \"b\"(1),\n\"c\"(2) )" formats "asm(\"nop\" : \"a\"(0)\n: \"b\"(1),\n\"c\"(2) )" formats ":^" formats ":^" formats "foo.bar\n .baz(\n 1\n )" formats "foo.bar\n .baz(\n 1\n )" formats "x : {A, B}" formats "x : {A, B}" formats "1 + \\\n2" formats "1 + \\\n2" formats ":foo" formats ":foo" formats "def foo ( x ) \n end" formats "def foo ( x ) \n end" formats "macro flags\n {% if 1 %}{{1}}a{{2}}{% end %}\\\nend" formats "macro flags\n {% if 1 %}{{1}}a{{2}}{% end %}\\\nend" formats "foo\n .bar(\n 1\n )" formats "foo\n .bar(\n 1\n )" formats "[\n <<-EOF,\n foo\n EOF\n <<-BAR,\n bar\n BAR\n]" formats "[\n <<-EOF,\n foo\n EOF\n <<-BAR,\n bar\n BAR\n]" formats "# foo\ndef foo\nend\n# bar\ndef bar\nend" formats "# foo\ndef foo\nend\n# bar\ndef bar\nend" formats "1 # foo\n/ 1 /" formats "1 # foo\n/ 1 /" formats "def foo()\n1\nend" formats "def foo()\n1\nend" formats "foo.[ 1, 2 ]?" formats "foo.[ 1, 2 ]?" formats "def foo(\nx, #foo\nz #bar\n)\nend" formats "def foo(\nx, #foo\nz #bar\n)\nend" formats "foo {;;1}" formats "foo {;;1}" formats "()" formats "()" formats "String?" formats "String?" formats "1.=== { 3 }" formats "1.=== { 3 }" formats "1\n.." formats "1\n.." formats "::Pointer(T)" formats "::Pointer(T)" formats ":\"foo\"" formats ":\"foo\"" formats "'a'" formats "'a'" formats "1 + \n2" formats "1 + \n2" formats "<<-FOO\nfoo\n1\nFOO" formats "<<-FOO\nfoo\n1\nFOO" formats "-> :: foo?" formats "-> :: foo?" formats "lib Foo\nalias Foo = Bar -> \n$a : Int32\nend" formats "lib Foo\nalias Foo = Bar -> \n$a : Int32\nend" formats "begin; 1; end" formats "begin; 1; end" formats "def foo ( x ) : Int32 \n end" formats "def foo ( x ) : Int32 \n end" formats "a = case 1\nwhen 2\n3\nend" formats "a = case 1\nwhen 2\n3\nend" formats "__LINE__" formats "__LINE__" formats "foo(1, 2, {\n foo: 1,\n bar: 2,\n})" formats "foo(1, 2, {\n foo: 1,\n bar: 2,\n})" formats "class Foo\ndef foo\n1\nensure\n2\nend\nend" formats "class Foo\ndef foo\n1\nensure\n2\nend\nend" formats "def foo ( @select) \n end" formats "def foo ( @select) \n end" formats "begin\n # Comment\n\n\nend" formats "begin\n # Comment\n\n\nend" formats "case 1\nwhen 2\n\n#comment\nend" formats "case 1\nwhen 2\n\n#comment\nend" formats "foo &.bar( 1 , 2 )" formats "foo &.bar( 1 , 2 )" formats " _ , *_ ,\na.foo ,a.bar = 1 , 2,3" formats " _ , *_ ,\na.foo ,a.bar = 1 , 2,3" formats "macro foo\n {{x}} <<-FOO\n hello \n FOO\nend" formats "macro foo\n {{x}} <<-FOO\n hello \n FOO\nend" formats "foo : A(B)\nbar : C" formats "foo : A(B)\nbar : C" formats "def foo(x = __FILE__ )\nend" formats "def foo(x = __FILE__ )\nend" formats "foo &.[]" formats "foo &.[]" formats "# ```text\n# 1 + 2\n# ```" formats "# ```text\n# 1 + 2\n# ```" formats "long_variable_name = [1, 2, 3,\n 4, 5, 6]" formats "long_variable_name = [1, 2, 3,\n 4, 5, 6]" formats "def foo(@[AnnOne] @[AnnTwo] & ); end" formats "def foo(@[AnnOne] @[AnnTwo] & ); end" formats "begin\n1\nrescue ex\n3\nelse\n4\nend" formats "begin\n1\nrescue ex\n3\nelse\n4\nend" formats "Hash{\n foo => <<-EOF\n foo\n EOF\n}" formats "Hash{\n foo => <<-EOF\n foo\n EOF\n}" formats " {% for x in y %} 2 {% end %}" formats " {% for x in y %} 2 {% end %}" formats "begin\n begin\n a\n # b\n end\nend" formats "begin\n begin\n a\n # b\n end\nend" formats "require \"foo\"\n\n@x : Int32\n\nclass Bar\nend" formats "require \"foo\"\n\n@x : Int32\n\nclass Bar\nend" formats "a &.a.!" formats "a &.a.!" formats "foo.[ 1 , 2 ] =3" formats "foo.[ 1 , 2 ] =3" formats "1 #foo \n2 #bar" formats "1 #foo \n2 #bar" formats "asm(\"nop\" : \"a\"(0) )" formats "asm(\"nop\" : \"a\"(0) )" formats "1 # foo\n/ 1 /" formats "1 # foo\n/ 1 /" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n\n @[MyAnn] @[MyAnn] baz,\n\n @[MyAnn]\n\n @[MyAnn]\n\n biz\n); end" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n\n @[MyAnn] @[MyAnn] baz,\n\n @[MyAnn]\n\n @[MyAnn]\n\n biz\n); end" formats "a = 1\ncase\nwhen 2\nelse\n a /= 3\nend" formats "a = 1\ncase\nwhen 2\nelse\n a /= 3\nend" formats "foo(out x)" formats "foo(out x)" formats "\"\#{\"foo\"}\"" formats "\"\#{\"foo\"}\"" formats "asm(\"a\" ::: \"f\"\n)" formats "asm(\"a\" ::: \"f\"\n)" formats "asm(\"a\" ::: \"a\"\n : \"volatile\",\n \"intel\")" formats "asm(\"a\" ::: \"a\"\n : \"volatile\",\n \"intel\")" formats " <<-HTML\n \#{1}\n HTML" formats " <<-HTML\n \#{1}\n HTML" formats "foo &.[]=(1, 2)" formats "foo &.[]=(1, 2)" formats "foo(1 ||\n # foo\n 2)" formats "foo(1 ||\n # foo\n 2)" formats "->{\nx\n}" formats "->{\nx\n}" formats "def foo : A(B)\n nil\nend" formats "def foo : A(B)\n nil\nend" formats "lib Foo\n fun Bar\nend" formats "lib Foo\n fun Bar\nend" formats "foo(1, # foo\n &.bar)" formats "foo(1, # foo\n &.bar)" formats "1.[]=() { 3 }" formats "1.[]=() { 3 }" formats "foo([\n 1,\n bar do\n end,\n [\n 2,\n ],\n])" formats "foo([\n 1,\n bar do\n end,\n [\n 2,\n ],\n])" formats "def foo ( &@block) \n end" formats "def foo ( &@block) \n end" formats "%{hello}" formats "%{hello}" formats "coco.lala\nfoo\n .bar" formats "coco.lala\nfoo\n .bar" formats "def foo(a,\n *b)\nend" formats "def foo(a,\n *b)\nend" formats "lib Foo\nstruct Foo\nx : Int32\ny : Float64\nend\nend" formats "lib Foo\nstruct Foo\nx : Int32\ny : Float64\nend\nend" formats "return( 1 )" formats "return( 1 )" formats "def foo\n {{@type}}\nend" formats "def foo\n {{@type}}\nend" formats "%r(foo \#{ bar })" formats "%r(foo \#{ bar })" formats "if a\nelse\n2\nend" formats "if a\nelse\n2\nend" formats "next *1 , *2" formats "next *1 , *2" formats "@x[ 1 ] &&= 2" formats "@x[ 1 ] &&= 2" formats "foo(a: //, b: //)" formats "foo(a: //, b: //)" formats "foo &.[]?(1, 2)" formats "foo &.[]?(1, 2)" formats "foo(bar(\n 1,\n baz(2,\n 3,\n )\n))" formats "foo(bar(\n 1,\n baz(2,\n 3,\n )\n))" formats "1 #=> 2" formats "1 #=> 2" assert assert formats "-> : Int32? {}" formats "-> : Int32? {}" formats "x[ y ] += 1" formats "x[ y ] += 1" formats "case 1\nwhen 8 then 1\nwhen 16 then 2\nwhen 256 then 3\nwhen 'a' then 5\nwhen \"foo\" then 6\nelse 4\nend" formats "case 1\nwhen 8 then 1\nwhen 16 then 2\nwhen 256 then 3\nwhen 'a' then 5\nwhen \"foo\" then 6\nelse 4\nend" formats "foo(\"b\#{1}\" \\\n\"baz\")" formats "foo(\"b\#{1}\" \\\n\"baz\")" formats "foo a , **b" formats "foo a , **b" formats " {{ 1 + 2 }}" formats " {{ 1 + 2 }}" formats "foo.as?(T).bar" formats "foo.as?(T).bar" formats "def foo(@[AnnOne] @[AnnTwo] v); end" formats "def foo(@[AnnOne] @[AnnTwo] v); end" formats "{\n foo: 1,\n b: 2,\n barbaz: 3,\n}" formats "{\n foo: 1,\n b: 2,\n barbaz: 3,\n}" formats "a , b = 1 , 2" formats "a , b = 1 , 2" formats "lib Foo\nunion Foo\nend\nend" formats "lib Foo\nunion Foo\nend\nend" formats "->@foo.foo" formats "->@foo.foo" formats "module Ton\n macro foo\n class {{name.id}}\n end\n end\nend" formats "module Ton\n macro foo\n class {{name.id}}\n end\n end\nend" formats "foo(baz1 do\nend)" formats "foo(baz1 do\nend)" formats "{\n \"foo\": 1,\n \"babraz\": 2,\n}" formats "{\n \"foo\": 1,\n \"babraz\": 2,\n}" formats "\n# hello\n1" formats "\n# hello\n1" formats "foo . bar( x , y )" formats "foo . bar( x , y )" formats "->@@foo.foo" formats "->@@foo.foo" formats "def foo(a : T) forall T\n #\n\n\nend" formats "def foo(a : T) forall T\n #\n\n\nend" formats "foo(1, / /)" formats "foo(1, / /)" formats "(1 .. )" formats "(1 .. )" formats "foo(a: //)" formats "foo(a: //)" formats "yield( *1 , *2 )" formats "yield( *1 , *2 )" formats "return 1 , *2" formats "return 1 , *2" formats "[\n1,\n\n2]" formats "[\n1,\n\n2]" formats "# Hello\n#\n# ```cr\n# 1\n# ```\n# Bye" formats "# Hello\n#\n# ```cr\n# 1\n# ```\n# Bye" formats "[ * [ * [ 1 ] ], * \n[ 2] ]" formats "[ * [ * [ 1 ] ], * \n[ 2] ]" formats "def foo ( x : Foo.class ) \n end" formats "def foo ( x : Foo.class ) \n end" formats "def foo(x : (self)?)\nend" formats "def foo(x : (self)?)\nend" formats "macro foo(x)\n {% if 1 %} 2 {% end %}\nend" formats "macro foo(x)\n {% if 1 %} 2 {% end %}\nend" formats "foo 1, # comment\n do\n end" formats "foo 1, # comment\n do\n end" formats "a.!" formats "a.!" formats "{ {foo: 2} }" formats "{ {foo: 2} }" formats "return 1" formats "return 1" formats "def foo(a : T) forall T\n #\n\nend" formats "def foo(a : T) forall T\n #\n\nend" formats "if 1\ncase 1\nwhen 2\n3\nend\nend" formats "if 1\ncase 1\nwhen 2\n3\nend\nend" formats "&- 1" formats "&- 1" formats "foo do\n bar do\n foo <<-X\n bar\n X\n end\nend" formats "foo do\n bar do\n foo <<-X\n bar\n X\n end\nend" formats "__FILE__" formats "__FILE__" formats "[\n <<-EOF,\n foo\n EOF\n]" formats "[\n <<-EOF,\n foo\n EOF\n]" formats "begin 0[1] rescue 2 end" formats "begin 0[1] rescue 2 end" formats "foo &.bar.nil?" formats "foo &.bar.nil?" formats "{% if true %}\n # x\n #\n{% end %}\n\n# ```\n# x\n# ```" formats "{% if true %}\n # x\n #\n{% end %}\n\n# ```\n# x\n# ```" formats " <<-EOF\n 1\nEOF" formats " <<-EOF\n 1\nEOF" formats "1 if 2\n# foo" formats "1 if 2\n# foo" formats "break( 1 )" formats "break( 1 )" formats "unless a\n2\nelse\n3\nend" formats "unless a\n2\nelse\n3\nend" formats "macro flags\n {% if 1 %}\\\n 1 {% else %}\\\n {% end %}\\\nend" formats "macro flags\n {% if 1 %}\\\n 1 {% else %}\\\n {% end %}\\\nend" formats "responds_to? :foo" formats "responds_to? :foo" formats "1 ... 2" formats "1 ... 2" formats "def foo(@[AnnOne] @[AnnTwo] &block : Int32 -> ); end" formats "def foo(@[AnnOne] @[AnnTwo] &block : Int32 -> ); end" formats "1 \\\nif 2" formats "1 \\\nif 2" formats "@[ Foo ]\ndef foo\nend" formats "@[ Foo ]\ndef foo\nend" formats "macro foo=(x)\nend" formats "macro foo=(x)\nend" formats "foo\n.bar\n.baz" formats "foo\n.bar\n.baz" formats "foo &.bar" formats "foo &.bar" formats "[] of (((Array(T))))" formats "[] of (((Array(T))))" formats "foo[a, b: 2]" formats "foo[a, b: 2]" formats "[] of (Array(T))" formats "[] of (Array(T))" formats "begin\n array[\n 0 # Zero\n ]\nend" formats "begin\n array[\n 0 # Zero\n ]\nend" formats "def foo(a,\n &block)\nend" formats "def foo(a,\n &block)\nend" formats "{ 1 => 2 }" formats "{ 1 => 2 }" formats "bar = foo(->{\n 1 + 2\n})" formats "bar = foo(->{\n 1 + 2\n})" formats "def foo(\n **a\n)\n 1\nend" formats "def foo(\n **a\n)\n 1\nend" formats "->@foo.foo=" formats "->@foo.foo=" formats "\n# hello\n\n1" formats "\n# hello\n\n1" formats "def foo(\n foo,\n\n @[MyAnn]\n &block\n); end" formats "def foo(\n foo,\n\n @[MyAnn]\n &block\n); end" formats "{% begin %}\n \"\n foo\"\n{% end %}" formats "{% begin %}\n \"\n foo\"\n{% end %}" formats "macro foo\n {{ 1 + 2 }}\\\n 1\n end" formats "macro foo\n {{ 1 + 2 }}\\\n 1\n end" formats "yield *1 ,2" formats "yield *1 ,2" formats "->foo?" formats "->foo?" formats "macro foo\n {% unless 1 %} 2 {% end %}\nend" formats "macro foo\n {% unless 1 %} 2 {% end %}\nend" formats "foo . bar" formats "foo . bar" formats "foo &.==(2)" formats "foo &.==(2)" formats "while 1\n2 # foo\nend" formats "while 1\n2 # foo\nend" formats "Foo( * T, { * A ,*\n B } )" formats "Foo( * T, { * A ,*\n B } )" formats "<<-HTML\n hello \n world \n HTML" formats "<<-HTML\n hello \n world \n HTML" formats "NamedTuple()" formats "NamedTuple()" formats "a = \nif 1\n2\nend" formats "a = \nif 1\n2\nend" formats "if 1\nfoo do | x , y | \n x \n end\nend" formats "if 1\nfoo do | x , y | \n x \n end\nend" formats "lib Foo\nstruct Foo\nx : Int32\nend\nend" formats "lib Foo\nstruct Foo\nx : Int32\nend\nend" formats "def foo ( x ,\n y ) \n end" formats "def foo ( x ,\n y ) \n end" formats "if 1\n2\n3\n# foo\nend" formats "if 1\n2\n3\n# foo\nend" formats " [ 1, \n 2 , \n 3 ] " formats " [ 1, \n 2 , \n 3 ] " formats "def foo(x @y)\nend" formats "def foo(x @y)\nend" formats "until 1\n2\nend" formats "until 1\n2\nend" formats "def foo(x) : Int32 # bar\n # baz\nend" formats "def foo(x) : Int32 # bar\n # baz\nend" formats "case 1\nwhen 1 then 1\nwhen 123 then 2\nwhen 1..123 then 3\nelse 4\nend" formats "case 1\nwhen 1 then 1\nwhen 123 then 2\nwhen 1..123 then 3\nelse 4\nend" formats "->@foo.foo?" formats "->@foo.foo?" formats "yield 1" formats "yield 1" formats "foo \\\n 1,\n 2" formats "foo \\\n 1,\n 2" formats "foo(\n1,\n 2 \n)" formats "foo(\n1,\n 2 \n)" formats "def foo ( x : Int32 ) \n end" formats "def foo ( x : Int32 ) \n end" formats "fun foo(x : Int32) : Int32\n 1\nend" formats "fun foo(x : Int32) : Int32\n 1\nend" formats "foo = 1\n->foo.[]=(Int32)" formats "foo = 1\n->foo.[]=(Int32)" formats "def foo(\n @[MyAnn] bar\n); end" formats "def foo(\n @[MyAnn] bar\n); end" formats "! 1" formats "! 1" formats "Foo(\"bar\": Int32, \"baz qux\": Float64)" formats "Foo(\"bar\": Int32, \"baz qux\": Float64)" formats "{% verbatim do %}{{1}} + {{2}}{% end %}" formats "{% verbatim do %}{{1}} + {{2}}{% end %}" formats "foo({\nbar: 1,\n})" formats "foo({\nbar: 1,\n})" formats "class Foo;end" formats "class Foo;end" formats "def foo: Int32\nend" formats "def foo: Int32\nend" formats "1 &&\n2" formats "1 &&\n2" formats "foo(//, //)" formats "foo(//, //)" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n\n @[MyAnn] baz\n); end" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n\n @[MyAnn] baz\n); end" formats "lib Foo\n fun foo =\n bar(Int32) : Int32\nend" formats "lib Foo\n fun foo =\n bar(Int32) : Int32\nend" formats "macro foo\n {% if 1 %} 2 {% else %} 3 {% end %}\nend" formats "macro foo\n {% if 1 %} 2 {% else %} 3 {% end %}\nend" formats "1 ensure 2" formats "1 ensure 2" formats "if 1\n1\n\n# foo\nend" formats "if 1\n1\n\n# foo\nend" formats "-> : Int32[1] {}" formats "-> : Int32[1] {}" formats "bar do\n call(foo <<-X\n bar\n X\n )\nend" formats "bar do\n call(foo <<-X\n bar\n X\n )\nend" formats "case / /\nwhen / /, /x/\n / /\nend" formats "case / /\nwhen / /, /x/\n / /\nend" formats "foo ()" formats "foo ()" formats "b &.[c]?.d" formats "b &.[c]?.d" formats "1\n2 \n # foo" formats "1\n2 \n # foo" formats "Foo:: Bar" formats "Foo:: Bar" formats "class Foo\n # ```\n # 1\n # ```\nend\n" formats "class Foo\n # ```\n # 1\n # ```\nend\n" formats "class X; annotation FooAnnotation ; end ; end" formats "class X; annotation FooAnnotation ; end ; end" formats "foo.as? Int32*" formats "foo.as? Int32*" formats "macro foo(x, *, z)\nend" formats "macro foo(x, *, z)\nend" formats "foo x: 1, y: 2" formats "foo x: 1, y: 2" formats "foo[ 1 , 2 ]" formats "foo[ 1 , 2 ]" formats ":&-" formats ":&-" formats "foo &.[]?" formats "foo &.[]?" formats "if / /\nend" formats "if / /\nend" formats "$0" formats "$0" formats "break { 1 , 2 }" formats "break { 1 , 2 }" formats "asm(\"nop\" : \"a\"(0), \"b\"(1)\n: \"c\"(2), \"d\"(3) )" formats "asm(\"nop\" : \"a\"(0), \"b\"(1)\n: \"c\"(2), \"d\"(3) )" formats "%w(one two three)" formats "%w(one two three)" formats "1 ||\n # foo\n 2" formats "1 ||\n # foo\n 2" formats "a = 1\n;\nb = 2" formats "a = 1\n;\nb = 2" formats "1 == / /" formats "1 == / /" formats ":\"foo bar\"" formats ":\"foo bar\"" formats "select\nwhen foo\n # foo\n # bar\nelse\n # foo\n # bar\nend" formats "select\nwhen foo\n # foo\n # bar\nelse\n # foo\n # bar\nend" formats "->{}" formats "->{}" formats "def foo(x y)\nend" formats "def foo(x y)\nend" formats "->{1}" formats "->{1}" formats "(())" formats "(())" formats "yield 1 , *2" formats "yield 1 , *2" formats "(a).b { }\nc" formats "(a).b { }\nc" formats "1.as Int32" formats "1.as Int32" formats "x, y, z = <<-FOO, <<-BAR, <<-BAZ\n hello\n FOO\n world\n BAR\n qux\nBAZ" formats "x, y, z = <<-FOO, <<-BAR, <<-BAZ\n hello\n FOO\n world\n BAR\n qux\nBAZ" formats "unless a\n2\n3\nelse\n4\n5\nend" formats "unless a\n2\n3\nelse\n4\n5\nend" formats "case 1\nend" formats "case 1\nend" formats "def foo( x , * y )\nend" formats "def foo( x , * y )\nend" formats "macro foo\n{% verbatim do %}1 + 2{% end %}\nend" formats "macro foo\n{% verbatim do %}1 + 2{% end %}\nend" formats "a = case 1\n when 1, # 1\n 2, # 2\n 3 # 3\n 1\n end" formats "a = case 1\n when 1, # 1\n 2, # 2\n 3 # 3\n 1\n end" formats "foo 1 , &bar" formats "foo 1 , &bar" formats "(1)" formats "(1)" formats "foo : (String -> Array(String)?) | (String -> Array(String)) | Nil" formats "foo : (String -> Array(String)?) | (String -> Array(String)) | Nil" formats "[\n a(),\n]" formats "[\n a(),\n]" formats "class Bar\nprotected def foo(x)\na=b(c)\nend\nend" formats "class Bar\nprotected def foo(x)\na=b(c)\nend\nend" formats "class Foo ( T )\nend" formats "class Foo ( T )\nend" formats "asm(\"nop\" : \"a\"(0) : \"b\"(1) )" formats "asm(\"nop\" : \"a\"(0) : \"b\"(1) )" formats "foo : Pointer(Foo)*" formats "foo : Pointer(Foo)*" formats ":<<" formats ":<<" formats "def foo\n 1\n #\nrescue\nend" formats "def foo\n 1\n #\nrescue\nend" formats "x : Int32 = 1" formats "x : Int32 = 1" formats "->(x : Int32) {}" formats "->(x : Int32) {}" formats "foo[]" formats "foo[]" formats "class Foo ( *T, U )\nend" formats "class Foo ( *T, U )\nend" formats "foo.[]" formats "foo.[]" formats "enum Foo;end" formats "enum Foo;end" formats "1 ?\n 2 : \n 3" formats "1 ?\n 2 : \n 3" formats "# foo\na = 1 # bar" formats "# foo\na = 1 # bar" formats "foo(\n a: 1,\n b: 2,\n )\n" formats "foo(\n a: 1,\n b: 2,\n )\n" formats "foo &.is_a?(T).bar" formats "foo &.is_a?(T).bar" formats "[foo <<-X\nbar\nX\n]" formats "[foo <<-X\nbar\nX\n]" formats "x = <<-FOO\n hello\n FOO\n\ndef bar\nend" formats "x = <<-FOO\n hello\n FOO\n\ndef bar\nend" formats "foo({% verbatim do %}{{1}} + {{2}}{% end %})" formats "foo({% verbatim do %}{{1}} + {{2}}{% end %})" formats "a = foo(bar([\n 1,\n]))" formats "a = foo(bar([\n 1,\n]))" formats "asm(\"nop\" :: \"r\"(0))" formats "asm(\"nop\" :: \"r\"(0))" formats "def foo=(x)\nend" formats "def foo=(x)\nend" formats "foo = 1\n->foo.foo?" formats "foo = 1\n->foo.foo?" formats "@x : A(B | C)?" formats "@x : A(B | C)?" formats "{ * 1 * 2,\n*\n3, 4 }" formats "{ * 1 * 2,\n*\n3, 4 }" formats "Set{ # foo\n 1,\n}" formats "Set{ # foo\n 1,\n}" formats "def foo( x , & : Int32 )\nend" formats "def foo( x , & : Int32 )\nend" formats "{\n variables => true,\n query => <<-HEREDOC,\n foo\n HEREDOC\n foo => true,\n}" formats "{\n variables => true,\n query => <<-HEREDOC,\n foo\n HEREDOC\n foo => true,\n}" formats "a.b &.[c]\n1" formats "a.b &.[c]\n1" formats "{%\n if true\n 1\n else\n 2\n end\n%}" formats "{%\n if true\n 1\n else\n 2\n end\n%}" formats "macro foo\n 1 + 2\nend" formats "macro foo\n 1 + 2\nend" formats "{1 => foo <<-X\nbar\nX\n}" formats "{1 => foo <<-X\nbar\nX\n}" formats "def foo\n@x = uninitialized Int32\nend" formats "def foo\n@x = uninitialized Int32\nend" formats "if 1\n2\nelsif\n3\n4\nelsif 5\n6\nend" formats "if 1\n2\nelsif\n3\n4\nelsif 5\n6\nend" formats "あ.い = 1" formats "あ.い = 1" formats "{1 => 2,\n 3 => 4, # lala\n}\n" formats "{1 => 2,\n 3 => 4, # lala\n}\n" formats "1 if 2\n# foo\n3" formats "1 if 2\n# foo\n3" formats "next( 1 )" formats "next( 1 )" formats "long_variable_name = [\n {\n :foo => 1,\n }, {\n :bar => 2,\n },\n]" formats "long_variable_name = [\n {\n :foo => 1,\n }, {\n :bar => 2,\n },\n]" formats "alias X = ((Y, Z) ->)" formats "alias X = ((Y, Z) ->)" formats "@foo : Int32 # comment\n\ndef foo\nend" formats "@foo : Int32 # comment\n\ndef foo\nend" formats "{% if z %}\n class Foo\n end\n{% end %}" formats "{% if z %}\n class Foo\n end\n{% end %}" formats "next { {1, 2}, {3, 4} }" formats "next { {1, 2}, {3, 4} }" formats "module Foo; 1; end" formats "module Foo; 1; end" formats "private FOO = 2\nprivate A = 1" formats "private FOO = 2\nprivate A = 1" formats "begin\n1\nrescue\n3\nensure\n2\nend" formats "begin\n1\nrescue\n3\nensure\n2\nend" formats "case 1 \n when 2 then \n 3 \n end" formats "case 1 \n when 2 then \n 3 \n end" formats "nil" formats "nil" formats "foo 1,\n2" formats "foo 1,\n2" formats "case 1 \n when 2 \n 3 \n else 4 \n end" formats "case 1 \n when 2 \n 3 \n else 4 \n end" formats "break( *1 , *2 )" formats "break( *1 , *2 )" formats "1 &&\n2 &&\n3" formats "1 &&\n2 &&\n3" formats "asm(\"nop\" :::: \"volatile\" )" formats "asm(\"nop\" :::: \"volatile\" )" formats "a || b" formats "a || b" formats "yield(1 , \n2)" formats "yield(1 , \n2)" formats "{ 1 => 2 , 3 => 4 }" formats "{ 1 => 2 , 3 => 4 }" formats "a = foo &.bar do\n 1 + 2\nend" formats "a = foo &.bar do\n 1 + 2\nend" formats "def foo\nend\n\ndef bar\nend\n\n# foo" formats "def foo\nend\n\ndef bar\nend\n\n# foo" formats "::foo(1, 2)" formats "::foo(1, 2)" formats "lib Foo\nfun foo() : Int32\nend" formats "lib Foo\nfun foo() : Int32\nend" formats "foo = 1\n->foo.foo=" formats "foo = 1\n->foo.foo=" formats "1\n2\n# foo" formats "1\n2\n# foo" formats "foo { | a, ( b , (c, d) ) | a + b + c }" formats "foo { | a, ( b , (c, d) ) | a + b + c }" formats "`foo`" formats "`foo`" formats "foo(\n 1,\n) {\n 2\n}" formats "foo(\n 1,\n) {\n 2\n}" formats "foo.bar(&.% baz)" formats "foo.bar(&.% baz)" formats "Foo::Bar(T, U?)?" formats "Foo::Bar(T, U?)?" formats "foo : (A) | D" formats "foo : (A) | D" formats "bar = foo([\n 1,\n 2,\n 3,\n])" formats "bar = foo([\n 1,\n 2,\n 3,\n])" formats "def a\n [\n 1, # x\n # y\n ]\nend" formats "def a\n [\n 1, # x\n # y\n ]\nend" formats "{%\n if 1\n 2\n end\n%}" formats "{%\n if 1\n 2\n end\n%}" formats "foo \\\nbar" formats "foo \\\nbar" formats "include Foo" formats "include Foo" formats "def `(x)\n 1\nend" formats "def `(x)\n 1\nend" formats "@[Foo::Bar]" formats "@[Foo::Bar]" formats "[\n # foo\n] of String" formats "[\n # foo\n] of String" formats "a &.b.as(C)" formats "a &.b.as(C)" formats "b &.[c].d" formats "b &.[c].d" does not add `&` without flag `method_signature_yield` formats "def foo(x)\n yield\nend" formats "def foo(x)\n yield\nend" formats "def foo(x,\n y)\n yield\nend" formats "def foo(x,\n y)\n yield\nend" formats "def foo(\nx,\n)\n yield\nend" formats "def foo(\nx,\n)\n yield\nend" formats "def foo()\n yield\nend" formats "def foo()\n yield\nend" formats "def foo(\nx,\ny)\n yield\nend" formats "def foo(\nx,\ny)\n yield\nend" formats "def foo\n yield\nend" formats "def foo\n yield\nend" formats "def foo(a, **b)\n yield\nend" formats "def foo(a, **b)\n yield\nend" formats "def foo(\nx)\n yield\nend" formats "def foo(\nx)\n yield\nend" formats "def foo(x,\ny,)\n yield\nend" formats "def foo(x,\ny,)\n yield\nend" formats "def foo(x,\n)\n yield\nend" formats "def foo(x,\n)\n yield\nend" formats "def foo(\nx, y)\n yield\nend" formats "def foo(\nx, y)\n yield\nend" formats "def foo # bar\n yield\nend" formats "def foo # bar\n yield\nend" formats "def foo(\n)\n yield\nend" formats "def foo(\n)\n yield\nend" formats "def foo(x\n)\n yield\nend" formats "def foo(x\n)\n yield\nend" formats "def foo(x ,)\n yield\nend" formats "def foo(x ,)\n yield\nend" formats "break 1" formats "break 1" formats "@x &&= 1" formats "@x &&= 1" formats "class Foo\nend\nclass Bar\nend" formats "class Foo\nend\nclass Bar\nend" formats "def foo : (A, B) ->\n nil\nend" formats "def foo : (A, B) ->\n nil\nend" formats "->Foo.foo=" formats "->Foo.foo=" formats "x : (A -> B)" formats "x : (A -> B)" formats "def foo ( x : Int32 = 1 ) \n end" formats "def foo ( x : Int32 = 1 ) \n end" formats "foo.as? ( Int32* )" formats "foo.as? ( Int32* )" formats "foo(&.bar)" formats "foo(&.bar)" formats "foo(1, 2,)" formats "foo(1, 2,)" formats "foo.bar(1) # comment\n .baz" formats "foo.bar(1) # comment\n .baz" formats "select \n when foo then 2 \n end" formats "select \n when foo then 2 \n end" formats "foo(a: 1 // 2)" formats "foo(a: 1 // 2)" formats "[\n# foo\n] of String" formats "[\n# foo\n] of String" formats "break { {1, 2}, {3, 4} }" formats "break { {1, 2}, {3, 4} }" formats "foo &.is_a?(T)" formats "foo &.is_a?(T)" formats "foo.bar(&.baz)" formats "foo.bar(&.baz)" formats "foo : Foo * * * * *" formats "foo : Foo * * * * *" formats "Tuple()" formats "Tuple()" formats "foo . responds_to?( :bar )" formats "foo . responds_to?( :bar )" formats "begin\n begin\n\n end\nend" formats "begin\n begin\n\n end\nend" formats "alias A = ((B(C | D) | E) | F)" formats "alias A = ((B(C | D) | E) | F)" formats "foo &.nil?" formats "foo &.nil?" formats "if a\n2\nelse\nend" formats "if a\n2\nelse\nend" formats "foo(\n 1,\n) do\n 2\nend" formats "foo(\n 1,\n) do\n 2\nend" formats "alias Foo::Bar=Baz" formats "alias Foo::Bar=Baz" formats "[\n 1, 2, # foo\n 3,\n]" formats "[\n 1, 2, # foo\n 3,\n]" formats "enum Foo; A = 1; end" formats "enum Foo; A = 1; end" formats "%[hello]" formats "%[hello]" formats "::Tuple()" formats "::Tuple()" formats "def foo(*y, **z)\nend" formats "def foo(*y, **z)\nend" formats "1 > 2" formats "1 > 2" formats "next 1" formats "next 1" formats "foo(1, &.bar)" formats "foo(1, &.bar)" formats "class Foo\n@x : Int32\nend" formats "class Foo\n@x : Int32\nend" formats "inner &.color=(@color)\n1" formats "inner &.color=(@color)\n1" formats "next( *1 , *2 )" formats "next( *1 , *2 )" formats "foo.bar(&.%(baz))" formats "foo.bar(&.%(baz))" formats "x : Int32[ 8 ]" formats "x : Int32[ 8 ]" formats "begin\n1\nrescue ex : Int32 | Float64 \n3\nend" formats "begin\n1\nrescue ex : Int32 | Float64 \n3\nend" formats "->{ x }" formats "->{ x }" formats "\n# hello\n\n\n1" formats "\n# hello\n\n\n1" formats "p = Foo[\n 1, 2, 3,\n 4, 5, 6\n]\n" formats "p = Foo[\n 1, 2, 3,\n 4, 5, 6\n]\n" formats "1 unless 2" formats "1 unless 2" formats "case 1\nwhen 2\n 3\n # foo\nelse\n 4\n # bar\nend" formats "case 1\nwhen 2\n 3\n # foo\nelse\n 4\n # bar\nend" formats "return *1 ,2" formats "return *1 ,2" formats "x : (A -> B)?" formats "x : (A -> B)?" formats "-> :: Foo . foo?" formats "-> :: Foo . foo?" formats "foo = 1\n->foo.foo!" formats "foo = 1\n->foo.foo!" formats "def foo(a : T, b : U) forall T, U\n #\nend" formats "def foo(a : T, b : U) forall T, U\n #\nend" formats "lib Foo::Bar\nend" formats "lib Foo::Bar\nend" formats "foo{}" formats "foo{}" formats "yield( 1 )" formats "yield( 1 )" formats "lib Foo\n fun foo =\n \"bar\"(Int32) : Int32\nend" formats "lib Foo\n fun foo =\n \"bar\"(Int32) : Int32\nend" formats "def foo( @[MyAnn] v ); end" formats "def foo( @[MyAnn] v ); end" formats "<<-FOO\nfoo\nFOO" formats "<<-FOO\nfoo\nFOO" formats "a = 1\na ||= begin\n 1\nend" formats "a = 1\na ||= begin\n 1\nend" formats "case 1 \n when 2 ; 3 \n end" formats "case 1 \n when 2 ; 3 \n end" formats "if 1\n ((1) + 2)\nend" formats "if 1\n ((1) + 2)\nend" formats "foo(bar(\n 1,\n baz(\n 2,\n 3,\n )\n))" formats "foo(bar(\n 1,\n baz(\n 2,\n 3,\n )\n))" formats "def foo(a, **b : Int32)\nend" formats "def foo(a, **b : Int32)\nend" formats "1 / 2" formats "1 / 2" formats "module Readline\n @@completion_proc : (String -> Array(String)?) | (String -> Array(String)) | Nil\nend" formats "module Readline\n @@completion_proc : (String -> Array(String)?) | (String -> Array(String)) | Nil\nend" formats "yield *1" formats "yield *1" formats "{} of A => B\n{} of Foo => Bar" formats "{} of A => B\n{} of Foo => Bar" formats ":+" formats ":+" formats "a = b = 1\na, b =\n b, a" formats "a = b = 1\na, b =\n b, a" formats ":|" formats ":|" formats " {%\na = 1\n %}" formats " {%\na = 1\n %}" formats "/foo/" formats "/foo/" formats "->(){}" formats "->(){}" formats "\" \" * 2" formats "\" \" * 2" formats "@[Foo(\n foo: 1,\n)]\ndef foo\nend" formats "@[Foo(\n foo: 1,\n)]\ndef foo\nend" formats "false" formats "false" formats "1\n\n2" formats "1\n\n2" formats "return 1 , 2" formats "return 1 , 2" formats " case 1\n when 2\n 3\n else #:newline, :eof\n 1 if 2\n return 3\n end\n" formats " case 1\n when 2\n 3\n else #:newline, :eof\n 1 if 2\n return 3\n end\n" formats "macro foo\n {{ 1 + 2 }}\\\nend" formats "macro foo\n {{ 1 + 2 }}\\\nend" formats "lib Foo\n fun foo = \"bar\"(Int32) : Int32\nend" formats "lib Foo\n fun foo = \"bar\"(Int32) : Int32\nend" formats "def foo : Int32 \n end" formats "def foo : Int32 \n end" formats "foo do\n {{ foo <<-X\n bar\n X\n }}\nend" formats "foo do\n {{ foo <<-X\n bar\n X\n }}\nend" formats "def foo ( x , y ,\n) \n end" formats "def foo ( x , y ,\n) \n end" formats "select # some comment\nwhen bar\n break\nend" formats "select # some comment\nwhen bar\n break\nend" formats "def foo(@[MyAnn] &); end" formats "def foo(@[MyAnn] &); end" formats "macro foo\n \\{\nend" formats "macro foo\n \\{\nend" formats "1 * 2" formats "1 * 2" formats "yield 1\n2" formats "yield 1\n2" formats "begin\n1\nrescue ex\n3\nend" formats "begin\n1\nrescue ex\n3\nend" formats "self.as(Int32)" formats "self.as(Int32)" formats "def foo ( @x) \n end" formats "def foo ( @x) \n end" formats "x.try &.[] 123" formats "x.try &.[] 123" formats "lib Foo\nfun foo : Int32\nend" formats "lib Foo\nfun foo : Int32\nend" formats "macro foo\n {{\n1 + 2 }}\nend" formats "macro foo\n {{\n1 + 2 }}\nend" formats "foo = 1\n->foo.bar(Int32)" formats "foo = 1\n->foo.bar(Int32)" formats "def foo\n case x\n # z\n when 1\n end\nend" formats "def foo\n case x\n # z\n when 1\n end\nend" formats "def a\n b(\n 1, # x\n # y\n 2\n )\nend" formats "def a\n b(\n 1, # x\n # y\n 2\n )\nend" formats "1 + \\\n2\n3" formats "1 + \\\n2\n3" formats "[\n1, # a\n2, # b\n 3 # c\n]" formats "[\n1, # a\n2, # b\n 3 # c\n]" formats "\"1\#{\"4\#{\"\#{\"2\"}\"}3\"}3\#{__DIR__}4\#{5}6\"" formats "\"1\#{\"4\#{\"\#{\"2\"}\"}3\"}3\#{__DIR__}4\#{5}6\"" formats "{ A: 1 }\n" formats "{ A: 1 }\n" formats "macro foo\n {% if true %}if true{% end %}\n {% if true %}end{% end %}\nend" formats "macro foo\n {% if true %}if true{% end %}\n {% if true %}end{% end %}\nend" formats "foo { |x, *y| }" formats "foo { |x, *y| }" formats "{\n1 => 2 ,\n 3 => 4 }" formats "{\n1 => 2 ,\n 3 => 4 }" formats "%x(foo \#{ bar })" formats "%x(foo \#{ bar })" formats "foo : (F(A)) | D" formats "foo : (F(A)) | D" formats "macro foo # bar\n baz\nend" formats "macro foo # bar\n baz\nend" formats "begin\n ()\nend" formats "begin\n ()\nend" formats "begin\n call\n # comment\nrescue\n call\n # comment\nelse\n call\n # comment\nensure\n call\n # comment\nend" formats "begin\n call\n # comment\nrescue\n call\n # comment\nelse\n call\n # comment\nensure\n call\n # comment\nend" formats "def foo( x , & block : Int32 ->)\nend" formats "def foo( x , & block : Int32 ->)\nend" formats "def foo(**b, # comment\n &block)\nend" formats "def foo(**b, # comment\n &block)\nend" Semantic: recursive struct check errors on recursive struct through tuple errors on recursive struct through tuple errors on recursive abstract struct through module (#11384) errors on recursive abstract struct through module (#11384) errors on private recursive type errors on private recursive type detects recursive struct through module detects recursive struct through module detects recursive generic struct through module (#4720) detects recursive generic struct through module (#4720) errors on recursive struct errors on recursive struct detects recursive generic struct through generic module (#4720) detects recursive generic struct through generic module (#4720) errors on recursive struct inside module errors on recursive struct inside module errors on mutually recursive struct errors on mutually recursive struct detects recursive struct through inheritance (#3071) detects recursive struct through inheritance (#3071) errors on recursive struct through named tuple errors on recursive struct through named tuple errors on recursive generic struct inside module errors on recursive generic struct inside module errors on recursive struct through recursive alias (#4454) (#4455) errors on recursive struct through recursive alias (#4454) (#4455) Code gen: magic constants does __FILE__ in macro does __FILE__ in macro does __END_LINE__ in macro with block does __END_LINE__ in macro with block does __LINE__ when specifying one normal default arg does __LINE__ when specifying one normal default arg does __DIR__ does __DIR__ does __END_LINE__ without block does __END_LINE__ without block does __LINE__ does __LINE__ does __END_LINE__ in macro without block does __END_LINE__ in macro without block does __LINE__ when specifying one default arg with __FILE__ does __LINE__ when specifying one default arg with __FILE__ does __LINE__ with dispatch does __LINE__ with dispatch does __FILE__ does __FILE__ does __END_LINE__ with block does __END_LINE__ with block does __DIR__ in macro does __DIR__ in macro does __LINE__ when specifying one middle argument does __LINE__ when specifying one middle argument does __LINE__ in macro does __LINE__ in macro .parse_args DIR DIR DIR (relative to home) DIR (relative to home) DIR with path DIR with path DIR (absolute) DIR (absolute) DIR = . DIR = . NAME DIR NAME DIR Codegen: thread local compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variables works with class variables works with class variables works with class variables works with class variables works with class variables works with class variables works with class variables works with class variables works with class variables Code gen: not codegens not nil codegens not nil codegens not pointer (true) codegens not pointer (true) codegens not number codegens not number codegens not pointer (false) codegens not pointer (false) doesn't crash doesn't crash codegens not true codegens not true codegens not nilable type (false) codegens not nilable type (false) codegens not nilable type (true) codegens not nilable type (true) codegens not with inlinable value (#6451) codegens not with inlinable value (#6451) codegens not false codegens not false Semantic: while types while with && (#1425) types while with && (#1425) marks variable as nil if breaking before assigning to it in an endless loop marks variable as nil if breaking before assigning to it in an endless loop doesn't type var as nilable after break inside rescue doesn't type var as nilable after break inside rescue types while with break without value types while with break without value doesn't fail on Expressions condition (2) doesn't fail on Expressions condition (2) types endless while with break without value types endless while with break without value doesn't fail on Expressions condition (1) doesn't fail on Expressions condition (1) finds while cond assign target in Not (#10345) finds while cond assign target in Not (#10345) types while with assignment and && types while with assignment and && types while with break with value types while with break with value uses var type inside while if endless loop (2) uses var type inside while if endless loop (2) marks variable as nil if breaking before assigning to it in an endless loop (2) marks variable as nil if breaking before assigning to it in an endless loop (2) finds all while cond assign targets in expressions (3) finds all while cond assign targets in expressions (3) uses type at end of endless while if variable is reassigned, but not before first break (2) uses type at end of endless while if variable is reassigned, but not before first break (2) rebinds condition variable after while body (#6158) rebinds condition variable after while body (#6158) types endless while with break with value types endless while with break with value reports next cannot be used outside a while reports next cannot be used outside a while doesn't fail on nested conditionals inside typeof condition doesn't fail on nested conditionals inside typeof condition types while types while finds all while cond assign targets in expressions (5) finds all while cond assign targets in expressions (5) restricts type after while (#4242) restricts type after while (#4242) finds all while cond assign targets in expressions (#10350) finds all while cond assign targets in expressions (#10350) types while with multiple breaks with value types while with multiple breaks with value types variable as nilable if raise before assign types variable as nilable if raise before assign finds all while cond assign targets in expressions (6) finds all while cond assign targets in expressions (6) doesn't fail on new variables inside typeof condition doesn't fail on new variables inside typeof condition types endless while with multiple breaks with value types endless while with multiple breaks with value doesn't restrict type after while if there's a break (#4242) doesn't restrict type after while if there's a break (#4242) reports break cannot be used outside a while reports break cannot be used outside a while types while true as NoReturn types while true as NoReturn doesn't use type at end of endless while if variable is reassigned (2) doesn't use type at end of endless while if variable is reassigned (2) types while with assignment and call types while with assignment and call types while (true) as NoReturn types while (true) as NoReturn doesn't use type at end of endless while if variable is reassigned (3) doesn't use type at end of endless while if variable is reassigned (3) doesn't use type at end of endless while if variable is reassigned doesn't use type at end of endless while if variable is reassigned restricts type after while with not (#4242) restricts type after while with not (#4242) finds all while cond assign targets in expressions (4) finds all while cond assign targets in expressions (4) types while with assignment types while with assignment finds all while cond assign targets in expressions (2) finds all while cond assign targets in expressions (2) restricts type after `while` with `not` and `and` (#4242) restricts type after `while` with `not` and `and` (#4242) doesn't modify var's type before while doesn't modify var's type before while types while ((true)) as NoReturn types while ((true)) as NoReturn uses var type inside while if endless loop uses var type inside while if endless loop uses type at end of endless while if variable is reassigned, but not before first break uses type at end of endless while if variable is reassigned, but not before first break Semantic: abstract def errors if implementation has more keyword arguments errors if implementation has more keyword arguments doesn't error with splat doesn't error with splat doesn't error with splat and args with default value doesn't error with splat and args with default value errors if implementation adds type restriction errors if implementation adds type restriction doesn't error if implementation have default value doesn't error if implementation have default value works on abstract method on abstract class works on abstract method on abstract class matches instantiated generic module matches instantiated generic module errors if keyword argument doesn't have the same default value errors if keyword argument doesn't have the same default value doesn't error if implements with parent class doesn't error if implements with parent class errors if abstract method of private type is not implemented by including class errors if abstract method of private type is not implemented by including class doesn't error if abstract method with args is implemented by subclass (don't check subclasses) doesn't error if abstract method with args is implemented by subclass (don't check subclasses) errors if abstract method with arguments is not implemented by subclass errors if abstract method with arguments is not implemented by subclass doesn't error if implements with generic included module instance doesn't error if implements with generic included module instance allow double splat when abstract doesn't have it allow double splat when abstract doesn't have it errors if using abstract def on subclass errors if using abstract def on subclass works on abstract def on sub-subclass works on abstract def on sub-subclass gives correct error when no overload matches, when an abstract method is implemented (#1406) gives correct error when no overload matches, when an abstract method is implemented (#1406) allows arguments to be collapsed into splat allows arguments to be collapsed into splat doesn't error if implementation have keyword arguments in different order doesn't error if implementation have keyword arguments in different order doesn't error if abstract method with args is implemented by subclass (restriction -> no restriction) doesn't error if abstract method with args is implemented by subclass (restriction -> no restriction) errors if implementation doesn't have default value errors if implementation doesn't have default value errors if abstract method is not implemented by subclass errors if abstract method is not implemented by subclass double splat must match keyword argument type double splat must match keyword argument type doesn't error if abstract method with args is implemented by subclass (with one default arg) doesn't error if abstract method with args is implemented by subclass (with one default arg) can return a more specific type can return a more specific type errors if abstract method with arguments is not implemented by subclass (block difference) errors if abstract method with arguments is not implemented by subclass (block difference) doesn't error if abstract method is implemented by including class doesn't error if abstract method is implemented by including class doesn't error if implements a NoReturn param doesn't error if implements a NoReturn param implements through extend (considers original type for generic lookup) (2) (#8096) implements through extend (considers original type for generic lookup) (2) (#8096) doesn't error if implementation has more keyword arguments with default values doesn't error if implementation has more keyword arguments with default values doesn't error if abstract method is not implemented by including module doesn't error if abstract method is not implemented by including module errors if using abstract def on subclass that also defines it as abstract errors if using abstract def on subclass that also defines it as abstract finds implements in included module in disorder (#4052) finds implements in included module in disorder (#4052) extra keyword arguments must have compatible type to double splat extra keyword arguments must have compatible type to double splat error shows full signature of block parameter error shows full signature of block parameter allow splat instead of keyword argument allow splat instead of keyword argument matches instantiated generic types matches instantiated generic types errors if abstract method with arguments is not implemented by subclass (wrong type) errors if abstract method with arguments is not implemented by subclass (wrong type) matches generic module (a bit more complex) matches generic module (a bit more complex) errors if can't find child return type errors if can't find child return type doesn't error if abstract method is implemented by subclass doesn't error if abstract method is implemented by subclass errors if abstract method is not implemented by subclass (nested in module) errors if abstract method is not implemented by subclass (nested in module) errors if abstract method with arguments is not implemented by subclass (wrong number of arguments) errors if abstract method with arguments is not implemented by subclass (wrong number of arguments) errors if implementation misses the double splat errors if implementation misses the double splat doesn't error if abstract method with args is implemented by subclass doesn't error if abstract method with args is implemented by subclass errors if implementation doesn't have a splat errors if implementation doesn't have a splat errors if abstract method is not implemented by including class errors if abstract method is not implemented by including class can implement even if yield comes later in macro code can implement even if yield comes later in macro code allow double splat argument allow double splat argument errors if using abstract def on non-abstract class errors if using abstract def on non-abstract class errors if implementation doesn't have a keyword argument errors if implementation doesn't have a keyword argument doesn't error if free var in arg restriction shadows another type (#10153) doesn't error if free var in arg restriction shadows another type (#10153) errors if different return type errors if different return type doesn't error if implementation matches keyword argument doesn't error if implementation matches keyword argument doesn't error if implements with generic parent class instance doesn't error if implements with generic parent class instance doesn't error if implements with included module doesn't error if implements with included module errors if can't find parent return type errors if can't find parent return type implements through extend (considers original type for generic lookup) (#8096) implements through extend (considers original type for generic lookup) (#8096) doesn't error if implements with parent module doesn't error if implements with parent module errors if using abstract def on metaclass errors if using abstract def on metaclass errors if missing return type errors if missing return type errors if missing a return type in subclass of generic subclass errors if missing a return type in subclass of generic subclass errors if abstract method is not implemented by subclass of subclass errors if abstract method is not implemented by subclass of subclass implementation is not inherited from supertype nongeneric class nongeneric class generic class generic class nongeneric module nongeneric module generic module generic module errors if implementation doesn't have the same default value errors if implementation doesn't have the same default value matches generic module matches generic module errors if implementation doesn't have keyword arguments errors if implementation doesn't have keyword arguments matches generic types matches generic types errors if implementation doesn't match splat type errors if implementation doesn't match splat type can implement by block signature even if yield comes later in macro code can implement by block signature even if yield comes later in macro code doesn't error if abstract method is implemented by subclass via module inclusion doesn't error if abstract method is implemented by subclass via module inclusion errors if abstract method of private type is not implemented by subclass errors if abstract method of private type is not implemented by subclass errors if implementation doesn't match keyword argument type errors if implementation doesn't match keyword argument type errors if double splat type doesn't match errors if double splat type doesn't match matches generic return type matches generic return type Semantic: named tuples types nilable named tuple access (2) types nilable named tuple access (2) doesn't match type restriction with instance doesn't match type restriction with instance doesn't error if NamedTuple has no args doesn't error if NamedTuple has no args gets type at compile time gets type at compile time types nilable named tuple access (6) types nilable named tuple access (6) doesn't unify named tuple metaclasses (#5384) doesn't unify named tuple metaclasses (#5384) matches in type restriction, different order (1) matches in type restriction, different order (1) types named tuple access (2) types named tuple access (2) gives error when using named args on a type other than NamedTuple gives error when using named args on a type other than NamedTuple allows tuple covariance allows tuple covariance doesn't crash on named tuple in not executed block (#6718) doesn't crash on named tuple in not executed block (#6718) types T as a tuple of metaclasses types T as a tuple of metaclasses types named tuple access (3) types named tuple access (3) types named tuple access (1) types named tuple access (1) gives error when using positional args with NamedTuple gives error when using positional args with NamedTuple can assign to union of compatible named tuple can assign to union of compatible named tuple matches in type restriction and gets free var matches in type restriction and gets free var types named tuple access (4) types named tuple access (4) doesn't match in type restriction doesn't match in type restriction matches in type restriction, different order (2) matches in type restriction, different order (2) types nilable named tuple access (4) types nilable named tuple access (4) merges two named tuple with same keys but different types merges two named tuple with same keys but different types gives error when indexing with an unknown name gives error when indexing with an unknown name accept named tuple in type restriction accept named tuple in type restriction types nilable named tuple access (5) types nilable named tuple access (5) types named tuple of two elements types named tuple of two elements matches in type restriction matches in type restriction types nilable named tuple access (1) types nilable named tuple access (1) types nilable named tuple access (3) types nilable named tuple access (3) types named tuple of one element types named tuple of one element accepts named tuple covariance in array accepts named tuple covariance in array can write generic type for NamedTuple can write generic type for NamedTuple types named tuple of two elements, follows names order types named tuple of two elements, follows names order merges two named tuples with the same keys and types merges two named tuples with the same keys and types doesn't crash on named tuple type recursion (#7162) doesn't crash on named tuple type recursion (#7162) Crystal::CrystalPath finds "./test_folder/file_three.cr" finds "./test_folder/file_three.cr" doesn't finds "file_two.cr" doesn't finds "file_two.cr" doesn't finds "build/reproducible-path/crystal-1.12.1+dfsg/spec/compiler/crystal_path/crystal_path_spec.cr" doesn't finds "build/reproducible-path/crystal-1.12.1+dfsg/spec/compiler/crystal_path/crystal_path_spec.cr" includes 'lib' by default includes 'lib' by default finds "test_files/file_one.cr" finds "test_files/file_one.cr" finds "../**" finds "../**" overrides path with environment variable overrides path with environment variable doesn't finds "./crystal_path_spec" doesn't finds "./crystal_path_spec" finds "test_files/file_one" finds "test_files/file_one" .expand_paths .expand_paths finds "test_files" finds "test_files" doesn't finds "test_folder/*" doesn't finds "test_folder/*" finds "test_files/file_three" finds "test_files/file_three" doesn't finds "test_files/missing_file.cr" doesn't finds "test_files/missing_file.cr" finds "test_files/file_one" finds "test_files/file_one" finds "foo.cr" finds "foo.cr" finds "test_files/yet_another" finds "test_files/yet_another" finds "../test_folder" finds "../test_folder" finds "./test_folder/*" finds "./test_folder/*" doesn't finds "../../src/file_three" doesn't finds "../../src/file_three" finds "test_files/another" finds "test_files/another" doesn't finds "../crystal_path/test_files/file_one" doesn't finds "../crystal_path/test_files/file_one" finds "test_files/file_four" finds "test_files/file_four" finds "test_files/**" finds "test_files/**" doesn't finds "./crystal_path_spec.cr" doesn't finds "./crystal_path_spec.cr" doesn't finds "test_folder/file_three.cr" doesn't finds "test_folder/file_three.cr" #each_file_expansion ./foo.cr ./foo.cr foo/bar foo/bar ./foo/bar/baz ./foo/bar/baz foo.cr foo.cr foo/bar/baz foo/bar/baz foo.cr/bar foo.cr/bar foo foo ./foo ./foo foo.cr/bar.cr foo.cr/bar.cr ./foo/bar ./foo/bar finds "other_test_files" finds "other_test_files" finds "test_files/*" finds "test_files/*" finds "crystal_path_spec" finds "crystal_path_spec" finds "./file_two.cr" finds "./file_two.cr" Block inference unpacks block argument unpacks block argument allows yielding multiple types when a union is expected allows yielding multiple types when a union is expected errors when using local variable with block parameter name errors when using local variable with block parameter name uses splat in block parameter uses splat in block parameter infer type of block parameter infer type of block parameter binds to proc, not only to its body (#1796) binds to proc, not only to its body (#1796) infers type of block before call infers type of block before call types bug with yield not_nil! that is never not nil types bug with yield not_nil! that is never not nil doesn't mix local var with block var, using break (#2314) doesn't mix local var with block var, using break (#2314) errors if breaks from captured block errors if breaks from captured block infer type of local variable infer type of local variable sets captured block type to that of restriction with alias sets captured block type to that of restriction with alias errors if declares module inside block errors if declares module inside block passes #233: block with initialize with default args passes #233: block with initialize with default args infer type of empty block body infer type of empty block body errors if doing next in proc literal errors if doing next in proc literal reports error if block changes type reports error if block changes type errors if declares class inside captured block errors if declares class inside captured block auto-unpacks tuple, captured block with multiple statements auto-unpacks tuple, captured block with multiple statements respects block arg restriction when block has a splat parameter (2) (#9524) respects block arg restriction when block has a splat parameter (2) (#9524) auto-unpacks tuple, too many args, captured block auto-unpacks tuple, too many args, captured block uses splat in block parameter, many args uses splat in block parameter, many args does next from block without value does next from block without value uses free var in return type in captured block uses free var in return type in captured block reports error if yields a type that's not that one in the block specification reports error if yields a type that's not that one in the block specification binds block return type free variable even if there are no block parameters (#1797) binds block return type free variable even if there are no block parameters (#1797) errors on recursive yield with ProcNotation restriction errors on recursive yield with ProcNotation restriction errors if declares include inside block errors if declares include inside block ignores void return type (3) (#427) ignores void return type (3) (#427) doesn't fail with 'already had enclosing call' (#11200) doesn't fail with 'already had enclosing call' (#11200) respects block arg restriction when block has a splat parameter (#6473) respects block arg restriction when block has a splat parameter (#6473) error with self input type doesn't match error with self input type doesn't match reports mismatch with generic argument type in input type reports mismatch with generic argument type in input type errors if declares class inside block errors if declares class inside block ignores void return type (#427) ignores void return type (#427) auto-unpacks with block arg type auto-unpacks with block arg type doesn't crash on cleaning up typeof node without dependencies (#8669) doesn't crash on cleaning up typeof node without dependencies (#8669) reports error if block didn't return expected type reports error if block didn't return expected type break from block without value break from block without value infer type with self block arg infer type with self block arg uses block return type as return type, even if can't infer block type uses block return type as return type, even if can't infer block type errors if alias is not a fun type errors if alias is not a fun type auto-unpacks tuple, less than max auto-unpacks tuple, less than max doesn't assign block variable type to last value (#694) doesn't assign block variable type to last value (#694) errors on recursive yield with non ProcNotation restriction (#6896) errors on recursive yield with non ProcNotation restriction (#6896) ignores void return type (4) ignores void return type (4) auto-unpacks tuple, less than max, captured block auto-unpacks tuple, less than max, captured block doesn't auto-unpack tuple, more args doesn't auto-unpack tuple, more args doesn't crash on #2531 doesn't crash on #2531 break without value has nil type break without value has nil type does next from block with value 2 does next from block with value 2 uses free var in return type with tuple type uses free var in return type with tuple type returns from proc literal returns from proc literal recalculates call that uses block arg output as free var recalculates call that uses block arg output as free var errors if using Bar | Object as block return type (#2358) errors if using Bar | Object as block return type (#2358) errors if declares macro inside block errors if declares macro inside block uses block var with same name as local var uses block var with same name as local var allows underscore in block return type even if the return type can't be computed allows underscore in block return type even if the return type can't be computed reports mismatch with generic argument type in output type reports mismatch with generic argument type in output type auto-unpacks tuple auto-unpacks tuple checks block type with virtual type checks block type with virtual type reports error if block type doesn't match reports error if block type doesn't match infer type with union infer type with union errors if yields from top level errors if yields from top level error with self output type doesn't match error with self output type doesn't match reports error if yields a type that's not that one in the block specification reports error if yields a type that's not that one in the block specification passes #262 passes #262 infers type of block with generic type infers type of block with generic type errors if proc is not instantiated errors if proc is not instantiated ignores void return type (2) (#427) ignores void return type (2) (#427) passes &->f passes &->f errors if using (Object ->) as block return type (#2358) errors if using (Object ->) as block return type (#2358) errors if declares alias inside block errors if declares alias inside block errors if splat parameter becomes a union errors if splat parameter becomes a union types recursive hash assignment types recursive hash assignment yields splat yields splat errors if declares extend inside block errors if declares extend inside block infer type of yield infer type of yield ignores block parameter if not used ignores block parameter if not used maps block of union types to union types maps block of union types to union types infer type of block body infer type of block body infers type of block before call taking other args free vars into account infers type of block before call taking other args free vars into account errors if declares lib inside block errors if declares lib inside block errors if using ( -> Object) as block return type (#2358) errors if using ( -> Object) as block return type (#2358) does next from block with value does next from block with value errors if invoking new with block when no initialize is defined errors if invoking new with block when no initialize is defined reports error if yields a type that later changes and that's not that one in the block specification reports error if yields a type that later changes and that's not that one in the block specification allows initialize with yield (#224) allows initialize with yield (#224) correctly types unpacked tuple block arg after block (#3339) correctly types unpacked tuple block arg after block (#3339) reports error on method instantiate (#4543) reports error on method instantiate (#4543) auto-unpacks tuple, captured empty block auto-unpacks tuple, captured empty block uses block arg, too many parameters uses block arg, too many parameters uses splat in block parameter, but not enough yield expressions uses splat in block parameter, but not enough yield expressions errors on recursive yield errors on recursive yield auto-unpacks tuple, captured block auto-unpacks tuple, captured block errors if declares fun inside block errors if declares fun inside block does next from captured block does next from captured block errors if declares def inside block errors if declares def inside block renders expected block return type of a free variable on mismatch renders expected block return type of a free variable on mismatch errors if returns from captured block errors if returns from captured block reports error if missing arguments to yield reports error if missing arguments to yield yields in overload, matches type yields in overload, matches type preserves type filters in block preserves type filters in block auto-unpacks tuple, too many args auto-unpacks tuple, too many args allows alias as block fun type allows alias as block fun type errors if using Object as block return type (#2358) errors if using Object as block return type (#2358) can infer block type given that the method has a return type (#7160) can infer block type given that the method has a return type (#7160) errors if declares enum inside block errors if declares enum inside block matches block arg return type matches block arg return type yields with different types yields with different types doesn't mix local var with block var, using next (#2314) doesn't mix local var with block var, using next (#2314) allows invoking method on a object of a captured block with a type that was never instantiated allows invoking method on a object of a captured block with a type that was never instantiated types empty block types empty block sets captured block type to that of restriction sets captured block type to that of restriction finds type inside module in block finds type inside module in block matches block with generic type and free var matches block with generic type and free var yields splat and non splat yields splat and non splat Semantic: def overload says `no overload matches` instead of `can't instantiate abstract class` on wrong argument in new method says `no overload matches` instead of `can't instantiate abstract class` on wrong argument in new method errors if no overload matches on union against named arg (#2640) errors if no overload matches on union against named arg (#2640) errors when binding free variable to different types (2) errors when binding free variable to different types (2) can call overload with generic restriction can call overload with generic restriction errors if no overload matches on union against named arg with external param name (#10516) errors if no overload matches on union against named arg with external param name (#10516) restricts on generic type with free type arg restricts on generic type with free type arg errors if union restriction has multiple free vars (2) errors if union restriction has multiple free vars (2) types a call with overload self in included module types a call with overload self in included module types a call with overload type first overload types a call with overload type first overload lookup matches in virtual type inside union lookup matches in virtual type inside union types a call with overload types a call with overload types a call with overload type second overload types a call with overload type second overload does not consider global paths as free variables (2) does not consider global paths as free variables (2) dispatches with named arg dispatches with named arg finds method after including module in generic module (#1201) finds method after including module in generic module (#1201) matches a generic module argument matches a generic module argument types a call with overload with yield after typing another call without yield types a call with overload with yield after typing another call without yield matches generic class instance type with another one matches generic class instance type with another one reports no overload matches with correct method owner (#2083) reports no overload matches with correct method owner (#2083) uses long name when no overload matches and name is the same (#1030) uses long name when no overload matches and name is the same (#1030) types a call with overload with yield the other way types a call with overload with yield the other way matches tuples and uses free var matches tuples and uses free var overloads with named argument (#4465) overloads with named argument (#4465) gives better error message with consecutive arguments sizes gives better error message with consecutive arguments sizes doesn't match tuples of different sizes doesn't match tuples of different sizes types a call with overload self other match types a call with overload self other match restricts union to generic class restricts union to generic class restrict matches to minimum necessary 1 restrict matches to minimum necessary 1 errors if union restriction has multiple free vars errors if union restriction has multiple free vars filter union type with virtual filter union type with virtual types a call with overload self types a call with overload self matches a union argument with free var matches a union argument with free var matches a generic module argument with free var (2) matches a generic module argument with free var (2) gives correct error message, looking up parent defs, when no overload matches gives correct error message, looking up parent defs, when no overload matches resets free vars after a partial match is rejected (2) (#10185) resets free vars after a partial match is rejected (2) (#10185) matches a union argument with free var, more types (1) matches a union argument with free var, more types (1) errors when binding free variable to different types errors when binding free variable to different types resets free vars after a partial match is rejected (#10270) resets free vars after a partial match is rejected (#10270) gets free variable from union restriction gets free variable from union restriction treats single splats with same restriction as equivalent (#12579) treats single splats with same restriction as equivalent (#12579) uses method defined in base class if the restriction doesn't match uses method defined in base class if the restriction doesn't match can call overload with aliased generic restriction can call overload with aliased generic restriction overloads on metaclass (2) (#2916) overloads on metaclass (2) (#2916) restricts on generic type without type arg restricts on generic type without type arg gets free variable from union restriction (2) gets free variable from union restriction (2) overloads on metaclass (#2916) overloads on metaclass (#2916) single type restriction wins over union single type restriction wins over union types a call with overload matches virtual 2 types a call with overload matches virtual 2 compare self type with others compare self type with others treats single splats with same restriction as equivalent (2) (#12579) treats single splats with same restriction as equivalent (2) (#12579) doesn't match with wrong number of type arguments (#313) doesn't match with wrong number of type arguments (#313) matches on partial union matches on partial union matches a union argument with free var, more types (2) matches a union argument with free var, more types (2) prefers more specific overload than one with free variables prefers more specific overload than one with free variables types a call with overload matches virtual types a call with overload matches virtual accepts overload with nilable type restriction accepts overload with nilable type restriction overloads on metaclass (3) (#2916) overloads on metaclass (3) (#2916) types a call with overload Object type first overload types a call with overload Object type first overload matches tuples of different sizes matches tuples of different sizes types a call with overload self with inherited type types a call with overload self with inherited type compare_strictness subsumption has higher precedence over specificity same positional parameter, optional > single splat same positional parameter, optional > single splat positional vs (required named > optional named) positional vs (required named > optional named) positional vs (optional positional > single splat) positional vs (optional positional > single splat) named vs (optional positional > single splat) named vs (optional positional > single splat) positional vs (required positional > single splat) positional vs (required positional > single splat) single splat vs (required named > double splat) single splat vs (required named > double splat) positional vs (required named > double splat) positional vs (required named > double splat) named vs (required named > double splat) named vs (required named > double splat) same named parameter, required > double splat same named parameter, required > double splat double splat vs (optional positional > single splat) double splat vs (optional positional > single splat) same positional parameter, required > optional same positional parameter, required > optional double splat vs (required positional > optional positional) double splat vs (required positional > optional positional) positional vs (required positional > optional positional) positional vs (required positional > optional positional) same positional parameter, required > single splat same positional parameter, required > single splat named vs (required positional > optional positional) named vs (required positional > optional positional) named vs (required positional > single splat) named vs (required positional > single splat) same named parameter, required > optional same named parameter, required > optional single splat vs (required named > optional named) single splat vs (required named > optional named) same named parameter, optional > double splat same named parameter, optional > double splat positional vs (optional named > double splat) positional vs (optional named > double splat) named vs (required named > optional named) named vs (required named > optional named) single splat vs (optional named > double splat) single splat vs (optional named > double splat) named vs (optional named > double splat) named vs (optional named > double splat) double splat vs (required positional > single splat) double splat vs (required positional > single splat) specificity conflicts, named vs named (required > optional) vs (required > optional) (required > optional) vs (required > optional) (required > optional) vs (optional > splat) (required > optional) vs (optional > splat) (optional > splat) vs (optional > splat) (optional > splat) vs (optional > splat) (required > splat) vs (required > splat) (required > splat) vs (required > splat) (required > optional) vs (required > splat) (required > optional) vs (required > splat) (required > splat) vs (optional > splat) (required > splat) vs (optional > splat) positional parameters positional parameter with restriction vs single splat positional parameter with restriction vs single splat single splat vs single splat with restriction (#3134) single splat vs single splat with restriction (#3134) specificity specificity positional parameter vs single splat with restriction positional parameter vs single splat with restriction single splat restriction vs single splat with stricter restriction single splat restriction vs single splat with stricter restriction positional parameter with restriction vs single splat with stricter restriction positional parameter with restriction vs single splat with stricter restriction positional parameter with stricter restriction vs single splat with restriction positional parameter with stricter restriction vs single splat with restriction subsumption conflicts positional vs double splat positional vs double splat named vs double splat named vs double splat single splat vs double splat single splat vs double splat positional vs named positional vs named named vs named named vs named positional vs positional positional vs positional single splat vs named single splat vs named positional vs single splat positional vs single splat specificity conflicts, positional vs named (required > splat) vs (required > optional) (required > splat) vs (required > optional) (required > optional) vs (optional > splat) (required > optional) vs (optional > splat) (optional > splat) vs (required > optional) (optional > splat) vs (required > optional) (required > optional) vs (required > splat) (required > optional) vs (required > splat) (required > splat) vs (optional > splat) (required > splat) vs (optional > splat) (required > optional) vs (required > optional) (required > optional) vs (required > optional) (required > splat) vs (required > splat) (required > splat) vs (required > splat) (optional > splat) vs (required > splat) (optional > splat) vs (required > splat) (optional > splat) vs (optional > splat) (optional > splat) vs (optional > splat) named parameters specificity specificity double splat vs double splat with restriction double splat vs double splat with restriction named parameter with restriction vs double splat with stricter restriction named parameter with restriction vs double splat with stricter restriction named parameter vs double splat with restriction named parameter vs double splat with restriction named parameter with stricter restriction vs double splat with restriction named parameter with stricter restriction vs double splat with restriction named parameter with restriction vs double splat (#5328) named parameter with restriction vs double splat (#5328) double splat restriction vs double splat with stricter restriction double splat restriction vs double splat with stricter restriction types a call with overload selecting the most restrictive 2 types a call with overload selecting the most restrictive 2 does not consider global paths as free variables (1) does not consider global paths as free variables (1) matches types with free variables matches types with free variables types a call with overload selecting the most restrictive types a call with overload selecting the most restrictive considers NamedTuple in a module's including types (#10380) considers NamedTuple in a module's including types (#10380) includes splat symbol in error message includes splat symbol in error message matches virtual type to union matches virtual type to union types a call with overload self in included module other type types a call with overload self in included module other type doesn't crash on unknown metaclass doesn't crash on unknown metaclass types a call with overload with yield types a call with overload with yield matches a union metaclass argument with free var (#8071) matches a union metaclass argument with free var (#8071) overloads union against non-union (#2904) overloads union against non-union (#2904) matches tuple with underscore matches tuple with underscore matches a generic module argument with free var matches a generic module argument with free var gets free variable from union restriction without a union gets free variable from union restriction without a union types a call with overload matches virtual 3 types a call with overload matches virtual 3 restrict virtual type with virtual type restrict virtual type with virtual type dispatch call to def with restrictions dispatch call to def with restrictions errors if generic type doesn't match errors if generic type doesn't match dispatch call to def with restrictions dispatch call to def with restrictions Code gen: nilable cast does upcast does upcast does nilable cast (true) does nilable cast (true) does nilable cast (false) does nilable cast (false) does cast to nil (2) does cast to nil (2) casts with block var that changes type (#3341) casts with block var that changes type (#3341) casts union type to nilable type (#9342) casts union type to nilable type (#9342) does cast to nil (1) does cast to nil (1) codegens with NoReturn codegens with NoReturn types as? with wrong type (#2775) types as? with wrong type (#2775) upcasts type to virtual (2) (#3304) upcasts type to virtual (2) (#3304) upcasts type to virtual (#3304) upcasts type to virtual (#3304) does nilable cast (always true) does nilable cast (always true) Normalize: block normalizes unpacking with empty body normalizes unpacking with empty body normalizes nested unpacking normalizes nested unpacking normalizes unpacking with multiple body expressions normalizes unpacking with multiple body expressions normalizes unpacking with single expression body normalizes unpacking with single expression body normalizes multiple nested unpackings normalizes multiple nested unpackings normalizes unpacking with splat normalizes unpacking with splat normalizes unpacking with underscore normalizes unpacking with underscore Semantic: nilable cast doesn't introduce type filter for nilable cast object (#12661) doesn't introduce type filter for nilable cast object (#12661) types as? types as? does upcast does upcast types as? with NoReturn types as? with NoReturn types as? with union types as? with union types as? with nil types as? with nil casts to module casts to module doesn't crash with typeof no-type (#7441) doesn't crash with typeof no-type (#7441) Semantic: nilable instance var says instance var was not initialized in all of the initialize methods (2) says instance var was not initialized in all of the initialize methods (2) says self was used before instance var was initialized (3) says self was used before instance var was initialized (3) finds type that doesn't initialize instance var (#1222) finds type that doesn't initialize instance var (#1222) doesn't consider as nil if initialized with catch-all doesn't consider as nil if initialized with catch-all says instance var was not initialized in all of the initialize methods says instance var was not initialized in all of the initialize methods says self was used before instance var was initialized says self was used before instance var was initialized says instance var was used before initialized (2) says instance var was used before initialized (2) marks instance var as nilable if assigned inside proc literal marks instance var as nilable if assigned inside proc literal says instance var was used before initialized says instance var was used before initialized says self was used before instance var was initialized (2) says self was used before instance var was initialized (2) marks instance var as nilable if assigned inside captured block (#1696) marks instance var as nilable if assigned inside captured block (#1696) says instance var was not initialized in all of the initialize methods, with var declaration says instance var was not initialized in all of the initialize methods, with var declaration expand expands macro control {% if %} with cursor inside it expands macro control {% if %} with cursor inside it expands macro expression inside C struct expands macro expression inside C struct expands macro expression inside class expands macro expression inside class doesn't expand macro expression with cursor out of end doesn't expand macro expression with cursor out of end expands macro expression inside C union expands macro expression inside C union expands macro expression inside lib expands macro expression inside lib expands macro expression inside private lib expands macro expression inside private lib expands macro expression inside private class expands macro expression inside private class expands macro expression {{ ... }} expands macro expression {{ ... }} expands macro expression inside private module expands macro expression inside private module expands macro control {% if %} expands macro control {% if %} expands macro of module expands macro of module doesn't expand normal call doesn't expand normal call expands macro expression {% ... %} expands macro expression {% ... %} expands simple macro with cursor at end of it expands simple macro with cursor at end of it expands macro control {% for %} with cursor at end of it expands macro control {% for %} with cursor at end of it expands macro of module with cursor at module name expands macro of module with cursor at module name expands macro with doc expands macro with doc expands macro expression inside def of private module expands macro expression inside def of private module expands macro expression {{ ... }} with cursor inside it expands macro expression {{ ... }} with cursor inside it expands macro expression inside def of module expands macro expression inside def of module doesn't expand macro expression doesn't expand macro expression expands macro expression inside def of private module expands macro expression inside def of private module expands macro expression inside C struct of private lib expands macro expression inside C struct of private lib expands macro expression inside private def expands macro expression inside private def expands macro expression inside struct expands macro expression inside struct expands macro expression inside def of nested module expands macro expression inside def of nested module expands macro expression inside C union of private lib expands macro expression inside C union of private lib expands macro expression inside private struct expands macro expression inside private struct expands macro control {% for %} with cursor inside it expands macro control {% for %} with cursor inside it expands macro expression {{ ... }} with cursor end of it expands macro expression {{ ... }} with cursor end of it expands macro expression inside def of private class expands macro expression inside def of private class doesn't expand macro expression doesn't expand macro expression expands macro expression inside def of nested private module expands macro expression inside def of nested private module expands macro expression inside private enum expands macro expression inside private enum expands macro expression inside def of private struct expands macro expression inside def of private struct expands macro expression inside def of private enum expands macro expression inside def of private enum expands complex macro expands complex macro expands macro control {% for %} expands macro control {% for %} expands macro of module with cursor at dot expands macro of module with cursor at dot expands macro control {% if %} with indent expands macro control {% if %} with indent expands macros with 3 level expands macros with 3 level expands simple macro expands simple macro expands macro control {% for %} with indent expands macro control {% for %} with indent expands macro expression inside fun expands macro expression inside fun expands macro expression inside module expands macro expression inside module expands simple macro with cursor inside it expands simple macro with cursor inside it expands macro expression inside enum expands macro expression inside enum expands macros with 2 level expands macros with 2 level expands macro of module inside module expands macro of module inside module expands macro control {% if %} with cursor at end of it expands macro control {% if %} with cursor at end of it expands macro expression inside def expands macro expression inside def expands macro expression {% ... %} with cursor at end of it expands macro expression {% ... %} with cursor at end of it Code gen: primitives codegens string codegens string va_arg works with C code works with C code works with C code works with C code works with C code works with C code works with C code works with C code works with C code works with C code uses llvm's va_arg instruction uses llvm's va_arg instruction codegens int codegens int can invoke binary on primitive typedef (#614) can invoke binary on primitive typedef (#614) passes issue #328 passes issue #328 codegens crystal_type_id for class codegens crystal_type_id for class codegens f32 codegens f32 codegens long codegens long codegens crystal_type_id with union type codegens crystal_type_id with union type codegens f64 codegens f64 allows @[Primitive] on method that has body allows @[Primitive] on method that has body can invoke cast on primitive typedef (#614) can invoke cast on primitive typedef (#614) codegens char ord codegens char ord allows redefining a primitive method allows redefining a primitive method uses built-in llvm function that returns a tuple uses built-in llvm function that returns a tuple defined method that calls primitive (bug) defined method that calls primitive (bug) arithmetic primitives codegens 8.unsafe_mod 3 codegens 8.unsafe_mod 3 codegens 1 &+ 2 codegens 1 &+ 2 skips bounds checking when to_i produces same type skips bounds checking when to_i produces same type codegens 1.to_f! codegens 1.to_f! codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 1 + 2 codegens 8.unsafe_div 3 codegens 8.unsafe_div 3 codegens 2 &* 3 codegens 2 &* 3 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 16.unsafe_shl 2 codegens 16.unsafe_shl 2 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1 &- 2 codegens 1 &- 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1.to_i16! codegens 1.to_i16! codegens 16.unsafe_shr 2 codegens 16.unsafe_shr 2 doesn't treat `(1 == 1) == true` as `1 == 1 == true` (#328) doesn't treat `(1 == 1) == true` as `1 == 1 == true` (#328) gets crystal class instance type id gets crystal class instance type id codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 atomicrmw codegens atomicrmw with symbols codegens atomicrmw with symbols codegens atomicrmw with enums codegens atomicrmw with enums codegens atomicrmw with enums codegens atomicrmw with enums codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 doesn't optimize away call whose obj is not passed as self (#2226) doesn't optimize away call whose obj is not passed as self (#2226) codegens pointer of int codegens pointer of int codegens __LINE__ codegens __LINE__ codegens bool codegens bool sums two numbers out of an [] of Number sums two numbers out of an [] of Number codegens char codegens char allows @[Primitive] on fun declarations allows @[Primitive] on fun declarations Crystal::Repl::Interpreter symbol symbol equality symbol equality Symbol#to_i Symbol#to_i Symbol#to_s Symbol#to_s Semantic: initialize doesn't mark instance variable as nilable when using self.class doesn't mark instance variable as nilable when using self.class doesn't mark instance variable as nilable when using self.class in method doesn't mark instance variable as nilable when using self.class in method doesn't type instance var as nilable if assigned before method call doesn't type instance var as nilable if assigned before method call marks instance variable as nilable in initialize if assigning self marks instance variable as nilable in initialize if assigning self doesn't type instance var as nilable if out doesn't type instance var as nilable if out errors on default new when using named arguments (#2245) errors on default new when using named arguments (#2245) doesn't type instance var as nilable if not used in method call doesn't type instance var as nilable if not used in method call types instance var as nilable if used after method call that reads var (2) types instance var as nilable if used after method call that reads var (2) doesn't type instance var as nilable if used after global method call doesn't type instance var as nilable if used after global method call types instance var as non-nilable if calls super and super defines it types instance var as non-nilable if calls super and super defines it errors if found matches for initialize but doesn't cover all (bug #204) errors if found matches for initialize but doesn't cover all (bug #204) marks instance variable as nilable in initialize if using self marks instance variable as nilable in initialize if using self doesn't type instance var as nilable if used after method call that assigns var doesn't type instance var as nilable if used after method call that assigns var types instance var as non-nilable if calls super and super defines it, with one level of indirection types instance var as non-nilable if calls super and super defines it, with one level of indirection types instance var as nilable if used after method call that reads var types instance var as nilable if used after method call that reads var types instance var as nilable if assigned in block types instance var as nilable if assigned in block types initializer of generic type after instantiated types initializer of generic type after instantiated doesn't type instance var as nilable if used after method call that doesn't read var doesn't type instance var as nilable if used after method call that doesn't read var types instance vars as nilable if doesn't invoke super in initialize types instance vars as nilable if doesn't invoke super in initialize types instance var as nilable if used in first of two method calls types instance var as nilable if used in first of two method calls types instance var as nilable if used before assignment types instance var as nilable if used before assignment types instance vars as nilable if doesn't invoke super in initialize with deep subclass types instance vars as nilable if doesn't invoke super in initialize with deep subclass types instance vars as nilable if doesn't invoke super with default arguments types instance vars as nilable if doesn't invoke super with default arguments types instance var as not-nilable if assigned in block but previously assigned types instance var as not-nilable if assigned in block but previously assigned doesn't type ivar having initializer as nilable even if it is used before assigned inside initialize (#5112) doesn't type ivar having initializer as nilable even if it is used before assigned inside initialize (#5112) types initializer of recursive generic type types initializer of recursive generic type marks instance variable as nilable in initialize if using self in method marks instance variable as nilable in initialize if using self in method marks instance variable as nilable when using self in super marks instance variable as nilable when using self in super doesn't type ivar as nilable if super call present and parent has already typed ivar (#4764) doesn't type ivar as nilable if super call present and parent has already typed ivar (#4764) checks instance vars of included modules checks instance vars of included modules types instance var as nilable if not always assigned types instance var as nilable if not always assigned finishes when analyzing recursive calls finishes when analyzing recursive calls types instance var as nilable if used after method call that reads var through other calls types instance var as nilable if used after method call that reads var through other calls doesn't type instance var as nilable if used after method call inside typeof doesn't type instance var as nilable if used after method call inside typeof Semantic: special vars infers $? infers $? types $? when not defined as no return (2) types $? when not defined as no return (2) types $? when not defined as no return types $? when not defined as no return infers in block with nested block infers in block with nested block infers when assigning inside block infers when assigning inside block types $~ when not defined as no return (2) types $~ when not defined as no return (2) infers in block infers in block infers $~ infers $~ errors if assigning $~ at top level errors if assigning $~ at top level types $~ when not defined as no return types $~ when not defined as no return errors if assigning $? at top level errors if assigning $? at top level infers after block infers after block Semantic: responds_to? is bool is bool restricts virtual generic module to including types (#8334) restricts virtual generic module to including types (#8334) restricts in assignment restricts in assignment restricts type inside if scope 1 restricts type inside if scope 1 restricts other types inside if else restricts other types inside if else restricts virtual generic superclass to subtypes restricts virtual generic superclass to subtypes cleanup errors if assigning var to itself errors if assigning var to itself strip tuple elements after unreachable element strip tuple elements after unreachable element errors if assigning instance var to itself errors if assigning instance var to itself strip named-tuple elements after unreachable element strip named-tuple elements after unreachable element read_file? with absolute path reads file (doesn't exist) reads file (doesn't exist) with relative path reads file (doesn't exist) reads file (doesn't exist) Crystal::Playground::Agent should send json messages and return inspected value should send json messages and return inspected value Normalize: or normalizes or with ! on var.is_a?(...) normalizes or with ! on var.is_a?(...) normalizes or with assignment on the left normalizes or with assignment on the left normalizes or with variable on the left normalizes or with variable on the left normalizes or with is_a? on var normalizes or with is_a? on var normalizes or without variable normalizes or without variable normalizes or with ! on var normalizes or with ! on var Code gen: exception executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) doesn't codegen duplicated ensure if unreachable (#709) doesn't codegen duplicated ensure if unreachable (#709) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value ensure without rescue ensure without rescue ensure without rescue ensure without rescue ensure without rescue ensure without rescue ensure without rescue ensure without rescue ensure without rescue ensure without rescue does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) can result into union (1) can result into union (1) can result into union (1) can result into union (1) can result into union (1) can result into union (1) can result into union (1) can result into union (1) can result into union (1) can result into union (1) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) can result into union (2) can result into union (2) can result into union (2) can result into union (2) can result into union (2) can result into union (2) can result into union (2) can result into union (2) can result into union (2) can result into union (2) closures rescue variable (#8141) closures rescue variable (#8141) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block handles nested exceptions handles nested exceptions handles nested exceptions handles nested exceptions handles nested exceptions handles nested exceptions handles nested exceptions handles nested exceptions handles nested exceptions handles nested exceptions executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns rescues with type rescues with type rescues with type rescues with type rescues with type rescues with type rescues with type rescues with type rescues with type rescues with type can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass receives exception object receives exception object receives exception object receives exception object receives exception object receives exception object receives exception object receives exception object receives exception object receives exception object executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) codegens issue #118 (2) codegens issue #118 (2) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens issue #118 (1) codegens issue #118 (1) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) uses exception after rescue uses exception after rescue uses exception after rescue uses exception after rescue uses exception after rescue uses exception after rescue uses exception after rescue uses exception after rescue uses exception after rescue uses exception after rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) Crystal::Repl::Interpreter structs does call receiver by value from VirtualType abstract struct to concrete struct (#12190) does call receiver by value from VirtualType abstract struct to concrete struct (#12190) does complex class instance var initializer does complex class instance var initializer inlines struct method that returns self (#12253) inlines struct method that returns self (#12253) discards allocate discards allocate does simple struct instance var initializer does simple struct instance var initializer mutates struct inside union mutates struct inside union casts def body to def type casts def body to def type mutates struct stored in class var mutates struct stored in class var does call receiver by value from VirtualType abstract struct to union does call receiver by value from VirtualType abstract struct to union does allocate, set instance var and get instance var does allocate, set instance var and get instance var does constructor does constructor sets multiple instance vars in virtual abstract struct call (#12187) sets multiple instance vars in virtual abstract struct call (#12187) does class instance var initializer inheritance does class instance var initializer inheritance does simple class instance var initializer does simple class instance var initializer interprets read instance var of struct interprets read instance var of struct Code gen: hash literal spec assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works creates custom generic hash via alias (1) creates custom generic hash via alias (1) creates custom generic hash via alias (2) creates custom generic hash via alias (2) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) creates custom generic hash in module (#5684) creates custom generic hash in module (#5684) creates custom non-generic hash in module creates custom non-generic hash in module creates custom generic hash creates custom generic hash creates custom non-generic hash creates custom non-generic hash assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works creates custom generic hash with type vars creates custom generic hash with type vars Code gen: return returns in var assignment (#3364) returns in var assignment (#3364) return from function with nilable type 2 return from function with nilable type 2 doesn't crash when method returns nil and can be inlined doesn't crash when method returns nil and can be inlined codegens return codegens return codegens return inside if codegens return inside if codegens return followed by another expression codegens return followed by another expression flattens splats inside multiple return values flattens splats inside multiple return values return from function with nilable type return from function with nilable type codegens assign with if with two returns codegens assign with if with two returns forms a tuple from multiple return values forms a tuple from multiple return values returns empty from function returns empty from function return from function with union type return from function with union type codegens bug with return if true codegens bug with return if true return union return union Semantic: yield with scope uses method of enclosing scope uses method of enclosing scope infer type of block body with yield scope infer type of block body with yield scope finds macro finds macro uses instance variable of enclosing scope uses instance variable of enclosing scope invokes nested calls invokes nested calls mentions with yield scope and current scope in error mentions with yield scope and current scope in error passes #229 passes #229 infer type of block body with yield scope and arguments infer type of block body with yield scope and arguments errors if using instance variable at top level errors if using instance variable at top level infer type of empty block body infer type of empty block body infer type of block body infer type of block body Semantic: doc stores doc for macro defined in macro call stores doc for macro defined in macro call stores doc for module when reopening stores doc for module when reopening overwrites doc for macro when redefining overwrites doc for macro when redefining stores doc for module stores doc for module stores doc for def stores doc for def stores doc for enum with @[Flags] stores doc for enum with @[Flags] doc before annotation attached to alias attached to alias attached to struct/class attached to struct/class attached to module attached to module attached to constant attached to constant attached to macro attached to macro attached to def attached to def attached to enum attached to enum stores doc for abstract class stores doc for abstract class stores doc for struct stores doc for struct overwrites doc for struct when reopening overwrites doc for struct when reopening stores doc for def with annotation stores doc for def with annotation overwrites doc for enum when reopening overwrites doc for enum when reopening stores doc for class when reopening stores doc for class when reopening stores doc for def with annotation stores doc for def with annotation attaches doc in double macro expansion (#8463) attaches doc in double macro expansion (#8463) :ditto: amend previous doc amend previous doc stores doc for macro stores doc for macro stores doc for const stores doc for const stores doc for def stores doc for def amend previous doc (without empty line) amend previous doc (without empty line) :ditto: references last non-ditto doc :ditto: references last non-ditto doc stores doc for flags enum with base type stores doc for flags enum with base type stores locations for auto-generated module stores locations for auto-generated module overwrites doc for class when reopening overwrites doc for class when reopening overwrites doc for module when reopening overwrites doc for module when reopening stores doc for enum and doesn't mix with value stores doc for enum and doesn't mix with value stores doc for enum when reopening stores doc for enum when reopening stores doc for nodes defined in macro call stores doc for nodes defined in macro call attaches doc to annotation in macro expansion (#9628) attaches doc to annotation in macro expansion (#9628) stores doc for macro stores doc for macro stores doc for fun def stores doc for fun def stores doc for struct when reopening stores doc for struct when reopening stores doc for constant stores doc for constant stores location for implicit flag enum members stores location for implicit flag enum members stores doc for class stores doc for class stores doc for alias stores doc for alias stores doc for nodes defined in macro call (2) stores doc for nodes defined in macro call (2) stores doc for enum stores doc for enum stores doc for enum member stores doc for enum member stores doc for abstract def stores doc for abstract def stores doc for def with visibility stores doc for def with visibility overwrites doc for def when redefining overwrites doc for def when redefining Semantic: fun errors if defining class inside fun through macro (#6874) errors if defining class inside fun through macro (#6874) Semantic: return can use type var as return type with an inherited generic class can use type var as return type with an inherited generic class infers return type infers return type can use type var as return type (#1226) can use type var as return type (#1226) can use free var in return type (#2492) can use free var in return type (#2492) can use non-type free var in return type (#6543) can use non-type free var in return type (#6543) errors if non-type free var cannot be inferred errors if non-type free var cannot be inferred can use type var as return type with an included generic module can use type var as return type with an included generic module can use non-type free var in return type (2) (#6543) can use non-type free var in return type (2) (#6543) forms a tuple from multiple return values forms a tuple from multiple return values allows returning NoReturn instead of the wanted type allows returning NoReturn instead of the wanted type flattens splats inside multiple return values flattens splats inside multiple return values allows nilable return type to match subclasses (#1735) allows nilable return type to match subclasses (#1735) errors on return in top level errors on return in top level infers return type with many returns (2) infers return type with many returns (2) infers return type with many returns (1) infers return type with many returns (1) doesn't confuse return type from base class doesn't confuse return type from base class types bug (#1823) types bug (#1823) types return if true types return if true Parser parses "foo(n <= 2)" parses "foo(n <= 2)" parses "{\"foo\": 1}" parses "{\"foo\": 1}" parses "[1] /2" parses "[1] /2" parses "foo do |a|; 1; end" parses "foo do |a|; 1; end" parses "-> do; 1; rescue; 2; end" parses "-> do; 1; rescue; 2; end" says syntax error on "def foo(extend); end" says syntax error on "def foo(extend); end" parses "a = 1; b = 2; c = 3; a-b -c" parses "a = 1; b = 2; c = 3; a-b -c" parses "x.foo a: 1, b: 2 " parses "x.foo a: 1, b: 2 " parses "Foo?" parses "Foo?" parses "foo rescue 2" parses "foo rescue 2" parses "def !=(*args, **opts, &); end" parses "def !=(*args, **opts, &); end" says syntax error on "def foo(begin); end" says syntax error on "def foo(begin); end" parses "foo(//)" parses "foo(//)" parses "def foo(x @while); end" parses "def foo(x @while); end" parses "{1 =>\n2, 3 =>\n4}" parses "{1 =>\n2, 3 =>\n4}" says syntax error on "return === 1" says syntax error on "return === 1" parses "foo.** 1, 2" parses "foo.** 1, 2" parses "def foo(var : Int**); end" parses "def foo(var : Int**); end" parses "next 1, *2" parses "next 1, *2" says syntax error on "return - 1" says syntax error on "return - 1" parses "def foo(@@extend); end" parses "def foo(@@extend); end" parses "n &** 2" parses "n &** 2" parses "macro foo;unless var;true;end;end" parses "macro foo;unless var;true;end;end" parses "def self.===; end;" parses "def self.===; end;" parses "foo { |a, b| 1 }" parses "foo { |a, b| 1 }" parses "foo.[]=(1, 2) { 3 }" parses "foo.[]=(1, 2) { 3 }" parses "Foo({->})" parses "Foo({->})" parses "def +(); end;" parses "def +(); end;" says syntax error on "def foo=(a = 1, b = 2); end" says syntax error on "def foo=(a = 1, b = 2); end" parses "`foo`" parses "`foo`" parses "def foo(x @struct); end" parses "def foo(x @struct); end" parses "def foo(@offsetof); end" parses "def foo(@offsetof); end" parses "->(x) { x }" parses "->(x) { x }" parses "Int[8]?" parses "Int[8]?" parses "def foo(a, & : Int -> Double); end" parses "def foo(a, & : Int -> Double); end" says syntax error on "a = 1; a += next" says syntax error on "a = 1; a += next" parses "_ = 1" parses "_ = 1" parses "foo 1, a: 1, b: 2" parses "foo 1, a: 1, b: 2" parses "foo ensure 2" parses "foo ensure 2" parses "def >=(); end" parses "def >=(); end" parses "x([] of Foo, Bar.new)" parses "x([] of Foo, Bar.new)" parses "foo.!.!" parses "foo.!.!" parses "foo.is_a?(Const)" parses "foo.is_a?(Const)" parses "foo a: 1, &block" parses "foo a: 1, &block" parses "foo(0, n >> 2)" parses "foo(0, n >> 2)" says syntax error on "*a, 1 = 2" says syntax error on "*a, 1 = 2" parses "case\nwhen true\n1\nend" parses "case\nwhen true\n1\nend" parses "case 1\nin true; 2; end" parses "case 1\nin true; 2; end" parses "->Foo.&-(Int32)" parses "->Foo.&-(Int32)" says syntax error on "def foo(x, x); end" says syntax error on "def foo(x, x); end" says syntax error on "Foo(x: T y: U)" says syntax error on "Foo(x: T y: U)" parses "def foo(var : Int*); end" parses "def foo(var : Int*); end" parses "1 - 2" parses "1 - 2" parses "def foo(x = 1, *y); 1; end" parses "def foo(x = 1, *y); 1; end" parses "Foo??" parses "Foo??" parses "macro //;end" parses "macro //;end" parses "{% for x in y %}body{% end %}" parses "{% for x in y %}body{% end %}" parses "case;end" parses "case;end" parses "a.foo(&block)" parses "a.foo(&block)" says syntax error on "return / 1" says syntax error on "return / 1" parses "begin; 1; rescue; 2; else; 3; end" parses "begin; 1; rescue; 2; else; 3; end" parses "def foo(x)\n x\nend; foo = 1; b = 2; foo +b" parses "def foo(x)\n x\nend; foo = 1; b = 2; foo +b" says syntax error on "def foo(**x, &x); end" says syntax error on "def foo(**x, &x); end" parses "case {1}\nin {Int32.class}; 2; end" parses "case {1}\nin {Int32.class}; 2; end" parses "foo.responds_to?(:foo)" parses "foo.responds_to?(:foo)" parses "def foo(x @with); end" parses "def foo(x @with); end" parses "def type(type); end" parses "def type(type); end" parses "def foo(@@unless); end" parses "def foo(@@unless); end" parses "a = 1; a /b" parses "a = 1; a /b" parses "{% begin %}%r|\\A|{% end %}" parses "{% begin %}%r|\\A|{% end %}" parses "a.foo &block" parses "a.foo &block" parses "def foo(); 1; rescue; 2; end" parses "def foo(); 1; rescue; 2; end" parses "foo.[0] = 1" parses "foo.[0] = 1" parses "def foo(*y : *T); 1; end" parses "def foo(*y : *T); 1; end" parses "Foo(\"foo bar\": U)" parses "Foo(\"foo bar\": U)" says syntax error on "def foo(foo def); end" says syntax error on "def foo(foo def); end" says syntax error on "return % 1" says syntax error on "return % 1" says syntax error on "foo { |(self)| }" says syntax error on "foo { |(self)| }" parses "Foo(Bar())" parses "Foo(Bar())" parses "foo(0, n &* 2)" parses "foo(0, n &* 2)" parses "def foo(self foo); end" parses "def foo(self foo); end" parses "@a, b = 1, 2" parses "@a, b = 1, 2" parses "a, *b = 1, 2" parses "a, *b = 1, 2" parses "<<-FOO\n\t1\n\tFOO" parses "<<-FOO\n\t1\n\tFOO" parses "a = 1; a &*=\n1" parses "a = 1; a &*=\n1" parses "rescue : Int32" parses "rescue : Int32" says syntax error on "module Foo; require \"bar\"; end" says syntax error on "module Foo; require \"bar\"; end" parses "macro []=;end" parses "macro []=;end" parses "lib LibC; fun foo : Int*; end" parses "lib LibC; fun foo : Int*; end" parses "foo.[]= do end" parses "foo.[]= do end" parses "macro foo;%var{1, x} = hello;end" parses "macro foo;%var{1, x} = hello;end" says syntax error on "case 1\nin Int32; 2; when 2" says syntax error on "case 1\nin Int32; 2; when 2" parses "foo./ do end" parses "foo./ do end" says syntax error on "foo[break]" says syntax error on "foo[break]" says syntax error on "return | 1" says syntax error on "return | 1" parses "foo(a: n ^ 2)" parses "foo(a: n ^ 2)" says syntax error on "def foo(x @x); 1; end" says syntax error on "def foo(x @x); 1; end" says syntax error on "macro as; end" says syntax error on "macro as; end" says syntax error on "def foo\nalias\nend" says syntax error on "def foo\nalias\nend" parses "if foo; 1; end" parses "if foo; 1; end" says syntax error on "foo { |return| }" says syntax error on "foo { |return| }" parses "a = 1; a rescue a" parses "a = 1; a rescue a" says syntax error on "def foo\nclass\nend" says syntax error on "def foo\nclass\nend" parses "def self.-(); end;" parses "def self.-(); end;" says syntax error on "return ** 1" says syntax error on "return ** 1" parses "def foo(@fun); end" parses "def foo(@fun); end" says syntax error on "unless next; end" says syntax error on "unless next; end" says syntax error on "offsetof(X, 1.0)" says syntax error on "offsetof(X, 1.0)" parses "def foo(@protected); end" parses "def foo(@protected); end" sets correct location of splat in multiple assignment sets correct location of splat in multiple assignment parses "{% begin %}%Q< %s >{% end %}" parses "{% begin %}%Q< %s >{% end %}" parses "def foo(x @private); end" parses "def foo(x @private); end" parses "foo % Q()" parses "foo % Q()" parses "def self.<=; end;" parses "def self.<=; end;" says syntax error on "def foo(pointerof); end" says syntax error on "def foo(pointerof); end" parses "n & 2" parses "n & 2" parses "def foo(if foo); end" parses "def foo(if foo); end" parses "f.x &*= 2" parses "f.x &*= 2" says syntax error on "foo { |(private)| }" says syntax error on "foo { |(private)| }" parses "def [](x); end" parses "def [](x); end" parses "<<-HERE\nHello, mom! I am HERE.\nHER dress is beautiful.\nHE is OK.\n HERESY\nHERE" parses "<<-HERE\nHello, mom! I am HERE.\nHER dress is beautiful.\nHE is OK.\n HERESY\nHERE" parses "{% begin %}%| %s |{% end %}" parses "{% begin %}%| %s |{% end %}" says syntax error on "def foo(foo offsetof); end" says syntax error on "def foo(foo offsetof); end" says syntax error on "foo { |(include)| }" says syntax error on "foo { |(include)| }" parses "elsif : Int32" parses "elsif : Int32" parses "<<-HERE\n foo\#{1}bar\n baz\n HERE" parses "<<-HERE\n foo\#{1}bar\n baz\n HERE" parses "foo.<(1, 2)" parses "foo.<(1, 2)" parses "def foo(@@begin); end" parses "def foo(@@begin); end" says syntax error on "return * 1" says syntax error on "return * 1" parses "def foo(x @include); end" parses "def foo(x @include); end" parses "macro foo(@[Foo] *args);end" parses "macro foo(@[Foo] *args);end" says syntax error on "foo { |if| }" says syntax error on "foo { |if| }" parses "foo.!= do end" parses "foo.!= do end" parses "foo.& 1, 2" parses "foo.& 1, 2" parses "def self.!=; end;" parses "def self.!=; end;" parses "def self.%; end;" parses "def self.%; end;" parses "def >=; end;" parses "def >=; end;" says syntax error on "def foo(macro); end" says syntax error on "def foo(macro); end" says syntax error on "case 1\nin Int32; 2; else" says syntax error on "case 1\nin Int32; 2; else" parses "pointerof(@a)" parses "pointerof(@a)" parses "lib LibC; type A = B.class; end" parses "lib LibC; type A = B.class; end" parses "@[Foo()]" parses "@[Foo()]" parses "n < 2" parses "n < 2" parses "macro `;end" parses "macro `;end" parses "def foo(@@struct); end" parses "def foo(@@struct); end" parses "n == 2" parses "n == 2" parses "foo.!=" parses "foo.!=" parses "foo(z: 0, a: n * 2)" parses "foo(z: 0, a: n * 2)" says syntax error on "def foo(fun); end" says syntax error on "def foo(fun); end" parses "def foo(@@alias); end" parses "def foo(@@alias); end" single splats inside container literals parses "[*1, 2]" parses "[*1, 2]" parses "{1, *2, 3, *4, 5}" parses "{1, *2, 3, *4, 5}" parses "{1, *2}" parses "{1, *2}" says syntax error on "case {*1}\nwhen {2}; 3; end" says syntax error on "case {*1}\nwhen {2}; 3; end" parses "{*1, *2}" parses "{*1, *2}" says syntax error on "{a: 1, *2}" says syntax error on "{a: 1, *2}" parses "[1, *2, 3, *4, 5]" parses "[1, *2, 3, *4, 5]" parses "{*1 * 2}" parses "{*1 * 2}" says syntax error on "{1 => 2, *3}" says syntax error on "{1 => 2, *3}" parses "[*1 ** 2]" parses "[*1 ** 2]" says syntax error on "case {1}\nwhen {*2}; 3; end" says syntax error on "case {1}\nwhen {*2}; 3; end" parses "[*[*[1]], *[2]]" parses "[*[*[1]], *[2]]" parses "{*1}" parses "{*1}" says syntax error on "{*1 => 2}" says syntax error on "{*1 => 2}" parses "[*1]" parses "[*1]" parses "case 1\nwhen {*2}; 3; end" parses "case 1\nwhen {*2}; 3; end" says syntax error on "{*a: 1}" says syntax error on "{*a: 1}" parses "{*1, 2}" parses "{*1, 2}" parses "[*1, *2]" parses "[*1, *2]" parses "Set {*1, 2, *3}" parses "Set {*1, 2, *3}" parses "Set {*{1} * 2}" parses "Set {*{1} * 2}" parses "x = {*1}" parses "x = {*1}" parses "[1, *2]" parses "[1, *2]" parses "foo = 1; ->foo.>=(Int32)" parses "foo = 1; ->foo.>=(Int32)" parses "{[] of Foo, Bar::Baz + 2}" parses "{[] of Foo, Bar::Baz + 2}" parses "foo(a: n &- 2)" parses "foo(a: n &- 2)" parses "def foo;bar(end: 1);end" parses "def foo;bar(end: 1);end" says syntax error on "foo { |(begin)| }" says syntax error on "foo { |(begin)| }" parses "foo &block" parses "foo &block" parses "foo(x: result : Int32); result" parses "foo(x: result : Int32); result" parses "foo.=~(1, 2)" parses "foo.=~(1, 2)" parses "{% begin %}%x< %s >{% end %}" parses "{% begin %}%x< %s >{% end %}" parses "1 ^ 2" parses "1 ^ 2" parses "->Foo.+(Int32)" parses "->Foo.+(Int32)" parses "->(x : Int32) : Int32 { }" parses "->(x : Int32) : Int32 { }" parses "{A: 1, B: 2}" parses "{A: 1, B: 2}" parses "\"hello \" \\\n \"world\"" parses "\"hello \" \\\n \"world\"" says syntax error on "foo &.&&" says syntax error on "foo &.&&" parses "lib LibC; struct Foo; x, y, z : Int; end end" parses "lib LibC; struct Foo; x, y, z : Int; end end" parses "case 1\nwhen .!()\n2\nend" parses "case 1\nwhen .!()\n2\nend" parses ":<" parses ":<" parses "puts a if true" parses "puts a if true" says syntax error on "x { |*a, *b| }" says syntax error on "x { |*a, *b| }" parses "def foo(end foo); end" parses "def foo(end foo); end" parses "a.b &+=\n1" parses "a.b &+=\n1" parses "foo.== do end" parses "foo.== do end" parses ":-" parses ":-" says syntax error on "foo { |with| }" says syntax error on "foo { |with| }" parses "foo(Foo: 1, Bar: 2)" parses "foo(Foo: 1, Bar: 2)" parses ":[]" parses ":[]" parses "foo = 1; ->foo.&**(Int32)" parses "foo = 1; ->foo.&**(Int32)" parses "{[] of Foo, Bar::Baz ** 2}" parses "{[] of Foo, Bar::Baz ** 2}" parses "Foo(x: U)" parses "Foo(x: U)" parses "foo.*(1, 2) { 3 }" parses "foo.*(1, 2) { 3 }" says syntax error on "foo { |next| }" says syntax error on "foo { |next| }" parses "foo(a: n <= 2)" parses "foo(a: n <= 2)" parses "foo(0, n < 2)" parses "foo(0, n < 2)" parses "case {1, 2}\nwhen foo\n5\nend" parses "case {1, 2}\nwhen foo\n5\nend" parses "def foo(@pointerof); end" parses "def foo(@pointerof); end" parses "a, *b = 1" parses "a, *b = 1" says syntax error on "def f end" says syntax error on "def f end" parses "<<-HERE\r\n One\r\n Zero\r\n HERE\r\n" parses "<<-HERE\r\n One\r\n Zero\r\n HERE\r\n" parses "foo.**(1, 2)" parses "foo.**(1, 2)" parses "fun foo(x : Int32) : Int64\nx\nend" parses "fun foo(x : Int32) : Int64\nx\nend" parses "foo bar.baz(1) do\nend" parses "foo bar.baz(1) do\nend" parses "def *(); end;" parses "def *(); end;" parses "def ===(*args, **opts); end" parses "def ===(*args, **opts); end" says syntax error on "case {1, 2}; when {3}; 4; end" says syntax error on "case {1, 2}; when {3}; 4; end" says syntax error on "return .. 1" says syntax error on "return .. 1" parses "1\n-2" parses "1\n-2" parses "def foo(asm foo); end" parses "def foo(asm foo); end" parses "{% begin %}%{ %s }{% end %}" parses "{% begin %}%{ %s }{% end %}" says syntax error on "\n lib LibFoo\n fun foo(x : Int32\n y : Float64)\n end\n " says syntax error on "\n lib LibFoo\n fun foo(x : Int32\n y : Float64)\n end\n " parses "x[a: 1, b: 2,]" parses "x[a: 1, b: 2,]" parses "%r(\\/)" parses "%r(\\/)" says syntax error on "def foo(foo struct); end" says syntax error on "def foo(foo struct); end" parses "{A::B => 1, C::D => 2}" parses "{A::B => 1, C::D => 2}" parses "foo(\n1)" parses "foo(\n1)" parses "yield 1" parses "yield 1" says syntax error on "A = B = 1" says syntax error on "A = B = 1" says syntax error on "foo **bar, out x" says syntax error on "foo **bar, out x" parses "foo(bar { })" parses "foo(bar { })" says syntax error on "next % 1" says syntax error on "next % 1" parses "foo.%(1, 2) { 3 }" parses "foo.%(1, 2) { 3 }" says syntax error on "foo { |out| }" says syntax error on "foo { |out| }" parses "pointerof(\n foo\n)" parses "pointerof(\n foo\n)" parses "foo(n << 2)" parses "foo(n << 2)" parses "foo(z: 0, a: n & 2)" parses "foo(z: 0, a: n & 2)" parses "{a: 1, b: 2}" parses "{a: 1, b: 2}" says syntax error on "break[0]= 1" says syntax error on "break[0]= 1" says syntax error on "foo { |lib| }" says syntax error on "foo { |lib| }" parses "foo(x) do\n//\nend" parses "foo(x) do\n//\nend" parses "foo(a: n > 2)" parses "foo(a: n > 2)" parses "case {1}\nin {Foo(Int32)}; 2; end" parses "case {1}\nin {Foo(Int32)}; 2; end" parses "foo(0, n // 2)" parses "foo(0, n // 2)" parses "def Foo::Bar.foo\n1\nend" parses "def Foo::Bar.foo\n1\nend" parses "foo &.bar.baz" parses "foo &.bar.baz" says syntax error on "lib LibC\n$Errno : Int32\nend" says syntax error on "lib LibC\n$Errno : Int32\nend" says syntax error on "foo(1 2)" says syntax error on "foo(1 2)" parses "def self.^(); end;" parses "def self.^(); end;" says syntax error on "break[]" says syntax error on "break[]" parses "f.x *= 2" parses "f.x *= 2" parses "def foo(x @class); end" parses "def foo(x @class); end" parses "a = 1\nfoo - a" parses "a = 1\nfoo - a" says syntax error on " {1, 2, 3 end" says syntax error on " {1, 2, 3 end" parses "1;+2" parses "1;+2" parses "next 1, 2" parses "next 1, 2" parses "puts __DIR__" parses "puts __DIR__" parses "foo.=== do end" parses "foo.=== do end" parses "is_a?(Const)" parses "is_a?(Const)" parses "1 .. 2" parses "1 .. 2" end locations gets corrects end location for "require \"foo\"" gets corrects end location for "require \"foo\"" says syntax error on "%x(" says syntax error on "%x(" gets corrects end location for "offsetof(Foo, @a)" gets corrects end location for "offsetof(Foo, @a)" gets corrects end location for "[] of Int32" gets corrects end location for "[] of Int32" gets corrects end location for "!foo" gets corrects end location for "!foo" gets corrects end location for "sizeof(Foo)" gets corrects end location for "sizeof(Foo)" sets correct location of `elsif` of if statement sets correct location of `elsif` of if statement gets corrects end location for "Foo { 1 }" gets corrects end location for "Foo { 1 }" parses "%w{one{} two}" parses "%w{one{} two}" sets correct location for fun def with body sets correct location for fun def with body says syntax error on "case x; when [1, 2]; 2; when [1, 2]; end" says syntax error on "case x; when [1, 2]; 2; when [1, 2]; end" gets corrects end location for "foo(\n &.block\n)" gets corrects end location for "foo(\n &.block\n)" parses "annotation Foo; end" parses "annotation Foo; end" says syntax error on "case x; when true; 2; when true; end" says syntax error on "case x; when true; 2; when true; end" sets correct location of proc literal sets correct location of proc literal gets corrects end location for "def foo; end" gets corrects end location for "def foo; end" gets corrects end location for "{%\nif foo\n bar\n end\n%}" gets corrects end location for "{%\nif foo\n bar\n end\n%}" gets corrects end location for "foo ->self.bar" gets corrects end location for "foo ->self.bar" gets corrects end location for "{} of Int32 => String" gets corrects end location for "{} of Int32 => String" gets corrects end location for "@@a = uninitialized Foo" gets corrects end location for "@@a = uninitialized Foo" gets corrects end location for "macro foo;end" gets corrects end location for "macro foo;end" parses "%w{\n}" parses "%w{\n}" parses "annotation Foo\nend\nrequire \"bar\"" parses "annotation Foo\nend\nrequire \"bar\"" gets corrects end location for "foo.bar= *baz" gets corrects end location for "foo.bar= *baz" gets corrects end location for "Foo?" gets corrects end location for "Foo?" sets correct location of `else` of if statement sets correct location of `else` of if statement gets corrects end location for "module Foo; end" gets corrects end location for "module Foo; end" says syntax error on "case x; when X; 2; when X; end" says syntax error on "case x; when X; 2; when X; end" gets corrects end location for "1.." gets corrects end location for "1.." gets corrects end location for "begin; 1; 2; 3; end" gets corrects end location for "begin; 1; 2; 3; end" gets corrects end location for block with { ... } gets corrects end location for block with { ... } sets correct location of receiver var in method def sets correct location of receiver var in method def gets corrects end location for "foo ->@bar.baz" gets corrects end location for "foo ->@bar.baz" says syntax error on "def foo(x : 1); end" says syntax error on "def foo(x : 1); end" gets corrects end location for "foo : Foo?" gets corrects end location for "foo : Foo?" gets corrects end location for "foo(1, 2)" gets corrects end location for "foo(1, 2)" doesn't override yield with macro yield doesn't override yield with macro yield parses "%w{one\\ two}" parses "%w{one\\ two}" gets corrects end location for "foo ->@@bar.baz" gets corrects end location for "foo ->@@bar.baz" gets corrects end location for "abstract def foo" gets corrects end location for "abstract def foo" sets location of enum method sets location of enum method parses "%i((one two))" parses "%i((one two))" gets corrects end location for "f.x=(foo).bar" gets corrects end location for "f.x=(foo).bar" gets corrects end location for "foo : Foo.class" gets corrects end location for "foo : Foo.class" says syntax error on "def foo(x : Int32, Int32); end" says syntax error on "def foo(x : Int32, Int32); end" says syntax error on "foo(a: 1\n,b: 2)" says syntax error on "foo(a: 1\n,b: 2)" sets correct locations of keywords of exception handler sets correct locations of keywords of exception handler gets corrects end location for "foo.@foo" gets corrects end location for "foo.@foo" says syntax error on "case x; when :a; 2; when :a; end" says syntax error on "case x; when :a; 2; when :a; end" gets corrects end location for "alias Foo = Bar" gets corrects end location for "alias Foo = Bar" gets corrects end location for "foo.nil?" gets corrects end location for "foo.nil?" gets corrects end location for "f.x=(*foo)" gets corrects end location for "f.x=(*foo)" parses "annotation Foo\n\nend" parses "annotation Foo\n\nend" gets corrects end location for "foo.nil?( )" gets corrects end location for "foo.nil?( )" says syntax error on "%w(" says syntax error on "%w(" gets corrects end location for "foo.responds_to? :foo" gets corrects end location for "foo.responds_to? :foo" gets corrects end location for "while 1; end" gets corrects end location for "while 1; end" gets corrects end location for "1..3" gets corrects end location for "1..3" says syntax error on "case x; when 1..2; 2; when 1..2; end" says syntax error on "case x; when 1..2; 2; when 1..2; end" gets corrects end location for "nil" gets corrects end location for "nil" says syntax error on "case x; when 'a'; 2; when 'a'; end" says syntax error on "case x; when 'a'; 2; when 'a'; end" says syntax error on "Foo(x: X\n,y: Y)" says syntax error on "Foo(x: X\n,y: Y)" sets location of obj.x += as call sets location of obj.x += as call gets corrects end location for "return 1" gets corrects end location for "return 1" gets corrects end location for "extend Foo" gets corrects end location for "extend Foo" gets corrects end location for "::foo" gets corrects end location for "::foo" parses "%i(foo(bar) baz)" parses "%i(foo(bar) baz)" gets corrects end location for "abstract def foo : Int32" gets corrects end location for "abstract def foo : Int32" gets corrects end location for "foo : Foo*" gets corrects end location for "foo : Foo*" gets corrects end location for "Foo(A)" gets corrects end location for "Foo(A)" gets corrects end location for "foo.responds_to?(:foo)" gets corrects end location for "foo.responds_to?(:foo)" gets corrects end location for "if 1; else; 2; end" gets corrects end location for "if 1; else; 2; end" gets corrects end location for "[1, 2,]" gets corrects end location for "[1, 2,]" gets correct location of empty exception handler inside def gets correct location of empty exception handler inside def says syntax error on "{1 => 2\n,3 => 4}" says syntax error on "{1 => 2\n,3 => 4}" sets correct location of `else` of unless statement sets correct location of `else` of unless statement parses "%i{(one two)}" parses "%i{(one two)}" gets corrects end location for "/foo/" gets corrects end location for "/foo/" gets corrects end location for "foo ->bar(Baz)" gets corrects end location for "foo ->bar(Baz)" gets corrects end location for "false" gets corrects end location for "false" sets correct location and end location of `begin` block sets correct location and end location of `begin` block gets corrects end location for "yield" gets corrects end location for "yield" gets corrects end location for "class Foo; end" gets corrects end location for "class Foo; end" gets corrects end location for "offsetof({X, Y}, 1)" gets corrects end location for "offsetof({X, Y}, 1)" sets correct location for fun def on multiple lines sets correct location for fun def on multiple lines sets correct location of var in macro for loop sets correct location of var in macro for loop gets corrects end location for var gets corrects end location for var sets correct location of implicit tuple literal of multi-return sets correct location of implicit tuple literal of multi-return parses "%w{one\ttwo}" parses "%w{one\ttwo}" gets corrects end location for "def foo; rescue ex; end" gets corrects end location for "def foo; rescue ex; end" gets corrects end location for var + var gets corrects end location for var + var sets location of lib fun name sets location of lib fun name gets corrects end location for "foo.bar(x) do; end" gets corrects end location for "foo.bar(x) do; end" gets corrects end location for "foo *bar" gets corrects end location for "foo *bar" sets correct location of trailing rescue sets correct location of trailing rescue gets corrects of ~ gets corrects of ~ says syntax error on "macro foo(x\n,y); 1; end" says syntax error on "macro foo(x\n,y); 1; end" gets corrects end location for "pointerof(@foo)" gets corrects end location for "pointerof(@foo)" gets corrects end location for "return" gets corrects end location for "return" gets corrects end location for "puts obj.foo" gets corrects end location for "puts obj.foo" gets corrects end location for "yield 1" gets corrects end location for "yield 1" parses "%i{foo\\nbar baz}" parses "%i{foo\\nbar baz}" says syntax error on "def foo(x : Int32 | (Int32, Int32)); end" says syntax error on "def foo(x : Int32 | (Int32, Int32)); end" says syntax error on "case x; when /x/; 2; when /x/; end" says syntax error on "case x; when /x/; 2; when /x/; end" gets corrects end location for "foo ->Bar.baz" gets corrects end location for "foo ->Bar.baz" gets corrects end location for "a && b" gets corrects end location for "a && b" parses "%w{one two}" parses "%w{one two}" sets correct location of call name in operator assignment sets correct location of call name in operator assignment gets corrects end location for "unless 1; 2; end" gets corrects end location for "unless 1; 2; end" says syntax error on "def foo(x : Array({sizeof(Int32), 2})); end" says syntax error on "def foo(x : Array({sizeof(Int32), 2})); end" parses "%w{one\ntwo}" parses "%w{one\ntwo}" says syntax error on "%w{one}}" says syntax error on "%w{one}}" gets corrects end location for "a, b = 1, 2 if 3" gets corrects end location for "a, b = 1, 2 if 3" gets correct location after macro with yield gets correct location after macro with yield parses "%w{\\{one}" parses "%w{\\{one}" says syntax error on "def foo(x : (Int32, Int32) | Int32); end" says syntax error on "def foo(x : (Int32, Int32) | Int32); end" gets corrects end location for "x : Foo ->" gets corrects end location for "x : Foo ->" gets corrects end location for "1.as(Int32)" gets corrects end location for "1.as(Int32)" gets corrects end location for "x : Foo(A, *B, C)" gets corrects end location for "x : Foo(A, *B, C)" says syntax error on "%r(" says syntax error on "%r(" says syntax error on "{\"a\" : 1}" says syntax error on "{\"a\" : 1}" says syntax error on "foo(1\n,2)" says syntax error on "foo(1\n,2)" gets corrects end location for "123" gets corrects end location for "123" parses "%i(one\\ two)" parses "%i(one\\ two)" says syntax error on "{\"a\": 1, \"b\" : 2}" says syntax error on "{\"a\": 1, \"b\" : 2}" gets corrects end location for "x : Foo -> Bar" gets corrects end location for "x : Foo -> Bar" gets corrects end location for "a || b" gets corrects end location for "a || b" gets corrects end location for "foo ->@@bar.baz=" gets corrects end location for "foo ->@@bar.baz=" gets corrects end location for block with do ... end gets corrects end location for block with do ... end says syntax error on "{1\n,2}" says syntax error on "{1\n,2}" says syntax error on "class Foo(X\n,Y); 1; end" says syntax error on "class Foo(X\n,Y); 1; end" gets corrects end location for "f.x = foo" gets corrects end location for "f.x = foo" gets corrects end location for "123.45" gets corrects end location for "123.45" gets corrects end location for "foo **bar" gets corrects end location for "foo **bar" gets corrects end location for "[1, 2]" gets corrects end location for "[1, 2]" says syntax error on "case x; when {1, 2}; 2; when {1, 2}; end" says syntax error on "case x; when {1, 2}; 2; when {1, 2}; end" gets corrects end location for ":foo" gets corrects end location for ":foo" sets correct location of vars in C struct sets correct location of vars in C struct gets corrects end location for "abstract def foo(x)" gets corrects end location for "abstract def foo(x)" gets corrects end location for "struct Foo; end" gets corrects end location for "struct Foo; end" gets corrects end location for "macro foo; 123; end" gets corrects end location for "macro foo; 123; end" gets corrects end location for "a, b = 1, 2" gets corrects end location for "a, b = 1, 2" says syntax error on "%i{one}}" says syntax error on "%i{one}}" gets corrects end location for "foo 1, 2" gets corrects end location for "foo 1, 2" says syntax error on "<<-HEREDOC\n" says syntax error on "<<-HEREDOC\n" gets corrects end location for "begin; 1; end" gets corrects end location for "begin; 1; end" gets corrects end location for "@a = uninitialized Foo" gets corrects end location for "@a = uninitialized Foo" gets corrects end location for "{a: 1}" gets corrects end location for "{a: 1}" gets corrects end location for "1 ensure 2" gets corrects end location for "1 ensure 2" gets corrects end location for "Int[8]?" gets corrects end location for "Int[8]?" correctly computes line number after `\{% ` (#9857) correctly computes line number after `\{% ` (#9857) gets corrects end location for "def foo; 1; end" gets corrects end location for "def foo; 1; end" says syntax error on "Foo(X\n,Y)" says syntax error on "Foo(X\n,Y)" parses "%w{one\\}}" parses "%w{one\\}}" gets corrects end location for "foo bar, out baz" gets corrects end location for "foo bar, out baz" sets location of += sets location of += says syntax error on "def foo(x : (*Int32)); end" says syntax error on "def foo(x : (*Int32)); end" gets corrects end location for "foo ->Bar.baz=" gets corrects end location for "foo ->Bar.baz=" says syntax error on "def foo(x\n,y); 1; end" says syntax error on "def foo(x\n,y); 1; end" gets corrects end location for "foo.!" gets corrects end location for "foo.!" gets corrects end location for "foo : Foo[42]" gets corrects end location for "foo : Foo[42]" says syntax error on "def foo(x : {sizeof(Int32), 2}); end" says syntax error on "def foo(x : {sizeof(Int32), 2}); end" says syntax error on "case x; when 1; 2; when 1; end" says syntax error on "case x; when 1; 2; when 1; end" says syntax error on "def foo(x : (Int32, Int32)); end" says syntax error on "def foo(x : (Int32, Int32)); end" says syntax error on "case x; when 1, _; end" says syntax error on "case x; when 1, _; end" gets corrects end location for "foo ->bar=" gets corrects end location for "foo ->bar=" gets corrects end location for "@foo" gets corrects end location for "@foo" gets corrects end location for "a = 123" gets corrects end location for "a = 123" gets corrects end location for "foo.[0] = 1" gets corrects end location for "foo.[0] = 1" gets corrects end location for "->{ }" gets corrects end location for "->{ }" gets corrects end location for "foo.!()" gets corrects end location for "foo.!()" says syntax error on "[1\n,2]" says syntax error on "[1\n,2]" sets correct location and end location of parenthesized block sets correct location and end location of parenthesized block says syntax error on "%w{{one}" says syntax error on "%w{{one}" says syntax error on "def foo(x : *Int32); end" says syntax error on "def foo(x : *Int32); end" sets correct location of element in array literal sets correct location of element in array literal gets correct location after macro with yield gets correct location after macro with yield gets corrects end location for "foo ->@bar.baz=" gets corrects end location for "foo ->@bar.baz=" gets corrects end location for "'a'" gets corrects end location for "'a'" sets correct location for fun def with return type sets correct location for fun def with return type sets location of top-level fun name sets location of top-level fun name gets correct location with (#1558) gets correct location with (#1558) gets corrects end location for "\"hello\"" gets corrects end location for "\"hello\"" gets corrects end location for "Foo" gets corrects end location for "Foo" says syntax error on "%Q(" says syntax error on "%Q(" gets corrects end location for "@@foo" gets corrects end location for "@@foo" says syntax error on "%q(" says syntax error on "%q(" says syntax error on "case x; when nil; 2; when nil; end" says syntax error on "case x; when nil; 2; when nil; end" sets correct location of call name sets correct location of call name gets corrects end location for "foo ->bar" gets corrects end location for "foo ->bar" sets correct location of var in proc pointer sets correct location of var in proc pointer sets correct location of trailing ensure sets correct location of trailing ensure says syntax error on "case x; when \"a\"; 2; when \"a\"; end" says syntax error on "case x; when \"a\"; 2; when \"a\"; end" gets corrects end location for "1 if 2" gets corrects end location for "1 if 2" sets correct location for fun def sets correct location for fun def gets corrects end location for "%w(one two)" gets corrects end location for "%w(one two)" says syntax error on "<<-HEREDOC" says syntax error on "<<-HEREDOC" says syntax error on "%i{{one}" says syntax error on "%i{{one}" gets corrects end location for "include Foo" gets corrects end location for "include Foo" gets corrects end location for "if 1; elseif; 2; end" gets corrects end location for "if 1; elseif; 2; end" gets corrects end location for "foo ->self.bar=" gets corrects end location for "foo ->self.bar=" gets corrects end location for "foo" gets corrects end location for "foo" sets correct location of var in type declaration sets correct location of var in type declaration says syntax error on "{1, 2\n,3}" says syntax error on "{1, 2\n,3}" says syntax error on "case x; when _; end" says syntax error on "case x; when _; end" gets corrects end location for "1 rescue 2" gets corrects end location for "1 rescue 2" parses "annotation Foo::Bar\n\nend" parses "annotation Foo::Bar\n\nend" gets corrects end location for "{1, 2}" gets corrects end location for "{1, 2}" says syntax error on "%i(" says syntax error on "%i(" sets correct location and end location of parenthesized empty block sets correct location and end location of parenthesized empty block says syntax error on "def foo(x : {Int32, (Int32, Int32)}); end" says syntax error on "def foo(x : {Int32, (Int32, Int32)}); end" says syntax error on "case x; when 1; when _; end" says syntax error on "case x; when 1; when _; end" gets corrects end location for "foo : Foo**" gets corrects end location for "foo : Foo**" gets corrects end location for "typeof(1)" gets corrects end location for "typeof(1)" parses "->@@foo.foo!" parses "->@@foo.foo!" parses "def foo(@@lib); end" parses "def foo(@@lib); end" parses "!1" parses "!1" parses "macro [];end" parses "macro [];end" parses "foo(n % 2)" parses "foo(n % 2)" says syntax error on "lib Foo%end" says syntax error on "lib Foo%end" parses "def foo(x, **args, &block)\n1\nend" parses "def foo(x, **args, &block)\n1\nend" parses ":!" parses ":!" parses "a = 1; a |=\n1" parses "a = 1; a |=\n1" parses "instance_alignof(X)" parses "instance_alignof(X)" says syntax error on "break + 1" says syntax error on "break + 1" parses "foo(a: n =~ 2)" parses "foo(a: n =~ 2)" says syntax error on "foo.responds_to?" says syntax error on "foo.responds_to?" parses "responds_to?(:foo)" parses "responds_to?(:foo)" says syntax error on "def foo=(*args); end" says syntax error on "def foo=(*args); end" parses "macro : Int32" parses "macro : Int32" parses "instance_sizeof(X)" parses "instance_sizeof(X)" says syntax error on "if 1 == 1 a; end" says syntax error on "if 1 == 1 a; end" parses "{% begin %}%( %s ){% end %}" parses "{% begin %}%( %s ){% end %}" says syntax error on "def foo(alias); end" says syntax error on "def foo(alias); end" says syntax error on "def foo(foo with); end" says syntax error on "def foo(foo with); end" parses "1 | 2" parses "1 | 2" parses "abstract struct Foo; end" parses "abstract struct Foo; end" parses "->Foo.|(Int32)" parses "->Foo.|(Int32)" parses "asm(\"nop\" :::: \"volatile\")" parses "asm(\"nop\" :::: \"volatile\")" parses "foo(z: 0, a: n == 2)" parses "foo(z: 0, a: n == 2)" says syntax error on "def foo(end); end" says syntax error on "def foo(end); end" parses "foo(bar:a, baz:b)" parses "foo(bar:a, baz:b)" parses "puts {{**1}}" parses "puts {{**1}}" parses "2 * (3 + 4)" parses "2 * (3 + 4)" parses ":foo!" parses ":foo!" says syntax error on "if break; end" says syntax error on "if break; end" says syntax error on "break == 1" says syntax error on "break == 1" says syntax error on "->(x, y z) { }" says syntax error on "->(x, y z) { }" parses "def foo(x @@pointerof); end" parses "def foo(x @@pointerof); end" parses ":===" parses ":===" says syntax error on "return.foo" says syntax error on "return.foo" parses "foo[1] /2" parses "foo[1] /2" says syntax error on "\"hello\" foo" says syntax error on "\"hello\" foo" says syntax error on "Foo(\"\": T)" says syntax error on "Foo(\"\": T)" parses "b.c ||= 1" parses "b.c ||= 1" parses "x = 0; a, b = x += 1" parses "x = 0; a, b = x += 1" says syntax error on "foo { |(select)| }" says syntax error on "foo { |(select)| }" parses "def foo(x = 1, **args)\n1\nend" parses "def foo(x = 1, **args)\n1\nend" parses "foo(n &+ 2)" parses "foo(n &+ 2)" says syntax error on "foo { |abstract| }" says syntax error on "foo { |abstract| }" says syntax error on "{1 => 2 3 => 4}" says syntax error on "{1 => 2 3 => 4}" parses "property fun : Int32" parses "property fun : Int32" parses "\"hello \\\n world\"" parses "\"hello \\\n world\"" parses "macro foo;bar{% if x %}body{% elsif y %}body2{% else %}body3{%end%}baz;end" parses "macro foo;bar{% if x %}body{% elsif y %}body2{% else %}body3{%end%}baz;end" parses ":<<" parses ":<<" parses "puts __LINE__" parses "puts __LINE__" parses "f.x -= 2" parses "f.x -= 2" parses "[] of ->\n" parses "[] of ->\n" says syntax error on "foo(**bar, 1)" says syntax error on "foo(**bar, 1)" parses "\"foo\#{\"bar\"}baz\"" parses "\"foo\#{\"bar\"}baz\"" parses "foo &.[0] = 1" parses "foo &.[0] = 1" parses "a.b |=\n1" parses "a.b |=\n1" parses "begin; rescue; end" parses "begin; rescue; end" parses "a, b = 1, 2 if 3" parses "a, b = 1, 2 if 3" parses "foo(1)" parses "foo(1)" parses "macro foo;bar{% for x in y %}body{% end %}baz;end" parses "macro foo;bar{% for x in y %}body{% end %}baz;end" parses "a = 1; pointerof(a)" parses "a = 1; pointerof(a)" parses "if (\ntrue\n)\n1\nend" parses "if (\ntrue\n)\n1\nend" parses "a = 1; a <<= 1" parses "a = 1; a <<= 1" parses "a.b *=\n1" parses "a.b *=\n1" says syntax error on "def foo(\"bar\");end" says syntax error on "def foo(\"bar\");end" says syntax error on "macro foo(*x, *y); end" says syntax error on "macro foo(*x, *y); end" parses "property enum : Int32" parses "property enum : Int32" says syntax error on "def foo(select); end" says syntax error on "def foo(select); end" parses "def +; end;" parses "def +; end;" parses "foo % i()" parses "foo % i()" parses "select\nwhen foo\n2\nwhen bar\n4\nend" parses "select\nwhen foo\n2\nwhen bar\n4\nend" says syntax error on "foo { |end| }" says syntax error on "foo { |end| }" parses "alias Foo::Bar = Baz" parses "alias Foo::Bar = Baz" says syntax error on "1 foo" says syntax error on "1 foo" says syntax error on "A = begin; 1; ensure; B = 1; end" says syntax error on "A = begin; 1; ensure; B = 1; end" parses ":>=" parses ":>=" says syntax error on "1 == 2, a = 4" says syntax error on "1 == 2, a = 4" parses "break : Int32" parses "break : Int32" parses "->Foo::Bar::Baz.foo" parses "->Foo::Bar::Baz.foo" parses "foo.&(1, 2) { 3 }" parses "foo.&(1, 2) { 3 }" parses "def foo(yield foo); end" parses "def foo(yield foo); end" parses "def foo(@@out); end" parses "def foo(@@out); end" says syntax error on "case return; when 1; end; end" says syntax error on "case return; when 1; end; end" parses "class Foo < Bar; end" parses "class Foo < Bar; end" parses "def foo(&block); end" parses "def foo(&block); end" parses "case\nend" parses "case\nend" parses "{% begin %}%i< %s >{% end %}" parses "{% begin %}%i< %s >{% end %}" parses "def foo(x : U) forall U; end" parses "def foo(x : U) forall U; end" says syntax error on "def foo(**args, x); end" says syntax error on "def foo(**args, x); end" parses "if foo\n1\nelse\n2\nend" parses "if foo\n1\nelse\n2\nend" parses "+1" parses "+1" parses "->Foo.*(Int32)" parses "->Foo.*(Int32)" parses "def foo(x @module); end" parses "def foo(x @module); end" parses "foo(out @x); @x" parses "foo(out @x); @x" parses "foo = 1; ->foo.+(Int32)" parses "foo = 1; ->foo.+(Int32)" parses "foo &.as?(T)" parses "foo &.as?(T)" says syntax error on "break ** 1" says syntax error on "break ** 1" says syntax error on "next + 1" says syntax error on "next + 1" parses "abstract class Foo; end" parses "abstract class Foo; end" parses "foo ..2" parses "foo ..2" says syntax error on "def foo(foo self); end" says syntax error on "def foo(foo self); end" says syntax error on "class Foo(T, T); end" says syntax error on "class Foo(T, T); end" parses "foo(Bar { 1 })" parses "foo(Bar { 1 })" parses "x[1, ..2]" parses "x[1, ..2]" parses "foo.%(1, 2)" parses "foo.%(1, 2)" parses "fun foo : Int32; 1; end; 2" parses "fun foo : Int32; 1; end; 2" parses "->Foo./(Int32)" parses "->Foo./(Int32)" parses "typeof(\n 1\n)" parses "typeof(\n 1\n)" parses "{% unless 1; 2; end %}" parses "{% unless 1; 2; end %}" parses "<<-HERE\r\n One\r\n Zero\r\n HERE" parses "<<-HERE\r\n One\r\n Zero\r\n HERE" says syntax error on "foo { |(with)| }" says syntax error on "foo { |(with)| }" parses "1 +2_i64" parses "1 +2_i64" parses "property struct : Int32" parses "property struct : Int32" parses "def foo(macro foo); end" parses "def foo(macro foo); end" parses "foo = 1; ->foo.[]=(Int32)" parses "foo = 1; ->foo.[]=(Int32)" parses "def ===(*args, **opts, &); end" parses "def ===(*args, **opts, &); end" parses "->() : Int32 do end" parses "->() : Int32 do end" parses "alignof(\n Int32\n)" parses "alignof(\n Int32\n)" parses "1 \\\r\n + 2" parses "1 \\\r\n + 2" parses "def foo(@enum); end" parses "def foo(@enum); end" says syntax error on "unless break; end" says syntax error on "unless break; end" parses "macro foo\n'\\''\nend" parses "macro foo\n'\\''\nend" parses "->@@foo.foo" parses "->@@foo.foo" parses "n === 2" parses "n === 2" parses "asm(\"bl trap\" :::: \"unwind\")" parses "asm(\"bl trap\" :::: \"unwind\")" says syntax error on "foo { |module| }" says syntax error on "foo { |module| }" parses "@foo/2" parses "@foo/2" parses "macro <;end" parses "macro <;end" parses "puts __FILE__" parses "puts __FILE__" parses "module Foo(T); end" parses "module Foo(T); end" parses "foo.bar" parses "foo.bar" says syntax error on "def foo(foo begin); end" says syntax error on "def foo(foo begin); end" says syntax error on "def foo(offsetof); end" says syntax error on "def foo(offsetof); end" parses "a = 1; a &&= 1" parses "a = 1; a &&= 1" parses "end : Int32" parses "end : Int32" parses "foo.+(1, 2)" parses "foo.+(1, 2)" parses "true" parses "true" parses "foo.- do end" parses "foo.- do end" says syntax error on "def foo(foo private); end" says syntax error on "def foo(foo private); end" says syntax error on "1 unless next" says syntax error on "1 unless next" parses "Foo?" parses "Foo?" parses "def foo(x @nil); end" parses "def foo(x @nil); end" says syntax error on "a = return" says syntax error on "a = return" parses "foo = 1; ->foo.===(Int32)" parses "foo = 1; ->foo.===(Int32)" parses "def foo(x @typeof); end" parses "def foo(x @typeof); end" parses "foo do; 1; end" parses "foo do; 1; end" parses "foo(a: n &* 2)" parses "foo(a: n &* 2)" parses "a b() {}" parses "a b() {}" parses "1 &* 2" parses "1 &* 2" says syntax error on "a = a" says syntax error on "a = a" parses "break {1, 2}" parses "break {1, 2}" says syntax error on "def as; end" says syntax error on "def as; end" parses "offsetof(X, @a)" parses "offsetof(X, @a)" parses "def foo(@var); 1; end" parses "def foo(@var); 1; end" parses "foo = 1; ->foo.**(Int32)" parses "foo = 1; ->foo.**(Int32)" parses "1 =~ 2" parses "1 =~ 2" says syntax error on "def foo(foo abstract); end" says syntax error on "def foo(foo abstract); end" parses "def foo(@false); end" parses "def foo(@false); end" parses "foo z: out x; x" parses "foo z: out x; x" parses "def foo(typeof foo); end" parses "def foo(typeof foo); end" parses "foo(\"foo bar\": 1, \"baz\": 2)" parses "foo(\"foo bar\": 1, \"baz\": 2)" parses "n > 2" parses "n > 2" parses "a @b-1\nc" parses "a @b-1\nc" parses "def ^; end;" parses "def ^; end;" says syntax error on "macro foo" says syntax error on "macro foo" says syntax error on "break <= 1" says syntax error on "break <= 1" parses "foo % r()" parses "foo % r()" parses "->::foo!" parses "->::foo!" parses "@[Foo(\n1, foo: 2\n)]" parses "@[Foo(\n1, foo: 2\n)]" parses "a.b **=\n1" parses "a.b **=\n1" parses "def foo(@@private); end" parses "def foo(@@private); end" says syntax error on "def self.nil?; end" says syntax error on "def self.nil?; end" says syntax error on "break[0]" says syntax error on "break[0]" parses "macro foo(@[Foo] var);end" parses "macro foo(@[Foo] var);end" says syntax error on "foo { |true| }" says syntax error on "foo { |true| }" says syntax error on "yield return" says syntax error on "yield return" parses "break *1" parses "break *1" parses "lib LibC; Foo = 1; end" parses "lib LibC; Foo = 1; end" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1))" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1))" parses "def foo(@@macro); end" parses "def foo(@@macro); end" sets correct location of annotation in enum sets correct location of annotation in enum parses "def []=(*args, **opts, &); end" parses "def []=(*args, **opts, &); end" parses "1.[]=(2, 3)" parses "1.[]=(2, 3)" parses "\"hello \\\r\n world\"" parses "\"hello \\\r\n world\"" parses "a\nwhile / /\n/ /\nend" parses "a\nwhile / /\n/ /\nend" parses "+ 1" parses "+ 1" parses "def self.+; end;" parses "def self.+; end;" parses "@a : Foo = 1" parses "@a : Foo = 1" parses "1.nil?(\n)" parses "1.nil?(\n)" parses "typeof : Int32" parses "typeof : Int32" says syntax error on "class Foo(T U)" says syntax error on "class Foo(T U)" parses "def foo(@self); end" parses "def foo(@self); end" says syntax error on "<<-HERE\n One\n \#{1}\n HERE" says syntax error on "<<-HERE\n One\n \#{1}\n HERE" parses "<<-HERE\n One \\n Two\n Zero\n HERE" parses "<<-HERE\n One \\n Two\n Zero\n HERE" parses "a() /3" parses "a() /3" parses "foo !false" parses "foo !false" says syntax error on "a.b, c.d() = 1" says syntax error on "a.b, c.d() = 1" parses "Foo(_)" parses "Foo(_)" parses "def foo(@@require); end" parses "def foo(@@require); end" parses "break *{1, 2}" parses "break *{1, 2}" says syntax error on "$foo" says syntax error on "$foo" parses "foo.!~ do end" parses "foo.!~ do end" parses "macro foo(x)\n 1 + 2; end" parses "macro foo(x)\n 1 + 2; end" parses "*a = 1" parses "*a = 1" says syntax error on "/foo)/" says syntax error on "/foo)/" parses "a/b" parses "a/b" parses "1\\\n + 2" parses "1\\\n + 2" parses "foo { |a, b, | 1 }" parses "foo { |a, b, | 1 }" parses "a = 1; a &-=\n1" parses "a = 1; a &-=\n1" says syntax error on "foo { |(instance_sizeof)| }" says syntax error on "foo { |(instance_sizeof)| }" parses "enum Foo : UInt16; end" parses "enum Foo : UInt16; end" says syntax error on "def foo(foo asm); end" says syntax error on "def foo(foo asm); end" says syntax error on "->(x y) { }" says syntax error on "->(x y) { }" parses "def foo(x @@end); end" parses "def foo(x @@end); end" says syntax error on "class Foo(*T, *U); end" says syntax error on "class Foo(*T, *U); end" says syntax error on "macro Foo;end" says syntax error on "macro Foo;end" parses "def self.^; end;" parses "def self.^; end;" parses "{1 => 2 / 3}" parses "{1 => 2 / 3}" says syntax error on "fun foo(Int32); end" says syntax error on "fun foo(Int32); end" parses "foo out x; x" parses "foo out x; x" parses "asm(\"nop\" ::: :)" parses "asm(\"nop\" ::: :)" parses "1 < 2" parses "1 < 2" parses "def %(); end;" parses "def %(); end;" parses "extend : Int32" parses "extend : Int32" parses "foo **bar" parses "foo **bar" says syntax error on "self, x = 1, 2" says syntax error on "self, x = 1, 2" parses "{% begin %}%w[ %s ]{% end %}" parses "{% begin %}%w[ %s ]{% end %}" parses "def self.**; end;" parses "def self.**; end;" parses "typeof(a = 1); a" parses "typeof(a = 1); a" parses "def **(); end" parses "def **(); end" parses "foo(&block)" parses "foo(&block)" says syntax error on "next < 1" says syntax error on "next < 1" says syntax error on "break .. 1" says syntax error on "break .. 1" parses "def <=; end;" parses "def <=; end;" says syntax error on "def foo(foo in); end" says syntax error on "def foo(foo in); end" parses "def foo(@abstract); end" parses "def foo(@abstract); end" parses "a; if / /\n/ /\nelsif / /\n/ /\nend" parses "a; if / /\n/ /\nelsif / /\n/ /\nend" parses "x = 1 rescue 2" parses "x = 1 rescue 2" says syntax error on "def foo(require); end" says syntax error on "def foo(require); end" parses "::A::B" parses "::A::B" says syntax error on "[1 1]" says syntax error on "[1 1]" parses "def ==(*args, **opts); end" parses "def ==(*args, **opts); end" parses "def foo(@extend); end" parses "def foo(@extend); end" parses "def : Int32" parses "def : Int32" parses "foo.% 1, 2" parses "foo.% 1, 2" parses "foo.* do end" parses "foo.* do end" parses "2 * 3 + 4 * 5" parses "2 * 3 + 4 * 5" parses "%r(foo(bar))" parses "%r(foo(bar))" parses "->Foo.-(Int32)" parses "->Foo.-(Int32)" says syntax error on "1 .. break" says syntax error on "1 .. break" says syntax error on "return[0]" says syntax error on "return[0]" parses "next *1" parses "next *1" says syntax error on "foo { |def| }" says syntax error on "foo { |def| }" says syntax error on "def foo(struct); end" says syntax error on "def foo(struct); end" parses "def foo(@with); end" parses "def foo(@with); end" parses "def ===(); end;" parses "def ===(); end;" parses "->::foo" parses "->::foo" parses "case {1}\nin {nil}; 2; end" parses "case {1}\nin {nil}; 2; end" parses "Foo(*T)" parses "Foo(*T)" parses "foo { |(a, (b, (c, d)))| }" parses "foo { |(a, (b, (c, d)))| }" parses "def foo(@var = 1); 1; end" parses "def foo(@var = 1); 1; end" parses "property class : Int32" parses "property class : Int32" parses "->\n:\nInt32\n{\n}" parses "->\n:\nInt32\n{\n}" parses "def self.*(); end;" parses "def self.*(); end;" says syntax error on "macro as?; end" says syntax error on "macro as?; end" parses "case 1\nwhen .is_a?(T)\n2\nend" parses "case 1\nwhen .is_a?(T)\n2\nend" parses "macro >=;end" parses "macro >=;end" parses "<<-HERE\nHERE" parses "<<-HERE\nHERE" parses "lib LibC\nfun getchar(Int, Float)\nend" parses "lib LibC\nfun getchar(Int, Float)\nend" parses "case {1, 2}\nwhen {3, 4}, {5, 6}\n7\nend" parses "case {1, 2}\nwhen {3, 4}, {5, 6}\n7\nend" parses "def foo(fun foo); end" parses "def foo(fun foo); end" parses "a = 1; yield a rescue a" parses "a = 1; yield a rescue a" parses "def foo\n1\nend\nif 1\nend" parses "def foo\n1\nend\nif 1\nend" parses "include Foo\nif true; end" parses "include Foo\nif true; end" parses "foo(regex: //)" parses "foo(regex: //)" parses "def foo(x @instance_sizeof); end" parses "def foo(x @instance_sizeof); end" parses "def foo(var : self.class); end" parses "def foo(var : self.class); end" parses "n + 2" parses "n + 2" parses "foo.>(1, 2) { 3 }" parses "foo.>(1, 2) { 3 }" says syntax error on "foo { |(in)| }" says syntax error on "foo { |(in)| }" says syntax error on "@:Foo" says syntax error on "@:Foo" parses "def foo(a, @[Foo] &block); end" parses "def foo(a, @[Foo] &block); end" parses "Foo()" parses "Foo()" parses "<<-HERE\n One\n\n Zero\n HERE" parses "<<-HERE\n One\n\n Zero\n HERE" parses "macro foo(a, @[Foo] var);end" parses "macro foo(a, @[Foo] var);end" says syntax error on "foo { |self| }" says syntax error on "foo { |self| }" parses "()" parses "()" says syntax error on "{1, 2 3}" says syntax error on "{1, 2 3}" parses "property if : Int32" parses "property if : Int32" says syntax error on "macro foo x\n 1 + 2; end" says syntax error on "macro foo x\n 1 + 2; end" parses "{% begin %}%x| %s |{% end %}" parses "{% begin %}%x| %s |{% end %}" says syntax error on "def foo; require \"bar\"; end" says syntax error on "def foo; require \"bar\"; end" parses "def foo(&block : Int ->\n); end" parses "def foo(&block : Int ->\n); end" parses "foo.bar = (1).abs" parses "foo.bar = (1).abs" says syntax error on "next &+ 1" says syntax error on "next &+ 1" parses "def foo; a = 1; x { a }; end" parses "def foo; a = 1; x { a }; end" parses "{% if x %}body{% end %}" parses "{% if x %}body{% end %}" parses "/\\ /" parses "/\\ /" says syntax error on "def foo(x : U) forall U, U; end" says syntax error on "def foo(x : U) forall U, U; end" parses "def foo(@@typeof); end" parses "def foo(@@typeof); end" says syntax error on "return ... 1" says syntax error on "return ... 1" parses "true : Int32" parses "true : Int32" parses "foo(n / 2)" parses "foo(n / 2)" says syntax error on "while break; end" says syntax error on "while break; end" parses "def foo(x @@if); end" parses "def foo(x @@if); end" parses "property instance_sizeof : Int32" parses "property instance_sizeof : Int32" says syntax error on "def foo(self); end" says syntax error on "def foo(self); end" parses ":~" parses ":~" says syntax error on "return &* 1" says syntax error on "return &* 1" parses "def foo(x @@false); end" parses "def foo(x @@false); end" parses "case 1\nin Int32.class; 2; end" parses "case 1\nin Int32.class; 2; end" parses "def self.<; end;" parses "def self.<; end;" parses "->::Foo.foo" parses "->::Foo.foo" parses "def foo(@out); end" parses "def foo(@out); end" says syntax error on "a = 1, 2, 3" says syntax error on "a = 1, 2, 3" says syntax error on "def self.as; end" says syntax error on "def self.as; end" parses "::T/1" parses "::T/1" says syntax error on "foo { |(pointerof)| }" says syntax error on "foo { |(pointerof)| }" parses "def &*(); end" parses "def &*(); end" parses "x[{1}]" parses "x[{1}]" says syntax error on "case when .foo? then 1; end" says syntax error on "case when .foo? then 1; end" parses "abstract : Int32" parses "abstract : Int32" parses "foo.^(1, 2) { 3 }" parses "foo.^(1, 2) { 3 }" parses "1.is_a?(\n Int32\n)" parses "1.is_a?(\n Int32\n)" parses "def foo(x @@while); end" parses "def foo(x @@while); end" says syntax error on "macro foo.bar;end" says syntax error on "macro foo.bar;end" says syntax error on "foo { |(class)| }" says syntax error on "foo { |(class)| }" parses "property offsetof : Int32" parses "property offsetof : Int32" parses "def -(); end;" parses "def -(); end;" parses "/ /" parses "/ /" parses "def foo(@@var); 1; end" parses "def foo(@@var); 1; end" parses "foo(*bar)" parses "foo(*bar)" says syntax error on "foo { |(until)| }" says syntax error on "foo { |(until)| }" says syntax error on "break - 1" says syntax error on "break - 1" parses "a = 1; a /= 1" parses "a = 1; a /= 1" parses "def ===(other, file = 1); end" parses "def ===(other, file = 1); end" says syntax error on "foo **bar, 1" says syntax error on "foo **bar, 1" parses "{1, 2, 3}" parses "{1, 2, 3}" parses "foo(a: 1\n)" parses "foo(a: 1\n)" says syntax error on "def foo(**a foo); end" says syntax error on "def foo(**a foo); end" parses "-1" parses "-1" parses "foo.bar.baz" parses "foo.bar.baz" parses "n // 2" parses "n // 2" parses "foo.!=(1, 2)" parses "foo.!=(1, 2)" parses "def foo(@@class); end" parses "def foo(@@class); end" parses "a = 1; a *= 1" parses "a = 1; a *= 1" parses "foo(a: 1, b: 2)" parses "foo(a: 1, b: 2)" parses "foo(z: 0, a: n // 2)" parses "foo(z: 0, a: n // 2)" parses "def foo(until foo); end" parses "def foo(until foo); end" parses "foo(z: 0, a: n !~ 2)" parses "foo(z: 0, a: n !~ 2)" says syntax error on "def foo(x x); 1; end" says syntax error on "def foo(x x); 1; end" parses "qux \"foo\#{bar do end}baz\"" parses "qux \"foo\#{bar do end}baz\"" parses "call @foo.bar" parses "call @foo.bar" parses "def downto(n)\n1\nend" parses "def downto(n)\n1\nend" parses "def foo(@case); end" parses "def foo(@case); end" says syntax error on "def self.is_a?; end" says syntax error on "def self.is_a?; end" parses "foo { |a| 1 }" parses "foo { |a| 1 }" parses "x = 1; foo x do\nend" parses "x = 1; foo x do\nend" says syntax error on "<<-HERE\n One\n \#{1}\n wrong\n HERE" says syntax error on "<<-HERE\n One\n \#{1}\n wrong\n HERE" says syntax error on "foo { |extend| }" says syntax error on "foo { |extend| }" parses "x.y=(1).to_s" parses "x.y=(1).to_s" parses "a = 1; a &= 1" parses "a = 1; a &= 1" parses "a\nwhile / /; / /; end" parses "a\nwhile / /; / /; end" says syntax error on "def foo(foo case); end" says syntax error on "def foo(foo case); end" parses "macro foo(x = __LINE__);end" parses "macro foo(x = __LINE__);end" says syntax error on "yield next" says syntax error on "yield next" says syntax error on "A = (B = 1)" says syntax error on "A = (B = 1)" parses ":*" parses ":*" parses "def foo(@@select); end" parses "def foo(@@select); end" global regex match data says syntax error on "$99999999999999999999999?" says syntax error on "$99999999999999999999999?" parses "$1?" parses "$1?" parses "$0" parses "$0" parses "$~ = 1" parses "$~ = 1" says syntax error on "$0 = 1" says syntax error on "$0 = 1" parses "$~" parses "$~" parses "$? = 1" parses "$? = 1" parses "foo $1" parses "foo $1" parses "$?" parses "$?" parses "foo $?" parses "foo $?" says syntax error on "$0, a = {1, 2}" says syntax error on "$0, a = {1, 2}" says syntax error on "$0, $1 = [1, 2]" says syntax error on "$0, $1 = [1, 2]" says syntax error on "$2147483648" says syntax error on "$2147483648" parses "$~.foo" parses "$~.foo" parses "$1" parses "$1" parses "$?.foo" parses "$?.foo" says syntax error on "a += 1" says syntax error on "a += 1" parses "1.[](2)" parses "1.[](2)" parses "def *(); end" parses "def *(); end" parses "foo.+" parses "foo.+" parses "&- 1" parses "&- 1" parses "def foo(x @sizeof); end" parses "def foo(x @sizeof); end" parses "foo(\n begin\n result : Int32 = 1\n result\n end\n )" parses "foo(\n begin\n result : Int32 = 1\n result\n end\n )" parses "a = 1\ncase 1\nwhen a then 1\nend" parses "a = 1\ncase 1\nwhen a then 1\nend" parses "case 1; when 1 then 2; else; 3; end" parses "case 1; when 1 then 2; else; 3; end" parses "def []?; end" parses "def []?; end" says syntax error on "*a, b, c, d, e = 1, 2" says syntax error on "*a, b, c, d, e = 1, 2" says syntax error on "next * 1" says syntax error on "next * 1" parses "\"hello \"\\\r\n\"world\"" parses "\"hello \"\\\r\n\"world\"" parses "lib LibC; fun getchar(a : Int, b : Float) : Int; end" parses "lib LibC; fun getchar(a : Int, b : Float) : Int; end" parses "def foo(@[Foo] **args); end" parses "def foo(@[Foo] **args); end" parses "n << 2" parses "n << 2" parses "def []=(other, file = 1); end" parses "def []=(other, file = 1); end" parses "Set() {1, 2, 3}" parses "Set() {1, 2, 3}" parses "fun : Int32" parses "fun : Int32" parses "break 1, *2" parses "break 1, *2" parses "{{ foo.nil? }}" parses "{{ foo.nil? }}" parses "1 =~ 2" parses "1 =~ 2" parses ":\"\\\"foo\\\"\"" parses ":\"\\\"foo\\\"\"" parses "begin; 1; rescue; 2; end" parses "begin; 1; rescue; 2; end" parses "return 1, *2" parses "return 1, *2" says syntax error on "break >> 1" says syntax error on "break >> 1" parses "pointerof : Int32" parses "pointerof : Int32" parses "def self.&; end;" parses "def self.&; end;" parses "macro &;end" parses "macro &;end" says syntax error on "1 while 3" says syntax error on "1 while 3" parses "def foo(x @@module); end" parses "def foo(x @@module); end" parses "foo.|(1, 2)" parses "foo.|(1, 2)" parses "a = 1; a += 1" parses "a = 1; a += 1" parses "x, y = <<-FOO, <<-BAR\nhello\nFOO\nworld\nBAR" parses "x, y = <<-FOO, <<-BAR\nhello\nFOO\nworld\nBAR" parses "property until : Int32" parses "property until : Int32" parses "foo.is_a? Const" parses "foo.is_a? Const" parses "def foo(var : self?); end" parses "def foo(var : self?); end" parses "{% begin %}%q| %s |{% end %}" parses "{% begin %}%q| %s |{% end %}" parses "foo[*baz] = 1" parses "foo[*baz] = 1" parses "def foo(enum foo); end" parses "def foo(enum foo); end" parses "property unless : Int32" parses "property unless : Int32" parses "macro *;end" parses "macro *;end" parses "foo(/ /)" parses "foo(/ /)" parses "Foo::Bar?" parses "Foo::Bar?" says syntax error on "{\n}" says syntax error on "{\n}" parses "def foo(x @yield); end" parses "def foo(x @yield); end" parses "def |; end;" parses "def |; end;" parses "a.foo, a.bar = 1, 2" parses "a.foo, a.bar = 1, 2" says syntax error on "+return" says syntax error on "+return" parses "foo.[]= 1, 2" parses "foo.[]= 1, 2" parses "def foo(include foo); end" parses "def foo(include foo); end" parses "foo.[0]" parses "foo.[0]" parses "def foo(@return); end" parses "def foo(@return); end" parses "require \"foo\"" parses "require \"foo\"" parses "def self.+(); end;" parses "def self.+(); end;" parses "property abstract : Int32" parses "property abstract : Int32" parses "def foo(lib foo); end" parses "def foo(lib foo); end" parses "def foo(x, *args, y = 2); 1; end" parses "def foo(x, *args, y = 2); 1; end" parses "foo.| do end" parses "foo.| do end" parses "macro !=;end" parses "macro !=;end" parses "/fo\\so/" parses "/fo\\so/" parses "def foo(@unless); end" parses "def foo(@unless); end" parses "lib LibC; fun foo : Int**; end" parses "lib LibC; fun foo : Int**; end" parses "macro foo;bar{% unless x %}body{% end %}baz;end" parses "macro foo;bar{% unless x %}body{% end %}baz;end" parses "{% if true %}\n{% end %}\n{% if true %}\n{% end %}" parses "{% if true %}\n{% end %}\n{% if true %}\n{% end %}" parses "1.0" parses "1.0" parses "lib LibC\nfun getchar(a : Int)\nend" parses "lib LibC\nfun getchar(a : Int)\nend" parses "foo = 1; ->foo.|(Int32)" parses "foo = 1; ->foo.|(Int32)" says syntax error on "asm(\"\" ::: \"\"(var))" says syntax error on "asm(\"\" ::: \"\"(var))" says syntax error on "def foo(x : U) forall U,; end" says syntax error on "def foo(x : U) forall U,; end" parses "foo.bar [1]" parses "foo.bar [1]" parses "/=/" parses "/=/" parses "def foo(@@var); end" parses "def foo(@@var); end" parses "puts {{*1}}" parses "puts {{*1}}" parses "foo = 1; ->foo.&(Int32)" parses "foo = 1; ->foo.&(Int32)" parses "Int" parses "Int" parses "enum Foo; def foo; 1; end; end" parses "enum Foo; def foo; 1; end; end" says syntax error on "case 1\nin _;" says syntax error on "case 1\nin _;" parses "def foo(x @@include); end" parses "def foo(x @@include); end" parses "def !=(*args, **opts); end" parses "def !=(*args, **opts); end" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) : \"eax\", \"ebx\"\n: \"volatile\", \"alignstack\"\n,\n\"intel\"\n)" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) : \"eax\", \"ebx\"\n: \"volatile\", \"alignstack\"\n,\n\"intel\"\n)" says syntax error on "break & 1" says syntax error on "break & 1" parses "->::foo?" parses "->::foo?" parses "macro &*;end" parses "macro &*;end" parses "lib LibC\nfun SomeFun\nend" parses "lib LibC\nfun SomeFun\nend" parses "class Foo; end" parses "class Foo; end" parses "&+ 1" parses "&+ 1" parses "def foo(x @true); end" parses "def foo(x @true); end" parses "->Foo.[]=(Int32)" parses "->Foo.[]=(Int32)" parses "foo.Bar" parses "foo.Bar" says syntax error on "break when true" says syntax error on "break when true" parses "foo.responds_to? :foo" parses "foo.responds_to? :foo" says syntax error on "macro foo(x : Int32); end" says syntax error on "macro foo(x : Int32); end" parses "a = 1\nfoo -a" parses "a = 1\nfoo -a" says syntax error on "def foo(instance_sizeof); end" says syntax error on "def foo(instance_sizeof); end" parses "nil" parses "nil" parses "foo 1, a: 1, b: 2\n1" parses "foo 1, a: 1, b: 2\n1" says syntax error on "return[]" says syntax error on "return[]" parses "Foo({X: X, Y: Y})" parses "Foo({X: X, Y: Y})" parses "property alias : Int32" parses "property alias : Int32" says syntax error on "case 1; when next; end; end" says syntax error on "case 1; when next; end; end" parses "foo { a = 1 }; a" parses "foo { a = 1 }; a" parses "a.b ^=\n1" parses "a.b ^=\n1" parses "T/1" parses "T/1" parses "macro foo\neenum\nend" parses "macro foo\neenum\nend" parses "def +(); end" parses "def +(); end" parses "foo &.@bar" parses "foo &.@bar" says syntax error on "return ^ 1" says syntax error on "return ^ 1" parses "foo(&.as(T))" parses "foo(&.as(T))" parses "foo.>= 1, 2" parses "foo.>= 1, 2" parses "->Foo.//(Int32)" parses "->Foo.//(Int32)" parses "foo.==(1, 2) { 3 }" parses "foo.==(1, 2) { 3 }" parses "def ==(other, file = 1); end" parses "def ==(other, file = 1); end" says syntax error on "foo { |(fun)| }" says syntax error on "foo { |(fun)| }" parses ":\"foo\"" parses ":\"foo\"" parses "{% unless 1; 2; else 3; end %}" parses "{% unless 1; 2; else 3; end %}" parses "macro []?;end" parses "macro []?;end" parses "def foo(x @if); end" parses "def foo(x @if); end" parses "foo(\n &.block\n)" parses "foo(\n &.block\n)" says syntax error on "def foo(foo break); end" says syntax error on "def foo(foo break); end" parses "a = 1; a %= 1" parses "a = 1; a %= 1" parses "foo(z: 0, a: n | 2)" parses "foo(z: 0, a: n | 2)" parses "[\n1\n]" parses "[\n1\n]" parses "%r(/)" parses "%r(/)" parses "foo %q()" parses "foo %q()" parses "def foo(**args)\nargs\nend" parses "def foo(**args)\nargs\nend" parses "a; if / /; / /; elsif / /; / /; end" parses "a; if / /; / /; elsif / /; / /; end" parses "next if true" parses "next if true" parses "{% begin %}%i{ %s }{% end %}" parses "{% begin %}%i{ %s }{% end %}" parses "foo(z: 0, a: n &- 2)" parses "foo(z: 0, a: n &- 2)" says syntax error on "1 .. next" says syntax error on "1 .. next" parses "a ? 1 : b ? 2 : c ? 3 : 0" parses "a ? 1 : b ? 2 : c ? 3 : 0" parses "def foo; x { |_| 1 }; end" parses "def foo; x { |_| 1 }; end" parses "var.@foo.@bar" parses "var.@foo.@bar" parses "<<-HERE\n One\n \n Zero\n HERE" parses "<<-HERE\n One\n \n Zero\n HERE" says syntax error on "macro foo(**x, **y)" says syntax error on "macro foo(**x, **y)" parses "x = 1; ->{ x }" parses "x = 1; ->{ x }" parses "1 >> 2" parses "1 >> 2" parses "def foo(x, **args)\n1\nend" parses "def foo(x, **args)\n1\nend" parses "lib LibC; type A = B; end" parses "lib LibC; type A = B; end" parses "def foo(x @@offsetof); end" parses "def foo(x @@offsetof); end" parses "macro foo;%var if true;end" parses "macro foo;%var if true;end" says syntax error on "break === 1" says syntax error on "break === 1" says syntax error on "foo(**bar, out x)" says syntax error on "foo(**bar, out x)" says syntax error on "+next" says syntax error on "+next" parses "foo(a: n // 2)" parses "foo(a: n // 2)" parses "foo &.%(1)" parses "foo &.%(1)" says syntax error on "Hash{\"foo\": 1, \"bar\": 2}" says syntax error on "Hash{\"foo\": 1, \"bar\": 2}" parses "1 &+ 2" parses "1 &+ 2" parses "{[] of Foo, ::Bar::Baz.new}" parses "{[] of Foo, ::Bar::Baz.new}" parses "<<-'EOF'.x\n foo\nEOF" parses "<<-'EOF'.x\n foo\nEOF" says syntax error on "def foo(unless); end" says syntax error on "def foo(unless); end" parses "x = 1; foo x { }" parses "x = 1; foo x { }" parses "begin\n/ /\nend" parses "begin\n/ /\nend" parses "def <(); end" parses "def <(); end" parses "if foo.responds_to? :foo\nx = 1\nend" parses "if foo.responds_to? :foo\nx = 1\nend" parses "def foo(x @@extend); end" parses "def foo(x @@extend); end" parses "foo[*baz]" parses "foo[*baz]" parses "foo.bar= *baz" parses "foo.bar= *baz" parses "foo &.as(T).bar" parses "foo &.as(T).bar" parses "->Foo.&**(Int32)" parses "->Foo.&**(Int32)" parses "{% begin %}%q( %s ){% end %}" parses "{% begin %}%q( %s ){% end %}" parses "Foo(T | U)" parses "Foo(T | U)" parses "macro foo;var unless true;end" parses "macro foo;var unless true;end" parses "def foo\n1\nend" parses "def foo\n1\nend" parses "begin : Int32" parses "begin : Int32" parses "1 > 2" parses "1 > 2" says syntax error on "def foo(false); end" says syntax error on "def foo(false); end" parses "(foo bar do\nend)" parses "(foo bar do\nend)" parses "lib LibC\nfun getch = \"get.char\" : Int32\nend" parses "lib LibC\nfun getch = \"get.char\" : Int32\nend" parses "@a : Foo | Int32" parses "@a : Foo | Int32" parses "def foo(var : self*); end" parses "def foo(var : self*); end" parses "Foo(\nT\n)" parses "Foo(\nT\n)" parses "def foo(x @@break); end" parses "def foo(x @@break); end" parses "def foo; x { |a| a }; end" parses "def foo; x { |a| a }; end" parses "if : Int32" parses "if : Int32" parses "foo(n >= 2)" parses "foo(n >= 2)" parses "@@foo" parses "@@foo" parses "def /(); end;" parses "def /(); end;" says syntax error on "1 as? Bar" says syntax error on "1 as? Bar" parses "1 % 2" parses "1 % 2" parses "<<-HERE\n \#{1} \#{2}\n HERE" parses "<<-HERE\n \#{1} \#{2}\n HERE" says syntax error on "until next; end" says syntax error on "until next; end" parses "return 1 if true" parses "return 1 if true" parses "Foo(T, 1)" parses "Foo(T, 1)" says syntax error on "break * 1" says syntax error on "break * 1" parses "+1.0_f32" parses "+1.0_f32" parses "{[] of Foo, ::foo}" parses "{[] of Foo, ::foo}" parses "Foo(x: U, y: V)" parses "Foo(x: U, y: V)" parses "macro &+;end" parses "macro &+;end" parses "Foo(\nx:\nT,\ny:\nU,\n)" parses "Foo(\nx:\nT,\ny:\nU,\n)" parses "{%\nif 1; 2; end\n%}" parses "{%\nif 1; 2; end\n%}" parses "Foo({\"foo\": X, \"bar\": Y})" parses "Foo({\"foo\": X, \"bar\": Y})" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2))" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2))" parses "1 \\\n + 2" parses "1 \\\n + 2" parses "foo(a: n & 2)" parses "foo(a: n & 2)" says syntax error on "foo(\"\": 1)" says syntax error on "foo(\"\": 1)" says syntax error on "\"foo\" \"bar\"" says syntax error on "\"foo\" \"bar\"" parses "begin; / /; end" parses "begin; / /; end" says syntax error on "case 1; when break; end; end" says syntax error on "case 1; when break; end; end" says syntax error on ":bar foo" says syntax error on ":bar foo" parses "asm(\"nop\" : \"a\"(0), \"b\"(1) : \"c\"(2), \"d\"(3))" parses "asm(\"nop\" : \"a\"(0), \"b\"(1) : \"c\"(2), \"d\"(3))" parses "macro ==;end" parses "macro ==;end" parses "begin; 1; end;" parses "begin; 1; end;" parses "def foo(@instance_sizeof); end" parses "def foo(@instance_sizeof); end" parses "foo(0, n % 2)" parses "foo(0, n % 2)" says syntax error on "Foo({x: X, x: Y})" says syntax error on "Foo({x: X, x: Y})" parses "foo [1]" parses "foo [1]" parses "foo &.block[0] = 1" parses "foo &.block[0] = 1" parses "instance_alignof(\n Int32\n)" parses "instance_alignof(\n Int32\n)" parses "asm(\"nop\" \n)" parses "asm(\"nop\" \n)" parses "a = 1; a &*= 1" parses "a = 1; a &*= 1" says syntax error on "{1 2}" says syntax error on "{1 2}" parses "def foo(x : U) : Int32 forall T, U; end" parses "def foo(x : U) : Int32 forall T, U; end" parses "->Foo.%(Int32)" parses "->Foo.%(Int32)" parses "macro ===;end" parses "macro ===;end" parses "property else : Int32" parses "property else : Int32" says syntax error on " (1, 2, 3 end" says syntax error on " (1, 2, 3 end" parses "foo[] /2" parses "foo[] /2" says syntax error on "def foo:String\nend" says syntax error on "def foo:String\nend" parses "property macro : Int32" parses "property macro : Int32" parses "a ? 1\n : b" parses "a ? 1\n : b" parses "lib LibC; type A = B**; end" parses "lib LibC; type A = B**; end" says syntax error on "foo { |(require)| }" says syntax error on "foo { |(require)| }" parses "{% begin %}%Q| %s |{% end %}" parses "{% begin %}%Q| %s |{% end %}" parses "{foo:'a', bar:'b'}" parses "{foo:'a', bar:'b'}" parses "{% begin %}%q[ %s ]{% end %}" parses "{% begin %}%q[ %s ]{% end %}" parses "foo a: b(1) do\nend" parses "foo a: b(1) do\nend" parses "1.as? Bar" parses "1.as? Bar" parses "foo.>" parses "foo.>" says syntax error on "def foo(sizeof); end" says syntax error on "def foo(sizeof); end" says syntax error on "a, b.<=" says syntax error on "a, b.<=" parses "1 -\n2" parses "1 -\n2" parses "->() : Int32 { }" parses "->() : Int32 { }" parses "def foo; with a yield 1; end" parses "def foo; with a yield 1; end" parses "foo 1;" parses "foo 1;" parses "def foo(pointerof foo); end" parses "def foo(pointerof foo); end" parses "def foo(@break); end" parses "def foo(@break); end" parses "protected : Int32" parses "protected : Int32" parses "[1,\n 2,]" parses "[1,\n 2,]" parses "def foo; yield(1); end" parses "def foo; yield(1); end" says syntax error on "fun Foo : Int64\nend" says syntax error on "fun Foo : Int64\nend" parses "def foo(extend foo); end" parses "def foo(extend foo); end" parses "nil?" parses "nil?" parses "macro &-;end" parses "macro &-;end" parses "`foo\\``" parses "`foo\\``" parses "1.=~(2)" parses "1.=~(2)" says syntax error on "'''" says syntax error on "'''" parses "def foo(a, &block : -> Double); end" parses "def foo(a, &block : -> Double); end" parses "foo %Q" parses "foo %Q" parses "<<-HERE1; <<-HERE2\nHERE1\nhere2\nHERE2" parses "<<-HERE1; <<-HERE2\nHERE1\nhere2\nHERE2" parses "macro foo;unless %var;true;end;end" parses "macro foo;unless %var;true;end;end" parses "def foo(@end); end" parses "def foo(@end); end" parses "macro foo; bar class: 1; end" parses "macro foo; bar class: 1; end" parses "def foo(require foo); end" parses "def foo(require foo); end" parses "yield foo do\nend" parses "yield foo do\nend" parses "def foo(x @@instance_sizeof); end" parses "def foo(x @@instance_sizeof); end" parses "def self.*; end;" parses "def self.*; end;" parses "foo = 1; foo a: 1" parses "foo = 1; foo a: 1" parses "def foo(x @@begin); end" parses "def foo(x @@begin); end" parses "lib LibC; union Foo; end end" parses "lib LibC; union Foo; end end" says syntax error on "a {}, b = 1" says syntax error on "a {}, b = 1" parses "def <=(*args, **opts, &); end" parses "def <=(*args, **opts, &); end" parses "def self.[]; end" parses "def self.[]; end" parses "lib LibC; struct Foo; end end" parses "lib LibC; struct Foo; end end" says syntax error on "a, B = 1, 2" says syntax error on "a, B = 1, 2" parses "def foo(a, &block : Int -> ); end" parses "def foo(a, &block : Int -> ); end" parses "property return : Int32" parses "property return : Int32" parses "a = 1; a ^= 1" parses "a = 1; a ^= 1" parses "-> do end" parses "-> do end" parses "def foo(x @in); end" parses "def foo(x @in); end" parses "def foo(@[Foo] outer inner); end" parses "def foo(@[Foo] outer inner); end" parses "macro ~;end" parses "macro ~;end" parses "next;" parses "next;" parses "def foo(x @@macro); end" parses "def foo(x @@macro); end" parses "a : Foo()*" parses "a : Foo()*" says syntax error on "foo { |nil| }" says syntax error on "foo { |nil| }" says syntax error on "break &- 1" says syntax error on "break &- 1" says syntax error on "macro def foo : String; 1; end" says syntax error on "macro def foo : String; 1; end" says syntax error on "def as?; end" says syntax error on "def as?; end" parses "call ->foo" parses "call ->foo" parses "foo.>=" parses "foo.>=" parses "foo.bar do end" parses "foo.bar do end" says syntax error on "next &- 1" says syntax error on "next &- 1" parses "{[] of Foo, self.foo}" parses "{[] of Foo, self.foo}" parses "enum Foo; A = 1; B; end" parses "enum Foo; A = 1; B; end" says syntax error on "foo { |in| }" says syntax error on "foo { |in| }" parses "1 / 2" parses "1 / 2" parses "a = /=/" parses "a = /=/" parses "f.x &-= 2" parses "f.x &-= 2" parses "foo(n =~ 2)" parses "foo(n =~ 2)" parses "case 1\nin .bar?; 2; end" parses "case 1\nin .bar?; 2; end" parses "Foo({x: X, typeof: Y})" parses "Foo({x: X, typeof: Y})" parses "instance_sizeof : Int32" parses "instance_sizeof : Int32" says syntax error on "def foo(x: Int32); end" says syntax error on "def foo(x: Int32); end" says syntax error on "def foo(foo require); end" says syntax error on "def foo(foo require); end" parses "def foo(x) : Int32\n1\nend" parses "def foo(x) : Int32\n1\nend" parses "def >(); end;" parses "def >(); end;" parses "def foo(x @@protected); end" parses "def foo(x @@protected); end" parses "-> { }" parses "-> { }" parses "def foo(x @@in); end" parses "def foo(x @@in); end" says syntax error on "if next; end" says syntax error on "if next; end" parses "def >=(); end;" parses "def >=(); end;" parses "1 === 2" parses "1 === 2" parses "foo(n - 2)" parses "foo(n - 2)" parses "property end : Int32" parses "property end : Int32" says syntax error on "Foo{one: :two, three: :four}" says syntax error on "Foo{one: :two, three: :four}" parses "foo 1\n" parses "foo 1\n" parses "foo x, y do\nend" parses "foo x, y do\nend" parses "\u3042.\u3044, \u3046.\u3048.\u304A = 1, 2" parses "\u3042.\u3044, \u3046.\u3048.\u304A = 1, 2" says syntax error on "next[0]= 1" says syntax error on "next[0]= 1" parses "def foo(with foo); end" parses "def foo(with foo); end" parses "macro foo(\na = 0\n)\nend" parses "macro foo(\na = 0\n)\nend" parses "def foo(@@true); end" parses "def foo(@@true); end" parses "foo &.each {\n}" parses "foo &.each {\n}" parses "def foo(x : *T -> R); end" parses "def foo(x : *T -> R); end" says syntax error on "foo { |asm| }" says syntax error on "foo { |asm| }" parses "puts %w(one two)" parses "puts %w(one two)" parses "foo.-(1, 2)" parses "foo.-(1, 2)" says syntax error on "foo(\"bar\" \"baz\")" says syntax error on "foo(\"bar\" \"baz\")" parses "def foo(@true); end" parses "def foo(@true); end" parses "def foo(x @self); end" parses "def foo(x @self); end" parses "case {1, 2}\nwhen {3, 4}\n5\nend" parses "case {1, 2}\nwhen {3, 4}\n5\nend" says syntax error on "foo { |(alias)| }" says syntax error on "foo { |(alias)| }" says syntax error on "foo **bar, *x" says syntax error on "foo **bar, *x" parses "->Foo.^(Int32)" parses "->Foo.^(Int32)" parses "foo(0, n + 2)" parses "foo(0, n + 2)" parses "def foo(@@self); end" parses "def foo(@@self); end" says syntax error on "foo[1] = break" says syntax error on "foo[1] = break" says syntax error on "@@foo :: Foo" says syntax error on "@@foo :: Foo" says syntax error on "*1, a = 2" says syntax error on "*1, a = 2" says syntax error on "foo { |(a b)| }" says syntax error on "foo { |(a b)| }" parses "def <=(*args, **opts); end" parses "def <=(*args, **opts); end" parses "a.b &-=\n1" parses "a.b &-=\n1" parses "def foo(@@return); end" parses "def foo(@@return); end" parses "(a;\nb)" parses "(a;\nb)" parses "property begin : Int32" parses "property begin : Int32" parses "foo(n === 2)" parses "foo(n === 2)" parses "a = 1; a[2] ||= 3" parses "a = 1; a[2] ||= 3" parses "-@@foo" parses "-@@foo" parses "def self.>=(); end;" parses "def self.>=(); end;" parses "x = 1; foo x {\n}" parses "x = 1; foo x {\n}" says syntax error on "def foo(x = 1, y); end" says syntax error on "def foo(x = 1, y); end" parses "{1.. => 2};" parses "{1.. => 2};" says syntax error on "break.as(Int32)" says syntax error on "break.as(Int32)" parses "enum Foo; A = 1\ndef self.foo; 1; end\nend" parses "enum Foo; A = 1\ndef self.foo; 1; end\nend" says syntax error on "fun foo(x : Int32, x : Int64); end" says syntax error on "fun foo(x : Int32, x : Int64); end" parses "n >= 2" parses "n >= 2" parses "property next : Int32" parses "property next : Int32" parses "->foo(Void*)" parses "->foo(Void*)" says syntax error on "foo {1, 2}" says syntax error on "foo {1, 2}" says syntax error on "def foo\nmodule\nend" says syntax error on "def foo\nmodule\nend" parses "foo = 1; ->foo.[](Int32)" parses "foo = 1; ->foo.[](Int32)" parses "def foo ; 1 ; end" parses "def foo ; 1 ; end" says syntax error on "foo { |alias| }" says syntax error on "foo { |alias| }" parses "a, b = 1, 2" parses "a, b = 1, 2" parses "def <=(); end" parses "def <=(); end" parses "def !~(); end;" parses "def !~(); end;" parses "def self.=~; end;" parses "def self.=~; end;" parses "module : Int32" parses "module : Int32" parses "Foo(typeof(1), typeof(2))" parses "Foo(typeof(1), typeof(2))" parses "Foo(\nT,\nU,\n)" parses "Foo(\nT,\nU,\n)" says syntax error on "return false foo" says syntax error on "return false foo" parses "macro foo\n'\\\\'\nend" parses "macro foo\n'\\\\'\nend" parses "a = 1; a //=\n1" parses "a = 1; a //=\n1" parses "def foo(**args : Foo)\n1\nend" parses "def foo(**args : Foo)\n1\nend" parses "2.3_f32" parses "2.3_f32" says syntax error on "foo { |until| }" says syntax error on "foo { |until| }" parses "n >> 2" parses "n >> 2" parses "[] of ->;" parses "[] of ->;" parses "1.0_f32" parses "1.0_f32" parses "false" parses "false" parses "macro foo\n <<-FOO\n \#{ %var }\n FOO\nend" parses "macro foo\n <<-FOO\n \#{ %var }\n FOO\nend" parses "\"foo\"" parses "\"foo\"" parses "property do : Int32" parses "property do : Int32" parses "def ^(); end" parses "def ^(); end" says syntax error on "def foo(foo unless); end" says syntax error on "def foo(foo unless); end" parses "foo(&.is_a?(T))" parses "foo(&.is_a?(T))" parses "1 == 2" parses "1 == 2" parses "->Foo.>>(Int32)" parses "->Foo.>>(Int32)" parses "def foo(x @@nil); end" parses "def foo(x @@nil); end" says syntax error on "fun foo\nFoo = 1" says syntax error on "fun foo\nFoo = 1" parses "->Foo.>(Int32)" parses "->Foo.>(Int32)" parses "<<-EOF.x\n foo\nEOF" parses "<<-EOF.x\n foo\nEOF" parses "def foo(var : Int, Float -> Double); end" parses "def foo(var : Int, Float -> Double); end" parses "foo.* 1, 2" parses "foo.* 1, 2" parses "x[0] ? 1 : 0" parses "x[0] ? 1 : 0" parses "foo.as(Bar)" parses "foo.as(Bar)" parses "puts %w{one two}" parses "puts %w{one two}" parses "n | 2" parses "n | 2" says syntax error on "next &* 1" says syntax error on "next &* 1" says syntax error on "foo { |(nil)| }" says syntax error on "foo { |(nil)| }" says syntax error on "foo.||" says syntax error on "foo.||" parses "f.x **= 2" parses "f.x **= 2" parses "case 1\nwhen .as?(T)\n2\nend" parses "case 1\nwhen .as?(T)\n2\nend" parses "a = 1; a >>=\n1" parses "a = 1; a >>=\n1" says syntax error on "{% unless 1; 2; elsif 3; 4; end %}" says syntax error on "{% unless 1; 2; elsif 3; 4; end %}" parses "def <; end;" parses "def <; end;" parses ":foo" parses ":foo" parses "lib LibC\n$errno : Int32\n$errno2 : Int32\nend" parses "lib LibC\n$errno : Int32\n$errno2 : Int32\nend" parses "def foo(@until); end" parses "def foo(@until); end" parses "def foo(@include); end" parses "def foo(@include); end" says syntax error on "def Foo(Int32).bar;end" says syntax error on "def Foo(Int32).bar;end" parses "1 - 2" parses "1 - 2" parses "foo.<=" parses "foo.<=" parses "->foo=" parses "->foo=" parses "{/ / => / /, / / => / /}" parses "{/ / => / /, / / => / /}" parses "foo &.as?(T).bar" parses "foo &.as?(T).bar" parses "a = 1; a /=\n1" parses "a = 1; a /=\n1" parses "sizeof(X)" parses "sizeof(X)" parses "false : Int32" parses "false : Int32" parses "->(x : Int32) { }" parses "->(x : Int32) { }" parses "foo(n ** 2)" parses "foo(n ** 2)" parses "1_u128" parses "1_u128" parses "a = 1; a >>= 1" parses "a = 1; a >>= 1" parses "def foo; x { |a, *b| b }; end" parses "def foo; x { |a, *b| b }; end" parses "lib LibC\n$errno : B, C -> D\nend" parses "lib LibC\n$errno : B, C -> D\nend" parses "begin; 1; rescue ::Foo; 2; end" parses "begin; 1; rescue ::Foo; 2; end" parses "def -(); end" parses "def -(); end" parses "1 &** 2" parses "1 &** 2" says syntax error on "def foo(foo sizeof); end" says syntax error on "def foo(foo sizeof); end" parses "foo.===(1, 2)" parses "foo.===(1, 2)" parses "1 rescue 2 if 3" parses "1 rescue 2 if 3" says syntax error on "def foo(with); end" says syntax error on "def foo(with); end" parses "[\n1, 2]" parses "[\n1, 2]" parses "def self.==(); end;" parses "def self.==(); end;" parses "1 if 3" parses "1 if 3" parses "a.b >>=\n1" parses "a.b >>=\n1" parses "def ==(); end;" parses "def ==(); end;" parses "\"hello \#{1}\" \\\r\n \"\#{2} world\"" parses "\"hello \#{1}\" \\\r\n \"\#{2} world\"" parses "a : Foo*" parses "a : Foo*" parses "{% begin %}%Q( %s ){% end %}" parses "{% begin %}%Q( %s ){% end %}" parses "foo &->bar" parses "foo &->bar" parses "(1 .. )" parses "(1 .. )" parses "foo(a: n / 2)" parses "foo(a: n / 2)" parses "Foo(T)" parses "Foo(T)" parses "asm(\"nop\" : : )" parses "asm(\"nop\" : : )" parses "def =~(); end;" parses "def =~(); end;" parses "def foo(x @protected); end" parses "def foo(x @protected); end" parses "def foo(@private); end" parses "def foo(@private); end" parses ":[]?" parses ":[]?" parses "lib LibC; enum Foo; A = 1; B; end end" parses "lib LibC; enum Foo; A = 1; B; end end" parses "->Foo.<<(Int32)" parses "->Foo.<<(Int32)" parses "a.b -=\n1" parses "a.b -=\n1" parses "(/ /)" parses "(/ /)" parses "1.x; foo do\nend" parses "1.x; foo do\nend" says syntax error on "<<-HERE\n One\n wrong\n Zero\n HERE" says syntax error on "<<-HERE\n One\n wrong\n Zero\n HERE" parses "def foo(@[Foo] var); end" parses "def foo(@[Foo] var); end" parses "case :foo; when :bar; 2; end" parses "case :foo; when :bar; 2; end" parses "property typeof : Int32" parses "property typeof : Int32" parses "a = 1; a &-= 1" parses "a = 1; a &-= 1" says syntax error on "A = begin; 1; rescue; 1; else; B = 1; end" says syntax error on "A = begin; 1; rescue; 1; else; B = 1; end" says syntax error on "*a if true = 2" says syntax error on "*a if true = 2" parses "def foo(x @out); end" parses "def foo(x @out); end" says syntax error on "foo { |begin| }" says syntax error on "foo { |begin| }" parses "1 * 2" parses "1 * 2" parses "1.tap do; 1; rescue; 2; end" parses "1.tap do; 1; rescue; 2; end" parses "{1}" parses "{1}" parses "foo /a/" parses "foo /a/" says syntax error on "foo { |include| }" says syntax error on "foo { |include| }" parses "Foo(X, instance_alignof(Int32))" parses "Foo(X, instance_alignof(Int32))" parses "yield;" parses "yield;" parses "def self.!~; end;" parses "def self.!~; end;" parses "a, b, *c = 1" parses "a, b, *c = 1" parses "foo = 1; ->foo.<(Int32)" parses "foo = 1; ->foo.<(Int32)" parses "next : Int32" parses "next : Int32" parses "def %; end;" parses "def %; end;" says syntax error on "foo { |(yield)| }" says syntax error on "foo { |(yield)| }" parses "as(Bar)" parses "as(Bar)" parses "1+0" parses "1+0" parses "n &+ 2" parses "n &+ 2" parses "case 1; when 2 then /foo/; end" parses "case 1; when 2 then /foo/; end" parses "def foo(@@sizeof); end" parses "def foo(@@sizeof); end" says syntax error on "def foo(typeof); end" says syntax error on "def foo(typeof); end" parses "foo(n &- 2)" parses "foo(n &- 2)" says syntax error on "->(x : Int32, x : Int32) {}" says syntax error on "->(x : Int32, x : Int32) {}" says syntax error on "1 then" says syntax error on "1 then" parses "a.b //=\n1" parses "a.b //=\n1" parses ":<=>" parses ":<=>" says syntax error on "def foo(foo macro); end" says syntax error on "def foo(foo macro); end" says syntax error on "foo { |protected| }" says syntax error on "foo { |protected| }" says syntax error on "foo { |(out)| }" says syntax error on "foo { |(out)| }" parses "{% begin %}%x[ %s ]{% end %}" parses "{% begin %}%x[ %s ]{% end %}" says syntax error on "next >> 1" says syntax error on "next >> 1" parses "macro foo(@[Foo] outer inner);end" parses "macro foo(@[Foo] outer inner);end" parses "Set {1, 2, 3}" parses "Set {1, 2, 3}" says syntax error on "foo { |sizeof| }" says syntax error on "foo { |sizeof| }" parses "a = 1; a &+=\n1" parses "a = 1; a &+=\n1" says syntax error on "def foo(foo protected); end" says syntax error on "def foo(foo protected); end" parses "macro foo(a, @[Foo] &block);end" parses "macro foo(a, @[Foo] &block);end" parses "macro &**;end" parses "macro &**;end" parses "a : Foo()[12]" parses "a : Foo()[12]" parses "foo(1, **bar, &block)" parses "foo(1, **bar, &block)" says syntax error on "macro Foo.bar;end" says syntax error on "macro Foo.bar;end" parses "return {1 => 2}" parses "return {1 => 2}" sets correct location of protected macro in enum sets correct location of protected macro in enum says syntax error on "def foo(foo out); end" says syntax error on "def foo(foo out); end" parses "def foo(x : U) forall T, U; end" parses "def foo(x : U) forall T, U; end" parses "_, *_, _, _ = 1, 2, 3" parses "_, *_, _, _ = 1, 2, 3" parses "foo(1, **bar)" parses "foo(1, **bar)" says syntax error on "1 2" says syntax error on "1 2" parses "foo a: 1, b: 2" parses "foo a: 1, b: 2" parses "{..2}" parses "{..2}" parses "a = 1; a += 10 if a += 20" parses "a = 1; a += 10 if a += 20" parses "a : Foo[12]" parses "a : Foo[12]" says syntax error on "A = begin; 1; rescue; B = 1; end" says syntax error on "A = begin; 1; rescue; B = 1; end" parses "foo unless 3" parses "foo unless 3" parses "def foo(x @@out); end" parses "def foo(x @@out); end" parses "'a'" parses "'a'" says syntax error on "break > 1" says syntax error on "break > 1" says syntax error on "A = foo(B = 1)" says syntax error on "A = foo(B = 1)" parses "def foo(x @@unless); end" parses "def foo(x @@unless); end" parses "Foo(X, alignof(Int32))" parses "Foo(X, alignof(Int32))" parses "while true; end;" parses "while true; end;" parses "@@foo = 1" parses "@@foo = 1" parses "foo.===" parses "foo.===" parses "call \"foo\"" parses "call \"foo\"" parses "def foo(x @until); end" parses "def foo(x @until); end" parses "(bar {})" parses "(bar {})" says syntax error on "nil foo" says syntax error on "nil foo" parses "/(fo\#{\"bar\"}\#{1}o)/" parses "/(fo\#{\"bar\"}\#{1}o)/" parses "case 1\nwhen 1\n2\nend" parses "case 1\nwhen 1\n2\nend" says syntax error on "foo { |select| }" says syntax error on "foo { |select| }" parses "foo.nil?( )" parses "foo.nil?( )" parses "n =~ 2" parses "n =~ 2" parses "def ~(); end;" parses "def ~(); end;" parses "property pointerof : Int32" parses "property pointerof : Int32" parses "def foo(@[Foo] var); end" parses "def foo(@[Foo] var); end" parses "foo.> do end" parses "foo.> do end" parses "foo.bar = {} of Int32 => Int32" parses "foo.bar = {} of Int32 => Int32" says syntax error on "A = begin; B = 1; end" says syntax error on "A = begin; B = 1; end" says syntax error on "foo { |false| }" says syntax error on "foo { |false| }" parses "begin 1 end / 2" parses "begin 1 end / 2" parses "1 rescue 2" parses "1 rescue 2" says syntax error on "foo { |class| }" says syntax error on "foo { |class| }" parses "def foo(x @alias); end" parses "def foo(x @alias); end" says syntax error on "next ^ 1" says syntax error on "next ^ 1" parses "case foo; end" parses "case foo; end" parses "def foo(@alias); end" parses "def foo(@alias); end" says syntax error on "{one: :two, three: :four} of Symbol => Symbol" says syntax error on "{one: :two, three: :four} of Symbol => Symbol" parses "def foo(@select); end" parses "def foo(@select); end" says syntax error on "def foo(x :Int32); end" says syntax error on "def foo(x :Int32); end" parses "x = 1; foo.bar x do\nend" parses "x = 1; foo.bar x do\nend" parses "T::U/1" parses "T::U/1" parses "macro foo\n <<-FOO\n %foo\n FOO\nend" parses "macro foo\n <<-FOO\n %foo\n FOO\nend" parses "def foo;{{@type}};end" parses "def foo;{{@type}};end" parses "def foo(x @def); end" parses "def foo(x @def); end" parses "@[Foo(1, foo: 2)]" parses "@[Foo(1, foo: 2)]" parses ":%" parses ":%" parses "def self.==; end;" parses "def self.==; end;" parses "lib LibC\nfun getchar(a : Int, b : Float)\nend" parses "lib LibC\nfun getchar(a : Int, b : Float)\nend" parses "{% begin %}%w( %s ){% end %}" parses "{% begin %}%w( %s ){% end %}" says syntax error on "$foo :: Foo" says syntax error on "$foo :: Foo" parses "begin; 1; rescue Foo; 2; end" parses "begin; 1; rescue Foo; 2; end" parses "include Foo" parses "include Foo" parses "foo(n >> 2)" parses "foo(n >> 2)" parses "%x(`which(foo)`)" parses "%x(`which(foo)`)" parses "a.b /=\n1" parses "a.b /=\n1" parses ":/" parses ":/" parses "foo(z: 0, a: n &** 2)" parses "foo(z: 0, a: n &** 2)" parses "/ hi /" parses "/ hi /" parses "return" parses "return" says syntax error on "next >= 1" says syntax error on "next >= 1" parses "def foo(x, *, y); 1; end" parses "def foo(x, *, y); 1; end" parses "foo &.[0]" parses "foo &.[0]" parses "def foo(x @macro); end" parses "def foo(x @macro); end" parses "puts ~1" parses "puts ~1" parses "Foo(X: U, Y: V)" parses "Foo(X: U, Y: V)" parses "/foo/x" parses "/foo/x" parses "def foo(@struct); end" parses "def foo(@struct); end" parses "def foo(@def); end" parses "def foo(@def); end" parses ":**" parses ":**" parses "def foo(@@abstract); end" parses "def foo(@@abstract); end" parses "def foo(x @enum); end" parses "def foo(x @enum); end" says syntax error on "foo { |(macro)| }" says syntax error on "foo { |(macro)| }" parses "macro foo;{% verbatim do %}1{% foo %}2{% end %};end" parses "macro foo;{% verbatim do %}1{% foo %}2{% end %};end" says syntax error on "<<-'HERE\n" says syntax error on "<<-'HERE\n" parses "def foo(@[Foo] &@block); end" parses "def foo(@[Foo] &@block); end" parses "def foo(private foo); end" parses "def foo(private foo); end" says syntax error on "return + 1" says syntax error on "return + 1" parses "{% a = 1 %}" parses "{% a = 1 %}" says syntax error on "return >= 1" says syntax error on "return >= 1" parses "def foo(&block :\n Int ->); end" parses "def foo(&block :\n Int ->); end" parses "def []; end" parses "def []; end" parses "case : Int32" parses "case : Int32" parses "until true; end;" parses "until true; end;" parses "foo %r" parses "foo %r" parses "return 1, 2" parses "return 1, 2" parses "def foo(x @@class); end" parses "def foo(x @@class); end" parses "def &(); end" parses "def &(); end" parses "foo%i" parses "foo%i" says syntax error on "def foo; A = 1; end" says syntax error on "def foo; A = 1; end" parses "def `(cmd); 1; end" parses "def `(cmd); 1; end" says syntax error on "foo { |while| }" says syntax error on "foo { |while| }" parses "def foo(@@asm); end" parses "def foo(@@asm); end" parses "yield if true" parses "yield if true" parses "break if true" parses "break if true" says syntax error on "def =\nend" says syntax error on "def =\nend" parses "foo(n ^ 2)" parses "foo(n ^ 2)" parses "[..2]" parses "[..2]" says syntax error on "def foo(**args, **args2); end" says syntax error on "def foo(**args, **args2); end" parses "def foo(x @@select); end" parses "def foo(x @@select); end" parses "foo = 1; ->foo.=~(Int32)" parses "foo = 1; ->foo.=~(Int32)" parses "a[], a[] = 1, 2" parses "a[], a[] = 1, 2" parses "self / number" parses "self / number" parses "def foo(x @var); end" parses "def foo(x @var); end" parses "select\nwhen foo\n2\nelse\n3\nend" parses "select\nwhen foo\n2\nelse\n3\nend" parses "Foo({*X, *{Y}})" parses "Foo({*X, *{Y}})" parses "x : Foo(A, *B, C)" parses "x : Foo(A, *B, C)" parses "def foo(var : self); end" parses "def foo(var : self); end" says syntax error on "foo { |(typeof)| }" says syntax error on "foo { |(typeof)| }" parses "foo(a: n | 2)" parses "foo(a: n | 2)" parses "case / /; when / /; / /; else; / /; end" parses "case / /; when / /; / /; else; / /; end" parses "foo(z: 0, a: n << 2)" parses "foo(z: 0, a: n << 2)" parses "a = 1; a %=\n1" parses "a = 1; a %=\n1" parses "r = 1; r.x += 2" parses "r = 1; r.x += 2" parses "1..\n2.." parses "1..\n2.." parses "{% begin %}{% if true %}if true{% end %}\n{% if true %}end{% end %}{% end %}" parses "{% begin %}{% if true %}if true{% end %}\n{% if true %}end{% end %}{% end %}" parses "- 1" parses "- 1" parses "class : Int32" parses "class : Int32" parses "def foo; / /; end" parses "def foo; / /; end" says syntax error on "a = 1; b = 2; a, b += 1, 2" says syntax error on "a = 1; b = 2; a, b += 1, 2" parses "n / 2" parses "n / 2" parses "return *1" parses "return *1" parses "foo 1, **bar" parses "foo 1, **bar" parses "def foo(@lib); end" parses "def foo(@lib); end" parses "def foo(@if); end" parses "def foo(@if); end" parses "a ?\n b ? b1 : b2\n : c ? 3\n : 0" parses "a ?\n b ? b1 : b2\n : c ? 3\n : 0" parses "->(x : Int32) { x }" parses "->(x : Int32) { x }" parses "def foo(a, &block : self -> self); end" parses "def foo(a, &block : self -> self); end" parses ":>>" parses ":>>" says syntax error on "foo.||()" says syntax error on "foo.||()" parses "puts %i(one two)" parses "puts %i(one two)" parses "foo(0, n !~ 2)" parses "foo(0, n !~ 2)" parses "def foo(x @extend); end" parses "def foo(x @extend); end" says syntax error on "*a, b, c, d = 1, 2" says syntax error on "*a, b, c, d = 1, 2" parses "def foo(a, &block : Int, Float -> Double); end" parses "def foo(a, &block : Int, Float -> Double); end" parses "def foo(&\n); end" parses "def foo(&\n); end" parses "def foo(next foo); end" parses "def foo(next foo); end" says syntax error on "->::@foo.foo" says syntax error on "->::@foo.foo" parses "foo.==" parses "foo.==" parses "def foo=(value); end" parses "def foo=(value); end" parses "-1.0_f32" parses "-1.0_f32" parses "var.@foo" parses "var.@foo" parses "foo.> 1, 2" parses "foo.> 1, 2" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) ::)" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) ::)" parses "foo Bar { 1 }" parses "foo Bar { 1 }" parses "def foo(x @@with); end" parses "def foo(x @@with); end" says syntax error on "foo { |(module)| }" says syntax error on "foo { |(module)| }" says syntax error on "next == 1" says syntax error on "next == 1" says syntax error on "next ? 1 : 2" says syntax error on "next ? 1 : 2" parses "foo = 1; ->foo.%(Int32)" parses "foo = 1; ->foo.%(Int32)" parses "def foo(@@yield); end" parses "def foo(@@yield); end" parses "foo 1.bar do\nend" parses "foo 1.bar do\nend" parses "def foo(@@case); end" parses "def foo(@@case); end" parses "break 1 if true" parses "break 1 if true" parses "def foo(bar = 1\n); 2; end" parses "def foo(bar = 1\n); 2; end" says syntax error on "{\"x\": [] of Int32,\n}\n1.foo(" says syntax error on "{\"x\": [] of Int32,\n}\n1.foo(" parses "foo(a: n === 2)" parses "foo(a: n === 2)" says syntax error on "break ... 1" says syntax error on "break ... 1" parses "*a, b = 1, 2, 3, 4" parses "*a, b = 1, 2, 3, 4" says syntax error on "Foo(T, x: U)" says syntax error on "Foo(T, x: U)" parses "[1, 2] of Int" parses "[1, 2] of Int" says syntax error on "{foo: 1\nbar: 2}" says syntax error on "{foo: 1\nbar: 2}" says syntax error on "foo { |break| }" says syntax error on "foo { |break| }" says syntax error on "def foo(yield); end" says syntax error on "def foo(yield); end" parses "case {1}\nin {true}; 2; end" parses "case {1}\nin {true}; 2; end" parses "@foo" parses "@foo" parses "def foo; yield 1; end" parses "def foo; yield 1; end" parses "(1 ... )" parses "(1 ... )" parses "def foo(x @begin); end" parses "def foo(x @begin); end" parses "macro foo; 1 + 2 {{foo}}\\ 3 + 4; end" parses "macro foo; 1 + 2 {{foo}}\\ 3 + 4; end" parses "foo x, *bar" parses "foo x, *bar" parses "foo.+ 1, 2" parses "foo.+ 1, 2" says syntax error on "next << 1" says syntax error on "next << 1" parses "begin\n1\nensure\n2\nend" parses "begin\n1\nensure\n2\nend" parses "foo.*(1, 2)" parses "foo.*(1, 2)" says syntax error on "break % 1" says syntax error on "break % 1" parses "{% begin %}%r{\\A}{% end %}" parses "{% begin %}%r{\\A}{% end %}" parses "foo %x" parses "foo %x" says syntax error on "def foo(class); end" says syntax error on "def foo(class); end" parses "1.tap do |x|; 1; rescue; x; end" parses "1.tap do |x|; 1; rescue; x; end" parses "foo.< 1, 2" parses "foo.< 1, 2" parses "return *1, 2" parses "return *1, 2" parses "def -; end;" parses "def -; end;" parses "1.as(Bar)" parses "1.as(Bar)" says syntax error on "foo { |pointerof| }" says syntax error on "foo { |pointerof| }" parses "f.x &+= 2" parses "f.x &+= 2" parses "->Foo.**(Int32)" parses "->Foo.**(Int32)" parses "foo" parses "foo" parses "def foo; 1; 2; end" parses "def foo; 1; 2; end" says syntax error on "next .. 1" says syntax error on "next .. 1" parses "def foo(@var); end" parses "def foo(@var); end" parses "lib LibC\n@[Bar]; end" parses "lib LibC\n@[Bar]; end" says syntax error on "1 ... return" says syntax error on "1 ... return" parses "def foo(false foo); end" parses "def foo(false foo); end" parses "\"hello \"\\\n\"world\"" parses "\"hello \"\\\n\"world\"" parses "1 <=> 2" parses "1 <=> 2" parses "next" parses "next" parses "def ===(); end" parses "def ===(); end" parses "asm : Int32" parses "asm : Int32" parses "foo x do\nend" parses "foo x do\nend" parses "property nil : Int32" parses "property nil : Int32" says syntax error on "a = 1; a += break" says syntax error on "a = 1; a += break" parses "foo = 1; b = 2; foo +b" parses "foo = 1; b = 2; foo +b" says syntax error on "def self.as?; end" says syntax error on "def self.as?; end" says syntax error on "until return; end" says syntax error on "until return; end" parses "->Foo.=~(Int32)" parses "->Foo.=~(Int32)" says syntax error on "def foo(while); end" says syntax error on "def foo(while); end" says syntax error on "if 1\n foo 1,\nend" says syntax error on "if 1\n foo 1,\nend" says syntax error on "foo(break)" says syntax error on "foo(break)" parses "foo *bar" parses "foo *bar" says syntax error on "def foo(x y, x z); end" says syntax error on "def foo(x y, x z); end" parses "puts _" parses "puts _" parses "1+2*3" parses "1+2*3" parses "case 1\nin nil; 2; end" parses "case 1\nin nil; 2; end" parses "{% a = 1 if 2 %}" parses "{% a = 1 if 2 %}" parses "as?(Bar)" parses "as?(Bar)" parses "a = 1; a/b" parses "a = 1; a/b" parses "asm(\n\"nop\"\n:\n\"a\"(0)\n:\n\"b\"(1),\n\"c\"(2)\n)" parses "asm(\n\"nop\"\n:\n\"a\"(0)\n:\n\"b\"(1),\n\"c\"(2)\n)" parses "macro %;end" parses "macro %;end" says syntax error on "macro foo x y; end" says syntax error on "macro foo x y; end" says syntax error on "macro foo(x, *); 1; end" says syntax error on "macro foo(x, *); 1; end" says syntax error on "def foo(until); end" says syntax error on "def foo(until); end" parses "if foo\n1\nend" parses "if foo\n1\nend" parses "def foo(var = 1); end" parses "def foo(var = 1); end" says syntax error on "class Foo(); end" says syntax error on "class Foo(); end" parses "a.b / 2" parses "a.b / 2" parses "return 1.bar do\nend" parses "return 1.bar do\nend" parses "->foo?" parses "->foo?" parses "def foo(x = __DIR__); end" parses "def foo(x = __DIR__); end" says syntax error on "macro foo; {% foo = 1 }; end" says syntax error on "macro foo; {% foo = 1 }; end" parses "def foo(@yield); end" parses "def foo(@yield); end" parses "lib Foo::Bar\nend" parses "lib Foo::Bar\nend" parses "def self.<(); end;" parses "def self.<(); end;" parses "1\\\r\n + 2" parses "1\\\r\n + 2" parses "lib LibC; fun foo(a : ::B, ::C -> ::D); end" parses "lib LibC; fun foo(a : ::B, ::C -> ::D); end" parses "{% begin %}%x{ %s }{% end %}" parses "{% begin %}%x{ %s }{% end %}" parses "def foo(x @@var); end" parses "def foo(x @@var); end" parses "foo &.block=(0)" parses "foo &.block=(0)" says syntax error on "foo { |macro| }" says syntax error on "foo { |macro| }" parses "1 ... 2" parses "1 ... 2" says syntax error on "macro foo *y;end" says syntax error on "macro foo *y;end" parses "case {1, 2}\nwhen {.foo, .bar}\n5\nend" parses "case {1, 2}\nwhen {.foo, .bar}\n5\nend" parses "foo + 1" parses "foo + 1" says syntax error on "Foo(T, U V)" says syntax error on "Foo(T, U V)" parses "macro foo;bar{% begin %}body{% end %}baz;end" parses "macro foo;bar{% begin %}body{% end %}baz;end" parses "def foo(x @@return); end" parses "def foo(x @@return); end" parses "a = 1; a &=\n1" parses "a = 1; a &=\n1" parses "foo %w" parses "foo %w" says syntax error on "{a: 1, b: 2 c: 3}" says syntax error on "{a: 1, b: 2 c: 3}" says syntax error on "return.as(Int32)" says syntax error on "return.as(Int32)" parses "1.!" parses "1.!" parses "foo %w()" parses "foo %w()" parses "def foo(@@instance_sizeof); end" parses "def foo(@@instance_sizeof); end" parses "def &**(); end" parses "def &**(); end" parses ":foo?" parses ":foo?" parses "extend self" parses "extend self" parses "def foo(x @offsetof); end" parses "def foo(x @offsetof); end" parses "Foo(X, instance_sizeof(Int32))" parses "Foo(X, instance_sizeof(Int32))" says syntax error on "foo { |(if)| }" says syntax error on "foo { |(if)| }" parses "foo(z: 0, a: n < 2)" parses "foo(z: 0, a: n < 2)" says syntax error on " [1, 2, 3 end" says syntax error on " [1, 2, 3 end" parses "property false : Int32" parses "property false : Int32" says syntax error on "x, self = 1, 2" says syntax error on "x, self = 1, 2" says syntax error on "foo { |(return)| }" says syntax error on "foo { |(return)| }" parses "+1_i64" parses "+1_i64" parses "def foo(**args)\n1\nend" parses "def foo(**args)\n1\nend" parses "foo = 1; ->foo.-(Int32)" parses "foo = 1; ->foo.-(Int32)" says syntax error on "a.b {}, c = 1" says syntax error on "a.b {}, c = 1" parses "case 1\nin false; 2; end" parses "case 1\nin false; 2; end" parses "1 << 2" parses "1 << 2" parses "lib LibC\nfun getchar(a : Int, b : Float) : Int\nend" parses "lib LibC\nfun getchar(a : Int, b : Float) : Int\nend" parses "foo = 1; ->foo.==(Int32)" parses "foo = 1; ->foo.==(Int32)" parses "def foo(@@with); end" parses "def foo(@@with); end" says syntax error on "Foo(T U)" says syntax error on "Foo(T U)" parses "foo./(1, 2) { 3 }" parses "foo./(1, 2) { 3 }" parses "sizeof(\n Int32\n)" parses "sizeof(\n Int32\n)" parses "require \"foo\"; [1]" parses "require \"foo\"; [1]" parses "->@foo.foo?" parses "->@foo.foo?" parses "property ensure : Int32" parses "property ensure : Int32" parses "foo result : Int32; result" parses "foo result : Int32; result" parses "{% begin %}%[ %s ]{% end %}" parses "{% begin %}%[ %s ]{% end %}" parses "@foo = 1" parses "@foo = 1" parses "foo(n * 2)" parses "foo(n * 2)" says syntax error on "1 if next" says syntax error on "1 if next" parses "def foo(var : Int -> Double); end" parses "def foo(var : Int -> Double); end" parses "begin; 1; rescue ex; 2; end" parses "begin; 1; rescue ex; 2; end" parses "1 // 2" parses "1 // 2" parses "class Foo\nend" parses "class Foo\nend" says syntax error on "def foo\nfun\nend" says syntax error on "def foo\nfun\nend" parses "lib LibC; {{ 1 }}; end" parses "lib LibC; {{ 1 }}; end" says syntax error on "1 if return" says syntax error on "1 if return" parses "foo(z: 0, a: n ** 2)" parses "foo(z: 0, a: n ** 2)" parses "a == / /" parses "a == / /" parses "def foo(\n&block\n); end" parses "def foo(\n&block\n); end" parses "def self.>; end;" parses "def self.>; end;" parses "def foo; end; if false; 1; else; 2; end" parses "def foo; end; if false; 1; else; 2; end" parses "def self.&(); end;" parses "def self.&(); end;" says syntax error on "def foo(break); end" says syntax error on "def foo(break); end" parses "\"\#{1\n}\"" parses "\"\#{1\n}\"" parses "case 1; when 0, 1; 2; else; 3; end" parses "case 1; when 0, 1; 2; else; 3; end" parses "foo(0, n | 2)" parses "foo(0, n | 2)" parses "foo out @x; @x" parses "foo out @x; @x" parses "foo.>= do end" parses "foo.>= do end" parses "Foo({String, ->, ->})" parses "Foo({String, ->, ->})" parses "asm(\"nop\" :: : :)" parses "asm(\"nop\" :: : :)" parses "def !~(); end" parses "def !~(); end" says syntax error on "foo { |(def)| }" says syntax error on "foo { |(def)| }" parses "a : Foo" parses "a : Foo" parses "lib LibC; struct Foo; include Bar; end; end" parses "lib LibC; struct Foo; include Bar; end; end" says syntax error on "foo { |enum| }" says syntax error on "foo { |enum| }" parses "def *; end;" parses "def *; end;" says syntax error on "foo { |(abstract)| }" says syntax error on "foo { |(abstract)| }" parses "foo a, / /" parses "foo a, / /" says syntax error on "return[0]= 1" says syntax error on "return[0]= 1" parses "<<-HERE\n \#{1}One\n \#{2}Zero\n HERE" parses "<<-HERE\n \#{1}One\n \#{2}Zero\n HERE" parses "foo\n .bar" parses "foo\n .bar" parses "\n\n__LINE__" parses "\n\n__LINE__" parses "def foo(true foo); end" parses "def foo(true foo); end" parses "class Foo\ndef foo; end; end" parses "class Foo\ndef foo; end; end" says syntax error on "next.foo" says syntax error on "next.foo" parses "foo(0, n &+ 2)" parses "foo(0, n &+ 2)" parses "macro -;end" parses "macro -;end" parses "call foo : A, end : B" parses "call foo : A, end : B" parses "foo(*{1})" parses "foo(*{1})" parses "foo(n | 2)" parses "foo(n | 2)" parses "def foo; a = 1; with a yield a; end" parses "def foo; a = 1; with a yield a; end" parses "def self.foo\n1\nend" parses "def self.foo\n1\nend" says syntax error on "next & 1" says syntax error on "next & 1" parses "def self./; end;" parses "def self./; end;" parses "%r(\\ )" parses "%r(\\ )" parses "enum Foo; macro foo;end; end" parses "enum Foo; macro foo;end; end" parses "1..;" parses "1..;" parses "Foo(typeof(1))" parses "Foo(typeof(1))" says syntax error on "def foo(**args, *x); end" says syntax error on "def foo(**args, *x); end" parses "1.as?(\n Int32\n)" parses "1.as?(\n Int32\n)" parses "alias Foo = Bar" parses "alias Foo = Bar" sets correct location of annotation in lib sets correct location of annotation in lib parses "%Q{hello \\n world}" parses "%Q{hello \\n world}" says syntax error on "*a === 1" says syntax error on "*a === 1" parses "->Foo.&+(Int32)" parses "->Foo.&+(Int32)" says syntax error on "foo { |(sizeof)| }" says syntax error on "foo { |(sizeof)| }" parses "def foo(\nvar\n); end" parses "def foo(\nvar\n); end" parses "foo(a: n % 2)" parses "foo(a: n % 2)" parses "-@foo" parses "-@foo" says syntax error on "def foo(&a foo); end" says syntax error on "def foo(&a foo); end" parses "x = 2; foo do bar x end" parses "x = 2; foo do bar x end" parses "{\n{1}\n}" parses "{\n{1}\n}" parses "foo(z: 0, a: n % 2)" parses "foo(z: 0, a: n % 2)" parses "def foo(var : Char[256]); end" parses "def foo(var : Char[256]); end" parses "foo(0, n &- 2)" parses "foo(0, n &- 2)" parses "def self.%(); end;" parses "def self.%(); end;" parses "foo(a: n ** 2)" parses "foo(a: n ** 2)" parses "Int[]" parses "Int[]" says syntax error on "foo x: 1, x: 1" says syntax error on "foo x: 1, x: 1" parses "n % 2" parses "n % 2" parses "a; unless / /; / /; else; / /; end" parses "a; unless / /; / /; else; / /; end" says syntax error on "def foo(foo fun); end" says syntax error on "def foo(foo fun); end" parses "def ^(); end;" parses "def ^(); end;" parses "f.x //= 2" parses "f.x //= 2" parses "foo(z: 0, a: n > 2)" parses "foo(z: 0, a: n > 2)" parses "a = 1; a *=\n1" parses "a = 1; a *=\n1" parses "macro foo(**args)\n1\nend" parses "macro foo(**args)\n1\nend" says syntax error on "{1, ->do\n|x| x\end }" says syntax error on "{1, ->do\n|x| x\end }" says syntax error on "next / 1" says syntax error on "next / 1" parses "foo(&.as(T).bar)" parses "foo(&.as(T).bar)" says syntax error on "foo { |(unless)| }" says syntax error on "foo { |(unless)| }" parses "def foo(x @@fun); end" parses "def foo(x @@fun); end" parses "self" parses "self" parses "foo.- 1, 2" parses "foo.- 1, 2" says syntax error on "select\nwhen 1\n2\nend" says syntax error on "select\nwhen 1\n2\nend" parses "case \nwhen 1\n2\nend" parses "case \nwhen 1\n2\nend" parses "if foo; 1; elsif bar; 2; else 3; end" parses "if foo; 1; elsif bar; 2; else 3; end" sets correct location of tuple type sets correct location of tuple type parses "<<-'HERE COMES HEREDOC'\n hello \\n world\n \#{1}\n HERE COMES HEREDOC" parses "<<-'HERE COMES HEREDOC'\n hello \\n world\n \#{1}\n HERE COMES HEREDOC" parses "foo.| 1, 2" parses "foo.| 1, 2" parses "a.b <<=\n1" parses "a.b <<=\n1" parses "Foo(T, {x: X})" parses "Foo(T, {x: X})" parses "yield 1 if true" parses "yield 1 if true" parses "/foo/m" parses "/foo/m" parses "/foo/imximx" parses "/foo/imximx" says syntax error on "def foo(**args = 1); end" says syntax error on "def foo(**args = 1); end" parses "__DIR__" parses "__DIR__" says syntax error on "->::@@foo.foo" says syntax error on "->::@@foo.foo" parses "def foo(x @@yield); end" parses "def foo(x @@yield); end" parses "foo %i" parses "foo %i" parses "while true; 1; end;" parses "while true; 1; end;" parses "1 * 2" parses "1 * 2" parses "foo.=== 1, 2" parses "foo.=== 1, 2" parses "->Foo.<=(Int32)" parses "->Foo.<=(Int32)" parses "def /; end;" parses "def /; end;" parses "macro foo\n\"\\\\\"\nend" parses "macro foo\n\"\\\\\"\nend" parses "def foo(x, *y); 1; end" parses "def foo(x, *y); 1; end" parses "def >(); end" parses "def >(); end" parses "f.x ^= 2" parses "f.x ^= 2" parses "macro foo;%var;end" parses "macro foo;%var;end" parses "a = 1; a -=\n1" parses "a = 1; a -=\n1" parses "foo.<" parses "foo.<" says syntax error on "*a, *b = 1" says syntax error on "*a, *b = 1" says syntax error on "@[Foo(\"\": 1)]" says syntax error on "@[Foo(\"\": 1)]" parses "call(foo : A, end : B)" parses "call(foo : A, end : B)" parses "a = 1; a **=\n1" parses "a = 1; a **=\n1" parses "def &-(); end" parses "def &-(); end" says syntax error on "def foo *y; 1; end" says syntax error on "def foo *y; 1; end" parses "def foo(x); end; x" parses "def foo(x); end; x" parses "lib LibC; fun foo(a : Int**); end" parses "lib LibC; fun foo(a : Int**); end" says syntax error on "def foo\ninclude\nend" says syntax error on "def foo\ninclude\nend" says syntax error on "{a: 1, a: 2}" says syntax error on "{a: 1, a: 2}" parses "{% begin %}%i[ %s ]{% end %}" parses "{% begin %}%i[ %s ]{% end %}" parses "lib LibC\nfun getchar\nend" parses "lib LibC\nfun getchar\nend" parses "(baz; bar do\nend)" parses "(baz; bar do\nend)" parses "Foo(\"foo\": U, \"bar\": V)" parses "Foo(\"foo\": U, \"bar\": V)" parses "foo(0, n ^ 2)" parses "foo(0, n ^ 2)" says syntax error on "*a if true" says syntax error on "*a if true" parses "1 rescue 2" parses "1 rescue 2" parses "def foo(@in); end" parses "def foo(@in); end" parses "/ /\n/ /" parses "/ /\n/ /" parses "def >=(*args, **opts, &); end" parses "def >=(*args, **opts, &); end" parses "def foo(var : Int32 = 1); end" parses "def foo(var : Int32 = 1); end" says syntax error on "Hash{\"foo\": 1}" says syntax error on "Hash{\"foo\": 1}" parses "1 if /x/" parses "1 if /x/" parses "foo()" parses "foo()" parses "def foo(a, &block : Int -> Double); end" parses "def foo(a, &block : Int -> Double); end" says syntax error on "1 ... next" says syntax error on "1 ... next" parses "[1, 2]" parses "[1, 2]" says syntax error on "def foo(_ y); y; end" says syntax error on "def foo(_ y); y; end" says syntax error on "def foo=(a,b); end" says syntax error on "def foo=(a,b); end" parses "a = 1; a[2] &&= 3" parses "a = 1; a[2] &&= 3" parses "def foo(var : Int); end" parses "def foo(var : Int); end" parses "def <=(); end;" parses "def <=(); end;" says syntax error on "case 1; when return; end; end" says syntax error on "case 1; when return; end; end" parses "struct Foo; end" parses "struct Foo; end" parses "a, b, *c = 1, 2" parses "a, b, *c = 1, 2" parses ":&" parses ":&" says syntax error on "{foo: 1, bar: 2\nbaz: 3}" says syntax error on "{foo: 1, bar: 2\nbaz: 3}" parses "def foo(&); end" parses "def foo(&); end" parses "case {1}\nin {Int32}; 2; end" parses "case {1}\nin {Int32}; 2; end" parses "->@foo.foo!" parses "->@foo.foo!" parses "foo = 1; ->foo.^(Int32)" parses "foo = 1; ->foo.^(Int32)" parses "case 1\nin Int32; 2; end" parses "case 1\nin Int32; 2; end" parses "def foo(@require); end" parses "def foo(@require); end" parses "break 1" parses "break 1" parses "case;when true;1;end" parses "case;when true;1;end" parses "foo /;/" parses "foo /;/" parses "property extend : Int32" parses "property extend : Int32" parses "case 1\nwhen 1\n2\nelse\n3\nend" parses "case 1\nwhen 1\n2\nelse\n3\nend" parses "sizeof : Int32" parses "sizeof : Int32" parses "def foo(x @end); end" parses "def foo(x @end); end" parses "foo(a: n >> 2)" parses "foo(a: n >> 2)" parses "case / /\nwhen / /\n/ /\nelse\n/ /\nend" parses "case / /\nwhen / /\n/ /\nelse\n/ /\nend" parses "return *{1, 2}" parses "return *{1, 2}" parses "foo { |(_, c, )| c }" parses "foo { |(_, c, )| c }" parses "property rescue : Int32" parses "property rescue : Int32" says syntax error on "<<-HERE\n One\nwrong\n Zero\n HERE" says syntax error on "<<-HERE\n One\nwrong\n Zero\n HERE" says syntax error on "x : String, a = 4" says syntax error on "x : String, a = 4" says syntax error on "def foo(foo true); end" says syntax error on "def foo(foo true); end" says syntax error on "def foo?=(x); end" says syntax error on "def foo?=(x); end" parses "{% begin %}%q{ %s }{% end %}" parses "{% begin %}%q{ %s }{% end %}" parses "foo(z: 0, a: n - 2)" parses "foo(z: 0, a: n - 2)" parses "alignof(X)" parses "alignof(X)" parses "def foo(x @@require); end" parses "def foo(x @@require); end" parses "property module : Int32" parses "property module : Int32" parses "yield" parses "yield" parses "n &- 2" parses "n &- 2" parses "(bar do\nend)" parses "(bar do\nend)" parses "def foo(case foo); end" parses "def foo(case foo); end" says syntax error on "return <= 1" says syntax error on "return <= 1" parses "foo%r" parses "foo%r" parses "def foo(@@protected); end" parses "def foo(@@protected); end" parses "def !=(other, file = 1); end" parses "def !=(other, file = 1); end" says syntax error on "def foo(var = x : Int); end" says syntax error on "def foo(var = x : Int); end" says syntax error on "foo 1," says syntax error on "foo 1," parses "n * 2" parses "n * 2" says syntax error on "next | 1" says syntax error on "next | 1" says syntax error on "return == 1" says syntax error on "return == 1" parses "{[] of Foo, Bar::Baz * 2}" parses "{[] of Foo, Bar::Baz * 2}" says syntax error on "foo { |(break)| }" says syntax error on "foo { |(break)| }" says syntax error on "<<-HERE\n One\n \#{1}\n wrong\#{1}\n HERE" says syntax error on "<<-HERE\n One\n \#{1}\n wrong\#{1}\n HERE" says syntax error on "[\n\"foo\"\n\"bar\"\n]" says syntax error on "[\n\"foo\"\n\"bar\"\n]" parses "a ? 1\n : b ? 2\n : c ? 3\n : 0" parses "a ? 1\n : b ? 2\n : c ? 3\n : 0" parses "1 -2_i64" parses "1 -2_i64" parses "def foo(struct foo); end" parses "def foo(struct foo); end" says syntax error on "break | 1" says syntax error on "break | 1" parses "foo(0, n ** 2)" parses "foo(0, n ** 2)" parses "*_ = 1, 2" parses "*_ = 1, 2" parses "property sizeof : Int32" parses "property sizeof : Int32" parses "def foo(x @asm); end" parses "def foo(x @asm); end" parses "def <=(other, file = 1); end" parses "def <=(other, file = 1); end" parses "enum Foo; A = 1\ndef foo; 1; end; end" parses "enum Foo; A = 1\ndef foo; 1; end; end" parses "{%\na = 1\n%}" parses "{%\na = 1\n%}" says syntax error on "class Foo(T, U V)" says syntax error on "class Foo(T, U V)" says syntax error on "yield break" says syntax error on "yield break" parses "foo = 1; ->foo.foo=" parses "foo = 1; ->foo.foo=" parses "::Foo{\"x\" => \"y\"}" parses "::Foo{\"x\" => \"y\"}" parses "1 ? a : b" parses "1 ? a : b" parses "foo(bar do\nend)" parses "foo(bar do\nend)" parses "lib LibC\nfun getch = \"get.char\"(x : Int32)\nend" parses "lib LibC\nfun getch = \"get.char\"(x : Int32)\nend" parses "foo(n // 2)" parses "foo(n // 2)" parses "call(foo.as Bar, Baz)" parses "call(foo.as Bar, Baz)" parses "property def : Int32" parses "property def : Int32" parses "def /(); end" parses "def /(); end" parses "macro **;end" parses "macro **;end" says syntax error on "return ? 1 : 2" says syntax error on "return ? 1 : 2" parses "foo.!~ 1, 2" parses "foo.!~ 1, 2" parses ":<=" parses ":<=" says syntax error on "Hash {foo: 1} of Int32 => Int32" says syntax error on "Hash {foo: 1} of Int32 => Int32" parses "x[+ 1]" parses "x[+ 1]" parses "@@a, b = 1, 2" parses "@@a, b = 1, 2" parses "case 1\nwhen .as(T)\n2\nend" parses "case 1\nwhen .as(T)\n2\nend" says syntax error on "next ** 1" says syntax error on "next ** 1" parses "foo { |(_, c)| c }" parses "foo { |(_, c)| c }" says syntax error on "a = break" says syntax error on "a = break" parses "def foo(begin foo); end" parses "def foo(begin foo); end" parses "n ** 2" parses "n ** 2" says syntax error on "break / 1" says syntax error on "break / 1" parses "def foo(x @false); end" parses "def foo(x @false); end" parses "def **(); end;" parses "def **(); end;" parses "foo(&.bar.baz)" parses "foo(&.bar.baz)" says syntax error on "@foo :: Foo" says syntax error on "@foo :: Foo" says syntax error on "def foo(foo until); end" says syntax error on "def foo(foo until); end" says syntax error on "break ? 1 : 2" says syntax error on "break ? 1 : 2" parses "def self./; end;" parses "def self./; end;" says syntax error on "def foo(case); end" says syntax error on "def foo(case); end" says syntax error on "unless return; end" says syntax error on "unless return; end" parses "def <<(); end" parses "def <<(); end" parses "foo(a: n !~ 2)" parses "foo(a: n !~ 2)" parses "foo.% do end" parses "foo.% do end" parses "1_i64" parses "1_i64" parses "def foo(@@end); end" parses "def foo(@@end); end" parses "foo.<= 1, 2" parses "foo.<= 1, 2" parses "lib LibC; struct Foo; {% if 1 %}2{% end %}; end; end" parses "lib LibC; struct Foo; {% if 1 %}2{% end %}; end; end" parses "foo(z: 0, a: n >> 2)" parses "foo(z: 0, a: n >> 2)" parses "1 ? 2 : 3" parses "1 ? 2 : 3" parses "def foo(x @case); end" parses "def foo(x @case); end" parses "def foo; a; end" parses "def foo; a; end" says syntax error on "def foo(protected); end" says syntax error on "def foo(protected); end" parses "foo.bar(1).baz" parses "foo.bar(1).baz" parses "property protected : Int32" parses "property protected : Int32" parses "foo.bar 1, 2" parses "foo.bar 1, 2" says syntax error on "break.foo" says syntax error on "break.foo" parses "foo(..2)" parses "foo(..2)" says syntax error on "def foo &block : Int -> Double ; end" says syntax error on "def foo &block : Int -> Double ; end" parses ":\"\\\\foo\"" parses ":\"\\\\foo\"" parses "foo if 3" parses "foo if 3" parses "foo %i()" parses "foo %i()" parses "/fo\#{1}o/" parses "/fo\#{1}o/" parses "next 1" parses "next 1" parses ":&**" parses ":&**" says syntax error on "1 unless return" says syntax error on "1 unless return" parses "foo.=~ 1, 2" parses "foo.=~ 1, 2" parses "foo = 1; ->foo.foo!" parses "foo = 1; ->foo.foo!" parses "foo(0, n << 2)" parses "foo(0, n << 2)" parses "begin; 1; rescue ex : ::Foo | ::Bar; 2; end" parses "begin; 1; rescue ex : ::Foo | ::Bar; 2; end" parses "enum Foo; protected def foo; 1; end; end" parses "enum Foo; protected def foo; 1; end; end" parses "foo.<=(1, 2) { 3 }" parses "foo.<=(1, 2) { 3 }" parses "def foo(while foo); end" parses "def foo(while foo); end" says syntax error on "{% unless 1 %} 2 {% elsif 3 %} 3 {% end %}" says syntax error on "{% unless 1 %} 2 {% elsif 3 %} 3 {% end %}" parses "{%\n1\n2\n3\n%}" parses "{%\n1\n2\n3\n%}" parses "case {1}\nin {_}; 2; end" parses "case {1}\nin {_}; 2; end" says syntax error on "return < 1" says syntax error on "return < 1" parses "def =~; end" parses "def =~; end" parses "+1.0" parses "+1.0" parses " macro foo(\n @[Foo]\n id,\n @[Bar] name\n );end" parses " macro foo(\n @[Foo]\n id,\n @[Bar] name\n );end" parses "f.x <<= 2" parses "f.x <<= 2" parses ":=~" parses ":=~" parses "foo(a: n >= 2)" parses "foo(a: n >= 2)" parses "lib LibC; {% if 1 %}2{% end %}; end" parses "lib LibC; {% if 1 %}2{% end %}; end" parses "foo./ 1, 2" parses "foo./ 1, 2" says syntax error on "if return; end" says syntax error on "if return; end" parses "1.!(\n)" parses "1.!(\n)" says syntax error on "break < 1" says syntax error on "break < 1" parses "def foo(@@enum); end" parses "def foo(@@enum); end" says syntax error on "foo { |struct| }" says syntax error on "foo { |struct| }" says syntax error on "def foo():String\nend" says syntax error on "def foo():String\nend" parses "foo./" parses "foo./" parses "def foo(x @return); end" parses "def foo(x @return); end" parses "def foo(@typeof); end" parses "def foo(@typeof); end" parses "macro foo;bar(end: 1);end" parses "macro foo;bar(end: 1);end" parses "1 +2.0" parses "1 +2.0" parses "->::Foo.foo=" parses "->::Foo.foo=" parses "foo(0, n == 2)" parses "foo(0, n == 2)" says syntax error on "def foo\nlib\nend" says syntax error on "def foo\nlib\nend" parses "1 <= 2 <= 3" parses "1 <= 2 <= 3" says syntax error on "FOO, BAR = 1, 2" says syntax error on "FOO, BAR = 1, 2" says syntax error on "unless 1 == 1 a; end" says syntax error on "unless 1 == 1 a; end" parses "def foo(\"bar qux\" y); y; end" parses "def foo(\"bar qux\" y); y; end" parses "foo(z: 0, a: n ^ 2)" parses "foo(z: 0, a: n ^ 2)" parses "def foo(x = __LINE__); end" parses "def foo(x = __LINE__); end" parses "def >>(); end" parses "def >>(); end" parses "foo%x" parses "foo%x" parses "{} of Int32 -> Int32 => Int32" parses "{} of Int32 -> Int32 => Int32" parses "a()/3" parses "a()/3" parses "foo.+(1, 2) { 3 }" parses "foo.+(1, 2) { 3 }" parses "->::foo=" parses "->::foo=" parses "A = 1" parses "A = 1" parses "Set(Int32) {1, 2, 3}" parses "Set(Int32) {1, 2, 3}" parses ":[]?" parses ":[]?" parses "def foo; a = 1; a {}; end" parses "def foo; a = 1; a {}; end" parses "enum Foo; A\nB; C\nD = 1; end" parses "enum Foo; A\nB; C\nD = 1; end" parses "n !~ 2" parses "n !~ 2" parses "foo.-(1, 2) { 3 }" parses "foo.-(1, 2) { 3 }" parses "foo(/a/)" parses "foo(/a/)" says syntax error on "return &- 1" says syntax error on "return &- 1" parses "(1)\nif true; end" parses "(1)\nif true; end" says syntax error on "foo { |private| }" says syntax error on "foo { |private| }" says syntax error on "+break" says syntax error on "+break" parses "def self.foo()\n1\nend" parses "def self.foo()\n1\nend" parses "def foo(x @@abstract); end" parses "def foo(x @@abstract); end" parses "{% begin %}%r(\\A){% end %}" parses "{% begin %}%r(\\A){% end %}" parses "foo(n + 2)" parses "foo(n + 2)" parses "def self.|(); end;" parses "def self.|(); end;" parses "->Foo.&*(Int32)" parses "->Foo.&*(Int32)" parses "foo = 1; ->foo.&*(Int32)" parses "foo = 1; ->foo.&*(Int32)" says syntax error on "enum Foo; A B; end" says syntax error on "enum Foo; A B; end" says syntax error on "def foo(foo instance_sizeof); end" says syntax error on "def foo(foo instance_sizeof); end" says syntax error on "a.b(), c.d = 1" says syntax error on "a.b(), c.d = 1" parses "nil : Int32" parses "nil : Int32" parses "f.x |= 2" parses "f.x |= 2" says syntax error on "def foo @var, █ end" says syntax error on "def foo @var, █ end" parses "-> : Int32 { }" parses "-> : Int32 { }" says syntax error on "asm(\"nop\" :::: \"\#{volatile}\")" says syntax error on "asm(\"nop\" :::: \"\#{volatile}\")" says syntax error on "foo { |x, x| }" says syntax error on "foo { |x, x| }" parses "foo\n\n .bar" parses "foo\n\n .bar" parses "foo &.block(1)" parses "foo &.block(1)" says syntax error on "foo { |(offsetof)| }" says syntax error on "foo { |(offsetof)| }" parses "1 +\n2" parses "1 +\n2" parses "abstract def foo; 1" parses "abstract def foo; 1" parses "Foo(T, 1, U)" parses "Foo(T, 1, U)" parses "begin; 1; rescue ::Foo | ::Bar; 2; end" parses "begin; 1; rescue ::Foo | ::Bar; 2; end" parses "{{a = 1 if 2}}" parses "{{a = 1 if 2}}" says syntax error on "foo[next]" says syntax error on "foo[next]" parses "case {1}\nin {false}; 2; end" parses "case {1}\nin {false}; 2; end" parses "Foo({x: X})" parses "Foo({x: X})" parses "Foo({x: X, y: Y})" parses "Foo({x: X, y: Y})" parses "foo.**(1, 2) { 3 }" parses "foo.**(1, 2) { 3 }" parses "Foo(T?)" parses "Foo(T?)" parses "foo(&.as?(T).bar)" parses "foo(&.as?(T).bar)" says syntax error on "case 1\nwhen Int32; 2; in 2" says syntax error on "case 1\nwhen Int32; 2; in 2" parses "foo(Bar) { 1 }" parses "foo(Bar) { 1 }" parses "foo { |(a, *b, c)| }" parses "foo { |(a, *b, c)| }" parses "foo %Q()" parses "foo %Q()" parses "def foo(@sizeof); end" parses "def foo(@sizeof); end" parses "foo.|" parses "foo.|" says syntax error on "next.as(Int32)" says syntax error on "next.as(Int32)" parses "1 * -2" parses "1 * -2" parses "macro foo; 1 + 2 {{ foo }} 3 + 4; end" parses "macro foo; 1 + 2 {{ foo }} 3 + 4; end" parses "a.b() /3" parses "a.b() /3" parses "def self.>=; end;" parses "def self.>=; end;" parses "def foo(in foo); end" parses "def foo(in foo); end" sets correct location of annotation on method parameter sets correct location of annotation on method parameter says syntax error on "break << 1" says syntax error on "break << 1" parses "foo \"foo bar\": 1, \"baz\": 2" parses "foo \"foo bar\": 1, \"baz\": 2" parses "foo &.block[0]" parses "foo &.block[0]" parses "{% begin %}%r<\\A>{% end %}" parses "{% begin %}%r<\\A>{% end %}" parses "foo &.as(T)" parses "foo &.as(T)" parses "macro foo\n{%\nif 1\n2\nelse\n3\nend\n%}end" parses "macro foo\n{%\nif 1\n2\nelse\n3\nend\n%}end" says syntax error on "foo.&&" says syntax error on "foo.&&" parses "1 / -2" parses "1 / -2" parses "class Foo(T1); end" parses "class Foo(T1); end" parses "a = 1; class Foo; @x = a; end" parses "a = 1; class Foo; @x = a; end" says syntax error on "foo { |(case)| }" says syntax error on "foo { |(case)| }" says syntax error on "def foo\ndef\nend" says syntax error on "def foo\ndef\nend" parses "foo = 1; ->foo.*(Int32)" parses "foo = 1; ->foo.*(Int32)" parses "foo(0, n &** 2)" parses "foo(0, n &** 2)" parses ":+" parses ":+" parses "private def foo; end" parses "private def foo; end" parses "def &(); end;" parses "def &(); end;" parses "def foo(@class); end" parses "def foo(@class); end" parses "macro foo(@[Foo] var);end" parses "macro foo(@[Foo] var);end" parses "foo.&(1, 2)" parses "foo.&(1, 2)" says syntax error on "while 1 == 1 a; end" says syntax error on "while 1 == 1 a; end" parses "protected def foo; end" parses "protected def foo; end" parses "foo(**bar)" parses "foo(**bar)" parses "def foo(module foo); end" parses "def foo(module foo); end" parses "foo(\n1\n)" parses "foo(\n1\n)" parses "foo(&.as?(T))" parses "foo(&.as?(T))" parses "include : Int32" parses "include : Int32" parses "f.x &= 2" parses "f.x &= 2" parses "case 1\nwhen .responds_to?(:foo)\n2\nend" parses "case 1\nwhen .responds_to?(:foo)\n2\nend" says syntax error on "def self.!; end" says syntax error on "def self.!; end" says syntax error on "def foo(*args = 1); end" says syntax error on "def foo(*args = 1); end" says syntax error on "foo &.||" says syntax error on "foo &.||" parses "1 ensure 2 if 3" parses "1 ensure 2 if 3" parses "def foo(x = / /); end" parses "def foo(x = / /); end" says syntax error on "def foo(foo return); end" says syntax error on "def foo(foo return); end" parses "1.as(\n Int32\n)" parses "1.as(\n Int32\n)" parses "{\"\".id}" parses "{\"\".id}" says syntax error on "foo { |(false)| }" says syntax error on "foo { |(false)| }" parses "until true; 1; end;" parses "until true; 1; end;" says syntax error on "def foo(*a foo); end" says syntax error on "def foo(*a foo); end" says syntax error on "return >> 1" says syntax error on "return >> 1" parses "macro foo; 1 + 2; end" parses "macro foo; 1 + 2; end" says syntax error on "def foo(foo extend); end" says syntax error on "def foo(foo extend); end" parses "foo 1, 2" parses "foo 1, 2" parses "puts {{1}}" parses "puts {{1}}" parses "foo.< do end" parses "foo.< do end" says syntax error on "macro is_a?; end" says syntax error on "macro is_a?; end" says syntax error on "*a == 1" says syntax error on "*a == 1" says syntax error on "def nil?; end" says syntax error on "def nil?; end" says syntax error on "{\"\": 1}" says syntax error on "{\"\": 1}" says syntax error on "a = next" says syntax error on "a = next" parses "foo..2" parses "foo..2" says syntax error on "<<-HERE\n One\n \#{1}\n Zero\n HERE" says syntax error on "<<-HERE\n One\n \#{1}\n Zero\n HERE" says syntax error on "self += 1" says syntax error on "self += 1" says syntax error on "foo { |require| }" says syntax error on "foo { |require| }" parses "def self.foo=()\n1\nend" parses "def self.foo=()\n1\nend" says syntax error on "while return; end" says syntax error on "while return; end" parses "def foo(@nil); end" parses "def foo(@nil); end" parses "*a.foo, a.bar = 1" parses "*a.foo, a.bar = 1" parses "foo.=~(1, 2) { 3 }" parses "foo.=~(1, 2) { 3 }" parses "def foo(sizeof foo); end" parses "def foo(sizeof foo); end" parses "foo % q()" parses "foo % q()" parses "lib LibC; enum Foo; A\nB; C\nD = 1; end end" parses "lib LibC; enum Foo; A\nB; C\nD = 1; end end" says syntax error on "{1 => 2, 3 => 4 5 => 6}" says syntax error on "{1 => 2, 3 => 4 5 => 6}" parses "private : Int32" parses "private : Int32" parses "foo.=~ do end" parses "foo.=~ do end" parses "case a\nwhen b\n1 / 2\nelse\n1 / 2\nend" parses "case a\nwhen b\n1 / 2\nelse\n1 / 2\nend" parses "foo { 1 }" parses "foo { 1 }" says syntax error on "def foo(out); end" says syntax error on "def foo(out); end" parses "n ^ 2" parses "n ^ 2" parses "while true; end\nif true; end" parses "while true; end\nif true; end" parses ":!=" parses ":!=" parses "{% begin %}%w| %s |{% end %}" parses "{% begin %}%w| %s |{% end %}" parses "def |(); end;" parses "def |(); end;" parses "foo(a: n * 2)" parses "foo(a: n * 2)" parses "foo.bar=(*baz)" parses "foo.bar=(*baz)" parses "{{ foo }}" parses "{{ foo }}" parses "extend Foo" parses "extend Foo" parses "foo(0, n & 2)" parses "foo(0, n & 2)" parses "def foo; with a yield; end" parses "def foo; with a yield; end" parses "foo.!=(1, 2) { 3 }" parses "foo.!=(1, 2) { 3 }" parses "foo\n.bar" parses "foo\n.bar" says syntax error on "def is_a?; end" says syntax error on "def is_a?; end" says syntax error on "foo :: Foo" says syntax error on "foo :: Foo" parses "foo(1.., 2)" parses "foo(1.., 2)" parses "a : Foo = 1" parses "a : Foo = 1" parses "def foo; a = 1; a; end" parses "def foo; a = 1; a; end" says syntax error on "def foo(\"\" y); y; end" says syntax error on "def foo(\"\" y); y; end" parses "def foo(alias foo); end" parses "def foo(alias foo); end" parses "->foo(Int32, Float64)" parses "->foo(Int32, Float64)" parses "def Foo.foo\n1\nend" parses "def Foo.foo\n1\nend" parses "begin\n1\nend\nif true; end" parses "begin\n1\nend\nif true; end" parses " def foo(\n @[Foo]\n id : Int32,\n @[Bar] name : String\n ); end" parses " def foo(\n @[Foo]\n id : Int32,\n @[Bar] name : String\n ); end" parses "a = 1; a ensure a" parses "a = 1; a ensure a" parses "{{ foo.nil?(foo) }}" parses "{{ foo.nil?(foo) }}" says syntax error on "def foo(*x, **x); end" says syntax error on "def foo(*x, **x); end" parses "def foo(@[Foo] var : Int32); end" parses "def foo(@[Foo] var : Int32); end" says syntax error on "def foo(x, **x); end" says syntax error on "def foo(x, **x); end" parses "offsetof(\n Foo,\n @foo\n)" parses "offsetof(\n Foo,\n @foo\n)" parses "foo(&.!)" parses "foo(&.!)" parses "def !=(); end;" parses "def !=(); end;" parses "@@a : Foo = 1" parses "@@a : Foo = 1" parses "Foo({X, Y,})" parses "Foo({X, Y,})" parses "macro foo\n <<-FOO, <<-BAR + \"\"\n FOO\n BAR\nend" parses "macro foo\n <<-FOO, <<-BAR + \"\"\n FOO\n BAR\nend" parses "->::Foo.foo?" parses "->::Foo.foo?" parses "lib LibC\nalias Foo = Bar\nend" parses "lib LibC\nalias Foo = Bar\nend" parses "enum Foo; @[Bar]; end" parses "enum Foo; @[Bar]; end" parses "foo(0, n >= 2)" parses "foo(0, n >= 2)" parses "def []=(value); end" parses "def []=(value); end" parses "while : Int32" parses "while : Int32" parses "foo = 1; ->foo.>(Int32)" parses "foo = 1; ->foo.>(Int32)" parses "def foo(x y); y; end" parses "def foo(x y); y; end" parses ":>" parses ":>" parses "macro >>;end" parses "macro >>;end" parses "a = uninitialized Foo; a" parses "a = uninitialized Foo; a" parses "def foo(a); a; end" parses "def foo(a); a; end" parses "def foo(x, *, y, &); 1; end" parses "def foo(x, *, y, &); 1; end" parses "foo &.nil?" parses "foo &.nil?" parses "def foo(a, &block); end" parses "def foo(a, &block); end" parses "def =~; end;" parses "def =~; end;" parses "property asm : Int32" parses "property asm : Int32" parses "with : Int32" parses "with : Int32" says syntax error on "{\n1 => 2\n3 => 4\n}" says syntax error on "{\n1 => 2\n3 => 4\n}" parses "foo(z: 0, a: n &* 2)" parses "foo(z: 0, a: n &* 2)" says syntax error on "next > 1" says syntax error on "next > 1" says syntax error on "1 ... break" says syntax error on "1 ... break" parses "def foo(x @next); end" parses "def foo(x @next); end" parses "def //(); end" parses "def //(); end" parses "def foo(var : (Int, Float -> Double)); end" parses "def foo(var : (Int, Float -> Double)); end" parses "1.as Bar" parses "1.as Bar" parses "begin; 1; rescue ex; 2; end; ex" parses "begin; 1; rescue ex; 2; end; ex" parses "foo % x()" parses "foo % x()" says syntax error on "def foo(foo select); end" says syntax error on "def foo(foo select); end" says syntax error on "until break; end" says syntax error on "until break; end" parses "foo(z: 0, a: n / 2)" parses "foo(z: 0, a: n / 2)" parses "1 / 2" parses "1 / 2" says syntax error on "foo(foo(&.block)" says syntax error on "foo(foo(&.block)" parses "1 ** -x" parses "1 ** -x" parses "foo.^" parses "foo.^" parses "Foo(X, sizeof(Int32))" parses "Foo(X, sizeof(Int32))" parses "lib LibC\nend" parses "lib LibC\nend" says syntax error on "def foo(x, *); 1; end" says syntax error on "def foo(x, *); 1; end" parses "asm(\"nop\" ::::)" parses "asm(\"nop\" ::::)" parses "foo.nil?" parses "foo.nil?" parses "foo = 1; b = 2; foo -b" parses "foo = 1; b = 2; foo -b" parses "b.c &&= 1" parses "b.c &&= 1" parses "{{ //.options }}" parses "{{ //.options }}" says syntax error on "def foo(\"bar \#{1} qux\" y); y; end" says syntax error on "def foo(\"bar \#{1} qux\" y); y; end" says syntax error on "enum Foo\n A, B, C\nend\n" says syntax error on "enum Foo\n A, B, C\nend\n" parses "def foo(@@def); end" parses "def foo(@@def); end" says syntax error on "(1, 2 3)" says syntax error on "(1, 2 3)" says syntax error on "1 as Bar" says syntax error on "1 as Bar" parses "def self./(); end;" parses "def self./(); end;" parses ":|" parses ":|" parses "foo(1, a: 1, b: 2)" parses "foo(1, a: 1, b: 2)" parses "<<-FOO\n\t 1\n\t FOO" parses "<<-FOO\n\t 1\n\t FOO" parses "def >; end;" parses "def >; end;" parses "foo(z: 0, a: n >= 2)" parses "foo(z: 0, a: n >= 2)" parses "def foo(x @@self); end" parses "def foo(x @@self); end" says syntax error on "next &** 1" says syntax error on "next &** 1" parses "foo.!~" parses "foo.!~" parses "def foo; yield; end" parses "def foo; yield; end" says syntax error on "x--" says syntax error on "x--" parses "foo.<= do end" parses "foo.<= do end" says syntax error on "macro foo(x y z); end" says syntax error on "macro foo(x y z); end" parses "def foo(break foo); end" parses "def foo(break foo); end" says syntax error on "->() :Int32 { }" says syntax error on "->() :Int32 { }" parses "foo(0, n =~ 2)" parses "foo(0, n =~ 2)" says syntax error on "foo { |yield| }" says syntax error on "foo { |yield| }" says syntax error on "def foo(true); end" says syntax error on "def foo(true); end" parses "foo +1" parses "foo +1" parses "def self.~; end;" parses "def self.~; end;" parses "lib LibC; struct Foo; {{ 1 }}; end; end" parses "lib LibC; struct Foo; {{ 1 }}; end; end" parses "puts {{\n1\n}}" parses "puts {{\n1\n}}" parses "case when 1\n2\nend" parses "case when 1\n2\nend" parses "def foo(@@until); end" parses "def foo(@@until); end" parses "instance_sizeof(\n Int32\n)" parses "instance_sizeof(\n Int32\n)" parses "case 1\nin Foo(Int32); 2; end" parses "case 1\nin Foo(Int32); 2; end" parses "macro =~;end" parses "macro =~;end" parses "def foo(@@module); end" parses "def foo(@@module); end" parses "enum Foo; @@foo = 1\n A \n end" parses "enum Foo; @@foo = 1\n A \n end" parses "abstract def foo(x)" parses "abstract def foo(x)" parses "break;" parses "break;" parses "@[Foo(1)]" parses "@[Foo(1)]" parses "*a = 1, 2" parses "*a = 1, 2" parses "def foo(@@include); end" parses "def foo(@@include); end" parses "def foo(x @fun); end" parses "def foo(x @fun); end" parses "2 / 3 + 4 / 5" parses "2 / 3 + 4 / 5" says syntax error on "def foo(foo false); end" says syntax error on "def foo(foo false); end" parses "1 + 2" parses "1 + 2" parses "def foo : Int32\n1\nend" parses "def foo : Int32\n1\nend" parses "def self.-; end;" parses "def self.-; end;" parses "foo(0, n <= 2)" parses "foo(0, n <= 2)" parses "1.[]?(2)" parses "1.[]?(2)" parses "asm(\"nop\" ::)" parses "asm(\"nop\" ::)" parses "foo 1, **bar, &block" parses "foo 1, **bar, &block" says syntax error on "def foo(in); end" says syntax error on "def foo(in); end" parses ":\"\\u{61}\"" parses ":\"\\u{61}\"" says syntax error on "foo { |offsetof| }" says syntax error on "foo { |offsetof| }" says syntax error on "def foo(foo yield); end" says syntax error on "def foo(foo yield); end" says syntax error on "'a' foo" says syntax error on "'a' foo" parses "foo %x()" parses "foo %x()" parses "case 1\nwhen .foo\n2\nend" parses "case 1\nwhen .foo\n2\nend" parses "@@a = uninitialized Foo" parses "@@a = uninitialized Foo" says syntax error on "def foo(foo alias); end" says syntax error on "def foo(foo alias); end" parses "foo(n == 2)" parses "foo(n == 2)" parses "foo[0] = 1 if 2" parses "foo[0] = 1 if 2" parses "foo do\n//\nend" parses "foo do\n//\nend" parses "foo.<(1, 2) { 3 }" parses "foo.<(1, 2) { 3 }" parses "foo %r()" parses "foo %r()" parses "def foo(x @abstract); end" parses "def foo(x @abstract); end" says syntax error on "break // 1" says syntax error on "break // 1" parses "def !~; end;" parses "def !~; end;" parses "->Foo.foo" parses "->Foo.foo" parses "abstract def foo\n1" parses "abstract def foo\n1" parses "<<-FOO\n \t 1\n \t FOO" parses "<<-FOO\n \t 1\n \t FOO" parses "foo.== 1, 2" parses "foo.== 1, 2" parses "1 + 2" parses "1 + 2" parses "a = 1; a **= 1" parses "a = 1; a **= 1" parses "foo.is_a?(Foo | Bar)" parses "foo.is_a?(Foo | Bar)" says syntax error on "def foo(nil); end" says syntax error on "def foo(nil); end" says syntax error on "next <= 1" says syntax error on "next <= 1" parses "macro +;end" parses "macro +;end" parses "foo = 1; ->foo.//(Int32)" parses "foo = 1; ->foo.//(Int32)" parses "foo(n & 2)" parses "foo(n & 2)" parses "next *1, 2" parses "next *1, 2" parses "def self.=~(); end;" parses "def self.=~(); end;" says syntax error on "1 .. return" says syntax error on "1 .. return" parses "/ /" parses "/ /" parses "def foo(out foo); end" parses "def foo(out foo); end" parses "def foo; end" parses "def foo; end" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) : \"eax\", \"ebx\" : \"volatile\", \"alignstack\", \"intel\")" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) : \"eax\", \"ebx\" : \"volatile\", \"alignstack\", \"intel\")" parses "def self.<=(); end;" parses "def self.<=(); end;" says syntax error on "foo(next)" says syntax error on "foo(next)" parses "1.responds_to?(\n :foo\n)" parses "1.responds_to?(\n :foo\n)" parses "a = 1; a ^=\n1" parses "a = 1; a ^=\n1" parses ":[]=" parses ":[]=" says syntax error on "def foo(include); end" says syntax error on "def foo(include); end" parses "foo +1_i64" parses "foo +1_i64" says syntax error on "def foo() :String\nend" says syntax error on "def foo() :String\nend" parses "module Foo(*T); end" parses "module Foo(*T); end" parses "def foo(var : Int?); end" parses "def foo(var : Int?); end" says syntax error on "next ... 1" says syntax error on "next ... 1" parses "foo%Q" parses "foo%Q" parses "def foo(@begin); end" parses "def foo(@begin); end" parses "foo.|(1, 2) { 3 }" parses "foo.|(1, 2) { 3 }" parses "foo.==(1, 2)" parses "foo.==(1, 2)" parses "1 >= 2" parses "1 >= 2" says syntax error on "def foo(foo if); end" says syntax error on "def foo(foo if); end" parses "def foo(&@block); end" parses "def foo(&@block); end" says syntax error on "{a: 1 b: 2}" says syntax error on "{a: 1 b: 2}" parses "def foo(@@if); end" parses "def foo(@@if); end" parses "next {1 => 2}" parses "next {1 => 2}" parses "1" parses "1" says syntax error on "b! = 1" says syntax error on "b! = 1" says syntax error on "foo { |x, (x)| }" says syntax error on "foo { |x, (x)| }" parses "begin; 1; rescue Foo | Bar; 2; end" parses "begin; 1; rescue Foo | Bar; 2; end" says syntax error on "def foo(enum); end" says syntax error on "def foo(enum); end" parses "def self.[]?; end" parses "def self.[]?; end" parses "enum : Int32" parses "enum : Int32" parses "1.~" parses "1.~" parses "foo(a: n &** 2)" parses "foo(a: n &** 2)" parses "macro foo;bar{% if x %}body{% end %}baz;end" parses "macro foo;bar{% if x %}body{% end %}baz;end" parses "def []=(*args, **opts); end" parses "def []=(*args, **opts); end" parses "f.x Foo.new" parses "f.x Foo.new" parses "1 -2" parses "1 -2" parses "def >=(*args, **opts); end" parses "def >=(*args, **opts); end" parses "foo.[]=" parses "foo.[]=" parses "enum Foo; {{1}}; end" parses "enum Foo; {{1}}; end" parses "foo.!( )" parses "foo.!( )" says syntax error on "foo { |(protected)| }" says syntax error on "foo { |(protected)| }" parses "a.b +=\n1" parses "a.b +=\n1" parses "macro foo; 1 + 2 {{foo}} 3 + 4; end" parses "macro foo; 1 + 2 {{foo}} 3 + 4; end" parses "def foo(x @@asm); end" parses "def foo(x @@asm); end" parses "def foo(x @@struct); end" parses "def foo(x @@struct); end" parses "{% begin %}%r[\\A]{% end %}" parses "{% begin %}%r[\\A]{% end %}" says syntax error on "foo(1, 2, 3 end" says syntax error on "foo(1, 2, 3 end" parses "class Foo < self; end" parses "class Foo < self; end" parses "def foo(@[Foo] *args); end" parses "def foo(@[Foo] *args); end" parses "foo = 1; foo +1" parses "foo = 1; foo +1" parses "foo out _" parses "foo out _" says syntax error on "macro nil?; end" says syntax error on "macro nil?; end" parses "begin; 1; rescue ex : Foo | Bar; 2; end" parses "begin; 1; rescue ex : Foo | Bar; 2; end" parses "break *1, 2" parses "break *1, 2" parses "/\\//" parses "/\\//" says syntax error on "b, 1 == 2, a = 4" says syntax error on "b, 1 == 2, a = 4" parses "def foo(@@while); end" parses "def foo(@@while); end" parses "1.as?(Bar)" parses "1.as?(Bar)" parses "/foo/i" parses "/foo/i" parses "{A::B}" parses "{A::B}" parses ":!~" parses ":!~" parses "<<-HERE\n \#{1} \\n \#{2}\n HERE" parses "<<-HERE\n \#{1} \\n \#{2}\n HERE" parses "foo(0, n - 2)" parses "foo(0, n - 2)" parses "a ? 1 :\n b ? 2 :\n c ? 3\n : 0" parses "a ? 1 :\n b ? 2 :\n c ? 3\n : 0" says syntax error on "def foo(abstract); end" says syntax error on "def foo(abstract); end" parses "1 +2" parses "1 +2" parses "property lib : Int32" parses "property lib : Int32" says syntax error on "def foo(foo next); end" says syntax error on "def foo(foo next); end" parses "lib LibC; type A = B*; end" parses "lib LibC; type A = B*; end" parses "foo./(1, 2)" parses "foo./(1, 2)" parses "1\n+2" parses "1\n+2" parses "Foo(T, U, 1)" parses "Foo(T, U, 1)" parses "foo.!~(1, 2)" parses "foo.!~(1, 2)" parses "foo.bar(1, 2) { 3 }" parses "foo.bar(1, 2) { 3 }" parses "foo(a: 1, &block)" parses "foo(a: 1, &block)" parses "def foo(def foo); end" parses "def foo(def foo); end" sets correct location of instance variable in proc pointer sets correct location of instance variable in proc pointer parses "A.new(\"x\", B.new(\"y\"))" parses "A.new(\"x\", B.new(\"y\"))" parses "@a : Foo" parses "@a : Foo" parses "def foo(x @@private); end" parses "def foo(x @@private); end" parses "when : Int32" parses "when : Int32" parses "a = / /" parses "a = / /" says syntax error on "foo { |(struct)| }" says syntax error on "foo { |(struct)| }" parses "foo(0, n * 2)" parses "foo(0, n * 2)" parses "a = 1; a &+= 1" parses "a = 1; a &+= 1" parses "foo(n !~ 2)" parses "foo(n !~ 2)" parses "::foo" parses "::foo" parses "[\n1,2\n]" parses "[\n1,2\n]" parses "def foo(x @@case); end" parses "def foo(x @@case); end" parses "def foo(var : (Int, Float) -> Double); end" parses "def foo(var : (Int, Float) -> Double); end" parses "lib LibC\nfun getch = GetChar\nend" parses "lib LibC\nfun getch = GetChar\nend" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1), \"c\"(2))" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1), \"c\"(2))" says syntax error on "def foo(module); end" says syntax error on "def foo(module); end" parses "macro foo;bar{% for x, y in z %}body{% end %}baz;end" parses "macro foo;bar{% for x, y in z %}body{% end %}baz;end" parses "macro foo=;end" parses "macro foo=;end" parses "foo = 1; ->foo.foo?" parses "foo = 1; ->foo.foo?" parses "nil?( )" parses "nil?( )" says syntax error on "foo { |(while)| }" says syntax error on "foo { |(while)| }" parses "case a\nwhen b\n/ /\n\nelse\n/ /\nend" parses "case a\nwhen b\n/ /\n\nelse\n/ /\nend" parses "puts ::foo" parses "puts ::foo" says syntax error on "foo(&block) {}" says syntax error on "foo(&block) {}" parses ":[]=" parses ":[]=" says syntax error on "def foo(asm); end" says syntax error on "def foo(asm); end" says syntax error on "def foo(foo pointerof); end" says syntax error on "def foo(foo pointerof); end" parses "Foo(X, offsetof(Foo, @a))" parses "Foo(X, offsetof(Foo, @a))" parses "def foo(return foo); end" parses "def foo(return foo); end" parses "break 1, 2" parses "break 1, 2" says syntax error on "return &+ 1" says syntax error on "return &+ 1" says syntax error on "foo { |(extend)| }" says syntax error on "foo { |(extend)| }" parses "2**3**4" parses "2**3**4" says syntax error on "def foo(return); end" says syntax error on "def foo(return); end" says syntax error on "def foo\nstruct\nend" says syntax error on "def foo\nstruct\nend" parses "abstract def foo(x) : Int32" parses "abstract def foo(x) : Int32" says syntax error on "asm(\"\" : 1)" says syntax error on "asm(\"\" : 1)" parses "_, _ = 1, 2" parses "_, _ = 1, 2" parses "def foo(n); foo(n -1); end" parses "def foo(n); foo(n -1); end" parses "struct : Int32" parses "struct : Int32" parses "def self./(); end;" parses "def self./(); end;" parses "macro foo;var if true;end" parses "macro foo;var if true;end" parses "foo[\nfoo[\n1\n]\n]" parses "foo[\nfoo[\n1\n]\n]" parses "foo &.each do\nend" parses "foo &.each do\nend" parses "->Foo.&(Int32)" parses "->Foo.&(Int32)" parses "Int[8]" parses "Int[8]" says syntax error on "next === 1" says syntax error on "next === 1" parses "def self.===(); end;" parses "def self.===(); end;" parses "class Foo(*T); end" parses "class Foo(*T); end" parses "a = 1; a |= 1" parses "a = 1; a |= 1" parses "f.x /= 2" parses "f.x /= 2" parses "def foo(x @unless); end" parses "def foo(x @unless); end" says syntax error on "enum Foo < UInt16; end" says syntax error on "enum Foo < UInt16; end" parses "def foo(a, &block : *Int -> ); end" parses "def foo(a, &block : *Int -> ); end" parses "{{ 1 // 2 }}" parses "{{ 1 // 2 }}" parses "case 1\nwhen 1\n2\nend\nif a\nend" parses "case 1\nwhen 1\n2\nend\nif a\nend" parses "lib LibC; struct Foo; x : Int; y : Float; end end" parses "lib LibC; struct Foo; x : Int; y : Float; end end" parses "\"\"" parses "\"\"" parses "foo *{1}" parses "foo *{1}" says syntax error on "asm(\"nop\" ::: \"\#{foo}\")" says syntax error on "asm(\"nop\" ::: \"\#{foo}\")" parses "foo(n < 2)" parses "foo(n < 2)" parses "def /; end;" parses "def /; end;" parses "foo &.!" parses "foo &.!" parses "foo = 1; ->foo.bar(Int32)" parses "foo = 1; ->foo.bar(Int32)" parses "\n class Foo\n def bar\n print as Foo\n end\n end\n " parses "\n class Foo\n def bar\n print as Foo\n end\n end\n " parses "foo(a: n == 2)" parses "foo(a: n == 2)" parses "%q{hello \#{foo} world}" parses "%q{hello \#{foo} world}" parses "foo(0, n > 2)" parses "foo(0, n > 2)" sets correct location of global path in class def sets correct location of global path in class def parses "def foo(var1, var2); end" parses "def foo(var1, var2); end" says syntax error on "break &+ 1" says syntax error on "break &+ 1" says syntax error on "case break; when 1; end; end" says syntax error on "case break; when 1; end; end" parses "def self.**(); end;" parses "def self.**(); end;" says syntax error on "case 1\nin .nil?; 2" says syntax error on "case 1\nin .nil?; 2" parses "property private : Int32" parses "property private : Int32" parses "class Foo(T, *U); end" parses "class Foo(T, *U); end" parses "foo.& do end" parses "foo.& do end" says syntax error on "def foo(x : U) forall; end" says syntax error on "def foo(x : U) forall; end" parses "1.foo do; 1; end" parses "1.foo do; 1; end" says syntax error on "foo &.&&()" says syntax error on "foo &.&&()" parses "n - 2" parses "n - 2" parses "{% begin %}%i| %s |{% end %}" parses "{% begin %}%i| %s |{% end %}" parses "{% begin %}%< %s >{% end %}" parses "{% begin %}%< %s >{% end %}" parses "return : Int32" parses "return : Int32" says syntax error on "b? = 1" says syntax error on "b? = 1" parses "foo(z: 0, a: n =~ 2)" parses "foo(z: 0, a: n =~ 2)" parses "Foo()?" parses "Foo()?" parses "def foo(x @@enum); end" parses "def foo(x @@enum); end" parses "foo &.+(2)" parses "foo &.+(2)" parses "<<-FOO\n \t1\n \tFOO" parses "<<-FOO\n \t1\n \tFOO" parses "foo +1.0" parses "foo +1.0" parses "yield : Int32" parses "yield : Int32" parses "abstract def foo" parses "abstract def foo" says syntax error on "def foo(private); end" says syntax error on "def foo(private); end" parses "case 1; when 1; 2; else; 3; end" parses "case 1; when 1; 2; else; 3; end" parses "property when : Int32" parses "property when : Int32" parses "Foo.bar x.y do\nend" parses "Foo.bar x.y do\nend" parses "{% begin %}%w{ %s }{% end %}" parses "{% begin %}%w{ %s }{% end %}" parses "foo(z: 0, a: n <= 2)" parses "foo(z: 0, a: n <= 2)" says syntax error on "foo { |(x, x)| }" says syntax error on "foo { |(x, x)| }" parses "1 || 2" parses "1 || 2" parses "a.b &=\n1" parses "a.b &=\n1" says syntax error on "lib Foo; fun foo(x : Int32, x : Int64); end" says syntax error on "lib Foo; fun foo(x : Int32, x : Int64); end" says syntax error on "{{ {{ 1 }} }}" says syntax error on "{{ {{ 1 }} }}" parses "a = 1; yield a ensure a" parses "a = 1; yield a ensure a" parses "a = 1; pointerof(a)" parses "a = 1; pointerof(a)" parses "{} of Int => Double" parses "{} of Int => Double" says syntax error on "foo(**bar, *x)" says syntax error on "foo(**bar, *x)" says syntax error on "foo { |instance_sizeof| }" says syntax error on "foo { |instance_sizeof| }" says syntax error on "def foo var\n end" says syntax error on "def foo var\n end" parses "def %(); end" parses "def %(); end" says syntax error on "{a[0]: 1}" says syntax error on "{a[0]: 1}" parses "a.b &*=\n1" parses "a.b &*=\n1" parses "foo(a: n < 2)" parses "foo(a: n < 2)" parses ":\u304B\u305F\u306A" parses ":\u304B\u305F\u306A" says syntax error on "def foo(x @@x); 1; end" says syntax error on "def foo(x @@x); 1; end" says syntax error on "return &** 1" says syntax error on "return &** 1" parses "*a, b = 1" parses "*a, b = 1" parses "foo.&" parses "foo.&" parses "foo(&.responds_to?(:foo))" parses "foo(&.responds_to?(:foo))" parses "break {1 => 2}" parses "break {1 => 2}" parses "def foo(a, b = a); end" parses "def foo(a, b = a); end" parses "typeof(1)" parses "typeof(1)" parses "{\"foo\": 1, \"bar\": 2}" parses "{\"foo\": 1, \"bar\": 2}" parses "def foo(x @lib); end" parses "def foo(x @lib); end" parses "foo.>=(1, 2) { 3 }" parses "foo.>=(1, 2) { 3 }" says syntax error on "def foo(foo nil); end" says syntax error on "def foo(foo nil); end" parses "f.x = - 1" parses "f.x = - 1" parses "a.b %=\n1" parses "a.b %=\n1" parses "(bar do\nend)" parses "(bar do\nend)" calls with blocks within index operator (#12818) parses "foo[bar { 1 }]" parses "foo[bar { 1 }]" parses "foo[bar do; 1; end]" parses "foo[bar do; 1; end]" parses "foo.[bar { 1 }]" parses "foo.[bar { 1 }]" parses "foo.[](bar { 1 })" parses "foo.[](bar { 1 })" parses "foo.[bar do; 1; end]" parses "foo.[bar do; 1; end]" parses "foo.[](bar do; 1; end)" parses "foo.[](bar do; 1; end)" parses "foo(a: n + 2)" parses "foo(a: n + 2)" parses "return if true" parses "return if true" says syntax error on "->::foo.foo" says syntax error on "->::foo.foo" parses "1 &- 2" parses "1 &- 2" says syntax error on "break &** 1" says syntax error on "break &** 1" parses "foo = 1; foo &x" parses "foo = 1; foo &x" parses "foo(bar:\"a\", baz:\"b\")" parses "foo(bar:\"a\", baz:\"b\")" parses "def ===; end;" parses "def ===; end;" parses "def foo(@module); end" parses "def foo(@module); end" parses "a = b = 2" parses "a = b = 2" parses "asm(\n\"nop\"\n:\n\"a\"(0),\n\"b\"(1)\n:\n\"c\"(2),\n\"d\"(3)\n)" parses "asm(\n\"nop\"\n:\n\"a\"(0),\n\"b\"(1)\n:\n\"c\"(2),\n\"d\"(3)\n)" parses "foo = 1; ->foo.&+(Int32)" parses "foo = 1; ->foo.&+(Int32)" parses "foo%q" parses "foo%q" parses "->Foo.>=(Int32)" parses "->Foo.>=(Int32)" parses "def foo(a, @[Foo] var); end" parses "def foo(a, @[Foo] var); end" parses "->Foo.==(Int32)" parses "->Foo.==(Int32)" parses "foo.!= 1, 2" parses "foo.!= 1, 2" parses "def foo(@@in); end" parses "def foo(@@in); end" says syntax error on "self = 1" says syntax error on "self = 1" parses "foo = 1; ->foo.<=(Int32)" parses "foo = 1; ->foo.<=(Int32)" parses "->Foo.!~(Int32)" parses "->Foo.!~(Int32)" parses "foo = 1; foo {}" parses "foo = 1; foo {}" parses "x = 1 ensure 2" parses "x = 1 ensure 2" parses "{{ nil?(foo) }}" parses "{{ nil?(foo) }}" parses "Foo(T)?" parses "Foo(T)?" parses "def foo(x @@next); end" parses "def foo(x @@next); end" says syntax error on "[\n]" says syntax error on "[\n]" says syntax error on "foo { |(true)| }" says syntax error on "foo { |(true)| }" parses "def foo(var); end" parses "def foo(var); end" parses "->Foo.foo=" parses "->Foo.foo=" parses "else : Int32" parses "else : Int32" parses "->Foo.[](Int32)" parses "->Foo.[](Int32)" parses "macro foo;end" parses "macro foo;end" parses "1 + /foo/" parses "1 + /foo/" parses "foo(a: n &+ 2)" parses "foo(a: n &+ 2)" parses "foo(n &* 2)" parses "foo(n &* 2)" parses "foo = 1; foo(-1)" parses "foo = 1; foo(-1)" says syntax error on "next[]" says syntax error on "next[]" parses "lib LibC\n$errno = Foo : Int32\nend" parses "lib LibC\n$errno = Foo : Int32\nend" parses "next 1 if true" parses "next 1 if true" says syntax error on "foo { |(next)| }" says syntax error on "foo { |(next)| }" parses "def foo; yield 1; yield; end" parses "def foo; yield 1; yield; end" parses "def ==(); end" parses "def ==(); end" says syntax error on "return & 1" says syntax error on "return & 1" parses "Int[8, 4,]" parses "Int[8, 4,]" says syntax error on "fun foo\nclass" says syntax error on "fun foo\nclass" parses "foo(1 + 2)" parses "foo(1 + 2)" parses "def foo(var : Char[N]); end" parses "def foo(var : Char[N]); end" parses "macro <=>;end" parses "macro <=>;end" parses "module Foo; end" parses "module Foo; end" parses "def foo(class foo); end" parses "def foo(class foo); end" parses "foo(z: 0, a: n === 2)" parses "foo(z: 0, a: n === 2)" parses "[] of ->\n1" parses "[] of ->\n1" parses "def **; end;" parses "def **; end;" says syntax error on "case next; when 1; end; end" says syntax error on "case next; when 1; end; end" parses "foo.bar.as(Bar)" parses "foo.bar.as(Bar)" says syntax error on "def foo(if); end" says syntax error on "def foo(if); end" says syntax error on "def foo\nmacro\nend" says syntax error on "def foo\nmacro\nend" parses "[/ /, / /]" parses "[/ /, / /]" parses "property break : Int32" parses "property break : Int32" parses "[] of Int" parses "[] of Int" parses "foo 1" parses "foo 1" parses "def foo(@@break); end" parses "def foo(@@break); end" says syntax error on "def self.responds_to?; end" says syntax error on "def self.responds_to?; end" parses "alias : Int32" parses "alias : Int32" says syntax error on "case 1 == 1; when 2 a; end" says syntax error on "case 1 == 1; when 2 a; end" parses "foo &./(1)" parses "foo &./(1)" says syntax error on "def foo\nextend\nend" says syntax error on "def foo\nextend\nend" says syntax error on "foo(return)" says syntax error on "foo(return)" parses "unless foo; 1; else; 2; end" parses "unless foo; 1; else; 2; end" parses "f.x += 2" parses "f.x += 2" parses "->Foo.foo?" parses "->Foo.foo?" parses "1 unless 3" parses "1 unless 3" parses "def |(); end" parses "def |(); end" parses "def foo(x @@typeof); end" parses "def foo(x @@typeof); end" parses "select\nwhen foo\n2\nend" parses "select\nwhen foo\n2\nend" parses "lib LibFoo\nend\nif true\nend" parses "lib LibFoo\nend\nif true\nend" parses "foo(z: 0, a: n + 2)" parses "foo(z: 0, a: n + 2)" parses "def foo(@macro); end" parses "def foo(@macro); end" parses "foo.^ do end" parses "foo.^ do end" says syntax error on "{\"foo\" => 1, \"bar\": 2}" says syntax error on "{\"foo\" => 1, \"bar\": 2}" sets correct location of named tuple type sets correct location of named tuple type says syntax error on "macro foo(**x, y)" says syntax error on "macro foo(**x, y)" says syntax error on "def foo(foo end); end" says syntax error on "def foo(foo end); end" parses "Int[8, 4]" parses "Int[8, 4]" parses "def &; end;" parses "def &; end;" says syntax error on "macro foo x; 1 + 2; end" says syntax error on "macro foo x; 1 + 2; end" parses "[] of {String, ->}" parses "[] of {String, ->}" parses "foo % w()" parses "foo % w()" parses "def foo(x @@lib); end" parses "def foo(x @@lib); end" parses "n <= 2" parses "n <= 2" says syntax error on "break >= 1" says syntax error on "break >= 1" parses "foo { |a, (b, c), (d, e)| a; b; c; d; e }" parses "foo { |a, (b, c), (d, e)| a; b; c; d; e }" parses "x : *T -> R" parses "x : *T -> R" parses "foo(x:\n begin\n result : Int32 = 1\n result\n end\n )" parses "foo(x:\n begin\n result : Int32 = 1\n result\n end\n )" parses "def foo(a, &block : Foo); end" parses "def foo(a, &block : Foo); end" parses "foo.*" parses "foo.*" parses "<<-HERE1; <<-HERE2\nhere1\nHERE1\nHERE2" parses "<<-HERE1; <<-HERE2\nhere1\nHERE1\nHERE2" parses "Foo::Bar" parses "Foo::Bar" says syntax error on "def foo x y; end" says syntax error on "def foo x y; end" parses "foo &.baz.qux do\nend" parses "foo &.baz.qux do\nend" sets correct location of parameter in proc literal sets correct location of parameter in proc literal says syntax error on "a = 1; a += return" says syntax error on "a = 1; a += return" says syntax error on "foo[1] = next" says syntax error on "foo[1] = next" parses ":foo" parses ":foo" parses "unless : Int32" parses "unless : Int32" parses "case 1\nelse\n2\nend" parses "case 1\nelse\n2\nend" parses "def foo(offsetof foo); end" parses "def foo(offsetof foo); end" says syntax error on " {1 => end" says syntax error on " {1 => end" parses "def &+(); end" parses "def &+(); end" says syntax error on "foo { |(lib)| }" says syntax error on "foo { |(lib)| }" parses "foo.>(1, 2)" parses "foo.>(1, 2)" says syntax error on "next - 1" says syntax error on "next - 1" parses "def foo(x @select); end" parses "def foo(x @select); end" parses "<<-HERE1; <<-HERE2\nHERE1\nHERE2" parses "<<-HERE1; <<-HERE2\nHERE1\nHERE2" parses "def self.>(); end;" parses "def self.>(); end;" parses "def foo(@@nil); end" parses "def foo(@@nil); end" parses "foo = 1; foo -1" parses "foo = 1; foo -1" parses "a.b/2" parses "a.b/2" says syntax error on "macro !;end" says syntax error on "macro !;end" parses "macro foo;%var unless true;end" parses "macro foo;%var unless true;end" parses "1/2" parses "1/2" says syntax error on "def foo!=; end" says syntax error on "def foo!=; end" says syntax error on "def foo(lib); end" says syntax error on "def foo(lib); end" parses "macro foo;if %var;true;end;end" parses "macro foo;if %var;true;end;end" parses "a { |x| x } / b" parses "a { |x| x } / b" parses "property with : Int32" parses "property with : Int32" says syntax error on "-> :Int32 { }" says syntax error on "-> :Int32 { }" says syntax error on "def foo(foo class); end" says syntax error on "def foo(foo class); end" parses "case\n1\nwhen 1\n2\nend\nif a\nend" parses "case\n1\nwhen 1\n2\nend\nif a\nend" parses "a = 1; b = 2; c = 3; a-b-c" parses "a = 1; b = 2; c = 3; a-b-c" parses "a = 1; a +=\n1" parses "a = 1; a +=\n1" parses "enum Foo; {% if 1 %}2{% end %}; end" parses "enum Foo; {% if 1 %}2{% end %}; end" parses "foo -1.0, -2.0" parses "foo -1.0, -2.0" parses "def foo(x @@def); end" parses "def foo(x @@def); end" parses "macro !~;end" parses "macro !~;end" parses "{% begin %}%Q{ %s }{% end %}" parses "{% begin %}%Q{ %s }{% end %}" parses "4./(2)" parses "4./(2)" parses "%q{hello \\n world}" parses "%q{hello \\n world}" parses "def foo(x, *args, y = 2, w, z = 3); 1; end" parses "def foo(x, *args, y = 2, w, z = 3); 1; end" says syntax error on "def foo\nabstract\nend" says syntax error on "def foo\nabstract\nend" parses "foo.**" parses "foo.**" parses "foo.===(1, 2) { 3 }" parses "foo.===(1, 2) { 3 }" parses "-1_i64" parses "-1_i64" parses "foo(a: n - 2)" parses "foo(a: n - 2)" parses "a = 1; a ||= 1" parses "a = 1; a ||= 1" parses ":\"\"" parses ":\"\"" says syntax error on "case 1\nin 1; 2" says syntax error on "case 1\nin 1; 2" parses "macro >;end" parses "macro >;end" parses "{\n1\n}" parses "{\n1\n}" sets correct location of argument in named tuple type sets correct location of argument in named tuple type parses "def foo(select foo); end" parses "def foo(select foo); end" says syntax error on "foo[1] = return" says syntax error on "foo[1] = return" says syntax error on "foo &.||()" says syntax error on "foo &.||()" parses "1 ** 2" parses "1 ** 2" parses "property case : Int32" parses "property case : Int32" parses "macro <<;end" parses "macro <<;end" parses "def foo(@next); end" parses "def foo(@next); end" parses "__FILE__" parses "__FILE__" parses "{% begin %}%i( %s ){% end %}" parses "{% begin %}%i( %s ){% end %}" says syntax error on "offsetof(X, 'c')" says syntax error on "offsetof(X, 'c')" parses "a, b = 1" parses "a, b = 1" parses "Foo(1)" parses "Foo(1)" parses "foo.+ do end" parses "foo.+ do end" parses "until : Int32" parses "until : Int32" parses "lib LibC\nfun getchar(...)\nend" parses "lib LibC\nfun getchar(...)\nend" parses "foo(0, n === 2)" parses "foo(0, n === 2)" parses "Foo({X, Y})" parses "Foo({X, Y})" parses "foo(0, n / 2)" parses "foo(0, n / 2)" parses "1_i128" parses "1_i128" says syntax error on "A = foo { B = 1 }" says syntax error on "A = foo { B = 1 }" parses "foo(&.block)" parses "foo(&.block)" parses "def foo(abstract foo); end" parses "def foo(abstract foo); end" parses "<<-HERE\n One\n Zero\n HERE" parses "<<-HERE\n One\n Zero\n HERE" parses "Foo(\n)" parses "Foo(\n)" parses "foo x do\n//\nend" parses "foo x do\n//\nend" parses "<<-SOME\n Sa\n Se\n SOME" parses "<<-SOME\n Sa\n Se\n SOME" sets correct location of instance variable in proc pointer sets correct location of instance variable in proc pointer parses "...2" parses "...2" parses "return;" parses "return;" parses "`foo\#{1}bar`" parses "`foo\#{1}bar`" parses "1 !~ 2" parses "1 !~ 2" says syntax error on "def foo @@var, █ end" says syntax error on "def foo @@var, █ end" parses "if foo; 1; else; 2; end" parses "if foo; 1; else; 2; end" says syntax error on "break &* 1" says syntax error on "break &* 1" parses ":^" parses ":^" parses "1 == 2 == 3 == 4" parses "1 == 2 == 3 == 4" parses ":\"\\a\\b\\n\\r\\t\\v\\f\\e\"" parses ":\"\\a\\b\\n\\r\\t\\v\\f\\e\"" says syntax error on "macro responds_to?; end" says syntax error on "macro responds_to?; end" says syntax error on "a, b, c, d, *e = 1, 2, 3" says syntax error on "a, b, c, d, *e = 1, 2, 3" parses "->@foo.foo" parses "->@foo.foo" parses "foo(out x); x" parses "foo(out x); x" parses "->@foo.foo=" parses "->@foo.foo=" parses "extend Foo\nif true; end" parses "extend Foo\nif true; end" says syntax error on "case 1 == 1 a; when 2; end" says syntax error on "case 1 == 1 a; when 2; end" parses "macro foo(@[Foo] **args);end" parses "macro foo(@[Foo] **args);end" says syntax error on "macro foo&&;end" says syntax error on "macro foo&&;end" says syntax error on "{\n\"foo\"\n\"bar\"\n}" says syntax error on "{\n\"foo\"\n\"bar\"\n}" parses "f.x = Foo.new" parses "f.x = Foo.new" parses "@a = uninitialized Foo" parses "@a = uninitialized Foo" parses "return {1, 2}" parses "return {1, 2}" says syntax error on "1 if break" says syntax error on "1 if break" says syntax error on "foo { |(asm)| }" says syntax error on "foo { |(asm)| }" parses "unless foo; 1; end" parses "unless foo; 1; end" parses "case {1}\nin {.bar?}; 2; end" parses "case {1}\nin {.bar?}; 2; end" parses "\"foo\#{bar}baz\"" parses "\"foo\#{bar}baz\"" parses "property true : Int32" parses "property true : Int32" parses "f.x %= 2" parses "f.x %= 2" parses "def foo(@@fun); end" parses "def foo(@@fun); end" parses "1 -2.0" parses "1 -2.0" parses "-1.0" parses "-1.0" parses "->::Foo.foo!" parses "->::Foo.foo!" parses "a = 1; a //= 1" parses "a = 1; a //= 1" says syntax error on "def !; end" says syntax error on "def !; end" says syntax error on "break ^ 1" says syntax error on "break ^ 1" parses "property include : Int32" parses "property include : Int32" parses "lib LibC\nfun getch = \"get.char\"\nend" parses "lib LibC\nfun getch = \"get.char\"\nend" says syntax error on "x++" says syntax error on "x++" parses "foo = 1; ->foo.!~(Int32)" parses "foo = 1; ->foo.!~(Int32)" parses "asm(\"nop\" : \"a\"(0))" parses "asm(\"nop\" : \"a\"(0))" parses "n &* 2" parses "n &* 2" parses "a.b /2/" parses "a.b /2/" says syntax error on "def foo=(**kwargs); end" says syntax error on "def foo=(**kwargs); end" parses "foo.<=(1, 2)" parses "foo.<=(1, 2)" says syntax error on "def foo(foo lib); end" says syntax error on "def foo(foo lib); end" says syntax error on "def foo(foo include); end" says syntax error on "def foo(foo include); end" parses "macro foo;bar{% for x in y %}\\ \n body{% end %}baz;end" parses "macro foo;bar{% for x in y %}\\ \n body{% end %}baz;end" parses "{[] of Foo, Bar::Baz.new}" parses "{[] of Foo, Bar::Baz.new}" parses "a : Foo | Int32" parses "a : Foo | Int32" parses "1 <= 2" parses "1 <= 2" parses "foo = 1; ->foo.&-(Int32)" parses "foo = 1; ->foo.&-(Int32)" says syntax error on "a = 1, b = 2" says syntax error on "a = 1, b = 2" parses "{% if 1; 2; end %}" parses "{% if 1; 2; end %}" says syntax error on "\"\#{<<-HERE}\"\nHERE" says syntax error on "\"\#{<<-HERE}\"\nHERE" parses "foo(n &** 2)" parses "foo(n &** 2)" parses "macro foo\n\"\\'\"\nend" parses "macro foo\n\"\\'\"\nend" parses "foo(x, *bar, *baz, y)" parses "foo(x, *bar, *baz, y)" parses "foo = 1; ->foo./(Int32)" parses "foo = 1; ->foo./(Int32)" says syntax error on "*a" says syntax error on "*a" says syntax error on "while next; end" says syntax error on "while next; end" parses "a = 1; a <<=\n1" parses "a = 1; a <<=\n1" parses "@[Foo(1, foo: 2\n)]" parses "@[Foo(1, foo: 2\n)]" parses "def foo(@@offsetof); end" parses "def foo(@@offsetof); end" says syntax error on "a, b, *c, d = 1, 2" says syntax error on "a, b, *c, d = 1, 2" parses "{% begin %}%w< %s >{% end %}" parses "{% begin %}%w< %s >{% end %}" parses "/foo/" parses "/foo/" says syntax error on "def foo(foo enum); end" says syntax error on "def foo(foo enum); end" parses "def self.|; end;" parses "def self.|; end;" parses "foo(/ /, / /)" parses "foo(/ /, / /)" parses "def foo(**args : **Foo)\n1\nend" parses "def foo(**args : **Foo)\n1\nend" says syntax error on "return // 1" says syntax error on "return // 1" parses "lib : Int32" parses "lib : Int32" parses "def foo(@@next); end" parses "def foo(@@next); end" parses "macro foo;bar{% if x %}body{% else %}body2{%end%}baz;end" parses "macro foo;bar{% if x %}body{% else %}body2{%end%}baz;end" parses "{% begin %}%q< %s >{% end %}" parses "{% begin %}%q< %s >{% end %}" says syntax error on "return 1 foo" says syntax error on "return 1 foo" parses "macro foo;bar{% if x %}body{% elsif y %}body2{%end%}baz;end" parses "macro foo;bar{% if x %}body{% elsif y %}body2{%end%}baz;end" parses "lib LibC\nfun getchar : (->)?\nend" parses "lib LibC\nfun getchar : (->)?\nend" parses "def foo(@[Foo] @[Bar] var : Int32); end" parses "def foo(@[Foo] @[Bar] var : Int32); end" says syntax error on "alias Foo?" says syntax error on "alias Foo?" says syntax error on "<<-FOO\n1\nFOO.bar" says syntax error on "<<-FOO\n1\nFOO.bar" says syntax error on "def foo(def); end" says syntax error on "def foo(def); end" says syntax error on "def foo(foo typeof); end" says syntax error on "def foo(foo typeof); end" says syntax error on "x[1:-2]" says syntax error on "x[1:-2]" parses "x, y, z = <<-FOO, <<-BAR, <<-BAZ\nhello\nFOO\nworld\nBAR\n!\nBAZ" parses "x, y, z = <<-FOO, <<-BAR, <<-BAZ\nhello\nFOO\nworld\nBAR\n!\nBAZ" parses "{a: 1}" parses "{a: 1}" says syntax error on "macro foo(\"\" y); end" says syntax error on "macro foo(\"\" y); end" parses "macro foo(x); 1 + 2; end" parses "macro foo(x); 1 + 2; end" parses "@[Foo::Bar]" parses "@[Foo::Bar]" parses ":\"\\\"foo\"" parses ":\"\\\"foo\"" parses "1 ? a : b ? c : 3" parses "1 ? a : b ? c : 3" parses "\"hello \" \\\r\n \"world\"" parses "\"hello \" \\\r\n \"world\"" parses "f ->{ a do\n end\n }" parses "f ->{ a do\n end\n }" parses "{{ foo &.nil? }}" parses "{{ foo &.nil? }}" parses "def self.foo=\n1\nend" parses "def self.foo=\n1\nend" says syntax error on "{a[]: 1}" says syntax error on "{a[]: 1}" parses "Foo.foo(count: 3).bar { }" parses "Foo.foo(count: 3).bar { }" parses "a[0], a[1] = 1, 2" parses "a[0], a[1] = 1, 2" says syntax error on "next // 1" says syntax error on "next // 1" parses "@@foo/2" parses "@@foo/2" parses "abstract def foo : Int32" parses "abstract def foo : Int32" says syntax error on "foo { |a b| }" says syntax error on "foo { |a b| }" says syntax error on "foo { |(enum)| }" says syntax error on "foo { |(enum)| }" parses "a.foo, *a.bar = 1" parses "a.foo, *a.bar = 1" parses "def foo(var : Int32 -> = 1); end" parses "def foo(var : Int32 -> = 1); end" parses "foo (1 + 2), 3" parses "foo (1 + 2), 3" parses "foo.^ 1, 2" parses "foo.^ 1, 2" parses "macro ^;end" parses "macro ^;end" parses "foo.bar(1, 2)" parses "foo.bar(1, 2)" parses "class Foo; end\nwhile true; end" parses "class Foo; end\nwhile true; end" parses "next *{1, 2}" parses "next *{1, 2}" parses "def foo(@asm); end" parses "def foo(@asm); end" parses "property require : Int32" parses "property require : Int32" parses "def foo(x @require); end" parses "def foo(x @require); end" parses "foo.^(1, 2)" parses "foo.^(1, 2)" parses "property while : Int32" parses "property while : Int32" parses "{foo:\"a\", bar:\"b\"}" parses "{foo:\"a\", bar:\"b\"}" parses "foo = 1; ->foo.<<(Int32)" parses "foo = 1; ->foo.<<(Int32)" parses "module Foo\ndef foo; end; end" parses "module Foo\ndef foo; end; end" parses "def foo(a, &block : Int, self -> Double); end" parses "def foo(a, &block : Int, self -> Double); end" parses "def foo(x = __FILE__); end" parses "def foo(x = __FILE__); end" says syntax error on "def foo(var = 1 : Int32); end" says syntax error on "def foo(var = 1 : Int32); end" says syntax error on "1 ? : 2 : 3" says syntax error on "1 ? : 2 : 3" says syntax error on "def foo(*x, &x); end" says syntax error on "def foo(*x, &x); end" says syntax error on "def foo(var : Foo+); end" says syntax error on "def foo(var : Foo+); end" parses "def =~(); end" parses "def =~(); end" parses "def foo(unless foo); end" parses "def foo(unless foo); end" parses "enum Foo; A = 1\ndef foo; 1; end\ndef bar; 2; end\nend" parses "enum Foo; A = 1\ndef foo; 1; end\ndef bar; 2; end\nend" parses "def foo(protected foo); end" parses "def foo(protected foo); end" parses "macro <=;end" parses "macro <=;end" parses "{% begin %}%Q[ %s ]{% end %}" parses "{% begin %}%Q[ %s ]{% end %}" parses "def foo(x @@true); end" parses "def foo(x @@true); end" parses "class Foo(Type); end" parses "class Foo(Type); end" parses "foo.!" parses "foo.!" says syntax error on "false foo" says syntax error on "false foo" parses "a = 1; a -= 1" parses "a = 1; a -= 1" parses "..2" parses "..2" says syntax error on "foo { |typeof| }" says syntax error on "foo { |typeof| }" parses "{\n1,\n2\n}" parses "{\n1,\n2\n}" parses "begin; 1; ensure; 2; end" parses "begin; 1; ensure; 2; end" parses "pointerof(@a)" parses "pointerof(@a)" parses "def foo(@@false); end" parses "def foo(@@false); end" parses "{/ /, / /}" parses "{/ /, / /}" parses "->Foo.===(Int32)" parses "->Foo.===(Int32)" says syntax error on "<<-FOO\n1\nFOO + 2" says syntax error on "<<-FOO\n1\nFOO + 2" parses "1;-2" parses "1;-2" parses "lib LibC\nfun getchar : Int\nend" parses "lib LibC\nfun getchar : Int\nend" says syntax error on "foo { |fun| }" says syntax error on "foo { |fun| }" parses "1 !~ 2" parses "1 !~ 2" parses "->foo" parses "->foo" parses "<<-'HERE'\n hello \\n world\n \#{1}\n HERE" parses "<<-'HERE'\n hello \\n world\n \#{1}\n HERE" parses "foo.** do end" parses "foo.** do end" parses "lib LibC; struct Foo; x : Int**; end end" parses "lib LibC; struct Foo; x : Int**; end end" parses "1 ensure 2" parses "1 ensure 2" parses "foo.=~" parses "foo.=~" parses "def ==(*args, **opts, &); end" parses "def ==(*args, **opts, &); end" parses "x[..2]" parses "x[..2]" says syntax error on "def foo(foo while); end" says syntax error on "def foo(foo while); end" parses "@[Foo]" parses "@[Foo]" says syntax error on "class Foo; require \"bar\"; end" says syntax error on "class Foo; require \"bar\"; end" parses "def self.!~(); end;" parses "def self.!~(); end;" parses "foo.[]=(1, 2)" parses "foo.[]=(1, 2)" says syntax error on "require 1" says syntax error on "require 1" parses "foo.>=(1, 2)" parses "foo.>=(1, 2)" parses "foo(\na: 1,\n)" parses "foo(\na: 1,\n)" sets correct location of global path in annotation sets correct location of global path in annotation says syntax error on "def foo=(&block); end" says syntax error on "def foo=(&block); end" parses "def foo(instance_sizeof foo); end" parses "def foo(instance_sizeof foo); end" parses "1 && 2" parses "1 && 2" parses "->@@foo.foo=" parses "->@@foo.foo=" parses "foo\n #comment\n .bar" parses "foo\n #comment\n .bar" parses "def foo(x @@until); end" parses "def foo(x @@until); end" parses "->@@foo.foo?" parses "->@@foo.foo?" parses "class Foo(T); end" parses "class Foo(T); end" parses "macro foo;bar{% for x in y %}\\ \n body{% end %}\\ baz;end" parses "macro foo;bar{% for x in y %}\\ \n body{% end %}\\ baz;end" says syntax error on "{{ {% begin %} }}" says syntax error on "{{ {% begin %} }}" parses "macro /;end" parses "macro /;end" parses "foo[\n1\n]" parses "foo[\n1\n]" parses "def foo(@[Foo] @var); end" parses "def foo(@[Foo] @var); end" says syntax error on "def foo(foo module); end" says syntax error on "def foo(foo module); end" parses "x[a: 1, b: 2]" parses "x[a: 1, b: 2]" says syntax error on "def foo(next); end" says syntax error on "def foo(next); end" parses "next {1, 2}" parses "next {1, 2}" says syntax error on "return << 1" says syntax error on "return << 1" parses "def self.!=(); end;" parses "def self.!=(); end;" parses "my_def def foo\nloop do\nend\nend" parses "my_def def foo\nloop do\nend\nend" parses "(1; 2; 3)" parses "(1; 2; 3)" says syntax error on "def foo 1; end" says syntax error on "def foo 1; end" parses "def foo(x @@alias); end" parses "def foo(x @@alias); end" parses "enum Foo; private def foo; 1; end; end" parses "enum Foo; private def foo; 1; end; end" says syntax error on "1 unless break" says syntax error on "1 unless break" parses "macro |;end" parses "macro |;end" parses "Foo(Bar(T | U))" parses "Foo(Bar(T | U))" parses "def foo(nil foo); end" parses "def foo(nil foo); end" parses "require : Int32" parses "require : Int32" parses "def foo(x @pointerof); end" parses "def foo(x @pointerof); end" says syntax error on "next[0]" says syntax error on "next[0]" parses "{% begin %}%x( %s ){% end %}" parses "{% begin %}%x( %s ){% end %}" parses "begin; 1; 2; 3; end;" parses "begin; 1; 2; 3; end;" says syntax error on "{1, ->{ |_| x } }" says syntax error on "{1, ->{ |_| x } }" parses "foo.%" parses "foo.%" parses "x.foo(a: 1, b: 2)" parses "x.foo(a: 1, b: 2)" parses "foo = 1; ->foo.foo" parses "foo = 1; ->foo.foo" parses "foo(a: n << 2)" parses "foo(a: n << 2)" parses "macro x\n%{}\nend" parses "macro x\n%{}\nend" parses "def /(); end;" parses "def /(); end;" says syntax error on "def foo &block ; end" says syntax error on "def foo &block ; end" parses "foo(n > 2)" parses "foo(n > 2)" says syntax error on "def responds_to?; end" says syntax error on "def responds_to?; end" parses "Foo({\"foo bar\": X})" parses "Foo({\"foo bar\": X})" parses "foo &.block = 0" parses "foo &.block = 0" parses "def foo(x, *y : Int32); 1; end" parses "def foo(x, *y : Int32); 1; end" parses "def self.~(); end;" parses "def self.~(); end;" parses "def foo(@@var = 1); 1; end" parses "def foo(@@var = 1); 1; end" parses "foo begin\nbar do\nend\nend" parses "foo begin\nbar do\nend\nend" parses "def foo(x)\n x\nend; foo = 1; b = 2; foo -b" parses "def foo(x)\n x\nend; foo = 1; b = 2; foo -b" parses "Foo({String, ->})" parses "Foo({String, ->})" parses "offsetof(X, 1)" parses "offsetof(X, 1)" parses "def ~; end;" parses "def ~; end;" says syntax error on "pointerof(self)" says syntax error on "pointerof(self)" parses "{% for _, x, _ in y %}body{% end %}" parses "{% for _, x, _ in y %}body{% end %}" parses "f.x >>= 2" parses "f.x >>= 2" parses ":==" parses ":==" parses "foo%w" parses "foo%w" says syntax error on "return do\nend" says syntax error on "return do\nend" says syntax error on "Set {1, 2, 3} of Int32" says syntax error on "Set {1, 2, 3} of Int32" parses "case 1; end" parses "case 1; end" parses "def foo(x @@sizeof); end" parses "def foo(x @@sizeof); end" says syntax error on "foo.&&()" says syntax error on "foo.&&()" parses "Foo{\"x\" => \"y\"}" parses "Foo{\"x\" => \"y\"}" parses "lib LibC; struct Foo; x : Int*; end end" parses "lib LibC; struct Foo; x : Int*; end end" parses "foo.-" parses "foo.-" parses "@[Foo(\"hello\")]" parses "@[Foo(\"hello\")]" parses "foo = 1; foo(+1)" parses "foo = 1; foo(+1)" parses "property yield : Int32" parses "property yield : Int32" parses "def !=; end;" parses "def !=; end;" parses "break" parses "break" says syntax error on "foo { |unless| }" says syntax error on "foo { |unless| }" parses "@@a : Foo" parses "@@a : Foo" parses "a\nunless / /\n/ /\nelse\n/ /\nend" parses "a\nunless / /\n/ /\nelse\n/ /\nend" parses "do : Int32" parses "do : Int32" parses "case 1; when x then 2; else; 3; end" parses "case 1; when x then 2; else; 3; end" parses "a = 1; (a)/b" parses "a = 1; (a)/b" parses "foo[0] = 1" parses "foo[0] = 1" parses "~ 1" parses "~ 1" says syntax error on "foo[return]" says syntax error on "foo[return]" says syntax error on "def foo :String\nend" says syntax error on "def foo :String\nend" parses "def foo(var : Int | Double); end" parses "def foo(var : Int | Double); end" parses "\"hello \#{1}\" \\\n \"\#{2} world\"" parses "\"hello \#{1}\" \\\n \"\#{2} world\"" parses "->() { }" parses "->() { }" parses "1 & 2" parses "1 & 2" parses "a = 1" parses "a = 1" parses "return 1" parses "return 1" parses "!a && b" parses "!a && b" parses "{foo:a, bar:b}" parses "{foo:a, bar:b}" parses "foo %q" parses "foo %q" parses "offsetof : Int32" parses "offsetof : Int32" says syntax error on "return > 1" says syntax error on "return > 1" parses "def foo(x @break); end" parses "def foo(x @break); end" says syntax error on "macro foo;{%end};end" says syntax error on "macro foo;{%end};end" parses "foo(z: 0, a: n &+ 2)" parses "foo(z: 0, a: n &+ 2)" parses "def ==; end;" parses "def ==; end;" sets correct location of private method in enum sets correct location of private method in enum parses "macro foo(x, *y);end" parses "macro foo(x, *y);end" parses "->Foo.foo!" parses "->Foo.foo!" parses "ensure : Int32" parses "ensure : Int32" parses "def >=(other, file = 1); end" parses "def >=(other, file = 1); end" says syntax error on "def foo var; end" says syntax error on "def foo var; end" parses "def <(); end;" parses "def <(); end;" parses "def foo(@@pointerof); end" parses "def foo(@@pointerof); end" parses "macro foo;if var;true;end;end" parses "macro foo;if var;true;end;end" parses "{1 => 2, 3 => 4}" parses "{1 => 2, 3 => 4}" says syntax error on "foo { |(end)| }" says syntax error on "foo { |(end)| }" parses "->foo!" parses "->foo!" parses "property elsif : Int32" parses "property elsif : Int32" says syntax error on "{a: 1, \"\": 2}" says syntax error on "{a: 1, \"\": 2}" parses "foo = 1; ->foo.>>(Int32)" parses "foo = 1; ->foo.>>(Int32)" parses "def foo(\nvar); end" parses "def foo(\nvar); end" says syntax error on "{\n1 => 2, 3 => 4\n5 => 6}" says syntax error on "{\n1 => 2, 3 => 4\n5 => 6}" says syntax error on "foo { |case| }" says syntax error on "foo { |case| }" parses "/ /; / /" parses "/ /; / /" parses "lib LibC; fun foo(a : Int*); end" parses "lib LibC; fun foo(a : Int*); end" parses "foo.!~(1, 2) { 3 }" parses "foo.!~(1, 2) { 3 }" says syntax error on "1 until 3" says syntax error on "1 until 3" parses "foo &.block" parses "foo &.block" says syntax error on "{1, ->{ |x| x } }" says syntax error on "{1, ->{ |x| x } }" parses "def foo(@while); end" parses "def foo(@while); end" parses "->Foo.<(Int32)" parses "->Foo.<(Int32)" parses "enum Foo::Bar; A = 1; end" parses "enum Foo::Bar; A = 1; end" Semantic: struct errors if defining finalize for struct (#3840) errors if defining finalize for struct (#3840) passes subtype check with generic module type on virtual type (2) (#10302) passes subtype check with generic module type on virtual type (2) (#10302) can't extend struct from non-abstract struct can't extend struct from non-abstract struct unifies type to virtual type unifies type to virtual type doesn't make virtual for Struct doesn't make virtual for Struct doesn't error if method is not found in abstract type doesn't error if method is not found in abstract type can't reopen as module can't reopen as module allows struct to participate in virtual allows struct to participate in virtual passes subtype check with generic module type on virtual type passes subtype check with generic module type on virtual type can't extend class from struct can't extend class from struct passes subtype check with generic module type on virtual type (3) passes subtype check with generic module type on virtual type (3) can't be nilable can't be nilable types struct declaration types struct declaration types generic struct declaration types generic struct declaration doesn't make virtual for Int doesn't make virtual for Int can cast to base abstract struct can cast to base abstract struct doesn't make virtual for Float doesn't make virtual for Float can't reopen as class can't reopen as class can't extend struct from class can't extend struct from class doesn't make virtual for Value doesn't make virtual for Value Crystal::Doc::MarkdDocRenderer renders code blocks renders "```\nHello\nWorld\n```" renders "```\nHello\nWorld\n```" renders "```crystal\nHello\nWorld\n```" renders "```crystal\nHello\nWorld\n```" renders "```cr\nHello\nWorld\n```" renders "```cr\nHello\nWorld\n```" renders html renders "

Foo

" renders "

Foo

" renders code spans renders "`