private Expression FetchConstValue(string name) { var parts = name.Split('.'); if (parts.Count() > 1) { var constTypeName = string.Join(".", parts.Take(parts.Count() - 1).ToList()); var constants = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetLoadableTypes()) .Where(t => t.FullName.Replace("+", ".").EndsWith(constTypeName)) .SelectMany(t => t.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) .Where(fi => fi.IsLiteral && !fi.IsInitOnly && fi.Name.Equals(parts.Last()))) .ToList(); if (constants.Count() > 1) { throw new ParseErrorException( string.Format("Constant '{0}' is ambiguous, found following:{1}{2}.", name, Environment.NewLine, string.Join("," + Environment.NewLine, constants.Select( x => x.ReflectedType != null ? string.Format("'{0}.{1}'", x.ReflectedType.FullName, x.Name) : string.Format("'{0}'", x.Name)))), PeekToken(1).Location); } var constant = constants.SingleOrDefault(); if (constant != null) { var value = constant.GetRawConstantValue(); Consts[name] = (value is string) ? ((string)value).Replace(Environment.NewLine, "\n") : value; // in our language new line is represented by \n char (consts map // is then sent to JavaScript, and JavaScript new line is also \n) return(Expression.Constant(value)); } } else { var constant = ContextType.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) .SingleOrDefault(fi => fi.IsLiteral && !fi.IsInitOnly && fi.Name.Equals(name)); if (constant != null) { var value = constant.GetRawConstantValue(); Consts[name] = (value is string) ? ((string)value).Replace(Environment.NewLine, "\n") : value; return(Expression.Constant(value)); } } return(null); }
private Expression FetchConstValue(string name, Location pos) { FieldInfo constant; var parts = name.Split(new[] { '.' }); if (parts.Length > 1) { var constTypeName = string.Join(".", parts.Take(parts.Length - 1).ToList()); var constants = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => new AssemblyTypeProvider(a).GetLoadableTypes()) .Where(t => string.Concat(".", t.FullName.Replace("+", ".")).EndsWith(string.Concat(".", constTypeName))) .SelectMany(t => t.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) .Where(fi => fi.IsLiteral && !fi.IsInitOnly && fi.Name.Equals(parts.Last()))) .ToList(); if (constants.Count > 1) { var constsList = string.Join( $",{Environment.NewLine}", constants.Select(x => x.ReflectedType != null ? $"'{x.ReflectedType.FullName}.{x.Name}'" : $"'{x.Name}'")); throw new ParseErrorException( $"Constant '{name}' is ambiguous, found following:{Environment.NewLine}{constsList}.", ExprString, pos); } constant = constants.SingleOrDefault(); } else { constant = ContextType.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) .SingleOrDefault(fi => fi.IsLiteral && !fi.IsInitOnly && fi.Name.Equals(name)); } if (constant == null) { return(null); } var value = constant.GetRawConstantValue(); Consts[name] = (value as string)?.Replace(Environment.NewLine, "\n") ?? value; // in our language new line is represented by \n char (consts map is then sent to JavaScript, and JavaScript new line is also \n) return(Expression.Constant(value)); }
private Expression FetchConstValue(string name) { var parts = name.Split('.'); if (parts.Count() > 1) { var constTypeName = string.Join(".", parts.Take(parts.Count() - 1).ToList()); var constants = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetLoadableTypes()) .Where(t => t.FullName.Replace("+", ".").EndsWith(constTypeName)) .SelectMany(t => t.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) .Where(fi => fi.IsLiteral && !fi.IsInitOnly && fi.Name.Equals(parts.Last()))) .ToList(); if (constants.Count() > 1) { throw new InvalidOperationException( string.Format("Constant {0} is ambiguous, found following:{1}", name, Environment.NewLine + string.Join(Environment.NewLine, constants.Select(x => string.Format("{0}.{1}", x.ReflectedType.FullName, x.Name))))); } var constant = constants.SingleOrDefault(); if (constant != null) { var value = constant.GetRawConstantValue(); Consts[name] = value; return(Expression.Constant(value)); } } else { var constant = ContextType.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) .SingleOrDefault(fi => fi.IsLiteral && !fi.IsInitOnly && fi.Name.Equals(name)); if (constant != null) { var value = constant.GetRawConstantValue(); Consts[name] = value; return(Expression.Constant(value)); } } return(null); }
private void BuildFieldsFromBase(Type contextType) { foreach (var f in ContextType.GetProperties()) { if (!_fieldsByKey.ContainsKey(f.Name)) { var parameter = Expression.Parameter(ContextType); this.AddField(new Field(f.Name, Expression.Lambda(Expression.Property(parameter, f.Name), parameter), string.Empty, string.Empty)); } } foreach (var f in ContextType.GetFields()) { if (!_fieldsByKey.ContainsKey(f.Name)) { var parameter = Expression.Parameter(ContextType); this.AddField(new Field(f.Name, Expression.Lambda(Expression.Field(parameter, f.Name), parameter), string.Empty, string.Empty)); } } }
private void BuildFieldsFromBase() { if (IsEnum) { foreach (var item in Enum.GetNames(this.ContextType)) { this.AddField(new Field(item, null, "", Name, ContextType)); } return; } foreach (var f in ContextType.GetProperties()) { if (!_fieldsByName.ContainsKey(f.Name)) { //Get Description from ComponentModel.DescriptionAttribute string description = string.Empty; var d = (System.ComponentModel.DescriptionAttribute)f.GetCustomAttribute(typeof(System.ComponentModel.DescriptionAttribute), false); if (d != null) { description = d.Description; } var parameter = Expression.Parameter(ContextType); this.AddField(new Field(SchemaGenerator.ToCamelCaseStartsLower(f.Name), Expression.Lambda(Expression.Property(parameter, f.Name), parameter), description, null)); } } foreach (var f in ContextType.GetFields()) { if (!_fieldsByName.ContainsKey(f.Name)) { //Get Description from ComponentModel.DescriptionAttribute string description = string.Empty; var d = (System.ComponentModel.DescriptionAttribute)f.GetCustomAttribute(typeof(System.ComponentModel.DescriptionAttribute), false); if (d != null) { description = d.Description; } var parameter = Expression.Parameter(ContextType); this.AddField(new Field(SchemaGenerator.ToCamelCaseStartsLower(f.Name), Expression.Lambda(Expression.Field(parameter, f.Name), parameter), description, null)); } } }