Exemplo n.º 1
0
        private void MakeProgramEntry(CodeWriter writer)
        {
            writer.Write("#include \"stdafx.h\"");
            writer.NewLine();
            writer.Write("#include <Windows.h>");
            writer.NewLine();
            writer.Write("int init()");
            using (writer.NewBlock())
            {
                if (Source.InitEcSectionInfo != null)
                {
                    for (int i = 0; i < Source.InitEcSectionInfo.InitMethod.Length; i++)
                    {
                        writer.NewLine();
                        writer.Write(GetCppMethodName(Source.InitEcSectionInfo.InitMethod[i]));
                        writer.Write("();");
                        writer.AddComment("为{" + Source.InitEcSectionInfo.EcName[i] + "}做初始化");
                    }
                }
                if (Source.Code.MainMethod != 0)
                {
                    writer.NewLine();
                    writer.Write("return ");
                    writer.Write(GetCppMethodName(Source.Code.MainMethod));
                    writer.Write("();");
                }
                else
                {
                    writer.NewLine();
                    writer.Write("return e::user::cmd::_启动子程序();");
                }
            }
            switch (ProjectType)
            {
            case EocProjectType.Windows:
                writer.NewLine();
                writer.Write("int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)");
                using (writer.NewBlock())
                {
                    writer.NewLine();
                    writer.Write("return init();");
                }
                break;

            case EocProjectType.Console:
                writer.NewLine();
                writer.Write("int main()");
                using (writer.NewBlock())
                {
                    writer.NewLine();
                    writer.Write("return init();");
                }
                break;

            default:
                throw new Exception("未知项目类型");
            }
        }
Exemplo n.º 2
0
        public void ImplementRawObjectClass(CodeWriter writer)
        {
            writer.Write("#include \"../../../stdafx.h\"");
            using (writer.NewNamespace(P.TypeNamespace))
            {
                var initMethod    = Method.Values.Where(x => x.MethodItem.Name == "_初始化").FirstOrDefault();
                var destroyMethod = Method.Values.Where(x => x.MethodItem.Name == "_销毁").FirstOrDefault();
                using (writer.NewNamespace("eoc_internal"))
                {
                    writer.NewLine();
                    writer.Write($"{RawName}::{RawName}()");
                    if (MemberInfoMap.Count != 0)
                    {
                        writer.Write(": ");
                        P.InitMembersInConstructor(writer, MemberInfoMap.Values);
                    }
                    using (writer.NewBlock())
                    {
                        if (initMethod != null)
                        {
                            writer.NewLine();
                            writer.Write($"this->{initMethod.Name}();");
                        }
                    }
                    writer.NewLine();
                    writer.Write($"{RawName}::~{RawName}()");
                    using (writer.NewBlock())
                    {
                        if (destroyMethod != null)
                        {
                            writer.NewLine();
                            writer.Write($"this->{destroyMethod.Name}();");
                        }
                    }

                    writer.NewLine();
                    writer.Write($"{RawName}::{RawName}(const {RawName}&) = default;");

                    writer.NewLine();
                    writer.Write($"e::system::basic_object* {RawName}::clone()");
                    using (writer.NewBlock())
                    {
                        writer.NewLine();
                        writer.Write($"return new {RawName}(*this);");
                    }

                    foreach (var item in Method.Values)
                    {
                        item.ImplementNormalItem(writer);
                    }
                }
            }
        }
Exemplo n.º 3
0
        public void ImplementRawObjectClass(CodeWriter writer)
        {
            writer.Write("#include \"../../../stdafx.h\"");
            using (writer.NewNamespace(P.TypeNamespace))
            {
                bool hasInitMethod    = Method.Where(x => x.MethodItem.Name == "_初始化").FirstOrDefault() != null;
                bool hasDestroyMethod = Method.Where(x => x.MethodItem.Name == "_销毁").FirstOrDefault() != null;
                using (writer.NewNamespace("eoc_internal"))
                {
                    writer.NewLine();
                    writer.Write($"{RawName}::{RawName}()");
                    if (RawInfo.Variables.Length != 0)
                    {
                        writer.Write(": ");
                        P.InitMembersInConstructor(writer, RawInfo.Variables);
                    }
                    using (writer.NewBlock())
                    {
                        if (hasInitMethod)
                        {
                            writer.NewLine();
                            writer.Write("this->_初始化();");
                        }
                    }
                    writer.NewLine();
                    writer.Write($"{RawName}::~{RawName}()");
                    using (writer.NewBlock())
                    {
                        if (hasDestroyMethod)
                        {
                            writer.NewLine();
                            writer.Write("this->_销毁();");
                        }
                    }

                    writer.NewLine();
                    writer.Write($"{RawName}::{RawName}(const {RawName}&) = default;");

                    writer.NewLine();
                    writer.Write($"e::system::basic_object* {RawName}::clone()");
                    using (writer.NewBlock())
                    {
                        writer.NewLine();
                        writer.Write($"return new {RawName}(*this);");
                    }

                    foreach (var item in Method)
                    {
                        item.ImplementItem(writer);
                    }
                }
            }
        }
