Class: GraphQL::Modernize::ClassHierarchy

Inherits:
Object
  • Object
show all
Defined in:
lib/graphql/modernize/class_hierarchy.rb

Constant Summary collapse

DIRECT_KINDS =
{
  "GraphQL::Schema::Object" => :object,
  "GraphQL::Schema::InputObject" => :input_object,
  "GraphQL::Schema::Enum" => :enum,
  "GraphQL::Schema::Union" => :union,
  "GraphQL::Schema::Resolver" => :resolver,
  "GraphQL::Schema::Mutation" => :mutation,
  "GraphQL::Schema::RelayClassicMutation" => :mutation,
  "GraphQL::Schema::Subscription" => :subscription,
  "GraphQL::Schema" => :schema
}.freeze
SUFFIX_KINDS =
{
  "BaseObject" => :object,
  "BaseInputObject" => :input_object,
  "BaseEnum" => :enum,
  "BaseUnion" => :union,
  "BaseResolver" => :resolver,
  "BaseMutation" => :mutation
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(base_classes: {}) ⇒ ClassHierarchy

Returns a new instance of ClassHierarchy.



111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/graphql/modernize/class_hierarchy.rb', line 111

def initialize(base_classes: {})
  @configured_kinds = base_classes.each_with_object({}) do |(kind, names), result|
    Array(names).each { |name| result[normalize(name)] = kind.to_sym }
  end
  @declarations = {}
  @declared_names = {}
  @superclasses = {}
  @interface_names = {}
  @visible_definitions = []
  @calls = Hash.new { |hash, name| hash[name] = [] }
  @methods = Hash.new { |hash, name| hash[name] = {} }
  @class_methods = Hash.new { |hash, name| hash[name] = {} }
end

Instance Attribute Details

#declarationsObject (readonly)

Returns the value of attribute declarations.



109
110
111
# File 'lib/graphql/modernize/class_hierarchy.rb', line 109

def declarations
  @declarations
end

Instance Method Details

#build(source_files) ⇒ Object



125
# File 'lib/graphql/modernize/class_hierarchy.rb', line 125

def build(source_files) = tap { source_files.each { |source_file| index(source_file) } }

#calls_for(class_name) ⇒ Object



140
# File 'lib/graphql/modernize/class_hierarchy.rb', line 140

def calls_for(class_name) = ancestors(class_name).flat_map { |name| @calls[name] }

#class_method_defined?(class_name, method_name) ⇒ Boolean

Returns:

  • (Boolean)


144
# File 'lib/graphql/modernize/class_hierarchy.rb', line 144

def class_method_defined?(class_name, method_name) = defined_in?(@class_methods, class_name, method_name)

#method_defined?(class_name, method_name) ⇒ Boolean

Returns:

  • (Boolean)


142
# File 'lib/graphql/modernize/class_hierarchy.rb', line 142

def method_defined?(class_name, method_name) = defined_in?(@methods, class_name, method_name)

#resolve_kind(class_name) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/graphql/modernize/class_hierarchy.rb', line 127

def resolve_kind(class_name)
  name = normalize(class_name)
  seen = {}
  until name.empty? || seen[name]
    seen[name] = true
    kind = direct_kind(name)
    return kind if kind

    name = resolve_superclass(name)
  end
  nil
end

#visibility_plugin?(class_name) ⇒ Boolean

Returns:

  • (Boolean)


148
149
150
151
152
153
# File 'lib/graphql/modernize/class_hierarchy.rb', line 148

def visibility_plugin?(class_name)
  calls_for(class_name).any? do |call|
    call.direct && call.name == :use &&
      %w[GraphQL::Schema::Visibility GraphQL::Schema::Warden].include?(call.first_argument)
  end
end

#visibility_plugin_ambiguous?(class_name) ⇒ Boolean

Returns:

  • (Boolean)


155
156
157
158
159
# File 'lib/graphql/modernize/class_hierarchy.rb', line 155

def visibility_plugin_ambiguous?(class_name)
  !visibility_plugin?(class_name) && calls_for(class_name).any? do |call|
    call.name == :use && %w[GraphQL::Schema::Visibility GraphQL::Schema::Warden].include?(call.first_argument)
  end
end

#visibility_plugin_misplaced?(class_name, path, start_offset) ⇒ Boolean

Returns:

  • (Boolean)


169
170
171
172
173
174
# File 'lib/graphql/modernize/class_hierarchy.rb', line 169

def visibility_plugin_misplaced?(class_name, path, start_offset)
  @calls[normalize(class_name)].any? do |call|
    call.direct && call.path == path && call.start_offset > start_offset &&
      %i[query mutation subscription].include?(call.name)
  end
end

#visibility_plugin_target?(class_name) ⇒ Boolean

Returns:

  • (Boolean)


161
162
163
164
165
166
167
# File 'lib/graphql/modernize/class_hierarchy.rb', line 161

def visibility_plugin_target?(class_name)
  return false if visibility_plugin?(class_name)

  ancestors(class_name).drop(1).none? do |name|
    @declared_names[name] && resolve_kind(name) == :schema && !visibility_plugin?(name)
  end
end

#visible_definitionsObject



146
# File 'lib/graphql/modernize/class_hierarchy.rb', line 146

def visible_definitions = @visible_definitions.select { |definition| visible_definition?(definition) }