コード例 #1
0
ファイル: AstMethod.cs プロジェクト: mortend/uno
 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;
 }
コード例 #2
0
        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);
        }