class RubyLsp::Ree::ParsedDaoDocument
def field_allows_null?(node)
def field_allows_null?(node) kw_node = node.arguments.arguments.detect{ _1.is_a?(Prism::KeywordHashNode) } return false unless kw_node null_el = kw_node.elements.detect{ _1.key.unescaped == "null" } return false unless null_el null_el.value.is_a?(Prism::TrueNode) end
def has_schema?
def has_schema? !!@schema_node end
def initialize(ast, package_name = nil)
def initialize(ast, package_name = nil) super parse_filters parse_dao_fields end
def parse_dao_fields
def parse_dao_fields @dao_fields = [] @schema_node = nil return unless has_body? @schema_node = class_node.body.body .detect{ |node| node.is_a?(Prism::CallNode) && node.name == :schema } return unless @schema_node @dao_fields = @schema_node.block.body.body.map do |node| if node.name.to_s == 'pg_jsonb' field_type = "Nilor[Hash]" default_val = "nil" else field_type = camelize(node.name.to_s) default_val = nil if field_allows_null?(node) field_type = "Nilor[#{field_type}]" default_val = "nil" end end DaoField.new( name: node.arguments.arguments.first.unescaped, location: node.location, type: field_type, default: default_val ) end end
def parse_filter_signature(filter_node)
def parse_filter_signature(filter_node) return [] unless filter_node lambda_node = filter_node.arguments&.arguments[1] return [] if !lambda_node || !lambda_node.parameters parse_signatures_from_params(lambda_node.parameters.parameters) end
def parse_filters
def parse_filters return unless has_body? @filters ||= class_node.body.body .select{ node_name(_1) == :filter } .map{ OpenStruct.new(name: _1.arguments.arguments.first.unescaped, signatures: parse_filter_signature(_1)) } end
def schema_name
def schema_name @schema_node.arguments.arguments.first.name.to_s end
def set_dao_fields(fields)
def set_dao_fields(fields) @dao_fields = fields end