yard 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of yard might be problematic. Click here for more details.
- data/LICENSE +1 -1
- data/README.markdown +200 -0
- data/Rakefile +6 -1
- data/benchmarks/format_args.rb +46 -0
- data/benchmarks/parsing.rb +13 -1
- data/benchmarks/rdoc_vs_yardoc.rb +10 -0
- data/benchmarks/ripper_parser.rb +12 -0
- data/docs/CODE_OBJECTS.markdown +121 -0
- data/docs/FAQ.markdown +34 -0
- data/docs/GENERATORS.markdown +211 -0
- data/docs/GETTING_STARTED.markdown +263 -0
- data/docs/GLOSSARY.markdown +13 -0
- data/docs/HANDLERS.markdown +158 -0
- data/docs/OVERVIEW.markdown +64 -0
- data/docs/PARSER.markdown +180 -0
- data/docs/TAGS.markdown +181 -0
- data/docs/WHATSNEW.markdown +96 -0
- data/docs/images/code-objects-class-diagram.png +0 -0
- data/docs/images/handlers-class-diagram.png +0 -0
- data/docs/images/overview-class-diagram.png +0 -0
- data/docs/images/parser-class-diagram.png +0 -0
- data/docs/images/tags-class-diagram.png +0 -0
- data/lib/yard.rb +4 -1
- data/lib/yard/autoload.rb +79 -31
- data/lib/yard/cli/yard_graph.rb +8 -2
- data/lib/yard/cli/yardoc.rb +61 -8
- data/lib/yard/code_objects/base.rb +78 -135
- data/lib/yard/code_objects/class_object.rb +9 -8
- data/lib/yard/code_objects/constant_object.rb +1 -0
- data/lib/yard/code_objects/extended_method_object.rb +9 -0
- data/lib/yard/code_objects/method_object.rb +18 -5
- data/lib/yard/code_objects/module_object.rb +8 -1
- data/lib/yard/code_objects/namespace_object.rb +25 -16
- data/lib/yard/code_objects/proxy.rb +22 -22
- data/lib/yard/core_ext/file.rb +1 -1
- data/lib/yard/core_ext/string.rb +0 -4
- data/lib/yard/core_ext/symbol_hash.rb +3 -2
- data/lib/yard/docstring.rb +180 -0
- data/lib/yard/generators/base.rb +33 -13
- data/lib/yard/generators/class_generator.rb +4 -2
- data/lib/yard/generators/constants_generator.rb +3 -2
- data/lib/yard/generators/full_doc_generator.rb +76 -9
- data/lib/yard/generators/helpers/base_helper.rb +18 -1
- data/lib/yard/generators/helpers/filter_helper.rb +2 -2
- data/lib/yard/generators/helpers/html_helper.rb +94 -39
- data/lib/yard/generators/helpers/html_syntax_highlight_helper.rb +49 -0
- data/lib/yard/generators/helpers/markup_helper.rb +86 -0
- data/lib/yard/generators/helpers/method_helper.rb +23 -7
- data/lib/yard/generators/method_generator.rb +15 -3
- data/lib/yard/generators/method_listing_generator.rb +3 -3
- data/lib/yard/generators/mixins_generator.rb +8 -2
- data/lib/yard/generators/module_generator.rb +3 -2
- data/lib/yard/generators/overloads_generator.rb +20 -0
- data/lib/yard/generators/quick_doc_generator.rb +3 -9
- data/lib/yard/generators/root_generator.rb +32 -0
- data/lib/yard/generators/source_generator.rb +2 -17
- data/lib/yard/generators/tags_generator.rb +34 -6
- data/lib/yard/generators/uml_generator.rb +16 -6
- data/lib/yard/handlers/base.rb +88 -253
- data/lib/yard/handlers/processor.rb +72 -0
- data/lib/yard/handlers/ruby/alias_handler.rb +38 -0
- data/lib/yard/handlers/ruby/attribute_handler.rb +69 -0
- data/lib/yard/handlers/ruby/base.rb +72 -0
- data/lib/yard/handlers/ruby/class_condition_handler.rb +70 -0
- data/lib/yard/handlers/ruby/class_handler.rb +74 -0
- data/lib/yard/handlers/ruby/class_variable_handler.rb +11 -0
- data/lib/yard/handlers/ruby/constant_handler.rb +12 -0
- data/lib/yard/handlers/ruby/exception_handler.rb +22 -0
- data/lib/yard/handlers/ruby/extend_handler.rb +19 -0
- data/lib/yard/handlers/{alias_handler.rb → ruby/legacy/alias_handler.rb} +3 -4
- data/lib/yard/handlers/{attribute_handler.rb → ruby/legacy/attribute_handler.rb} +2 -2
- data/lib/yard/handlers/ruby/legacy/base.rb +198 -0
- data/lib/yard/handlers/{class_handler.rb → ruby/legacy/class_handler.rb} +18 -6
- data/lib/yard/handlers/{class_variable_handler.rb → ruby/legacy/class_variable_handler.rb} +1 -1
- data/lib/yard/handlers/{constant_handler.rb → ruby/legacy/constant_handler.rb} +2 -2
- data/lib/yard/handlers/{exception_handler.rb → ruby/legacy/exception_handler.rb} +3 -3
- data/lib/yard/handlers/ruby/legacy/extend_handler.rb +18 -0
- data/lib/yard/handlers/ruby/legacy/method_handler.rb +31 -0
- data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +28 -0
- data/lib/yard/handlers/{module_handler.rb → ruby/legacy/module_handler.rb} +1 -1
- data/lib/yard/handlers/{visibility_handler.rb → ruby/legacy/visibility_handler.rb} +1 -1
- data/lib/yard/handlers/{yield_handler.rb → ruby/legacy/yield_handler.rb} +4 -4
- data/lib/yard/handlers/ruby/method_condition_handler.rb +7 -0
- data/lib/yard/handlers/ruby/method_handler.rb +48 -0
- data/lib/yard/handlers/ruby/mixin_handler.rb +25 -0
- data/lib/yard/handlers/ruby/module_handler.rb +9 -0
- data/lib/yard/handlers/ruby/visibility_handler.rb +18 -0
- data/lib/yard/handlers/ruby/yield_handler.rb +28 -0
- data/lib/yard/parser/ruby/ast_node.rb +263 -0
- data/lib/yard/parser/{ruby_lex.rb → ruby/legacy/ruby_lex.rb} +258 -259
- data/lib/yard/parser/{statement.rb → ruby/legacy/statement.rb} +8 -4
- data/lib/yard/parser/ruby/legacy/statement_list.rb +262 -0
- data/lib/yard/parser/{token_list.rb → ruby/legacy/token_list.rb} +1 -1
- data/lib/yard/parser/ruby/ruby_parser.rb +307 -0
- data/lib/yard/parser/source_parser.rb +76 -45
- data/lib/yard/rake/yardoc_task.rb +6 -1
- data/lib/yard/registry.rb +45 -19
- data/lib/yard/serializers/file_system_serializer.rb +8 -3
- data/lib/yard/tags/default_factory.rb +70 -10
- data/lib/yard/tags/default_tag.rb +12 -0
- data/lib/yard/tags/library.rb +65 -26
- data/lib/yard/tags/option_tag.rb +12 -0
- data/lib/yard/tags/overload_tag.rb +62 -0
- data/lib/yard/tags/ref_tag.rb +7 -0
- data/lib/yard/tags/ref_tag_list.rb +27 -0
- data/lib/yard/tags/tag.rb +1 -0
- data/lib/yard/tags/tag_format_error.rb +6 -0
- data/spec/cli/yardoc_spec.rb +43 -0
- data/spec/code_objects/base_spec.rb +56 -68
- data/spec/code_objects/class_object_spec.rb +18 -6
- data/spec/code_objects/constants_spec.rb +2 -0
- data/spec/code_objects/method_object_spec.rb +33 -5
- data/spec/code_objects/module_object_spec.rb +66 -8
- data/spec/code_objects/namespace_object_spec.rb +37 -17
- data/spec/code_objects/proxy_spec.rb +13 -2
- data/spec/core_ext/string_spec.rb +14 -2
- data/spec/core_ext/symbol_hash_spec.rb +9 -3
- data/spec/docstring_spec.rb +139 -0
- data/spec/generators/full_doc_generator_spec.rb +29 -0
- data/spec/generators/helpers/html_helper_spec.rb +74 -0
- data/spec/generators/helpers/markup_helper_spec.rb +95 -0
- data/spec/handlers/alias_handler_spec.rb +16 -3
- data/spec/handlers/attribute_handler_spec.rb +1 -1
- data/spec/handlers/base_spec.rb +15 -141
- data/spec/handlers/class_condition_handler_spec.rb +49 -0
- data/spec/handlers/class_handler_spec.rb +44 -3
- data/spec/handlers/class_variable_handler_spec.rb +1 -1
- data/spec/handlers/constant_handler_spec.rb +1 -1
- data/spec/handlers/examples/alias_handler_001.rb.txt +7 -3
- data/spec/handlers/examples/class_condition_handler_001.rb.txt +61 -0
- data/spec/handlers/examples/class_handler_001.rb.txt +33 -0
- data/spec/handlers/examples/exception_handler_001.rb.txt +1 -1
- data/spec/handlers/examples/extend_handler_001.rb.txt +8 -0
- data/spec/handlers/examples/method_condition_handler_001.rb.txt +10 -0
- data/spec/handlers/examples/method_handler_001.rb.txt +16 -4
- data/spec/handlers/examples/mixin_handler_001.rb.txt +10 -2
- data/spec/handlers/examples/module_handler_001.rb.txt +4 -0
- data/spec/handlers/examples/visibility_handler_001.rb.txt +1 -1
- data/spec/handlers/exception_handler_spec.rb +2 -2
- data/spec/handlers/extend_handler_spec.rb +15 -0
- data/spec/handlers/legacy_base_spec.rb +128 -0
- data/spec/handlers/method_condition_handler_spec.rb +14 -0
- data/spec/handlers/method_handler_spec.rb +38 -5
- data/spec/handlers/mixin_handler_spec.rb +15 -7
- data/spec/handlers/module_handler_spec.rb +5 -1
- data/spec/handlers/processor_spec.rb +19 -0
- data/spec/handlers/ruby/base_spec.rb +90 -0
- data/spec/handlers/ruby/legacy/base_spec.rb +53 -0
- data/spec/handlers/spec_helper.rb +22 -16
- data/spec/handlers/visibility_handler_spec.rb +4 -4
- data/spec/handlers/yield_handler_spec.rb +1 -1
- data/spec/parser/ruby/ast_node_spec.rb +15 -0
- data/spec/parser/ruby/legacy/statement_list_spec.rb +145 -0
- data/spec/parser/{token_list_spec.rb → ruby/legacy/token_list_spec.rb} +4 -4
- data/spec/parser/source_parser_spec.rb +0 -15
- data/spec/rake/yardoc_task_spec.rb +48 -0
- data/spec/registry_spec.rb +28 -2
- data/spec/serializers/file_system_serializer_spec.rb +7 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/tags/default_factory_spec.rb +135 -0
- data/spec/tags/default_tag_spec.rb +11 -0
- data/spec/tags/overload_tag_spec.rb +35 -0
- data/spec/tags/ref_tag_list_spec.rb +53 -0
- data/templates/default/attributes/html/header.erb +17 -5
- data/templates/default/attributes/text/header.erb +1 -1
- data/templates/default/fulldoc/html/all_files.erb +19 -0
- data/templates/default/fulldoc/html/all_methods.erb +8 -7
- data/templates/default/fulldoc/html/all_namespaces.erb +4 -1
- data/templates/default/fulldoc/html/app.js +1 -1
- data/templates/default/fulldoc/html/{readme.erb → file.erb} +2 -2
- data/templates/default/fulldoc/html/header.erb +1 -1
- data/templates/default/fulldoc/html/index.erb +4 -3
- data/templates/default/fulldoc/html/style.css +13 -3
- data/templates/default/fulldoc/html/syntax_highlight.css +8 -5
- data/templates/default/method/text/header.erb +1 -0
- data/templates/default/method/text/title.erb +1 -0
- data/templates/default/methodsignature/html/main.erb +10 -8
- data/templates/default/methodsignature/text/main.erb +4 -1
- data/templates/default/methodsummary/html/summary.erb +8 -4
- data/templates/default/methodsummary/text/summary.erb +4 -1
- data/templates/default/mixins/html/header.erb +3 -3
- data/templates/default/overloads/html/header.erb +8 -0
- data/templates/default/overloads/text/header.erb +8 -0
- data/templates/default/root/html/header.erb +4 -0
- data/templates/default/tags/html/example.erb +20 -0
- data/templates/default/tags/html/option.erb +27 -0
- data/templates/default/tags/html/param.erb +21 -0
- data/templates/default/tags/html/tags.erb +4 -1
- data/templates/default/tags/html/todo.erb +8 -0
- data/templates/default/tags/text/example.erb +14 -0
- data/templates/default/tags/text/header.erb +3 -3
- data/templates/default/tags/text/option.erb +5 -0
- data/templates/default/tags/text/param.erb +9 -0
- data/templates/default/uml/dot/dependencies.erb +1 -1
- data/templates/default/uml/dot/info.erb +1 -1
- data/templates/default/uml/dot/superclasses.erb +2 -2
- data/templates/javadoc/methodsummary/html/summary.erb +2 -2
- data/templates/javadoc/mixins/html/header.erb +3 -3
- metadata +108 -139
- data/README +0 -211
- data/lib/yard/handlers/method_handler.rb +0 -27
- data/lib/yard/handlers/mixin_handler.rb +0 -16
- data/lib/yard/parser/statement_list.rb +0 -167
- data/lib/yard/tags/merbdoc_factory.rb +0 -47
@@ -0,0 +1,48 @@
|
|
1
|
+
class YARD::Handlers::Ruby::MethodHandler < YARD::Handlers::Ruby::Base
|
2
|
+
handles :def, :defs
|
3
|
+
|
4
|
+
def process
|
5
|
+
nobj = namespace
|
6
|
+
mscope = scope
|
7
|
+
if statement.type == :defs
|
8
|
+
meth = statement[2][0]
|
9
|
+
nobj = P(namespace, statement[0].source) unless statement[0].source == "self"
|
10
|
+
args = format_args(statement[3])
|
11
|
+
blk = statement[4]
|
12
|
+
mscope = :class
|
13
|
+
else
|
14
|
+
meth = statement[0][0]
|
15
|
+
args = format_args(statement[1])
|
16
|
+
blk = statement[2]
|
17
|
+
end
|
18
|
+
|
19
|
+
obj = register MethodObject.new(nobj, meth, mscope) do |o|
|
20
|
+
o.visibility = visibility
|
21
|
+
o.source = statement.source
|
22
|
+
o.signature = method_signature(meth)
|
23
|
+
o.explicit = true
|
24
|
+
o.parameters = args
|
25
|
+
end
|
26
|
+
|
27
|
+
parse_block(blk, :owner => obj) # mainly for yield/exceptions
|
28
|
+
end
|
29
|
+
|
30
|
+
def format_args(args)
|
31
|
+
args = args.jump(:params)
|
32
|
+
params = []
|
33
|
+
params += args.required_params.map {|a| [a.source, nil] } if args.required_params
|
34
|
+
params += args.optional_params.map {|a| [a[0].source, a[1].source] } if args.optional_params
|
35
|
+
params << ["*" + args.splat_param.source, nil] if args.splat_param
|
36
|
+
params += args.required_end_params.map {|a| [a.source, nil] } if args.required_end_params
|
37
|
+
params << ["&" + args.block_param.source, nil] if args.block_param
|
38
|
+
params
|
39
|
+
end
|
40
|
+
|
41
|
+
def method_signature(method_name)
|
42
|
+
if statement[1]
|
43
|
+
"def #{method_name}(#{statement[1].jump(:params).source})"
|
44
|
+
else
|
45
|
+
"def #{method_name}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class YARD::Handlers::Ruby::MixinHandler < YARD::Handlers::Ruby::Base
|
2
|
+
namespace_only
|
3
|
+
handles method_call(:include)
|
4
|
+
|
5
|
+
def process
|
6
|
+
statement.parameters(false).each {|mixin| process_mixin(mixin) }
|
7
|
+
end
|
8
|
+
|
9
|
+
protected
|
10
|
+
|
11
|
+
def process_mixin(mixin)
|
12
|
+
unless mixin.ref?
|
13
|
+
raise YARD::Parser::UndocumentableError, "mixin #{mixin.source} for class #{namespace.path}"
|
14
|
+
end
|
15
|
+
|
16
|
+
case obj = Proxy.new(namespace, mixin.source)
|
17
|
+
when Proxy
|
18
|
+
obj.type = :module
|
19
|
+
when ConstantObject # If a constant is included, use its value as the real object
|
20
|
+
obj = Proxy.new(namespace, obj.value)
|
21
|
+
end
|
22
|
+
|
23
|
+
namespace.mixins(scope) << obj
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class YARD::Handlers::Ruby::VisibilityHandler < YARD::Handlers::Ruby::Base
|
2
|
+
handles method_call(:private)
|
3
|
+
handles method_call(:protected)
|
4
|
+
handles method_call(:public)
|
5
|
+
|
6
|
+
def process
|
7
|
+
return if (ident = statement.jump(:ident)) == statement
|
8
|
+
case statement.type
|
9
|
+
when :var_ref
|
10
|
+
self.visibility = ident.first
|
11
|
+
when :fcall, :command
|
12
|
+
statement[1].traverse do |node|
|
13
|
+
next unless node.type == :ident || node.type == :string_content
|
14
|
+
MethodObject.new(namespace, node.source, scope) {|o| o.visibility = ident.first }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class YARD::Handlers::Ruby::YieldHandler < YARD::Handlers::Ruby::Base
|
2
|
+
handles :yield, :yield0
|
3
|
+
|
4
|
+
def process
|
5
|
+
return unless owner.is_a?(MethodObject) # Only methods yield
|
6
|
+
return if owner.has_tag? :yield # Don't override yield tags
|
7
|
+
return if owner.has_tag? :yieldparam # Same thing.
|
8
|
+
|
9
|
+
yieldtag = YARD::Tags::Tag.new(:yield, "", [])
|
10
|
+
owner.docstring.add_tag(yieldtag)
|
11
|
+
|
12
|
+
if statement.type == :yield
|
13
|
+
statement.jump(:list).children.each do |item|
|
14
|
+
if item == s(:var_ref, s(:kw, "self"))
|
15
|
+
yieldtag.types << '_self'
|
16
|
+
owner.docstring.add_tag YARD::Tags::Tag.new(:yieldparam,
|
17
|
+
"the object that the method was called on", owner.namespace.path, '_self')
|
18
|
+
elsif item == s(:zsuper)
|
19
|
+
yieldtag.types << '_super'
|
20
|
+
owner.docstring.add_tag YARD::Tags::Tag.new(:yieldparam,
|
21
|
+
"the result of the method from the superclass", nil, '_super')
|
22
|
+
else
|
23
|
+
yieldtag.types << item.source
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,263 @@
|
|
1
|
+
module YARD
|
2
|
+
module Parser
|
3
|
+
module Ruby
|
4
|
+
def s(*args)
|
5
|
+
type = Symbol === args.first ? args.shift : :list
|
6
|
+
opts = Hash === args.last ? args.pop : {}
|
7
|
+
AstNode.node_class_for(type).new(type, args, opts)
|
8
|
+
end
|
9
|
+
|
10
|
+
class AstNode < Array
|
11
|
+
attr_accessor :type, :parent, :docstring, :file, :full_source, :source
|
12
|
+
attr_accessor :source_range, :line_range
|
13
|
+
alias comments docstring
|
14
|
+
alias to_s source
|
15
|
+
|
16
|
+
KEYWORDS = { class: true, alias: true, lambda: true, do_block: true,
|
17
|
+
def: true, defs: true, begin: true, rescue: true, rescue_mod: true,
|
18
|
+
if: true, if_mod: true, else: true, elsif: true, case: true,
|
19
|
+
when: true, next: true, break: true, retry: true, redo: true,
|
20
|
+
return: true, throw: true, catch: true, until: true, until_mod: true,
|
21
|
+
while: true, while_mod: true, yield: true, yield0: true, zsuper: true,
|
22
|
+
unless: true, unless_mod: true, for: true, super: true, return0: true }
|
23
|
+
|
24
|
+
def self.node_class_for(type)
|
25
|
+
case type
|
26
|
+
when :params
|
27
|
+
ParameterNode
|
28
|
+
when :call, :fcall, :command, :command_call
|
29
|
+
MethodCallNode
|
30
|
+
when :if, :elsif, :if_mod, :unless, :unless_mod
|
31
|
+
ConditionalNode
|
32
|
+
when /_ref\Z/
|
33
|
+
ReferenceNode
|
34
|
+
else
|
35
|
+
AstNode
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def initialize(type, arr, opts = {})
|
40
|
+
super(arr)
|
41
|
+
self.type = type
|
42
|
+
self.line_range = opts[:line]
|
43
|
+
self.source_range = opts[:char]
|
44
|
+
@fallback_line = opts[:listline]
|
45
|
+
@fallback_source = opts[:listchar]
|
46
|
+
@token = true if opts[:token]
|
47
|
+
end
|
48
|
+
|
49
|
+
def ==(ast)
|
50
|
+
super && type == ast.type
|
51
|
+
end
|
52
|
+
|
53
|
+
def show
|
54
|
+
"\t#{line}: #{first_line}"
|
55
|
+
end
|
56
|
+
|
57
|
+
def source_range
|
58
|
+
reset_line_info unless @source_range
|
59
|
+
@source_range
|
60
|
+
end
|
61
|
+
|
62
|
+
def line_range
|
63
|
+
reset_line_info unless @line_range
|
64
|
+
@line_range
|
65
|
+
end
|
66
|
+
|
67
|
+
def has_line?
|
68
|
+
@line_range ? true : false
|
69
|
+
end
|
70
|
+
|
71
|
+
def line
|
72
|
+
line_range && line_range.first
|
73
|
+
end
|
74
|
+
|
75
|
+
def first_line
|
76
|
+
full_source.split(/\r?\n/)[line - 1].strip
|
77
|
+
end
|
78
|
+
|
79
|
+
def jump(*node_types)
|
80
|
+
traverse {|child| return(child) if node_types.include?(child.type) }
|
81
|
+
self
|
82
|
+
end
|
83
|
+
|
84
|
+
def children
|
85
|
+
@children ||= select {|e| AstNode === e }
|
86
|
+
end
|
87
|
+
|
88
|
+
def token?
|
89
|
+
@token
|
90
|
+
end
|
91
|
+
|
92
|
+
def ref?
|
93
|
+
false
|
94
|
+
end
|
95
|
+
|
96
|
+
def literal?
|
97
|
+
@literal ||= type =~ /_literal$/ ? true : false
|
98
|
+
end
|
99
|
+
|
100
|
+
def kw?
|
101
|
+
@kw ||= KEYWORDS.has_key?(type)
|
102
|
+
end
|
103
|
+
|
104
|
+
def call?
|
105
|
+
false
|
106
|
+
end
|
107
|
+
|
108
|
+
def condition?
|
109
|
+
false
|
110
|
+
end
|
111
|
+
|
112
|
+
def file
|
113
|
+
return parent.file if parent
|
114
|
+
@file
|
115
|
+
end
|
116
|
+
|
117
|
+
def full_source
|
118
|
+
return parent.full_source if parent
|
119
|
+
return @full_source if @full_source
|
120
|
+
return IO.read(@file) if file && File.exist?(file)
|
121
|
+
end
|
122
|
+
|
123
|
+
def source
|
124
|
+
return parent.full_source[source_range] if parent
|
125
|
+
full_source
|
126
|
+
end
|
127
|
+
|
128
|
+
def pretty_print(q)
|
129
|
+
objs = [*self.dup, :__last__]
|
130
|
+
objs.unshift(type) if type && type != :list
|
131
|
+
|
132
|
+
options = {}
|
133
|
+
if @docstring
|
134
|
+
options[:docstring] = docstring
|
135
|
+
end
|
136
|
+
if @source_range || @line_range
|
137
|
+
options[:line] = line_range
|
138
|
+
options[:source] = source_range
|
139
|
+
end
|
140
|
+
objs.pop if options.size == 0
|
141
|
+
|
142
|
+
q.group(3, 's(', ')') do
|
143
|
+
q.seplist(objs, nil, :each) do |v|
|
144
|
+
if v == :__last__
|
145
|
+
q.seplist(options, nil, :each) do |k, v|
|
146
|
+
q.group(3) do
|
147
|
+
q.text k
|
148
|
+
q.group(3) do
|
149
|
+
q.text ': '
|
150
|
+
q.pp v
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
else
|
155
|
+
q.pp v
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def inspect
|
162
|
+
typeinfo = type && type != :list ? ':' + type.to_s + ', ' : ''
|
163
|
+
's(' + typeinfo + map(&:inspect).join(", ") + ')'
|
164
|
+
end
|
165
|
+
|
166
|
+
def traverse
|
167
|
+
nodes = [self]
|
168
|
+
nodes.each.with_index do |node, index|
|
169
|
+
yield node
|
170
|
+
nodes.insert index+1, *node.children
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
private
|
175
|
+
|
176
|
+
def reset_line_info
|
177
|
+
if size == 0
|
178
|
+
self.line_range = @fallback_line
|
179
|
+
self.source_range = @fallback_source
|
180
|
+
elsif children.size > 0
|
181
|
+
f, l = children.first, children.last
|
182
|
+
self.line_range = Range.new(f.line_range.first, l.line_range.last)
|
183
|
+
self.source_range = Range.new(f.source_range.first, l.source_range.last)
|
184
|
+
elsif @fallback_line || @fallback_source
|
185
|
+
self.line_range = @fallback_line
|
186
|
+
self.source_range = @fallback_source
|
187
|
+
else
|
188
|
+
self.line_range = 0...0
|
189
|
+
self.source_range = 0...0
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
class ReferenceNode < AstNode
|
195
|
+
def ref?; true end
|
196
|
+
|
197
|
+
def path
|
198
|
+
Array.new flatten
|
199
|
+
end
|
200
|
+
|
201
|
+
def namespace
|
202
|
+
Array.new flatten[0...-1]
|
203
|
+
end
|
204
|
+
|
205
|
+
def source
|
206
|
+
super.split(/\s+/).first
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
class ParameterNode < AstNode
|
211
|
+
def required_params; self[0] end
|
212
|
+
def required_end_params; self[3] end
|
213
|
+
def optional_params; self[1] end
|
214
|
+
def splat_param; self[2] ? self[2][0] : nil end
|
215
|
+
def block_param; self[4] ? self[4][0] : nil end
|
216
|
+
end
|
217
|
+
|
218
|
+
class MethodCallNode < AstNode
|
219
|
+
def call?; true end
|
220
|
+
def namespace; first if index_adjust > 0 end
|
221
|
+
|
222
|
+
def method_name(name_only = false)
|
223
|
+
name = self[index_adjust]
|
224
|
+
name_only ? name.jump(:ident).first.to_sym : name
|
225
|
+
end
|
226
|
+
|
227
|
+
def parameters(include_block_param = true)
|
228
|
+
params = self[1 + index_adjust]
|
229
|
+
params = call_has_paren? ? params.first : params
|
230
|
+
include_block_param ? params : params[0...-1]
|
231
|
+
end
|
232
|
+
|
233
|
+
def block_param; parameters.last end
|
234
|
+
|
235
|
+
private
|
236
|
+
|
237
|
+
def index_adjust
|
238
|
+
[:call, :command_call].include?(type) ? 2 : 0
|
239
|
+
end
|
240
|
+
|
241
|
+
def call_has_paren?
|
242
|
+
[:fcall, :call].include?(type)
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
class ConditionalNode < AstNode
|
247
|
+
def condition?; true end
|
248
|
+
def condition; first end
|
249
|
+
def then_block; self[1] end
|
250
|
+
|
251
|
+
def else_block
|
252
|
+
if self[2] && !cmod?
|
253
|
+
self[2].type == :elsif ? self[2] : self[2][0]
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
private
|
258
|
+
|
259
|
+
def cmod?; type =~ /_mod$/ end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
@@ -2,7 +2,7 @@ require "e2mmap"
|
|
2
2
|
require "irb/slex"
|
3
3
|
|
4
4
|
module YARD
|
5
|
-
module Parser
|
5
|
+
module Parser::Ruby::Legacy
|
6
6
|
module RubyToken
|
7
7
|
EXPR_BEG = :EXPR_BEG
|
8
8
|
EXPR_MID = :EXPR_MID
|
@@ -95,7 +95,7 @@ module YARD
|
|
95
95
|
when String, Symbol
|
96
96
|
source = token.kind_of?(String) ? TkReading2Token : TkSymbol2Token
|
97
97
|
if (tk = source[token]).nil?
|
98
|
-
|
98
|
+
IRB.fail TkReading2TokenNoKey, token
|
99
99
|
end
|
100
100
|
tk = Token(tk[0], value)
|
101
101
|
else
|
@@ -105,7 +105,7 @@ module YARD
|
|
105
105
|
else
|
106
106
|
token.new(@prev_line_no, @prev_char_no, value)
|
107
107
|
end
|
108
|
-
|
108
|
+
end
|
109
109
|
end
|
110
110
|
tk
|
111
111
|
end
|
@@ -113,38 +113,38 @@ module YARD
|
|
113
113
|
TokenDefinitions = [
|
114
114
|
[:TkCLASS, TkKW, "class", EXPR_CLASS],
|
115
115
|
[:TkMODULE, TkKW, "module", EXPR_BEG],
|
116
|
-
[:TkDEF,
|
116
|
+
[:TkDEF, TkKW, "def", EXPR_FNAME],
|
117
117
|
[:TkUNDEF, TkKW, "undef", EXPR_FNAME],
|
118
118
|
[:TkBEGIN, TkKW, "begin", EXPR_BEG],
|
119
119
|
[:TkRESCUE, TkKW, "rescue", EXPR_MID],
|
120
120
|
[:TkENSURE, TkKW, "ensure", EXPR_BEG],
|
121
|
-
[:TkEND,
|
121
|
+
[:TkEND, TkKW, "end", EXPR_END],
|
122
122
|
[:TkIF, TkKW, "if", EXPR_BEG, :TkIF_MOD],
|
123
123
|
[:TkUNLESS, TkKW, "unless", EXPR_BEG, :TkUNLESS_MOD],
|
124
|
-
[:TkTHEN,
|
124
|
+
[:TkTHEN, TkKW, "then", EXPR_BEG],
|
125
125
|
[:TkELSIF, TkKW, "elsif", EXPR_BEG],
|
126
|
-
[:TkELSE,
|
127
|
-
[:TkCASE,
|
128
|
-
[:TkWHEN,
|
126
|
+
[:TkELSE, TkKW, "else", EXPR_BEG],
|
127
|
+
[:TkCASE, TkKW, "case", EXPR_BEG],
|
128
|
+
[:TkWHEN, TkKW, "when", EXPR_BEG],
|
129
129
|
[:TkWHILE, TkKW, "while", EXPR_BEG, :TkWHILE_MOD],
|
130
130
|
[:TkUNTIL, TkKW, "until", EXPR_BEG, :TkUNTIL_MOD],
|
131
|
-
[:TkFOR,
|
131
|
+
[:TkFOR, TkKW, "for", EXPR_BEG],
|
132
132
|
[:TkBREAK, TkKW, "break", EXPR_END],
|
133
|
-
[:TkNEXT,
|
134
|
-
[:TkREDO,
|
133
|
+
[:TkNEXT, TkKW, "next", EXPR_END],
|
134
|
+
[:TkREDO, TkKW, "redo", EXPR_END],
|
135
135
|
[:TkRETRY, TkKW, "retry", EXPR_END],
|
136
|
-
[:TkIN,
|
137
|
-
[:TkDO,
|
136
|
+
[:TkIN, TkKW, "in", EXPR_BEG],
|
137
|
+
[:TkDO, TkKW, "do", EXPR_BEG],
|
138
138
|
[:TkRETURN, TkKW, "return", EXPR_MID],
|
139
139
|
[:TkYIELD, TkKW, "yield", EXPR_END],
|
140
140
|
[:TkSUPER, TkKW, "super", EXPR_END],
|
141
|
-
[:TkSELF,
|
142
|
-
[:TkNIL,
|
143
|
-
[:TkTRUE,
|
141
|
+
[:TkSELF, TkKW, "self", EXPR_END],
|
142
|
+
[:TkNIL, TkKW, "nil", EXPR_END],
|
143
|
+
[:TkTRUE, TkKW, "true", EXPR_END],
|
144
144
|
[:TkFALSE, TkKW, "false", EXPR_END],
|
145
|
-
[:TkAND,
|
146
|
-
[:TkOR,
|
147
|
-
[:TkNOT,
|
145
|
+
[:TkAND, TkKW, "and", EXPR_BEG],
|
146
|
+
[:TkOR, TkKW, "or", EXPR_BEG],
|
147
|
+
[:TkNOT, TkKW, "not", EXPR_BEG],
|
148
148
|
[:TkIF_MOD, TkKW],
|
149
149
|
[:TkUNLESS_MOD, TkKW],
|
150
150
|
[:TkWHILE_MOD, TkKW],
|
@@ -152,14 +152,14 @@ module YARD
|
|
152
152
|
[:TkALIAS, TkKW, "alias", EXPR_FNAME],
|
153
153
|
[:TkDEFINED, TkKW, "defined?", EXPR_END],
|
154
154
|
[:TklBEGIN, TkKW, "BEGIN", EXPR_END],
|
155
|
-
[:TklEND,
|
155
|
+
[:TklEND, TkKW, "END", EXPR_END],
|
156
156
|
[:Tk__LINE__, TkKW, "__LINE__", EXPR_END],
|
157
157
|
[:Tk__FILE__, TkKW, "__FILE__", EXPR_END],
|
158
158
|
|
159
159
|
[:TkIDENTIFIER, TkId],
|
160
|
-
[:TkFID,
|
161
|
-
[:TkGVAR,
|
162
|
-
[:TkIVAR,
|
160
|
+
[:TkFID, TkId],
|
161
|
+
[:TkGVAR, TkId],
|
162
|
+
[:TkIVAR, TkId],
|
163
163
|
[:TkCONSTANT, TkId],
|
164
164
|
|
165
165
|
[:TkINTEGER, TkVal],
|
@@ -178,28 +178,28 @@ module YARD
|
|
178
178
|
|
179
179
|
[:TkUPLUS, TkOp, "+@"],
|
180
180
|
[:TkUMINUS, TkOp, "-@"],
|
181
|
-
[:TkPOW,
|
182
|
-
[:TkCMP,
|
183
|
-
[:TkEQ,
|
184
|
-
[:TkEQQ,
|
185
|
-
[:TkNEQ,
|
186
|
-
[:TkGEQ,
|
187
|
-
[:TkLEQ,
|
181
|
+
[:TkPOW, TkOp, "**"],
|
182
|
+
[:TkCMP, TkOp, "<=>"],
|
183
|
+
[:TkEQ, TkOp, "=="],
|
184
|
+
[:TkEQQ, TkOp, "==="],
|
185
|
+
[:TkNEQ, TkOp, "!="],
|
186
|
+
[:TkGEQ, TkOp, ">="],
|
187
|
+
[:TkLEQ, TkOp, "<="],
|
188
188
|
[:TkANDOP, TkOp, "&&"],
|
189
|
-
[:TkOROP,
|
189
|
+
[:TkOROP, TkOp, "||"],
|
190
190
|
[:TkMATCH, TkOp, "=~"],
|
191
191
|
[:TkNMATCH, TkOp, "!~"],
|
192
|
-
[:TkDOT2,
|
193
|
-
[:TkDOT3,
|
194
|
-
[:TkAREF,
|
195
|
-
[:TkASET,
|
192
|
+
[:TkDOT2, TkOp, ".."],
|
193
|
+
[:TkDOT3, TkOp, "..."],
|
194
|
+
[:TkAREF, TkOp, "[]"],
|
195
|
+
[:TkASET, TkOp, "[]="],
|
196
196
|
[:TkLSHFT, TkOp, "<<"],
|
197
197
|
[:TkRSHFT, TkOp, ">>"],
|
198
198
|
[:TkCOLON2, TkOp],
|
199
199
|
[:TkCOLON3, TkOp],
|
200
|
-
[:OPASGN,
|
200
|
+
[:OPASGN, TkOp], # +=, -= etc. #
|
201
201
|
[:TkASSOC, TkOp, "=>"],
|
202
|
-
[:TkQUESTION, TkOp, "?"],
|
202
|
+
[:TkQUESTION, TkOp, "?"], #?
|
203
203
|
[:TkCOLON, TkOp, ":"], #:
|
204
204
|
|
205
205
|
# [:TkfLPAREN], # func( #
|
@@ -209,13 +209,13 @@ module YARD
|
|
209
209
|
[:TkAMPER], # &arg #
|
210
210
|
# [:TkSYMBOL, TkId], # :SYMBOL
|
211
211
|
[:TkSYMBEG, TkId],
|
212
|
-
[:TkGT,
|
213
|
-
[:TkLT,
|
214
|
-
[:TkPLUS,
|
212
|
+
[:TkGT, TkOp, ">"],
|
213
|
+
[:TkLT, TkOp, "<"],
|
214
|
+
[:TkPLUS, TkOp, "+"],
|
215
215
|
[:TkMINUS, TkOp, "-"],
|
216
|
-
[:TkMULT,
|
217
|
-
[:TkDIV,
|
218
|
-
[:TkMOD,
|
216
|
+
[:TkMULT, TkOp, "*"],
|
217
|
+
[:TkDIV, TkOp, "/"],
|
218
|
+
[:TkMOD, TkOp, "%"],
|
219
219
|
[:TkBITOR, TkOp, "|"],
|
220
220
|
[:TkBITXOR, TkOp, "^"],
|
221
221
|
[:TkBITAND, TkOp, "&"],
|
@@ -225,7 +225,7 @@ module YARD
|
|
225
225
|
[:TkBACKQUOTE, TkOp, "`"],
|
226
226
|
|
227
227
|
[:TkASSIGN, Token, "="],
|
228
|
-
[:TkDOT,
|
228
|
+
[:TkDOT, Token, "."],
|
229
229
|
[:TkLPAREN, Token, "("], #(exp)
|
230
230
|
[:TkLBRACK, Token, "["], #[arry]
|
231
231
|
[:TkLBRACE, Token, "{"], #{hash}
|
@@ -241,7 +241,7 @@ module YARD
|
|
241
241
|
[:TkEND_OF_SCRIPT, TkWhitespace],
|
242
242
|
|
243
243
|
[:TkBACKSLASH, TkUnknownChar, "\\"],
|
244
|
-
[:TkAT,
|
244
|
+
[:TkAT, TkUnknownChar, "@"],
|
245
245
|
[:TkDOLLAR, TkUnknownChar, "\$"], #"
|
246
246
|
]
|
247
247
|
|
@@ -253,21 +253,21 @@ module YARD
|
|
253
253
|
def RubyToken.def_token(token_n, super_token = Token, reading = nil, *opts)
|
254
254
|
token_n = token_n.id2name unless token_n.kind_of?(String)
|
255
255
|
if RubyToken.const_defined?(token_n)
|
256
|
-
#IRB.fail AlreadyDefinedToken, token_n
|
256
|
+
# IRB.fail AlreadyDefinedToken, token_n
|
257
257
|
end
|
258
258
|
|
259
259
|
token_c = Class.new super_token
|
260
260
|
RubyToken.const_set token_n, token_c
|
261
|
-
|
261
|
+
# token_c.inspect
|
262
262
|
|
263
263
|
if reading
|
264
264
|
if TkReading2Token[reading]
|
265
|
-
|
265
|
+
IRB.fail TkReading2TokenDuplicateError, token_n, reading
|
266
266
|
end
|
267
267
|
if opts.empty?
|
268
|
-
|
268
|
+
TkReading2Token[reading] = [token_c]
|
269
269
|
else
|
270
|
-
|
270
|
+
TkReading2Token[reading] = [token_c].concat(opts)
|
271
271
|
end
|
272
272
|
end
|
273
273
|
TkSymbol2Token[token_n.intern] = token_c
|
@@ -414,7 +414,7 @@ module YARD
|
|
414
414
|
def_exception(:TkReading2TokenNoKey, "key nothing(key='%s')")
|
415
415
|
def_exception(:TkSymbol2TokenNoKey, "key nothing(key='%s')")
|
416
416
|
def_exception(:TkReading2TokenDuplicateError,
|
417
|
-
|
417
|
+
"key duplicate(token_n='%s', key='%s')")
|
418
418
|
def_exception(:SyntaxError, "%s")
|
419
419
|
|
420
420
|
include RubyToken
|
@@ -502,8 +502,8 @@ module YARD
|
|
502
502
|
def lex
|
503
503
|
catch(:eof) do
|
504
504
|
until (((tk = token).kind_of?(TkNL) || tk.kind_of?(TkEND_OF_SCRIPT)) &&
|
505
|
-
|
506
|
-
|
505
|
+
!@continue or
|
506
|
+
tk.nil?)
|
507
507
|
end
|
508
508
|
line = get_read
|
509
509
|
|
@@ -520,17 +520,17 @@ module YARD
|
|
520
520
|
catch(:eof) do
|
521
521
|
begin
|
522
522
|
begin
|
523
|
-
|
524
|
-
|
523
|
+
tk = @OP.match(self)
|
524
|
+
@space_seen = tk.kind_of?(TkSPACE)
|
525
525
|
rescue SyntaxError
|
526
|
-
|
527
|
-
|
526
|
+
abort if @exception_on_syntax_error
|
527
|
+
tk = TkError.new(line_no, char_no)
|
528
528
|
end
|
529
529
|
end while @skip_space and tk.kind_of?(TkSPACE)
|
530
530
|
if @read_auto_clean_up
|
531
531
|
get_read
|
532
532
|
end
|
533
|
-
|
533
|
+
# throw :eof unless tk
|
534
534
|
p tk if $DEBUG
|
535
535
|
tk.lex_state = lex_state if tk
|
536
536
|
tk
|
@@ -629,20 +629,20 @@ module YARD
|
|
629
629
|
@colonblock_seen = false
|
630
630
|
case @lex_state
|
631
631
|
when EXPR_BEG, EXPR_FNAME, EXPR_DOT
|
632
|
-
|
632
|
+
@continue = TRUE
|
633
633
|
else
|
634
|
-
|
635
|
-
|
634
|
+
@continue = FALSE
|
635
|
+
@lex_state = EXPR_BEG
|
636
636
|
end
|
637
637
|
Token(TkNL).set_text("\n")
|
638
638
|
end
|
639
639
|
|
640
|
-
@OP.def_rules("*", "**",
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
640
|
+
@OP.def_rules("*", "**",
|
641
|
+
"!", "!=", "!~",
|
642
|
+
"=", "==", "===",
|
643
|
+
"=~", "<=>",
|
644
|
+
"<", "<=",
|
645
|
+
">", ">=", ">>") do |op, io|
|
646
646
|
@lex_state = EXPR_BEG
|
647
647
|
Token(op).set_text(op)
|
648
648
|
end
|
@@ -651,8 +651,8 @@ module YARD
|
|
651
651
|
tk = nil
|
652
652
|
if @lex_state != EXPR_END && @lex_state != EXPR_CLASS &&
|
653
653
|
(@lex_state != EXPR_ARG || @space_seen)
|
654
|
-
|
655
|
-
|
654
|
+
c = peek(0)
|
655
|
+
tk = identify_here_document if /[-\w_\"\'\`]/ =~ c
|
656
656
|
end
|
657
657
|
if !tk
|
658
658
|
@lex_state = EXPR_BEG
|
@@ -667,31 +667,31 @@ module YARD
|
|
667
667
|
|
668
668
|
@OP.def_rules("`") do |op, io|
|
669
669
|
if @lex_state == EXPR_FNAME
|
670
|
-
|
670
|
+
Token(op).set_text(op)
|
671
671
|
else
|
672
|
-
|
672
|
+
identify_string(op)
|
673
673
|
end
|
674
674
|
end
|
675
675
|
|
676
676
|
@OP.def_rules('?') do |op, io|
|
677
677
|
if @lex_state == EXPR_END
|
678
|
-
|
679
|
-
|
678
|
+
@lex_state = EXPR_BEG
|
679
|
+
Token(TkQUESTION).set_text(op)
|
680
680
|
else
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
681
|
+
ch = getc
|
682
|
+
if @lex_state == EXPR_ARG && ch !~ /\s/
|
683
|
+
ungetc
|
684
|
+
@lex_state = EXPR_BEG
|
685
|
+
Token(TkQUESTION).set_text(op)
|
686
|
+
else
|
687
687
|
str = op
|
688
688
|
str << ch
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
689
|
+
if (ch == '\\') #'
|
690
|
+
str << read_escape
|
691
|
+
end
|
692
|
+
@lex_state = EXPR_END
|
693
|
+
Token(TkINTEGER).set_text(str)
|
694
|
+
end
|
695
695
|
end
|
696
696
|
end
|
697
697
|
|
@@ -701,7 +701,7 @@ module YARD
|
|
701
701
|
end
|
702
702
|
|
703
703
|
@OP.def_rules("+=", "-=", "*=", "**=",
|
704
|
-
|
704
|
+
"&=", "|=", "^=", "<<=", ">>=", "||=", "&&=") do |op, io|
|
705
705
|
@lex_state = EXPR_BEG
|
706
706
|
op =~ /^(.*)=$/
|
707
707
|
Token(TkOPASGN, $1).set_text(op)
|
@@ -717,30 +717,30 @@ module YARD
|
|
717
717
|
|
718
718
|
@OP.def_rules("+", "-") do |op, io|
|
719
719
|
catch(:RET) do
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
720
|
+
if @lex_state == EXPR_ARG
|
721
|
+
if @space_seen and peek(0) =~ /[0-9]/
|
722
|
+
throw :RET, identify_number(op)
|
723
|
+
else
|
724
|
+
@lex_state = EXPR_BEG
|
725
|
+
end
|
726
|
+
elsif @lex_state != EXPR_END and peek(0) =~ /[0-9]/
|
727
|
+
throw :RET, identify_number(op)
|
728
|
+
else
|
729
|
+
@lex_state = EXPR_BEG
|
730
|
+
end
|
731
|
+
Token(op).set_text(op)
|
732
732
|
end
|
733
733
|
end
|
734
734
|
|
735
735
|
@OP.def_rule(".") do
|
736
736
|
@lex_state = EXPR_BEG
|
737
737
|
if peek(0) =~ /[0-9]/
|
738
|
-
|
739
|
-
|
738
|
+
ungetc
|
739
|
+
identify_number("")
|
740
740
|
else
|
741
|
-
|
742
|
-
|
743
|
-
|
741
|
+
# for obj.if
|
742
|
+
@lex_state = EXPR_DOT
|
743
|
+
Token(TkDOT).set_text(".")
|
744
744
|
end
|
745
745
|
end
|
746
746
|
|
@@ -761,39 +761,39 @@ module YARD
|
|
761
761
|
end
|
762
762
|
|
763
763
|
@OP.def_rule(":") do
|
764
|
-
if @colonblock_seen || peek(0) =~ /\s/
|
765
|
-
|
766
|
-
|
764
|
+
if (@colonblock_seen && @lex_state != EXPR_BEG) || peek(0) =~ /\s/
|
765
|
+
@lex_state = EXPR_BEG
|
766
|
+
tk = Token(TkCOLON)
|
767
767
|
else
|
768
|
-
|
769
|
-
|
768
|
+
@lex_state = EXPR_FNAME
|
769
|
+
tk = Token(TkSYMBEG)
|
770
770
|
end
|
771
771
|
tk.set_text(":")
|
772
772
|
end
|
773
773
|
|
774
774
|
@OP.def_rule("::") do
|
775
|
-
|
775
|
+
# p @lex_state.id2name, @space_seen
|
776
776
|
if @lex_state == EXPR_BEG or @lex_state == EXPR_ARG && @space_seen
|
777
|
-
|
778
|
-
|
777
|
+
@lex_state = EXPR_BEG
|
778
|
+
tk = Token(TkCOLON3)
|
779
779
|
else
|
780
|
-
|
781
|
-
|
780
|
+
@lex_state = EXPR_DOT
|
781
|
+
tk = Token(TkCOLON2)
|
782
782
|
end
|
783
783
|
tk.set_text("::")
|
784
784
|
end
|
785
785
|
|
786
786
|
@OP.def_rule("/") do |op, io|
|
787
787
|
if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
|
788
|
-
|
788
|
+
identify_string(op)
|
789
789
|
elsif peek(0) == '='
|
790
|
-
|
791
|
-
|
792
|
-
|
790
|
+
getc
|
791
|
+
@lex_state = EXPR_BEG
|
792
|
+
Token(TkOPASGN, :/).set_text("/=") #")
|
793
793
|
elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/
|
794
|
-
|
794
|
+
identify_string(op)
|
795
795
|
else
|
796
|
-
|
796
|
+
@lex_state = EXPR_BEG
|
797
797
|
Token("/").set_text(op)
|
798
798
|
end
|
799
799
|
end
|
@@ -803,10 +803,10 @@ module YARD
|
|
803
803
|
Token("^").set_text("^")
|
804
804
|
end
|
805
805
|
|
806
|
-
#
|
807
|
-
#
|
808
|
-
#
|
809
|
-
#
|
806
|
+
# @OP.def_rules("^=") do
|
807
|
+
# @lex_state = EXPR_BEG
|
808
|
+
# Token(TkOPASGN, :^)
|
809
|
+
# end
|
810
810
|
|
811
811
|
@OP.def_rules(",", ";") do |op, io|
|
812
812
|
@colonblock_seen = false
|
@@ -826,13 +826,13 @@ module YARD
|
|
826
826
|
|
827
827
|
@OP.def_rule("(") do
|
828
828
|
@indent += 1
|
829
|
-
#if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
|
830
|
-
|
831
|
-
|
832
|
-
#else
|
833
|
-
|
834
|
-
|
835
|
-
#end
|
829
|
+
# if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
|
830
|
+
# @lex_state = EXPR_BEG
|
831
|
+
# tk = Token(TkfLPAREN)
|
832
|
+
# else
|
833
|
+
@lex_state = EXPR_BEG
|
834
|
+
tk = Token(TkLPAREN)
|
835
|
+
# end
|
836
836
|
tk.set_text("(")
|
837
837
|
end
|
838
838
|
|
@@ -846,16 +846,16 @@ module YARD
|
|
846
846
|
|
847
847
|
@OP.def_rule("[") do
|
848
848
|
@indent += 1
|
849
|
-
#
|
850
|
-
#
|
851
|
-
#
|
852
|
-
#
|
853
|
-
#
|
854
|
-
#
|
855
|
-
#
|
856
|
-
#
|
857
|
-
#
|
858
|
-
#
|
849
|
+
# if @lex_state == EXPR_FNAME
|
850
|
+
# t = Token(TkfLBRACK)
|
851
|
+
# else
|
852
|
+
# if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
|
853
|
+
# t = Token(TkLBRACK)
|
854
|
+
# elsif @lex_state == EXPR_ARG && @space_seen
|
855
|
+
# else
|
856
|
+
# t = Token(TkfLBRACK)
|
857
|
+
# end
|
858
|
+
# end
|
859
859
|
t = Token(TkLBRACK)
|
860
860
|
@lex_state = EXPR_BEG
|
861
861
|
t.set_text("[")
|
@@ -863,11 +863,11 @@ module YARD
|
|
863
863
|
|
864
864
|
@OP.def_rule("{") do
|
865
865
|
@indent += 1
|
866
|
-
#if @lex_state != EXPR_END && @lex_state != EXPR_ARG
|
867
|
-
|
868
|
-
#else
|
869
|
-
|
870
|
-
#end
|
866
|
+
# if @lex_state != EXPR_END && @lex_state != EXPR_ARG
|
867
|
+
# t = Token(TkLBRACE)
|
868
|
+
# else
|
869
|
+
# t = Token(TkfLBRACE)
|
870
|
+
# end
|
871
871
|
t = Token(TkLBRACE)
|
872
872
|
@lex_state = EXPR_BEG
|
873
873
|
t.set_text("{")
|
@@ -875,27 +875,27 @@ module YARD
|
|
875
875
|
|
876
876
|
@OP.def_rule('\\') do #'
|
877
877
|
if getc == "\n"
|
878
|
-
|
879
|
-
|
880
|
-
|
878
|
+
@space_seen = true
|
879
|
+
@continue = true
|
880
|
+
Token(TkSPACE).set_text("\\\n")
|
881
881
|
else
|
882
|
-
|
883
|
-
|
882
|
+
ungetc
|
883
|
+
Token("\\").set_text("\\") #"
|
884
884
|
end
|
885
885
|
end
|
886
886
|
|
887
887
|
@OP.def_rule('%') do
|
888
888
|
|op, io|
|
889
889
|
if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
|
890
|
-
|
890
|
+
identify_quotation('%')
|
891
891
|
elsif peek(0) == '='
|
892
|
-
|
893
|
-
|
892
|
+
getc
|
893
|
+
Token(TkOPASGN, "%").set_text("%=")
|
894
894
|
elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/
|
895
|
-
|
895
|
+
identify_quotation('%')
|
896
896
|
else
|
897
|
-
|
898
|
-
|
897
|
+
@lex_state = EXPR_BEG
|
898
|
+
Token("%").set_text("%")
|
899
899
|
end
|
900
900
|
end
|
901
901
|
|
@@ -905,34 +905,33 @@ module YARD
|
|
905
905
|
|
906
906
|
@OP.def_rule('@') do
|
907
907
|
if peek(0) =~ /[@\w_]/
|
908
|
-
|
909
|
-
|
908
|
+
ungetc
|
909
|
+
identify_identifier
|
910
910
|
else
|
911
|
-
|
911
|
+
Token("@").set_text("@")
|
912
912
|
end
|
913
913
|
end
|
914
914
|
|
915
|
-
#
|
916
|
-
#
|
917
|
-
#
|
918
|
-
#
|
919
|
-
# #
|
920
|
-
# #
|
921
|
-
# #
|
922
|
-
# #
|
923
|
-
#
|
915
|
+
# @OP.def_rule("def", proc{|op, io| /\s/ =~ io.peek(0)}) do
|
916
|
+
# |op, io|
|
917
|
+
# @indent += 1
|
918
|
+
# @lex_state = EXPR_FNAME
|
919
|
+
# # @lex_state = EXPR_END
|
920
|
+
# # until @rests[0] == "\n" or @rests[0] == ";"
|
921
|
+
# # rests.shift
|
922
|
+
# # end
|
923
|
+
# end
|
924
924
|
|
925
925
|
@OP.def_rule("__END__", proc{@prev_char_no == 0 && peek(0) =~ /[\r\n]/}) do
|
926
926
|
throw :eof
|
927
927
|
end
|
928
928
|
|
929
|
-
@OP.def_rule("") do
|
930
|
-
|op, io|
|
929
|
+
@OP.def_rule("") do |op, io|
|
931
930
|
printf "MATCH: start %s: %s\n", op, io.inspect if RubyLex.debug?
|
932
931
|
if peek(0) =~ /[0-9]/
|
933
|
-
|
932
|
+
t = identify_number("")
|
934
933
|
elsif peek(0) =~ /[\w_]/
|
935
|
-
|
934
|
+
t = identify_identifier
|
936
935
|
end
|
937
936
|
printf "MATCH: end %s: %s\n", op, io.inspect if RubyLex.debug?
|
938
937
|
t
|
@@ -1007,41 +1006,41 @@ module YARD
|
|
1007
1006
|
|
1008
1007
|
token_c, *trans = TkReading2Token[token]
|
1009
1008
|
if token_c
|
1010
|
-
|
1011
|
-
|
1012
|
-
|
1013
|
-
|
1014
|
-
|
1015
|
-
|
1016
|
-
|
1017
|
-
|
1018
|
-
|
1019
|
-
|
1020
|
-
|
1021
|
-
|
1022
|
-
|
1023
|
-
|
1024
|
-
|
1025
|
-
|
1026
|
-
|
1027
|
-
|
1028
|
-
|
1029
|
-
|
1030
|
-
|
1031
|
-
|
1032
|
-
|
1033
|
-
|
1034
|
-
|
1035
|
-
|
1036
|
-
|
1037
|
-
|
1009
|
+
# reserved word?
|
1010
|
+
|
1011
|
+
if (@lex_state != EXPR_BEG &&
|
1012
|
+
@lex_state != EXPR_FNAME &&
|
1013
|
+
trans[1])
|
1014
|
+
# modifiers
|
1015
|
+
token_c = TkSymbol2Token[trans[1]]
|
1016
|
+
@lex_state = trans[0]
|
1017
|
+
else
|
1018
|
+
if @lex_state != EXPR_FNAME
|
1019
|
+
if ENINDENT_CLAUSE.include?(token)
|
1020
|
+
@indent += 1
|
1021
|
+
|
1022
|
+
if ACCEPTS_COLON.include?(token)
|
1023
|
+
@colonblock_seen = true
|
1024
|
+
else
|
1025
|
+
@colonblock_seen = false
|
1026
|
+
end
|
1027
|
+
elsif DEINDENT_CLAUSE.include?(token)
|
1028
|
+
@indent -= 1
|
1029
|
+
@colonblock_seen = false
|
1030
|
+
end
|
1031
|
+
@lex_state = trans[0]
|
1032
|
+
else
|
1033
|
+
@lex_state = EXPR_END
|
1034
|
+
end
|
1035
|
+
end
|
1036
|
+
return Token(token_c, token).set_text(token)
|
1038
1037
|
end
|
1039
1038
|
end
|
1040
1039
|
|
1041
1040
|
if @lex_state == EXPR_FNAME
|
1042
1041
|
@lex_state = EXPR_END
|
1043
1042
|
if peek(0) == '='
|
1044
|
-
|
1043
|
+
token.concat getc
|
1045
1044
|
end
|
1046
1045
|
elsif @lex_state == EXPR_BEG || @lex_state == EXPR_DOT
|
1047
1046
|
@lex_state = EXPR_ARG
|
@@ -1068,13 +1067,13 @@ module YARD
|
|
1068
1067
|
lt = ch
|
1069
1068
|
quoted = ""
|
1070
1069
|
while (c = getc) && c != lt
|
1071
|
-
|
1070
|
+
quoted.concat c
|
1072
1071
|
end
|
1073
1072
|
else
|
1074
1073
|
lt = '"'
|
1075
1074
|
quoted = ch.dup
|
1076
1075
|
while (c = getc) && c =~ /\w/
|
1077
|
-
|
1076
|
+
quoted.concat c
|
1078
1077
|
end
|
1079
1078
|
ungetc
|
1080
1079
|
end
|
@@ -1086,9 +1085,9 @@ module YARD
|
|
1086
1085
|
reserve << ch
|
1087
1086
|
if ch == "\\" #"
|
1088
1087
|
ch = getc
|
1089
|
-
|
1088
|
+
reserve << ch
|
1090
1089
|
elsif ch == "\n"
|
1091
|
-
|
1090
|
+
break
|
1092
1091
|
end
|
1093
1092
|
end
|
1094
1093
|
|
@@ -1115,13 +1114,13 @@ module YARD
|
|
1115
1114
|
elsif ch =~ /\W/
|
1116
1115
|
lt = "\""
|
1117
1116
|
else
|
1118
|
-
#
|
1117
|
+
# RubyLex.fail SyntaxError, "unknown type of %string ('#{ch}')"
|
1119
1118
|
end
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
1123
|
-
|
1124
|
-
|
1119
|
+
# if ch !~ /\W/
|
1120
|
+
# ungetc
|
1121
|
+
# next
|
1122
|
+
# end
|
1123
|
+
# @ltype = lt
|
1125
1124
|
@quoted = ch unless @quoted = PERCENT_PAREN[ch]
|
1126
1125
|
identify_string(lt, @quoted, ch, initial_char) if lt
|
1127
1126
|
end
|
@@ -1164,25 +1163,25 @@ module YARD
|
|
1164
1163
|
str << ch
|
1165
1164
|
|
1166
1165
|
when allow_point && "."
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1171
|
-
|
1166
|
+
type = TkFLOAT
|
1167
|
+
if peek(0) !~ /[0-9]/
|
1168
|
+
ungetc
|
1169
|
+
break
|
1170
|
+
end
|
1172
1171
|
str << ch
|
1173
|
-
|
1172
|
+
allow_point = false
|
1174
1173
|
|
1175
1174
|
when allow_e && "e", allow_e && "E"
|
1176
1175
|
str << ch
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1176
|
+
type = TkFLOAT
|
1177
|
+
if peek(0) =~ /[+-]/
|
1178
|
+
str << getc
|
1179
|
+
end
|
1180
|
+
allow_e = false
|
1181
|
+
allow_point = false
|
1183
1182
|
else
|
1184
|
-
|
1185
|
-
|
1183
|
+
ungetc
|
1184
|
+
break
|
1186
1185
|
end
|
1187
1186
|
end
|
1188
1187
|
Token(type).set_text(str)
|
@@ -1200,8 +1199,8 @@ module YARD
|
|
1200
1199
|
nest = 0
|
1201
1200
|
begin
|
1202
1201
|
while ch = getc
|
1203
|
-
|
1204
|
-
|
1202
|
+
str << ch
|
1203
|
+
if @quoted == ch
|
1205
1204
|
if nest == 0
|
1206
1205
|
break
|
1207
1206
|
else
|
@@ -1209,7 +1208,7 @@ module YARD
|
|
1209
1208
|
end
|
1210
1209
|
elsif opener == ch
|
1211
1210
|
nest += 1
|
1212
|
-
|
1211
|
+
elsif @ltype != "'" && @ltype != "]" and ch == "#"
|
1213
1212
|
ch = getc
|
1214
1213
|
if ch == "{"
|
1215
1214
|
subtype = true
|
@@ -1217,19 +1216,19 @@ module YARD
|
|
1217
1216
|
else
|
1218
1217
|
ungetc(ch)
|
1219
1218
|
end
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
1219
|
+
elsif ch == '\\' #'
|
1220
|
+
str << read_escape
|
1221
|
+
end
|
1223
1222
|
end
|
1224
1223
|
if @ltype == "/"
|
1225
|
-
|
1226
|
-
|
1227
|
-
|
1224
|
+
if peek(0) =~ /i|o|n|e|s/
|
1225
|
+
str << getc
|
1226
|
+
end
|
1228
1227
|
end
|
1229
1228
|
if subtype
|
1230
|
-
|
1229
|
+
Token(DLtype2Token[ltype], str)
|
1231
1230
|
else
|
1232
|
-
|
1231
|
+
Token(Ltype2Token[ltype], str)
|
1233
1232
|
end.set_text(str)
|
1234
1233
|
ensure
|
1235
1234
|
@ltype = nil
|
@@ -1282,49 +1281,49 @@ module YARD
|
|
1282
1281
|
when /[0-7]/
|
1283
1282
|
ungetc ch
|
1284
1283
|
3.times do
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1290
|
-
|
1291
|
-
|
1292
|
-
|
1284
|
+
case ch = getc
|
1285
|
+
when /[0-7]/
|
1286
|
+
when nil
|
1287
|
+
break
|
1288
|
+
else
|
1289
|
+
ungetc
|
1290
|
+
break
|
1291
|
+
end
|
1293
1292
|
res << ch
|
1294
1293
|
end
|
1295
1294
|
|
1296
1295
|
when "x"
|
1297
1296
|
res << ch
|
1298
1297
|
2.times do
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1304
|
-
|
1305
|
-
|
1306
|
-
|
1298
|
+
case ch = getc
|
1299
|
+
when /[0-9a-fA-F]/
|
1300
|
+
when nil
|
1301
|
+
break
|
1302
|
+
else
|
1303
|
+
ungetc
|
1304
|
+
break
|
1305
|
+
end
|
1307
1306
|
res << ch
|
1308
1307
|
end
|
1309
1308
|
|
1310
1309
|
when "M"
|
1311
1310
|
res << ch
|
1312
1311
|
if (ch = getc) != '-'
|
1313
|
-
|
1312
|
+
ungetc
|
1314
1313
|
else
|
1315
1314
|
res << ch
|
1316
|
-
|
1315
|
+
if (ch = getc) == "\\" #"
|
1317
1316
|
res << ch
|
1318
|
-
|
1317
|
+
res << read_escape
|
1319
1318
|
else
|
1320
1319
|
res << ch
|
1321
|
-
|
1320
|
+
end
|
1322
1321
|
end
|
1323
1322
|
|
1324
1323
|
when "C", "c" #, "^"
|
1325
1324
|
res << ch
|
1326
1325
|
if ch == "C" and (ch = getc) != "-"
|
1327
|
-
|
1326
|
+
ungetc
|
1328
1327
|
else
|
1329
1328
|
res << ch
|
1330
1329
|
if (ch = getc) == "\\" #"
|
@@ -1341,4 +1340,4 @@ module YARD
|
|
1341
1340
|
end
|
1342
1341
|
end
|
1343
1342
|
end
|
1344
|
-
end
|
1343
|
+
end
|