public static Expression CreateCallableFromMacroBody(BooCodeBuilder builder, MacroStatement macro) { // create closure for macro's body or null Expression macroBody = new NullLiteralExpression(); if (macro.Block.Statements.Count > 0) { var callableExpr = new BlockExpression {Body = macro.Block}; callableExpr.Parameters.Add( new ParameterDeclaration("OutputStream", builder.CreateTypeReference(typeof(TextWriter)))); macroBody = callableExpr; } return macroBody; }
public void Process(ClassDefinition cd) { cd.Accept(this); var parameters = GenericParameters.ToArray(); for (var i = 0; i < parameters.Length; ++i) { var param = parameters[i]; var gen = cd.GenericParameters.FirstOrDefault(gp => gp.Name.Equals(param.Name)); var found = gen != null; if (!found) { gen = _codeBuilder.CreateGenericParameterDeclaration(i, param.Name); } foreach (IType baseType in param.GetTypeConstraints()) { gen.BaseTypes.Add(_codeBuilder.CreateTypeReference(baseType)); } if (param.MustHaveDefaultConstructor) { gen.Constraints |= GenericParameterConstraints.Constructable; } if (param.IsValueType) { gen.Constraints |= GenericParameterConstraints.ValueType; } else if (param.IsClass) { gen.Constraints |= GenericParameterConstraints.ReferenceType; } if (param.Variance == Variance.Covariant) { gen.Constraints |= GenericParameterConstraints.Covariant; } else if (param.Variance == Variance.Contravariant) { gen.Constraints |= GenericParameterConstraints.Contravariant; } if (!found) { cd.GenericParameters.Add(gen); } } }
public void AddBaseType(IType type) { _cd.BaseTypes.Add(_codeBuilder.CreateTypeReference(type)); }