Class: YARD::CodeObjects::MacroObject
- Defined in:
- lib/yard/code_objects/macro_object.rb
Overview
A MacroObject represents a docstring defined through @!macro NAME and can be reused by specifying the tag @!macro NAME. You can also provide the attached
type flag to the macro definition to have it attached to the specific DSL method so it will be implicitly reused.
Macros are fully described in the Tags Overview document.
Constant Summary collapse
- MACRO_MATCH =
/(\\)?\$(?:\{(-?\d+|\*)(-)?(-?\d+)?\}|(-?\d+|\*))/
Instance Attribute Summary collapse
-
#macro_data ⇒ String
The macro data stored on the object.
-
#method_object ⇒ CodeObjects::Base
The method object that this macro is attached to.
Class Method Summary collapse
-
.apply(docstring, call_params = [], full_source = '', block_source = '', method_object = nil) ⇒ String
Applies a macro on a docstring by creating any macro data inside of the docstring first.
-
.apply_macro(macro, docstring, call_params = [], full_source = '', block_source = '') ⇒ String
Applies a macro to a docstring, interpolating the macro’s data on the docstring and appending any extra local docstring data that was in the original
docstring
object. -
.create(macro_name, data, method_object = nil) ⇒ MacroObject
Creates a new macro and fills in the relevant properties.
-
.expand(macro_data, call_params = [], full_source = '', block_source = '') ⇒ Object
Expands
macro_data
using the interpolation parameters. -
.find(macro_name) ⇒ MacroObject?
Finds a macro using
macro_name
. -
.find_or_create(macro_name, data, method_object = nil) ⇒ MacroObject?
(also: create_docstring)
Parses a given docstring and determines if the macro is “new” or not.
Instance Method Summary collapse
-
#attached? ⇒ Boolean
Whether this macro is attached to a method.
-
#expand(call_params = [], full_source = '', block_source = '') ⇒ Object
Expands the macro using.
-
#path ⇒ Object
Overrides Base#path so the macro path is “.macro.MACRONAME”.
-
#sep ⇒ Object
Overrides the separator to be ‘.’.
Constructor Details
This class inherits a constructor from YARD::CodeObjects::Base
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class YARD::CodeObjects::Base
Instance Attribute Details
#macro_data ⇒ String
Returns the macro data stored on the object.
142 143 144 |
# File 'lib/yard/code_objects/macro_object.rb', line 142 def macro_data @macro_data end |
#method_object ⇒ CodeObjects::Base
Returns the method object that this macro is attached to.
146 147 148 |
# File 'lib/yard/code_objects/macro_object.rb', line 146 def method_object @method_object end |
Class Method Details
.apply(docstring, call_params = [], full_source = '', block_source = '', method_object = nil) ⇒ String
Applies a macro on a docstring by creating any macro data inside of the docstring first. Equivalent to calling find_or_create and apply_macro on the new macro object.
120 121 122 123 124 125 126 127 128 |
# File 'lib/yard/code_objects/macro_object.rb', line 120 def apply(docstring, call_params = [], full_source = '', block_source = '', method_object = nil) docstring = docstring.all if Docstring === docstring parser = Docstring.parser handler = OpenStruct.new handler.call_params = call_params[1..-1] handler.caller_method = call_params.first handler.statement = OpenStruct.new(:source => full_source) parser.parse(docstring, nil, handler).to_docstring.to_raw end |
.apply_macro(macro, docstring, call_params = [], full_source = '', block_source = '') ⇒ String
Applies a macro to a docstring, interpolating the macro’s data on the docstring and appending any extra local docstring data that was in the original docstring
object.
136 137 138 |
# File 'lib/yard/code_objects/macro_object.rb', line 136 def apply_macro(macro, docstring, call_params = [], full_source = '', block_source = '') apply(docstring, call_params, full_source, block_source) end |
.create(macro_name, data, method_object = nil) ⇒ MacroObject
Creates a new macro and fills in the relevant properties.
39 40 41 42 43 44 |
# File 'lib/yard/code_objects/macro_object.rb', line 39 def create(macro_name, data, method_object = nil) obj = new(:root, macro_name) obj.macro_data = data obj.method_object = method_object obj end |
.expand(macro_data, call_params = [], full_source = '', block_source = '') ⇒ Object
Expands macro_data
using the interpolation parameters.
Interpolation rules:
-
$0, $1, $2, … = the Nth parameter in
call_params
-
$* = the full statement source (excluding block)
-
Also supports ${N-M} ranges, as well as negative indexes on N or M
-
Use $ to escape the variable name in a macro.
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/yard/code_objects/macro_object.rb', line 96 def (macro_data, call_params = [], full_source = '', block_source = '') macro_data = macro_data.all if macro_data.is_a?(Docstring) macro_data.gsub(MACRO_MATCH) do escape, first, last, rng = $1, $2 || $5, $4, $3 ? true : false next $&[1..-1] if escape if first == '*' last ? $& : full_source else first_i = first.to_i last_i = (last ? last.to_i : call_params.size) last_i = first_i unless rng params = call_params[first_i..last_i] params ? params.join(", ") : '' end end end |
.find(macro_name) ⇒ MacroObject?
Finds a macro using macro_name
50 51 52 |
# File 'lib/yard/code_objects/macro_object.rb', line 50 def find(macro_name) Registry.at('.macro.' + macro_name.to_s) end |
.find_or_create(macro_name, data, method_object = nil) ⇒ MacroObject? Also known as: create_docstring
Parses a given docstring and determines if the macro is “new” or not. If the macro has $variable names or if it has a @!macro tag with the [new] or [attached] flag, it is considered new.
If a new macro is found, the macro is created and registered. Otherwise the macro name is searched and returned. If a macro is not found, nil is returned.
70 71 72 73 74 75 76 |
# File 'lib/yard/code_objects/macro_object.rb', line 70 def find_or_create(macro_name, data, method_object = nil) if macro = find(name) macro else create(macro_name, data, method_object) end end |
Instance Method Details
#attached? ⇒ Boolean
Returns whether this macro is attached to a method.
149 |
# File 'lib/yard/code_objects/macro_object.rb', line 149 def attached?; method_object ? true : false end |
#expand(call_params = [], full_source = '', block_source = '') ⇒ Object
Expands the macro using
167 168 169 |
# File 'lib/yard/code_objects/macro_object.rb', line 167 def (call_params = [], full_source = '', block_source = '') self.class.(macro_data, call_params, full_source, block_source) end |
#path ⇒ Object
Overrides Base#path so the macro path is “.macro.MACRONAME”
152 |
# File 'lib/yard/code_objects/macro_object.rb', line 152 def path; '.macro.' + name.to_s end |
#sep ⇒ Object
Overrides the separator to be ‘.’
155 |
# File 'lib/yard/code_objects/macro_object.rb', line 155 def sep; '.' end |