@@ -1117,44 +1117,58 @@ private void WriteModifier(bool isPublic)
1117
1117
1118
1118
private Expression VisitLambda ( LambdaExpression node , LambdaType type )
1119
1119
{
1120
- if ( type == LambdaType . Function || type == LambdaType . Main )
1121
- {
1122
- var name = type == LambdaType . Main
1123
- ? ( Definitions ? . MethodName ?? "Main" )
1124
- : GetName ( node ) ;
1125
- WriteModifier ( type == LambdaType . Main ) ;
1126
- Write ( Translate ( node . ReturnType ) , " " , name ) ;
1127
- var args = VisitArguments ( "(" , node . Parameters , VisitParameterDeclaration , ")" ) ;
1128
- Indent ( ) ;
1129
- var body = VisitBody ( node . Body , true ) ;
1130
-
1131
- Outdent ( ) ;
1132
-
1133
- return Expression . Lambda ( body , name , node . TailCall , args ) ;
1134
- }
1135
- else
1120
+ if ( type == LambdaType . Inline || this . Definitions ? . IsExpression == true )
1136
1121
{
1122
+ if ( type == LambdaType . Main )
1123
+ {
1124
+ var name = Definitions ? . MethodName ?? "Main" ;
1125
+ WriteModifier ( true ) ;
1126
+ var funcType = MakeDelegateType ( node . ReturnType , node . Parameters . Select ( it => it . Type ) . ToArray ( ) ) ;
1127
+ var exprType = typeof ( Expression < > ) . MakeGenericType ( funcType ) ;
1128
+ Write ( Translate ( exprType ) , " " , name , " = " ) ;
1129
+ }
1137
1130
IList < ParameterExpression > args ;
1138
1131
if ( node . Parameters . Count == 1 )
1139
1132
{
1140
1133
args = new List < ParameterExpression > ( ) ;
1141
1134
var arg = VisitParameter ( node . Parameters [ 0 ] ) ;
1142
- args . Add ( ( ParameterExpression ) arg ) ;
1135
+ args . Add ( ( ParameterExpression ) arg ) ;
1143
1136
}
1144
1137
else
1145
1138
{
1146
- args = VisitArguments ( "(" , node . Parameters . ToList ( ) , p => ( ParameterExpression ) VisitParameter ( p ) , ")" ) ;
1139
+ args = VisitArguments ( "(" , node . Parameters . ToList ( ) , p => ( ParameterExpression ) VisitParameter ( p ) , ")" ) ;
1147
1140
}
1141
+
1148
1142
Write ( " => " ) ;
1149
1143
var body = VisitGroup ( node . Body , ExpressionType . Quote ) ;
1144
+ if ( type == LambdaType . Main )
1145
+ Write ( ";" ) ;
1150
1146
return Expression . Lambda ( body , node . Name , node . TailCall , args ) ;
1151
1147
}
1148
+ else
1149
+ {
1150
+ var name = type == LambdaType . Main
1151
+ ? ( Definitions ? . MethodName ?? "Main" )
1152
+ : GetName ( node ) ;
1153
+ WriteModifier ( type == LambdaType . Main ) ;
1154
+ Write ( Translate ( node . ReturnType ) , " " , name ) ;
1155
+ var args = VisitArguments ( "(" , node . Parameters , VisitParameterDeclaration , ")" ) ;
1156
+ Indent ( ) ;
1157
+ var body = VisitBody ( node . Body , true ) ;
1158
+
1159
+ Outdent ( ) ;
1160
+
1161
+ return Expression . Lambda ( body , name , node . TailCall , args ) ;
1162
+ }
1152
1163
}
1153
1164
1154
1165
private HashSet < LambdaExpression > _visitedLambda ;
1155
1166
private int _writerLevel ;
1156
1167
protected override Expression VisitLambda < T > ( Expression < T > node )
1157
1168
{
1169
+ if ( this . Definitions ? . IsExpression == true )
1170
+ return VisitLambda ( node , LambdaType . Function ) ;
1171
+
1158
1172
Write ( GetName ( node ) ) ;
1159
1173
1160
1174
if ( _visitedLambda == null )
@@ -1282,14 +1296,25 @@ protected override MemberMemberBinding VisitMemberMemberBinding(MemberMemberBind
1282
1296
return node . Update ( args ) ;
1283
1297
}
1284
1298
1285
- private static Type GetDelegateType ( MethodInfo method )
1299
+ private static Type MakeDelegateType ( Type returnType , params Type [ ] parameters )
1286
1300
{
1287
- if ( method . GetParameters ( ) . Any ( it => it . IsOut || it . ParameterType . IsByRef ) )
1288
- throw new InvalidOperationException ( "Cannot handle non-public method" ) ;
1301
+ var del = GetDelegateType ( returnType != typeof ( void ) , parameters . Length ) ;
1302
+ if ( del . GetTypeInfo ( ) . IsGenericTypeDefinition )
1303
+ {
1304
+ var types = parameters . AsEnumerable ( ) ;
1305
+ if ( returnType != typeof ( void ) )
1306
+ types = types . Concat ( new [ ] { returnType } ) ;
1307
+ del = del . MakeGenericType ( types . ToArray ( ) ) ;
1308
+ }
1289
1309
1290
- if ( method . ReturnType == typeof ( void ) )
1310
+ return del ;
1311
+ }
1312
+
1313
+ private static Type GetDelegateType ( bool isFunc , int argCount )
1314
+ {
1315
+ if ( ! isFunc )
1291
1316
{
1292
- switch ( method . GetParameters ( ) . Length )
1317
+ switch ( argCount )
1293
1318
{
1294
1319
case 0 : return typeof ( Action ) ;
1295
1320
case 1 : return typeof ( Action < > ) ;
@@ -1313,7 +1338,7 @@ private static Type GetDelegateType(MethodInfo method)
1313
1338
}
1314
1339
else
1315
1340
{
1316
- switch ( method . GetParameters ( ) . Length )
1341
+ switch ( argCount )
1317
1342
{
1318
1343
case 0 : return typeof ( Func < > ) ;
1319
1344
case 1 : return typeof ( Func < , > ) ;
@@ -1352,14 +1377,10 @@ protected override Expression VisitMethodCall(MethodCallExpression node)
1352
1377
else if ( ! node . Method . IsPublic || node . Method . DeclaringType ? . GetTypeInfo ( ) . IsNotPublic == true)
1353
1378
{
1354
1379
isNotPublic = true ;
1355
- var del = GetDelegateType ( node . Method ) ;
1356
- if ( del . GetTypeInfo ( ) . IsGenericTypeDefinition )
1357
- {
1358
- var types = node . Method . GetParameters ( ) . Select ( it => it . ParameterType ) ;
1359
- if ( node . Method . ReturnType != typeof ( void ) )
1360
- types = types . Concat ( new [ ] { node . Method . ReturnType } ) ;
1361
- del = del . MakeGenericType ( types . ToArray ( ) ) ;
1362
- }
1380
+ if ( node . Method . GetParameters ( ) . Any ( it => it . IsOut || it . ParameterType . IsByRef ) )
1381
+ throw new InvalidOperationException ( "Cannot handle non-public method" ) ;
1382
+
1383
+ var del = MakeDelegateType ( node . Method . ReturnType , node . Method . GetParameters ( ) . Select ( it => it . ParameterType ) . ToArray ( ) ) ;
1363
1384
var func = node . Method . CreateDelegate ( del ) ;
1364
1385
Write ( GetConstant ( func , GetVarName ( node . Method . Name ) ) , ".Invoke" ) ;
1365
1386
}
0 commit comments