Class: Audition::Static::LiteralClassifier
- Inherits:
-
Object
- Object
- Audition::Static::LiteralClassifier
- Defined in:
- lib/audition/static/literal_classifier.rb
Overview
Classifies a Prism expression node by Ractor shareability:
:shareable proven deeply shareable
:mutable_string unfrozen String literal
:mutable_container Array/Hash literal or constructor
:shallow_freeze frozen container with mutable elements
:sync_primitive Mutex/Queue/... constructor
:proc lambda or proc
:default_proc Hash.new with a block; the block
survives .freeze and stays unshareable
:unknown cannot tell statically
Constant Summary collapse
- SYNC_PRIMITIVES =
%w[ Mutex Monitor Queue SizedQueue ConditionVariable Thread::Mutex Thread::Queue Thread::SizedQueue Thread::ConditionVariable ].freeze
- SHAREABLE_FACTORIES =
%w[Struct Class Module].freeze
Instance Method Summary collapse
-
#classify(node) ⇒ Symbol
Classification, see class docs.
- #const_name(node) ⇒ Object
-
#initialize(frozen_string_literal:) ⇒ LiteralClassifier
constructor
A new instance of LiteralClassifier.
Constructor Details
#initialize(frozen_string_literal:) ⇒ LiteralClassifier
Returns a new instance of LiteralClassifier.
27 28 29 |
# File 'lib/audition/static/literal_classifier.rb', line 27 def initialize(frozen_string_literal:) @frozen_string_literal = frozen_string_literal end |
Instance Method Details
#classify(node) ⇒ Symbol
Returns classification, see class docs.
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/audition/static/literal_classifier.rb', line 33 def classify(node) case node when Prism::IntegerNode, Prism::FloatNode, Prism::RationalNode, Prism::ImaginaryNode, Prism::SymbolNode, Prism::InterpolatedSymbolNode, Prism::TrueNode, Prism::FalseNode, Prism::NilNode, Prism::RegularExpressionNode, Prism::InterpolatedRegularExpressionNode :shareable when Prism::StringNode @frozen_string_literal ? :shareable : :mutable_string when Prism::InterpolatedStringNode classify_interpolated_string(node) when Prism::ArrayNode, Prism::HashNode, Prism::KeywordHashNode container_kind(node) when Prism::RangeNode ends = [node.left, node.right].compact if ends.all? { |n| classify(n) == :shareable } :shareable else :unknown end when Prism::LambdaNode :proc when Prism::CallNode classify_call(node) when Prism::IfNode ternary_kind(node) else :unknown end end |
#const_name(node) ⇒ Object
67 68 69 70 71 72 |
# File 'lib/audition/static/literal_classifier.rb', line 67 def const_name(node) case node when Prism::ConstantReadNode then node.name.to_s when Prism::ConstantPathNode then node.location.slice end end |