Sha256: 0e31fc9d0acce7b517076475d246a7fae2a78d7aec608a5cd7210ea452137819

Contents?: true

Size: 1.74 KB

Versions: 43

Compression:

Stored size: 1.74 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)

          # Turn singleton class names to attached class names
          if (match_data = name.match(/<Class:(.*)>/))
            name = match_data[1]
          end

          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

43 entries across 43 versions & 2 rubygems

Version Path
tapioca-0.12.0 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.17 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.16 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.15 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.14 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.13 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.12 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.11 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.10 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.9 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.8 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.7 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.6 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.5 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.4 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.3 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.2 lib/tapioca/static/symbol_table_parser.rb
devcycle-ruby-server-sdk-2.0.0 vendor/bundle/ruby/3.0.0/gems/tapioca-0.11.1/lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.1 lib/tapioca/static/symbol_table_parser.rb
tapioca-0.11.0 lib/tapioca/static/symbol_table_parser.rb