From e2beaadaa97ae3a53ce3f1a1103ee510cdd2a3f2 Mon Sep 17 00:00:00 2001 From: "g.shinohara" Date: Wed, 24 Feb 2021 18:43:27 +0900 Subject: [PATCH 1/6] rename TempProject -> TempTargetProject in GeneratorTest --- .../GenerateEnumFormatterTest.cs | 2 +- .../GenerateGenericsFormatterTest.cs | 28 +++++++++---------- .../GenerateMessagePackFormatterAttrTest.cs | 2 +- .../TemporaryProjectWorkarea.cs | 23 ++++++++------- 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/tests/MessagePack.Generator.Tests/GenerateEnumFormatterTest.cs b/tests/MessagePack.Generator.Tests/GenerateEnumFormatterTest.cs index ac735c3e3..2ad23fcbe 100644 --- a/tests/MessagePack.Generator.Tests/GenerateEnumFormatterTest.cs +++ b/tests/MessagePack.Generator.Tests/GenerateEnumFormatterTest.cs @@ -43,7 +43,7 @@ public enum MyEnum } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( diff --git a/tests/MessagePack.Generator.Tests/GenerateGenericsFormatterTest.cs b/tests/MessagePack.Generator.Tests/GenerateGenericsFormatterTest.cs index 05040322a..f906f93e0 100644 --- a/tests/MessagePack.Generator.Tests/GenerateGenericsFormatterTest.cs +++ b/tests/MessagePack.Generator.Tests/GenerateGenericsFormatterTest.cs @@ -53,7 +53,7 @@ public enum MyEnum } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( @@ -100,7 +100,7 @@ public class MyObject } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( @@ -148,7 +148,7 @@ public class Wrapper } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( @@ -213,7 +213,7 @@ public class MyInnerGenericObject } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( @@ -297,7 +297,7 @@ public class MyInnerGenericObject } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( @@ -365,7 +365,7 @@ public class MyGenericObject } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( @@ -434,7 +434,7 @@ public class MyObjectNested } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( @@ -503,7 +503,7 @@ public class MyObjectNested } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( @@ -558,7 +558,7 @@ public class MyGenericObject } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( @@ -607,7 +607,7 @@ public class MyGenericObject } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( @@ -664,7 +664,7 @@ public class MyGenericClass {} public interface IMyInterface {} } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( @@ -722,7 +722,7 @@ public class MyGenericObject } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( @@ -781,7 +781,7 @@ public class MyGenericObject } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( @@ -855,7 +855,7 @@ public class MyGenericObject } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); await compiler.GenerateFileAsync( diff --git a/tests/MessagePack.Generator.Tests/GenerateMessagePackFormatterAttrTest.cs b/tests/MessagePack.Generator.Tests/GenerateMessagePackFormatterAttrTest.cs index 44a778f1a..38e08f67b 100644 --- a/tests/MessagePack.Generator.Tests/GenerateMessagePackFormatterAttrTest.cs +++ b/tests/MessagePack.Generator.Tests/GenerateMessagePackFormatterAttrTest.cs @@ -56,7 +56,7 @@ public class Bar } } "; - tempWorkarea.AddFileToProject("MyMessagePackObject.cs", contents); + tempWorkarea.AddFileToTargetProject("MyMessagePackObject.cs", contents); var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); diff --git a/tests/MessagePack.Generator.Tests/TemporaryProjectWorkarea.cs b/tests/MessagePack.Generator.Tests/TemporaryProjectWorkarea.cs index f32776659..39c2b1176 100644 --- a/tests/MessagePack.Generator.Tests/TemporaryProjectWorkarea.cs +++ b/tests/MessagePack.Generator.Tests/TemporaryProjectWorkarea.cs @@ -20,12 +20,15 @@ namespace MessagePack.Generator.Tests public class TemporaryProjectWorkarea : IDisposable { private readonly string tempDirPath; - private readonly string csprojFileName = "TempProject.csproj"; + private readonly string targetCsprojFileName = "TempTargetProject.csproj"; private readonly bool cleanOnDisposing; - public string CsProjectPath { get; } + /// + /// Generator target csproj + /// + public string TargetCsProjectPath { get; } - public string ProjectDirectory { get; } + public string TargetProjectDirectory { get; } public string OutputDirectory { get; } @@ -39,17 +42,17 @@ private TemporaryProjectWorkarea(bool cleanOnDisposing) this.cleanOnDisposing = cleanOnDisposing; this.tempDirPath = Path.Combine(Path.GetTempPath(), $"MessagePack.Generator.Tests-{Guid.NewGuid()}"); - ProjectDirectory = Path.Combine(tempDirPath, "Project"); + TargetProjectDirectory = Path.Combine(tempDirPath, "TargetProject"); OutputDirectory = Path.Combine(tempDirPath, "Output"); - Directory.CreateDirectory(ProjectDirectory); + Directory.CreateDirectory(TargetProjectDirectory); Directory.CreateDirectory(OutputDirectory); var solutionRootDir = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "../../../..")); var messagePackProjectDir = Path.Combine(solutionRootDir, "src/MessagePack/MessagePack.csproj"); var annotationsProjectDir = Path.Combine(solutionRootDir, "src/MessagePack.Annotations/MessagePack.Annotations.csproj"); - CsProjectPath = Path.Combine(ProjectDirectory, csprojFileName); + TargetCsProjectPath = Path.Combine(TargetProjectDirectory, targetCsprojFileName); var csprojContents = @" @@ -62,12 +65,12 @@ private TemporaryProjectWorkarea(bool cleanOnDisposing) "; - AddFileToProject(csprojFileName, csprojContents); + AddFileToTargetProject(targetCsprojFileName, csprojContents); } - public void AddFileToProject(string fileName, string contents) + public void AddFileToTargetProject(string fileName, string contents) { - File.WriteAllText(Path.Combine(ProjectDirectory, fileName), contents.Trim()); + File.WriteAllText(Path.Combine(TargetProjectDirectory, fileName), contents.Trim()); } public OutputCompilation GetOutputCompilation() @@ -76,7 +79,7 @@ public OutputCompilation GetOutputCompilation() var compilation = CSharpCompilation.Create(Guid.NewGuid().ToString()) .AddSyntaxTrees( - Directory.EnumerateFiles(ProjectDirectory, "*.cs", SearchOption.AllDirectories) + Directory.EnumerateFiles(TargetProjectDirectory, "*.cs", SearchOption.AllDirectories) .Concat(Directory.EnumerateFiles(OutputDirectory, "*.cs", SearchOption.AllDirectories)) .Select(x => CSharpSyntaxTree.ParseText(File.ReadAllText(x), CSharpParseOptions.Default, x))) .AddReferences(MetadataReference.CreateFromFile(Path.Combine(refAsmDir, "System.Private.CoreLib.dll"))) From b75bdd23557a7484a0bccce3dbdd3db22a97cf7f Mon Sep 17 00:00:00 2001 From: "g.shinohara" Date: Wed, 24 Feb 2021 18:44:10 +0900 Subject: [PATCH 2/6] Add TempReferencedProject in GeneratorTest --- .../TemporaryProjectWorkarea.cs | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/tests/MessagePack.Generator.Tests/TemporaryProjectWorkarea.cs b/tests/MessagePack.Generator.Tests/TemporaryProjectWorkarea.cs index 39c2b1176..9e002fab4 100644 --- a/tests/MessagePack.Generator.Tests/TemporaryProjectWorkarea.cs +++ b/tests/MessagePack.Generator.Tests/TemporaryProjectWorkarea.cs @@ -21,6 +21,7 @@ public class TemporaryProjectWorkarea : IDisposable { private readonly string tempDirPath; private readonly string targetCsprojFileName = "TempTargetProject.csproj"; + private readonly string referencedCsprojFileName = "TempReferencedProject.csproj"; private readonly bool cleanOnDisposing; /// @@ -28,8 +29,15 @@ public class TemporaryProjectWorkarea : IDisposable /// public string TargetCsProjectPath { get; } + /// + /// Referenced from csproj + /// + public string ReferencedCsProjectPath { get; } + public string TargetProjectDirectory { get; } + public string ReferencedProjectDirectory { get; } + public string OutputDirectory { get; } public static TemporaryProjectWorkarea Create(bool cleanOnDisposing = true) @@ -43,15 +51,31 @@ private TemporaryProjectWorkarea(bool cleanOnDisposing) this.tempDirPath = Path.Combine(Path.GetTempPath(), $"MessagePack.Generator.Tests-{Guid.NewGuid()}"); TargetProjectDirectory = Path.Combine(tempDirPath, "TargetProject"); + ReferencedProjectDirectory = Path.Combine(tempDirPath, "ReferencedProject"); OutputDirectory = Path.Combine(tempDirPath, "Output"); Directory.CreateDirectory(TargetProjectDirectory); + Directory.CreateDirectory(ReferencedProjectDirectory); Directory.CreateDirectory(OutputDirectory); var solutionRootDir = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "../../../..")); var messagePackProjectDir = Path.Combine(solutionRootDir, "src/MessagePack/MessagePack.csproj"); var annotationsProjectDir = Path.Combine(solutionRootDir, "src/MessagePack.Annotations/MessagePack.Annotations.csproj"); + ReferencedCsProjectPath = Path.Combine(ReferencedProjectDirectory, referencedCsprojFileName); + var referencedCsprojContents = @" + + + netstandard2.0 + + + + + + +"; + AddFileToReferencedProject(referencedCsprojFileName, referencedCsprojContents); + TargetCsProjectPath = Path.Combine(TargetProjectDirectory, targetCsprojFileName); var csprojContents = @" @@ -62,26 +86,56 @@ private TemporaryProjectWorkarea(bool cleanOnDisposing) + "; AddFileToTargetProject(targetCsprojFileName, csprojContents); } + /// + /// Add file to Generator target project. + /// public void AddFileToTargetProject(string fileName, string contents) { File.WriteAllText(Path.Combine(TargetProjectDirectory, fileName), contents.Trim()); } + /// + /// Add file to project, referenced by Generator target project. + /// + public void AddFileToReferencedProject(string fileName, string contents) + { + File.WriteAllText(Path.Combine(ReferencedProjectDirectory, fileName), contents.Trim()); + } + public OutputCompilation GetOutputCompilation() { var refAsmDir = Path.GetDirectoryName(typeof(object).Assembly.Location); + var referenceCompilation = CSharpCompilation.Create(Guid.NewGuid().ToString()) + .AddSyntaxTrees( + Directory.EnumerateFiles(ReferencedProjectDirectory, "*.cs", SearchOption.AllDirectories) + .Select(x => CSharpSyntaxTree.ParseText(File.ReadAllText(x), CSharpParseOptions.Default, x))) + .AddReferences(MetadataReference.CreateFromFile(Path.Combine(refAsmDir, "System.Private.CoreLib.dll"))) + .AddReferences(MetadataReference.CreateFromFile(Path.Combine(refAsmDir, "System.Runtime.Extensions.dll"))) + .AddReferences(MetadataReference.CreateFromFile(Path.Combine(refAsmDir, "System.Collections.dll"))) + .AddReferences(MetadataReference.CreateFromFile(Path.Combine(refAsmDir, "System.Linq.dll"))) + .AddReferences(MetadataReference.CreateFromFile(Path.Combine(refAsmDir, "System.Console.dll"))) + .AddReferences(MetadataReference.CreateFromFile(Path.Combine(refAsmDir, "System.Runtime.dll"))) + .AddReferences(MetadataReference.CreateFromFile(Path.Combine(refAsmDir, "System.Memory.dll"))) + .AddReferences(MetadataReference.CreateFromFile(Path.Combine(refAsmDir, "netstandard.dll"))) + .AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location)) + .AddReferences(MetadataReference.CreateFromFile(typeof(MessagePack.MessagePackObjectAttribute).Assembly.Location)) + .AddReferences(MetadataReference.CreateFromFile(typeof(IMessagePackFormatter<>).Assembly.Location)) + .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); + var compilation = CSharpCompilation.Create(Guid.NewGuid().ToString()) .AddSyntaxTrees( Directory.EnumerateFiles(TargetProjectDirectory, "*.cs", SearchOption.AllDirectories) .Concat(Directory.EnumerateFiles(OutputDirectory, "*.cs", SearchOption.AllDirectories)) .Select(x => CSharpSyntaxTree.ParseText(File.ReadAllText(x), CSharpParseOptions.Default, x))) + .AddReferences(referenceCompilation.ToMetadataReference()) .AddReferences(MetadataReference.CreateFromFile(Path.Combine(refAsmDir, "System.Private.CoreLib.dll"))) .AddReferences(MetadataReference.CreateFromFile(Path.Combine(refAsmDir, "System.Runtime.Extensions.dll"))) .AddReferences(MetadataReference.CreateFromFile(Path.Combine(refAsmDir, "System.Collections.dll"))) From e4a7acb4f7b30d5c0cbf9fb8fde68a24f1c5badd Mon Sep 17 00:00:00 2001 From: "g.shinohara" Date: Wed, 24 Feb 2021 20:16:01 +0900 Subject: [PATCH 3/6] add Test for #1111 GenericType referenced in project --- .../GenerateGenericsFormatterTest.cs | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/tests/MessagePack.Generator.Tests/GenerateGenericsFormatterTest.cs b/tests/MessagePack.Generator.Tests/GenerateGenericsFormatterTest.cs index f906f93e0..675817fcc 100644 --- a/tests/MessagePack.Generator.Tests/GenerateGenericsFormatterTest.cs +++ b/tests/MessagePack.Generator.Tests/GenerateGenericsFormatterTest.cs @@ -883,5 +883,82 @@ public class MyGenericObject formatterType.TypeParameters[1].ConstraintTypes.Should().BeEmpty(); formatterType.TypeParameters[1].ReferenceTypeConstraintNullableAnnotation.Should().Be(NullableAnnotation.None); } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task Generics_Defined_In_ReferencedProject(bool isSingleFileOutput) + { + using var tempWorkarea = TemporaryProjectWorkarea.Create(); + var defineContents = @" +using System; +using System.Collections.Generic; +using MessagePack; + +namespace TempProject +{ + [MessagePackObject] + public class MyGenericObject + { + [Key(0)] + public T Content { get; set; } + } +} + "; + tempWorkarea.AddFileToReferencedProject("MyGenericObject.cs", defineContents); + + var usageContents = @" +using System; +using System.Collections.Generic; +using MessagePack; + +namespace TempProject +{ + [MessagePackObject] + public class MyObject + { + [Key(0)] + public MyGenericObject Value { get; set; } + } + + [MessagePackObject] + public class MyObjectNested + { + [Key(0)] + public MyGenericObject> Value { get; set; } + } +} + "; + tempWorkarea.AddFileToTargetProject("MyObject.cs", usageContents); + + var compiler = new MessagePackCompiler.CodeGenerator(testOutputHelper.WriteLine, CancellationToken.None); + await compiler.GenerateFileAsync( + tempWorkarea.GetOutputCompilation().Compilation, + isSingleFileOutput ? Path.Combine(tempWorkarea.OutputDirectory, "Generated.cs") : tempWorkarea.OutputDirectory, + "TempProjectResolver", + "TempProject.Generated", + false, + string.Empty, + Array.Empty()); + + var compilation = tempWorkarea.GetOutputCompilation(); + compilation.Compilation.GetDiagnostics().Where(x => x.WarningLevel == 0).Should().BeEmpty(); + + var symbols = compilation.GetNamedTypeSymbolsFromGenerated(); + + var types = symbols.Select(x => x.ToDisplayString()).ToArray(); + types.Should().Contain("TempProject.Generated.Formatters.TempProject.MyGenericObjectFormatter"); + + var formatters = symbols.SelectMany(x => x.Interfaces).Select(x => x.ToDisplayString()).ToArray(); + formatters.Should().Contain("MessagePack.Formatters.IMessagePackFormatter>"); + + compilation.GetResolverKnownFormatterTypes().Should().Contain(new[] + { + "TempProject.Generated.Formatters.TempProject.MyGenericObjectFormatter>", + "TempProject.Generated.Formatters.TempProject.MyGenericObjectFormatter", + "TempProject.Generated.Formatters.TempProject.MyObjectFormatter", + "TempProject.Generated.Formatters.TempProject.MyObjectNestedFormatter", + }); + } } } From 29d74499dc9c59ed2f222d53a5d82cfedbdb1aed Mon Sep 17 00:00:00 2001 From: "g.shinohara" Date: Wed, 24 Feb 2021 20:16:18 +0900 Subject: [PATCH 4/6] Fix #1111 GenericType referenced in project --- src/MessagePack.GeneratorCore/CodeAnalysis/TypeCollector.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/MessagePack.GeneratorCore/CodeAnalysis/TypeCollector.cs b/src/MessagePack.GeneratorCore/CodeAnalysis/TypeCollector.cs index b65a9f7d3..7f527785a 100644 --- a/src/MessagePack.GeneratorCore/CodeAnalysis/TypeCollector.cs +++ b/src/MessagePack.GeneratorCore/CodeAnalysis/TypeCollector.cs @@ -593,6 +593,9 @@ private void CollectGeneric(INamedTypeSymbol type) // NOTE: It is used to register formatters from nested generic type. // However, closed generic types such as `Foo` are not registered as a formatter. GetObjectInfo(type); + + // Collect generic type definition, that is not collected when it is defined outside target project. + CollectCore(type.OriginalDefinition); } // Collect substituted types for the type parameters (e.g. Bar in Foo) From c5cffb7785c9774597c01c2fed71d41ac4068478 Mon Sep 17 00:00:00 2001 From: "g.shinohara" Date: Thu, 25 Feb 2021 13:42:17 +0900 Subject: [PATCH 5/6] fix CI build error. --- tests/MessagePack.Generator.Tests/TemporaryProjectWorkarea.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/MessagePack.Generator.Tests/TemporaryProjectWorkarea.cs b/tests/MessagePack.Generator.Tests/TemporaryProjectWorkarea.cs index 9e002fab4..42791bfd9 100644 --- a/tests/MessagePack.Generator.Tests/TemporaryProjectWorkarea.cs +++ b/tests/MessagePack.Generator.Tests/TemporaryProjectWorkarea.cs @@ -25,12 +25,12 @@ public class TemporaryProjectWorkarea : IDisposable private readonly bool cleanOnDisposing; /// - /// Generator target csproj + /// Gets Generator target csproj file path. /// public string TargetCsProjectPath { get; } /// - /// Referenced from csproj + /// Gets csproj file path Referenced from TargetProject. /// public string ReferencedCsProjectPath { get; } From 1e337a230165589b1ad9d6bd74fedf60668df9ba Mon Sep 17 00:00:00 2001 From: kyubuns Date: Wed, 14 Apr 2021 10:42:02 +0900 Subject: [PATCH 6/6] Fix readme about mpc --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index de9aeea18..628d85eec 100644 --- a/README.md +++ b/README.md @@ -1526,7 +1526,7 @@ Check in your `.config\dotnet-tools.json` file. On another machine you can "rest Once you have the tool installed, simply invoke using `dotnet mpc` within your repo: ``` -dotnet mpc -h +dotnet mpc --help ``` Alternatively, you can download mpc from the [releases][Releases] page, that includes platform native binaries (that don't require a separate dotnet runtime). @@ -1535,7 +1535,7 @@ Alternatively, you can download mpc from the [releases][Releases] page, that inc Usage: mpc [options...] Options: - -i, -input Input path of analyze csproj or directory, if input multiple csproj split with ','. (Required) + -i, -input Input path to MSBuild project file or the directory containing Unity source files. (Required) -o, -output Output file path(.cs) or directory(multiple generate file). (Required) -c, -conditionalSymbol Conditional compiler symbols, split with ','. (Default: null) -r, -resolverName Set resolver name. (Default: GeneratedResolver)