public RppClass(ClassKind kind, HashSet<ObjectModifier> modifiers, [NotNull] string name, [NotNull] IList<RppField> classParams, [NotNull] IEnumerable<IRppNode> classBody, [NotNull] IList<RppVariantTypeParam> typeParams, RppBaseConstructorCall baseConstructorCall) : base(name) { Kind = kind; BaseConstructorCall = baseConstructorCall; _classParams = classParams; // TODO all of this can be simplified, we don't need to separate body of class. We can just walk rpp nodes with visitors IEnumerable<IRppNode> rppNodes = classBody as IList<IRppNode> ?? classBody.ToList(); _funcs = rppNodes.OfType<RppFunc>().Where(f => !f.IsConstructor).ToList(); _funcs.ForEach(DefineFunc); var constrExprs = rppNodes.OfType<IRppExpr>().Where(n => !(n is RppField)).ToList(); // TODO for some reason RppField is also IRppExpr, I think it shouldn't be _typeParams = typeParams; Modifiers = modifiers; _constructors = rppNodes.OfType<RppFunc>().Where(f => f.IsConstructor).ToList(); _fields = _classParams.Where(param => param.MutabilityFlag != MutabilityFlag.MfUnspecified || IsCase).ToList(); rppNodes.OfType<RppField>().ForEach(_fields.Add); var primaryConstructor = CreatePrimaryConstructor(constrExprs); _constructors.Add(primaryConstructor); CreateProperties(); if (kind == ClassKind.Object) { string objectName = SymbolTable.GetObjectName(Name); ResolvableType instanceFieldType = new ResolvableType(new RTypeName(objectName)); InstanceField = new RppField(MutabilityFlag.MfVal, "_instance", Collections.NoModifiers, instanceFieldType, new RppNew(instanceFieldType, Collections.NoExprs)); _fields.Add(InstanceField); } _nested = rppNodes.OfType<RppClass>().ToList(); }
public override void Visit(RppBaseConstructorCall node) { _body.Emit(OpCodes.Ldarg_0); node.Args.ForEach(arg => arg.Accept(this)); if (node.BaseConstructor == null) { _body.Emit(OpCodes.Call, typeof(object).GetConstructor(new Type[0])); return; } ConstructorInfo constructor = node.BaseConstructor.Native as ConstructorInfo; Debug.Assert(constructor != null, "constructor != null, we should have figure out which constructor to use before"); _body.Emit(OpCodes.Call, constructor); }
public override void Visit(RppBaseConstructorCall node) { node.Args.ForEach(arg => arg.Accept(this)); }
public virtual void Visit(RppBaseConstructorCall node) { }