Beispiel #1
0
 public IPhpValue TranslateToPhp(IExternalTranslationContext ctx, CsharpInstancePropertyAccessExpression src)
 {
     if (src.Member.DeclaringType == typeof(MySQLi))
     {
         var n = src.Member.Name;
         if (n == "WasConnectionError" || n == "WasSuccessfulConnection")
         {
             // according to error http://www.php.net/manual/en/mysqli.construct.php
             IPhpValue getError;
             if (ctx.PhpVersion <= PhpVersions.PHP_5_3_0)
             {
                 getError = new PhpMethodCallExpression("mysqli_connect_error");
             }
             else
             {
                 getError = new PhpInstanceFieldAccessExpression("connect_error", ctx.TranslateValue(src.TargetObject), null);
             }
             var checkEmpty = new PhpMethodCallExpression("empty", getError);
             if (n == "WasSuccessfulConnection")
             {
                 return(checkEmpty);
             }
             var checkNotEmpty = new PhpUnaryOperatorExpression(checkEmpty, "!");
             return(checkNotEmpty);
         }
     }
     return(null);
 }
        public IPhpValue TranslateToPhp(IExternalTranslationContext ctx, CsharpInstancePropertyAccessExpression src)
        {
            if (src.Member.DeclaringType != typeof(DateTime))
            {
                return(null);
            }

            var to = ctx.TranslateValue(src.TargetObject);

            if (src.Member.Name == "Date")
            {
                if (to.ToString() == "new DateTime()")
                {
                    // echo 'Current time: ' . date('Y-m-d H:i:s') . "\n";
                    var co  = new PhpMethodCallExpression("date", new PhpConstValue(DateOnly));
                    var co1 = new PhpMethodCallExpression("date_create_from_format", new PhpConstValue(DateOnly), co);
                    return(co1);
                }
                else
                {
                    var _for = new PhpMethodCallExpression(to, "format", new PhpConstValue(DateOnly));
                    var co   = new PhpMethodCallExpression("date_create_from_format",
                                                           _for, new PhpConstValue(DateOnly));
                    return(co);
                }
            }
            if (src.Member.Name == "Day")
            {
                return(GetDatePart(to, "d"));
            }
            if (src.Member.Name == "Month")
            {
                return(GetDatePart(to, "m"));
            }
            if (src.Member.Name == "Year")
            {
                return(GetDatePart(to, "Y"));
            }

            if (src.Member.Name == "Hour")
            {
                return(GetDatePart(to, "H"));
            }
            if (src.Member.Name == "Minute")
            {
                return(GetDatePart(to, "i"));
            }
            if (src.Member.Name == "Second")
            {
                return(GetDatePart(to, "s"));
            }

            throw new NotImplementedException();
        }
 public IPhpValue TranslateToPhp(IExternalTranslationContext ctx, CsharpInstancePropertyAccessExpression src)
 {
     if (src.Member.DeclaringType == typeof(StringBuilder))
     {
         var n = src.Member.Name;
         if (n == "Length")
         {
             var sb = ctx.TranslateValue(src.TargetObject);
             var m  = new PhpMethodCallExpression("mb_strlen", sb);
             return(m);
         }
         throw new NotSupportedException();
     }
     return(null);
 }
