public AstMethod(string comment, IReadOnlyList <AstAttribute> attrs, Modifiers modifiers, string cond, AstExpression dataType, AstExpression optionalInterfaceType, AstIdentifier name, IReadOnlyList <AstParameter> argList, AstGenericSignature optionalGenericSig, AstScope body) : base(comment, attrs, modifiers, cond, dataType, name) { OptionalInterfaceType = optionalInterfaceType; Parameters = argList; OptionalGenericSignature = optionalGenericSig; OptionalBody = body; }
void CreateGenericSignature(DataType gt, AstGenericSignature sig, bool isOverriddenMethodOrExplicitInterfaceImplementation) { var result = new GenericParameterType[sig.Parameters.Count]; if (isOverriddenMethodOrExplicitInterfaceImplementation) { if (sig.Constraints.Count > 0) { Log.Error(sig.Constraints[0].Parameter.Source, ErrorCode.E0000, "Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly"); } } else { for (int i = 0; i < sig.Constraints.Count; i++) { var c1 = sig.Constraints[i]; var found = false; for (int j = 0; j < sig.Parameters.Count; j++) { if (sig.Parameters[j].Symbol == c1.Parameter.Symbol) { found = true; break; } } if (!found) { Log.Error(c1.Parameter.Source, ErrorCode.E0000, "Generic parameter " + c1.Parameter.Symbol.Quote() + " does not exist"); continue; } for (int j = 0; j < i; j++) { var c2 = sig.Constraints[j]; if (c1.Parameter.Symbol == c2.Parameter.Symbol) { Log.Error(c1.Parameter.Source, ErrorCode.E0000, "Generic constraint for parameter " + c1.Parameter.Symbol.Quote() + " is already defined at " + c2.Parameter.Source); } } } } for (int i = 0, l = sig.Parameters.Count; i < l; i++) { var p = sig.Parameters[i]; result[i] = new GenericParameterType(p.Source, gt, p.Symbol); for (int j = 0; j < sig.Constraints.Count; j++) { var c = sig.Constraints[j]; if (c.Parameter.Symbol == p.Symbol) { if (c.BaseTypes != null) { EnqueueType(result[i], x => CompileBaseTypes(x, c.BaseTypes), x => { }); } if (c.Type != 0) { result[i].SetConstraintType((GenericConstraintType)c.Type); } if (c.OptionalConstructor != null) { result[i].Constructors.Add(new Constructor(c.OptionalConstructor, result[i], null, Modifiers.Public | Modifiers.Generated | Modifiers.Extern, ParameterList.Empty)); } break; } } if (result[i].AssigningBaseType == null) { EnqueueType(result[i], x => x.SetBase(_ilf.Essentials.Object), x => { }); } } gt.MakeGenericDefinition(result); }