private ChangeSignatureResult ChangeSignatureWithContext(ChangeSignatureAnalyzedContext context, CancellationToken cancellationToken) { var options = GetChangeSignatureOptions(context, CancellationToken.None); if (options.IsCancelled) { return(new ChangeSignatureResult(succeeded: false)); } return(ChangeSignatureWithContext(context, options, cancellationToken)); }
private bool TryCreateUpdatedSolution( ChangeSignatureAnalyzedContext context, ChangeSignatureOptionsResult options, CancellationToken cancellationToken, out Solution updatedSolution) { updatedSolution = context.Solution; var declaredSymbol = context.Symbol; var nodesToUpdate = new Dictionary <DocumentId, List <SyntaxNode> >(); var definitionToUse = new Dictionary <SyntaxNode, ISymbol>(); bool hasLocationsInMetadata = false; var symbols = FindChangeSignatureReferencesAsync( SymbolAndProjectId.Create(declaredSymbol, context.Project.Id), context.Solution, cancellationToken).WaitAndGetResult(cancellationToken); foreach (var symbol in symbols) { if (symbol.Definition.Kind == SymbolKind.Method && ((symbol.Definition as IMethodSymbol).MethodKind == MethodKind.PropertyGet || (symbol.Definition as IMethodSymbol).MethodKind == MethodKind.PropertySet)) { continue; } if (symbol.Definition.Kind == SymbolKind.NamedType) { continue; } if (symbol.Definition.Locations.Any(loc => loc.IsInMetadata)) { hasLocationsInMetadata = true; continue; } var symbolWithSyntacticParameters = symbol.Definition; var symbolWithSemanticParameters = symbol.Definition; var includeDefinitionLocations = true; if (symbol.Definition.Kind == SymbolKind.Field) { includeDefinitionLocations = false; } if (symbolWithSyntacticParameters.Kind == SymbolKind.Event) { var eventSymbol = symbolWithSyntacticParameters as IEventSymbol; if (eventSymbol.Type is INamedTypeSymbol type && type.DelegateInvokeMethod != null) { symbolWithSemanticParameters = type.DelegateInvokeMethod; } else { continue; } } if (symbolWithSyntacticParameters.Kind == SymbolKind.Method) { var methodSymbol = symbolWithSyntacticParameters as IMethodSymbol; if (methodSymbol.MethodKind == MethodKind.DelegateInvoke) { symbolWithSyntacticParameters = methodSymbol.ContainingType; } if (methodSymbol.Name == WellKnownMemberNames.DelegateBeginInvokeName && methodSymbol.ContainingType != null && methodSymbol.ContainingType.IsDelegateType()) { includeDefinitionLocations = false; } } // Find and annotate all the relevant definitions if (includeDefinitionLocations) { foreach (var def in symbolWithSyntacticParameters.Locations) { if (!TryGetNodeWithEditableSignatureOrAttributes(def, updatedSolution, out var nodeToUpdate, out var documentId)) { continue; } if (!nodesToUpdate.ContainsKey(documentId)) { nodesToUpdate.Add(documentId, new List <SyntaxNode>()); } AddUpdatableNodeToDictionaries(nodesToUpdate, documentId, nodeToUpdate, definitionToUse, symbolWithSemanticParameters); } } // Find and annotate all the relevant references foreach (var location in symbol.Locations) { if (location.Location.IsInMetadata) { hasLocationsInMetadata = true; continue; } if (!TryGetNodeWithEditableSignatureOrAttributes(location.Location, updatedSolution, out var nodeToUpdate2, out var documentId2)) { continue; } if (!nodesToUpdate.ContainsKey(documentId2)) { nodesToUpdate.Add(documentId2, new List <SyntaxNode>()); } AddUpdatableNodeToDictionaries(nodesToUpdate, documentId2, nodeToUpdate2, definitionToUse, symbolWithSemanticParameters); } }
internal ChangeSignatureResult ChangeSignatureWithContext(ChangeSignatureAnalyzedContext context, ChangeSignatureOptionsResult options, CancellationToken cancellationToken) { var succeeded = TryCreateUpdatedSolution(context, options, cancellationToken, out var updatedSolution); return(new ChangeSignatureResult(succeeded, updatedSolution, context.Symbol.ToDisplayString(), context.Symbol.GetGlyph(), options.PreviewChanges)); }
public ChangeSignatureCodeAction(AbstractChangeSignatureService changeSignatureService, ChangeSignatureAnalyzedContext context) { _changeSignatureService = changeSignatureService; _context = context; }