public override void VisitEnter(RppClass node)
 {
     if (node.BaseConstructorCall.BaseClassType2.Value.Name != "Object")
     {
         node.Type.BaseType = node.BaseConstructorCall.BaseClassType2.Value;
     }
 }
Beispiel #2
0
 private void CheckForNonDefinedAbstractMethods(RppClass node)
 {
     /*
     if (node.Modifiers.Contains(ObjectModifier.OmAbstract))
     {
     }
     */
     // TODO not implemented yet
 }
Beispiel #3
0
        public override void VisitEnter(RppClass node)
        {
            string typeName = node.GetNativeName();
            RTypeAttributes typeAttributes = GetTypeAttributes(node);

            RType classType;

            if (_outterTypes.Any())
            {
                RType outterType = _outterTypes.Peek();
                classType = outterType.DefineNestedType(typeName, typeAttributes, null);
            }
            else
            {
                classType = RppTypeSystem.GetOrCreateType(typeName, typeAttributes, null, null);
            }

            node.Type = classType;

            _outterTypes.Push(classType);

            string[] typeParamsNames = CombineGenericParameters(node.TypeParams.Select(tp => tp.Name));
            classType.DefineGenericParameters(typeParamsNames);
        }
Beispiel #4
0
 public override void VisitEnter(RppClass node)
 {
     _currentClass = node;
     node.ResolveGenericTypeConstraints(_currentClass.Scope, _diagnostic);
 }
Beispiel #5
0
 private static RTypeAttributes GetTypeAttributes(RppClass node)
 {
     RTypeAttributes attr = node.Kind == ClassKind.Class ? RTypeAttributes.Class : RTypeAttributes.Object;
     return attr | GetAttributes(node.Modifiers);
 }
Beispiel #6
0
 public override void VisitExit(RppClass node)
 {
     _outterTypes.Pop();
 }
Beispiel #7
0
 public override void VisitEnter(RppClass node)
 {
     node.Type.CreateNativeType();
 }
Beispiel #8
0
 public override void VisitEnter(RppClass node)
 {
     node.Type.InitializeNativeType(_module);
 }
Beispiel #9
0
 public override void VisitEnter(RppClass node)
 {
 }
Beispiel #10
0
 // class Bag[A : Item] -> resolves 'Item' and sets constraint to generic parameter
 private void ProcessTypeConstraints(RppClass node)
 {
     if (_currentType.IsGenericType)
     {
         _currentClass.ResolveGenericTypeConstraints(_currentClass.Scope, _diagnostic);
         ProcessGenerics(node.TypeParams, _currentType.GenericParameters);
     }
 }
Beispiel #11
0
        public override void VisitEnter(RppClass node)
        {
            _currentClass = node;
            _currentType = node.Type;

            ProcessTypeConstraints(node);
        }
Beispiel #12
0
        public override void VisitExit(RppClass node)
        {
            TypeBuilder clazz = node.Type.NativeType as TypeBuilder;
            Debug.Assert(clazz != null, "clazz != null");
            try
            {
                clazz.CreateType();
            } // TODO This is a hack, we should do our own semantic analyzes and find out which methods were not overriden
            catch (TypeLoadException exception)
            {
                MatchCollection groups = TypeExcSplitter.Matches(exception.Message);
                if (groups.Count != 3)
                {
                    throw;
                }

                string msg = $"Method '{groups[0]}' in class '{groups[1]}' does not have an implementation";
                throw new SemanticException(105, msg);
            }

            Console.WriteLine("Generated class");
        }
Beispiel #13
0
 private void CreateStaticConstructor(TypeBuilder typeBuilder, RppField instanceField, RppClass obj)
 {
     FieldInfo instanceFieldInfo = instanceField.FieldInfo.Native;
     ConstructorBuilder staticConstructor = typeBuilder.DefineTypeInitializer();
     _body = staticConstructor.GetILGenerator();
     instanceField.InitExpr.Accept(this);
     _body.Emit(OpCodes.Stsfld, instanceFieldInfo);
     _body.Emit(OpCodes.Ret);
 }
Beispiel #14
0
        public override void VisitEnter(RppClass node)
        {
            Console.WriteLine("Genering class: " + node.Name);
            _typeBuilder = node.Type.NativeType as TypeBuilder;
            Debug.Assert(_typeBuilder != null, "_typeBuilder != null");
            _closureId = 1;

            if (node.IsObject())
            {
                CreateStaticConstructor(_typeBuilder, node.InstanceField, node);
            }
        }
Beispiel #15
0
 public override void VisitEnter(RppClass node)
 {
     CheckForNonDefinedAbstractMethods(node);
 }