private void TranslateProperty(PhpClassDefinition phpClassDefinition, CsharpPropertyDeclaration propertyDeclaration) { var pi = _state.Principles.CurrentType.GetProperty(propertyDeclaration.PropertyName); var pti = PropertyTranslationInfo.FromPropertyInfo(pi); if (pti.GetSetByMethod) { CsharpPropertyDeclarationAccessor accessor; if (!string.IsNullOrEmpty(pti.GetMethodName)) { accessor = propertyDeclaration.Accessors.FirstOrDefault(u => u.Name == "get"); if (accessor != null) { Tranlate_MethodOrProperty(phpClassDefinition, pi.GetGetMethod(), accessor.Statement, pti.GetMethodName); } } if (string.IsNullOrEmpty(pti.SetMethodName)) { return; } accessor = propertyDeclaration.Accessors.FirstOrDefault(u => u.Name == "set"); if (accessor != null) { Tranlate_MethodOrProperty(phpClassDefinition, pi.GetSetMethod(), accessor.Statement, pti.SetMethodName); } } else { phpClassDefinition.Fields.Add(new PhpClassFieldDefinition { Name = pti.FieldScriptName, IsStatic = pti.IsStatic }); } }
public IPhpValue TranslateToPhp(IExternalTranslationContext ctx, ClassPropertyAccessExpression src) { var da = src.Member.GetCustomAttribute(typeof(DirectCallAttribute), true) as DirectCallAttribute; if (da != null) { if (da.MapArray != null && da.MapArray.Length != 0) { throw new NotSupportedException(); } switch (da.CallType) { case MethodCallStyles.Procedural: return(new PhpMethodCallExpression(da.Name)); default: throw new NotSupportedException(); } } var pti = PropertyTranslationInfo.FromPropertyInfo(src.Member); //ctx.GetTranslationInfo().GetOrMakeTranslationInfo(src.Member); if (!pti.GetSetByMethod) { var fieldAccessExpression = new PhpClassFieldAccessExpression { FieldName = pti.FieldScriptName }; var principles = ctx.GetTranslationInfo(); var phpClassName = principles.GetPhpType(src.Member.DeclaringType, true, principles.CurrentType); var classTi = principles.GetOrMakeTranslationInfo(src.Member.DeclaringType); fieldAccessExpression.SetClassName(phpClassName, classTi); return(fieldAccessExpression); } throw new NotImplementedException(string.Format("Unable to translate ClassPropertyAccessExpression {0}.{1}", src.Member.DeclaringType, src.Member.Name)); }
/* /// <summary> /// Tworzy instancję obiektu /// </summary> public PhpPropertyAccessExpression() { } Przykłady użycia implement INotifyPropertyChanged implement INotifyPropertyChanged_Passive implement ToString ##TranslationInfo## ##TargetObject## implement ToString TranslationInfo=##TranslationInfo##, TargetObject=##TargetObject## implement equals TranslationInfo, TargetObject implement equals * implement equals *, ~exclude1, ~exclude2 */ #region Constructors /// <summary> /// Tworzy instancję obiektu /// <param name="TranslationInfo"></param> /// <param name="TargetObject"></param> /// </summary> public PhpPropertyAccessExpression(PropertyTranslationInfo TranslationInfo, IPhpValue TargetObject) { this.TranslationInfo = TranslationInfo; this.TargetObject = TargetObject; }
/* * /// <summary> * /// Tworzy instancję obiektu * /// </summary> * public PhpPropertyAccessExpression() * { * } * Przykłady użycia * implement INotifyPropertyChanged * implement INotifyPropertyChanged_Passive * implement ToString ##TranslationInfo## ##TargetObject## * implement ToString TranslationInfo=##TranslationInfo##, TargetObject=##TargetObject## * implement equals TranslationInfo, TargetObject * implement equals * * implement equals *, ~exclude1, ~exclude2 */ #region Constructors /// <summary> /// Tworzy instancję obiektu /// <param name="TranslationInfo"></param> /// <param name="TargetObject"></param> /// </summary> public PhpPropertyAccessExpression(PropertyTranslationInfo TranslationInfo, IPhpValue TargetObject) { this.TranslationInfo = TranslationInfo; this.TargetObject = TargetObject; }
/// <summary> /// Tworzy instancję obiektu /// <param name="translationInfo"></param> /// <param name="targetObject"></param> /// </summary> public PyPropertyAccessExpression(PropertyTranslationInfo translationInfo, IPyValue targetObject) { TranslationInfo = translationInfo; this.TargetObject = targetObject; }
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); } } }