11.3.6
change wvxtzplruvmknnzlolnzslmkqnrzvlus
commit a5cd996d15493d06466878eda68220eb1beb6a34
author Alpha Chen <alpha@kejadlen.dev>
date
parent rwlxruqk
diff --git a/ruby/lib/lox/resolver.rb b/ruby/lib/lox/resolver.rb
index 9143a4b..6480a02 100644
--- a/ruby/lib/lox/resolver.rb
+++ b/ruby/lib/lox/resolver.rb
@@ -22,6 +22,36 @@ module Lox
       nil
     end
 
+    def visit_expr(stmt)
+      resolve(stmt.expr)
+      nil
+    end
+
+    def visit_function(stmt)
+      declare(stmt.name)
+      define(stmt.name)
+
+      resolve_function(stmt)
+      nil
+    end
+
+    def visit_if(stmt)
+      resolve(stmt.condition)
+      resolve(stmt.then)
+      resolve(stmt.else) if stmt.else
+      nil
+    end
+
+    def visit_print(stmt)
+      resolve(stmt.expr)
+      nil
+    end
+
+    def visit_return(stmt)
+      resolve(stmt.value) if stmt.value
+      nil
+    end
+
     def visit_var(stmt)
       declare(stmt.name)
       resolve(stmt.initializer) if stmt.initializer
@@ -29,6 +59,12 @@ module Lox
       nil
     end
 
+    def visit_while(stmt)
+      resolve(stmt.condition)
+      resolve(stmt.body)
+      nil
+    end
+
     def visit_variable(expr)
       if !@scopes.empty? && @scopes.last[expr.name.lexeme] == false
         raise ResolverError.new(expr.name, "Can't read local variable in its own initializer.")
@@ -44,11 +80,33 @@ module Lox
       nil
     end
 
-    def visit_function(stmt)
-      declare(stmt.name)
-      define(stmt.name)
+    def visit_binary(expr)
+      resolve(expr.left)
+      resolve(expr.right)
+      nil
+    end
 
-      resolve_function(stmt)
+    def visit_call(expr)
+      resolve(expr.callee, *expr.args)
+      nil
+    end
+
+    def visit_grouping(expr)
+      resolve(expr.expr)
+      nil
+    end
+
+    def visit_literal(expr)
+      nil
+    end
+
+    def visit_logical(expr)
+      resolve(expr.left, expr.right)
+      nil
+    end
+
+    def visit_unary(expr)
+      resolve(expr.right)
       nil
     end