Exemplo n.º 4
0
 private void ImplementItem(CodeWriter writer)
 {
     if (Info?.Value == null)
     {
         return;
     }
     switch (Info.Value)
     {
     case byte[] v:
         writer.NewLine();
         writer.Write($"e::system::bin {Name}()");
         using (writer.NewBlock())
         {
             writer.NewLine();
             writer.Write("return e::system::bin {");
             for (int i = 0; i < v.Length; i++)
             {
                 if (i != 0)
                 {
                     writer.Write(", ");
                 }
                 writer.Write(v[i].ToString());
             }
             writer.Write("}");
             writer.Write(";");
         }
         break;
     }
 }
Exemplo n.º 5
0
        private void DefineItem(CodeWriter writer)
        {
            if (Info?.Value == null)
            {
                return;
            }
            switch (Info.Value)
            {
            case double v:
                writer.NewLine();
                if ((int)v == v)
                {
                    writer.Write($"const int {Name}({v});");
                }
                else if ((long)v == v)
                {
                    writer.Write($"const int64_t {Name}({v});");
                }
                else
                {
                    writer.Write($"const double {Name}({v});");
                }
                break;

            case bool v:
                writer.NewLine();
                writer.Write($"const bool {Name}(" + (v ? "true" : "false") + ");");
                break;

            case string v:
                writer.NewLine();
                writer.Write($"inline e::system::string {Name}()");
                using (writer.NewBlock())
                {
                    writer.NewLine();
                    writer.Write("return ");
                    writer.WriteLiteral(v);
                    writer.Write(";");
                }
                break;

            case DateTime v:
                writer.NewLine();
                writer.Write($"const e::system::datetime {Name}({v.ToOADate()}/*{v.ToString("yyyyMMddTHHmmss")}*/);");
                break;

            case byte[] v:
                writer.NewLine();
                writer.Write($"e::system::bin {Name}();");
                break;

            default:
                throw new Exception();
            }
        }
Exemplo n.º 6
0
        private void DefineRawStructInfo(CodeWriter writer)
        {
            writer.NewLine();
            writer.Write($"struct {RawName}");
            using (writer.NewBlock())
            {
                P.DefineVariable(writer, null, MemberInfoMap.Values, false);

                writer.NewLine();
                writer.Write($"{RawName}()");
                if (MemberInfoMap.Count != 0)
                {
                    writer.Write(": ");
                    P.InitMembersInConstructor(writer, MemberInfoMap.Values);
                }
                using (writer.NewBlock())
                {
                }
            }
            writer.Write(";");
        }
Exemplo n.º 7
0
        private void DefineRawStructInfo(CodeWriter writer)
        {
            writer.NewLine();
            writer.Write($"struct {RawName}");
            using (writer.NewBlock())
            {
                P.DefineVariable(writer, null, RawInfo.Member, false);

                writer.NewLine();
                writer.Write($"{RawName}()");
                if (RawInfo.Member.Length != 0)
                {
                    writer.Write(": ");
                    P.InitMembersInConstructor(writer, RawInfo.Member);
                }
                using (writer.NewBlock())
                {
                }
            }
            writer.Write(";");
        }
Exemplo n.º 8
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);
         }
     }
 }
Exemplo n.º 9
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);
         }
     }
 }
Exemplo n.º 10
0
        private void DefineStructMarshaler(CodeWriter writer)
        {
            writer.NewLine();
            writer.Write("template<> struct marshaler<");
            writer.Write(CppName);
            writer.Write(">");
            using (writer.NewBlock())
            {
                writer.NewLine();
                writer.Write("private: ");

                writer.NewLine();
                writer.Write("using ManagedType = ");
                writer.Write(CppName);
                writer.Write(";");

                writer.NewLine();
                writer.Write("public: ");

                writer.NewLine();
                writer.Write("static constexpr bool SameMemoryStruct = false;");

                writer.NewLine();
                writer.Write("#pragma pack(push)");
                writer.NewLine();
                writer.Write("#pragma pack(1)");

                writer.NewLine();
                writer.Write("struct NativeType");
                WriteStructMarshalerCodeBlock(writer, "DefineMember");
                writer.Write(";");

                writer.NewLine();
                writer.Write("#pragma pack(pop)");

                writer.NewLine();
                writer.Write("static void marshal(NativeType &v, ManagedType &r)");
                WriteStructMarshalerCodeBlock(writer, "MarshalMember");
                writer.Write(";");

                writer.NewLine();
                writer.Write("static void cleanup(NativeType &v, ManagedType &r)");
                WriteStructMarshalerCodeBlock(writer, "CleanupMember");
                writer.Write(";");
            }
            writer.Write(";");
        }
