示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
 private static void AssertFailAddGlobalClassHandler(string name, PerlangClass perlangClass)
 {
     throw new Exception($"Unexpected global class {name} attempted to be added. Global class: {perlangClass}");
 }
示例#4
0
 public ClassBinding(Expr referringExpr, PerlangClass perlangClass)
     : base(new TypeReference(typeof(PerlangClass)), referringExpr)
 {
     PerlangClass = perlangClass;
 }
示例#5
0
 public ClassBindingFactory(PerlangClass perlangClass)
 {
     this.perlangClass = perlangClass ?? throw new ArgumentException("perlangClass cannot be null");
 }