Beispiel #4
0
        protected override IValue VisitSimpleMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            // var typeInfo = state.Context.RoslynModel.GetTypeInfo(node);
            var typeInfo2 = state.Context.RoslynModel.GetTypeInfo(node.Expression);
            var tt        = state.Context.RoslynModel.GetSymbolInfo(node);

            MemberInfo member = null;

            switch (tt.Symbol.Kind)
            {
            case SymbolKind.Field:
                var fieldSymbol = tt.Symbol as IFieldSymbol;
                var fieldInfo   = context.Roslyn_ResolveField(fieldSymbol);
                if (fieldInfo.IsStatic)
                {
                    return(Simplify(new ClassFieldAccessExpression(fieldInfo, true)));
                }
                var visitedExpression = Visit(node.Expression);
                if (visitedExpression == null)
                {
                    throw new ArgumentNullException("visitedExpression");
                }
                return(Simplify(new InstanceFieldAccessExpression(fieldInfo, visitedExpression)));

            case SymbolKind.Method:
                var sss        = tt.Symbol as IMethodSymbol;
                var methodInfo = context.Roslyn_ResolveMethod(sss);
                member = methodInfo;

                break;

            case SymbolKind.Property:
                var uuu          = tt.Symbol as IPropertySymbol;
                var propertyInfo = context.Roslyn_ResolveProperty(uuu);
                member = propertyInfo;
                break;
            }
            IValue expression;
            var    fullName = _Name(node.Name);


            if (typeInfo2.Type != null)
            {
                ISymbol[] gg;
                if (fullName.IsGeneric)
                {
                    var       arity = fullName.Generics.Length;
                    ISymbol[] gg1   = typeInfo2.Type.GetMembers()
                                      .AsEnumerable()
                                      .OfType <IMethodSymbol>()
                                      .Where(i => i.Name == fullName.BaseName && i.Arity == arity)
                                      .ToArray();
                    gg = gg1;
                }
                else
                {
                    gg = typeInfo2.Type.GetMembers(fullName.GetNonGeneric()).ToArray();
                }
                if (gg.Length == 1)
                {
                    ISymbol ggg = gg.Single();
                    switch (ggg.Kind)
                    {
                    case SymbolKind.Property:
                        var propertySymbol = ggg as IPropertySymbol;
                        if (propertySymbol == null)
                        {
                            throw new Exception("propertySymbol is null");
                        }
                        var pi = context.Roslyn_ResolveProperty(propertySymbol);
                        if (propertySymbol.IsStatic)
                        {
                            var tmp = new ClassPropertyAccessExpression(pi);
                            return(Simplify(tmp));
                        }
                        else
                        {
                            expression = Visit(node.Expression);
                            var tmp = new CsharpInstancePropertyAccessExpression(pi, expression);
                            return(Simplify(tmp));
                        }
                    }
                }
            }
            // throw new NotSupportedException();
            expression = Visit(node.Expression);
            if (expression is UnknownIdentifierValue)
            {
                if (fullName.IsGeneric)
                {
                    throw new NotSupportedException();
                }
                var name = fullName.BaseName;

                var a = ((expression as UnknownIdentifierValue)).Identifier + "." + name;
                var t = context.MatchTypes(a, 0);
                if (t.Length == 1)
                {
                    return(new TypeValue(t[0]));
                }
                return(new UnknownIdentifierValue(a, new IValue[0]));
            }
            if (expression is TypeValue)
            {
                if (fullName.IsGeneric)
                {
                    throw new NotSupportedException();
                }
                var name = fullName.BaseName;
                var tmp  = new StaticMemberAccessExpression(name, new LangType((expression as TypeValue).DotnetType));
                return(Simplify(tmp));
            }
            if (expression is LocalVariableExpression || expression is ConstValue ||
                expression is ClassFieldAccessExpression || expression is InstanceFieldAccessExpression ||
                expression is ElementAccessExpression || expression is ArgumentExpression ||
                expression is CsharpMethodCallExpression || expression is CsharpInstancePropertyAccessExpression ||
                expression is ClassPropertyAccessExpression || expression is ParenthesizedExpression)
            {
                // if (fullName.IsGeneric)
                //     throw new NotSupportedException();
                var name = fullName.BaseName;
                if (member == null)
                {
                    throw new NotSupportedException();
                }
                var tmp = new InstanceMemberAccessExpression(name, expression, member);
                return(Simplify(tmp));
            }



            // ReSharper disable once InvertIf
            if (expression is ThisExpression)
            {
                if (fullName.IsGeneric)
                {
                    throw new NotSupportedException();
                }
                var name = fullName.BaseName;
                if (member == null)
                {
                    throw new NotSupportedException();
                }
                var tmp = new InstanceMemberAccessExpression(name, expression, member);
                return(Simplify(tmp));
            }

            throw new NotImplementedException("*** " + expression.GetType().FullName);
        }
