Backend/RiderPlugin/ForTea.RiderPlugin/TemplateProcessing/Managing/Impl/T4BuildMessageConverter.cs (96 lines of code) (raw):

using System; using System.Collections.Generic; using System.Linq; using GammaJul.ForTea.Core.TemplateProcessing.CodeCollecting.Interrupt; using GammaJul.ForTea.Core.Tree; using JetBrains.Annotations; using JetBrains.Application.Parts; using JetBrains.Diagnostics; using JetBrains.ForTea.RiderPlugin.Model; using JetBrains.ProjectModel; using JetBrains.RdBackend.Common.Features.ProjectModel.View; using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.Tree; using JetBrains.Util.dataStructures; using Microsoft.CodeAnalysis; namespace JetBrains.ForTea.RiderPlugin.TemplateProcessing.Managing.Impl { [SolutionComponent(InstantiationEx.LegacyDefault)] public sealed class T4BuildMessageConverter : IT4BuildMessageConverter { [CanBeNull] private ProjectModelViewHost Host { get; } public T4BuildMessageConverter([NotNull] ISolution solution) => Host = solution.TryGetComponent<ProjectModelViewHost>(); public T4BuildResult ToT4BuildResult(ICollection<Diagnostic> diagnostics, [NotNull] IT4File file) { int id = GetProjectId(file.LogicalPsiSourceFile.ToProjectFile().NotNull()); var kind = ToT4BuildResultKind(diagnostics); var messages = diagnostics.Select(diagnostic => ToT4BuildMessage(diagnostic, id)).ToList(); return new T4BuildResult(kind, messages); } private int GetProjectId([NotNull] IProjectFile file) => Host?.GetIdByItem(file.GetProject().NotNull()) ?? 0; public T4BuildResult ToT4BuildResult(T4OutputGenerationException exception) => ToT4BuildResult(exception.FailureDatum.AsEnumerable()); [NotNull] private T4BuildResult ToT4BuildResult([NotNull] IEnumerable<T4FailureRawData> data) => new T4BuildResult(T4BuildResultKind.HasErrors, ToT4BuildMessages(data)); public List<T4BuildMessage> ToT4BuildMessages(IEnumerable<T4FailureRawData> rawData) { var messages = new List<T4BuildMessage>(); foreach (var data in rawData) { var location = new T4Location(data.Line, data.Column); int projectId = GetProjectId(data.ProjectFile); string fullPath = data.ProjectFile.Location.FullPath; string message = data.Message; const T4BuildMessageKind kind = T4BuildMessageKind.Error; messages.Add(new T4BuildMessage(kind, "Error", location, message, projectId, fullPath)); } return messages; } public T4BuildResult FatalError() { var location = new T4Location(-1, -1); const string content = "Fatal internal error"; var message = new T4BuildMessage(T4BuildMessageKind.Error, "Error", location, content, -1, null); var messages = new List<T4BuildMessage> { message }; return new T4BuildResult(T4BuildResultKind.HasErrors, messages); } public T4BuildResult SyntaxErrors(IEnumerable<ITreeNode> nodes) => ToT4BuildResult(nodes.Select(node => T4FailureRawData.FromElement(node, "Syntax error"))); private static T4BuildResultKind ToT4BuildResultKind([NotNull, ItemNotNull] ICollection<Diagnostic> diagnostics) { if (diagnostics.Any(it => it.Severity == DiagnosticSeverity.Error)) return T4BuildResultKind.HasErrors; if (diagnostics.Any(it => it.Severity == DiagnosticSeverity.Warning)) return T4BuildResultKind.HasWarnings; return T4BuildResultKind.Successful; } [NotNull] private T4BuildMessage ToT4BuildMessage([NotNull] Diagnostic diagnostic, int projectId) { var kind = ToT4BuildMessageKind(diagnostic.Severity); var mappedSpan = diagnostic.Location.GetMappedLineSpan(); var start = mappedSpan.StartLinePosition; var location = new T4Location(start.Line, start.Character); string path = mappedSpan.Path; string message = diagnostic.GetMessage(); string id = diagnostic.Id; return new T4BuildMessage(kind, id, location, message, projectId, path); } private T4BuildMessageKind ToT4BuildMessageKind(DiagnosticSeverity severity) { switch (severity) { case DiagnosticSeverity.Hidden: return T4BuildMessageKind.Message; case DiagnosticSeverity.Info: return T4BuildMessageKind.Message; case DiagnosticSeverity.Warning: return T4BuildMessageKind.Warning; case DiagnosticSeverity.Error: return T4BuildMessageKind.Error; default: throw new ArgumentOutOfRangeException(nameof(severity), severity, null); } } } }