1- using System . Text ;
21using DotNetCampus . CommandLine . CodeAnalysis ;
32using DotNetCampus . CommandLine . Generators . Builders ;
43using DotNetCampus . CommandLine . Generators . ModelProviding ;
@@ -29,15 +28,6 @@ private void Execute(SourceProductionContext context, CommandObjectGeneratingMod
2928
3029 var code = GenerateCommandObjectCreatorCode ( model ) ;
3130 context . AddSource ( $ "CommandLine.Models/{ model . CommandObjectType . ToDisplayString ( ) } .cs", code ) ;
32-
33- // if (model.UseFullStackParser)
34- // {
35- // var originalCode = EmbeddedSourceFiles.Enumerate(null)
36- // .First(x => x.FileName == "CommandLineParser.cs")
37- // .Content;
38- // var parserCode = GenerateParserCode(originalCode, model);
39- // context.AddSource($"CommandLine.Models/{model.Namespace}.{model.CommandObjectType.Name}.parser.cs", parserCode);
40- // }
4131 }
4232
4333 private static bool ReportDiagnostics ( SourceProductionContext context , CommandObjectGeneratingModel model )
@@ -74,24 +64,21 @@ private string GenerateCommandObjectCreatorCode(CommandObjectGeneratingModel mod
7464 . AddTypeDeclaration ( GenerateBuilderTypeDeclarationLine ( model ) , t => t
7565 . WithSummaryComment ( $ """ 辅助 <see cref="{ model . CommandObjectType . ToUsingString ( ) } "/> 生成命令行选项、子命令或处理函数的创建。""" )
7666 . AddRawMembers ( GenerateCommandNames ( model ) )
77- . AddMethodDeclaration (
78- $ "public static { model . CommandObjectType . ToUsingString ( ) } CreateInstance(global::DotNetCampus.Cli.Compiler.CommandRunningContext context)",
79- m => m
80- . AddRawStatements ( $ "return new { model . Namespace } .{ model . GetBuilderTypeName ( ) } ().Build(context);") )
67+ . AddTypeDeclaration ( GenerateMetadataTypeDeclarationLine ( model ) , nt => GenerateCommandObjectMetadata ( nt , model ) )
8168 . AddRawMembers ( model . OptionProperties . Select ( GenerateArgumentPropertyCode ) )
8269 . AddRawMembers ( model . EnumeratePositionalArgumentExcludingSameNameOptions ( ) . Select ( GenerateArgumentPropertyCode ) )
8370 . AddRawText ( GenerateBuildCode ( model ) )
8471 . AddMethodDeclaration (
85- "private global::DotNetCampus.Cli.Utils.Parsers.OptionValueMatch MatchLongOption(ReadOnlySpan<char> longOption, bool defaultCaseSensitive, global::DotNetCampus.Cli.CommandNamingPolicy namingPolicy)" ,
72+ "public global::DotNetCampus.Cli.Utils.Parsers.OptionValueMatch MatchLongOption(ReadOnlySpan<char> longOption, bool defaultCaseSensitive, global::DotNetCampus.Cli.CommandNamingPolicy namingPolicy)" ,
8673 m => GenerateMatchLongOptionCode ( m , model ) )
8774 . AddMethodDeclaration (
88- "private global::DotNetCampus.Cli.Utils.Parsers.OptionValueMatch MatchShortOption(ReadOnlySpan<char> shortOption, bool defaultCaseSensitive)" ,
75+ "public global::DotNetCampus.Cli.Utils.Parsers.OptionValueMatch MatchShortOption(ReadOnlySpan<char> shortOption, bool defaultCaseSensitive)" ,
8976 m => GenerateMatchShortOptionCode ( m , model ) )
9077 . AddMethodDeclaration (
91- "private global::DotNetCampus.Cli.Utils.Parsers.PositionalArgumentValueMatch MatchPositionalArguments(ReadOnlySpan<char> value, int argumentIndex)" ,
78+ "public global::DotNetCampus.Cli.Utils.Parsers.PositionalArgumentValueMatch MatchPositionalArguments(ReadOnlySpan<char> value, int argumentIndex)" ,
9279 m => GenerateMatchPositionalArgumentsCode ( m , model ) )
9380 . AddMethodDeclaration (
94- "private void AssignPropertyValue(string propertyName, int propertyIndex, ReadOnlySpan<char> key, ReadOnlySpan<char> value)" ,
81+ "public void AssignPropertyValue(string propertyName, int propertyIndex, ReadOnlySpan<char> key, ReadOnlySpan<char> value)" ,
9582 m => m
9683 . Condition ( model . OptionProperties . Count > 0 || model . PositionalArgumentProperties . Count > 0 , b => b
9784 . AddBracketScope ( "switch (propertyIndex)" , l => l
@@ -114,8 +101,14 @@ private static string GenerateBuilderTypeDeclarationLine(CommandObjectGenerating
114101 {
115102 var modifier = model . IsPublic ? "public" : "internal" ;
116103 return model . UseFullStackParser
117- ? $ "{ modifier } partial struct { model . GetBuilderTypeName ( ) } ()"
118- : $ "{ modifier } sealed class { model . GetBuilderTypeName ( ) } ";
104+ ? $ "{ modifier } partial struct { model . GetBuilderTypeName ( ) } () : global::DotNetCampus.Cli.Compiler.ICommandObjectBuilder // 临时继承,后面要去掉"
105+ : $ "{ modifier } sealed class { model . GetBuilderTypeName ( ) } : global::DotNetCampus.Cli.Compiler.ICommandObjectBuilder";
106+ }
107+
108+ private static string GenerateMetadataTypeDeclarationLine ( CommandObjectGeneratingModel model )
109+ {
110+ var modifier = model . IsPublic ? "public" : "internal" ;
111+ return $ "{ modifier } sealed class Metadata : global::DotNetCampus.Cli.Compiler.ICommandObjectMetadata";
119112 }
120113
121114 private static string GenerateCommandNames ( CommandObjectGeneratingModel model )
@@ -130,6 +123,13 @@ private static string GenerateCommandNames(CommandObjectGeneratingModel model)
130123 """ ;
131124 }
132125
126+ private void GenerateCommandObjectMetadata ( TypeDeclarationSourceTextBuilder builder , CommandObjectGeneratingModel model )
127+ {
128+ builder
129+ . AddMethodDeclaration ( "public object Build(global::DotNetCampus.Cli.Compiler.CommandRunningContext context)" , m => m
130+ . AddRawStatement ( $ "return new { model . Namespace } .{ model . GetBuilderTypeName ( ) } ().Build(context);") ) ;
131+ }
132+
133133 private string GenerateArgumentPropertyCode ( PropertyGeneratingModel model ) =>
134134 $ "private { GetArgumentPropertyTypeName ( model ) } { model . PropertyName } = new();";
135135
@@ -152,22 +152,16 @@ private static string GenerateBuildCode(CommandObjectGeneratingModel model) => $
152152 return BuildDefault(context.CommandLine);
153153 }
154154
155- var parser = new global::DotNetCampus.Cli.Utils.Parsers.CommandLineParser(context.CommandLine, "{{ model . CommandObjectType . Name }} ", {{ model . GetCommandLevel ( ) }} )
156- {
157- MatchLongOption = MatchLongOption,
158- MatchShortOption = MatchShortOption,
159- MatchPositionalArguments = MatchPositionalArguments,
160- AssignPropertyValue = AssignPropertyValue,
161- };
155+ var parser = new global::DotNetCampus.Cli.Utils.Parsers.CommandLineParser(context.CommandLine, this, "{{ model . CommandObjectType . Name }} ", {{ model . GetCommandLevel ( ) }} );
162156 parser.Parse().WithFallback(context);
163157 return BuildCore(context.CommandLine);
164158 }
165159 """ ;
166160
167- private MethodDeclarationSourceTextBuilder GenerateMatchLongOptionCode ( MethodDeclarationSourceTextBuilder builder , CommandObjectGeneratingModel model )
161+ private void GenerateMatchLongOptionCode ( MethodDeclarationSourceTextBuilder builder , CommandObjectGeneratingModel model )
168162 {
169163 var optionProperties = model . OptionProperties ;
170- return builder
164+ builder
171165 . Condition ( optionProperties . Count is 0 , b => b
172166 . AddRawStatement ( "// 没有长名称选项,无需匹配。" ) )
173167 . Otherwise ( b => b
@@ -208,11 +202,11 @@ static string GenerateLongOptionEqualsCode(OptionalArgumentPropertyGeneratingMod
208202 }
209203 }
210204
211- private MethodDeclarationSourceTextBuilder GenerateMatchShortOptionCode ( MethodDeclarationSourceTextBuilder builder , CommandObjectGeneratingModel model )
205+ private void GenerateMatchShortOptionCode ( MethodDeclarationSourceTextBuilder builder , CommandObjectGeneratingModel model )
212206 {
213207 var optionProperties = model . OptionProperties ;
214208 var hasShortName = optionProperties . SelectMany ( x => x . GetShortNames ( ) ) . Any ( ) ;
215- return builder
209+ builder
216210 . Condition ( ! hasShortName , b => b
217211 . AddRawStatement ( "// 没有短名称选项,无需匹配。" ) )
218212 . Otherwise ( b => b
@@ -259,12 +253,12 @@ static string GenerateOptionEqualsCode(OptionalArgumentPropertyGeneratingModel m
259253 }
260254 }
261255
262- private MethodDeclarationSourceTextBuilder GenerateMatchPositionalArgumentsCode ( MethodDeclarationSourceTextBuilder builder ,
256+ private void GenerateMatchPositionalArgumentsCode ( MethodDeclarationSourceTextBuilder builder ,
263257 CommandObjectGeneratingModel model )
264258 {
265259 var positionalArgumentProperties = model . PositionalArgumentProperties ;
266260 var matchAllProperty = positionalArgumentProperties . FirstOrDefault ( x => x . Index is 0 && x . Length is int . MaxValue ) ;
267- return builder
261+ builder
268262 . Condition ( positionalArgumentProperties . Count is 0 , b => b
269263 . AddRawStatement ( "// 没有位置参数,无需匹配。" )
270264 . AddRawStatement ( "return global::DotNetCampus.Cli.Utils.Parsers.PositionalArgumentValueMatch.NotMatch;" ) )
@@ -328,7 +322,7 @@ private string GenerateAssignPropertyValueCode(PropertyGeneratingModel model)
328322 """ ;
329323 }
330324
331- private MethodDeclarationSourceTextBuilder GenerateBuildCoreCode ( MethodDeclarationSourceTextBuilder builder , CommandObjectGeneratingModel model )
325+ private void GenerateBuildCoreCode ( MethodDeclarationSourceTextBuilder builder , CommandObjectGeneratingModel model )
332326 {
333327 var initRawArgumentsProperties = model . RawArgumentsProperties . Where ( x => x . IsRequiredOrInit ) . ToList ( ) ;
334328 var initOptionProperties = model . OptionProperties . Where ( x => x . IsRequiredOrInit ) . ToList ( ) ;
@@ -337,7 +331,7 @@ private MethodDeclarationSourceTextBuilder GenerateBuildCoreCode(MethodDeclarati
337331 var setOptionProperties = model . OptionProperties . Where ( x => ! x . IsRequiredOrInit ) . ToList ( ) ;
338332 var setPositionalArgumentProperties = model . PositionalArgumentProperties . Where ( x => ! x . IsRequiredOrInit ) . ToList ( ) ;
339333
340- return builder
334+ builder
341335 . AddBracketScope ( $ "var result = new { model . CommandObjectType . ToUsingString ( ) } ", "{" , "};" , c => c
342336
343337 // 1. [RawArguments]
@@ -398,7 +392,7 @@ private MethodDeclarationSourceTextBuilder GenerateBuildCoreCode(MethodDeclarati
398392 . AddRawStatement ( "return result;" ) ;
399393 }
400394
401- private MethodDeclarationSourceTextBuilder GenerateBuildDefaultCode ( MethodDeclarationSourceTextBuilder builder , CommandObjectGeneratingModel model )
395+ private void GenerateBuildDefaultCode ( MethodDeclarationSourceTextBuilder builder , CommandObjectGeneratingModel model )
402396 {
403397 var initRawArgumentsProperties = model . RawArgumentsProperties . Where ( x => x . IsRequiredOrInit ) . ToList ( ) ;
404398 var initOptionProperties = model . OptionProperties . Where ( x => x . IsRequiredOrInit ) . ToList ( ) ;
@@ -411,10 +405,10 @@ private MethodDeclarationSourceTextBuilder GenerateBuildDefaultCode(MethodDeclar
411405 builder . AddRawStatement ( """
412406throw new global::DotNetCampus.Cli.Exceptions.RequiredPropertyNotAssignedException($"The command line arguments doesn't contain any required option or positional argument. Command line: {commandLine}", null!);
413407""" ) ;
414- return builder ;
408+ return ;
415409 }
416410
417- return builder
411+ builder
418412 . AddBracketScope ( $ "var result = new { model . CommandObjectType . ToUsingString ( ) } ", "{" , "};" , c => c
419413
420414 // 1. [RawArguments]
@@ -570,14 +564,6 @@ private string GenerateEnumDeclarationCode(ITypeSymbol enumType)
570564}
571565""" ;
572566 }
573-
574- private string GenerateParserCode ( string originalCode , CommandObjectGeneratingModel model ) => new StringBuilder ( )
575- . AppendLine ( "#nullable enable" )
576- . AppendLine ( "using DotNetCampus.Cli;" )
577- . Append ( originalCode )
578- . Replace ( "namespace DotNetCampus.Cli.Utils.Parsers;" , $ "namespace { model . Namespace } ;")
579- . Replace ( "public readonly ref struct CommandLineParser" , $ "partial struct { model . GetBuilderTypeName ( ) } ")
580- . ToString ( ) ;
581567}
582568
583569file static class Extensions
0 commit comments