/// <summary> /// Normalizes the <paramref name="declaration" />. /// </summary> public override SyntaxNode VisitPropertyDeclaration(PropertyDeclarationSyntax declaration) { var objectCreation = declaration?.Initializer?.Value as ObjectCreationExpressionSyntax; if (objectCreation == null) return declaration; var symbol = declaration.GetPropertySymbol(SemanticModel); var fault = SemanticModel.GetTypeSymbol<Fault>(); if (!symbol.Type.Equals(fault) && !symbol.Type.IsDerivedFrom(fault)) return declaration; return declaration.WithInitializer(declaration.Initializer.WithValue(AddNameInitializer(fault, objectCreation, symbol.Name))); }
/// <summary> /// Normalizes the <paramref name="declaration" />. /// </summary> public override SyntaxNode VisitPropertyDeclaration(PropertyDeclarationSyntax declaration) { // Nothing to do here for properties with expression bodies if (declaration.ExpressionBody != null) return declaration; // Nothing to do here for properties not defined in fault effects or for properties that are no overrides of some port var propertySymbol = declaration.GetPropertySymbol(SemanticModel); if (!propertySymbol.ContainingType.IsFaultEffect(SemanticModel) || !propertySymbol.IsOverride) return declaration; // Nothing to do here for required ports if (propertySymbol.IsExtern) return declaration; var getter = (AccessorDeclarationSyntax)Syntax.GetAccessor(declaration, DeclarationKind.GetAccessor); var setter = (AccessorDeclarationSyntax)Syntax.GetAccessor(declaration, DeclarationKind.SetAccessor); // Nothing to do here for properties with accessors that have a body if (getter == null || getter.Body != null || setter?.Body != null) return declaration; var fieldName = GetBackingFieldName(propertySymbol); var fieldIdentifier = (ExpressionSyntax)Syntax.IdentifierName(fieldName); var fieldModifiers = setter == null ? DeclarationModifiers.Unsafe | DeclarationModifiers.ReadOnly : DeclarationModifiers.Unsafe; var fieldDeclaration = Syntax.FieldDeclaration( name: fieldName, type: Syntax.TypeExpression(propertySymbol.Type), accessibility: Accessibility.Private, modifiers: fieldModifiers, initializer: declaration.Initializer?.Value); fieldDeclaration = Syntax.AddAttribute<CompilerGeneratedAttribute>(fieldDeclaration); fieldDeclaration = Syntax.MarkAsNonDebuggerBrowsable(fieldDeclaration); AddMembers(propertySymbol.ContainingType, (FieldDeclarationSyntax)fieldDeclaration); var getterBody = (StatementSyntax)Syntax.ReturnStatement(fieldIdentifier).NormalizeWhitespace(); getterBody = getterBody.AppendLineDirective(-1).PrependLineDirective(-1); var getterBlock = SyntaxFactory.Block(getterBody).EnsureIndentation(getter).PrependLineDirective(getter.GetLineNumber()); getter = getter.WithStatementBody(getterBlock); AccessorListSyntax accessors; if (setter == null) accessors = declaration.AccessorList.WithAccessors(SyntaxFactory.List(new[] { getter })); else { var assignment = Syntax.AssignmentStatement(fieldIdentifier, Syntax.IdentifierName("value")); var setterBody = (StatementSyntax)Syntax.ExpressionStatement(assignment); setterBody = setterBody.AppendLineDirective(-1).PrependLineDirective(-1); var setterBlock = SyntaxFactory.Block(setterBody).EnsureIndentation(setter).PrependLineDirective(setter.GetLineNumber()); setter = setter.WithStatementBody(setterBlock); accessors = declaration.AccessorList.WithAccessors(SyntaxFactory.List(new[] { getter, setter })); } var originalDeclaration = declaration; declaration = declaration.WithInitializer(null).WithSemicolonToken(default(SyntaxToken)); return declaration.WithAccessorList(accessors).EnsureLineCount(originalDeclaration); }