@@ -484,13 +484,30 @@ private void BuildEnumParsers(
484484 alwaysCaseSensitive = true ;
485485 }
486486
487+ bool twoPart = method . Members . Max ( x => x . ParseText . Length ) > AsciiHash . MaxBytesHashed ;
487488 if ( alwaysCaseSensitive )
488489 {
489- NewLine ( ) . Append ( "var hashCS = global::RESPite.AsciiHash.HashCS(" ) . Append ( method . From . Name ) . Append ( ");" ) ;
490+ if ( twoPart )
491+ {
492+ NewLine ( ) . Append ( "global::RESPite.AsciiHash.HashCS(" ) . Append ( method . From . Name ) . Append ( ", out var cs0, out var cs1);" ) ;
493+ }
494+ else
495+ {
496+ NewLine ( ) . Append ( "var cs0 = global::RESPite.AsciiHash.HashCS(" ) . Append ( method . From . Name ) . Append ( ");" ) ;
497+ }
490498 }
491499 else
492500 {
493- NewLine ( ) . Append ( "global::RESPite.AsciiHash.Hash(" ) . Append ( method . From . Name ) . Append ( ", out var hashCS, out var hashUC);" ) ;
501+ if ( twoPart )
502+ {
503+ NewLine ( ) . Append ( "global::RESPite.AsciiHash.Hash(" ) . Append ( method . From . Name )
504+ . Append ( ", out var cs0, out var uc0, out var cs1, out var uc1);" ) ;
505+ }
506+ else
507+ {
508+ NewLine ( ) . Append ( "global::RESPite.AsciiHash.Hash(" ) . Append ( method . From . Name )
509+ . Append ( ", out var cs0, out var uc0);" ) ;
510+ }
494511 }
495512
496513 if ( string . IsNullOrEmpty ( method . CaseSensitive . Name ) )
@@ -544,31 +561,45 @@ void Write(bool caseSensitive)
544561 . ThenBy ( x => x . ParseText ) )
545562 {
546563 var len = member . ParseText . Length ;
547- AsciiHash . Hash ( member . ParseText , out var hashCS , out var hashUC ) ;
564+ AsciiHash . Hash ( member . ParseText , out var cs0 , out var uc0 , out var cs1 , out var uc1 ) ;
548565
549566 bool valueCaseSensitive = caseSensitive || ! HasCaseSensitiveCharacters ( member . ParseText ) ;
550567
551- line = NewLine ( ) . Append ( len ) ;
568+ line = NewLine ( ) . Append ( len ) . Append ( " when " ) ;
569+ if ( twoPart ) line . Append ( "(" ) ;
552570 if ( valueCaseSensitive )
553571 {
554- line . Append ( " when hashCS is " ) . Append ( hashCS ) ;
572+ line . Append ( "cs0 is " ) . Append ( cs0 ) ;
555573 }
556574 else
557575 {
558- line . Append ( " when hashUC is " ) . Append ( hashUC ) ;
576+ line . Append ( "uc0 is " ) . Append ( uc0 ) ;
559577 }
578+
560579 if ( len > AsciiHash . MaxBytesHashed )
580+ {
581+ if ( valueCaseSensitive )
582+ {
583+ line . Append ( " & cs1 is " ) . Append ( cs1 ) ;
584+ }
585+ else
586+ {
587+ line . Append ( " & uc1 is " ) . Append ( uc1 ) ;
588+ }
589+ }
590+ if ( twoPart ) line . Append ( ")" ) ;
591+ if ( len > 2 * AsciiHash . MaxBytesHashed )
561592 {
562593 line . Append ( " && " ) ;
563594 var csValue = SyntaxFactory
564595 . LiteralExpression (
565596 SyntaxKind . StringLiteralExpression ,
566- SyntaxFactory . Literal ( member . ParseText ) )
597+ SyntaxFactory . Literal ( member . ParseText . Substring ( 2 * AsciiHash . MaxBytesHashed ) ) )
567598 . ToFullString ( ) ;
568599
569600 line . Append ( "global::RESPite.AsciiHash." )
570601 . Append ( valueCaseSensitive ? nameof ( AsciiHash . SequenceEqualsCS ) : nameof ( AsciiHash . SequenceEqualsCI ) )
571- . Append ( "(" ) . Append ( method . From . Name ) . Append ( ", " ) . Append ( csValue ) ;
602+ . Append ( "(" ) . Append ( method . From . Name ) . Append ( ".Slice(" ) . Append ( 2 * AsciiHash . MaxBytesHashed ) . Append ( ") , ") . Append ( csValue ) ;
572603 if ( method . From . IsBytes ) line . Append ( "u8" ) ;
573604 line . Append ( ")" ) ;
574605 }
0 commit comments