Sija/raven.cr

Issue with raven.cr and Hash/Array inheritance

mamantoha opened this issue · 1 comments

Hi.

I face an issue when trying to use raven.cr with jennifer.cr.

Module validation failed: Function return type does not match operand type of return inst!
  ret %"(Array(AnyHash::JSONTypes::Value) | Bool | Float32 | Float64 | Hash(String | Symbol, AnyHash::JSONTypes::Value)+ | Int128 | Int16 | Int32 | Int64 | Int8 | JSON::Any | Set(AnyHash::JSONTypes::Value) | String | Symbol | Time | UInt128 | UInt16 | UInt32 | UInt64 | UInt8 | Nil)" %1, !dbg !21
 %"(Array(AnyHash::JSONTypes::Value) | Bool | Float32 | Float64 | Hash(String | Symbol, AnyHash::JSONTypes::Value) | Int128 | Int16 | Int32 | Int64 | Int8 | JSON::Any | Set(AnyHash::JSONTypes::Value) | String | Symbol | Time | UInt128 | UInt16 | UInt32 | UInt64 | UInt8 | Nil)" = type { i32, [3 x i64] } (Exception)
  from ???
  from ???
  from ???
  from ???
  from ???
  from ???
  from ???
  from ???
  from ???
  from ???
Error: you've found a bug in the Crystal compiler. Please open an issue, including source code that will allow us to reproduce the bug: https://github.com/crystal-lang/crystal/issues

I made some research, and this is the minimal code to reproduce this issue.

require "raven"

class MyHash(V) < Hash(String, V)
  # Code.
  # Actually, it doesn't matter.
end

begin
  1 / 0
rescue ex : DivisionByZeroError
  Raven.capture(ex)
end

The same with Array.

Sija commented

Yep, that's a known limitation of raven.cr (yet inheriting from stdlib imo is a design smell).

I'd suggest to refactor the offending code with composition in mind.
For more information see:

PRs fixing this behavior are always welcome :)