Ejemplo n.º 1
0
        public static void DefineStructMarshaler(ProjectConverter P, CodeWriter writer, EocStruct[] collection)
        {
            //In e::system
            var map   = collection.ToDictionary(x => x.RawInfo.Id);
            var graph = new AdjacencyGraph <EocStruct, IEdge <EocStruct> >();

            foreach (var item in collection)
            {
                var hasDependentItem = false;
                foreach (var member in item.RawInfo.Member)
                {
                    if (EplSystemId.GetType(member.DataType) == EplSystemId.Type_Struct &&
                        map.TryGetValue(member.DataType, out var memberType))
                    {
                        graph.AddVerticesAndEdge(new Edge <EocStruct>(memberType, item));
                        hasDependentItem = true;
                    }
                }
                if (!hasDependentItem)
                {
                    graph.AddVertex(item);
                }
            }

            foreach (var item in graph.TopologicalSort())
            {
                item.DefineStructMarshaler(writer);
            }
        }
Ejemplo n.º 2
0
 public CodeConverter(ProjectConverter projectConverter, EocClass classItem, MethodInfo methodItem)
 {
     this.P                 = projectConverter;
     this.Name              = P.GetUserDefinedName_SimpleCppName(methodItem.Id);
     this.ClassItem         = classItem;
     this.MethodItem        = methodItem;
     this.RawStatementBlock = CodeDataParser.ParseStatementBlock(methodItem.CodeData.ExpressionData, methodItem.CodeData.Encoding);
     this.Info              = InferEocCmdInfo(P, methodItem, RawStatementBlock);
     this.TemplatedMethod   = Info.Parameters.Find(x => x.DataType == EocDataTypes.Auto) != null;
     this.IsClassMember     = classItem is EocObjectClass;
     this.ParamMap          = new SortedDictionary <int, EocParameterInfo>();
     for (int i = 0; i < Info.Parameters.Count; i++)
     {
         this.ParamMap.Add(methodItem.Parameters[i].Id, Info.Parameters[i]);
     }
     this.LocalMap = methodItem.Variables.ToSortedDictionary(x => x.Id, x => new EocLocalVariableInfo()
     {
         CppName  = P.GetUserDefinedName_SimpleCppName(x.Id),
         DataType = EocDataTypes.Translate(P, x.DataType, x.UBound),
         UBound   = x.UBound.ToList()
     });
     if (IsClassMember)
     {
         this.RefId = $"{ClassItem.CppName}|{Info.CppName}";
     }
     else
     {
         this.RefId = Info.CppName;
     }
 }
Ejemplo n.º 3
0
 public static int NormalizeDataTypeId(ProjectConverter P, int dataType)
 {
     if (dataType == 0)
     {
         return(EplSystemId.DataType_Int);
     }
     if (EplSystemId.IsLibDataType(dataType) && dataType != P.DataTypeId_IntPtr)
     {
         EplSystemId.DecomposeLibDataTypeId(dataType, out var libId, out var typeId);
         try
         {
             if (P.Libs[libId].DataType[typeId].IsEnum)
             {
                 return(EplSystemId.DataType_Int);
             }
         }
         catch (Exception)
         {
         }
         try
         {
             if (P.EocLibs[libId].Enum.ContainsKey(P.Libs[libId].DataType[typeId].Name))
             {
                 return(EplSystemId.DataType_Int);
             }
         }
         catch (Exception)
         {
         }
     }
     return(dataType);
 }
Ejemplo n.º 4
0
        public static EocDll Translate(ProjectConverter P, DllDeclareInfo rawInfo)
        {
            var libraryName = rawInfo.LibraryName;
            var entryPoint  = rawInfo.EntryPoint;

            if (string.IsNullOrEmpty(entryPoint))
            {
                entryPoint = P.IdToNameMap.GetUserDefinedName(rawInfo.Id);
            }
            var name = P.GetUserDefinedName_SimpleCppName(rawInfo.Id);
            var info = new EocCmdInfo()
            {
                ReturnDataType = rawInfo.ReturnDataType == 0 ? null : EocDataTypes.Translate(P, rawInfo.ReturnDataType),
                CppName        = $"{P.DllNamespace}::{name}",
                Parameters     = rawInfo.Parameters.Select((x) =>
                {
                    var dataType = EocDataTypes.Translate(P, x.DataType, x.ArrayParameter);
                    return(new EocParameterInfo()
                    {
                        ByRef = x.ByRef || x.ArrayParameter || !EocDataTypes.IsValueType(dataType),
                        Optional = false,
                        VarArgs = false,
                        DataType = dataType,
                        CppName = P.GetUserDefinedName_SimpleCppName(x.Id)
                    });
                }).ToList()
            };

            return(new EocDll(P, name, info, libraryName, entryPoint));
        }
