private static void RemoveExpression(DocumentEditor editor, ArgumentSyntax argument, IMethodSymbol invoker, bool usesUnderscoreNames, CancellationToken cancellationToken) { var invocation = argument.FirstAncestorOrSelf <InvocationExpressionSyntax>(); if (PropertyChanged.TryGetInvokedPropertyChangedName(invocation, editor.SemanticModel, cancellationToken, out var name) == AnalysisResult.Yes) { var property = editor.SemanticModel.GetDeclaredSymbolSafe(argument.FirstAncestorOrSelf <PropertyDeclarationSyntax>(), cancellationToken); if (property?.Name == name) { editor.ReplaceNode( invocation, SyntaxFactory.ParseExpression(Snippet.OnPropertyChanged(invoker, property?.Name, usesUnderscoreNames).TrimEnd(';')) .WithSimplifiedNames() .WithLeadingElasticLineFeed() .WithTrailingElasticLineFeed() .WithAdditionalAnnotations(Formatter.Annotation)); } else { editor.ReplaceNode( invocation, SyntaxFactory.ParseExpression(Snippet.OnOtherPropertyChanged(invoker, name, usesUnderscoreNames).TrimEnd(';')) .WithSimplifiedNames() .WithLeadingElasticLineFeed() .WithTrailingElasticLineFeed() .WithAdditionalAnnotations(Formatter.Annotation)); } } }
private static void MakeNotify(DocumentEditor editor, ExpressionSyntax assignment, string propertyName, IMethodSymbol invoker, bool usesUnderscoreNames) { var snippet = assignment.FirstAncestor <PropertyDeclarationSyntax>() is PropertyDeclarationSyntax propertyDeclaration && propertyDeclaration.Identifier.ValueText == propertyName ? Snippet.OnPropertyChanged(invoker, propertyName, usesUnderscoreNames) : Snippet.OnOtherPropertyChanged(invoker, propertyName, usesUnderscoreNames); var onPropertyChanged = SyntaxFactory.ParseStatement(snippet) .WithSimplifiedNames() .WithLeadingElasticLineFeed() .WithTrailingElasticLineFeed() .WithAdditionalAnnotations(Formatter.Annotation); if (assignment.Parent is AnonymousFunctionExpressionSyntax anonymousFunction) { if (anonymousFunction.Body is BlockSyntax block) { if (block.Statements.Count > 1) { var previousStatement = InsertAfter(block, block.Statements.Last(), invoker); editor.InsertAfter(previousStatement, new[] { onPropertyChanged }); } return; } var expressionStatement = (ExpressionStatementSyntax)editor.Generator.ExpressionStatement(anonymousFunction.Body); var withStatements = editor.Generator.WithStatements(anonymousFunction, new[] { expressionStatement, onPropertyChanged }); editor.ReplaceNode(anonymousFunction, withStatements); } else if (assignment.Parent is ExpressionStatementSyntax assignStatement && assignStatement.Parent is BlockSyntax assignBlock) { var previousStatement = InsertAfter(assignBlock, assignStatement, invoker); editor.InsertAfter(previousStatement, new[] { onPropertyChanged }); }