class RuboCop::Cop::SketchupRequirements::SketchupExtension

Register a single instance of SketchupExtension per extension. This should be done by the root .rb file in the extension package.

@example Good - a single SketchupExtension is registered.

module Example
  unless file_loaded?(__FILE__)
    extension = SketchupExtension.new('Hello World', 'example/main')
    Sketchup.register_extension(extension, true)
    file_loaded(__FILE__)
  end
end

Constants

MSG

rubocop:disable Layout/LineLength

MSG_CREATE_MISSING
MSG_CREATE_ONE
MSG_REGISTER_MISSING
MSG_REGISTER_ONE

Public Instance Methods

investigate(processed_source) click to toggle source
# File lib/rubocop/sketchup/cop/requirements/sketchup_extension.rb, line 44
def investigate(processed_source)
  return unless root_file?(processed_source)

  source_node = processed_source.ast
  # Using range similar to RuboCop::Cop::Naming::Filename (file_name.rb)
  range = source_range(processed_source.buffer, 1, 0)

  # Look for SketchupExtension.new.
  extension_nodes = sketchup_extension_new(source_node).to_a

  # Threat instances not assigned to anything as non-existing.
  extension_nodes.select! { |node|
    node.parent&.assignment?
  }

  # There should not be multiple instances.
  if extension_nodes.size > 1
    add_offense(nil,
                location: range,
                message: MSG_CREATE_ONE)
    return
  end

  # There should be exactly one.
  extension_node = extension_nodes.first
  if extension_node.nil?
    add_offense(nil,
                location: range,
                message: MSG_CREATE_MISSING)
    return
  end

  # Ensure it have two arguments.
  if extension_node.arguments.size < 2
    message = if extension_node.arguments.size == 1
                'Missing second argument for the path'
              else
                'Missing required name arguments'
              end
    add_offense(extension_node,
                message: message)
    return
  end

  # Find the name of the value SketchupExtension.new was assigned to.
  assignment_node = extension_node.parent
  if assignment_node.casgn_type?
    extension_var = assignment_node.to_a[1]
  else
    extension_var = assignment_node.to_a[0]
  end

  # Look for Sketchup.register and make sure it register the extension
  # object detected earlier.
  registered_vars = sketchup_register_extension(source_node).to_a

  # Make sure there is only one call to `register_extension`.
  if registered_vars.size > 1
    add_offense(registered_vars[1],
                message: MSG_REGISTER_ONE)
    return
  end

  registered_var = sketchup_register_extension(source_node).first
  unless registered_var == extension_var
    msg = MSG_REGISTER_MISSING % extension_var.to_s
    add_offense(nil,
                location: range,
                message: msg)
  end
end