Ejemplo n.º 1
0
        // ResMemberDecl

        public override IResMemberDecl CreateInheritedDeclImpl(
            ResolveContext resContext,
            IResContainerBuilderRef resContainer,
            ILazy <IResMemberLineDecl> resLine,
            SourceRange range,
            IResMemberRef memberRef)
        {
            var firstRef  = (ResMethodRef)memberRef;
            var firstDecl = firstRef.Decl;

            var result = ResMethodDecl.Build(
                resContext.LazyFactory,
                resLine,
                range,
                firstDecl.Name,
                (builder) =>
            {
                // \todo: More substitution needed?
                // \todo: Add back in inheritance-related validation checks?

                /*
                 * if (firstRef.Body == null
                 *  && memberRefs.OfType<IResMethodRef>().Any((mr) => (mr.Body != null)))
                 * {
                 *  throw new NotImplementedException();
                 * }
                 */

                var subst     = new Substitution();
                var newParams = new List <ResVarDecl>();
                foreach (var oldParam in firstRef.Parameters)
                {
                    var newParam = new ResVarDecl(
                        range,
                        oldParam.Name,
                        oldParam.Type,
                        oldParam.Decl.Flags);
                    subst.Insert(oldParam.Decl, newParam);
                    newParams.Add(newParam);
                }

                builder.Parameters = newParams;
                builder.ResultType = firstRef.ResultType;
                builder.LazyBody   = resContext.LazyFactory.New(() =>
                                                                firstRef.Body == null ? null : firstRef.Body.Substitute(subst));
            });

            return(result);
        }
Ejemplo n.º 2
0
        public ResMethodDeclBuilder(
            ILazyFactory lazyFactory,
            ILazy <IResMemberLineDecl> line,
            SourceRange range,
            Identifier name)
            : base(lazyFactory)
        {
            var resMethodDecl = new ResMethodDecl(
                line,
                range,
                name,
                NewLazy(() => _parameters),
                NewLazy(() => _resultType),
                NewLazy(() => _lazyBody == null ? null : _lazyBody.Value),
                NewLazy(() => _flavor));

            SetValue(resMethodDecl);
        }