コード例 #1
0
        public override async Task <AnalyzerResult> AnalyzeFile(string filePath, AnalyzerResult analyzerResult)
        {
            if (!File.Exists(filePath))
            {
                throw new FileNotFoundException(filePath);
            }

            var projectBuildResult  = analyzerResult.ProjectBuildResult;
            var oldSourceFileResult = analyzerResult.ProjectResult.SourceFileResults.FirstOrDefault(sourceFile => sourceFile.FileFullPath == filePath);

            analyzerResult.ProjectResult.SourceFileResults.Remove(oldSourceFileResult);

            ProjectBuildHandler projectBuildHandler = new ProjectBuildHandler(Logger,
                                                                              analyzerResult.ProjectBuildResult.Project,
                                                                              analyzerResult.ProjectBuildResult.Compilation,
                                                                              analyzerResult.ProjectBuildResult.PrePortCompilation,
                                                                              AnalyzerConfiguration);

            analyzerResult.ProjectBuildResult = await projectBuildHandler.IncrementalBuild(filePath, analyzerResult.ProjectBuildResult);

            var newSourceFileBuildResult = projectBuildResult.SourceFileBuildResults.FirstOrDefault(sourceFile => sourceFile.SourceFileFullPath == filePath);

            var fileAnalysis = AnalyzeFile(newSourceFileBuildResult, analyzerResult.ProjectResult.ProjectRootPath);

            analyzerResult.ProjectResult.SourceFileResults.Add(fileAnalysis);

            return(analyzerResult);
        }
コード例 #2
0
        public void LoadProjectFile_Returns_Null_On_Invalid_ProjectFilePath()
        {
            var projectBuildHandlerInstance = new ProjectBuildHandler(null);
            var loadProjectFileMethod       =
                TestUtils.GetPrivateMethod(projectBuildHandlerInstance.GetType(), "LoadProjectFile");

            // Invoke method and read contents of method output
            var projectFile = (XDocument)loadProjectFileMethod.Invoke(projectBuildHandlerInstance, new object[] { @"C:\\Invalid\\ProjectFilePath.csproj" });

            Assert.AreEqual(null, projectFile);
        }
コード例 #3
0
        public void LoadMetadataReferences_Returns_Empty_On_Invalid_ProjectFile()
        {
            var projectBuildHandlerInstance  = new ProjectBuildHandler(null);
            var loadMetadataReferencesMethod =
                TestUtils.GetPrivateMethod(projectBuildHandlerInstance.GetType(), "LoadMetadataReferences");

            // Invoke method and read contents of method output
            var metadataReferences         = (List <PortableExecutableReference>)loadMetadataReferencesMethod.Invoke(projectBuildHandlerInstance, new object[] { null });
            var expectedMetadataReferences = new List <PortableExecutableReference>();

            CollectionAssert.AreEquivalent(expectedMetadataReferences, metadataReferences);
        }
