/// <summary> /// Adds a native function. The function must be a MethodInfo of a real method of the native type. /// </summary> /// <param name="delimiter"></param> /// <param name="name"></param> /// <param name="methodInfo"></param> /// <returns></returns> public IMemberFunction AddNativeFunction(IdDelimiter delimiter, string name, MethodInfo methodInfo) { var func = NativeMemberFunctionExtensions.CreateByMethodInfo(typeof(TType), methodInfo); addMemberFunction(this, func.GetType(), delimiter, name, func); return(func); }
/// <summary> /// Add a lambda function as foreign member function to a type. /// </summary> /// <typeparam name="T1"></typeparam> /// <typeparam name="T2"></typeparam> /// <typeparam name="T3"></typeparam> /// <typeparam name="T4"></typeparam> /// <typeparam name="T5"></typeparam> /// <typeparam name="T6"></typeparam> /// <typeparam name="TResult"></typeparam> /// <param name="delimiter"></param> /// <param name="name"></param> /// <param name="func"></param> /// <returns></returns> public IMemberFunction AddForeignFunction <T1, T2, T3, T4, T5, T6, TResult>(IdDelimiter delimiter, string name, Func <TType, T1, T2, T3, T4, T5, T6, TResult> func) { var method = new ForeignMemberFunction <TType, T1, T2, T3, T4, T5, T6, TResult>(func); AddMemberFunction(delimiter, name, method); return(method); }
/// <summary> /// Creates a property using a lambda. /// </summary> /// <param name="delimiter"></param> /// <param name="name"></param> /// <param name="returnType"></param> /// <param name="getter"></param> public ForeignProperty(IdDelimiter delimiter, string name, Type returnType, Func <object, object> getter) { this.Delimiter = delimiter; this.Name = name; this.ReturnType = returnType; this.getter = getter; }
/// <summary> /// Constructor. /// </summary> /// <param name="location"></param> /// <param name="this"></param> /// <param name="delimiter"></param> /// <param name="memberName"></param> public MemberExpression(IParserLocation location, IExpression @this, IdDelimiter delimiter, string memberName) { Location = location; SemanticType = null; ThisExpression = @this; MemberName = memberName; Delimiter = delimiter; }
/// <summary> /// Get a property by its name and delimiter. /// </summary> /// <param name="delimiter"></param> /// <param name="name"></param> /// <returns></returns> public IProperty GetByName(IdDelimiter delimiter, string name) { var key = CreateKey(delimiter, name); if (symbols.TryGetValue(key, out IProperty symbol)) { return(symbol); } return(null); }
private void AddMemberFunction <TMemberFunction>(IdDelimiter delimiter, string name, TMemberFunction method) where TMemberFunction : IMemberFunction { var key = CreateKey(delimiter, name); if (!symbols.ContainsKey(key)) { AddForeignProperty(delimiter, name, @this => method.BindThis(@this)); return; } throw new InvalidOperationException("Duplicate symbol!");; }
/// <summary> /// Adds a lambda function to create a foreign property. /// </summary> /// <typeparam name="TProperty"></typeparam> /// <param name="delimiter"></param> /// <param name="name"></param> /// <param name="getter"></param> /// <returns></returns> public IProperty AddForeignProperty <TProperty>(IdDelimiter delimiter, string name, Func <TType, TProperty> getter) { var key = CreateKey(delimiter, name); if (symbols.ContainsKey(key)) { throw new InvalidOperationException("Already assigned!"); } IProperty result; symbols[key] = result = new ForeignProperty(delimiter, name, typeof(TProperty), (t) => getter((TType)t)); return(result); }
/// <summary> /// Adds a native MethodInfo which is a real method of the native type. /// </summary> /// <param name="delimiter"></param> /// <param name="name"></param> /// <param name="propertyInfo"></param> /// <returns></returns> public IProperty AddNativeProperty(IdDelimiter delimiter, string name, PropertyInfo propertyInfo) { var key = CreateKey(delimiter, name); if (symbols.ContainsKey(key)) { throw new InvalidOperationException("Already assigned!"); } IProperty result; symbols[key] = result = new NativeProperty(name, propertyInfo); return(result); }
/// <summary> /// Creates the attribute /// </summary> /// <param name="name"></param> /// <param name="delimiter"></param> public CQLNativeMemberFunctionAttribute(string name, IdDelimiter delimiter) { Name = name; Delimiter = delimiter; }
/// <summary> /// creates the attribute /// </summary> /// <param name="name"></param> /// <param name="delimiter"></param> public CQLNativeMemberPropertyAttribute(string name, IdDelimiter delimiter) { Name = name; Delimiter = delimiter; }
private Tuple <IdDelimiter, string> CreateKey(IdDelimiter delimiter, string name) { return(new Tuple <IdDelimiter, string>(delimiter, Normalize(name))); }