Esempio n. 1
0
        public IMember GetMember(IModuleContext context, string name)
        {
            IMember member;

            lock (_members) {
                if (_members.TryGetValue(name, out member))
                {
                    return(member);
                }

                // Special case names that we want to add to our own _members dict
                switch (name)
                {
                case "__mro__":
                    member = _members[name] = new AstPythonSequence(
                        (context as IPythonInterpreter)?.GetBuiltinType(BuiltinTypeId.Tuple),
                        DeclaringModule,
                        Mro
                        );
                    return(member);
                }
            }
            foreach (var m in Mro.Skip(1))
            {
                member = m.GetMember(context, name);
                if (member != null)
                {
                    return(member);
                }
            }
            return(null);
        }
Esempio n. 2
0
        private IPythonType MakeSequenceType(BuiltinTypeId typeId, IReadOnlyList <IPythonType> types)
        {
            var res = _scope.Interpreter.GetBuiltinType(typeId);

            if (types.Count > 0)
            {
                res = new AstPythonSequence(res, _scope.Module, types.Select(Finalize));
            }
            return(res);
        }
Esempio n. 3
0
 internal void SetBases(IPythonInterpreter interpreter, IEnumerable <IPythonType> bases)
 {
     if (Bases != null)
     {
         throw new InvalidOperationException("cannot set Bases multiple times");
     }
     Bases = bases.MaybeEnumerate().ToArray();
     lock (_members) {
         if (Bases.Count > 0)
         {
             _members["__base__"] = Bases[0];
         }
         _members["__bases__"] = new AstPythonSequence(interpreter?.GetBuiltinType(BuiltinTypeId.Tuple), DeclaringModule, Bases);
     }
 }
Esempio n. 4
0
        public IMember GetMember(IModuleContext context, string name)
        {
            IMember member;

            lock (_members) {
                if (!_members.TryGetValue(name, out member))
                {
                    switch (name)
                    {
                    case "__mro__":
                        member = _members[name] = new AstPythonSequence(
                            (context as IPythonInterpreter)?.GetBuiltinType(BuiltinTypeId.Tuple),
                            DeclaringModule,
                            Mro
                            );
                        break;
                    }
                }
            }
            return(member);
        }
        public IMember GetMember(IModuleContext context, string name)
        {
            IMember member;

            lock (_members) {
                if (_members.TryGetValue(name, out member))
                {
                    return(member);
                }

                // Special case names that we want to add to our own _members dict
                switch (name)
                {
                case "__mro__":
                    member = _members[name] = new AstPythonSequence(
                        (context as IPythonInterpreter)?.GetBuiltinType(BuiltinTypeId.Tuple),
                        DeclaringModule,
                        Mro,
                        (context as IPythonInterpreter)?.GetBuiltinType(BuiltinTypeId.TupleIterator)
                        );
                    return(member);
                }
            }
            if (Push())
            {
                try {
                    foreach (var m in Mro.Reverse())
                    {
                        if (m == this)
                        {
                            return(member);
                        }
                        member = member ?? m.GetMember(context, name);
                    }
                } finally {
                    Pop();
                }
            }
            return(null);
        }
        internal void SetBases(IPythonInterpreter interpreter, IEnumerable <IPythonType> bases)
        {
            lock (_members) {
                if (Bases != null)
                {
                    return; // Already set
                }

                Bases = bases.MaybeEnumerate().ToArray();
                if (Bases.Count > 0)
                {
                    _members["__base__"] = Bases[0];
                }

                _members["__bases__"] = new AstPythonSequence(
                    interpreter?.GetBuiltinType(BuiltinTypeId.Tuple),
                    DeclaringModule,
                    Bases,
                    interpreter?.GetBuiltinType(BuiltinTypeId.TupleIterator)
                    );
            }
        }
        public IPythonType GetTypeFromLiteral(Expression expr)
        {
            if (expr is ConstantExpression ce)
            {
                if (ce.Value == null)
                {
                    return(Interpreter.GetBuiltinType(BuiltinTypeId.NoneType));
                }
                switch (Type.GetTypeCode(ce.Value.GetType()))
                {
                case TypeCode.Boolean: return(Interpreter.GetBuiltinType(BuiltinTypeId.Bool));

                case TypeCode.Double: return(Interpreter.GetBuiltinType(BuiltinTypeId.Float));

                case TypeCode.Int32: return(Interpreter.GetBuiltinType(BuiltinTypeId.Int));

                case TypeCode.String: return(Interpreter.GetBuiltinType(BuiltinTypeId.Unicode));

                case TypeCode.Object:
                    if (ce.Value.GetType() == typeof(Complex))
                    {
                        return(Interpreter.GetBuiltinType(BuiltinTypeId.Complex));
                    }
                    else if (ce.Value.GetType() == typeof(AsciiString))
                    {
                        return(Interpreter.GetBuiltinType(BuiltinTypeId.Bytes));
                    }
                    else if (ce.Value.GetType() == typeof(BigInteger))
                    {
                        return(Interpreter.GetBuiltinType(BuiltinTypeId.Long));
                    }
                    else if (ce.Value.GetType() == typeof(Ellipsis))
                    {
                        return(Interpreter.GetBuiltinType(BuiltinTypeId.Ellipsis));
                    }
                    break;
                }
                return(null);
            }

            if (expr is ListExpression || expr is ListComprehension)
            {
                return(Interpreter.GetBuiltinType(BuiltinTypeId.List));
            }
            if (expr is DictionaryExpression || expr is DictionaryComprehension)
            {
                return(Interpreter.GetBuiltinType(BuiltinTypeId.Dict));
            }
            if (expr is TupleExpression tex)
            {
                var types = tex.Items
                            .Select(x => {
                    IPythonType t = null;
                    if (x is NameExpression ne)
                    {
                        t = (GetInScope(ne.Name) as AstPythonConstant)?.Type;
                    }
                    return(t ?? Interpreter.GetBuiltinType(BuiltinTypeId.Unknown));
                }).ToArray();
                var res = Interpreter.GetBuiltinType(BuiltinTypeId.Tuple);
                if (types.Length > 0)
                {
                    var iterRes = Interpreter.GetBuiltinType(BuiltinTypeId.TupleIterator);
                    res = new AstPythonSequence(res, Module, types, iterRes);
                }
                return(res);
            }
            if (expr is SetExpression || expr is SetComprehension)
            {
                return(Interpreter.GetBuiltinType(BuiltinTypeId.Set));
            }
            if (expr is LambdaExpression)
            {
                return(Interpreter.GetBuiltinType(BuiltinTypeId.Function));
            }

            return(null);
        }