Обработка конфликтов между RBI-файлами типа sorbet и gems

Я установил Sorbet в базу кода Rails и вижу много случаев следующей ошибки:

sorbet/rbi/sorbet-typed/lib/activerecord/all/activerecord.rbi:958:
Method ActiveRecord::ConnectionAdapters::TableDefinition#column redefined without matching argument count. Expected: 3, got: 5 https://srb.help/4010
     958 |  def column(
     959 |    name,
     960 |    type,
     961 |    index: nil,
     962 |    default: nil,
     963 |    **options
     964 |  ); end
    sorbet/rbi/gems/activerecord.rbi:5256: Previous definition
    5256 |  def column(name, type, **options); end

Чтобы ошибки типа исчезли, мне нужно либо изменить typed: true на typed: false в одном из файлов (что исключает некоторые типы, которые не перекрываются), либо мне нужно вручную войти и удалить/закомментировать перекрывающиеся методы (что отнимает много времени и является хрупким).

Мне интересно, есть ли какое-то программное решение, где я могу сказать «в случае конфликта используйте метод с более высокой арностью» или «всегда выбирайте определение типа сорбета».

Опять же, это в кодовой базе Rails, но я полагаю, что это будет существовать для любого конфликта между сгенерированными вручную и автоматически сгенерированными RBI.


person SRM    schedule 06.01.2020    source источник


Ответы (1)


Я написал некоторые из этих методов, но, к сожалению, поскольку "Shapes" (экспериментальная реализация типизируемых хэшей Sorbet) не допускает необязательных ключей, их нельзя использовать для точного представления этих методов. В результате арность многих методов — особенно сложных вещей в Rails — различается между файлами, набранными сорбетом, и файлами, сгенерированными сорбетом автоматически.

Я только что использовал srb rbi suggest-typed для автоматической установки типизации файлов в моем репо, и он просто помечает их как ложные. Насколько я могу судить, информация о типе из sorbet-typed по-прежнему используется, даже если файл помечен как ложный (хотя, вероятно, мне следует изучить это подробнее, чтобы убедиться, что это так).

К сожалению, на данный момент у меня нет лучшего решения проблемы, но мне пока достаточно просто использовать типизированный тип предложения.

person Connor Shea    schedule 06.01.2020