Exemplo n.º 11
0
 internal void ImplementItem(CodeWriter writer)
 {
     using (new LoggerContextHelper(Logger)
            .Set("class", P.IdToNameMap.GetUserDefinedName(ClassItem.RawInfo.Id))
            .Set("method", P.IdToNameMap.GetUserDefinedName(MethodItem.Id)))
     {
         string classRawName = null;
         if (ClassItem is EocObjectClass x)
         {
             classRawName = x.RawName;
         }
         P.WriteMethodHeader(writer, EocCmdInfo, Name, false, classRawName, false);
         using (writer.NewBlock())
         {
             P.DefineVariable(writer, null, MethodItem.Variables);
             WriteOptionalParameterReader(writer);
             StatementBlock.WriteTo(writer);
         }
     }
 }
Exemplo n.º 12
0
        private void ImplementItem(CodeWriter writer, Dictionary <string, string> moduleMap, Dictionary <Tuple <string, string>, string> funcMap)
        {
            var    paramName        = P.GetParamNameFromInfo(Info.Parameters);
            string returnTypeString = Info.ReturnDataType == null ? "void" : Info.ReturnDataType.ToString();
            string funcTypeString;

            P.WriteMethodHeader(writer, Info, Name, false, null, false);

            {
                var funcTypeStringBuilder = new StringBuilder();
                funcTypeStringBuilder.Append(returnTypeString);
                funcTypeStringBuilder.Append("(");
                for (int i = 0; i < Info.Parameters.Count; i++)
                {
                    if (i != 0)
                    {
                        funcTypeStringBuilder.Append(", ");
                    }
                    funcTypeStringBuilder.Append(P.GetParameterTypeString(Info.Parameters[i]));
                }
                funcTypeStringBuilder.Append(")");
                funcTypeString = funcTypeStringBuilder.ToString();
            }

            using (writer.NewBlock())
            {
                writer.NewLine();

                writer.Write("return e::system::MethodPtrCaller<");
                writer.Write(funcTypeString);
                writer.Write(">::call(");

                var funcId = funcMap[new Tuple <string, string>(moduleMap[LibraryName], EntryPoint)];
                writer.Write($"{P.DllNamespace}::eoc_func::GetFuncPtr_{funcId}()");

                writer.Write(string.Join("", paramName.Select(x => $", {x}")));
                writer.Write(");");
            }
        }
Exemplo n.º 13
0
 private void DefineRawObjectClass(CodeWriter writer)
 {
     writer.NewLine();
     writer.Write($"class {RawName}");
     if (BaseClassRawCppName != null)
     {
         writer.Write(": public ");
         writer.Write(BaseClassRawCppName);
     }
     else
     {
         writer.Write(": public e::system::basic_object");
     }
     using (writer.NewBlock())
     {
         writer.NewLine();
         if (RawInfo.Variables.Length != 0)
         {
             writer.Write("private:");
             P.DefineVariable(writer, null, RawInfo.Variables, false);
         }
         writer.NewLine();
         writer.Write("public:");
         writer.NewLine();
         writer.Write($"{RawName}();");
         writer.NewLine();
         writer.Write($"{RawName}(const {RawName}&);");
         writer.NewLine();
         writer.Write($"virtual ~{RawName}();");
         writer.NewLine();
         writer.Write($"virtual e::system::basic_object* __stdcall clone();");
         foreach (var item in Method)
         {
             item.DefineItem(writer);
         }
     }
     writer.Write(";");
 }
Exemplo n.º 14
0
 internal void ImplementTemplateItem(CodeWriter writer)
 {
     using (new LoggerContextHelper(Logger)
            .Set("class", P.IdToNameMap.GetUserDefinedName(ClassItem.RawInfo.Id))
            .Set("method", P.IdToNameMap.GetUserDefinedName(MethodItem.Id)))
     {
         if (!TemplatedMethod)
         {
             throw new Exception("必须使用模板化方法");
         }
         if (ClassItem is EocObjectClass x)
         {
             throw new Exception("非静态方法不能模板化");
         }
         P.WriteMethodHeader(writer, Info, Name, false, null, false);
         using (writer.NewBlock())
         {
             P.DefineVariable(writer, null, LocalMap.Values);
             WriteOptionalParameterReader(writer);
             StatementBlock.WriteTo(writer);
         }
     }
 }