Beispiel #5
0
        protected override IValue VisitIdentifierName(IdentifierNameSyntax node)
        {
            // var tt = context.Roslyn_GetNamedTypeSymbols(null);

            var sInfo  = ModelExtensions.GetSymbolInfo(context.RoslynModel, node);
            var tInfo2 = context.RoslynModel.GetTypeInfo2(node);
            var tInfo  = tInfo2.TypeInfo;
            //var sInfo = sInfo2.ty
            Type type = tInfo.Type == null ? null : context.Roslyn_ResolveType(tInfo.Type);

            switch (sInfo.Symbol.Kind)
            {
            case SymbolKind.Local:
                //var symbolLocal = info.Symbol as CSharp.SourceLocalSymbol;
                IValue tmp = new LocalVariableExpression(sInfo.Symbol.Name, new LangType(type));
                tmp = ImplicitConvert(tmp, tInfo2);
                return(Simplify(tmp));

            case SymbolKind.NamedType:
                // var a = sInfo.Symbol.ToDisplayString();
                var b = sInfo.Symbol.OriginalDefinition as INamedTypeSymbol;
                if (b != null)
                {
                    var c = context.Roslyn_ResolveType(b);
                    return(new TypeValue(c));
                }
                throw new NotSupportedException();

            case SymbolKind.Parameter:
#warning 'Formalnie to nie jest zmienna lokalna !!';
                tmp = new LocalVariableExpression(sInfo.Symbol.Name, new LangType(type));
                return(Simplify(tmp));

            case SymbolKind.Field:
                var ax = context.Roslyn_ResolveField(sInfo.Symbol as IFieldSymbol);
                if (ax.IsStatic)
                {
                    // throw new NotSupportedException();

                    var fieldSymbol = sInfo.Symbol as IFieldSymbol;
                    tmp = new ClassFieldAccessExpression(ax, fieldSymbol != null && fieldSymbol.IsConst);
                    return(Simplify(tmp));
                }
                tmp = new InstanceFieldAccessExpression(ax, new ThisExpression(state.CurrentType));     // niczego nie wiem o kontekście -> domyślam się, że this
                return(Simplify(tmp));

            case SymbolKind.Method:
            {
                var methodBaseInfo = context.Roslyn_ResolveMethod(sInfo.Symbol as IMethodSymbol);
                var methodInfo     = methodBaseInfo as MethodInfo;
                if (methodInfo == null)
                {
                    throw new NotSupportedException();
                }
                var result = new MethodExpression(methodInfo);
                return(Simplify(result));
            }

            case SymbolKind.Property:
            {
                var pi           = context.Roslyn_ResolveProperty(sInfo.Symbol as IPropertySymbol);
                var targetObject = new ThisExpression(state.CurrentType);
                var result       = new CsharpInstancePropertyAccessExpression(pi, targetObject);
                return(result);
            }

            default:
                throw new NotSupportedException();
            }
            //throw new NotSupportedException();
            //var m = info.Symbol;
            //var info2 = context.RoslynModel.AnalyzeDataFlow(node);
            ////var info3 = context.RoslynModel.GetDeclaredSymbol(node);
            //var mg = context.RoslynModel.GetMemberGroup(node);

            //string identifier = node.Identifier.ValueText.Trim();
            // return InternalVisitTextIdentifier(identifier);
        }
