Class: ShellOpts::Analyzer
- Inherits:
-
Object
- Object
- ShellOpts::Analyzer
- Includes:
- Grammar
- Defined in:
- lib/shellopts/analyzer.rb
Instance Attribute Summary collapse
-
#grammar ⇒ Object
readonly
Returns the value of attribute grammar.
Class Method Summary collapse
Instance Method Summary collapse
- #analyze ⇒ Object
-
#initialize(grammar) ⇒ Analyzer
constructor
A new instance of Analyzer.
-
#move_commands ⇒ Object
Move commands that are nested within a different command than it belongs to.
Constructor Details
#initialize(grammar) ⇒ Analyzer
Returns a new instance of Analyzer.
72 73 74 |
# File 'lib/shellopts/analyzer.rb', line 72 def initialize(grammar) @grammar = grammar end |
Instance Attribute Details
#grammar ⇒ Object (readonly)
Returns the value of attribute grammar.
70 71 72 |
# File 'lib/shellopts/analyzer.rb', line 70 def grammar @grammar end |
Class Method Details
.analyze(source) ⇒ Object
127 |
# File 'lib/shellopts/analyzer.rb', line 127 def Analyzer.analyze(source) self.new(source).analyze end |
Instance Method Details
#analyze ⇒ Object
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/shellopts/analyzer.rb', line 106 def analyze() move_commands @grammar.traverse(Grammar::Command) { |command| command.set_supercommand command. command. command.compute_option_hashes } @grammar.compute_command_hashes @grammar.traverse { |node| node.remove_brief_nodes node.remove_arg_descr_nodes node.remove_arg_spec_nodes } @grammar end |
#move_commands ⇒ Object
Move commands that are nested within a different command than it belongs to
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/shellopts/analyzer.rb', line 77 def move_commands # We can't use Command#[] at this point so we collect the commands here h = {} @grammar.traverse(Grammar::Command) { |command| h[command.path] = command } # Find commands to move # # Commands are moved in two steps because the behaviour of #traverse is # not defined when the data structure changes beneath it move = [] @grammar.traverse(Grammar::Command) { |command| if command.path.size > 1 && command.parent && command.parent.path != command.path[0..-2] move << command else command.instance_variable_set(:@command, command.parent) end } # Move commands but do not change parent/child relationship move.each { |command| supercommand = h[command.path[0..-2]] or analyzer_error "Can't find #{command.ident}!" command.parent.commands.delete(command) supercommand.commands << command command.instance_variable_set(:@command, supercommand) } end |