Crystal 0.19 breaks Crinja

In GitHub - ralsina/nicolino: A not-quite-minimalistic SSG written in Crystal if I upgrade to 0.19 build fails with this weird backtrace, all inside crinja:

nicolino on  main [$⇡] is 📦 v0.10.0 via 🔮 v1.19.0 took 11s
> shards build --error-trace
Dependencies are satisfied
Building: nicolino
Error target nicolino failed to compile:
In lib/crinja/src/lib/filter/collections.cr:2:10

 2 | Crinja.filter :list do
            ^-----
Error: expanding macro


In lib/crinja/src/lib/filter/collections.cr:2:3

 2 | Crinja.filter :list do
     ^
Error: expanding macro


There was a problem expanding macro 'filter'

Called macro defined in lib/crinja/src/runtime/callable.cr:67:3

 67 | macro filter(defaults = nil, name = nil, &block)

Which expanded to:

 >  1 |     Crinja.callable(Crinja::Filter, :list, nil) do
    2 |       target = arguments.target!
    3 |
    4 |       begin
    5 | value = target.raw
    6 |
    7 | case value
    8 | when String
    9 |   value.chars
   10 | when Array
   11 |   value
   12 | when .responds_to?(:to_a)
   13 |   target.to_a
   14 | else
   15 |   raise(TypeError.new("target for list filter cannot be converted to list"))
   16 | end
   17 |  end
   18 |     end
   19 |
Error: expanding macro


In lib/crinja/src/lib/filter/collections.cr:11:14

 11 | target.to_a
             ^---
Error: instantiating 'Crinja::Value#to_a()'


In lib/crinja/src/runtime/value.cr:404:5

 404 | each do |item|
       ^---
Error: instantiating 'each()'


In lib/crinja/src/runtime/value.cr:260:5

 260 | raw_each do |raw|
       ^-------
Error: instantiating 'raw_each()'


In lib/crinja/src/runtime/value.cr:244:14

 244 | object.each { |value| yield value.as(Value).raw }
              ^---
Error: instantiating '(Array(Crinja::Value) | Crinja::Function::Cycler | Crinja::Tuple | Iterator(Crinja::Value))#each(


In /usr/lib/crystal/iterator.cr:649:20

 649 | value = self.next
                    ^---
Error: instantiating 'Crinja::Tag::For::ConditionalIterator#next()'


In lib/crinja/src/lib/tag/for.cr:116:7

 116 | loop do
       ^---
Error: instantiating 'loop()'


In lib/crinja/src/lib/tag/for.cr:116:7

 116 | loop do
       ^---
Error: instantiating 'loop()'


In lib/crinja/src/lib/tag/for.cr:121:27

 121 | if @env.evaluator.value(@condition).truthy?
                         ^----
Error: instantiating 'Crinja::Evaluator#value(Crinja::AST::ExpressionNode+)'


In lib/crinja/src/runtime/evaluator.cr:12:15

 12 | Value.new evaluate(expression)
                ^-------
Error: instantiating 'evaluate(Crinja::AST::ExpressionNode+)'


In lib/crinja/src/runtime/evaluator.cr:54:12

 54 | left = evaluate expression.left
             ^-------
Error: instantiating 'evaluate(Crinja::AST::ExpressionNode+)'


In lib/crinja/src/runtime/evaluator.cr:69:13

 69 | right = evaluate expression.right
              ^-------
Error: instantiating 'evaluate(Crinja::AST::ExpressionNode+)'


In lib/crinja/src/runtime/evaluator.cr:85:18

 85 | callable = call_on_member(identifier)
                 ^-------------
Error: instantiating 'call_on_member(Crinja::AST::MemberExpression)'


In lib/crinja/src/runtime/evaluator.cr:113:18

 113 | identifier = evaluate expression.identifier
                    ^-------
Error: instantiating 'evaluate(Crinja::AST::ExpressionNode+)'


In lib/crinja/src/runtime/evaluator.cr:155:14

 155 | object = value! expression.identifier
                ^-----
Error: instantiating 'value!(Crinja::AST::ExpressionNode+)'


In lib/crinja/src/runtime/evaluator.cr:26:32

 26 | raise UndefinedError.new(name_for_expression(expression))
                               ^------------------
Error: instantiating 'name_for_expression(Crinja::AST::ExpressionNode+)'


In lib/crinja/src/runtime/evaluator.cr:200:8

 200 | "#{name_for_expression(expression.identifier)}.#{expression.member.name}"
          ^------------------
Error: instantiating 'name_for_expression(Crinja::AST::ExpressionNode+)'


In lib/crinja/src/runtime/evaluator.cr:204:54

 204 | "#{name_for_expression(expression.identifier)}[#{evaluate expression.argument}]"
                                                        ^-------
Error: instantiating 'evaluate(Crinja::AST::ExpressionNode+)'


In lib/crinja/src/runtime/evaluator.cr:176:24

 176 | value = Resolver.resolve_attribute(argument, object)
                        ^----------------
Error: instantiating 'Crinja::Resolver.resolve_attribute((Array(Crinja::Value) | Bool | Crinja::Value | Float64 | Hash(Crinja::Value, Crinja::Value) | Int64 | String | Nil), Crinja::Value)'


In lib/crinja/src/runtime/resolver.cr:7:18

 7 | value = self.resolve_getattr(name, object)
                  ^--------------
Error: instantiating 'Crinja::Resolver.resolve_getattr((Array(Crinja::Value) | Bool | Crinja::Value | Float64 | Hash(Crinja::Value, Crinja::Value) | Int64 | String | Nil), Crinja::Value)'


In lib/crinja/src/runtime/resolver.cr:31:12

 31 | self.resolve_with_hash_accessor(name, value)
           ^-------------------------
Error: instantiating 'Crinja::Resolver.resolve_with_hash_accessor(Crinja::Value, Crinja::Value)'


In lib/crinja/src/runtime/resolver.cr:58:32

 58 | return Value.new object[name.to_s]
                             ^
Error: no overload matches 'Proc(Crinja::Arguments, Crinja::Value)#[]' with type String

Overloads are:
 - Proc(*T, R)#[](*args : *T)

This is fixed in master: Add Proc check in resolve_with_hash_accessor method by kalinon · Pull Request #94 · straight-shoota/crinja · GitHub

1 Like