Example #1
0
 protected override void EnsureContent(FunctionModel fm)
 {
     foreach (var model in GetMemberModels(fm))
     {
         _function.AddMember(model.Name, MemberFactory.CreateMember(model, ModuleFactory, GlobalScope, _function), overwrite: true);
     }
 }
Example #2
0
 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));
 }
Example #3
0
        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);
        }
Example #4
0
        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);
        }