public LintError(SnapshotSpan span, Suggestion.LintWarning lintWarning, LintProjectInfo project) { this.Span = span; this.LintWarning = lintWarning; this.Project = project; }
public async Task DoUpdateAsync() { if (IsDisposed) { return; } var buffer = _currentSnapshot; var path = Document.FilePath; // replace with user token var token = _cts.Token; var instance = await FsLintVsPackage.Instance.WithCancellation(token); if (token.IsCancellationRequested) { return; } // this acts as a throttle await Task.Delay(instance.Options.Throttle, token).ConfigureAwait(false); if (token.IsCancellationRequested) { return; } if (ProjectInfo == null) { await instance.JoinableTaskFactory.SwitchToMainThreadAsync(); var solution = instance.Dte.Solution; var project = solution.FindProjectItem(path)?.ContainingProject; if (project == null) { return; } if (instance.SolutionService.GetProjectOfUniqueName(project.UniqueName, out var vsHierarchy) != VSConstants.S_OK) { return; } if (instance.SolutionService.GetGuidOfProject(vsHierarchy, out var guid) != VSConstants.S_OK) { return; } ProjectInfo = new LintProjectInfo(project, solution, guid, vsHierarchy); } if (Configuration == null) { this.Configuration = new[] { Document.FilePath, ProjectInfo.Project.FileName, ProjectInfo.Solution.FileName, Directory.GetParent(ProjectInfo.Solution.FileName).FullName } .Select(Path.GetDirectoryName) .Where(dir => !string.IsNullOrEmpty(dir)) .Select(dir => Path.Combine(dir, "fsharplint.json")) .Where(File.Exists) .Select(Lint.ConfigurationParam.NewFromFile) .FirstOrDefault() ?? Lint.ConfigurationParam.Default; } await Task.Yield(); var lintOpts = new Lint.OptionalLintParameters( cancellationToken: token, configuration: this.Configuration, receivedWarning: null, reportLinterProgress: null); var source = _currentSnapshot.GetText(); var sourceText = SourceText.ofString(source); var parse = instance.Options.TypeCheck ? TryParseAndCheckAsync(path, sourceText, token) : TryParseAsync(path, sourceText, token); var(parseResultsOpt, checkResults) = await parse.ConfigureAwait(false); if (parseResultsOpt == null || parseResultsOpt.Value.ParseHadErrors || token.IsCancellationRequested) { return; } var parseResults = parseResultsOpt.Value; var input = new Lint.ParsedFileInformation(ast: parseResults.ParseTree.Value, source, checkResults); var lintResult = Lint.lintParsedSource(lintOpts, input); if (!lintResult.TryGetSuccess(out var lintWarnings)) { return; } var oldLintingErrors = this.Factory.CurrentSnapshot; var newLintErrors = new LintingErrorsSnapshot(Document, oldLintingErrors.VersionNumber + 1); foreach (var lint in lintWarnings) { var span = RangeToSpan(lint.Details.Range, buffer); newLintErrors.Errors.Add(new LintError(span, lint, ProjectInfo)); } await instance.JoinableTaskFactory.SwitchToMainThreadAsync(); if (token.IsCancellationRequested) { return; } UpdateLintingErrors(newLintErrors); }