-
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 on 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 your type signatures compact and clean.
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, which is declared with require: false in Gemfile.
gem 'steep', require: false # You usually don't need type definitions of SteepYou 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)