Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

To .Net 5 #3

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 31 additions & 26 deletions Pages/Index.razor
Original file line number Diff line number Diff line change
@@ -1,33 +1,38 @@
@page "/"
@inject NavigationManager navigationManager
@using BlazorInputFile
@using System.Threading

<div class="banner">
<span class="title">Source Generator Playground<span class="version"> - @ThisAssembly.AssemblyInformationalVersion</span></span>
Load sample: <select value="@_currentSample" @onchange="LoadSample">
@{
var index = 0;
}
@foreach (string sample in SamplesLoader.Samples)
{
<option value="@(index++)">@sample</option>
}
</select>
<span class="about">
by <a target="_blank" href="https://twitter.com/davidwengier">@@davidwengier</a>
- <a target="_blank" href="https://github.com/davidwengier/SourceGeneratorPlayground">GitHub</a>
</span>
</div>
<div class="banner top-row px-4">
<span class="title">Source Generator Playground<span class="version"> - @ThisAssembly.AssemblyInformationalVersion</span></span>
Load sample: <select value="@_currentSample" @onchange="LoadSample">
@{
var index = 0;
}
@foreach (string sample in SamplesLoader.Samples)
{
<option value="@(index++)">@sample</option>
}
</select>
<span class="about">
by <a target="_blank" href="https://twitter.com/davidwengier">@@davidwengier</a>
- <a target="_blank" href="https://github.com/davidwengier/SourceGeneratorPlayground">GitHub</a>
</span>
</div>
@*<div class="top-row px-4">
<a href="http://blazor.net" target="_blank" class="ml-md-auto">About</a>
</div>*@

@*<div class="content px-4"> </div>*@

<div class="parent">
<div class="content parent px-4">
<div class="code-header"><span class="header">Program Code</span><div class="fileUpload btn btn-secondary"><span>Load</span><InputFile OnChange="HandleCodeFileSelected" /></div></div>
<div class="code"><MonacoEditor @ref="codeEditor" Id="code-editor" ConstructionOptions="EditorConstructionOptions" OnKeyUp="OnKeyUp" /></div>
<div class="generator-header"><span class="header">Source Generator</span><div class="fileUpload btn btn-secondary"><span>Load</span><InputFile OnChange="HandleGeneratorFileSelected" /></div></div>
<div class="generator"><MonacoEditor @ref="generator" Id="generator" ConstructionOptions="EditorConstructionOptions" OnKeyUp="OnKeyUp" /></div>
<div class="program-output-header"><span class="header">Output</span></div>
<div class="program-output"><MonacoEditor @ref="programOutput" Id="program-output" ConstructionOptions="EditorConstructionOptions" /></div>
<div class="generator-output-header"><span class="header">Generated Output</span>
<div class="generator-output-header">
<span class="header">Generated Output</span>
<div class="refresh">
<span>
<input type="checkbox" @bind="_autoRefresh" /> Auto
Expand Down Expand Up @@ -97,7 +102,7 @@
{
options.Value = gen;

_ = Update(default);
_ = Update(default);
}


Expand Down Expand Up @@ -158,19 +163,19 @@
await generatorOutput.SetValue(runner.GeneratorOutput);
}

private async Task HandleCodeFileSelected(IFileListEntry[] files)
private async Task HandleCodeFileSelected(InputFileChangeEventArgs args)
{
await LoadFile(files[0], codeEditor);
await LoadFile(args.File, codeEditor);
}

private async Task HandleGeneratorFileSelected(IFileListEntry[] files)
private async Task HandleGeneratorFileSelected(InputFileChangeEventArgs args)
{
await LoadFile(files[0], generator);
await LoadFile(args.File, generator);
}

