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("未知项目类型"); } }
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); } } } }
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); } } } }
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; } }
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(); } }
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(";"); }
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(";"); }
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); } } }
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); } } }
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(";"); }
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); } } }
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(");"); } }
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(";"); }
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); } } }
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});"); } } } }
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(");"); } }
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("未知项目类型"); } }