コード例 #4
0
        public void LoadMetadataReferences_Returns_Expected_ReferencePath()
        {
            var testReferencePath = Path.Combine(
                TestContext.CurrentContext.TestDirectory,
                "Codelyzer.Analysis.Tests.dll"
                );
            var projectFileContent = string.Format(@"<Project Sdk=""Microsoft.NET.Sdk"">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <FrameworkReference Include=""Microsoft.AspNetCore.App"" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include=""MyFirstPackage"" Version=""1.0.0"" />
    <PackageReference Include=""MySecondPackage"" Version=""2.0.0"" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include=""TheMainProject"" />
    <ProjectReference Include=""TheDependency"" />
  </ItemGroup>
  <ItemGroup Label=""PortingInfo"">
    <!-- DO NOT REMOVE WHILE PORTING
        C:\\RandomFile.dll
        {0}
    -->
  </ItemGroup>
</Project>", testReferencePath);
            var projectFileDoc     = XDocument.Load(new StringReader(projectFileContent));

            var mockedLogger = new Mock <ILogger>();
            var projectBuildHandlerInstance  = new ProjectBuildHandler(mockedLogger.Object, null, new List <string>());
            var loadMetadataReferencesMethod =
                TestUtils.GetPrivateMethod(projectBuildHandlerInstance.GetType(), "LoadMetadataReferences");

            // Invoke method and read contents of method output
            var metadataReferences = (List <PortableExecutableReference>)loadMetadataReferencesMethod.Invoke(projectBuildHandlerInstance, new object[] { projectFileDoc });

            Assert.AreEqual(1, metadataReferences.Count);

            // Validate MissingMetaReferences
            var           prop = TestUtils.GetPrivateProperty(projectBuildHandlerInstance.GetType(), "MissingMetaReferences");
            List <string> missingMetaReferences         = (List <string>)prop.GetValue(projectBuildHandlerInstance);
            List <string> expectedMissingMetaReferences = new List <string> {
                @"C:\\RandomFile.dll"
            };

            CollectionAssert.AreEquivalent(expectedMissingMetaReferences, missingMetaReferences);
        }
コード例 #5
0
        public void LoadProjectFile_Returns_Expected_XDocument()
        {
            var testProjectFilePath = Path.GetFullPath(Path.Combine(
                                                           tmpTestFixturePath,
                                                           "ProjectFileWithNonExistingMetaReferences.xml"
                                                           ));

            File.WriteAllText(testProjectFilePath, projectFileContent);
            var projectBuildHandlerInstance = new ProjectBuildHandler(null);
            var loadProjectFileMethod       =
                TestUtils.GetPrivateMethod(projectBuildHandlerInstance.GetType(), "LoadProjectFile");

            // Invoke method and read contents of method output
            var projectFile = (XDocument)loadProjectFileMethod.Invoke(projectBuildHandlerInstance, new object[] { testProjectFilePath });

            Assert.AreEqual(projectFileContent, projectFile.ToString());
        }
コード例 #6
0
        public void ExtractFileReferencesFromProject_Retrieves_Expected_ReferencePaths()
        {
            using var stringReader = new StringReader(projectFileContent);
            var projectFileDoc = XDocument.Load(stringReader);
            var projectBuildHandlerInstance            = new ProjectBuildHandler(null);
            var extractFileReferencesFromProjectMethod =
                TestUtils.GetPrivateMethod(projectBuildHandlerInstance.GetType(), "ExtractFileReferencesFromProject");

            // Invoke method and read contents of method output
            var fileReferences         = (List <string>)extractFileReferencesFromProjectMethod.Invoke(projectBuildHandlerInstance, new object[] { projectFileDoc });
            var expectedFileReferences = new List <string>
            {
                @"C:\\RandomFile.dll",
                @"C:\\this\\is\\some\\path\\to\\Some.dll"
            };

            CollectionAssert.AreEquivalent(expectedFileReferences, fileReferences);
        }
コード例 #7
0
        public void LoadProjectFile_Returns_Null_On_Invalid_ProjectFileContent()
        {
            var testProjectFilePath = Path.GetFullPath(Path.Combine(
                                                           tmpTestFixturePath,
                                                           "InvalidProjectFile.xml"
                                                           ));

            File.WriteAllText(testProjectFilePath, "Invalid Project File Content!!!");

            var mockedLogger = new Mock <ILogger>();
            var projectBuildHandlerInstance = new ProjectBuildHandler(mockedLogger.Object, null, new List <string>());
            var loadProjectFileMethod       =
                TestUtils.GetPrivateMethod(projectBuildHandlerInstance.GetType(), "LoadProjectFile");

            // Invoke method and read contents of method output
            var projectFile = (XDocument)loadProjectFileMethod.Invoke(projectBuildHandlerInstance, new object[] { testProjectFilePath });

            Assert.AreEqual(null, projectFile);
        }
コード例 #8
0
        public void LoadMetadataReferences_Returns_Empty_On_Invalid_ReferencePath()
        {
            var projectFileDoc = XDocument.Load(new StringReader(projectFileContent));

            var mockedLogger = new Mock <ILogger>();
            var projectBuildHandlerInstance  = new ProjectBuildHandler(mockedLogger.Object, null, new List <string>());
            var loadMetadataReferencesMethod =
                TestUtils.GetPrivateMethod(projectBuildHandlerInstance.GetType(), "LoadMetadataReferences");

            // Invoke method and read contents of method output
            var metadataReferences         = (List <PortableExecutableReference>)loadMetadataReferencesMethod.Invoke(projectBuildHandlerInstance, new object[] { projectFileDoc });
            var expectedMetadataReferences = new List <PortableExecutableReference>();

            CollectionAssert.AreEquivalent(expectedMetadataReferences, metadataReferences);

            // Validate MissingMetaReferences
            var           prop = TestUtils.GetPrivateProperty(projectBuildHandlerInstance.GetType(), "MissingMetaReferences");
            List <string> missingMetaReferences         = (List <string>)prop.GetValue(projectBuildHandlerInstance);
            List <string> expectedMissingMetaReferences = new List <string> {
                @"C:\\RandomFile.dll", @"C:\\this\\is\\some\\path\\to\\Some.dll"
            };

            CollectionAssert.AreEquivalent(expectedMissingMetaReferences, missingMetaReferences);
        }