Module: CrystalRuby::Adapter
- Defined in:
- lib/crystalruby/adapter.rb
Instance Method Summary collapse
-
#CRType(&block) ⇒ Object
This method provides a useful DSL for defining Crystal types in pure Ruby MyType = CRType{ Int32 | Hash(String, Array(Bool) | Float65 | Nil) }.
-
#crystal(raw: false, lib: "crystalruby", &block) ⇒ Object
Use this method to define inline Crystal code that does not need to be bound to a Ruby method.
-
#crystalize(returns = :void, raw: false, async: false, lib: "crystalruby", &block) ⇒ Object
Use this method to annotate a Ruby method that should be crystalized.
-
#expose_to_crystal(returns = :void, libs: ["crystalruby"]) ⇒ Object
Exposes a Ruby method to one or more Crystal libraries.
-
#shard(shard_name, lib: 'crystalruby', **opts) ⇒ Object
Define a shard dependency This dependency will be automatically injected into the shard.yml file for the given library and installed upon compile if it is not already installed.
Instance Method Details
#CRType(&block) ⇒ Object
This method provides a useful DSL for defining Crystal types in pure Ruby MyType = CRType{ Int32 | Hash(String, Array(Bool) | Float65 | Nil) }
98 99 100 |
# File 'lib/crystalruby/adapter.rb', line 98 def CRType(&block) TypeBuilder.build_from_source(block, context: self) end |
#crystal(raw: false, lib: "crystalruby", &block) ⇒ Object
Use this method to define inline Crystal code that does not need to be bound to a Ruby method. This is useful for defining classes, modules, performing set-up tasks etc. See: docs for .crystalize to understand the ‘raw` and `lib` parameters.
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/crystalruby/adapter.rb', line 77 def crystal(raw: false, lib: "crystalruby", &block) inline_crystal_body = respond_to?(:name) ? Template::InlineChunk.render( { module_name: name, body: SourceReader.extract_source_from_proc(block, raw: raw), mod_or_class: self.kind_of?(Class) && self < Types::Type ? "class" : "module", superclass: self.kind_of?(Class) && self < Types::Type ? "< #{self.crystal_supertype}" : "" }) : SourceReader.extract_source_from_proc(block, raw: raw) CrystalRuby::Library[lib].crystalize_chunk( self, Digest::MD5.hexdigest(inline_crystal_body), inline_crystal_body ) end |
#crystalize(returns = :void, raw: false, async: false, lib: "crystalruby", &block) ⇒ Object
Use this method to annotate a Ruby method that should be crystalized. Compilation and attachment of the method is done lazily. You can force compilation by calling ‘CrystalRuby.compile!` It’s important that all code using crystalized methods is loaded before any manual calls to compile.
E.g.
crystalize :int32 def add(a: :int32, b: :int32)
a + b
end
Pass ‘raw: true` to pass Raw crystal code to the compiler as a string instead. (Useful for cases where the Crystal method body is not valid Ruby) E.g. crystalize :int32, raw: true def add(a: :int32, b: :int32)
<<~CRYSTAL
a + b
CRYSTAL
end
Pass ‘async: true` to make the method async. Crystal methods will always block the currently executing Ruby thread. With async: false, all other Crystal code will be blocked while this Crystal method is executing (similar to Ruby code with the GVL) With async: true, several Crystal methods can be executing concurrently.
Pass lib: “name_of_lib” to compile Crystal code into several distinct libraries. This can help keep compilation times low, by packaging your Crystal code into separate shared objects.
39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/crystalruby/adapter.rb', line 39 def crystalize( returns=:void, raw: false, async: false, lib: "crystalruby", &block) (self == TOPLEVEL_BINDING.receiver ? Object : self).instance_eval do @crystalize_next = { raw: raw, async: async, returns: returns, block: block, lib: lib } end end |
#expose_to_crystal(returns = :void, libs: ["crystalruby"]) ⇒ Object
Exposes a Ruby method to one or more Crystal libraries. Type annotations follow the same rules as the ‘crystalize` method, but are applied in reverse.
58 59 60 61 62 63 64 65 |
# File 'lib/crystalruby/adapter.rb', line 58 def expose_to_crystal( returns=:void, libs: ["crystalruby"]) (self == TOPLEVEL_BINDING.receiver ? Object : self).instance_eval do @expose_next_to_crystal = { returns: returns, libs: libs } end end |
#shard(shard_name, lib: 'crystalruby', **opts) ⇒ Object
Define a shard dependency This dependency will be automatically injected into the shard.yml file for the given library and installed upon compile if it is not already installed.
70 71 72 |
# File 'lib/crystalruby/adapter.rb', line 70 def shard(shard_name, lib: 'crystalruby', **opts) CrystalRuby::Library[lib].require_shard(shard_name, **opts) end |