Beispiel #1
0
        public void Visit(ASTClassDefinition _class)
        {
            var name     = _class.Name;
            var baseName = _class.Base;

            Class newClass;

            if (baseName.Length == 0)
            {
                newClass = ObjectFactory.Class(name);
            }
            else
            {
                var baseClass = _environment.FindClass(baseName);
                if (baseClass == null)
                {
                    throw new CompilerException($"Base class '{name}' has not been defined.");
                }

                newClass = ObjectFactory.Class(name, baseClass);
            }

            _environment.AddClass(newClass);
            var memberDefinitions = _class.MemberDefinitions;

            for (int i = 0; i < memberDefinitions.Count; i++)
            {
                memberDefinitions[i].Accept(this, newClass);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Visit a class node and add the descriptor to the current scope
        /// </summary>
        /// <param name="n"></param>
        public override void VisitClassDefinition(ASTClassDefinition n)
        {
            CheckForGlobalScope(n.Name, n.Location);

            TypeClass cls = new TypeClass(n.Name);

            _currentClass = cls;
            n.Descriptor  = _scopeMgr.AddClass(cls.ClassName, cls, null);
            n.Type        = cls;
        }
Beispiel #3
0
        /// <summary>
        /// Define class-level scope --- per class
        /// </summary>
        /// <param name="n"></param>
        public override void VisitClassDefinition(ASTClassDefinition n)
        {
            _currentClass = new TypeClass(n.Name);
            var classScope = _scopeMgr.PushScope(string.Format("class {0}", _currentClass.ClassName));

            _currentClass.Descriptor = (ClassDescriptor)_scopeMgr.Find(n.Name, p => p is ClassDescriptor);

            var declarationType = CheckSubTree(n.Declarations);

            n.Type = _currentClass;

            _currentClass.Descriptor.Scope = _currentClass.Scope = classScope;

            AddCtorIfNone(classScope, n.Name);

            _scopeMgr.PopScope();
        }
Beispiel #4
0
 public override void VisitClassDefinition(ASTClassDefinition n)
 {
     _mgr.AddClass(n);
 }
Beispiel #5
0
 public override void VisitClassDefinition(ASTClassDefinition n)
 {
     _currentTypeBuilder = _typeManager.GetBuilderInfo(n.Name);
     n.Declarations.Visit(this);
 }
Beispiel #6
0
 /// <summary>
 /// Restore the scope of the class we're visiting, and then visit all of the child nodes.
 /// Pop the class scope when we're done.
 /// </summary>
 /// <param name="n"></param>
 public override void VisitClassDefinition(ASTClassDefinition n)
 {
     VisitClassBody(n.Type as TypeClass, n.Declarations);
 }
Beispiel #7
0
 /// <summary>
 /// We need to track the class name that we're visiting, so we can lookup the entry in
 /// TypeManager, so we can access the TypeBuilder and other fun stuff.
 /// </summary>
 /// <param name="n"></param>
 public override void VisitClassDefinition(ASTClassDefinition n)
 {
     _currentType = n.Name;
     n.Declarations.Visit(this);
 }
Beispiel #8
0
 public TypeBuilderInfo(ASTClassDefinition n, ModuleBuilder module)
 {
     Builder = module.DefineType(n.Name, TypeAttributes.Public);
     Init();
 }
Beispiel #9
0
 public void AddClass(ASTClassDefinition n)
 {
     TypeBuilderMap.Add(n.Name, new TypeBuilderInfo(n, Module));
 }