Class: TRuby::DeclarationParser

Inherits:
Object
  • Object
show all
Defined in:
lib/t_ruby/declaration_generator.rb

Overview

Parser for .d.trb declaration files

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeDeclarationParser

Returns a new instance of DeclarationParser.



104
105
106
107
108
# File 'lib/t_ruby/declaration_generator.rb', line 104

def initialize
  @type_aliases = {}
  @interfaces = {}
  @functions = {}
end

Instance Attribute Details

#functionsObject (readonly)

Returns the value of attribute functions.



102
103
104
# File 'lib/t_ruby/declaration_generator.rb', line 102

def functions
  @functions
end

#interfacesObject (readonly)

Returns the value of attribute interfaces.



102
103
104
# File 'lib/t_ruby/declaration_generator.rb', line 102

def interfaces
  @interfaces
end

#type_aliasesObject (readonly)

Returns the value of attribute type_aliases.



102
103
104
# File 'lib/t_ruby/declaration_generator.rb', line 102

def type_aliases
  @type_aliases
end

Instance Method Details

#get_function(name) ⇒ Object

Get a function signature



189
190
191
# File 'lib/t_ruby/declaration_generator.rb', line 189

def get_function(name)
  @functions[name]
end

#get_interface(name) ⇒ Object

Get an interface definition



184
185
186
# File 'lib/t_ruby/declaration_generator.rb', line 184

def get_interface(name)
  @interfaces[name]
end

#load_directory(dir_path, recursive: false) ⇒ Object

Load multiple declaration files from a directory



157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/t_ruby/declaration_generator.rb', line 157

def load_directory(dir_path, recursive: false)
  unless Dir.exist?(dir_path)
    raise ArgumentError, "Directory not found: #{dir_path}"
  end

  pattern = recursive ? "**/*#{DeclarationGenerator::DECLARATION_EXTENSION}" : "*#{DeclarationGenerator::DECLARATION_EXTENSION}"
  files = Dir.glob(File.join(dir_path, pattern))

  files.each do |file|
    content = File.read(file)
    parse_and_merge(content)
  end

  self
end

#merge(other_parser) ⇒ Object

Merge another parser’s declarations into this one



203
204
205
206
207
208
# File 'lib/t_ruby/declaration_generator.rb', line 203

def merge(other_parser)
  @type_aliases.merge!(other_parser.type_aliases)
  @interfaces.merge!(other_parser.interfaces)
  @functions.merge!(other_parser.functions)
  self
end

#parse(content) ⇒ Object

Parse a declaration file content (resets existing data)



111
112
113
114
115
116
117
# File 'lib/t_ruby/declaration_generator.rb', line 111

def parse(content)
  @type_aliases = {}
  @interfaces = {}
  @functions = {}

  parse_and_merge(content)
end

#parse_and_merge(content) ⇒ Object

Parse content and merge with existing data



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/t_ruby/declaration_generator.rb', line 120

def parse_and_merge(content)
  parser = Parser.new(content)
  result = parser.parse

  # Process type aliases
  (result[:type_aliases] || []).each do |type_alias|
    @type_aliases[type_alias[:name]] = type_alias[:definition]
  end

  # Process interfaces
  (result[:interfaces] || []).each do |interface|
    @interfaces[interface[:name]] = interface
  end

  # Process functions
  (result[:functions] || []).each do |function|
    @functions[function[:name]] = function
  end

  self
end

#parse_file(file_path) ⇒ Object

Parse a declaration file from path



143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/t_ruby/declaration_generator.rb', line 143

def parse_file(file_path)
  unless File.exist?(file_path)
    raise ArgumentError, "Declaration file not found: #{file_path}"
  end

  unless file_path.end_with?(DeclarationGenerator::DECLARATION_EXTENSION)
    raise ArgumentError, "Expected #{DeclarationGenerator::DECLARATION_EXTENSION} file, got: #{file_path}"
  end

  content = File.read(file_path)
  parse(content)
end

#resolve_type(name) ⇒ Object

Resolve a type alias



179
180
181
# File 'lib/t_ruby/declaration_generator.rb', line 179

def resolve_type(name)
  @type_aliases[name]
end

#to_hObject

Get all declarations as a hash



194
195
196
197
198
199
200
# File 'lib/t_ruby/declaration_generator.rb', line 194

def to_h
  {
    type_aliases: @type_aliases,
    interfaces: @interfaces,
    functions: @functions
  }
end

#type_defined?(name) ⇒ Boolean

Check if a type is defined

Returns:

  • (Boolean)


174
175
176
# File 'lib/t_ruby/declaration_generator.rb', line 174

def type_defined?(name)
  @type_aliases.key?(name) || @interfaces.key?(name)
end