diff --git a/source/Cosmos.Build.Tasks/.editorconfig b/source/Cosmos.Build.Tasks/.editorconfig
new file mode 100644
index 000000000..930c4915a
--- /dev/null
+++ b/source/Cosmos.Build.Tasks/.editorconfig
@@ -0,0 +1,2 @@
+[*]
+indent_size = 4
diff --git a/source/Cosmos.Build.Tasks/build/Cosmos.Build.targets b/source/Cosmos.Build.Tasks/build/Cosmos.Build.targets
index e5b054fa7..70171108d 100644
--- a/source/Cosmos.Build.Tasks/build/Cosmos.Build.targets
+++ b/source/Cosmos.Build.Tasks/build/Cosmos.Build.targets
@@ -1,132 +1,130 @@
-
- $(AppData)\Cosmos User Kit
- $(CosmosDir)\Kernel\
-
+
+ $(AppData)\Cosmos User Kit
+ $(CosmosDir)\Kernel\
+
-
- $(OutputPath)$(AssemblyName).bin
- $(OutputPath)$(AssemblyName).iso
-
+
+ $(OutputPath)$(AssemblyName).bin
+ $(OutputPath)$(AssemblyName).iso
+
-
- $(MSBuildThisFileDirectory)..\tools\
+
+ $(MSBuildThisFileDirectory)..\tools\
- $(CosmosToolsPath)nasm\
- nasm.exe
+ $(CosmosToolsPath)nasm\
+ nasm.exe
- $(CosmosToolsPath)cygwin\
- ld.exe
+ $(CosmosToolsPath)cygwin\
+ ld.exe
- $(CosmosToolsPath)cygwin\
- objdump.exe
+ $(CosmosToolsPath)cygwin\
+ objdump.exe
- $(CosmosToolsPath)mkisofs\
- mkisofs.exe
-
+ $(CosmosToolsPath)mkisofs\
+ mkisofs.exe
+
-
- $(OutputPath)$(AssemblyName).asm
+
+ $(OutputPath)$(AssemblyName).asm
- $(OutputPath)$(AssemblyName).obj
- $(OutputPath)$(AssemblyName).bin
- Bin
+ $(OutputPath)$(AssemblyName).obj
+ $(OutputPath)$(AssemblyName).bin
+ Bin
- <_NasmMap>$([System.IO.Path]::GetDirectoryName('$(NasmOutput)'))\main.map
+ <_NasmMap>$([System.IO.Path]::GetDirectoryName('$(NasmOutput)'))\main.map
- $(OutputPath)$(AssemblyName).map
- $(OutputPath)$(AssemblyName).cdb
+ $(OutputPath)$(AssemblyName).map
+ $(OutputPath)$(AssemblyName).cdb
- $(OutputPath)ISO\
- $(CosmosToolsPath)isolinux\
-
+ $(OutputPath)ISO\
+ $(CosmosToolsPath)isolinux\
+
-
- $(CosmosToolsPath)Cosmos.Build.Tasks.dll
-
+
+ $(CosmosToolsPath)Cosmos.Build.Tasks.dll
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
- FailIfRelease;
- TheRingMaster;
- IL2CPU;
- Nasm;
- Ld;
- ExtractMapFromElfFile;
- ReadNasmMapToDebugInfo;
- MakeIso
-
-
+
+
+ FailIfRelease;
+ TheRingMaster;
+ IL2CPU;
+ Nasm;
+ Ld;
+ ExtractMapFromElfFile;
+ ReadNasmMapToDebugInfo;
+ MakeIso
+
+
-
+
-
-
-
+
+
+
-
-
+
-
-
-
+
-
-
+
-
-
-
-
+
+
+
+
-
+
-
+
-
-
+
-
+
-
+
-
-
+
-
+
-
+
-
-
+
-
+
-
+
-
-
+
-
+
-
+
-
-
+
-
- <_ISOLINUX Include="$(ISOLINUX)**" />
-
+
+ <_ISOLINUX Include="$(ISOLINUX)**" />
+
-
+
-
+
-
+
-
+
-
+
-
- $(MSBuildExtensionsPath)\Cosmos\Cosmos.DesignTime.targets
-
+
+ $(MSBuildExtensionsPath)\Cosmos\Cosmos.DesignTime.targets
+
-
+
diff --git a/source/Cosmos.VS.ProjectSystem/Cosmos.VS.ProjectSystem.csproj b/source/Cosmos.VS.ProjectSystem/Cosmos.VS.ProjectSystem.csproj
index 9172e4510..817dcc40e 100644
--- a/source/Cosmos.VS.ProjectSystem/Cosmos.VS.ProjectSystem.csproj
+++ b/source/Cosmos.VS.ProjectSystem/Cosmos.VS.ProjectSystem.csproj
@@ -65,14 +65,13 @@
-
-
+
+
-
-
+
-
+
diff --git a/source/Cosmos.VS.ProjectSystem/ProjectSystem/VS/PlugsProjectTreeProvider.cs b/source/Cosmos.VS.ProjectSystem/ProjectSystem/VS/PlugsProjectTreeProvider.cs
new file mode 100644
index 000000000..64d0ad803
--- /dev/null
+++ b/source/Cosmos.VS.ProjectSystem/ProjectSystem/VS/PlugsProjectTreeProvider.cs
@@ -0,0 +1,122 @@
+using System;
+using System.ComponentModel.Composition;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Threading.Tasks.Dataflow;
+using Microsoft.VisualStudio.Imaging;
+using Microsoft.VisualStudio.ProjectSystem;
+using Microsoft.VisualStudio.ProjectSystem.Properties;
+
+namespace Cosmos.VS.ProjectSystem.VS
+{
+ [Export(ExportContractNames.ProjectTreeProviders.PhysicalViewRootGraft, typeof(IProjectTreeProvider))]
+ [AppliesTo(ProjectCapability.Cosmos)]
+ internal class PlugsProjectTreeProvider : ProjectTreeProviderBase
+ {
+ private static readonly ProjectImageMoniker ReferenceIcon = KnownMonikers.Reference.ToProjectSystemType();
+ private static readonly ProjectTreeFlags PlugsProjectTreeFlags = ProjectTreeFlags.Create(
+ ProjectTreeFlags.Common.BubbleUp | ProjectTreeFlags.Common.VirtualFolder);
+
+ private IDisposable _itemsSubscriptionLink;
+
+ [ImportingConstructor]
+ protected PlugsProjectTreeProvider(
+ IProjectThreadingService threadingService,
+ UnconfiguredProject unconfiguredProject)
+ : base(threadingService, unconfiguredProject)
+ {
+ }
+
+ protected override void Initialize()
+ {
+ base.Initialize();
+
+ SubmitTreeUpdateAsync(
+ (treeSnapshot, configuredProjectExports, cancellationToken) =>
+ {
+ return Task.FromResult(new TreeUpdateResult(CreatePlugsFolder(), true));
+ });
+
+ var subscriptionService = UnconfiguredProject.Services.ActiveConfiguredProjectSubscription;
+ var itemsBlock = subscriptionService.ProjectCatalogSource.SourceBlock;
+ var targetBlock = new ActionBlock>(ItemsChangedAsync);
+
+ _itemsSubscriptionLink = itemsBlock.LinkTo(
+ targetBlock, new DataflowLinkOptions() { PropagateCompletion = true });
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ _itemsSubscriptionLink?.Dispose();
+ }
+
+ base.Dispose(disposing);
+ }
+
+ protected override ConfiguredProjectExports GetActiveConfiguredProjectExports(
+ ConfiguredProject newActiveConfiguredProject)
+ {
+ return GetActiveConfiguredProjectExports(newActiveConfiguredProject);
+ }
+
+ private IProjectTree CreatePlugsFolder()
+ {
+ var caption = "Plugs";
+ var icon = KnownMonikers.Reference.ToProjectSystemType();
+ var flags = PlugsProjectTreeFlags;
+
+ return NewTree(caption, icon: ReferenceIcon, expandedIcon: ReferenceIcon, flags: PlugsProjectTreeFlags);
+ }
+
+ private Task ItemsChangedAsync(IProjectVersionedValue snapshot)
+ {
+ SubmitTreeUpdateAsync(
+ (treeSnapshot, configuredProjectExports, cancellationToken) =>
+ {
+ var dependenciesNode = treeSnapshot.Value.Tree;
+
+ if (!cancellationToken.IsCancellationRequested)
+ {
+ dependenciesNode = BuildTree(dependenciesNode, snapshot.Value, cancellationToken);
+ }
+
+ return Task.FromResult(new TreeUpdateResult(dependenciesNode, false));
+ });
+
+ return Task.CompletedTask;
+ }
+
+ private IProjectTree BuildTree(
+ IProjectTree oldTree,
+ IProjectCatalogSnapshot snapshot,
+ CancellationToken cancellationToken)
+ {
+ var tree = oldTree.ClearChildren();
+
+ foreach (var reference in snapshot.Project.Value.GetItems("PlugsReference"))
+ {
+ if (cancellationToken.IsCancellationRequested)
+ {
+ return oldTree;
+ }
+
+ tree = tree.Add(NewTree(reference.GetMetadataValue("Filename"),
+ icon: ReferenceIcon, flags: ProjectTreeFlags.ResolvedReference)).Parent;
+ }
+
+ return tree;
+ }
+
+ [Export]
+ protected class MyConfiguredProjectExports : ConfiguredProjectExports
+ {
+ [ImportingConstructor]
+ protected MyConfiguredProjectExports(ConfiguredProject configuredProject)
+ : base(configuredProject)
+ {
+ }
+ }
+ }
+}