Backend/RiderPlugin/ForTea.RiderPlugin/ProtocolAware/Highlighting/T4RiderSyntaxHighlightingHost.cs (73 lines of code) (raw):
using GammaJul.ForTea.Core.Psi.FileType;
using JetBrains.Annotations;
using JetBrains.Application.Parts;
using JetBrains.DocumentModel;
using JetBrains.ForTea.RiderPlugin.Model;
using JetBrains.ForTea.RiderPlugin.ProtocolAware.Highlighting.Impl;
using JetBrains.Lifetimes;
using JetBrains.ProjectModel;
using JetBrains.RdBackend.Common.Features.Documents;
using JetBrains.ReSharper.Psi;
using JetBrains.ReSharper.Psi.Caches;
using JetBrains.ReSharper.Psi.Files;
using JetBrains.Rider.Model;
using JetBrains.Util;
namespace JetBrains.ForTea.RiderPlugin.ProtocolAware.Highlighting
{
[SolutionComponent(InstantiationEx.LegacyDefault)]
public sealed class T4RiderSyntaxHighlightingHost
{
[NotNull] private ILogger Logger { get; }
[NotNull] private T4OutputExtensionFrontendNotifier Notifier { get; }
[NotNull] private ISolution Solution { get; }
[NotNull] private IPsiCachesState State { get; }
[NotNull] private IPsiFiles Files { get; }
[NotNull] private IDocumentHost Host { get; }
public T4RiderSyntaxHighlightingHost(
Lifetime lifetime,
[NotNull] ILogger logger,
[NotNull] T4OutputExtensionFrontendNotifier notifier,
[NotNull] ISolution solution,
[NotNull] IPsiCachesState state,
[NotNull] IPsiFiles files,
[NotNull] IDocumentHost host
)
{
Logger = logger;
Notifier = notifier;
Solution = solution;
State = state;
Files = files;
Host = host;
host.ViewDocuments(lifetime, CreateHandler);
}
private void CreateHandler(
Lifetime editableEntityLifetime,
[NotNull] RdDocumentId rdDocumentId,
[NotNull] RiderDocument document, RdDocumentModel arg4)
{
var psiSourceFile = document.GetPsiSourceFile(Solution);
if (psiSourceFile == null) return;
if (!psiSourceFile.LanguageType.Is<T4ProjectFileType>()) return;
var documentModel = Host.TryGetDocument(rdDocumentId)?.GetProtocolSynchronizerSafe()?.DocumentModel;
if (documentModel == null)
{
Logger.Error("Editable entity not found in a document!");
return;
}
var t4EditableEntityModel = documentModel.GetT4RdDocumentModel();
document.CreateOutputExtensionChangeListener(
editableEntityLifetime,
new T4OutputExtensionChangeListener(t4EditableEntityModel.RawTextExtension)
);
InitializeExtension(document);
}
private void InitializeExtension([NotNull] IDocument targetDocument)
{
var file = targetDocument.GetPsiSourceFile(Solution);
if (file == null) return;
// T4OutputExtensionFrontendNotifier handles initial update and invalidates all necessary files
if (!State.IsInitialUpdateFinished.Value) return;
Files.ExecuteAfterCommitAllDocuments(() => Notifier.NotifyFrontend(file));
}
}
}