@@ -1116,81 +1116,91 @@ private static IParameterSymbol GetParameterSymbol(IMethodSymbol symbol, Argumen
11161116 return parameter ;
11171117 }
11181118
1119- private void CheckValueTypeClone ( ITypeSymbol typeSymbol , IdentifierNameSyntax node , ref LuaExpressionSyntax expression ) {
1120- if ( typeSymbol . IsCustomValueType ( ) /*&& !typeSymbol.IsNullableType()*/ && ! generator_ . IsReadOnlyStruct ( typeSymbol ) ) {
1119+ private void CheckValueTypeClone ( ITypeSymbol typeSymbol , IdentifierNameSyntax node , ref LuaExpressionSyntax expression , bool isPropertyField = false ) {
1120+ if ( typeSymbol . IsCustomValueType ( ) && ! generator_ . IsReadOnlyStruct ( typeSymbol ) ) {
11211121 bool need = false ;
1122- switch ( node . Parent . Kind ( ) ) {
1123- case SyntaxKind . Argument : {
1124- var argument = ( ArgumentSyntax ) node . Parent ;
1125- switch ( argument . RefKindKeyword . Kind ( ) ) {
1126- case SyntaxKind . RefKeyword :
1127- case SyntaxKind . OutKeyword :
1128- case SyntaxKind . InKeyword : {
1129- return ;
1130- }
1131- }
1132-
1133- var symbol = ( IMethodSymbol ) semanticModel_ . GetSymbolInfo ( argument . Parent . Parent ) . Symbol ;
1134- if ( symbol != null ) {
1135- if ( symbol . IsFromAssembly ( ) && ! symbol . ContainingType . IsCollectionType ( ) ) {
1136- break ;
1137- }
1138-
1139- var parameter = GetParameterSymbol ( symbol , argument ) ;
1140- if ( parameter . RefKind == RefKind . In ) {
1141- break ;
1142- }
1122+ if ( isPropertyField ) {
1123+ need = true ;
1124+ if ( node . Parent . IsKind ( SyntaxKind . SimpleAssignmentExpression ) ) {
1125+ var assignment = ( AssignmentExpressionSyntax ) node . Parent ;
1126+ if ( assignment . Left == node ) {
1127+ need = false ;
11431128 }
1144-
1145- need = true ;
1146- break ;
1147- }
1148- case SyntaxKind . ReturnStatement : {
1149- need = true ;
1150- break ;
11511129 }
1152- case SyntaxKind . SimpleAssignmentExpression : {
1153- var assignment = ( AssignmentExpressionSyntax ) node . Parent ;
1154- if ( assignment . Right == node ) {
1155- var symbol = semanticModel_ . GetSymbolInfo ( assignment . Left ) . Symbol ;
1156- if ( symbol != null && symbol . IsFromAssembly ( ) ) {
1157- break ;
1130+ } else {
1131+ switch ( node . Parent . Kind ( ) ) {
1132+ case SyntaxKind . Argument : {
1133+ var argument = ( ArgumentSyntax ) node . Parent ;
1134+ switch ( argument . RefKindKeyword . Kind ( ) ) {
1135+ case SyntaxKind . RefKeyword :
1136+ case SyntaxKind . OutKeyword :
1137+ case SyntaxKind . InKeyword : {
1138+ return ;
1139+ }
11581140 }
11591141
1160- if ( assignment . Left . Kind ( ) . IsTupleDeclaration ( ) ) {
1161- break ;
1142+ var symbol = ( IMethodSymbol ) semanticModel_ . GetSymbolInfo ( argument . Parent . Parent ) . Symbol ;
1143+ if ( symbol != null ) {
1144+ if ( symbol . IsFromAssembly ( ) && ! symbol . ContainingType . IsCollectionType ( ) ) {
1145+ break ;
1146+ }
1147+
1148+ var parameter = GetParameterSymbol ( symbol , argument ) ;
1149+ if ( parameter . RefKind == RefKind . In ) {
1150+ break ;
1151+ }
11621152 }
11631153
11641154 need = true ;
1155+ break ;
11651156 }
1166- break ;
1167- }
1168- case SyntaxKind . EqualsValueClause : {
1169- var equalsValueClause = ( EqualsValueClauseSyntax ) node . Parent ;
1170- if ( equalsValueClause . Value == node ) {
1157+ case SyntaxKind . ReturnStatement : {
11711158 need = true ;
1159+ break ;
11721160 }
1173- break ;
1174- }
1175- case SyntaxKind . SimpleMemberAccessExpression : {
1176- var memberAccess = ( MemberAccessExpressionSyntax ) node . Parent ;
1177- if ( memberAccess . Name == node ) {
1178- switch ( memberAccess . Parent . Kind ( ) ) {
1179- case SyntaxKind . EqualsValueClause : {
1180- need = true ;
1161+ case SyntaxKind . SimpleAssignmentExpression : {
1162+ var assignment = ( AssignmentExpressionSyntax ) node . Parent ;
1163+ if ( assignment . Right == node ) {
1164+ var symbol = semanticModel_ . GetSymbolInfo ( assignment . Left ) . Symbol ;
1165+ if ( symbol != null && symbol . IsFromAssembly ( ) ) {
11811166 break ;
11821167 }
11831168
1184- case SyntaxKind . SimpleAssignmentExpression : {
1185- var assignment = ( AssignmentExpressionSyntax ) memberAccess . Parent ;
1186- if ( assignment . Right == memberAccess ) {
1169+ if ( assignment . Left . Kind ( ) . IsTupleDeclaration ( ) ) {
1170+ break ;
1171+ }
1172+
1173+ need = true ;
1174+ }
1175+ break ;
1176+ }
1177+ case SyntaxKind . EqualsValueClause : {
1178+ var equalsValueClause = ( EqualsValueClauseSyntax ) node . Parent ;
1179+ if ( equalsValueClause . Value == node ) {
1180+ need = true ;
1181+ }
1182+ break ;
1183+ }
1184+ case SyntaxKind . SimpleMemberAccessExpression : {
1185+ var memberAccess = ( MemberAccessExpressionSyntax ) node . Parent ;
1186+ if ( memberAccess . Name == node ) {
1187+ switch ( memberAccess . Parent . Kind ( ) ) {
1188+ case SyntaxKind . EqualsValueClause : {
11871189 need = true ;
1190+ break ;
1191+ }
1192+
1193+ case SyntaxKind . SimpleAssignmentExpression : {
1194+ var assignment = ( AssignmentExpressionSyntax ) memberAccess . Parent ;
1195+ if ( assignment . Right == memberAccess ) {
1196+ need = true ;
1197+ }
1198+ break ;
11881199 }
1189- break ;
11901200 }
11911201 }
1202+ break ;
11921203 }
1193- break ;
11941204 }
11951205 }
11961206
0 commit comments