public void Execute(GeneratorExecutionContext context) { var razorContext = RazorSourceGenerationContext.Create(context); if (razorContext is null || (razorContext.RazorFiles.Count == 0 && razorContext.CshtmlFiles.Count == 0)) { return; } HandleDebugSwitch(razorContext.WaitForDebugger); var tagHelpers = ResolveTagHelperDescriptors(context, razorContext); var projectEngine = RazorProjectEngine.Create(razorContext.Configuration, razorContext.FileSystem, b => { b.Features.Add(new DefaultTypeNameFeature()); b.SetRootNamespace(razorContext.RootNamespace); b.Features.Add(new StaticTagHelperFeature { TagHelpers = tagHelpers, }); b.Features.Add(new DefaultTagHelperDescriptorProvider()); CompilerFeatures.Register(b); RazorExtensions.Register(b); b.SetCSharpLanguageVersion(((CSharpParseOptions)context.ParseOptions).LanguageVersion); }); CodeGenerateRazorComponents(context, razorContext, projectEngine); GenerateViews(context, razorContext, projectEngine); }
public void Execute(GeneratorExecutionContext context) { var _razorContext = new RazorSourceGenerationContext(context); if (_razorContext is null) { context.ReportDiagnostic(Diagnostic.Create(RazorDiagnostics.InvalidRazorContextComputedDescriptor, Location.None)); return; } if (_razorContext.RazorFiles.Count == 0 && _razorContext.CshtmlFiles.Count == 0) { return; } if (_razorContext.SuppressRazorSourceGenerator) { return; } HandleDebugSwitch(_razorContext.WaitForDebugger); var tagHelpers = ResolveTagHelperDescriptors(context, _razorContext); AssertOrFailFast(tagHelpers.Count == 0, "No tag helpers resolved."); var projectEngine = RazorProjectEngine.Create(_razorContext.Configuration, _razorContext.FileSystem, b => { b.Features.Add(new DefaultTypeNameFeature()); b.SetRootNamespace(_razorContext.RootNamespace); b.Features.Add(new ConfigureRazorCodeGenerationOptions(options => { options.SuppressMetadataSourceChecksumAttributes = !_razorContext.GenerateMetadataSourceChecksumAttributes; })); b.Features.Add(new StaticTagHelperFeature { TagHelpers = tagHelpers, }); b.Features.Add(new DefaultTagHelperDescriptorProvider()); CompilerFeatures.Register(b); RazorExtensions.Register(b); b.SetCSharpLanguageVersion(((CSharpParseOptions)context.ParseOptions).LanguageVersion); }); if (_razorContext.CshtmlFiles.Count != 0) { context.AddSource($"{context.Compilation.AssemblyName}.UnifiedAssembly.Info.g.cs", ProvideApplicationPartFactoryAttributeSourceText); } RazorGenerateForSourceTexts(_razorContext.CshtmlFiles, context, projectEngine); RazorGenerateForSourceTexts(_razorContext.RazorFiles, context, projectEngine); }
private void GenerateViews(GeneratorExecutionContext context, RazorSourceGenerationContext razorContext, RazorProjectEngine projectEngine) { var files = razorContext.CshtmlFiles; Parallel.For(0, files.Count, GetParallelOptions(context), i => { var file = files[i]; var codeDocument = projectEngine.Process(projectEngine.FileSystem.GetItem(file.NormalizedPath, FileKinds.Legacy)); var csharpDocument = codeDocument.GetCSharpDocument(); for (var j = 0; j < csharpDocument.Diagnostics.Count; j++) { var razorDiagnostic = csharpDocument.Diagnostics[j]; var csharpDiagnostic = razorDiagnostic.AsDiagnostic(); context.ReportDiagnostic(csharpDiagnostic); } Directory.CreateDirectory(Path.GetDirectoryName(file.GeneratedOutputPath)); File.WriteAllText(file.GeneratedOutputPath, csharpDocument.GeneratedCode); }); }
private static void CodeGenerateRazorComponents(GeneratorExecutionContext context, RazorSourceGenerationContext razorContext, RazorProjectEngine projectEngine) { var files = razorContext.RazorFiles; var arraypool = ArrayPool <(string, SourceText)> .Shared; var outputs = arraypool.Rent(files.Count); Parallel.For(0, files.Count, GetParallelOptions(context), i => { var file = files[i]; var projectItem = projectEngine.FileSystem.GetItem(file.NormalizedPath, FileKinds.Component); var codeDocument = projectEngine.Process(projectItem); var csharpDocument = codeDocument.GetCSharpDocument(); for (var j = 0; j < csharpDocument.Diagnostics.Count; j++) { var razorDiagnostic = csharpDocument.Diagnostics[j]; var csharpDiagnostic = razorDiagnostic.AsDiagnostic(); context.ReportDiagnostic(csharpDiagnostic); } var hint = GetIdentifierFromPath(file.NormalizedPath); var generatedCode = csharpDocument.GeneratedCode; if (razorContext.WriteGeneratedContent) { var path = file.GeneratedOutputPath; Directory.CreateDirectory(Path.GetDirectoryName(path)); File.WriteAllText(path, generatedCode); } outputs[i] = (hint, SourceText.From(generatedCode, Encoding.UTF8)); });