Ejemplo n.º 5
0
 public EocGlobalVariable(ProjectConverter p, GlobalVariableInfo rawInfo)
 {
     P       = p ?? throw new ArgumentNullException(nameof(p));
     RawInfo = rawInfo ?? throw new ArgumentNullException(nameof(rawInfo));
     Name    = P.GetUserDefinedName_SimpleCppName(RawInfo.Id);
     CppName = $"{P.GlobalNamespace}::{Name}";
 }
Ejemplo n.º 6
0
 public EocDllExport(ProjectConverter p, string name, EocCmdInfo info, string exportId)
 {
     P        = p ?? throw new ArgumentNullException(nameof(p));
     Name     = name ?? throw new ArgumentNullException(nameof(name));
     Info     = info ?? throw new ArgumentNullException(nameof(info));
     ExportId = exportId ?? Name;
 }
Ejemplo n.º 7
0
 public static void DefineName(ProjectConverter P, CodeWriter writer, EocObjectClass[] collection)
 {
     //In e::user::type
     foreach (var item in collection)
     {
         item.DefineName(writer);
     }
 }
Ejemplo n.º 8
0
 public static void DefineName(ProjectConverter P, CodeWriter writer, SortedDictionary <int, EocObjectClass> map)
 {
     //In e::user::type
     foreach (var item in map.Values)
     {
         item.DefineName(writer);
     }
 }
Ejemplo n.º 9
0
 public static void DefineRawStructInfo(ProjectConverter P, CodeWriter writer, EocStruct[] collection)
 {
     //In e::user::type::eoc_internal
     foreach (var item in collection)
     {
         item.DefineRawStructInfo(writer);
     }
 }
Ejemplo n.º 10
0
 public static void DefineRawStructInfo(ProjectConverter P, CodeWriter writer, SortedDictionary <int, EocStruct> map)
 {
     //In e::user::type::eoc_internal
     foreach (var item in map.Values)
     {
         item.DefineRawStructInfo(writer);
     }
 }
Ejemplo n.º 11
0
 public static void MakeDef(ProjectConverter P, StreamWriter writer, EocDllExport[] dllExports)
 {
     writer.WriteLine("EXPORTS");
     foreach (var item in dllExports)
     {
         item.MakeDefItem(P, writer);
     }
 }
Ejemplo n.º 12
0
 public static void MakeDef(ProjectConverter P, StreamWriter writer, SortedDictionary <int, EocDllExport> map)
 {
     writer.WriteLine("EXPORTS");
     foreach (var item in map.Values)
     {
         item.MakeDefItem(P, writer);
     }
 }
Ejemplo n.º 13
0
 public static void Implement(ProjectConverter P, CodeWriter writer, SortedDictionary <int, EocDll> map)
 {
     writer.Write("#include \"dll.h\"");
     writer.NewLine();
     writer.Write("#include <e/system/dll_core.h>");
     writer.NewLine();
     writer.Write("#include <e/system/methodptr_caller.h>");
     using (writer.NewNamespace(P.DllNamespace))
     {
         var moduleMap = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase);
         var funcMap   = new Dictionary <Tuple <string, string>, string>();
         var eocDlls   = map.Values.ToList();
         for (int i = 0, j = 0, k = 0; i < eocDlls.Count; i++)
         {
             var item = eocDlls[i];
             if (!moduleMap.TryGetValue(item.LibraryName, out var dllIdInCpp))
             {
                 dllIdInCpp = (j++).ToString();
                 moduleMap.Add(item.LibraryName, dllIdInCpp);
             }
             var dllEntryPointPair = new Tuple <string, string>(dllIdInCpp, item.EntryPoint);
             if (!funcMap.ContainsKey(dllEntryPointPair))
             {
                 funcMap.Add(dllEntryPointPair, (k++).ToString());
             }
         }
         using (writer.NewNamespace("eoc_module"))
         {
             foreach (var item in moduleMap)
             {
                 writer.NewLine();
                 writer.Write($"eoc_DefineMoudleLoader({item.Value}, \"{item.Key}\");");
             }
         }
         using (writer.NewNamespace("eoc_func"))
         {
             foreach (var item in funcMap)
             {
                 var entryPointExpr = item.Key.Item2;
                 if (entryPointExpr.StartsWith("#"))
                 {
                     entryPointExpr = $"reinterpret_cast<const char *>({Convert.ToInt32(entryPointExpr.Substring(1))})";
                 }
                 else
                 {
                     entryPointExpr = $"\"{entryPointExpr}\"";
                 }
                 writer.NewLine();
                 writer.Write($"eoc_DefineFuncPtrGetter({item.Value}, {P.DllNamespace}::eoc_module::GetMoudleHandle_{item.Key.Item1}(), {entryPointExpr});");
             }
         }
         foreach (var item in eocDlls)
         {
             item.ImplementItem(writer, moduleMap, funcMap);
         }
     }
 }
