Example #1
0
        public ResGenericDeclBuilder(
            ILazyFactory lazy,
            ILazy <IResMemberLineDecl> line,
            SourceRange range,
            Identifier name)
            : base(lazy)
        {
            var resGenericDecl = new ResGenericDecl(
                line,
                range,
                name,
                NewLazy(() => _parameters),
                NewLazy(() => _innerDecl));

            SetValue(resGenericDecl);
        }
Example #2
0
        // ResMemberDecl
        public override IResMemberDecl CreateInheritedDeclImpl(
            ResolveContext resContext,
            IResContainerBuilderRef resContainer,
            ILazy <IResMemberLineDecl> resLine,
            SourceRange range,
            IResMemberRef memberRef)
        {
            var firstRef = (IResGenericRef)memberRef;

            var result = ResGenericDecl.Build(
                resContext.LazyFactory,
                resLine,
                range,
                firstRef.Decl.Name,
                (builder) =>
            {
                var newParameters = new List <IResGenericParamDecl>();
                var subst         = new Substitution();
                foreach (var p in firstRef.Parameters)
                {
                    if (p is IResTypeParamRef)
                    {
                        var oldParameter = (IResTypeParamRef)p;
                        var newParameter = new ResTypeParamDecl(
                            oldParameter.Decl.Range,
                            oldParameter.Name,
                            oldParameter.Kind);
                        newParameters.Add(newParameter);
                        subst.Insert(oldParameter.Decl, (r) => new ResTypeVarRef(r, newParameter));
                    }
                    else if (p is IResVarSpec)
                    {
                        var oldParameter = (IResVarSpec)p;
                        var newParameter = new ResVarDecl(
                            oldParameter.Decl.Range,
                            oldParameter.Name,
                            resContext.LazyFactory.New(() => oldParameter.Type.Substitute(subst)),
                            oldParameter.Decl.Flags);
                        newParameters.Add(newParameter);
                        subst.Insert(oldParameter.Decl, (r) => new ResVarRef(r, newParameter));
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }
                }
                builder.Parameters = newParameters;

                var args = (from p in newParameters
                            select p.MakeGenericArg()).ToArray();

                var innerRef = firstRef.App(range, args);


                /*
                 * var innerCategoryGroup = new ResMemberCategoryGroup(
                 *  result,
                 *  new ResMemberNameGroup(result, result.Name),
                 *  new ResMethodCategory());
                 * var innerLine = new ResMemberDeclLine(
                 *  innerCategoryGroup,
                 *  new ResLexicalID());
                 */

                var thisGenericBuilderRef = new ResGenericBuilderRef(
                    range,
                    builder,
                    resContainer);

                var innerDecl = CreateInheritedDecl(
                    resContext,
                    thisGenericBuilderRef,
                    resLine,
                    range,
                    innerRef);

                builder.InnerDecl = innerDecl;
            });

            return(result);
        }