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