Sha256: e590328d8c290bf9c92af7cbe901cdbe20237d8092beb5460f838faed1f8cc07
Contents?: true
Size: 1.58 KB
Versions: 3
Compression:
Stored size: 1.58 KB
Contents
# typed: strict # frozen_string_literal: true module Tapioca module Static class SymbolTableParser extend T::Sig SKIP_PARSE_KINDS = T.let(["CLASS_OR_MODULE", "STATIC_FIELD"].freeze, T::Array[String]) class << self extend T::Sig sig { params(json_string: String).returns(T::Set[String]) } def parse_json(json_string) obj = JSON.parse(json_string) parser = SymbolTableParser.new parser.parse_object(obj) parser.symbols rescue JSON::ParserError Set.new end end sig { returns(T::Set[String]) } attr_reader :symbols sig { void } def initialize @symbols = T.let(Set.new, T::Set[String]) @parents = T.let([], T::Array[String]) end sig { params(object: T::Hash[String, T.untyped]).void } def parse_object(object) children = object.fetch("children", []) children.each do |child| kind = child.fetch("kind") name = child.fetch("name") name = name.fetch("name") if name.is_a?(Hash) next if name.nil? next unless SKIP_PARSE_KINDS.include?(kind) next if name.match?(/[<>()$]/) next if name.match?(/^[0-9]+$/) next if name == "T::Helpers" @symbols.add(fully_qualified_name(name)) @parents << name parse_object(child) @parents.pop end end sig { params(name: String).returns(String) } def fully_qualified_name(name) [*@parents, name].join("::") end end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
tapioca-0.10.2 | lib/tapioca/static/symbol_table_parser.rb |
tapioca-0.10.1 | lib/tapioca/static/symbol_table_parser.rb |
tapioca-0.10.0 | lib/tapioca/static/symbol_table_parser.rb |