// 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); }
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); }