Ejemplo n.º 14
0
 public EocStruct(ProjectConverter p, StructInfo rawInfo)
 {
     P          = p ?? throw new ArgumentNullException(nameof(p));
     RawInfo    = rawInfo ?? throw new ArgumentNullException(nameof(rawInfo));
     Name       = P.GetUserDefinedName_SimpleCppName(RawInfo.Id);
     RawName    = "raw_" + Name;
     RawCppName = $"{P.TypeNamespace}::eoc_internal::{RawName}";
     CppName    = P.GetCppTypeName(rawInfo.Id).ToString();
 }
Ejemplo n.º 15
0
 public static EocGlobalVariable Translate(ProjectConverter P, GlobalVariableInfo x)
 {
     return new EocGlobalVariable(P, new EocVariableInfo()
     {
         CppName = $"{P.GlobalNamespace}::{P.GetUserDefinedName_SimpleCppName(x.Id)}",
         DataType = EocDataTypes.Translate(P, x.DataType, x.UBound),
         UBound = x.UBound.ToList()
     });
 }
Ejemplo n.º 16
0
        public EocDll(ProjectConverter p, string name, EocCmdInfo info, string libraryName, string entryPoint)
        {
            P    = p ?? throw new ArgumentNullException(nameof(p));
            Name = name ?? throw new ArgumentNullException(nameof(name));

            Info        = info ?? throw new ArgumentNullException(nameof(info));
            LibraryName = libraryName ?? throw new ArgumentNullException(nameof(libraryName));
            EntryPoint  = entryPoint ?? throw new ArgumentNullException(nameof(EntryPoint));
        }
Ejemplo n.º 17
0
 public EocStaticClass(ProjectConverter p, ClassInfo rawInfo) : base(p, rawInfo)
 {
     MemberInfoMap = RawInfo.Variables.ToSortedDictionary(x => x.Id, x => new EocMemberInfo()
     {
         CppName  = $"{this.CppName}::{P.GetUserDefinedName_SimpleCppName(x.Id)}",
         DataType = EocDataTypes.Translate(P, x.DataType, x.UBound),
         UBound   = x.UBound.ToList(),
         Static   = true
     });
 }
Ejemplo n.º 18
0
 public static void Implement(ProjectConverter P, CodeWriter writer, EocGlobalVariable[] collection)
 {
     writer.Write("#include \"global.h\"");
     using (writer.NewNamespace(P.GlobalNamespace))
     {
         foreach (var item in collection)
         {
             item.ImplementItem(writer);
         }
     }
 }
Ejemplo n.º 19
0
        public static EocDll Translate(ProjectConverter P, DllDeclareInfo dllDeclare)
        {
            var libraryName = dllDeclare.LibraryName;
            var entryPoint  = dllDeclare.EntryPoint;

            if (string.IsNullOrEmpty(entryPoint))
            {
                entryPoint = P.IdToNameMap.GetUserDefinedName(dllDeclare.Id);
            }
            return(new EocDll(P, P.GetUserDefinedName_SimpleCppName(dllDeclare.Id), P.GetEocCmdInfo(dllDeclare), libraryName, entryPoint));
        }
Ejemplo n.º 20
0
 public static void Implement(ProjectConverter P, CodeWriter writer, SortedDictionary<int, EocGlobalVariable> map)
 {
     writer.Write("#include \"global.h\"");
     using (writer.NewNamespace(P.GlobalNamespace))
     {
         foreach (var item in map.Values)
         {
             item.ImplementItem(writer);
         }
     }
 }
Ejemplo n.º 21
0
 public static void Implement(ProjectConverter P, CodeWriter writer, EocConstant[] eocDlls)
 {
     writer.Write("#include \"constant.h\"");
     using (writer.NewNamespace(P.ConstantNamespace))
     {
         foreach (var item in eocDlls)
         {
             item.ImplementItem(writer);
         }
     }
 }
