protected override void EnsureContent(FunctionModel fm) { foreach (var model in GetMemberModels(fm)) { _function.AddMember(model.Name, MemberFactory.CreateMember(model, ModuleFactory, GlobalScope, _function), overwrite: true); } }
public override IMember GetMember(string name) { if (_model != null) { var memberModel = GetMemberModels(_model).FirstOrDefault(m => m.Name == name); return(memberModel != null?MemberFactory.CreateMember(memberModel, ModuleFactory, GlobalScope, this) : null); } return(base.GetMember(name)); }
private IEnumerable <IPythonType> CreateBases(ClassModel cm, ModuleFactory mf, IGlobalScope gs) { var ntBases = cm.NamedTupleBases .Select(ntb => MemberFactory.CreateMember(ntb, ModuleFactory, GlobalScope, _cls)) .OfType <IPythonType>() .ToArray(); var is3x = mf.Module.Interpreter.LanguageVersion.Is3x(); var basesNames = cm.Bases.Select(b => is3x && b == "object" ? null : b).ExcludeDefault().ToArray(); var bases = basesNames.Select(mf.ConstructType).ExcludeDefault().Concat(ntBases).ToArray(); // Make sure base types are realized foreach (var b in bases.OfType <PythonLazyClassType>()) { b.EnsureContent(); } if (cm.GenericBaseParameters.Length > 0) { // Generic class. Need to reconstruct generic base so code can then // create specific types off the generic class. var genericBase = bases.OfType <IGenericType>().FirstOrDefault(b => b.Name == "Generic"); if (genericBase != null) { var typeVars = cm.GenericBaseParameters.Select(n => gs.Variables[n]?.Value).OfType <IGenericTypeParameter>().ToArray(); //Debug.Assert(typeVars.Length > 0, "Class generic type parameters were not defined in the module during restore"); if (typeVars.Length > 0) { var genericWithParameters = genericBase.CreateSpecificType(new ArgumentSet(typeVars, null, null)); if (genericWithParameters != null) { bases = bases.Except(Enumerable.Repeat(genericBase, 1)).Concat(Enumerable.Repeat(genericWithParameters, 1)).ToArray(); } } } else { Debug.Fail("Generic class does not have generic base."); } } if (bases.Length > 0) { _cls.AddMember("__base__", bases[0], true); } _cls.AddMember("__bases__", PythonCollectionType.CreateList(DeclaringModule.Interpreter.ModuleResolution.BuiltinsModule, bases), true); return(bases); }
protected override void EnsureContent(ClassModel cm) { var bases = CreateBases(cm, ModuleFactory, GlobalScope); _cls.SetBases(bases); if (cm.GenericParameterValues.Length > 0) { _cls.StoreGenericParameters( _cls, _cls.GenericParameters.Keys.ToArray(), cm.GenericParameterValues.ToDictionary( k => _cls.GenericParameters.Keys.First(x => x == k.Name), v => ModuleFactory.ConstructType(v.Type) ) ); } foreach (var model in GetMemberModels(cm)) { _cls.AddMember(model.Name, MemberFactory.CreateMember(model, ModuleFactory, GlobalScope, _cls), false); } _cls.AddMember("__class__", _cls, true); }