コード例 #1
0
ファイル: AstAttributesStep.cs プロジェクト: codehaus/boo
        bool SetFieldOrProperty(AstAttribute aa, ExpressionPair p)
        {
            ReferenceExpression name = p.First as ReferenceExpression;

            if (null == name)
            {
                _context.Errors.NamedParameterMustBeReference(p);
                return(false);
            }
            else
            {
                Reflection.MemberInfo[] members = _type.FindMembers(
                    Reflection.MemberTypes.Property | Reflection.MemberTypes.Field,
                    Reflection.BindingFlags.Instance | Reflection.BindingFlags.Public,
                    Type.FilterName, name.Name);
                if (members.Length > 0)
                {
                    if (members.Length > 1)
                    {
                        // Essa preocupao parece meio idiota, mas
                        // como ainda no tenho certeza de que o modelo
                        // IL no permita dois membros diferentes com mesmo
                        // nome vou deixar aqui
                        _context.Errors.AmbiguousName(p, name.Name, members);
                        return(false);
                    }
                    else
                    {
                        Reflection.MemberInfo   m        = members[0];
                        Reflection.PropertyInfo property = m as Reflection.PropertyInfo;
                        if (null != property)
                        {
                            property.SetValue(aa, p.Second, null);
                        }
                        else
                        {
                            Reflection.FieldInfo field = m as Reflection.FieldInfo;
                            if (null != field)
                            {
                                field.SetValue(aa, p.Second);
                            }
                            else
                            {
                                // No poderia chegar aqui jamais!!!
                                throw new InvalidOperationException();
                            }
                        }
                    }
                }
                else
                {
                    _context.Errors.NotAPublicFieldOrProperty(name, _type.FullName, name.Name);
                    return(false);
                }
            }
            return(true);
        }
コード例 #2
0
ファイル: AstReader.cs プロジェクト: mortend/uno
        public IReadOnlyList <AstAttribute> ReadAttributes()
        {
            var len   = Read7BitEncodedInt();
            var attrs = new AstAttribute[len];

            for (int i = 0; i < len; i++)
            {
                attrs[i] = ReadAttribute();
            }
            return(attrs);
        }
コード例 #3
0
        public void WriteAttribute(AstAttribute a)
        {
            if (!string.IsNullOrEmpty(a.OptionalCondition))
            {
                Write((byte)(a.Modifier | AstAttributeModifier.HasCondition));
                WriteGlobal(a.OptionalCondition);
            }
            else
            {
                Write((byte)(a.Modifier & ~AstAttributeModifier.HasCondition));
            }

            Write(a.Attribute);
            WriteArguments(a.Arguments);
        }
コード例 #4
0
ファイル: AstAttributesStep.cs プロジェクト: codehaus/boo
 public void Execute()
 {
     try
     {
         AstAttribute aa = CreateAstAttributeInstance();
         if (null != aa)
         {
             aa.Apply(_attribute.ParentNode);
         }
     }
     catch (Exception x)
     {
         _context.Errors.AttributeResolution(_attribute, _type, x);
     }
 }
コード例 #5
0
ファイル: AstAttributesStep.cs プロジェクト: codehaus/boo
        public AstAttribute CreateAstAttributeInstance()
        {
            object[] parameters = _attribute.Arguments.Count > 0 ? _attribute.Arguments.ToArray() : new object[0];

            AstAttribute aa = null;

            try
            {
                aa = (AstAttribute)Activator.CreateInstance(_type, parameters);
            }
            catch (MissingMethodException x)
            {
                _context.Errors.MissingConstructor(_attribute, _type, parameters, x);
                return(null);
            }

            aa.Attribute = _attribute;

            if (_attribute.NamedArguments.Count > 0)
            {
                bool initialized = true;

                // Tenta inicializar todas as propriedades
                // e campos (para obter o maior nmero de erros
                // de uma nica vez)
                foreach (ExpressionPair p in _attribute.NamedArguments)
                {
                    bool success = SetFieldOrProperty(aa, p);
                    initialized = initialized && success;
                }

                if (!initialized)
                {
                    return(null);
                }
            }

            return(aa);
        }