public static void LoadNativeMethods(GtParserContext Context, GtType ClassType, String FuncName, List<GtFunc> FuncList)
 {
     Type NativeClass = (Type)ClassType.TypeBody;
     var GtMethods = NativeClass.GetMethods()
         .Where(m => m.IsPublic && LibGreenTea.EqualsString(FuncName, m.Name))
         .Select(m => LibGreenTea.ConvertNativeMethodToFunc(Context, m)).ToList();
     foreach(var method in GtMethods){
         Context.RootNameSpace.AppendMethod(method, null);
         FuncList.Add(method);
     }
     if (GtMethods.Count == 0)
     {
         Context.RootNameSpace.SetUndefinedSymbol(GreenTeaUtils.ClassSymbol(ClassType, FuncName), null);
     }
 }
    public static GtFunc LoadNativeField(GtParserContext Context, GtType ClassType, String FieldName, Boolean GetSetter)
    {
        //GtParserContext Context = ClassType.Context;
        try
        {
            Type NativeClass = (Type)ClassType.TypeBody;
            FieldInfo NativeField = NativeClass.GetField(FieldName);
            if (NativeField.IsPublic)
            {
                var GtFieldType = GetNativeType(NativeField.GetType());

                var GetterNativeFunc = new GtFunc(GreenTeaConsts.GetterFunc, FieldName, 0, new List<GtType>() { GtFieldType, ClassType });
                GetterNativeFunc.SetNativeMethod(0, NativeField);
                Context.RootNameSpace.SetGetterFunc(ClassType, FieldName, GetterNativeFunc, null);

                var SetterNativeFunc = new GtFunc(GreenTeaConsts.SetterFunc, FieldName, 0, new List<GtType>() { GtStaticTable.VoidType, ClassType, GtFieldType });
                SetterNativeFunc.SetNativeMethod(0, NativeField);
                Context.RootNameSpace.SetSetterFunc(ClassType, FieldName, SetterNativeFunc, null);

                return GetSetter ? SetterNativeFunc : GetterNativeFunc;
            }
        }
        catch (System.Security.SecurityException e)
        {
            LibGreenTea.VerboseException(e);
        }
        catch (MissingFieldException)
        {
        }
        Context.RootNameSpace.SetUndefinedSymbol(GreenTeaUtils.ClassSymbol(ClassType, GreenTeaUtils.GetterSymbol(FieldName)), null);
        Context.RootNameSpace.SetUndefinedSymbol(GreenTeaUtils.ClassSymbol(ClassType, GreenTeaUtils.SetterSymbol(FieldName)), null); // for setter
        return null;
    }
 public static object ImportStaticObject(GtParserContext Context, Type NativeClass, string Symbol)
 {
     try
     {
         FieldInfo NativeField = NativeClass.GetField(Symbol);
         if (NativeField.IsStatic)
         {
             return GetNativeFieldValue(null, NativeField);
         }
     }
     catch (Exception)
     {
         //NoSuchFieldException
         //LibGreenTea.VerboseException(e);
     }
     GtPolyFunc PolyFunc = new GtPolyFunc(null);
     MethodInfo[] Methods = NativeClass.GetMethods();
     for (int i = 0; i < Methods.Length; i++)
     {
         if (Methods[i].Name.Equals(Symbol) && (Methods[i].Attributes & MethodAttributes.Static) == 0)
         {
             PolyFunc.Append(Context, LibGreenTea.ConvertNativeMethodToFunc(Context, Methods[i]), null);
         }
     }
     if (PolyFunc.FuncList.Count() == 1)
     {
         return PolyFunc.FuncList[0];
     }
     else if (PolyFunc.FuncList.Count() != 0)
     {
         return PolyFunc;
     }
     return null;
 }
 public static void LoadNativeConstructors(GtParserContext Context, GtType ClassType, List<GtFunc> FuncList)
 {
     var NativeClass = (Type)ClassType.TypeBody;
     var GtConstructors = NativeClass.GetConstructors().Where(c => c.IsPublic).Select(c =>
     {
         var TypeList = new List<GtType>() { ClassType };
         TypeList.AddRange(c.GetParameters().Select(p => LibNative.GetNativeType(p.ParameterType)));
         var Func = new GtFunc(GreenTeaConsts.ConstructorFunc, ClassType.ShortName, 0, TypeList);
         Func.SetNativeMethod(0, c);
         Context.RootNameSpace.AppendConstructor(ClassType, Func, null);
         return Func;
     }).ToList();
     FuncList.AddRange(GtConstructors);
     if (GtConstructors.Count == 0)
     {
         Context.RootNameSpace.SetUndefinedSymbol(GreenTeaUtils.ClassSymbol(ClassType, GreenTeaUtils.ConstructorSymbol()), null);
     }
 }
 public static object ImportStaticFieldValue(GtParserContext Context, GtType ClassType, String Symbol)
 {
     return ImportStaticObject(Context, (Type)ClassType.TypeBody, Symbol);
 }