示例#1
0
        public static object __Translate(IExternalTranslationContext ctx, object src)
        {
            CallConstructor x = src as CallConstructor;

            if (x == null)
            {
                return(null);
            }
            if (x.Arguments.Length != 0)
            {
                throw new NotSupportedException();
            }
            var g = new PhpArrayCreateExpression();
            var a = x.Initializers.Cast <IValueTable_PseudoValue>().ToArray();
            List <IPhpValue> o = new List <IPhpValue>();

            foreach (var i in a)
            {
                var a1    = i as IValueTable_PseudoValue;
                var a2    = a1.Items[0];
                var a3    = a1.Items[1];
                var key   = ctx.TranslateValue(a2);
                var value = ctx.TranslateValue(a3);
                var t     = new PhpAssignExpression(key, value);
                o.Add(t);
            }
            g.Initializers = o.ToArray();
            return(g);
        }
        protected override IPhpStatement[] VisitLocalDeclarationStatement(LocalDeclarationStatement src)
        {
            var s = new List <IPhpStatement>();

            foreach (var i in src.Declaration.Declarators)
            {
                /// to jest przypadek z c# 'int x;', dla php można to pominąć
                if (i.Value == null)
                {
                    continue;
                }
                if (i.Value is UnknownIdentifierValue)
                {
                    throw new NotImplementedException();
                }
                var l  = new PhpVariableExpression(PhpVariableExpression.AddDollar(i.Name), PhpVariableKind.Local);
                var r  = TransValue(i.Value);
                var tt = new PhpAssignExpression(l, r);
                s.Add(new PhpExpressionStatement(tt));

                //var r = new PhpAssignVariable( PhpVariableExpression.AddDollar(i.Name), false );
                //// r.Name = "$" + i.Name;
                //r.Value = TV(i.Value);
                //s.Add(r);
            }

            return(s.ToArray());
        }
示例#3
0
 protected virtual T VisitPhpAssignExpression(PhpAssignExpression node)
 {
     if (ThrowNotImplementedException)
     {
         throw new NotImplementedException(string.Format("Method {0} is not supported in class {1}", "VisitPhpAssignExpression", this.GetType().FullName));
     }
     return(default(T));
 }
示例#4
0
        protected override IPhpValue VisitAssignExpression(CsharpAssignExpression src)
        {
            var l  = TransValue(src.Left);
            var r  = TransValue(src.Right);
            var op = src.OptionalOperator;

            if (op == "+")
            {
                var vt = (src as IValue).ValueType;
                if (vt == typeof(string))
                {
                    op = ".";
                }
            }
            var a = new PhpAssignExpression(l, r, op);

            return(SimplifyPhpExpression(a));
        }
示例#5
0
        protected override IPhpStatement[] VisitVariableDeclaration(VariableDeclaration src)
        {
            //throw new Exception("DELETE THIS ??????");
            var s = new List <IPhpStatement>();

            foreach (var i in src.Declarators)
            {
                var l  = new PhpVariableExpression(PhpVariableExpression.AddDollar(i.Name), PhpVariableKind.Local);
                var r  = TransValue(i.Value);
                var tt = new PhpAssignExpression(l, r);
                s.Add(new PhpExpressionStatement(tt));

                //var r = new PhpAssignVariable(PhpVariableExpression.AddDollar(i.Name), false);
                //r.Value = TV(i.Value);
                //s.Add(r);
            }
            return(s.ToArray());
        }
        public IPhpValue TranslateToPhp(IExternalTranslationContext ctx, CsharpMethodCallExpression src)
        {
            if (src.MethodInfo.DeclaringType != typeof(StringExtension))
            {
                return(null);
            }
            if (src.MethodInfo.Name != "PhpExplodeList")
            {
                return(null);
            }
            var a = src.Arguments
                    .Select(ctx.TranslateValue)
                    .Cast <PhpMethodInvokeValue>()
                    .ToArray();



            var list = new PhpMethodCallExpression("list");

            list.Arguments.AddRange(a.Skip(2));
            foreach (var i in list.Arguments)
            {
                i.ByRef = false;
            }


            var explode = new PhpMethodCallExpression("explode");

            explode.Arguments.Add(a[1]);
            explode.Arguments.Add(a[0]);

            var aa = new PhpAssignExpression(list, explode);

            return(aa);


            // throw new NotSupportedException();
            //  throw new NotSupportedException();
        }
