From 62bd0f83dc909547a69abb8b0aed40cf098b4c95 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Tue, 15 Jun 2021 23:18:29 -0700 Subject: 13.3 Calling Superclass Methods --- src/com/craftinginterpreters/lox/Resolver.java | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'src/com/craftinginterpreters/lox/Resolver.java') diff --git a/src/com/craftinginterpreters/lox/Resolver.java b/src/com/craftinginterpreters/lox/Resolver.java index dc7332b..fe3a641 100644 --- a/src/com/craftinginterpreters/lox/Resolver.java +++ b/src/com/craftinginterpreters/lox/Resolver.java @@ -19,7 +19,7 @@ class Resolver implements Expr.Visitor, Stmt.Visitor { } private enum ClassType { - NONE, CLASS + NONE, CLASS, SUBCLASS } private ClassType currentClass = ClassType.NONE; @@ -51,9 +51,16 @@ class Resolver implements Expr.Visitor, Stmt.Visitor { } if (stmt.superclass != null) { + currentClass = ClassType.SUBCLASS; + resolve(stmt.superclass); } + if (stmt.superclass != null) { + beginScope(); + scopes.peek().put("super", true); + } + beginScope(); scopes.peek().put("this", true); @@ -67,6 +74,10 @@ class Resolver implements Expr.Visitor, Stmt.Visitor { endScope(); + if (stmt.superclass != null) { + endScope(); + } + currentClass = enclosingClass; return null; } @@ -183,6 +194,18 @@ class Resolver implements Expr.Visitor, Stmt.Visitor { return null; } + @Override + public Void visitSuperExpr(Expr.Super expr) { + if (currentClass == ClassType.NONE) { + Lox.error(expr.keyword, "Can't use 'super' outside of a class."); + } else if (currentClass != ClassType.SUBCLASS) { + Lox.error(expr.keyword, "Can't use 'super' in a class with no superclass."); + } + + resolveLocal(expr, expr.keyword); + return null; + } + @Override public Void visitThisExpr(Expr.This expr) { if (currentClass == ClassType.NONE) { -- cgit v1.2.3-54-g00ecf