3
3
using CppAst ;
4
4
using HexaGen . Core ;
5
5
using HexaGen . Core . CSharp ;
6
+ using HexaGen . FunctionGeneration ;
7
+ using HexaGen . FunctionGeneration . ParameterWriters ;
6
8
using System . Collections . Generic ;
7
9
using System . IO ;
8
10
using System . Text ;
@@ -270,7 +272,7 @@ protected virtual void GenerateFunctions(CppCompilation compilation, string outp
270
272
271
273
overload . Modifiers . Add ( "public" ) ;
272
274
overload . Modifiers . Add ( "static" ) ;
273
- funcGen . GenerateVariations ( cppFunction . Parameters , overload ) ;
275
+ GenerateVariations ( cppFunction , overload ) ;
274
276
WriteFunctions ( context , DefinedVariationsFunctions , function , overload , WriteFunctionFlags . None , "public static" ) ;
275
277
}
276
278
}
@@ -301,6 +303,11 @@ protected virtual void GenerateFunctions(CppCompilation compilation, string outp
301
303
}
302
304
}
303
305
306
+ protected virtual void GenerateVariations ( CppFunction cppFunction , CsFunctionOverload overload )
307
+ {
308
+ funcGen . GenerateVariations ( cppFunction . Parameters , overload ) ;
309
+ }
310
+
304
311
protected virtual void WriteFunctions ( GenContext context , HashSet < string > definedFunctions , CsFunction csFunction , CsFunctionOverload overload , WriteFunctionFlags flags , params string [ ] modifiers )
305
312
{
306
313
for ( int j = 0 ; j < overload . Variations . Count ; j ++ )
@@ -369,226 +376,7 @@ protected virtual string BuildFunctionHeader(CsFunctionVariation variation, CsTy
369
376
return $ "{ csReturnType . Name } { variation . Name } ({ signature } )";
370
377
}
371
378
372
- protected virtual void WriteFunction ( GenContext context , HashSet < string > definedFunctions , CsFunction function , CsFunctionOverload overload , CsFunctionVariation variation , WriteFunctionFlags flags , params string [ ] modifiers )
373
- {
374
- var writer = context . Writer ;
375
- CsType csReturnType = variation . ReturnType ;
376
- PrepareArgs ( variation , csReturnType ) ;
377
-
378
- string header = BuildFunctionHeader ( variation , csReturnType , flags , config . GenerateMetadata ) ;
379
- string id = BuildFunctionHeaderId ( variation , flags ) ;
380
-
381
- if ( FilterFunction ( context , definedFunctions , id ) )
382
- {
383
- return ;
384
- }
385
-
386
- ClassifyParameters ( overload , variation , csReturnType , out bool firstParamReturn , out int offset , out bool hasManaged ) ;
387
-
388
- LogInfo ( "defined function " + header ) ;
389
-
390
- writer . WriteLines ( overload . Comment ) ;
391
- if ( config . GenerateMetadata )
392
- {
393
- writer . WriteLines ( overload . Attributes ) ;
394
- }
395
- using ( writer . PushBlock ( $ "{ string . Join ( " " , modifiers ) } { header } ") )
396
- {
397
- StringBuilder sb = new ( ) ;
398
-
399
- if ( ! firstParamReturn && ( ! csReturnType . IsVoid || csReturnType . IsVoid && csReturnType . IsPointer ) )
400
- {
401
- if ( csReturnType . IsBool && ! csReturnType . IsPointer && ! hasManaged )
402
- {
403
- sb . Append ( $ "{ config . GetBoolType ( ) } ret = ") ;
404
- }
405
- else
406
- {
407
- sb . Append ( $ "{ csReturnType . Name } ret = ") ;
408
- }
409
- }
410
-
411
- if ( csReturnType . IsString )
412
- {
413
- WriteStringConvertToManaged ( sb , variation . ReturnType ) ;
414
- }
415
-
416
- if ( flags != WriteFunctionFlags . None )
417
- {
418
- sb . Append ( $ "{ config . ApiName } .") ;
419
- }
420
-
421
- if ( hasManaged )
422
- {
423
- sb . Append ( $ "{ overload . Name } (") ;
424
- }
425
- else if ( firstParamReturn )
426
- {
427
- sb . Append ( $ "{ overload . Name } Native(&ret" + ( overload . Parameters . Count > 1 ? ", " : "" ) ) ;
428
- }
429
- else
430
- {
431
- sb . Append ( $ "{ overload . Name } Native(") ;
432
- }
433
-
434
- Stack < ( string , CsParameterInfo , string ) > strings = new ( ) ;
435
- Stack < string > stringArrays = new ( ) ;
436
- int stringCounter = 0 ;
437
- int blockCounter = 0 ;
438
-
439
- for ( int i = 0 ; i < overload . Parameters . Count - offset ; i ++ )
440
- {
441
- var cppParameter = overload . Parameters [ i + offset ] ;
442
- var paramFlags = ParameterFlags . None ;
443
-
444
- if ( variation . TryGetParameter ( cppParameter . Name , out var param ) )
445
- {
446
- paramFlags = param . Flags ;
447
- cppParameter = param ;
448
- }
449
-
450
- if ( flags . HasFlag ( WriteFunctionFlags . UseHandle ) && i == 0 )
451
- {
452
- sb . Append ( "Handle" ) ;
453
- }
454
- else if ( flags . HasFlag ( WriteFunctionFlags . UseThis ) && i == 0 && overload . Parameters [ i ] . Type . IsPointer )
455
- {
456
- writer . BeginBlock ( $ "fixed ({ overload . Parameters [ i ] . Type . Name } @this = &this)") ;
457
- sb . Append ( "@this" ) ;
458
- blockCounter ++ ;
459
- }
460
- else if ( flags . HasFlag ( WriteFunctionFlags . UseThis ) && i == 0 )
461
- {
462
- sb . Append ( "this" ) ;
463
- }
464
- else if ( paramFlags . HasFlag ( ParameterFlags . Default ) )
465
- {
466
- var rootParam = overload . Parameters [ i + offset ] ;
467
- var paramCsDefault = cppParameter . DefaultValue ;
468
- if ( cppParameter . Type . IsString || paramCsDefault . StartsWith ( "\" " ) && paramCsDefault . EndsWith ( "\" " ) )
469
- {
470
- sb . Append ( $ "(string){ paramCsDefault } ") ;
471
- }
472
- else if ( cppParameter . Type . IsBool && ! cppParameter . Type . IsPointer && ! cppParameter . Type . IsArray )
473
- {
474
- sb . Append ( $ "({ config . GetBoolType ( ) } )({ paramCsDefault } )") ;
475
- }
476
- else if ( rootParam . Type . IsEnum || cppParameter . Type . IsPrimitive || cppParameter . Type . IsPointer || cppParameter . Type . IsArray )
477
- {
478
- sb . Append ( $ "({ rootParam . Type . Name } )({ paramCsDefault } )") ;
479
- }
480
- else
481
- {
482
- sb . Append ( $ "{ paramCsDefault } ") ;
483
- }
484
- }
485
- else if ( paramFlags . HasFlag ( ParameterFlags . String ) )
486
- {
487
- if ( paramFlags . HasFlag ( ParameterFlags . Array ) )
488
- {
489
- WriteStringArrayConvertToUnmanaged ( writer , cppParameter . Type , cppParameter . Name , stringArrays . Count ) ;
490
- sb . Append ( $ "pStrArray{ stringArrays . Count } ") ;
491
- stringArrays . Push ( cppParameter . Name ) ;
492
- }
493
- else
494
- {
495
- if ( paramFlags . HasFlag ( ParameterFlags . Ref ) )
496
- {
497
- strings . Push ( ( cppParameter . Name , cppParameter , $ "pStr{ stringCounter } ") ) ;
498
- }
499
-
500
- WriteStringConvertToUnmanaged ( writer , cppParameter . Type , cppParameter . Name , stringCounter ) ;
501
- sb . Append ( $ "pStr{ stringCounter } ") ;
502
- stringCounter ++ ;
503
- }
504
- }
505
- else if ( paramFlags . HasFlag ( ParameterFlags . Ref ) )
506
- {
507
- writer . BeginBlock ( $ "fixed ({ cppParameter . Type . CleanName } * p{ cppParameter . CleanName } = &{ cppParameter . Name } )") ;
508
- sb . Append ( $ "({ overload . Parameters [ i + offset ] . Type . Name } )p{ cppParameter . CleanName } ") ;
509
- blockCounter ++ ;
510
- }
511
- else if ( paramFlags . HasFlag ( ParameterFlags . Span ) )
512
- {
513
- writer . BeginBlock ( $ "fixed ({ cppParameter . Type . CleanName } * p{ cppParameter . CleanName } = { cppParameter . Name } )") ;
514
- sb . Append ( $ "({ overload . Parameters [ i + offset ] . Type . Name } )p{ cppParameter . CleanName } ") ;
515
- blockCounter ++ ;
516
- }
517
- else if ( paramFlags . HasFlag ( ParameterFlags . Array ) )
518
- {
519
- writer . BeginBlock ( $ "fixed ({ cppParameter . Type . CleanName } * p{ cppParameter . CleanName } = { cppParameter . Name } )") ;
520
- sb . Append ( $ "({ overload . Parameters [ i + offset ] . Type . Name } )p{ cppParameter . CleanName } ") ;
521
- blockCounter ++ ;
522
- }
523
- else if ( paramFlags . HasFlag ( ParameterFlags . Bool ) && ! paramFlags . HasFlag ( ParameterFlags . Ref ) && ! paramFlags . HasFlag ( ParameterFlags . Pointer ) )
524
- {
525
- sb . Append ( $ "{ cppParameter . Name } ? ({ config . GetBoolType ( ) } )1 : ({ config . GetBoolType ( ) } )0") ;
526
- }
527
- else
528
- {
529
- sb . Append ( cppParameter . Name ) ;
530
- }
531
-
532
- if ( i != overload . Parameters . Count - 1 - offset )
533
- {
534
- sb . Append ( ", " ) ;
535
- }
536
- }
537
-
538
- if ( csReturnType . IsString )
539
- {
540
- sb . Append ( "));" ) ;
541
- }
542
- else
543
- {
544
- sb . Append ( ");" ) ;
545
- }
546
-
547
- if ( firstParamReturn )
548
- {
549
- writer . WriteLine ( $ "{ csReturnType . Name } ret;") ;
550
- }
551
- writer . WriteLine ( sb . ToString ( ) ) ;
552
-
553
- while ( strings . TryPop ( out var stackItem ) )
554
- {
555
- WriteStringConvertToManaged ( writer , stackItem . Item2 . Type , stackItem . Item1 , stackItem . Item3 ) ;
556
- }
557
-
558
- while ( stringArrays . TryPop ( out var arrayName ) )
559
- {
560
- WriteFreeUnmanagedStringArray ( writer , arrayName , stringArrays . Count ) ;
561
- }
562
-
563
- while ( stringCounter > 0 )
564
- {
565
- stringCounter -- ;
566
- WriteFreeString ( writer , stringCounter ) ;
567
- }
568
-
569
- if ( firstParamReturn || ! csReturnType . IsVoid || csReturnType . IsVoid && csReturnType . IsPointer )
570
- {
571
- if ( csReturnType . IsBool && ! csReturnType . IsPointer && ! hasManaged )
572
- {
573
- writer . WriteLine ( "return ret != 0;" ) ;
574
- }
575
- else
576
- {
577
- writer . WriteLine ( "return ret;" ) ;
578
- }
579
- }
580
-
581
- while ( blockCounter > 0 )
582
- {
583
- blockCounter -- ;
584
- writer . EndBlock ( ) ;
585
- }
586
- }
587
-
588
- writer . WriteLine ( ) ;
589
- }
590
-
591
- private readonly List < IParameterWriter > parameterWriters =
379
+ public virtual List < IParameterWriter > ParameterWriters { get ; } =
592
380
[
593
381
new HandleParameterWriter ( ) ,
594
382
new UseThisParameterWriter ( ) ,
@@ -601,31 +389,29 @@ protected virtual void WriteFunction(GenContext context, HashSet<string> defined
601
389
new FallthroughParameterWriter ( ) ,
602
390
] ;
603
391
604
- public IReadOnlyList < IParameterWriter > ParameterWriters => parameterWriters ;
605
-
606
392
public void AddParamterWriter ( IParameterWriter writer )
607
393
{
608
- parameterWriters . Add ( writer ) ;
609
- parameterWriters . Sort ( new ParameterPriorityComparer ( ) ) ;
394
+ ParameterWriters . Add ( writer ) ;
395
+ ParameterWriters . Sort ( new ParameterPriorityComparer ( ) ) ;
610
396
}
611
397
612
398
public void RemoveParamterWriter ( IParameterWriter writer )
613
399
{
614
- parameterWriters . Remove ( writer ) ;
400
+ ParameterWriters . Remove ( writer ) ;
615
401
}
616
402
617
403
public void OverwriteParameterWriter < T > ( IParameterWriter newWriter ) where T : IParameterWriter
618
404
{
619
- for ( int i = 0 ; i < parameterWriters . Count ; i ++ )
405
+ for ( int i = 0 ; i < ParameterWriters . Count ; i ++ )
620
406
{
621
- var writer = parameterWriters [ i ] ;
407
+ var writer = ParameterWriters [ i ] ;
622
408
if ( writer is T )
623
409
{
624
- parameterWriters [ i ] = newWriter ;
410
+ ParameterWriters [ i ] = newWriter ;
625
411
break ;
626
412
}
627
413
}
628
- parameterWriters . Sort ( new ParameterPriorityComparer ( ) ) ;
414
+ ParameterWriters . Sort ( new ParameterPriorityComparer ( ) ) ;
629
415
}
630
416
631
417
protected virtual void WriteFunctionEx ( GenContext context , HashSet < string > definedFunctions , CsFunction function , CsFunctionOverload overload , CsFunctionVariation variation , WriteFunctionFlags flags , params string [ ] modifiers )
@@ -703,7 +489,7 @@ protected virtual void WriteFunctionEx(GenContext context, HashSet<string> defin
703
489
cppParameter = param ;
704
490
}
705
491
706
- foreach ( var parameterWriter in parameterWriters )
492
+ foreach ( var parameterWriter in ParameterWriters )
707
493
{
708
494
if ( parameterWriter . CanWrite ( writerContext , overload . Parameters [ i + offset ] , cppParameter , paramFlags , i , offset ) )
709
495
{
0 commit comments