示例#7
0
        public IPhpValue TranslateToPhp(IExternalTranslationContext ctx, CsharpMethodCallExpression src)
        {
            if (src.MethodInfo.DeclaringType == typeof(MySQLiResult))
            {
                var fn = src.MethodInfo.ToString();
                if (src.MethodInfo.IsGenericMethod)
                {
                    fn = src.MethodInfo.GetGenericMethodDefinition().ToString();
                }
                if (fn == "Boolean Fetch[T](T ByRef)")
                {
                    // was  "T Fetch[T]()"
                    var typeArgs    = src.MethodInfo.GetGenericArguments();
                    var genTypeInfo = ctx.GetTranslationInfo().GetOrMakeTranslationInfo(typeArgs[0]);
                    if (genTypeInfo.IsArray)
                    {
                        var arg         = ctx.TranslateValue(src.Arguments[0].MyValue);
                        var fetchMethod = new PhpMethodCallExpression("fetch_assoc");
                        fetchMethod.TargetObject = ctx.TranslateValue(src.TargetObject);
                        var assoc = new PhpAssignExpression(arg, fetchMethod);
                        return(assoc);
                    }
                    else
                    {
                        throw new NotSupportedException(fn);
                    }
                    // Console.WriteLine(c);
                }
                // throw new NotSupportedException(fn);
            }
            if (src.MethodInfo.DeclaringType == typeof(MySQLiStatement))
            {
                if (src.MethodInfo.Name == "BindParams") // all BindParams methods
                {
                    #region BindParams
                    var a        = src.MethodInfo.GetParameters();
                    var phptypes = new StringBuilder(a.Length);
                    foreach (var i in a)
                    {
                        var j = i.ParameterType;
                        var t = j.GetGenericArguments()[0];
                        if (t == typeof(string))
                        {
                            phptypes.Append("s");
                        }
                        else if (t == typeof(Double) ||
                                 t == typeof(Single) ||
                                 t == typeof(Decimal))
                        {
                            phptypes.Append("d");
                        }
                        else if (t == typeof(Int64) ||
                                 t == typeof(Int32) ||
                                 t == typeof(Byte) ||
                                 t == typeof(UInt64) ||
                                 t == typeof(UInt32) ||
                                 t == typeof(UInt16))
                        {
                            phptypes.Append("i");
                        }
                        else if (t == typeof(byte[]))
                        {
                            phptypes.Append("b");
                        }
                        else
                        {
                            throw new NotSupportedException(string.Format("Type {0} is not supported by MySQLiStatement.BindParams", t));
                        }
                    }
                    var values = new List <IPhpValue>();
                    values.Add(new PhpConstValue(phptypes.ToString()));
                    foreach (var i in src.Arguments)
                    {
                        values.Add(ctx.TranslateValue(i.MyValue));
                    }
                    var result = new PhpMethodCallExpression("bind_param", values.ToArray());
                    result.TargetObject = ctx.TranslateValue(src.TargetObject);
                    return(result);

                    #endregion
                }
                if (src.MethodInfo.Name == "BindResult") // all BindResult methods
                {
                    #region BindResult
                    var a      = src.MethodInfo.GetParameters();
                    var values = new List <IPhpValue>();
                    foreach (var i in src.Arguments)
                    {
                        values.Add(ctx.TranslateValue(i.MyValue));
                    }
                    var result = new PhpMethodCallExpression("bind_result", values.ToArray());
                    result.TargetObject = ctx.TranslateValue(src.TargetObject);
                    return(result);

                    #endregion
                }
            }
            return(null);
        }