Exemplo n.º 15
0
 private void WriteStructMarshalerCodeBlock(CodeWriter writer, string cmd)
 {
     using (writer.NewBlock())
     {
         foreach (var member in RawInfo.Member)
         {
             var memberCppName = P.GetUserDefinedName_SimpleCppName(member.Id);
             writer.NewLine();
             if (member.ByRef)
             {
                 writer.Write($"StructMarshaler_{cmd}_Ref(ManagedType, {memberCppName});");
             }
             else if (member.UBound != null && member.UBound.Length != 0)
             {
                 writer.Write($"StructMarshaler_{cmd}_Array(ManagedType, {memberCppName}, {P.CalculateArraySize(member.UBound)});");
             }
             else
             {
                 writer.Write($"StructMarshaler_{cmd}(ManagedType, {memberCppName});");
             }
         }
     }
 }
Exemplo n.º 16
0
        private void ImplementItem(ProjectConverter P, CodeWriter writer)
        {
            var paramName = P.GetParamNameFromInfo(Info.Parameters);

            writer.NewLine();
            writer.Write(Info.ReturnDataType == null ? "void" : $"typename e::system::MethodPtrPackager_Result<{Info.ReturnDataType}>::NativeType");
            writer.Write(" __stdcall ");
            writer.Write("eoc_export_");
            writer.Write(ExportId);
            writer.Write("(");
            for (int i = 0; i < Info.Parameters.Count; i++)
            {
                if (i != 0)
                {
                    writer.Write(", ");
                }
                writer.Write("typename e::system::MethodPtrPackager_Arg<");
                writer.Write(P.GetParameterTypeString(Info.Parameters[i]));
                writer.Write(">::NativeType ");
                writer.Write(paramName[i]);
            }
            writer.Write(")");
            using (writer.NewBlock())
            {
                writer.NewLine();
                writer.Write("return e::system::MethodPtrPackager<");
                writer.Write(Info.ReturnDataType == null ? "void" : Info.ReturnDataType.ToString());
                writer.Write("(");
                writer.Write(string.Join(", ", Info.Parameters.Select(x => P.GetParameterTypeString(x))));
                writer.Write(")");
                writer.Write(">::func<&" + Info.CppName + ">");
                writer.Write("(");
                writer.Write(string.Join(", ", paramName));
                writer.Write(");");
            }
        }
Exemplo n.º 17
0
        private void MakeProgramEntry(CodeWriter writer)
        {
            writer.Write("#include \"stdafx.h\"");
            writer.NewLine();
            writer.Write("#include <Windows.h>");
            writer.NewLine();
            writer.Write("int init()");
            using (writer.NewBlock())
            {
                if (Source.InitEcSectionInfo != null)
                {
                    for (int i = 0; i < Source.InitEcSectionInfo.InitMethod.Length; i++)
                    {
                        writer.NewLine();
                        writer.Write(GetCppMethodName(Source.InitEcSectionInfo.InitMethod[i]));
                        writer.Write("();");
                        writer.AddComment("为{" + Source.InitEcSectionInfo.EcName[i] + "}做初始化");
                    }
                }
                if (Source.Code.MainMethod != 0)
                {
                    writer.NewLine();
                    writer.Write("return ");
                    writer.Write(GetCppMethodName(Source.Code.MainMethod));
                    writer.Write("();");
                }
                else
                {
                    writer.NewLine();
                    writer.Write("return e::user::cmd::EocUser__启动子程序();");
                }
            }
            switch (ProjectType)
            {
            case EocProjectType.Windows:
                writer.NewLine();
                writer.Write("int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)");
                using (writer.NewBlock())
                {
                    writer.NewLine();
                    writer.Write("return init();");
                }
                break;

            case EocProjectType.Console:
                writer.NewLine();
                writer.Write("int main()");
                using (writer.NewBlock())
                {
                    writer.NewLine();
                    writer.Write("return init();");
                }
                break;

            case EocProjectType.Dll:
                writer.NewLine();
                writer.Write("BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)");
                using (writer.NewBlock())
                {
                    writer.NewLine();
                    writer.Write("switch(ul_reason_for_call)");
                    using (writer.NewBlock())
                    {
                        writer.NewLine();
                        writer.Write("case DLL_PROCESS_ATTACH:");
                        writer.NewLine();
                        writer.Write("init();");
                        writer.NewLine();
                        writer.Write("break;");
                    }
                    writer.NewLine();
                    writer.Write("return TRUE;");
                }
                break;

            default:
                throw new Exception("未知项目类型");
            }
        }