Ejemplo n.º 22
0
 public static void Define(ProjectConverter P, CodeWriter writer, EocGlobalVariable[] collection)
 {
     writer.Write("#pragma once");
     writer.NewLine();
     writer.Write("#include \"type.h\"");
     using (writer.NewNamespace(P.GlobalNamespace))
     {
         foreach (var item in collection)
         {
             item.DefineItem(writer);
         }
     }
 }
Ejemplo n.º 23
0
 public static void Implement(ProjectConverter P, CodeWriter writer, EocDllExport[] dllExports)
 {
     writer.Write("#include \"stdafx.h\"");
     writer.NewLine();
     writer.Write("extern \"C\"");
     using (writer.NewBlock())
     {
         foreach (var item in dllExports)
         {
             item.ImplementItem(P, writer);
         }
     }
 }
Ejemplo n.º 24
0
 public static void Define(ProjectConverter P, CodeWriter writer, EocDll[] eocDlls)
 {
     writer.Write("#pragma once");
     writer.NewLine();
     writer.Write("#include \"type.h\"");
     using (writer.NewNamespace(P.DllNamespace))
     {
         foreach (var item in eocDlls)
         {
             item.DefineItem(writer);
         }
     }
 }
Ejemplo n.º 25
0
 public static void Define(ProjectConverter P, CodeWriter writer, SortedDictionary<int, EocGlobalVariable> map)
 {
     writer.Write("#pragma once");
     writer.NewLine();
     writer.Write("#include \"type.h\"");
     using (writer.NewNamespace(P.GlobalNamespace))
     {
         foreach (var item in map.Values)
         {
             item.DefineItem(writer);
         }
     }
 }
Ejemplo n.º 26
0
 public static void Define(ProjectConverter P, CodeWriter writer, EocConstant[] eocDlls)
 {
     writer.Write("#pragma once");
     writer.NewLine();
     writer.Write("#include <e/system/basic_type.h>");
     using (writer.NewNamespace(P.ConstantNamespace))
     {
         foreach (var item in eocDlls)
         {
             item.DefineItem(writer);
         }
     }
 }
Ejemplo n.º 27
0
 public static void Define(ProjectConverter P, CodeWriter writer, SortedDictionary <int, EocConstant> map)
 {
     writer.Write("#pragma once");
     writer.NewLine();
     writer.Write("#include <e/system/basic_type.h>");
     using (writer.NewNamespace(P.ConstantNamespace))
     {
         foreach (var item in map.Values)
         {
             item.DefineItem(writer);
         }
     }
 }
Ejemplo n.º 28
0
 public static void Implement(ProjectConverter P, CodeWriter writer, SortedDictionary <int, EocDllExport> map)
 {
     writer.Write("#include \"stdafx.h\"");
     writer.NewLine();
     writer.Write("extern \"C\"");
     using (writer.NewBlock())
     {
         foreach (var item in map.Values)
         {
             item.ImplementItem(P, writer);
         }
     }
 }
Ejemplo n.º 29
0
 public EocStruct(ProjectConverter p, StructInfo rawInfo)
 {
     P             = p ?? throw new ArgumentNullException(nameof(p));
     RawInfo       = rawInfo ?? throw new ArgumentNullException(nameof(rawInfo));
     Name          = P.GetUserDefinedName_SimpleCppName(RawInfo.Id);
     RawName       = "raw_" + Name;
     RawCppName    = $"{P.TypeNamespace}::eoc_internal::{RawName}";
     CppName       = EocDataTypes.Translate(P, rawInfo.Id).ToString();
     MemberInfoMap = RawInfo.Member.ToSortedDictionary(x => x.Id, x => new EocMemberInfo()
     {
         CppName  = P.GetUserDefinedName_SimpleCppName(x.Id),
         DataType = EocDataTypes.Translate(P, x.DataType, x.UBound),
         UBound   = x.UBound.ToList()
     });
 }
Ejemplo n.º 30
0
 public EocClass(ProjectConverter p, ClassInfo rawInfo)
 {
     P       = p ?? throw new ArgumentNullException(nameof(p));
     RawInfo = rawInfo ?? throw new ArgumentNullException(nameof(rawInfo));
     Name    = P.GetUserDefinedName_SimpleCppName(RawInfo.Id);
     if (EplSystemId.GetType(rawInfo.Id) == EplSystemId.Type_Class)
     {
         CppName = $"{P.TypeNamespace}::{Name}";
     }
     else
     {
         CppName = $"{P.CmdNamespace}::{Name}";
     }
     Method = RawInfo.Method.Select(x => P.MethodIdMap[x]).Select(x => new CodeConverter(P, this, x)).ToList();
 }