Class: Spoom::Deadcode::Remover::NodeContext
- Inherits:
-
Object
- Object
- Spoom::Deadcode::Remover::NodeContext
- Defined in:
- lib/spoom/deadcode/remover.rb
Instance Attribute Summary collapse
-
#comments ⇒ Object
readonly
: Hash[Integer, Prism::Comment].
-
#nesting ⇒ Object
: Array.
-
#node ⇒ Object
readonly
: Prism::Node.
Instance Method Summary collapse
-
#attached_comments(node) ⇒ Object
: (Prism::Node node) -> Array.
-
#attached_sig ⇒ Object
: -> Prism::CallNode?.
-
#attached_sigs ⇒ Object
: -> Array.
-
#comments_between_lines(start_line, end_line) ⇒ Object
: (Integer start_line, Integer end_line) -> Array.
-
#initialize(source, comments, node, nesting) ⇒ NodeContext
constructor
: (String source, Hash[Integer, Prism::Comment] comments, Prism::Node node, Array nesting) -> void.
-
#next_node ⇒ Object
: -> Prism::Node?.
-
#next_nodes ⇒ Object
: -> Array.
-
#parent_context ⇒ Object
: -> NodeContext.
-
#parent_node ⇒ Object
: -> Prism::Node.
-
#previous_node ⇒ Object
: -> Prism::Node?.
-
#previous_nodes ⇒ Object
: -> Array.
-
#sclass_context ⇒ Object
: -> NodeContext?.
-
#sorbet_extend_sig?(node) ⇒ Boolean
: (Prism::Node? node) -> bool.
-
#sorbet_signature?(node) ⇒ Boolean
: (Prism::Node? node) -> bool.
Constructor Details
#initialize(source, comments, node, nesting) ⇒ NodeContext
: (String source, Hash[Integer, Prism::Comment] comments, Prism::Node node, Array nesting) -> void
373 374 375 376 377 378 |
# File 'lib/spoom/deadcode/remover.rb', line 373 def initialize(source, comments, node, nesting) @source = source @comments = comments @node = node @nesting = nesting end |
Instance Attribute Details
#comments ⇒ Object (readonly)
: Hash[Integer, Prism::Comment]
364 365 366 |
# File 'lib/spoom/deadcode/remover.rb', line 364 def comments @comments end |
#nesting ⇒ Object
: Array
370 371 372 |
# File 'lib/spoom/deadcode/remover.rb', line 370 def nesting @nesting end |
#node ⇒ Object (readonly)
: Prism::Node
367 368 369 |
# File 'lib/spoom/deadcode/remover.rb', line 367 def node @node end |
Instance Method Details
#attached_comments(node) ⇒ Object
: (Prism::Node node) -> Array
487 488 489 490 491 492 493 494 495 496 497 498 499 |
# File 'lib/spoom/deadcode/remover.rb', line 487 def attached_comments(node) comments = T.let([], T::Array[Prism::Comment]) start_line = node.location.start_line - 1 start_line.downto(1) do |line| comment = @comments[line] break unless comment comments << comment end comments.reverse end |
#attached_sig ⇒ Object
: -> Prism::CallNode?
515 516 517 518 519 520 521 522 523 524 525 526 527 |
# File 'lib/spoom/deadcode/remover.rb', line 515 def attached_sig previous_nodes.reverse_each do |node| if node.is_a?(Prism::Comment) next elsif sorbet_signature?(node) return T.cast(node, Prism::CallNode) else break end end nil end |
#attached_sigs ⇒ Object
: -> Array
502 503 504 505 506 507 508 509 510 511 512 |
# File 'lib/spoom/deadcode/remover.rb', line 502 def attached_sigs nodes = T.let([], T::Array[Prism::Node]) previous_nodes.reverse_each do |prev_node| break unless sorbet_signature?(prev_node) nodes << prev_node end nodes.reverse end |
#comments_between_lines(start_line, end_line) ⇒ Object
: (Integer start_line, Integer end_line) -> Array
475 476 477 478 479 480 481 482 483 484 |
# File 'lib/spoom/deadcode/remover.rb', line 475 def comments_between_lines(start_line, end_line) comments = T.let([], T::Array[Prism::Comment]) (start_line + 1).upto(end_line - 1) do |line| comment = @comments[line] comments << comment if comment end comments end |
#next_node ⇒ Object
: -> Prism::Node?
425 426 427 |
# File 'lib/spoom/deadcode/remover.rb', line 425 def next_node next_nodes.first end |
#next_nodes ⇒ Object
: -> Array
414 415 416 417 418 419 420 421 422 |
# File 'lib/spoom/deadcode/remover.rb', line 414 def next_nodes parent = parent_node child_nodes = parent.child_nodes.compact index = child_nodes.index(node) raise Error, "Node #{@node} not found in nesting node #{parent}" unless index T.must(child_nodes.compact[(index + 1)..-1]) end |
#parent_context ⇒ Object
: -> NodeContext
389 390 391 392 393 394 395 |
# File 'lib/spoom/deadcode/remover.rb', line 389 def parent_context nesting = @nesting.dup parent = nesting.pop raise Error, "No parent context for node #{@node}" unless parent NodeContext.new(@source, @comments, parent, nesting) end |
#parent_node ⇒ Object
: -> Prism::Node
381 382 383 384 385 386 |
# File 'lib/spoom/deadcode/remover.rb', line 381 def parent_node parent = @nesting.last raise Error, "No parent for node #{node}" unless parent parent end |
#previous_node ⇒ Object
: -> Prism::Node?
409 410 411 |
# File 'lib/spoom/deadcode/remover.rb', line 409 def previous_node previous_nodes.last end |
#previous_nodes ⇒ Object
: -> Array
398 399 400 401 402 403 404 405 406 |
# File 'lib/spoom/deadcode/remover.rb', line 398 def previous_nodes parent = parent_node child_nodes = parent.child_nodes.compact index = child_nodes.index(@node) raise Error, "Node #{@node} not found in parent #{parent}" unless index T.must(child_nodes[0...index]) end |
#sclass_context ⇒ Object
: -> NodeContext?
430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 |
# File 'lib/spoom/deadcode/remover.rb', line 430 def sclass_context sclass = T.let(nil, T.nilable(Prism::SingletonClassNode)) nesting = @nesting.dup until nesting.empty? || sclass node = nesting.pop next unless node.is_a?(Prism::SingletonClassNode) sclass = node end return unless sclass.is_a?(Prism::SingletonClassNode) body = sclass.body return NodeContext.new(@source, @comments, sclass, nesting) unless body.is_a?(Prism::StatementsNode) nodes = body.child_nodes.reject do |node| sorbet_signature?(node) || sorbet_extend_sig?(node) end if nodes.size <= 1 return NodeContext.new(@source, @comments, sclass, nesting) end nil end |
#sorbet_extend_sig?(node) ⇒ Boolean
: (Prism::Node? node) -> bool
463 464 465 466 467 468 469 470 471 472 |
# File 'lib/spoom/deadcode/remover.rb', line 463 def sorbet_extend_sig?(node) return false unless node.is_a?(Prism::CallNode) return false unless node.name == :extend args = node.arguments return false unless args return false unless args.arguments.size == 1 args.arguments.first&.slice == "T::Sig" end |
#sorbet_signature?(node) ⇒ Boolean
: (Prism::Node? node) -> bool
458 459 460 |
# File 'lib/spoom/deadcode/remover.rb', line 458 def sorbet_signature?(node) node.is_a?(Prism::CallNode) && node.name == :sig end |