public LintError(SnapshotSpan span, Suggestion.LintWarning lintWarning, LintProjectInfo project)
 {
     this.Span        = span;
     this.LintWarning = lintWarning;
     this.Project     = project;
 }
示例#2
0
        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);
        }