@@ -79,7 +79,6 @@ internal bool ContainsMaxSymbol(ISymbol symbol, out bool isNeedImport) {
7979 }
8080 }
8181
82- private const int kMaxArrayInitializerCount = 225 ;
8382 private static readonly Regex codeTemplateRegex_ = new ( @"(,?\s*)\{(\*?[\w|`]+)\}" , RegexOptions . Compiled ) ;
8483 private static readonly Regex unicodeRegex_ = new ( @"\\u([0-9a-fA-F]{4})" , RegexOptions . Compiled ) ;
8584 private readonly Dictionary < ISymbol , LuaIdentifierNameSyntax > localReservedNames_ = new ( ) ;
@@ -457,22 +456,29 @@ private bool IsInternalMember(ISymbol symbol) {
457456 return false ;
458457 }
459458
460- private LuaExpressionSyntax BuildArray ( ITypeSymbol elementType , params LuaExpressionSyntax [ ] elements ) {
461- var baseType = GetTypeName ( elementType ) ;
459+ private LuaExpressionSyntax BuildArray ( IArrayTypeSymbol symbol , params LuaExpressionSyntax [ ] elements ) {
460+ var baseType = GetTypeName ( symbol . ElementType ) ;
462461 var arrayType = new LuaInvocationExpressionSyntax ( LuaIdentifierNameSyntax . Array , baseType ) ;
463- return BuildArray ( arrayType , elements ) ;
462+ return BuildArray ( symbol , arrayType , elements ) ;
464463 }
465464
466- private LuaExpressionSyntax BuildArray ( LuaExpressionSyntax arrayType , IList < LuaExpressionSyntax > elements ) {
467- if ( elements . Count > kMaxArrayInitializerCount ) {
468- return arrayType . MemberAccess ( LuaIdentifierNameSyntax . New , true ) . Invocation ( elements . Count , new LuaTableExpression ( elements ) { IsSingleLine = true } ) ;
465+ private LuaExpressionSyntax BuildArray ( IArrayTypeSymbol symbol , LuaExpressionSyntax arrayType , IList < LuaExpressionSyntax > elements ) {
466+ var invocation = new LuaInvocationExpressionSyntax ( arrayType ) ;
467+ var table = new LuaTableExpression ( elements ) { IsSingleLine = true } ;
468+ bool isElementNotNull = ( symbol . ElementType . IsValueType && ! symbol . ElementType . IsNullableType ( ) )
469+ || elements . All ( i => i is LuaLiteralExpressionSyntax && i != LuaIdentifierLiteralExpressionSyntax . Nil ) ;
470+ if ( isElementNotNull ) {
471+ invocation . AddArgument ( table ) ;
472+ invocation . ArgumentList . IsCallSingleTable = true ;
473+ } else {
474+ invocation . AddArgument ( elements . Count ) ;
475+ invocation . AddArgument ( table ) ;
469476 }
470-
471- return new LuaInvocationExpressionSyntax ( arrayType , elements ) ;
477+ return invocation ;
472478 }
473479
474480 private LuaExpressionSyntax BuildArray ( LuaExpressionSyntax arrayType , LuaExpressionSyntax size ) {
475- return arrayType . MemberAccess ( LuaIdentifierNameSyntax . New , true ) . Invocation ( size ) ;
481+ return arrayType . Invocation ( size ) ;
476482 }
477483
478484 private LuaExpressionSyntax BuildMultiArray ( LuaExpressionSyntax arrayType , LuaExpressionSyntax rank , List < LuaExpressionSyntax > elements = null ) {
@@ -549,16 +555,14 @@ private LuaLiteralExpressionSyntax GetConstLiteralExpression(ILocalSymbol constL
549555 private LuaLiteralExpressionSyntax GetConstExpression ( ExpressionSyntax node ) {
550556 var constValue = semanticModel_ . GetConstantValue ( node ) ;
551557 if ( constValue . HasValue ) {
552- switch ( constValue . Value )
553- {
558+ switch ( constValue . Value ) {
554559 case double d :
555560 switch ( d ) {
556561 case double . NegativeInfinity :
557562 case double . PositiveInfinity :
558563 case double . NaN :
559564 return null ;
560565 }
561-
562566 break ;
563567 case float f :
564568 switch ( f ) {
@@ -567,8 +571,9 @@ private LuaLiteralExpressionSyntax GetConstExpression(ExpressionSyntax node) {
567571 case float . NaN :
568572 return null ;
569573 }
570-
571574 break ;
575+ case null :
576+ return LuaIdentifierLiteralExpressionSyntax . Nil ;
572577 }
573578
574579 var literalExpression = GetLiteralExpression ( constValue . Value ) ;
0 commit comments