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 WriteOptionalParameterReader(CodeWriter writer) { foreach (var x in Parameters.Where(x => x.OptionalParameter)) { var name = P.GetUserDefinedName_SimpleCppName(x.Id); var realValueType = P.GetCppTypeName(x.DataType, x.ArrayParameter); var nullParameter = P.GetNullParameter(x.DataType, x.ArrayParameter); var initValue = P.GetInitValue(x.DataType, x.ArrayParameter); writer.NewLine(); writer.Write($"bool eoc_isNull_{name} = !{name}.has_value();"); if (x.ByRef || x.ArrayParameter || !P.IsValueType(x.DataType)) { writer.NewLine(); if (string.IsNullOrWhiteSpace(nullParameter)) { writer.Write($"{realValueType} eoc_default_{name};"); } else { writer.Write($"{realValueType} eoc_default_{name}({nullParameter});"); } writer.NewLine(); writer.Write($"{realValueType}& eoc_value_{name} = eoc_isNull_{name} ? (eoc_default_{name} = {initValue}) : {name}.value().get();"); } else { writer.NewLine(); writer.Write($"{realValueType} eoc_value_{name} = eoc_isNull_{name} ? {initValue} : {name}.value();"); } } }
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); } } }
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("未知项目类型"); } }
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: throw new Exception(); default: throw new Exception(); } }
internal WriteNamespaceHelper(CodeWriter writer, params string[] splitedNamespace) { this.writer = writer ?? throw new ArgumentNullException(nameof(writer)); this.splitedNamespace = splitedNamespace ?? throw new ArgumentNullException(nameof(splitedNamespace)); foreach (var item in splitedNamespace) { writer.NewLine(); writer.Write("namespace " + item); writer.NewLine(); writer.Write("{"); writer.Indent++; } }
internal void DefineVariable(CodeWriter writer, string[] modifiers, EocVariableInfo variable, bool initAtOnce = true) { writer.NewLine(); if (modifiers != null) { foreach (var item in modifiers) { writer.Write(item); writer.Write(" "); } } writer.Write(variable.DataType.ToString()); writer.Write(" "); writer.Write(variable.CppName.Split(new string[] { "::" }, StringSplitOptions.None).LastOrDefault()); if (initAtOnce) { var initParameter = EocDataTypes.GetInitParameter(variable.DataType, variable.UBound); if (!string.IsNullOrWhiteSpace(initParameter)) { writer.Write("("); writer.Write(initParameter); writer.Write(")"); } } writer.Write(";"); }
private void DefineAllTypes(CodeWriter writer) { writer.Write("#pragma once"); writer.NewLine(); writer.Write("#include <e/system/basic_type.h>"); ReferenceEocLibs(writer); using (writer.NewNamespace(TypeNamespace)) { using (writer.NewNamespace("eoc_internal")) { EocStruct.DefineRawName(this, writer, EocStructs); EocObjectClass.DefineRawName(this, writer, EocObjectClasses); } EocStruct.DefineName(this, writer, EocStructs); EocObjectClass.DefineName(this, writer, EocObjectClasses); using (writer.NewNamespace("eoc_internal")) { EocStruct.DefineRawStructInfo(this, writer, EocStructs); EocObjectClass.DefineRawObjectClass(this, writer, EocObjectClasses); } } using (writer.NewNamespace("e::system")) { EocStruct.DefineStructMarshaler(this, writer, EocStructs); } }
internal void DefineVariable(CodeWriter writer, string[] modifiers, AbstractVariableInfo variable, bool initAtOnce = true) { writer.NewLine(); if (modifiers != null) { foreach (var item in modifiers) { writer.Write(item); writer.Write(" "); } } writer.Write(GetCppTypeName(variable.DataType, variable.UBound).ToString()); writer.Write(" "); writer.Write(GetUserDefinedName_SimpleCppName(variable.Id)); if (initAtOnce) { var initParameter = GetInitParameter(variable.DataType, variable.UBound); if (!string.IsNullOrWhiteSpace(initParameter)) { writer.Write("("); writer.Write(initParameter); writer.Write(")"); } } writer.Write(";"); }
internal WriteBlockHelper(CodeWriter writer) { this.writer = writer ?? throw new ArgumentNullException(nameof(writer)); writer.NewLine(); writer.Write("{"); writer.Indent++; }
public static void Implement(ProjectConverter P, CodeWriter writer, EocDll[] eocDlls) { 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>(); var funcMap = new Dictionary <Tuple <string, string>, string>(); for (int i = 0, j = 0, k = 0; i < eocDlls.Length; 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) { writer.NewLine(); writer.Write($"eoc_DefineFuncPtrGetter({item.Value}, {P.DllNamespace}::eoc_module::GetMoudleHandle_{item.Key.Item1}(), \"{item.Key.Item2}\");"); } } foreach (var item in eocDlls) { item.ImplementItem(writer, moduleMap, funcMap); } } }
public void Dispose() { foreach (var item in splitedNamespace) { writer.Indent--; writer.NewLine(); writer.Write("}"); } }
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 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); } } }
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); } } }
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 void Define(CodeWriter writer) { writer.Write("#pragma once"); writer.NewLine(); writer.Write("#include \"../type.h\""); using (writer.NewNamespace(P.CmdNamespace)) { foreach (var item in Method) { item.DefineItem(writer); } } }
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); } } }
private void ReferenceEocLibs(CodeWriter writer) { for (int i = 0; i < Source.Code.Libraries.Length; i++) { if (EocLibs[i] == null) { continue; } LibraryRefInfo item = Source.Code.Libraries[i]; writer.NewLine(); writer.Write($"#include <e/lib/{item.FileName}/public.h>"); } }
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); } } }
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); } } }
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); } } }
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); } } } }
internal void WriteMethodHeader(CodeWriter writer, EocCmdInfo eocCmdInfo, string name, bool isVirtual, string className = null, bool writeDefaultValue = true) { var paramName = GetParamNameFromInfo(eocCmdInfo.Parameters); writer.NewLine(); if (isVirtual) { writer.Write("virtual "); } var numOfOptionalAtEnd = 0; for (int i = eocCmdInfo.Parameters.Count - 1; i >= 0; i--) { if (eocCmdInfo.Parameters[i].Optional) { numOfOptionalAtEnd++; } else { break; } } var startOfOptionalAtEnd = eocCmdInfo.Parameters.Count - numOfOptionalAtEnd; writer.Write(eocCmdInfo.ReturnDataType == null ? "void" : eocCmdInfo.ReturnDataType.ToString()); writer.Write(" __stdcall "); if (className != null) { writer.Write(className); writer.Write("::"); } writer.Write(name); writer.Write("("); for (int i = 0; i < eocCmdInfo.Parameters.Count; i++) { if (i != 0) { writer.Write(", "); } writer.Write(GetParameterTypeString(eocCmdInfo.Parameters[i])); writer.Write(" "); writer.Write(paramName[i]); if (writeDefaultValue && i >= startOfOptionalAtEnd) { writer.Write(" = std::nullopt"); } } writer.Write(")"); }
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(");"); } }
internal void DefineItem(CodeWriter writer) { var isVirtual = false; if (IsClassMember) { writer.NewLine(); writer.Write(MethodItem.Public ? "public:" : "private:"); if (MethodItem.Name != "_初始化" && MethodItem.Name != "_销毁") { isVirtual = true; } } P.DefineMethod(writer, EocCmdInfo, Name, isVirtual); }
private void WriteOptionalParameterReader(CodeWriter writer) { foreach (var x in Info.Parameters.Where(x => x.Optional)) { var name = x.CppName; var typeName = x.DataType == EocDataTypes.Auto ? $"_EocAutoParam_{x.CppName}" : x.DataType.ToString(); var nullValue = $"e::system::default_value<{typeName}>::null()"; var initValue = $"e::system::default_value<{typeName}>::value()"; writer.NewLine(); writer.Write($"bool eoc_isNull_{name} = !{name}.has_value();"); if (x.ByRef) { writer.NewLine(); writer.Write($"{typeName} eoc_default_{name} = {nullValue};"); writer.NewLine(); writer.Write($"{typeName}& eoc_value_{name} = eoc_isNull_{name} ? (eoc_default_{name} = {initValue}) : {name}.value().get();"); } else { writer.NewLine(); writer.Write($"{typeName} eoc_value_{name} = eoc_isNull_{name} ? {initValue} : {name}.value();"); } } }
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("struct NativeType"); WriteStructMarshalerCodeBlock(writer, "DefineMember"); writer.Write(";"); 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(";"); }