Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #4
0
 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));
         }
     }
 }
Beispiel #5
0
        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));
                }
            }
        }