Backend/RiderPlugin/ForTea.RiderPlugin/Psi/Resolve/Assemblies/Impl/T4DteAwareAssemblyReferenceResolver.cs (50 lines of code) (raw):
using System.Collections.Generic;
using System.Linq;
using GammaJul.ForTea.Core.Psi.Resolve.Assemblies;
using GammaJul.ForTea.Core.Psi.Resolve.Assemblies.Impl;
using GammaJul.ForTea.Core.Psi.Resolve.Macros.Impl;
using JetBrains.Annotations;
using JetBrains.Application.Parts;
using JetBrains.Lifetimes;
using JetBrains.ProjectModel;
using JetBrains.ProjectModel.Model2.Assemblies.Interfaces;
using JetBrains.Util;
namespace JetBrains.ForTea.RiderPlugin.Psi.Resolve.Assemblies.Impl
{
/// <summary>
/// This resolver is capable of resolving everything its parent can,
/// and it is additionally capable of resolving EnvDTE.
/// </summary>
[SolutionComponent(Instantiation.DemandAnyThreadSafe)]
public sealed class T4DteAwareAssemblyReferenceResolver : T4AssemblyReferenceResolver
{
public T4DteAwareAssemblyReferenceResolver(
[NotNull] IModuleReferenceResolveManager resolveManager,
[NotNull] IT4LightWeightAssemblyReferenceResolver preprocessor
) : base(
resolveManager,
preprocessor
)
{
}
public override VirtualFileSystemPath Resolve(T4ResolvedPath pathWithMacros) =>
base.Resolve(pathWithMacros) ?? ResolveAsDte(pathWithMacros.ResolvedPath);
[CanBeNull]
private static VirtualFileSystemPath ResolveAsDte([NotNull] string assemblyName) =>
NameToEnvDteAssemblyMap.TryGetValue(assemblyName);
private static IDictionary<string, VirtualFileSystemPath> NameToEnvDteAssemblyMap { get; } =
FindEnvDteAssemblies();
private static Dictionary<string, VirtualFileSystemPath> FindEnvDteAssemblies()
{
var lifetimeDirectory =
typeof(Lifetime).Assembly.GetPath().ToVirtualFileSystemPath()
.Parent;
var envDteAssembliesInLifetimeDirectory = FindEnvDteAssemblies(lifetimeDirectory);
if (!envDteAssembliesInLifetimeDirectory.IsEmpty()) return envDteAssembliesInLifetimeDirectory;
var envDteAssembliesInLifetimeDirectoryParent = FindEnvDteAssemblies(lifetimeDirectory.Parent);
return envDteAssembliesInLifetimeDirectoryParent;
}
private static Dictionary<string, VirtualFileSystemPath> FindEnvDteAssemblies(
VirtualFileSystemPath directory
) => directory
.GetChildren("*EnvDTE*.dll")
.Select(child => child.GetAbsolutePath())
.ToDictionary(assembly => assembly.NameWithoutExtension);
}
}