@@ -89,14 +89,44 @@ private SyntaxNodeOrList GenerateCSharpAst(Ts.TsTypes.INode node, NodeContext? c
8989 {
9090 var n = node . AsType < Ts . TsTypes . ArrowFunction > ( ) ;
9191 var funcName = context ? . FuncName ?? string . Empty ;
92- var returnType = n . Type ? . GetText ( ) ?? _options . Infer ( funcName , _options . DefaultReturnType ) ;
92+ var returnType = n . Type ? . GetText ( ) ?? InferenceEngine . Infer ( new Token
93+ {
94+ Kind = Ts . TsTypes . SyntaxKind . TypeReference . ToString ( ) ,
95+ MethodName = funcName ,
96+ NamePrefix = _options . NamePrefix
97+ } , _options . DefaultReturnType ) ;
9398
9499 var parameters = n . Parameters . Select ( x =>
95100 {
101+ LiteralExpressionSyntax ? initializer = null ;
102+ string defaultValue = null ;
103+ if ( x . Initializer != null )
104+ {
105+ // todo: csharp does not support variable as default value
106+ if ( x . Initializer . Kind != Ts . TsTypes . SyntaxKind . Identifier )
107+ {
108+ initializer = GenerateCSharpAst ( x . Initializer ) . AsType < LiteralExpressionSyntax > ( ) ;
109+ defaultValue = initializer . GetText ( ) . ToString ( ) ;
110+ }
111+ }
96112 var pName = x . Name . GetText ( ) ;
97- var pType = x . Type ? . GetText ( ) ?? _options . Infer ( pName , _options . DefaultParameterType ) ;
98- return SyntaxFactory . Parameter ( SyntaxFactory . Identifier ( pName ) )
113+ var pType = x . Type ? . GetText ( ) ?? InferenceEngine . Infer ( new Token
114+ {
115+ Kind = x . Kind . ToString ( ) ,
116+ Identifier = pName ,
117+ MethodName = funcName ,
118+ NamePrefix = _options . NamePrefix ,
119+ DefaultValue = defaultValue ,
120+ } , _options . DefaultParameterType ) ;
121+
122+ var parameter = SyntaxFactory . Parameter ( SyntaxFactory . Identifier ( pName ) )
99123 . WithType ( SyntaxFactory . ParseTypeName ( pType ) ) ;
124+ if ( initializer != null )
125+ {
126+ parameter = parameter . WithDefault ( SyntaxFactory . EqualsValueClause ( initializer ) ) ;
127+ }
128+
129+ return parameter ;
100130 } ) . ToArray ( ) ;
101131
102132 var funcBody = n . Body ;
@@ -118,7 +148,7 @@ private SyntaxNodeOrList GenerateCSharpAst(Ts.TsTypes.INode node, NodeContext? c
118148 }
119149 default :
120150 {
121- var statement = GenerateCSharpAst ( funcBody ) . AsType < ExpressionSyntax > ( ) ;
151+ var statement = GenerateCSharpAst ( funcBody , new NodeContext ( ) { ReturnType = returnType } ) . AsType < ExpressionSyntax > ( ) ;
122152 statements . Add ( SyntaxFactory . ReturnStatement ( statement ) ) ;
123153 break ;
124154 }
@@ -146,14 +176,14 @@ private SyntaxNodeOrList GenerateCSharpAst(Ts.TsTypes.INode node, NodeContext? c
146176 . Where ( x => x . Kind != Ts . TsTypes . SyntaxKind . SpreadElement ) // remove SpreadElement
147177 . Select ( x => ( SyntaxNodeOrToken ) GenerateCSharpAst ( x ) . AsT0 )
148178 . Separate ( SyntaxFactory . Token ( SyntaxKind . CommaToken ) ) ;
149- var arrayType = SyntaxFactory . ArrayType (
150- SyntaxFactory . PredefinedType (
151- SyntaxFactory . Token ( SyntaxKind . ObjectKeyword ) ) )
152- . WithRankSpecifiers (
153- SyntaxFactory . SingletonList < ArrayRankSpecifierSyntax > (
154- SyntaxFactory . ArrayRankSpecifier (
155- SyntaxFactory . SingletonSeparatedList < ExpressionSyntax > (
156- SyntaxFactory . OmittedArraySizeExpression ( ) ) ) ) ) ;
179+ var arrayType = SyntaxFactory . ArrayType ( context is { ReturnType : not null }
180+ ? SyntaxFactory . IdentifierName ( context . ReturnType )
181+ : SyntaxFactory . PredefinedType ( SyntaxFactory . Token ( SyntaxKind . ObjectKeyword ) ) )
182+ . WithRankSpecifiers (
183+ SyntaxFactory . SingletonList < ArrayRankSpecifierSyntax > (
184+ SyntaxFactory . ArrayRankSpecifier (
185+ SyntaxFactory . SingletonSeparatedList < ExpressionSyntax > (
186+ SyntaxFactory . OmittedArraySizeExpression ( ) ) ) ) ) ;
157187
158188 var arrayCreation = SyntaxFactory . ArrayCreationExpression ( arrayType )
159189 . WithInitializer
@@ -258,7 +288,7 @@ private SyntaxNodeOrList GenerateCSharpAst(Ts.TsTypes.INode node, NodeContext? c
258288 {
259289 var n = node . AsType < Ts . TsTypes . CallExpression > ( ) ;
260290 var args = n . Arguments
261- . Select ( x => ( SyntaxNodeOrToken ) SyntaxFactory . Argument ( GenerateCSharpAst ( x , new NodeContext ( ) { UseLambda = true } ) . AsType < ExpressionSyntax > ( ) ) )
291+ . Select ( x => ( SyntaxNodeOrToken ) SyntaxFactory . Argument ( GenerateCSharpAst ( x , new NodeContext ( ) { FuncName = n . IdentifierStr , UseLambda = true } ) . AsType < ExpressionSyntax > ( ) ) )
262292 . Separate ( SyntaxFactory . Token ( SyntaxKind . CommaToken ) ) . ToList ( ) ;
263293 return SyntaxFactory . InvocationExpression
264294 (
@@ -307,7 +337,12 @@ private SyntaxNodeOrList GenerateCSharpAst(Ts.TsTypes.INode node, NodeContext? c
307337 ? [ SyntaxFactory . Token ( SyntaxKind . PublicKeyword ) , SyntaxFactory . Token ( SyntaxKind . StaticKeyword ) ]
308338 : [ SyntaxFactory . Token ( SyntaxKind . PublicKeyword ) ] ;
309339 var funcName = _options . DefaultExportMethodName ;
310- var returnType = _options . Infer ( funcName , _options . DefaultExportType ) ;
340+ var returnType = InferenceEngine . Infer ( new Token
341+ {
342+ Kind = Ts . TsTypes . SyntaxKind . TypeReference . ToString ( ) ,
343+ MethodName = funcName ,
344+ NamePrefix = _options . NamePrefix
345+ } , _options . DefaultExportType ) ;
311346 var methodDeclaration = SyntaxFactory
312347 . MethodDeclaration ( SyntaxFactory . ParseTypeName ( returnType ) , Format ( funcName ) )
313348 . AddModifiers ( tokens ) ;
@@ -558,6 +593,11 @@ private SyntaxNodeOrList GenerateCSharpAst(Ts.TsTypes.INode node, NodeContext? c
558593 . WithSemicolonToken ( SyntaxFactory . Token ( SyntaxKind . SemicolonToken ) )
559594 ) ;
560595 }
596+ case Ts . TsTypes . SyntaxKind . ReturnStatement :
597+ {
598+ var n = node . AsType < Ts . TsTypes . ReturnStatement > ( ) ;
599+ return SyntaxFactory . ReturnStatement ( GenerateCSharpAst ( n . Expression , context ) . AsType < ExpressionSyntax > ( ) ) ;
600+ }
561601 case Ts . TsTypes . SyntaxKind . SpreadAssignment :
562602 {
563603 var n = node . AsType < Ts . TsTypes . SpreadAssignment > ( ) ;
@@ -581,11 +621,6 @@ private SyntaxNodeOrList GenerateCSharpAst(Ts.TsTypes.INode node, NodeContext? c
581621
582622 return expression ;
583623 }
584- case Ts . TsTypes . SyntaxKind . ReturnStatement :
585- {
586- var n = node . AsType < Ts . TsTypes . ReturnStatement > ( ) ;
587- return SyntaxFactory . ReturnStatement ( GenerateCSharpAst ( n . Expression , context ) . AsType < ExpressionSyntax > ( ) ) ;
588- }
589624 case Ts . TsTypes . SyntaxKind . SourceFile :
590625 {
591626 SyntaxToken [ ] tokens = _options . UsePartialClass
@@ -914,18 +949,6 @@ private static int GetLineNumber(string text, int index)
914949 }
915950 }
916951
917- public class AstGenerateException : Exception
918- {
919- public int StartLine { get ; }
920- public int EndLine { get ; }
921-
922- public AstGenerateException ( int start , int end ) : base ( $ "Generate ast failed, source file line: { start } { end } ")
923- {
924- StartLine = start ;
925- EndLine = end ;
926- }
927- }
928-
929952 public class NodeContext
930953 {
931954 public string ? ReturnType { get ; set ; }
0 commit comments