protected override IPhpValue VisitPhpArrayCreateExpression(PhpArrayCreateExpression node) { return(node); }
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); }