Skip to content

Commit 343c0b7

Browse files
committed
Require prism >= 0.18.0 (MatchWriteNode#targets and CaseMatchNode)
1 parent 45c8877 commit 343c0b7

3 files changed

Lines changed: 32 additions & 20 deletions

File tree

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ jobs:
4444
strategy:
4545
fail-fast: false
4646
matrix:
47-
prism: ['0.17.1']
47+
prism: ['0.18.0']
4848
env:
4949
GEMFILE_PRISM_VERSION: ${{matrix.prism}}
5050
steps:

lib/repl_completion/type_analyzer.rb

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -702,19 +702,31 @@ def evaluate_for_node(node, scope)
702702
end
703703

704704
def evaluate_case_node(node, scope)
705-
target = evaluate(node.predicate, scope) if node.predicate
705+
evaluate(node.predicate, scope) if node.predicate
706706
# TODO
707707
branches = node.conditions.map do |condition|
708-
->(s) { evaluate_case_match target, condition, s }
708+
->(s) { evaluate_case_when_condition condition, s }
709709
end
710710
if node.consequent
711711
branches << ->(s) { evaluate node.consequent, s }
712-
elsif node.conditions.any? { _1.is_a? Prism::WhenNode }
712+
else
713713
branches << ->(_s) { Types::NIL }
714714
end
715715
Types::UnionType[*scope.run_branches(*branches)]
716716
end
717717

718+
def evaluate_case_match_node(node, scope)
719+
target = evaluate(node.predicate, scope)
720+
# TODO
721+
branches = node.conditions.map do |condition|
722+
->(s) { evaluate_case_in_condition target, condition, s }
723+
end
724+
if node.consequent
725+
branches << ->(s) { evaluate node.consequent, s }
726+
end
727+
Types::UnionType[*scope.run_branches(*branches)]
728+
end
729+
718730
def evaluate_match_required_node(node, scope)
719731
value_type = evaluate node.value, scope
720732
evaluate_match_pattern value_type, node.pattern, scope
@@ -764,7 +776,8 @@ def evaluate_implicit_node(node, scope)
764776
def evaluate_match_write_node(node, scope)
765777
# /(?<a>)(?<b>)/ =~ string
766778
evaluate node.call, scope
767-
node.locals.each { scope[_1.to_s] = Types::UnionType[Types::STRING, Types::NIL] }
779+
locals = node.targets.map(&:name)
780+
locals.each { scope[_1.to_s] = Types::UnionType[Types::STRING, Types::NIL] }
768781
Types::BOOLEAN
769782
end
770783

@@ -947,21 +960,20 @@ def assign_numbered_parameters(numbered_parameters, scope, args, _kwargs)
947960
end
948961
end
949962

950-
def evaluate_case_match(target, node, scope)
951-
case node
952-
when Prism::WhenNode
953-
node.conditions.each { evaluate _1, scope }
954-
node.statements ? evaluate(node.statements, scope) : Types::NIL
955-
when Prism::InNode
956-
pattern = node.pattern
957-
if pattern.is_a?(Prism::IfNode) || pattern.is_a?(Prism::UnlessNode)
958-
cond_node = pattern.predicate
959-
pattern = pattern.statements.body.first
960-
end
961-
evaluate_match_pattern(target, pattern, scope)
962-
evaluate cond_node, scope if cond_node # TODO: conditional branch
963-
node.statements ? evaluate(node.statements, scope) : Types::NIL
963+
def evaluate_case_when_condition(node, scope)
964+
node.conditions.each { evaluate _1, scope }
965+
node.statements ? evaluate(node.statements, scope) : Types::NIL
966+
end
967+
968+
def evaluate_case_in_condition(target, node, scope)
969+
pattern = node.pattern
970+
if pattern.is_a?(Prism::IfNode) || pattern.is_a?(Prism::UnlessNode)
971+
cond_node = pattern.predicate
972+
pattern = pattern.statements.body.first
964973
end
974+
evaluate_match_pattern(target, pattern, scope)
975+
evaluate cond_node, scope if cond_node # TODO: conditional branch
976+
node.statements ? evaluate(node.statements, scope) : Types::NIL
965977
end
966978

967979
def evaluate_match_pattern(value, pattern, scope)

repl_completion.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,6 @@ Gem::Specification.new do |spec|
3131
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
3232
spec.require_paths = ["lib"]
3333

34-
spec.add_dependency "prism", ">= 0.17.1"
34+
spec.add_dependency "prism", ">= 0.18.0"
3535
spec.add_dependency "rbs", ">= 2.7.0"
3636
end

0 commit comments

Comments
 (0)