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); }
public IReadOnlyList <AstAttribute> ReadAttributes() { var len = Read7BitEncodedInt(); var attrs = new AstAttribute[len]; for (int i = 0; i < len; i++) { attrs[i] = ReadAttribute(); } return(attrs); }
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); }
public void Execute() { try { AstAttribute aa = CreateAstAttributeInstance(); if (null != aa) { aa.Apply(_attribute.ParentNode); } } catch (Exception x) { _context.Errors.AttributeResolution(_attribute, _type, x); } }
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); }