private void Tracker_UpdatedOnDisk(object sender, EventArgs e) { FileChangeTracker tracker = (FileChangeTracker)sender; var filePath = tracker.FilePath; lock (_guard) { // Once we've created a diagnostic for a given analyzer file, there's // no need to keep watching it. _fileChangeTrackers.Remove(filePath); } tracker.Dispose(); tracker.UpdatedOnDisk -= Tracker_UpdatedOnDisk; // Traverse the chain of requesting assemblies to get back to the original analyzer // assembly. var assemblyPath = filePath; var requestingAssemblyPath = InMemoryAssemblyProvider.TryGetRequestingAssembly(filePath); while (requestingAssemblyPath != null) { assemblyPath = requestingAssemblyPath; requestingAssemblyPath = InMemoryAssemblyProvider.TryGetRequestingAssembly(assemblyPath); } var projectsWithAnalyzer = _workspace.ProjectTracker.Projects.Where(p => p.CurrentProjectAnalyzersContains(assemblyPath)).ToArray(); foreach (var project in projectsWithAnalyzer) { RaiseAnalyzerChangedWarning(project.Id, filePath); } }
private void Tracker_UpdatedOnDisk(object sender, EventArgs e) { FileChangeTracker tracker = (FileChangeTracker)sender; var filePath = tracker.FilePath; lock (_guard) { // Once we've created a diagnostic for a given analyzer file, there's // no need to keep watching it. _fileChangeTrackers.Remove(filePath); } tracker.Dispose(); tracker.UpdatedOnDisk -= Tracker_UpdatedOnDisk; // Traverse the chain of requesting assemblies to get back to the original analyzer // assembly. foreach (var project in _workspace.CurrentSolution.Projects) { var analyzerFileReferences = project.AnalyzerReferences.OfType <AnalyzerFileReference>(); if (analyzerFileReferences.Any(a => a.FullPath.Equals(filePath, StringComparison.OrdinalIgnoreCase))) { RaiseAnalyzerChangedWarning(project.Id, filePath); } } }
private void Tracker_UpdatedOnDisk(object sender, EventArgs e) { FileChangeTracker tracker = (FileChangeTracker)sender; var filePath = tracker.FilePath; lock (_fileChangeTrackersLock) { // Once we've created a diagnostic for a given analyzer file, there's // no need to keep watching it. _fileChangeTrackers.Remove(filePath); } tracker.Dispose(); tracker.UpdatedOnDisk -= Tracker_UpdatedOnDisk; string id = ServicesVSResources.WRN_AnalyzerChangedId; string category = ServicesVSResources.ErrorCategory; string message = string.Format(ServicesVSResources.WRN_AnalyzerChangedMessage, filePath); // Traverse the chain of requesting assemblies to get back to the original analyzer // assembly. var assemblyPath = filePath; var requestingAssemblyPath = AnalyzerFileReference.TryGetRequestingAssemblyPath(filePath); while (requestingAssemblyPath != null) { assemblyPath = requestingAssemblyPath; requestingAssemblyPath = AnalyzerFileReference.TryGetRequestingAssemblyPath(assemblyPath); } var projectsWithAnalyzer = _workspace.ProjectTracker.Projects.Where(p => p.CurrentProjectAnalyzersContains(assemblyPath)).ToArray(); foreach (var project in projectsWithAnalyzer) { DiagnosticData data = new DiagnosticData( id, category, message, ServicesVSResources.WRN_AnalyzerChangedMessage, severity: DiagnosticSeverity.Warning, defaultSeverity: DiagnosticSeverity.Warning, isEnabledByDefault: true, warningLevel: 0, customTags: ImmutableArray <string> .Empty, workspace: _workspace, projectId: project.Id); _updateSource.UpdateDiagnosticsForProject(project.Id, Tuple.Create(s_analyzerChangedErrorId, filePath), SpecializedCollections.SingletonEnumerable(data)); } }