Class: RuboCop::Cop::SketchupBugs::RenderMode

Inherits:
SketchUp::Cop show all
Includes:
SketchUp::SketchUpTargetRange
Defined in:
lib/rubocop/sketchup/cop/bugs/render_mode.rb

Overview

A regression was introduced in SketchUp 2017 that cause invalid render modes to crash SketchUp. The crash might not happen exactly when the new mode is set, but later when the viewport re-draws.

Valid render modes are: (Internal enum names in parentheses)

  • ‘0` (`kRenderWireframe`)

  • ‘1` (`kRenderHidden`)

  • ‘2` (`kRenderFlat`)

  • ‘3` (`kRenderSmooth`)

  • ‘5` (`kRenderNoMaterials`)

Examples:

This obsolete render mode will crash SketchUp 2017 and newer

Sketchup.active_model.rendering_options["RenderMode"] = 4

This invalid render mode will crash SketchUp 2017 and newer

Sketchup.active_model.rendering_options["RenderMode"] = 99

Constant Summary collapse

RENDER_MODE_VALID =
[
  0, # kRenderWireframe,
  1, # kRenderHidden,
  2, # kRenderFlat,
  3, # kRenderSmooth,
  5, # kRenderNoMaterials
].freeze
RENDER_MODE_OBSOLETE =
[
  4, # kRenderTextureObsolete,
].freeze
MSG_OBSOLETE =
'Obsolete render mode will crash in SU2017 and '\
'newer versions.'
MSG_INVALID =
'Invalid render mode will crash in SU2017 and '\
'newer versions.'

Constants inherited from SketchUp::Cop

SketchUp::Cop::SKETCHUP_DEPARTMENT_SEVERITY

Constants included from SketchUp::Config

SketchUp::Config::DEFAULT_CONFIGURATION

Instance Method Summary collapse

Methods included from SketchUp::SketchUpTargetRange

included, #sketchup_target_max_version, #sketchup_target_min_version, #valid_for_target_sketchup_version?

Methods inherited from SketchUp::Cop

inherited, #relevant_file?

Instance Method Details

#on_send(node) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
# File 'lib/rubocop/sketchup/cop/bugs/render_mode.rb', line 51

def on_send(node)
  return unless valid_for_target_sketchup_version?

  value = set_render_mode(node)
  return if value.nil?
  return if RENDER_MODE_VALID.include?(value)

  value_node = node.arguments.last
  message = obsolete?(value) ? MSG_OBSOLETE : MSG_INVALID
  add_offense(value_node, message: message)
end