private void DefineClass(Token name, PerlangClass perlangClass) { if (globals.TryGetValue(name.Lexeme, out IBindingFactory? bindingFactory)) { nameResolutionErrorHandler(new NameResolutionError($"{bindingFactory.ObjectTypeTitleized} {name.Lexeme} already defined; cannot redefine", name)); return; } globals[name.Lexeme] = new ClassBindingFactory(perlangClass); addGlobalClassCallback(name.Lexeme, perlangClass); }
public VoidObject VisitClassStmt(Stmt.Class stmt) { // TODO: Implement resolution related to classes: handle fields defined in the class, resolve method // TODO: arguments, etc. Declare(stmt.Name); var perlangClass = new PerlangClass(stmt.Name.Lexeme, stmt.Methods); DefineClass(stmt.Name, perlangClass); return(VoidObject.Void); }
private static void AssertFailAddGlobalClassHandler(string name, PerlangClass perlangClass) { throw new Exception($"Unexpected global class {name} attempted to be added. Global class: {perlangClass}"); }
public ClassBinding(Expr referringExpr, PerlangClass perlangClass) : base(new TypeReference(typeof(PerlangClass)), referringExpr) { PerlangClass = perlangClass; }
public ClassBindingFactory(PerlangClass perlangClass) { this.perlangClass = perlangClass ?? throw new ArgumentException("perlangClass cannot be null"); }