private void AnalyzeForEachStatement(SyntaxNodeAnalysisContext context) { if (GeneratedCodeAnalyzer?.IsGeneratedCode(context) == true) { return; } var forEachStatement = (ForEachStatementSyntax)context.Node; TypeAnalysisResult result = ForEachStatementAnalysis.AnalyzeType(forEachStatement, context.SemanticModel, context.CancellationToken); if (result == TypeAnalysisResult.ImplicitButShouldBeExplicit) { context.ReportDiagnostic( DiagnosticDescriptors.DeclareExplicitTypeInForEach, forEachStatement.Type.GetLocation()); } }
private static void ChangeType( CodeRefactoringContext context, SemanticModel semanticModel, ForEachStatementSyntax forEachStatement) { TypeSyntax type = forEachStatement.Type; if (type == null || !type.Span.Contains(context.Span)) { return; } TypeAnalysisResult result = ForEachStatementAnalysis.AnalyzeType( forEachStatement, semanticModel, context.CancellationToken); switch (result) { case TypeAnalysisResult.Explicit: { context.RegisterRefactoring( "Change type to 'var'", cancellationToken => TypeSyntaxRefactoring.ChangeTypeToImplicitAsync(context.Document, type, cancellationToken)); break; } case TypeAnalysisResult.ImplicitButShouldBeExplicit: { ITypeSymbol typeSymbol = semanticModel.GetTypeInfo(type, context.CancellationToken).Type; context.RegisterRefactoring( $"Change type to '{typeSymbol.ToDisplayString(TypeSyntaxRefactoring.SymbolDisplayFormat)}'", cancellationToken => TypeSyntaxRefactoring.ChangeTypeToExplicitAsync(context.Document, type, typeSymbol, cancellationToken)); break; } } }
internal static async Task ChangeTypeAsync( RefactoringContext context, ForEachStatementSyntax forEachStatement) { TypeSyntax type = forEachStatement.Type; if (type?.Span.Contains(context.Span) != true) { return; } SemanticModel semanticModel = await context.GetSemanticModelAsync().ConfigureAwait(false); TypeAnalysisResult result = ForEachStatementAnalysis.AnalyzeType( forEachStatement, semanticModel, context.CancellationToken); if (result == TypeAnalysisResult.Explicit) { if (context.IsRefactoringEnabled(RefactoringIdentifiers.ChangeExplicitTypeToVar)) { context.RegisterRefactoring( "Change type to 'var'", cancellationToken => ChangeTypeRefactoring.ChangeTypeToVarAsync(context.Document, type, cancellationToken)); } } else if (result == TypeAnalysisResult.ImplicitButShouldBeExplicit) { if (context.IsRefactoringEnabled(RefactoringIdentifiers.ChangeVarToExplicitType)) { ITypeSymbol typeSymbol = semanticModel.GetTypeInfo(type, context.CancellationToken).Type; context.RegisterRefactoring( $"Change type to '{typeSymbol.ToMinimalDisplayString(semanticModel, type.Span.Start, SyntaxUtility.DefaultSymbolDisplayFormat)}'", cancellationToken => ChangeTypeRefactoring.ChangeTypeAsync(context.Document, type, typeSymbol, cancellationToken)); } } }