예제 #1
0
 protected override IPhpValue VisitPhpArrayCreateExpression(PhpArrayCreateExpression node)
 {
     return(node);
 }
예제 #2
0
        protected override IPhpValue VisitCallConstructor(CallConstructor src)
        {
            var tmp = state.Principles.NodeTranslators.Translate(state, src);

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



            var r = new PhpMethodCallExpression(PhpMethodCallExpression.ConstructorMethodName);

            if (src.Info.ReflectedType != src.Info.DeclaringType)
            {
                throw new NotSupportedException();
            }

            // we can use "state.Principles.CurrentType" as third parameter if we prefer "new self()" or "new parent()" contructor calls
            r.SetClassName(
                state.Principles.GetPhpType(src.Info.ReflectedType, true, null),
                state.Principles.GetOrMakeTranslationInfo(src.Info)
                ); // class name for constructor

            var cti = state.Principles.GetTi(src.Info.ReflectedType, true);

            if (cti.DontIncludeModuleForClassMembers)
            {
                r.DontIncludeClass = true;
            }
            if (cti.IsArray)
            {
                if (src.Initializers != null && src.Initializers.Any())
                {
                    var ggg = src.Initializers.Select(TransValue).ToArray();
                    var h   = new PhpArrayCreateExpression(ggg);
                    return(SimplifyPhpExpression(h));
                }
                else
                {
                    var h = new PhpArrayCreateExpression();
                    return(SimplifyPhpExpression(h));
                }
            }
            {
                // cti = state.Principles.GetTi(src.Info.ReflectedType);
                if (cti.IsReflected)
                {
                    var replacer = state.FindOneClassReplacer(src.Info.ReflectedType);
                    if (replacer != null)
                    {
                        var translationMethods = replacer.ReplaceBy.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
                                                 .Where(m => m.IsDefined(typeof(TranslatorAttribute))).ToArray();
                        foreach (var m in translationMethods)
                        {
                            var translated = m.Invoke(null, new object[] { state, src });
                            if (translated is IPhpValue)
                            {
                                return(translated as IPhpValue);
                            }
                        }

                        throw new Exception(string.Format("Klasa {0} nie umie przetłumaczyć konstruktora {1}", replacer.ReplaceBy.FullName, replacer.SourceType.FullName));
                    }
                    else
                    {
#if sprawdzac_includy
                        // tutaj trzeba dorobić jakieś sprawdzanie klas WP
                        var a   = src.Info.ReflectedType.Assembly;
                        var ati = AssemblyTranslationInfo.FromAssembly(a);
                        if (!string.IsNullOrEmpty(ati.IncludePathConstOrVarName))
                        {
                            // klasa jest w innym dołączanym module, więc OK
                        }
                        else
                        {
                            throw new Exception("");
                        }
#endif
                    }
                }
            }
            foreach (var functionArgument in src.Arguments)
            {
                r.Arguments.Add(TransFunctionArgument(functionArgument));
            }
            return(r);
        }