Beispiel #6
0
        protected override IPhpValue VisitInstancePropertyAccessExpression(CsharpInstancePropertyAccessExpression src)
        {
            var pri       = PropertyTranslationInfo.FromPropertyInfo(src.Member);
            var ownerInfo = state.Principles.GetOrMakeTranslationInfo(src.Member.DeclaringType);

            if (src.TargetObject == null)
            {
                throw new NotImplementedException("statyczny");
            }
            var translatedByExternalNodeTranslator = state.Principles.NodeTranslators.Translate(state, src);

            if (translatedByExternalNodeTranslator != null)
            {
                return(SimplifyPhpExpression(translatedByExternalNodeTranslator));
            }

            var phpTargetObject = TransValue(src.TargetObject);

            if (ownerInfo.IsArray)
            {
                var idx       = new PhpConstValue(pri.FieldScriptName);
                var arrayExpr = new PhpArrayAccessExpression(phpTargetObject, idx);
                return(arrayExpr);
            }

            {
                var propertyInfo  = src.Member;
                var classReplacer = state.FindOneClassReplacer(propertyInfo.DeclaringType);
                if (classReplacer != null)
                {
                    var newPropertyInfo = classReplacer.ReplaceBy.GetProperty(src.Member.Name,
                                                                              BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
                    if (newPropertyInfo == null)
                    {
                        throw new Exception(string.Format("Klasa {0} nie zawiera własności {1}",
                                                          classReplacer.ReplaceBy, src.Member));
                    }
                    if (newPropertyInfo.GetIndexParameters().Length > 0)
                    {
                        throw new NotSupportedException("energetic gecko, Property with index");
                    }
                    propertyInfo = newPropertyInfo;
                }

                {
                    var ats = propertyInfo.GetCustomAttribute <DirectCallAttribute>(true);
                    if (ats != null)
                    {
                        if (string.IsNullOrEmpty(ats.Name))
                        {
                            var tmp = ats.MapArray;
                            if (tmp == null || tmp.Length <= 0)
                            {
                                return(phpTargetObject);
                            }
                            if (tmp.Length > 1 || tmp[0] != DirectCallAttribute.This)
                            {
                                throw new NotSupportedException(string.Format(
                                                                    "Property {1}.{0} has invalid 'Map' parameter in DirectCallAttribute",
                                                                    propertyInfo.Name, propertyInfo.DeclaringType));
                            }
                            return(phpTargetObject);
                        }

                        switch (ats.MemberToCall)
                        {
                        case ClassMembers.Method:
                            if (ats.Name == "this")
                            {
                                return(phpTargetObject);
                            }

                            var method = new PhpMethodCallExpression(ats.Name);
                            switch (ats.CallType)
                            {
                            case MethodCallStyles.Procedural:
                                method.Arguments.Add(new PhpMethodInvokeValue(phpTargetObject));
                                return(method);
                                //    case MethodCallStyles.:
                                //        method.Arguments.Add(new PhpMethodInvokeValue(phpTargetObject));
                                //        return method;
                                //    default:
                                //        throw new NotSupportedException();
                            }

                            throw new NotImplementedException();

                        case ClassMembers.Field:
                            switch (ats.CallType)
                            {
                            case MethodCallStyles.Instance:
                                if (ats.Name == "this")
                                {
                                    return(phpTargetObject);
                                }
                                var includeModule = ownerInfo.IncludeModule;
                                var field         = new PhpInstanceFieldAccessExpression(ats.Name,
                                                                                         phpTargetObject,
                                                                                         includeModule);
                                return(field);

                            default:
                                throw new NotSupportedException();
                            }

                        //var f = new PhpMethodCallExpression(ats.Name);
                        //method.Arguments.Add(new PhpMethodInvokeValue(phpTargetObject));
                        //return method;
                        default:
                            throw new NotSupportedException();
                        }
                    }
                }

                {
                    var ats = propertyInfo.GetCustomAttribute <UseBinaryExpressionAttribute>(true);
                    if (ats != null)
                    {
                        var left   = GetValueForExpression(phpTargetObject, ats.Left);
                        var right  = GetValueForExpression(phpTargetObject, ats.Right);
                        var method = new PhpBinaryOperatorExpression(ats.Operator, left, right);
                        return(method);
                    }
                }
                {
                    pri = PropertyTranslationInfo.FromPropertyInfo(src.Member);
                    var to = TransValue(src.TargetObject);
                    var a  = new PhpPropertyAccessExpression(pri, to);
                    return(a);
                }
            }
        }