diff --git a/.gitignore b/.gitignore
index 4b82ccd914..66ccd8d044 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
.vs/
bin/
obj/
+*.user
diff --git a/BlazorTooling.sln b/BlazorTooling.sln
new file mode 100644
index 0000000000..6be4334ff2
--- /dev/null
+++ b/BlazorTooling.sln
@@ -0,0 +1,79 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26124.0
+MinimumVisualStudioVersion = 15.0.26124.0
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tooling", "tooling", "{1AC24BB5-AEBD-4D5B-B86F-8C606EFFFFFB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.VisualStudio.BlazorExtension", "tooling\Microsoft.VisualStudio.BlazorExtension\Microsoft.VisualStudio.BlazorExtension.csproj", "{9088E4E4-B855-457F-AE9E-D86709A5E1F4}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.VisualStudio.LanguageServices.Blazor", "tooling\Microsoft.VisualStudio.LanguageServices.Blazor\Microsoft.VisualStudio.LanguageServices.Blazor.csproj", "{5884589D-4A06-4F5B-B983-8F8D34696550}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{74280251-105B-4618-A9D7-951076793E3D}"
+ ProjectSection(SolutionItems) = preProject
+ build\Key.snk = build\Key.snk
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{91810C0E-892D-40EF-BDC0-5470B37E255F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AngleSharpBuilder", "src\anglesharp\AngleSharpBuilder\AngleSharpBuilder.csproj", "{E5067AD8-3AE7-442A-86C5-D19DBC48E961}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|x64.Build.0 = Debug|Any CPU
+ {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Debug|x86.Build.0 = Debug|Any CPU
+ {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x64.ActiveCfg = Release|Any CPU
+ {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x64.Build.0 = Release|Any CPU
+ {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x86.ActiveCfg = Release|Any CPU
+ {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x86.Build.0 = Release|Any CPU
+ {5884589D-4A06-4F5B-B983-8F8D34696550}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5884589D-4A06-4F5B-B983-8F8D34696550}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5884589D-4A06-4F5B-B983-8F8D34696550}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5884589D-4A06-4F5B-B983-8F8D34696550}.Debug|x64.Build.0 = Debug|Any CPU
+ {5884589D-4A06-4F5B-B983-8F8D34696550}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5884589D-4A06-4F5B-B983-8F8D34696550}.Debug|x86.Build.0 = Debug|Any CPU
+ {5884589D-4A06-4F5B-B983-8F8D34696550}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5884589D-4A06-4F5B-B983-8F8D34696550}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5884589D-4A06-4F5B-B983-8F8D34696550}.Release|x64.ActiveCfg = Release|Any CPU
+ {5884589D-4A06-4F5B-B983-8F8D34696550}.Release|x64.Build.0 = Release|Any CPU
+ {5884589D-4A06-4F5B-B983-8F8D34696550}.Release|x86.ActiveCfg = Release|Any CPU
+ {5884589D-4A06-4F5B-B983-8F8D34696550}.Release|x86.Build.0 = Release|Any CPU
+ {E5067AD8-3AE7-442A-86C5-D19DBC48E961}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E5067AD8-3AE7-442A-86C5-D19DBC48E961}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E5067AD8-3AE7-442A-86C5-D19DBC48E961}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E5067AD8-3AE7-442A-86C5-D19DBC48E961}.Debug|x64.Build.0 = Debug|Any CPU
+ {E5067AD8-3AE7-442A-86C5-D19DBC48E961}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E5067AD8-3AE7-442A-86C5-D19DBC48E961}.Debug|x86.Build.0 = Debug|Any CPU
+ {E5067AD8-3AE7-442A-86C5-D19DBC48E961}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E5067AD8-3AE7-442A-86C5-D19DBC48E961}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E5067AD8-3AE7-442A-86C5-D19DBC48E961}.Release|x64.ActiveCfg = Release|Any CPU
+ {E5067AD8-3AE7-442A-86C5-D19DBC48E961}.Release|x64.Build.0 = Release|Any CPU
+ {E5067AD8-3AE7-442A-86C5-D19DBC48E961}.Release|x86.ActiveCfg = Release|Any CPU
+ {E5067AD8-3AE7-442A-86C5-D19DBC48E961}.Release|x86.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {9088E4E4-B855-457F-AE9E-D86709A5E1F4} = {1AC24BB5-AEBD-4D5B-B86F-8C606EFFFFFB}
+ {5884589D-4A06-4F5B-B983-8F8D34696550} = {1AC24BB5-AEBD-4D5B-B86F-8C606EFFFFFB}
+ {E5067AD8-3AE7-442A-86C5-D19DBC48E961} = {91810C0E-892D-40EF-BDC0-5470B37E255F}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {248760B5-9F71-4110-8DBC-DDAB615AD88E}
+ EndGlobalSection
+EndGlobal
diff --git a/build/Key.snk b/build/Key.snk
new file mode 100644
index 0000000000..e10e4889c1
Binary files /dev/null and b/build/Key.snk differ
diff --git a/tooling/Microsoft.VisualStudio.BlazorExtension/BlazorPackage.cs b/tooling/Microsoft.VisualStudio.BlazorExtension/BlazorPackage.cs
new file mode 100644
index 0000000000..e7496849a8
--- /dev/null
+++ b/tooling/Microsoft.VisualStudio.BlazorExtension/BlazorPackage.cs
@@ -0,0 +1,18 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Runtime.InteropServices;
+using Microsoft.VisualStudio.Shell;
+
+namespace Microsoft.VisualStudio.BlazorExtension
+{
+ // We mainly have a package so we can have an "About" dialog entry.
+ [PackageRegistration(UseManagedResourcesOnly = true)]
+ [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
+ [Guid(BlazorPackage.PackageGuidString)]
+ public sealed class BlazorPackage : Package
+ {
+ public const string PackageGuidString = "d9fe04bc-57a7-4107-915e-3a5c2f9e19fb";
+ }
+}
diff --git a/tooling/Microsoft.VisualStudio.BlazorExtension/Content/WebConfiguration.png b/tooling/Microsoft.VisualStudio.BlazorExtension/Content/WebConfiguration.png
new file mode 100644
index 0000000000..60615f6531
Binary files /dev/null and b/tooling/Microsoft.VisualStudio.BlazorExtension/Content/WebConfiguration.png differ
diff --git a/tooling/Microsoft.VisualStudio.BlazorExtension/Microsoft.VisualStudio.BlazorExtension.csproj b/tooling/Microsoft.VisualStudio.BlazorExtension/Microsoft.VisualStudio.BlazorExtension.csproj
new file mode 100644
index 0000000000..3301f84cbc
--- /dev/null
+++ b/tooling/Microsoft.VisualStudio.BlazorExtension/Microsoft.VisualStudio.BlazorExtension.csproj
@@ -0,0 +1,236 @@
+
+
+
+ 15.0
+ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
+ true
+ PackageReference
+
+
+ true
+
+
+ ..\..\build\Key.snk
+
+
+
+
+
+ 15.7
+ $(VsixVersion).$(BuildNumber)
+ $(VsixVersion).999999
+
+
+
+
+
+ Program
+ $(DevEnvDir)devenv.exe
+ /rootsuffix RoslynDev
+ RoslynDev
+
+
+
+ CommonExtensions
+ Microsoft\Blazor
+
+ false
+
+
+
+ true
+ fase
+ true
+
+ true
+ true
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+ {b9f7f502-6dd2-4e77-8fd1-cbd76f695b26}
+ Microsoft.VisualStudio.LanguageServices.Blazor
+ False
+
+
+
+
+ Microsoft.VisualStudio.LanguageServices.Blazor.dll
+ true
+ PreserveNewest
+ false
+
+
+
+
+ Microsoft.AspNetCore.Blazor.AngleSharp.dll
+ true
+ PreserveNewest
+ false
+
+
+
+
+
+ Debug
+ AnyCPU
+ 2.0
+ {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {9088E4E4-B855-457F-AE9E-D86709A5E1F4}
+ Library
+ Properties
+ Microsoft.VisualStudio.BlazorExtension
+ Microsoft.VisualStudio.BlazorExtension
+ v4.6.1
+ true
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Designer
+
+
+
+
+ true
+ Always
+
+
+
+
+
+ true
+ VSPackage
+
+
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+
+ False
+
+
+ False
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tooling/Microsoft.VisualStudio.BlazorExtension/Properties/AssemblyInfo.cs b/tooling/Microsoft.VisualStudio.BlazorExtension/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..bcdccc6357
--- /dev/null
+++ b/tooling/Microsoft.VisualStudio.BlazorExtension/Properties/AssemblyInfo.cs
@@ -0,0 +1,21 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.VisualStudio.Shell;
+
+// Add binding redirects for each assembly we ship in VS. This is required so that these assemblies show
+// up in the Load context, which means that we can use ServiceHub and other nice things.
+[assembly: ProvideBindingRedirection(
+ AssemblyName = "Microsoft.AspNetCore.Blazor.AngleSharp",
+ GenerateCodeBase = true,
+ PublicKeyToken = "",
+ OldVersionLowerBound = "0.0.0.0",
+ OldVersionUpperBound = "0.9.9.0",
+ NewVersion = "0.9.9.0")]
+[assembly: ProvideBindingRedirection(
+ AssemblyName = "Microsoft.VisualStudio.LanguageServices.Blazor",
+ GenerateCodeBase = true,
+ PublicKeyToken = "",
+ OldVersionLowerBound = "0.0.0.0",
+ OldVersionUpperBound = "1.0.0.0",
+ NewVersion = "1.0.0.0")]
diff --git a/tooling/Microsoft.VisualStudio.BlazorExtension/Resources.resx b/tooling/Microsoft.VisualStudio.BlazorExtension/Resources.resx
new file mode 100644
index 0000000000..d0fc1b1a60
--- /dev/null
+++ b/tooling/Microsoft.VisualStudio.BlazorExtension/Resources.resx
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ASP.NET Core Blazor Language Services
+ About dialog title
+
+
+ Provides Visual Studio support for ASP.NET Core Blazor
+ About dialog description
+
+
+
+ Resources\BlazorPackage.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/tooling/Microsoft.VisualStudio.BlazorExtension/Resources/BlazorPackage.ico b/tooling/Microsoft.VisualStudio.BlazorExtension/Resources/BlazorPackage.ico
new file mode 100644
index 0000000000..d323b07fb8
Binary files /dev/null and b/tooling/Microsoft.VisualStudio.BlazorExtension/Resources/BlazorPackage.ico differ
diff --git a/tooling/Microsoft.VisualStudio.BlazorExtension/source.extension.vsixmanifest b/tooling/Microsoft.VisualStudio.BlazorExtension/source.extension.vsixmanifest
new file mode 100644
index 0000000000..f393038f3b
--- /dev/null
+++ b/tooling/Microsoft.VisualStudio.BlazorExtension/source.extension.vsixmanifest
@@ -0,0 +1,28 @@
+
+
+
+
+ ASP.NET Core Blazor Language Services
+ Provides Visual Studio support for ASP.NET Core Blazor
+ Microsoft.VisualStudio.BlazorExtension
+ Content\WebConfiguration.png
+ Content\WebConfiguration.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tooling/Microsoft.VisualStudio.LanguageServices.Blazor/Microsoft.VisualStudio.LanguageServices.Blazor.csproj b/tooling/Microsoft.VisualStudio.LanguageServices.Blazor/Microsoft.VisualStudio.LanguageServices.Blazor.csproj
new file mode 100644
index 0000000000..21fb0f988b
--- /dev/null
+++ b/tooling/Microsoft.VisualStudio.LanguageServices.Blazor/Microsoft.VisualStudio.LanguageServices.Blazor.csproj
@@ -0,0 +1,15 @@
+
+
+
+ net461
+
+
+
+
+ AngleSharpBuild
+ False
+ TargetFramework=netcoreapp2.0
+ false
+
+
+