-
Notifications
You must be signed in to change notification settings - Fork 227
Release Note 3.0
RBS 3.0 is a pre-release version. You can install the development version for testing.
Some of the highlights in RBS 3.0 are:
- Add class/module alias syntax (#1219)
- Add
usesyntax (#1224) - RBS collection skips loading
require: falsegems (#1222) - The bundled
coreRBS signatures are upgraded to Ruby 3.2 (TBD)
You can install it with $ gem install rbs --pre or using Bundler.
gem 'rbs', '~> 3.0.0.dev'See the CHANGELOG for the details.
There are breaking changes in APIs from RBS 2.8. Read the upgrade guide below if you develop with RBS library.
The spec: https://hackmd.io/@soutaro/HkgF2HHco
The class/module alias syntax allows defining alias of classes and modules.
class HashWithIndifferentAccess = ActiveSupport::HashWithIndifferentAccessThe sample code above defines ::HashWithIndifferentAccess that is another name of ::ActiveSupport::HashWithIndifferentAccess.
The difference between type alias syntax is that it is a class/module. So you can inherit from the alias class or mixin the alias modules.
class MyHash < HashWithIndifferentAccess
endThe type definition corresponds to the following Ruby code that defines a constant.
HashWithIndifferentAccess = ActiveSupport::HashWithIndifferentAccessThe spec: https://hackmd.io/@soutaro/rJ6CqDQss
The use syntax also defines alias names of type names, but unlike the class alias syntax, no constant is defined and it works for per-file basis.
use RBS::TypeName
use RBS::Namespace as NS
use RBS::AST::Declarations::*With the directives, you can use TypeName for ::RBS::TypeName, NS for ::RBS::Namespace, and all types names under ::RBS::AST::Declarations with unqualified names.
This is an RBS specific feature that has no corresponding Ruby code. This helps keeping type signatures compact/clean/streamlined.
Both libraries and applications are bundled with Bundler -- libraries are loaded in your application, but apps are not. Apps are executed in different process, and your Ruby code doesn't depends the classes/modules of the app dependencies.
RBS collection now skips loading RBS files of app dependencies, if the dependency is declared with require: false in Gemfile.
gem 'steep', require: false # Steep is a type checker and usually apps don't need its type definitionYou may have written rbs_collection.yaml entry to skip loading RBS of a gem.
gems:
- name: steep
ignore: true
- name: rbs
ignore: true
You can delete the lines, and just add require: false in your Gemfile instead.
To upgrade to the latest setup, edit the Gemfile and rbs_collection.yaml, run $ rbs collection update, and commit the updated rbs_collection.lock.yaml.
RBS 3.0 has several breaking changes. This section explains the overview of the incompatibilities to help you making your Ruby code work with 3.0.
-
RBS::AST::Declarations::Aliasis now renamed toTypeAlias -
RBS::AST::Declarations::ClassAliasandRBS::AST::Declarations::ModuleAliasare added -
RBS::AST::Declarations::tnow hasClassAliasandModuleAlias
-
RBS::AST::Directivesis added forusedirective
-
RBS::AST::Members::MethodDefinition::Overloadis added -
RBS::AST::Members::MethodDefinition#method_typesis renamed to#overloads -
RBS::AST::Members::MethodDefinition#overload?is renamed to#overloading?
- The deprecated overloadings with
line:andcolumn:keywords ofRBS::Parser.parse_method_typeandRBS::Parser.parse_typeare deleted -
RBS::Parser.parse_signaturenow returns a triple ofRBS::Buffer,Array[RBS::AST::Directives::t], andArray[RBS::AST::Declarations::t] -
RBS::EnvironmentLoader#each_signatureis added, and#each_declis deleted
-
RBS::Environment::ModuleEntryandRBS::Environment::ClassEntryare added, replacing usages ofMultiEntry[T] -
RBS::Environment::ModuleAliasEntry,RBS::Environment::ClassAliasEntry,RBS::Environment::InterfaceEntry,RBS::Environment::ConstantEntry, andRBS::Environment::GlobalEntryare added, replacing usage ofSingleEntry[N, T] -
RBS::Environment#add_signatureis introduced to supportusedirectives, you can use the method instead of#<< - Many utility methods are added, like
module_name?,constant_entry, ... Use those methods instead of directly accessing the internal data structures like#class_declsand#type_alias_decls(renamed from#alias_decls)