diff --git a/System.IO.Abstractions.Analyzers.Tests/Analyzers/DirectoryInfoAnalyzerTests.cs b/System.IO.Abstractions.Analyzers.Tests/Analyzers/DirectoryInfoAnalyzerTests.cs index 556b6e0..406ed69 100644 --- a/System.IO.Abstractions.Analyzers.Tests/Analyzers/DirectoryInfoAnalyzerTests.cs +++ b/System.IO.Abstractions.Analyzers.Tests/Analyzers/DirectoryInfoAnalyzerTests.cs @@ -21,7 +21,6 @@ public void Analyzer_is_not_triggered(string filename) [Theory] [InlineData("WithOutFileSystem.txt", 15, 28)] - [InlineData("StaticInvocation.txt", 15, 40)] public void Analyzer_is_triggered(string filename, int diagnosticLine, int diagnosticColumn) { var source = ReadFile(filename); diff --git a/System.IO.Abstractions.Analyzers.Tests/Analyzers/PathAnalyzerTests.cs b/System.IO.Abstractions.Analyzers.Tests/Analyzers/PathAnalyzerTests.cs index 8b85da0..9104819 100644 --- a/System.IO.Abstractions.Analyzers.Tests/Analyzers/PathAnalyzerTests.cs +++ b/System.IO.Abstractions.Analyzers.Tests/Analyzers/PathAnalyzerTests.cs @@ -13,6 +13,7 @@ public class PathAnalyzerTests : CSharpDiagnosticAnalyzerTest [InlineData("Valid.txt")] [InlineData("UsingStaticFalsePositive.txt")] [InlineData("UsingStaticLinqFalsePositive.txt")] + [InlineData("NonRelatedFieldFalsePositive.txt")] public void Analyzer_is_not_triggered(string filename) { var source = ReadFile(filename); diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/Analyzer/DirectoryAnalyzer/WithOutFileSystem.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/Analyzer/DirectoryAnalyzer/WithOutFileSystem.txt index 2cfd9d4..e16eb0f 100644 --- a/System.IO.Abstractions.Analyzers.Tests/TestData/Analyzer/DirectoryAnalyzer/WithOutFileSystem.txt +++ b/System.IO.Abstractions.Analyzers.Tests/TestData/Analyzer/DirectoryAnalyzer/WithOutFileSystem.txt @@ -12,7 +12,7 @@ namespace SomeNameSpace { const string path = "C:\\temp"; - Directory.Remove(path); + Directory.Delete(path); } } } \ No newline at end of file diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/Analyzer/DirectoryInfoAnalyzer/StaticInvocation.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/Analyzer/DirectoryInfoAnalyzer/StaticInvocation.txt deleted file mode 100644 index 7f23268..0000000 --- a/System.IO.Abstractions.Analyzers.Tests/TestData/Analyzer/DirectoryInfoAnalyzer/StaticInvocation.txt +++ /dev/null @@ -1,18 +0,0 @@ -using System.IO; - -namespace SomeNameSpace -{ - public class WithOutFileSystem - { - public WithOutFileSystem() - { - } - - public void SomeMethod() - { - const string path = "C:\\temp.txt"; - - IEnumerable infos = DirectoryInfo.InternalEnumerateInfos(path, "*.txt",SearchTarget.Files, EnumerationOptions.Compatible); - } - } -} \ No newline at end of file diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/Analyzer/PathAnalyzer/NonRelatedFieldFalsePositive.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/Analyzer/PathAnalyzer/NonRelatedFieldFalsePositive.txt new file mode 100644 index 0000000..c1555cf --- /dev/null +++ b/System.IO.Abstractions.Analyzers.Tests/TestData/Analyzer/PathAnalyzer/NonRelatedFieldFalsePositive.txt @@ -0,0 +1,12 @@ +namespace SomeNameSpace +{ + public class NonRelatedFieldFalsePositive + { + private const string Path = "Some/Path/To/Something"; + + public string SomeMethod() + { + return Path.Replace('/', '_'); + } + } +} \ No newline at end of file diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryCodeFix/AfterFix.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryCodeFix/AfterFix.txt index 8cf489a..eedc85a 100644 --- a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryCodeFix/AfterFix.txt +++ b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryCodeFix/AfterFix.txt @@ -1,3 +1,4 @@ +using System.IO; using System.IO.Abstractions; namespace SomeNameSpace @@ -15,7 +16,9 @@ namespace SomeNameSpace { const string filePath = "C:\\temp"; - new ConfigurationBuilder().SetBasePath(_fileSystem.Directory.GetCurrentDirectory()); + SetBasePath(_fileSystem.Directory.GetCurrentDirectory()); } + + private void SetBasePath(string path) {} } } \ No newline at end of file diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryCodeFix/BeforeFix.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryCodeFix/BeforeFix.txt index afeb3e1..87ad326 100644 --- a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryCodeFix/BeforeFix.txt +++ b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryCodeFix/BeforeFix.txt @@ -1,3 +1,4 @@ +using System.IO; using System.IO.Abstractions; namespace SomeNameSpace @@ -15,7 +16,9 @@ namespace SomeNameSpace { const string filePath = "C:\\temp"; - new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()); + SetBasePath(Directory.GetCurrentDirectory()); } + + private void SetBasePath(string path) {} } } \ No newline at end of file diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryInfoCodeFix/AfterFix.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryInfoCodeFix/AfterFix.txt index 64fde81..1100e83 100644 --- a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryInfoCodeFix/AfterFix.txt +++ b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryInfoCodeFix/AfterFix.txt @@ -1,3 +1,4 @@ +using System.IO; using System.IO.Abstractions; namespace SomeNameSpace @@ -15,7 +16,7 @@ namespace SomeNameSpace { const string filePath = "C:\\temp.txt"; - DirectoryInfo dirInfo = _fileSystem.DirectoryInfo.FromDirectoryName(filePath); + var dirInfo = _fileSystem.DirectoryInfo.New(filePath); } } } \ No newline at end of file diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryInfoCodeFix/BeforeFix.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryInfoCodeFix/BeforeFix.txt index d6f64b9..ebdbd97 100644 --- a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryInfoCodeFix/BeforeFix.txt +++ b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/DirectoryInfoCodeFix/BeforeFix.txt @@ -1,3 +1,4 @@ +using System.IO; using System.IO.Abstractions; namespace SomeNameSpace @@ -15,7 +16,7 @@ namespace SomeNameSpace { const string filePath = "C:\\temp.txt"; - DirectoryInfo dirInfo = new DirectoryInfo(filePath); + var dirInfo = new DirectoryInfo(filePath); } } } \ No newline at end of file diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileCodeFix/AfterFix.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileCodeFix/AfterFix.txt index 5b01472..6df1042 100644 --- a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileCodeFix/AfterFix.txt +++ b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileCodeFix/AfterFix.txt @@ -1,3 +1,4 @@ +using System.IO; using System.IO.Abstractions; namespace SomeNameSpace diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileCodeFix/BeforeFix.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileCodeFix/BeforeFix.txt index 5f7f09d..14ff443 100644 --- a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileCodeFix/BeforeFix.txt +++ b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileCodeFix/BeforeFix.txt @@ -1,3 +1,4 @@ +using System.IO; using System.IO.Abstractions; namespace SomeNameSpace diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileInfoCodeFix/AfterFix.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileInfoCodeFix/AfterFix.txt index ec1b9fd..abcc901 100644 --- a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileInfoCodeFix/AfterFix.txt +++ b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileInfoCodeFix/AfterFix.txt @@ -1,3 +1,4 @@ +using System.IO; using System.IO.Abstractions; namespace SomeNameSpace @@ -15,7 +16,7 @@ namespace SomeNameSpace { const string filePath = "C:\\temp.txt"; - FileInfo fileInf = _fileSystem.FileInfo.FromFileName(filePath); + var fileInf = _fileSystem.FileInfo.New(filePath); } } } \ No newline at end of file diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileInfoCodeFix/BeforeFix.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileInfoCodeFix/BeforeFix.txt index bef3ec4..32a20ff 100644 --- a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileInfoCodeFix/BeforeFix.txt +++ b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileInfoCodeFix/BeforeFix.txt @@ -1,3 +1,4 @@ +using System.IO; using System.IO.Abstractions; namespace SomeNameSpace @@ -15,7 +16,7 @@ namespace SomeNameSpace { const string filePath = "C:\\temp.txt"; - FileInfo fileInf = new FileInfo(filePath); + var fileInf = new FileInfo(filePath); } } } \ No newline at end of file diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileStreamCodeFix/AfterFix.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileStreamCodeFix/AfterFix.txt index 4426ae0..a0fca59 100644 --- a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileStreamCodeFix/AfterFix.txt +++ b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileStreamCodeFix/AfterFix.txt @@ -1,3 +1,4 @@ +using System.IO; using System.IO.Abstractions; namespace SomeNameSpace @@ -15,13 +16,8 @@ namespace SomeNameSpace { const string filePath = "C:\\temp.txt"; - using (FileStream fstream = _fileSystem.FileStream.Create(filePath, FileMode.OpenOrCreate)) + using (var fstream = _fileSystem.FileStream.New(filePath, FileMode.OpenOrCreate)) { - // преобразуем строку в байты - byte[] array = System.Text.Encoding.Default.GetBytes(text); - // запись массива байтов в файл - fstream.Write(array, 0, array.Length); - Console.WriteLine("Текст записан в файл"); } } } diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileStreamCodeFix/BeforeFix.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileStreamCodeFix/BeforeFix.txt index 064c749..4418399 100644 --- a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileStreamCodeFix/BeforeFix.txt +++ b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/FileStreamCodeFix/BeforeFix.txt @@ -1,3 +1,4 @@ +using System.IO; using System.IO.Abstractions; namespace SomeNameSpace @@ -15,14 +16,9 @@ namespace SomeNameSpace { const string filePath = "C:\\temp.txt"; - using (FileStream fstream = new FileStream(filePath, FileMode.OpenOrCreate)) - { - // преобразуем строку в байты - byte[] array = System.Text.Encoding.Default.GetBytes(text); - // запись массива байтов в файл - fstream.Write(array, 0, array.Length); - Console.WriteLine("Текст записан в файл"); - } + using (var fstream = new FileStream(filePath, FileMode.OpenOrCreate)) + { + } } } } \ No newline at end of file diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/PathCodeFix/AfterFix.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/PathCodeFix/AfterFix.txt index b5332ea..d16b651 100644 --- a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/PathCodeFix/AfterFix.txt +++ b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/PathCodeFix/AfterFix.txt @@ -1,3 +1,4 @@ +using System.IO; using System.IO.Abstractions; namespace SomeNameSpace @@ -15,7 +16,7 @@ namespace SomeNameSpace { const string filePath = "C:\\temp.txt"; - _fileSystem.Path.Exists(filePath); + _fileSystem.Path.GetFullPath(filePath); } } } \ No newline at end of file diff --git a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/PathCodeFix/BeforeFix.txt b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/PathCodeFix/BeforeFix.txt index 1244793..63b59cf 100644 --- a/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/PathCodeFix/BeforeFix.txt +++ b/System.IO.Abstractions.Analyzers.Tests/TestData/CodeFix/PathCodeFix/BeforeFix.txt @@ -1,3 +1,4 @@ +using System.IO; using System.IO.Abstractions; namespace SomeNameSpace @@ -15,7 +16,7 @@ namespace SomeNameSpace { const string filePath = "C:\\temp.txt"; - Path.Exists(filePath); + Path.GetFullPath(filePath); } } } \ No newline at end of file diff --git a/System.IO.Abstractions.Analyzers/Analyzers/BaseFileSystemAnalyzer.cs b/System.IO.Abstractions.Analyzers/Analyzers/BaseFileSystemAnalyzer.cs index ba17dd6..37291dd 100644 --- a/System.IO.Abstractions.Analyzers/Analyzers/BaseFileSystemAnalyzer.cs +++ b/System.IO.Abstractions.Analyzers/Analyzers/BaseFileSystemAnalyzer.cs @@ -22,7 +22,7 @@ public override void Initialize(AnalysisContext context) if (fileSystemContext.HasReference) { - AnalyzeCompilation(compilationStartContext, fileSystemContext); + AnalyzeCompilation(compilationStartContext); } }); } @@ -31,7 +31,5 @@ public override void Initialize(AnalysisContext context) /// Analysis /// /// Compilation Start Analysis Context - /// FileSystem Context - protected abstract void AnalyzeCompilation(CompilationStartAnalysisContext compilationStartContext, - FileSystemContext fileSystemContext); + protected abstract void AnalyzeCompilation(CompilationStartAnalysisContext compilationStartContext); } \ No newline at end of file diff --git a/System.IO.Abstractions.Analyzers/Analyzers/BaseFileSystemNodeAnalyzer.cs b/System.IO.Abstractions.Analyzers/Analyzers/BaseFileSystemNodeAnalyzer.cs index cd2d41e..ac5248f 100644 --- a/System.IO.Abstractions.Analyzers/Analyzers/BaseFileSystemNodeAnalyzer.cs +++ b/System.IO.Abstractions.Analyzers/Analyzers/BaseFileSystemNodeAnalyzer.cs @@ -1,8 +1,7 @@ using System.Linq; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; +using Microsoft.CodeAnalysis.Operations; namespace System.IO.Abstractions.Analyzers.Analyzers; @@ -10,108 +9,50 @@ namespace System.IO.Abstractions.Analyzers.Analyzers; public abstract class BaseFileSystemNodeAnalyzer : BaseFileSystemAnalyzer { /// - protected override void AnalyzeCompilation(CompilationStartAnalysisContext compilationStartContext, - FileSystemContext fileSystemContext) + protected override void AnalyzeCompilation(CompilationStartAnalysisContext compilationStartContext) { - if (DoesNotUsedSystemIo()) - { - return; - } - - compilationStartContext.RegisterSyntaxNodeAction(syntaxContext => + compilationStartContext.RegisterOperationAction(operationContext => { - var invocation = (InvocationExpressionSyntax) syntaxContext.Node; + var invocationOperation = (IInvocationOperation) operationContext.Operation; - if (IsStaticInvocationStartWith(invocation) && !IsInvocationFromAbstractions(syntaxContext, invocation)) + if (IsFileSystemType(invocationOperation.TargetMethod.ContainingType, GetFileSystemTypeSymbol(compilationStartContext.Compilation))) { - Analyze(syntaxContext, invocation); + Analyze(operationContext, invocationOperation); } }, - SyntaxKind.InvocationExpression); + OperationKind.Invocation); - compilationStartContext.RegisterSyntaxNodeAction(syntaxContext => + compilationStartContext.RegisterOperationAction(operationContext => { - var creationExpressionSyntax = (ObjectCreationExpressionSyntax) syntaxContext.Node; - var typeInfo = syntaxContext.SemanticModel.GetTypeInfo(creationExpressionSyntax); + var objectCreationOperation = (IObjectCreationOperation) operationContext.Operation; - if (IsTypesEquals(typeInfo)) + if (IsFileSystemType(objectCreationOperation.Type, GetFileSystemTypeSymbol(compilationStartContext.Compilation))) { - Analyze(syntaxContext, creationExpressionSyntax); + Analyze(operationContext, objectCreationOperation); } }, - SyntaxKind.ObjectCreationExpression); + OperationKind.ObjectCreation); } - protected abstract void Analyze(SyntaxNodeAnalysisContext context, ExpressionSyntax invocation); + protected abstract void Analyze(OperationAnalysisContext context, IOperation operation); protected abstract Type GetFileSystemType(); - private bool DoesNotUsedSystemIo() - { - var systemIoNamespace = typeof(Path).Namespace; - - return systemIoNamespace != null - && !systemIoNamespace.Equals(GetFileSystemType() - .Namespace); - } + private INamedTypeSymbol GetFileSystemTypeSymbol(Compilation compilation) => compilation.GetTypeByMetadataName(GetFileSystemType().FullName); - private bool IsTypesEquals(TypeInfo typeInfo) + private static bool IsFileSystemType(ITypeSymbol typeSymbol, INamedTypeSymbol fileSystemType) { - if (typeInfo.Type is null) + if (typeSymbol is null) { return false; } - var namespaceSymbol = typeInfo.Type.ContainingNamespace; - var fileSystemType = GetFileSystemType(); - - return typeInfo.Type.Name.Equals(fileSystemType.Name, StringComparison.Ordinal) - && (namespaceSymbol.IsGlobalNamespace || namespaceSymbol.ToString() == fileSystemType.Namespace); - } - - private bool IsStaticInvocationStartWith(InvocationExpressionSyntax invocation) => invocation.IsKind(SyntaxKind.InvocationExpression) - && invocation.Expression.NormalizeWhitespace() - .ToFullString() - .StartsWith(GetFileSystemType() - .Name - + ".", StringComparison.Ordinal); - - private static bool IsInvocationFromAbstractions(SyntaxNodeAnalysisContext context, InvocationExpressionSyntax invocation) => - (invocation?.Expression as MemberAccessExpressionSyntax)?.Expression is ExpressionSyntax invokedMember - && IsSymbolFromAbstractions(context.SemanticModel.GetSymbolInfo(invokedMember)); - - private static bool IsSymbolFromAbstractions(SymbolInfo symbolInfo) - { - if (symbolInfo.Symbol is ISymbol symbol) - { - return IsSymbolFromAbstractions(symbol); - } - - return symbolInfo.CandidateSymbols.Length > 0 && symbolInfo.CandidateSymbols.All(IsSymbolFromAbstractions); + return typeSymbol.Equals(fileSystemType, SymbolEqualityComparer.Default); } - private static bool IsSymbolFromAbstractions(ISymbol symbol) + protected static bool IsFirstConstructorParameterOfType(OperationAnalysisContext context, IOperation operation) { - var namespaceSymbol = symbol switch - { - IPropertySymbol propertySymbol => propertySymbol.Type.ContainingNamespace, - IFieldSymbol fieldSymbol => fieldSymbol.Type.ContainingNamespace, - IMethodSymbol methodSymbol => methodSymbol.ContainingNamespace, - var _ => null - }; - - return namespaceSymbol is - { - IsGlobalNamespace: false - } - && namespaceSymbol.ToString() - .StartsWith(Constants.FileSystemNameSpace, StringComparison.Ordinal); + var parameterTypeSymbol = context.Compilation.GetTypeByMetadataName(typeof(T).FullName); + return (operation as IObjectCreationOperation)?.Arguments.FirstOrDefault()?.Parameter?.Type?.Equals(parameterTypeSymbol, SymbolEqualityComparer.Default) ?? false; } - - protected static bool IsFirstConstructorParameterOfType(SyntaxNodeAnalysisContext context, ExpressionSyntax syntax) => - (syntax as ObjectCreationExpressionSyntax)?.ArgumentList?.Arguments.FirstOrDefault() is ArgumentSyntax firstArgument - && (context.SemanticModel.GetSymbolInfo(firstArgument.Expression) - .Symbol as ILocalSymbol)?.Type is ITypeSymbol argumentType - && argumentType.ContainingNamespace.Name == typeof(T).Namespace - && argumentType.Name == typeof(T).Name; } \ No newline at end of file diff --git a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/DirectoryAnalyzer.cs b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/DirectoryAnalyzer.cs index 1f7952c..51d785e 100644 --- a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/DirectoryAnalyzer.cs +++ b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/DirectoryAnalyzer.cs @@ -1,7 +1,6 @@ using System.Collections.Immutable; using JetBrains.Annotations; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; namespace System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers; @@ -51,8 +50,8 @@ public class DirectoryAnalyzer : BaseFileSystemNodeAnalyzer public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(Rule); /// - protected override void Analyze(SyntaxNodeAnalysisContext context, ExpressionSyntax invocation) => - context.ReportDiagnostic(Diagnostic.Create(Rule, invocation.GetLocation())); + protected override void Analyze(OperationAnalysisContext context, IOperation operation) => + context.ReportDiagnostic(Diagnostic.Create(Rule, operation.Syntax.GetLocation())); /// protected override Type GetFileSystemType() => typeof(Directory); diff --git a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/DirectoryInfoAnalyzer.cs b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/DirectoryInfoAnalyzer.cs index b4326ee..a27c064 100644 --- a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/DirectoryInfoAnalyzer.cs +++ b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/DirectoryInfoAnalyzer.cs @@ -1,7 +1,6 @@ using System.Collections.Immutable; using JetBrains.Annotations; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; namespace System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers; @@ -51,8 +50,8 @@ public class DirectoryInfoAnalyzer : BaseFileSystemNodeAnalyzer public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(Rule); /// - protected override void Analyze(SyntaxNodeAnalysisContext context, ExpressionSyntax syntax) => - context.ReportDiagnostic(Diagnostic.Create(Rule, syntax.GetLocation())); + protected override void Analyze(OperationAnalysisContext context, IOperation operation) => + context.ReportDiagnostic(Diagnostic.Create(Rule, operation.Syntax.GetLocation())); /// protected override Type GetFileSystemType() => typeof(DirectoryInfo); diff --git a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/FileAnalyzer.cs b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/FileAnalyzer.cs index 33ff2f8..7d54108 100644 --- a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/FileAnalyzer.cs +++ b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/FileAnalyzer.cs @@ -1,7 +1,6 @@ using System.Collections.Immutable; using JetBrains.Annotations; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; namespace System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers; @@ -51,8 +50,8 @@ public class FileAnalyzer : BaseFileSystemNodeAnalyzer public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(Rule); /// - protected override void Analyze(SyntaxNodeAnalysisContext context, ExpressionSyntax invocation) => - context.ReportDiagnostic(Diagnostic.Create(Rule, invocation.GetLocation())); + protected override void Analyze(OperationAnalysisContext context, IOperation operation) => + context.ReportDiagnostic(Diagnostic.Create(Rule, operation.Syntax.GetLocation())); /// protected override Type GetFileSystemType() => typeof(File); diff --git a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/FileInfoAnalyzer.cs b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/FileInfoAnalyzer.cs index 7893d18..8f34e5d 100644 --- a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/FileInfoAnalyzer.cs +++ b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/FileInfoAnalyzer.cs @@ -1,7 +1,6 @@ using System.Collections.Immutable; using JetBrains.Annotations; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; namespace System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers; @@ -51,8 +50,8 @@ public class FileInfoAnalyzer : BaseFileSystemNodeAnalyzer public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(Rule); /// - protected override void Analyze(SyntaxNodeAnalysisContext context, ExpressionSyntax syntax) => - context.ReportDiagnostic(Diagnostic.Create(Rule, syntax.GetLocation())); + protected override void Analyze(OperationAnalysisContext context, IOperation operation) => + context.ReportDiagnostic(Diagnostic.Create(Rule, operation.Syntax.GetLocation())); /// protected override Type GetFileSystemType() => typeof(FileInfo); diff --git a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/FileStreamAnalyzer.cs b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/FileStreamAnalyzer.cs index 3253a57..0085164 100644 --- a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/FileStreamAnalyzer.cs +++ b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/FileStreamAnalyzer.cs @@ -1,7 +1,6 @@ using System.Collections.Immutable; using JetBrains.Annotations; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; namespace System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers; @@ -51,8 +50,8 @@ public class FileStreamAnalyzer : BaseFileSystemNodeAnalyzer public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(Rule); /// - protected override void Analyze(SyntaxNodeAnalysisContext context, ExpressionSyntax syntax) => - context.ReportDiagnostic(Diagnostic.Create(Rule, syntax.GetLocation())); + protected override void Analyze(OperationAnalysisContext context, IOperation operation) => + context.ReportDiagnostic(Diagnostic.Create(Rule, operation.Syntax.GetLocation())); /// protected override Type GetFileSystemType() => typeof(FileStream); diff --git a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/PathAnalyzer.cs b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/PathAnalyzer.cs index 08a02d8..803ccb2 100644 --- a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/PathAnalyzer.cs +++ b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/PathAnalyzer.cs @@ -1,7 +1,6 @@ using System.Collections.Immutable; using JetBrains.Annotations; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; namespace System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers; @@ -51,8 +50,8 @@ public class PathAnalyzer : BaseFileSystemNodeAnalyzer public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(Rule); /// - protected override void Analyze(SyntaxNodeAnalysisContext context, ExpressionSyntax invocation) => - context.ReportDiagnostic(Diagnostic.Create(Rule, invocation.GetLocation())); + protected override void Analyze(OperationAnalysisContext context, IOperation operation) => + context.ReportDiagnostic(Diagnostic.Create(Rule, operation.Syntax.GetLocation())); /// protected override Type GetFileSystemType() => typeof(Path); diff --git a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/StreamReaderAnalyzer.cs b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/StreamReaderAnalyzer.cs index 4e82a56..94fb5e2 100644 --- a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/StreamReaderAnalyzer.cs +++ b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/StreamReaderAnalyzer.cs @@ -1,7 +1,6 @@ using System.Collections.Immutable; using JetBrains.Annotations; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; namespace System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers; @@ -49,11 +48,11 @@ public class StreamReaderAnalyzer : BaseFileSystemNodeAnalyzer public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(Rule); /// - protected override void Analyze(SyntaxNodeAnalysisContext context, ExpressionSyntax syntax) + protected override void Analyze(OperationAnalysisContext context, IOperation operation) { - if (IsFirstConstructorParameterOfType(context, syntax)) + if (IsFirstConstructorParameterOfType(context, operation)) { - context.ReportDiagnostic(Diagnostic.Create(Rule, syntax.GetLocation())); + context.ReportDiagnostic(Diagnostic.Create(Rule, operation.Syntax.GetLocation())); } } diff --git a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/StreamWriterAnalyzer.cs b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/StreamWriterAnalyzer.cs index 236b116..1a05061 100644 --- a/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/StreamWriterAnalyzer.cs +++ b/System.IO.Abstractions.Analyzers/Analyzers/FileSystemTypeAnalyzers/StreamWriterAnalyzer.cs @@ -1,7 +1,6 @@ using System.Collections.Immutable; using JetBrains.Annotations; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; namespace System.IO.Abstractions.Analyzers.Analyzers.FileSystemTypeAnalyzers; @@ -49,11 +48,11 @@ public class StreamWriterAnalyzer : BaseFileSystemNodeAnalyzer public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(Rule); /// - protected override void Analyze(SyntaxNodeAnalysisContext context, ExpressionSyntax syntax) + protected override void Analyze(OperationAnalysisContext context, IOperation operation) { - if (IsFirstConstructorParameterOfType(context, syntax)) + if (IsFirstConstructorParameterOfType(context, operation)) { - context.ReportDiagnostic(Diagnostic.Create(Rule, syntax.GetLocation())); + context.ReportDiagnostic(Diagnostic.Create(Rule, operation.Syntax.GetLocation())); } } diff --git a/System.IO.Abstractions.Analyzers/CodeActions/DirectoryInfoCodeAction.cs b/System.IO.Abstractions.Analyzers/CodeActions/DirectoryInfoCodeAction.cs index af94788..67d32de 100644 --- a/System.IO.Abstractions.Analyzers/CodeActions/DirectoryInfoCodeAction.cs +++ b/System.IO.Abstractions.Analyzers/CodeActions/DirectoryInfoCodeAction.cs @@ -51,7 +51,7 @@ protected override async Task GetChangedDocumentAsync(CancellationToke editor.ReplaceNode(_creationExpressionSyntax, SF.ParseExpression( - $"{_field.Declaration.Variables.ToFullString()}.DirectoryInfo.FromDirectoryName({string.Join(",", arguments)})")); + $"{_field.Declaration.Variables.ToFullString()}.DirectoryInfo.New({string.Join(",", arguments)})")); return await Formatter.FormatAsync(editor.GetChangedDocument(), cancellationToken: cancellationToken) .ConfigureAwait(false); diff --git a/System.IO.Abstractions.Analyzers/CodeActions/FileInfoCodeAction.cs b/System.IO.Abstractions.Analyzers/CodeActions/FileInfoCodeAction.cs index d0c25bc..2dc30b5 100644 --- a/System.IO.Abstractions.Analyzers/CodeActions/FileInfoCodeAction.cs +++ b/System.IO.Abstractions.Analyzers/CodeActions/FileInfoCodeAction.cs @@ -50,7 +50,7 @@ protected override async Task GetChangedDocumentAsync(CancellationToke var arguments = _creationExpressionSyntax.ArgumentList.Arguments.Select(x => x.ToFullString()); editor.ReplaceNode(_creationExpressionSyntax, - SF.ParseExpression($"{_field.Declaration.Variables.ToFullString()}.FileInfo.FromFileName({string.Join(",", arguments)})")); + SF.ParseExpression($"{_field.Declaration.Variables.ToFullString()}.FileInfo.New({string.Join(",", arguments)})")); return await Formatter.FormatAsync(editor.GetChangedDocument(), cancellationToken: cancellationToken) .ConfigureAwait(false); diff --git a/System.IO.Abstractions.Analyzers/CodeActions/FileStreamCodeAction.cs b/System.IO.Abstractions.Analyzers/CodeActions/FileStreamCodeAction.cs index 80e0f2f..1145cc6 100644 --- a/System.IO.Abstractions.Analyzers/CodeActions/FileStreamCodeAction.cs +++ b/System.IO.Abstractions.Analyzers/CodeActions/FileStreamCodeAction.cs @@ -50,7 +50,7 @@ protected override async Task GetChangedDocumentAsync(CancellationToke var arguments = _creationExpressionSyntax.ArgumentList.Arguments.Select(x => x.ToFullString()); editor.ReplaceNode(_creationExpressionSyntax, - SF.ParseExpression($"{_field.Declaration.Variables.ToFullString()}.FileStream.Create({string.Join(",", arguments)})")); + SF.ParseExpression($"{_field.Declaration.Variables.ToFullString()}.FileStream.New({string.Join(",", arguments)})")); return await Formatter.FormatAsync(editor.GetChangedDocument(), cancellationToken: cancellationToken) .ConfigureAwait(false);