Exemplo n.º 1
0
 /// <summary>
 /// Visit typeof ClassNameRef expression.
 /// </summary>
 /// <param name="x"></param>
 virtual public void VisitTypeOfEx(TypeOfEx x)
 {
     VisitElement(x.ClassNameRef);
 }
Exemplo n.º 2
0
 /// <summary>
 /// Visit typeof ClassNameRef expression.
 /// </summary>
 /// <param name="x"></param>
 virtual public void VisitTypeOfEx(TypeOfEx x)
 {
     VisitElement(x.ClassNameRef);
 }
Exemplo n.º 3
0
        internal void Emit(CodeGenerator /*!*/ codeGen, IPhpCustomAttributeProvider /*!*/ target, bool force)
        {
            // skip attributes that are not emitted:
            if (!isEmitted && !force)
            {
                return;
            }

            ConstructorInfo real_ctor;

            // TODO: type conversions (in analysis during overload resolution?)

            Type[] real_ctor_parameter_types = new Type[callSignature.Parameters.Count];

            if (type is ClrType)
            {
                real_ctor = (ConstructorInfo)((ClrMethod.Overload)overload).Method;
                var real_params = real_ctor.GetParameters();

                for (int i = 0; i < real_ctor_parameter_types.Length; i++)
                {
                    real_ctor_parameter_types[i] = real_params[i].ParameterType;
                }
            }
            else
            {
                Debug.Assert(type is PhpType);
                real_ctor = ((PhpType)type).ClrConstructorInfos[0];

                // Do not try to call GetParameters(), all parameters are of type object,
                // GetParameters() of not baked PhpType throws.
                for (int i = 0; i < real_ctor_parameter_types.Length; i++)
                {
                    real_ctor_parameter_types[i] = PHP.Core.Emit.Types.Object[0];
                }
            }

            // ctor args:
            object[] ctor_args = new object[callSignature.Parameters.Count];

            for (int i = 0; i < callSignature.Parameters.Count; i++)
            {
                Expression expr = callSignature.Parameters[i].Expression;

                TypeOfEx type_of = expr as TypeOfEx;
                if (type_of != null)
                {
                    ctor_args[i] = type_of.ClassNameRef.ResolvedType.RealType;
                }
                else
                {
                    ctor_args[i] = ConvertToClr.ObjectToType(expr.Value, real_ctor_parameter_types[i]);
                }
            }

            List <FieldInfo>    fields       = new List <FieldInfo>();
            List <PropertyInfo> properties   = new List <PropertyInfo>();
            List <object>       field_values = new List <object>();
            List <object>       prop_values  = new List <object>();

            foreach (NamedActualParam param in namedParameters)
            {
                object value = param.Expression.Value;

                MemberInfo   real_member = param.Property.RealMember;
                FieldInfo    real_field;
                PropertyInfo real_property;

                if ((real_property = real_member as PropertyInfo) != null ||                                               // regular CLR property
                    (param.Property is PhpField && (real_property = ((PhpField)param.Property).ExportedProperty) != null)) // or PHP property (real field below is PhpReference, we have to use its export stub)
                {
                    properties.Add(real_property);
                    prop_values.Add(ConvertToClr.ObjectToType(value, real_property.PropertyType));
                }
                else if ((real_field = real_member as FieldInfo) != null)
                {
                    fields.Add(real_field);
                    field_values.Add(ConvertToClr.ObjectToType(value, real_field.FieldType));
                }
                else
                {
                    Debug.Fail("Cannot resolve attribute named parameter!");
                }
            }

            CustomAttributeBuilder builder = new CustomAttributeBuilder(real_ctor, ctor_args,
                                                                        properties.ToArray(), prop_values.ToArray(), fields.ToArray(), field_values.ToArray());

            switch (targetSelector)
            {
            case TargetSelectors.Assembly:
            case TargetSelectors.Module:
                codeGen.CompilationUnit.ModuleBuilder.AssemblyBuilder.EmitCustomAttribute(builder, targetSelector);
                break;

            default:
                target.EmitCustomAttribute(builder, targetSelector);
                break;
            }
        }