示例#8
0
        private void TranslateField(PhpCodeModule module, PhpClassDefinition phpClass, FieldDeclaration field)
        {
            PhpValueTranslator phpValueTranslator = null;

            foreach (var item in field.Items)
            {
                if (item.OptionalFieldInfo == null)
                {
                    continue;
                }
                var fti = Info.GetOrMakeTranslationInfo(item.OptionalFieldInfo);
                switch (fti.Destination)
                {
                case FieldTranslationDestionations.DefinedConst:
                    if (item.Value == null)
                    {
                        throw new NotSupportedException();
                    }
                    if (phpValueTranslator == null)
                    {
                        phpValueTranslator = new PhpValueTranslator(_state);
                    }
                    var definedValue = phpValueTranslator.TransValue(item.Value);
                    {
                        if (fti.IncludeModule != module.Name)
                        {
                            module = GetOrMakeModuleByName(fti.IncludeModule);
                        }
                    }
                    module.DefinedConsts.Add(new KeyValuePair <string, IPhpValue>(fti.ScriptName, definedValue));
                    break;

                case FieldTranslationDestionations.GlobalVariable:
                    if (item.Value != null)
                    {
                        IPhpValue value;
                        // muszę na chwilę wyłączyć current type, bo to jes poza klasą generowane
                        {
                            var saveCurrentType = _state.Principles.CurrentType;
                            _state.Principles.CurrentType = null;
                            try
                            {
                                if (phpValueTranslator == null)
                                {
                                    phpValueTranslator = new PhpValueTranslator(_state);
                                }
                                value = phpValueTranslator.TransValue(item.Value);
                            }
                            finally
                            {
                                _state.Principles.CurrentType = saveCurrentType;
                            }
                        }

                        var assign = new PhpAssignExpression(PhpVariableExpression.MakeGlobal(fti.ScriptName),
                                                             value);
                        module.TopCode.Statements.Add(new PhpExpressionStatement(assign));
                    }

                    break;

                case FieldTranslationDestionations.JustValue:
                    continue;     // don't define

                case FieldTranslationDestionations.NormalField:
                case FieldTranslationDestionations.ClassConst:
                {
                    var def = new PhpClassFieldDefinition();
                    var cti = _state.Principles.GetTi(_state.Principles.CurrentType, true);
                    if (cti.IsArray)
                    {
                        continue;
                    }
                    if (field.Modifiers.Has("const") ^
                        (fti.Destination == FieldTranslationDestionations.ClassConst))
                    {
                        throw new Exception("beige lion");
                    }

                    def.IsConst =
                        fti.Destination ==
                        FieldTranslationDestionations.ClassConst;     // field.Modifiers.Has("const");
                    def.Name = fti.ScriptName;

                    def.IsStatic = def.IsConst || field.Modifiers.Has("static");
                    if (field.Modifiers.Has("public"))
                    {
                        def.Visibility = Visibility.Public;
                    }
                    else if (field.Modifiers.Has("protected"))
                    {
                        def.Visibility = Visibility.Protected;
                    }
                    else
                    {
                        def.Visibility = Visibility.Private;
                    }

                    if (item.Value != null)
                    {
                        if (phpValueTranslator == null)
                        {
                            phpValueTranslator = new PhpValueTranslator(_state);
                        }
                        def.ConstValue = phpValueTranslator.TransValue(item.Value);
                    }

                    phpClass.Fields.Add(def);
                    break;
                }

                default:
                    throw new NotSupportedException();
                }
            }
        }
        /// <summary>
        /// Creates expression based on DirectCallAttribute
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="directCallAttribute"></param>
        /// <param name="targetObject"></param>
        /// <param name="arguments"></param>
        /// <returns></returns>
        public static IPhpValue CreateExpressionFromDirectCallAttribute(IExternalTranslationContext ctx, DirectCallAttribute directCallAttribute, IValue targetObject, FunctionArgument[] arguments, MethodBase methodInfo)
        {
            if (directCallAttribute.CallType == MethodCallStyles.Static)
            {
                throw new NotSupportedException();
            }
            if (directCallAttribute.MemberToCall != ClassMembers.Method)
            {
                throw new NotSupportedException();
            }

            if (string.IsNullOrEmpty(directCallAttribute.Name))
            {
                var ma = directCallAttribute.MapArray;
                if (ma.Length != 1)
                {
                    throw new NotSupportedException("gray horse 1");
                }
                if (ma[0] == DirectCallAttribute.This)
                {
                    if (targetObject == null)
                    {
                        throw new NotSupportedException("gray horse 2");
                    }
                    return(ctx.TranslateValue(targetObject));
                }
                //  return phpMethod.Arguments[ma[0]].Expression
                return(ctx.TranslateValue(arguments[ma[0]].MyValue));
            }
            var name = directCallAttribute.Name;


            var phpMethod = new PhpMethodCallExpression(name);

            if (directCallAttribute.CallType == MethodCallStyles.Instance)
            {
                if (targetObject == null)
                {
                    throw new NotSupportedException("gray horse 3");
                }
                phpMethod.TargetObject = ctx.TranslateValue(targetObject);
            }

            {
                List <int> skipRefIndexList = null;
                if (methodInfo != null)
                {
                    var skipRefOrOutArray = directCallAttribute.SkipRefOrOutArray;
                    if (skipRefOrOutArray.Any())
                    {
                        var parameters = methodInfo.GetParameters();
                        for (var index = 0; index < parameters.Length; index++)
                        {
                            if (!skipRefOrOutArray.Contains(parameters[index].Name))
                            {
                                continue;
                            }
                            if (skipRefIndexList == null)
                            {
                                skipRefIndexList = new List <int>();
                            }
                            skipRefIndexList.Add(index);
                        }
                    }
                }
                CopyArguments(ctx, arguments, phpMethod, skipRefIndexList);
            }

            #region Mapping
            if (directCallAttribute.HasMapping)
            {
                var phpArguments = phpMethod.Arguments.ToArray();
                phpMethod.Arguments.Clear();
                foreach (var argNr in directCallAttribute.MapArray)
                {
                    if (argNr == DirectCallAttribute.This)
                    {
                        if (targetObject == null)
                        {
                            throw new NotSupportedException();
                        }
                        var v = ctx.TranslateValue(targetObject);
                        phpMethod.Arguments.Add(new PhpMethodInvokeValue(v));
                    }
                    else
                    {
                        if (argNr < phpArguments.Length)
                        {
                            phpMethod.Arguments.Add(phpArguments[argNr]);
                        }
                    }
                }
            }
            #endregion
            #region Out

            if (directCallAttribute.OutNr >= 0)
            {
                var nr = directCallAttribute.OutNr;
                var movedExpression = phpMethod.Arguments[nr].Expression;
                phpMethod.Arguments.RemoveAt(nr);
                var a = new PhpAssignExpression(movedExpression, phpMethod);
                return(a);
            }

            #endregion
            return(phpMethod);
        }
示例#10
0
 protected override IPhpValue VisitPhpAssignExpression(PhpAssignExpression node)
 {
     return(node.Simplify(this));
 }