Пример #1
0
        private IEnumerable <CodeMemberField> GenerateFields(ClassDef c)
        {
            var ct     = types.TypeOf(c.name);
            var fields = ct.Table.table.Where(m => IsField(m.Value))
                         .OrderBy(f => f.Key);

            foreach (var field in fields)
            {
                var b = field.Value.First();
                var(fieldType, ns) = types.Translate(b.type);
                gen.EnsureImports(ns);
                yield return(new CodeMemberField(fieldType, field.Key)
                {
                    Attributes = MemberAttributes.Public
                });
            }
        }
Пример #2
0
        public CodeExpression VisitApplication(Application appl)
        {
            var fn   = appl.fn.Accept(this);
            var args = TranslateArgs(appl).ToArray();
            var dtFn = types.TypeOf(appl.fn);

            if (dtFn is ClassType c)
            {
                // applying a class type => calling constructor.
                var(csClass, nm) = types.Translate(dtFn);
                m.EnsureImports(nm);
                var e = m.New(csClass, args);
                return(e);
            }
            if (fn is CodeVariableReferenceExpression id)
            {
                var e = intrinsic.MaybeTranslate(id.Name, appl, args);
                if (e != null)
                {
                    return(e);
                }
            }
            else
            {
                if (fn is CodeFieldReferenceExpression field)
                {
                    var specialTranslator = GetSpecialTranslator(field);
                    if (specialTranslator != null)
                    {
                        var special = specialTranslator(m, field, args);
                        if (special != null)
                        {
                            return(special);
                        }
                    }

                    if (field.FieldName == "iteritems")
                    {
                        if (args.Length == 0)
                        {
                            // iteritems is Python 2.x returning an iterable over
                            // a dictionary's key-value pairs. In C#, just return
                            // the dictionary (assumes that we're dealing with a dictionary!)
                        }
                        return(field.Expression);
                    }
                    else if (field.FieldName == "itervalues")
                    {
                        if (args.Length == 0)
                        {
                            return(m.Access(field.Expression, "Values"));
                        }
                    }
                    else if (field.FieldName == "iterkeys")
                    {
                        if (args.Length == 0)
                        {
                            return(m.Access(field.Expression, "Keys"));
                        }
                    }
                }
            }
            return(m.Appl(fn, args));
        }