in Backend/RiderPlugin/ForTea.RiderPlugin/TemplateProcessing/Managing/Impl/T4TemplateCompiler.cs [52:106]
public T4BuildResult Compile(Lifetime lifetime, IPsiSourceFile sourceFile)
{
Logger.Verbose("Compiling a file");
Locks.AssertReadAccessAllowed();
// Since we need no context when compiling a file, we need to build the tree manually
var file = sourceFile.BuildT4Tree();
var error = file.ThisAndDescendants<IErrorElement>().Collect();
if (!error.IsEmpty()) return Converter.SyntaxErrors(error);
return lifetime.UsingNested(nested =>
{
try
{
// Prepare the code
var references = ReferenceExtractionManager.ExtractPortableReferencesForCompilation(lifetime, file);
string code = GenerateCode(file);
// Prepare the paths
var executablePath = TargetManager.GetTemporaryExecutableLocation(file);
var compilation = CreateCompilation(code, references, executablePath);
var location = executablePath.Parent;
switch (location.Exists)
{
case FileSystemPath.Existence.File:
location.DeleteFile();
goto case FileSystemPath.Existence.Missing;
case FileSystemPath.Existence.Missing:
location.CreateDirectory();
break;
}
var pdbPath = location.Combine(executablePath.Name.WithOtherExtension("pdb"));
// Delegate to Roslyn
var emitOptions = new EmitOptions(
debugInformationFormat: DebugInformationFormat.PortablePdb,
pdbFilePath: pdbPath.FullPath
);
using var executableStream = executablePath.OpenFileForWriting();
using var pdbStream = pdbPath.OpenFileForWriting();
var emitResult = compilation.Emit(
peStream: executableStream,
pdbStream: pdbStream,
options: emitOptions,
cancellationToken: nested
);
return Converter.ToT4BuildResult(emitResult.Diagnostics.AsList(), file);
}
catch (T4OutputGenerationException e)
{
return Converter.ToT4BuildResult(e);
}
});
}