private async Task LoadFile(IFileListEntry file, MonacoEditor editor)
private async Task LoadFile(IBrowserFile file, MonacoEditor editor)
{
using (var reader = new System.IO.StreamReader(file.Data))
using (var reader = new System.IO.StreamReader(file.OpenReadStream()))
{
await editor.SetValue(await reader.ReadToEndAsync());
}
Expand Down
2 changes: 1 addition & 1 deletion Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class Program
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("app");
builder.RootComponents.Add<App>("#app");

builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

Expand Down
96 changes: 89 additions & 7 deletions Runner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Net.Http;
using System.Reflection;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
Expand All @@ -14,7 +15,7 @@

namespace SourceGeneratorPlayground
{
internal class Runner
public class Runner
{
private static List<MetadataReference>? s_references;

Expand All @@ -35,7 +36,8 @@ internal async Task Run(string baseUri)
{
if (s_references == null)
{
s_references = await GetReferences(baseUri);
//s_references = await GetReferences(baseUri);
s_references = await GetReferencesFromBootDoc(baseUri);
}

this.ProgramOutput = "";
Expand Down Expand Up @@ -227,21 +229,101 @@ private void ExecuteProgram(Assembly programAssembly)
return header + Environment.NewLine + Environment.NewLine + string.Join(Environment.NewLine, errors);
}

private static async Task<List<MetadataReference>> GetReferences(string baseUri)
private async Task<List<MetadataReference>> GetReferences(string baseUri)
{
Assembly[]? refs = AppDomain.CurrentDomain.GetAssemblies();
var client = new HttpClient
using var client = new HttpClient
{
BaseAddress = new Uri(baseUri)
};

using var bootResponse = await client.GetAsync("_framework/blazor.boot.json");
bootResponse.EnsureSuccessStatusCode();
using var boot = JsonDocument.Parse(await bootResponse.Content.ReadAsStringAsync());
var assemblies = boot.RootElement.GetProperty("resources").GetProperty("assembly").EnumerateObject().Select(jp => jp.Name);

var references = new List<MetadataReference>();
try
{

foreach (Assembly reference in refs.Where(x => !x.IsDynamic))// && (!string.IsNullOrWhiteSpace(x.Location) || !string.IsNullOrWhiteSpace(x.CodeBase))))
{
string path;
if (string.IsNullOrWhiteSpace(reference.Location))
{
//MetadataReference.CreateFromFile(reference.Location);
//MetadataReference.CreateFromImage(reference.)
try
{
//var uri = new Uri(reference.EscapedCodeBase);
//path = uri.LocalPath.Substring(1);
path = reference.GetName().Name!;
//references.Add(MetadataReference.Crea($"{baseUri}/_framework/{path}"));
}
catch (Exception e)
{
var str = e.ToString();

throw;
}
}
else
{
path = reference.Location;
//references.Add(MetadataReference.CreateFromFile(reference.Location));
}
//if (System.Diagnostics.Debugger.IsAttached)
//{
// System.Diagnostics.Debugger.Log(1, "LOL", $"path: {path}");
//}
//Console.WriteLine($"path: {path}");
Stream? stream = await client.GetStreamAsync($"_framework/{path}.dll");
references.Add(MetadataReference.CreateFromStream(stream));

}
} catch (Exception e)
{
var str = e.ToString();
throw;
}

return references;
}

private async Task<List<MetadataReference>> GetReferencesFromBootDoc(string baseUri)
{
Assembly[]? refs = AppDomain.CurrentDomain.GetAssemblies();
using var client = new HttpClient
{
BaseAddress = new Uri(baseUri)
};

var references = new List<MetadataReference>();
try
{
using var bootResponse = await client.GetAsync("_framework/blazor.boot.json");
bootResponse.EnsureSuccessStatusCode();
using var boot = JsonDocument.Parse(await bootResponse.Content.ReadAsStringAsync());
var assemblies = boot.RootElement.GetProperty("resources").GetProperty("assembly").EnumerateObject().Select(jp => jp.Name);
//.Concat(boot.RootElement.GetProperty("resources").GetProperty("lazyAssembly").EnumerateObject().Select(jp => jp.Name));

foreach (Assembly? reference in refs.Where(x => !x.IsDynamic && !string.IsNullOrWhiteSpace(x.Location)))
try
{
Stream? stream = await client.GetStreamAsync($"_framework/_bin/{reference.Location}");
references.Add(MetadataReference.CreateFromStream(stream));
foreach (var assemblyName in assemblies)
{
Stream? stream = await client.GetStreamAsync($"_framework/{assemblyName}");
references.Add(MetadataReference.CreateFromStream(stream));

}
} catch (Exception e)
{
var str = e.ToString();
throw;
}
} catch (Exception e)
{
var str = e.ToString();
throw;
}

return references;
Expand Down
6 changes: 5 additions & 1 deletion Shared/MainLayout.razor
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
@inherits LayoutComponentBase

@Body
<div class="page">
<div class="main">
@Body
</div>
</div>
72 changes: 72 additions & 0 deletions Shared/MainLayout.razor.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
.page {
position: relative;
display: flex;
flex-direction: column;
}

.main {
flex: 1;
}

.sidebar {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}

.top-row {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
height: 3.5rem;
display: flex;
align-items: center;
}

.top-row ::deep a, .top-row .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
}

.top-row a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}

@media (max-width: 767.98px) {
.top-row:not(.auth) {
display: none;
}

.top-row.auth {
justify-content: space-between;
}

.top-row a, .top-row .btn-link {
margin-left: 0;
}
}

@media (min-width: 768px) {
.page {
flex-direction: row;
/* NOTE: added this o make the page fill */
height: 100vh;
}

.sidebar {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}

.top-row {
position: sticky;
top: 0;
z-index: 1;
}

.main > div {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
}
31 changes: 17 additions & 14 deletions SourceGeneratorPlayground.csproj
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">

<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<RazorLangVersion>3.0</RazorLangVersion>
<LangVersion>preview</LangVersion>
<BlazorWebAssemblyEnableLinking>false</BlazorWebAssemblyEnableLinking>
<TargetFramework>net5.0</TargetFramework>
<!--<LangVersion>preview</LangVersion>-->
<!--<BlazorWebAssemblyEnableLinking>false</BlazorWebAssemblyEnableLinking>-->
<!--<PublishSingleFile>false</PublishSingleFile>-->
<PublishTrimmed>false</PublishTrimmed>
<!--<PublishReadyToRun>false</PublishReadyToRun>-->
</PropertyGroup>

<ItemGroup>
Expand All @@ -13,24 +15,25 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="BlazorInputFile" Version="0.2.0" />
<PackageReference Include="BlazorMonaco" Version="1.4.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="3.2.1" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.1" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="3.2.1" PrivateAssets="all" />
<PackageReference Include="System.Net.Http.Json" Version="3.2.0" />
<PackageReference Include="BlazorMonaco" Version="1.6.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="5.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="5.0.1" PrivateAssets="all" />
<PackageReference Include="System.Net.Http.Json" Version="5.0.0" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Nerdbank.GitVersioning" Version="3.2.31">
<PackageReference Include="Nerdbank.GitVersioning" Version="3.3.37">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.8.0-3.final" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.8.0" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>

</Project>
1 change: 1 addition & 0 deletions _Imports.razor
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using SourceGeneratorPlayground
Expand Down
Loading