diff --git a/src/Luban.Core/CodeTarget/CommonFileHeaders.cs b/src/Luban.Core/CodeTarget/CommonFileHeaders.cs index c35cd50a..443a6192 100644 --- a/src/Luban.Core/CodeTarget/CommonFileHeaders.cs +++ b/src/Luban.Core/CodeTarget/CommonFileHeaders.cs @@ -40,5 +40,8 @@ the code is regenerated. # Changes to this file may cause incorrect behavior and will be lost if # the code is regenerated. # +"; + + public const string AUTO_GENERATE_PHP = @" CommonFileHeaders.AUTO_GENERATE_PHP; + + protected override string FileSuffixName => "php"; + + private readonly static ICodeStyle s_codeStyle = new ConfigurableCodeStyle("pascal", "pascal", "camel", "camel", "camel", "none"); + + protected override ICodeStyle DefaultCodeStyle => s_codeStyle; + + protected override string DefaultOutputFileName => "schema.php"; + + private static readonly HashSet s_preservedKeyWords = new() + { + // PHP preserved key words + "__halt_compiler","abstract","and","array","as","break","callable","case","catch","class","clone","const","continue","declare", + "default","die","do","echo","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","eval", + "exit","extends","final","finally","for","foreach","function","global","goto","if","implements","include","include_once","instanceof","insteadof","interface" + }; + + protected override IReadOnlySet PreservedKeyWords => s_preservedKeyWords; + + protected override void OnCreateTemplateContext(TemplateContext ctx) + { + ctx.PushGlobal(new PHPCommonTemplateExtension()); + } +} diff --git a/src/Luban.PHP/CodeTarget/PHPJsonCodeTarget.cs b/src/Luban.PHP/CodeTarget/PHPJsonCodeTarget.cs new file mode 100644 index 00000000..8a987ed1 --- /dev/null +++ b/src/Luban.PHP/CodeTarget/PHPJsonCodeTarget.cs @@ -0,0 +1,15 @@ +using Luban.CodeTarget; +using Luban.PHP.TemplateExtensions; +using Scriban; + +namespace Luban.PHP.CodeTarget; + +[CodeTarget("php-json")] +public class PHPJsonCodeTarget : PHPCodeTargetBase +{ + protected override void OnCreateTemplateContext(TemplateContext ctx) + { + base.OnCreateTemplateContext(ctx); + ctx.PushGlobal(new PHPJsonTemplateExtension()); + } +} diff --git a/src/Luban.PHP/Luban.PHP.csproj b/src/Luban.PHP/Luban.PHP.csproj new file mode 100644 index 00000000..7ddc1039 --- /dev/null +++ b/src/Luban.PHP/Luban.PHP.csproj @@ -0,0 +1,60 @@ + + + + net7.0 + enable + disable + + + + + + + + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + + + + + + diff --git a/src/Luban.PHP/TemplateExtensions/PHPCommonTemplateExtension.cs b/src/Luban.PHP/TemplateExtensions/PHPCommonTemplateExtension.cs new file mode 100644 index 00000000..243a13dc --- /dev/null +++ b/src/Luban.PHP/TemplateExtensions/PHPCommonTemplateExtension.cs @@ -0,0 +1,38 @@ +using Luban.CodeFormat; +using Luban.Defs; +using Luban.Types; +using Luban.Utils; +using Scriban.Runtime; + +namespace Luban.PHP.TemplateExtensions; + +public class PHPCommonTemplateExtension : ScriptObject +{ + public static string FullName(DefTypeBase type) + { + return TypeUtil.MakePyFullName(type.Namespace, type.Name); + } + + public static string ClassModifier(DefBean bean) + { + return bean.IsAbstractType ? "abstract" : ""; + } + + public static string NamespaceWithGraceBegin(string ns) + { + if (string.IsNullOrEmpty(ns)) + { + return ""; + } + return string.Join("", ns.Split('.').Select(n => $"namespace {n} {{")); + } + + public static string NamespaceWithGraceEnd(string ns) + { + if (string.IsNullOrEmpty(ns)) + { + return ""; + } + return string.Join("", ns.Split('.').Select(n => $"}}")); + } +} diff --git a/src/Luban.PHP/TemplateExtensions/PHPJsonTemplateExtension.cs b/src/Luban.PHP/TemplateExtensions/PHPJsonTemplateExtension.cs new file mode 100644 index 00000000..e465a359 --- /dev/null +++ b/src/Luban.PHP/TemplateExtensions/PHPJsonTemplateExtension.cs @@ -0,0 +1,13 @@ +using Luban.PHP.TypeVisitors; +using Luban.Types; +using Scriban.Runtime; + +namespace Luban.PHP.TemplateExtensions; + +public class PHPJsonTemplateExtension : ScriptObject +{ + public static string Deserialize(string fieldName, string jsonVar, TType type) + { + return type.Apply(JsonDeserializeVisitor.Ins, jsonVar, fieldName, 0); + } +} diff --git a/src/Luban.PHP/Templates/common/php/enum.sbn b/src/Luban.PHP/Templates/common/php/enum.sbn new file mode 100644 index 00000000..139597f9 --- /dev/null +++ b/src/Luban.PHP/Templates/common/php/enum.sbn @@ -0,0 +1,2 @@ + + diff --git a/src/Luban.PHP/Templates/php-json/schema.sbn b/src/Luban.PHP/Templates/php-json/schema.sbn new file mode 100644 index 00000000..478c850f --- /dev/null +++ b/src/Luban.PHP/Templates/php-json/schema.sbn @@ -0,0 +1,155 @@ +{{~namespace_with_grace_begin __namespace~}} + +{{~for enum in __enums~}} +{{~if enum.comment != '' ~}} +/** + * {{enum.comment | html.escape}} + */ +{{~end~}} +class {{full_name enum}} { + {{~for item in enum.items ~}} +{{~if item.comment != '' ~}} + /** + * {{escape_comment item.comment}} + */ +{{~end~}} + public const {{item.name}} = {{item.value}}; + {{~end~}} +} + +{{~end~}} + + +{{~for bean in __beans~}} +{{name = (full_name bean)}} +{{~if bean.comment != '' ~}} +/** + * {{escape_comment bean.comment}} + */ +{{~end~}} +{{class_modifier bean}} class {{name}}{{if bean.parent_def_type}} extends {{full_name bean.parent_def_type}}{{end}} { +{{~if bean.is_abstract_type~}} + public static function constructFrom($_json_) { + $type = $_json_['$type']; + switch ($type) { + {{~ for child in bean.hierarchy_not_abstract_children~}} + case '{{impl_data_type child bean}}': return new {{full_name child}}($_json_); + {{~end~}} + default: throw new \Exception("unknown type:$type"); + } + } +{{~end~}} + + public function __construct($_json_) { + {{~if bean.parent_def_type~}} + parent::__construct($_json_); + {{~end~}} + {{~ for field in bean.export_fields ~}} + {{~if !field.ctype.is_nullable~}} + if (!array_key_exists('{{field.name}}', $_json_)) { throw new \Exception("field:'{{field.name}}' missing"); } + {{~end~}} + {{deserialize ('$this->' + format_field_name __code_style field.name) ( '$_json_[\'' + field.name + '\']') field.ctype}}; + {{~end~}} + } + + {{~ for field in bean.export_fields ~}} +{{~if field.comment != '' ~}} + /** + * {{escape_comment field.comment}} + */ +{{~end~}} + public ${{format_field_name __code_style field.name}}; + {{~end~}} +} + + +{{~end~}} + +{{~for table in __tables + key_type = table.key_ttype + value_type = table.value_ttype + name = (full_name table) +~}} + +{{~if table.comment != '' ~}} +/** + * {{escape_comment table.comment}} + */ +{{~end~}} +class {{name}} { + {{~if table.is_map_table ~}} + private $_dataMap; + private $_dataList; + public function __construct($_json_) { + $this->_dataMap = []; + $this->_dataList = []; + foreach ($_json_ as $_json2_) { + {{deserialize '$_v' '$_json2_' value_type}}; + array_push($this->_dataList, $_v); + $this->_dataMap[$_v->{{format_field_name __code_style table.index_field.name}}] = $_v; + } + } + + public function getDataMap() { return $this->_dataMap; } + public function getDataList() { return $this->_dataList; } + + public function get($key) { return $this->_dataMap[$key]; } + + {{~else if table.is_list_table ~}} + private $_dataList; + + public function __construct($_json_) { + $this->_dataList = []; + foreach ($_json_ as $_json2_) { + {{deserialize '$_v' '$_json2_' value_type}}; + array_push($this->_dataList, $_v); + } + } + + public function getDataList() { return $this->_dataList; } + + public function get($index) { return $this->_dataList[$index]; } + + {{~else~}} + + private $_data; + public function __construct($_json_) { + if (count($_json_) != 1) throw new \Exception('table:{{table.name}} mode=one, but size != 1'); + {{deserialize '$this->_data' '$_json_[0]' value_type}}; + } + + public function getData() { return $this->_data; } + + {{~ for field in value_type.def_bean.hierarchy_export_fields ~}} +{{~if field.comment != '' ~}} + /** + * {{escape_comment field.comment}} + */ +{{~end~}} + public function get{{format_field_name __code_style field.name}}() { return $this->_data->{{format_field_name __code_style field.name}}; } + {{~end~}} + + {{end}} +} + +{{~end~}} + +class {{__name}} { + {{~ for table in __tables ~}} + private $_{{table.name}}; +{{~if table.comment != '' ~}} + /** + * {{escape_comment table.comment}} + */ +{{~end~}} + public function get{{table.name}}() { return $this->_{{table.name}}; } + {{~end~}} + + public function __construct($loader) { + {{~for table in __tables ~}} + $this->_{{table.name}} = new {{full_name table}}($loader('{{table.output_data_file}}')); + {{~end~}} + } +} + +{{~namespace_with_grace_end __namespace~}} diff --git a/src/Luban.PHP/TypeVisitors/JsonDeserializeVisitor.cs b/src/Luban.PHP/TypeVisitors/JsonDeserializeVisitor.cs new file mode 100644 index 00000000..c3fd0b0e --- /dev/null +++ b/src/Luban.PHP/TypeVisitors/JsonDeserializeVisitor.cs @@ -0,0 +1,26 @@ +using Luban.Types; +using Luban.TypeVisitors; + +namespace Luban.PHP.TypeVisitors; + +public class JsonDeserializeVisitor : DecoratorFuncVisitor +{ + public static JsonDeserializeVisitor Ins { get; } = new(); + + public override string DoAccept(TType type, string jsonFieldName, string fieldName, int depth) + { + if (type.IsNullable) + { + return $"if({jsonFieldName} != null) {{ {type.Apply(JsonUnderlyingDeserializeVisitor.Ins, jsonFieldName, fieldName, depth)}; }} else {{ {fieldName} = null; }}"; + } + else + { + return type.Apply(JsonUnderlyingDeserializeVisitor.Ins, jsonFieldName, fieldName, depth); + } + } + + //public override string Accept(TBean type, string bytebufName, string fieldName) + //{ + // return type.Apply(TypescriptJsonUnderingConstructorVisitor.Ins, bytebufName, fieldName); + //} +} diff --git a/src/Luban.PHP/TypeVisitors/JsonUnderlyingDeserializeVisitor.cs b/src/Luban.PHP/TypeVisitors/JsonUnderlyingDeserializeVisitor.cs new file mode 100644 index 00000000..9eb7fe0b --- /dev/null +++ b/src/Luban.PHP/TypeVisitors/JsonUnderlyingDeserializeVisitor.cs @@ -0,0 +1,103 @@ +using Luban.DataExporter.Builtin.Json; +using Luban.Datas; +using Luban.PHP.TemplateExtensions; +using Luban.Types; +using Luban.TypeVisitors; + +namespace Luban.PHP.TypeVisitors; + +public class JsonUnderlyingDeserializeVisitor : ITypeFuncVisitor +{ + public static JsonUnderlyingDeserializeVisitor Ins { get; } = new JsonUnderlyingDeserializeVisitor(); + + public string Accept(TBool type, string jsonVarName, string fieldName, int depth) + { + return $"{fieldName} = {jsonVarName}"; + } + + public string Accept(TByte type, string jsonVarName, string fieldName, int depth) + { + return $"{fieldName} = {jsonVarName}"; + } + + public string Accept(TShort type, string jsonVarName, string fieldName, int depth) + { + return $"{fieldName} = {jsonVarName}"; + } + + public string Accept(TInt type, string jsonVarName, string fieldName, int depth) + { + return $"{fieldName} = {jsonVarName}"; + } + + public string Accept(TLong type, string jsonVarName, string fieldName, int depth) + { + return $"{fieldName} = {jsonVarName}"; + } + + public string Accept(TFloat type, string jsonVarName, string fieldName, int depth) + { + return $"{fieldName} = {jsonVarName}"; + } + + public string Accept(TDouble type, string jsonVarName, string fieldName, int depth) + { + return $"{fieldName} = {jsonVarName}"; + } + + public string Accept(TEnum type, string jsonVarName, string fieldName, int depth) + { + return $"{fieldName} = {jsonVarName}"; + } + + public string Accept(TString type, string jsonVarName, string fieldName, int depth) + { + return $"{fieldName} = {jsonVarName}"; + } + + public string Accept(TDateTime type, string jsonVarName, string fieldName, int depth) + { + return $"{fieldName} = {jsonVarName}"; + } + + public string Accept(TBean type, string jsonVarName, string fieldName, int depth) + { + string fullName = PHPCommonTemplateExtension.FullName(type.DefBean); + if (type.DefBean.IsAbstractType) + { + return $"{fieldName} = {fullName}::constructFrom({jsonVarName})"; + } + else + { + return $"{fieldName} = new {fullName}({jsonVarName})"; + } + } + + public string Accept(TArray type, string jsonVarName, string fieldName, int depth) + { + return $"{{ {fieldName} = []; foreach ({jsonVarName} as $_ele{depth}) {{ {type.ElementType.Apply(this, $"$_ele{depth}", $"$_e{depth}", depth + 1)}; array_push({fieldName}, $_e{depth});}} }}"; + } + + public string Accept(TList type, string jsonVarName, string fieldName, int depth) + { + return $"{{ {fieldName} = []; foreach ({jsonVarName} as $_ele{depth}) {{ {type.ElementType.Apply(this, $"$_ele{depth}", $"$_e{depth}", depth + 1)}; array_push({fieldName}, $_e{depth});}} }}"; + } + + public string Accept(TSet type, string jsonVarName, string fieldName, int depth) + { + if (type.ElementType.Apply(SimpleJsonTypeVisitor.Ins)) + { + return $"{fieldName} = {jsonVarName}"; + } + return $"{{ {fieldName} = []; foreach ({jsonVarName} as $_ele{depth}) {{ {type.ElementType.Apply(this, $"$_ele{depth}", $"$_e{depth}", depth + 1)}; array_push({fieldName}, $_e{depth});}} }}"; + } + + public string Accept(TMap type, string jsonVarName, string fieldName, int depth) + { + if (type.KeyType.Apply(SimpleJsonTypeVisitor.Ins) && type.ValueType.Apply(SimpleJsonTypeVisitor.Ins)) + { + return $"{fieldName} = {jsonVarName}"; + } + return $"{{{fieldName} = []; foreach ({jsonVarName} as $e{depth}) {{ {type.KeyType.Apply(this, $"$e{depth}[0]", $"$_k{depth}", depth + 1)}; {type.ValueType.Apply(this, $"$e{depth}[1]", $"$_v{depth}", depth + 1)}; {fieldName}[$_k{depth}] = $_v{depth}; }} }}"; + } +} diff --git a/src/Luban.Typescript/TypeVisitors/JsonUnderlyingDeserializeVisitor.cs b/src/Luban.Typescript/TypeVisitors/JsonUnderlyingDeserializeVisitor.cs index 30ff4a23..5c8226c8 100644 --- a/src/Luban.Typescript/TypeVisitors/JsonUnderlyingDeserializeVisitor.cs +++ b/src/Luban.Typescript/TypeVisitors/JsonUnderlyingDeserializeVisitor.cs @@ -83,7 +83,7 @@ public string Accept(TList type, string jsonVarName, string fieldName, int depth public string Accept(TSet type, string jsonVarName, string fieldName, int depth) { - if (type.Apply(SimpleJsonTypeVisitor.Ins)) + if (type.ElementType.Apply(SimpleJsonTypeVisitor.Ins)) { return $"{fieldName} = {jsonVarName}"; } diff --git a/src/Luban.sln b/src/Luban.sln index 6741b271..5339d999 100644 --- a/src/Luban.sln +++ b/src/Luban.sln @@ -1,45 +1,47 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29418.71 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34511.84 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban", "Luban\Luban.csproj", "{26003D67-6228-4848-8B8F-985992800237}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban", "Luban\Luban.csproj", "{26003D67-6228-4848-8B8F-985992800237}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.DataLoader.Builtin", "Luban.DataLoader.Builtin\Luban.DataLoader.Builtin.csproj", "{2200760D-A03B-46F8-8968-6818FB0984CD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.DataLoader.Builtin", "Luban.DataLoader.Builtin\Luban.DataLoader.Builtin.csproj", "{2200760D-A03B-46F8-8968-6818FB0984CD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.Core", "Luban.Core\Luban.Core.csproj", "{C89F41B6-D378-4558-A8F8-AEE4A68600DE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.Core", "Luban.Core\Luban.Core.csproj", "{C89F41B6-D378-4558-A8F8-AEE4A68600DE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.CSharp", "Luban.CSharp\Luban.CSharp.csproj", "{EDEA1339-94A4-4A2D-8C09-707296306F60}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.CSharp", "Luban.CSharp\Luban.CSharp.csproj", "{EDEA1339-94A4-4A2D-8C09-707296306F60}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.Schema.Builtin", "Luban.Schema.Builtin\Luban.Schema.Builtin.csproj", "{701EA9C0-C680-4FA3-B51B-CEC79BCFE56B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.Schema.Builtin", "Luban.Schema.Builtin\Luban.Schema.Builtin.csproj", "{701EA9C0-C680-4FA3-B51B-CEC79BCFE56B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.DataTarget.Builtin", "Luban.DataTarget.Builtin\Luban.DataTarget.Builtin.csproj", "{7D1DC8E2-6581-4E35-A098-A8ED9264361C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.DataTarget.Builtin", "Luban.DataTarget.Builtin\Luban.DataTarget.Builtin.csproj", "{7D1DC8E2-6581-4E35-A098-A8ED9264361C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.DataValidator.Builtin", "Luban.DataValidator.Builtin\Luban.DataValidator.Builtin.csproj", "{E1E70DDB-FBEC-429D-8FBF-657271949DB6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.DataValidator.Builtin", "Luban.DataValidator.Builtin\Luban.DataValidator.Builtin.csproj", "{E1E70DDB-FBEC-429D-8FBF-657271949DB6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.L10N", "Luban.L10N\Luban.L10N.csproj", "{C5278424-8595-4A09-A1FC-C5703AB1D0A0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.L10N", "Luban.L10N\Luban.L10N.csproj", "{C5278424-8595-4A09-A1FC-C5703AB1D0A0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.Protobuf", "Luban.Protobuf\Luban.Protobuf.csproj", "{B7F83DCC-433F-4364-B1DB-D191BCCC9279}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.Protobuf", "Luban.Protobuf\Luban.Protobuf.csproj", "{B7F83DCC-433F-4364-B1DB-D191BCCC9279}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.FlatBuffers", "Luban.FlatBuffers\Luban.FlatBuffers.csproj", "{0E6A7105-D241-4D13-A0B7-3AC6CC6E091D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.FlatBuffers", "Luban.FlatBuffers\Luban.FlatBuffers.csproj", "{0E6A7105-D241-4D13-A0B7-3AC6CC6E091D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.MsgPack", "Luban.MsgPack\Luban.MsgPack.csproj", "{EAE81827-B4AB-4FFD-ADFA-8D1DD8C3F8EE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.MsgPack", "Luban.MsgPack\Luban.MsgPack.csproj", "{EAE81827-B4AB-4FFD-ADFA-8D1DD8C3F8EE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.Bson", "Luban.Bson\Luban.Bson.csproj", "{DB041AE2-4AB0-4BA1-BA6E-611BC9AC3848}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.Bson", "Luban.Bson\Luban.Bson.csproj", "{DB041AE2-4AB0-4BA1-BA6E-611BC9AC3848}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.Lua", "Luban.Lua\Luban.Lua.csproj", "{6FCDA8CB-5483-48A9-9BAF-DAAB12CF27E8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.Lua", "Luban.Lua\Luban.Lua.csproj", "{6FCDA8CB-5483-48A9-9BAF-DAAB12CF27E8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.Python", "Luban.Python\Luban.Python.csproj", "{37900AA3-7B17-47D6-9318-74E71C0E04B7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.Python", "Luban.Python\Luban.Python.csproj", "{37900AA3-7B17-47D6-9318-74E71C0E04B7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.Java", "Luban.Java\Luban.Java.csproj", "{4195E08B-F834-4D28-9A2C-32866862B549}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.Java", "Luban.Java\Luban.Java.csproj", "{4195E08B-F834-4D28-9A2C-32866862B549}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.Golang", "Luban.Golang\Luban.Golang.csproj", "{9C22771A-D27E-49AA-A6DC-5D6B165373F0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.Golang", "Luban.Golang\Luban.Golang.csproj", "{9C22771A-D27E-49AA-A6DC-5D6B165373F0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.Typescript", "Luban.Typescript\Luban.Typescript.csproj", "{CA2B5775-0ED2-439E-8946-65C0FC4449F9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.Typescript", "Luban.Typescript\Luban.Typescript.csproj", "{CA2B5775-0ED2-439E-8946-65C0FC4449F9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.Cpp", "Luban.Cpp\Luban.Cpp.csproj", "{7692415C-FED5-4837-8DA0-4949B7E660CC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.Cpp", "Luban.Cpp\Luban.Cpp.csproj", "{7692415C-FED5-4837-8DA0-4949B7E660CC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luban.Gdscript", "Luban.Gdscript\Luban.Gdscript.csproj", "{70A9132F-8527-4E5E-96C5-A025B880CC0B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.Gdscript", "Luban.Gdscript\Luban.Gdscript.csproj", "{70A9132F-8527-4E5E-96C5-A025B880CC0B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Luban.PHP", "Luban.PHP\Luban.PHP.csproj", "{96E2962A-53A9-4B73-B90B-BDCE46938B2E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -123,6 +125,10 @@ Global {70A9132F-8527-4E5E-96C5-A025B880CC0B}.Debug|Any CPU.Build.0 = Debug|Any CPU {70A9132F-8527-4E5E-96C5-A025B880CC0B}.Release|Any CPU.ActiveCfg = Release|Any CPU {70A9132F-8527-4E5E-96C5-A025B880CC0B}.Release|Any CPU.Build.0 = Release|Any CPU + {96E2962A-53A9-4B73-B90B-BDCE46938B2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96E2962A-53A9-4B73-B90B-BDCE46938B2E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96E2962A-53A9-4B73-B90B-BDCE46938B2E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96E2962A-53A9-4B73-B90B-BDCE46938B2E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Luban/Luban.csproj b/src/Luban/Luban.csproj index 719f430a..3bfd6c0d 100644 --- a/src/Luban/Luban.csproj +++ b/src/Luban/Luban.csproj @@ -51,6 +51,7 @@ +