private static BoundStatement RewriteFieldInitializer(BoundFieldEqualsValue fieldInit) { SyntaxNode syntax = fieldInit.Syntax; syntax = (syntax as EqualsValueClauseSyntax)?.Value ?? syntax; //we want the attached sequence point to indicate the value node var boundReceiver = fieldInit.Field.IsStatic ? null : new BoundThisReference(syntax, fieldInit.Field.ContainingType); BoundStatement boundStatement = new BoundExpressionStatement(syntax, new BoundAssignmentOperator(syntax, new BoundFieldAccess(syntax, boundReceiver, fieldInit.Field, constantValueOpt: null), fieldInit.Value, fieldInit.Field.Type.TypeSymbol) { WasCompilerGenerated = true }) { WasCompilerGenerated = !fieldInit.Locals.IsEmpty || fieldInit.WasCompilerGenerated }; if (!fieldInit.Locals.IsEmpty) { boundStatement = new BoundBlock(syntax, fieldInit.Locals, ImmutableArray.Create(boundStatement)) { WasCompilerGenerated = fieldInit.WasCompilerGenerated }; } Debug.Assert(LocalRewriter.IsFieldOrPropertyInitializer(boundStatement)); return(boundStatement); }
private static BoundStatement RewriteFieldInitializer(BoundFieldInitializer fieldInit) { var syntax = fieldInit.Syntax; var boundReceiver = fieldInit.Field.IsStatic ? null : new BoundThisReference(syntax, fieldInit.Field.ContainingType); BoundStatement boundStatement = new BoundExpressionStatement(syntax, new BoundAssignmentOperator(syntax, new BoundFieldAccess(syntax, boundReceiver, fieldInit.Field, constantValueOpt: null), fieldInit.InitialValue, fieldInit.Field.Type) { WasCompilerGenerated = true }) { WasCompilerGenerated = fieldInit.WasCompilerGenerated }; Debug.Assert(LocalRewriter.IsFieldOrPropertyInitializer(boundStatement)); return(boundStatement); }
public virtual BoundStatement InstrumentFieldOrPropertyInitializer( BoundStatement original, BoundStatement rewritten ) { Debug.Assert(LocalRewriter.IsFieldOrPropertyInitializer(original)); return(InstrumentStatement(original, rewritten)); }
private static BoundStatement RewriteFieldInitializer(BoundFieldEqualsValue fieldInit) { var syntax = fieldInit.Syntax; syntax = (syntax as EqualsValueClauseSyntax)?.Value ?? syntax; //we want the attached sequence point to indicate the value node var boundReceiver = fieldInit.Field.IsStatic ? null : new BoundThisReference(syntax, fieldInit.Field.ContainingType); #if XSHARP var initValue = fieldInit.Value; // a generated initial value for VO NULL_STRING initialization // should not overwrite a value set in a child class // not that we recommend that <g> bool wasGenerated = fieldInit.WasCompilerGenerated; if (!wasGenerated) { var xNode = initValue.Syntax as LiteralExpressionSyntax; if (xNode != null && xNode.XGenerated) { wasGenerated = true; } } if (wasGenerated && fieldInit.Field.Type.IsStringType() && boundReceiver != null && fieldInit.Field.DeclaringCompilation.Options.HasOption(CompilerOption.NullStrings, boundReceiver.Syntax)) { var fldaccess = new BoundFieldAccess(syntax, boundReceiver, fieldInit.Field, constantValueOpt: null) { WasCompilerGenerated = true }; initValue = new BoundNullCoalescingOperator(syntax, fldaccess, initValue, Conversion.Identity, fieldInit.Field.Type) { WasCompilerGenerated = true }; } BoundStatement boundStatement = new BoundExpressionStatement(syntax, new BoundAssignmentOperator(syntax, new BoundFieldAccess(syntax, boundReceiver, fieldInit.Field, constantValueOpt: null), initValue, fieldInit.Field.Type) { WasCompilerGenerated = true }) { WasCompilerGenerated = fieldInit.WasCompilerGenerated }; #else BoundStatement boundStatement = new BoundExpressionStatement(syntax, new BoundAssignmentOperator(syntax, new BoundFieldAccess(syntax, boundReceiver, fieldInit.Field, constantValueOpt: null), fieldInit.Value, fieldInit.Field.Type) { WasCompilerGenerated = true }) { WasCompilerGenerated = !fieldInit.Locals.IsEmpty || fieldInit.WasCompilerGenerated }; #endif if (!fieldInit.Locals.IsEmpty) { boundStatement = new BoundBlock(syntax, fieldInit.Locals, ImmutableArray.Create(boundStatement)) { WasCompilerGenerated = fieldInit.WasCompilerGenerated }; } Debug.Assert(LocalRewriter.IsFieldOrPropertyInitializer(boundStatement)); return(boundStatement); }