From c4b0af0ed034e18198afad449ffa9bd82ff5e9c2 Mon Sep 17 00:00:00 2001 From: Mattias Karlsson Date: Tue, 23 Nov 2021 23:40:29 +0100 Subject: [PATCH 1/4] (GH-148) Use Cake Scripting Conventions * fixes #148 --- .../CodeGen/CakeScriptGenerator.cs | 51 ++----------------- 1 file changed, 5 insertions(+), 46 deletions(-) diff --git a/src/Cake.Scripting/CodeGen/CakeScriptGenerator.cs b/src/Cake.Scripting/CodeGen/CakeScriptGenerator.cs index a6eedfa..4108666 100644 --- a/src/Cake.Scripting/CodeGen/CakeScriptGenerator.cs +++ b/src/Cake.Scripting/CodeGen/CakeScriptGenerator.cs @@ -39,9 +39,9 @@ public sealed class CakeScriptGenerator : IScriptGenerationService private readonly IBufferedFileSystem _fileSystem; private readonly IScriptAliasFinder _aliasFinder; private readonly ICakeAliasGenerator _aliasGenerator; + private readonly IScriptConventions _scriptConventions; private readonly DirectoryPath _addinRoot; private readonly ScriptHost _hostObject; - private readonly Lazy> _defaultReferences; public CakeScriptGenerator( IBufferedFileSystem fileSystem, @@ -52,6 +52,7 @@ public CakeScriptGenerator( IScriptAliasFinder aliasFinder, ICakeAliasGenerator aliasGenerator, ICakeLog log, + IScriptConventions scriptConventions, IEnumerable loadDirectiveProviders = null) { _fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem)); @@ -63,10 +64,10 @@ public CakeScriptGenerator( _aliasFinder = aliasFinder ?? throw new ArgumentNullException(nameof(aliasFinder)); _aliasGenerator = aliasGenerator ?? throw new ArgumentNullException(nameof(aliasGenerator)); _analyzer = new ScriptAnalyzer(_fileSystem, _environment, _log, loadDirectiveProviders); + _scriptConventions = scriptConventions ?? throw new ArgumentNullException(nameof(scriptConventions)); _addinRoot = GetAddinPath(_environment.WorkingDirectory); _hostObject = GetHostObject(); - _defaultReferences = new Lazy>(GetDefaultReferences); } public CakeScript Generate(FileChange fileChange) @@ -111,7 +112,7 @@ public CakeScript Generate(FileChange fileChange) // Load all references. _log.Verbose("Adding references..."); - var references = new HashSet(_defaultReferences.Value); + var references = new HashSet(_scriptConventions.GetDefaultAssemblies(_environment.ApplicationRoot).Select(a => FilePath.FromString(a.Location))); references.AddRange(result.References.Select(r => new FilePath(r))); // Find aliases @@ -128,7 +129,7 @@ public CakeScript Generate(FileChange fileChange) // Import all namespaces. _log.Verbose("Importing namespaces..."); var namespaces = new HashSet(result.Namespaces, StringComparer.Ordinal); - namespaces.AddRange(GetDefaultNamespaces()); + namespaces.AddRange(_scriptConventions.GetDefaultNamespaces()); namespaces.AddRange(aliases.SelectMany(alias => alias.Namespaces)); // Create the response. @@ -165,48 +166,6 @@ private void HandleFileChange(FilePath path, FileChange fileChange) _fileSystem.UpdateFileBuffer(path, fileChange.Buffer); } - // TODO: Move to conventions - private IEnumerable GetDefaultNamespaces() - { - return new List - { - "System", - "System.Collections.Generic", - "System.Linq", - "System.Text", - "System.Threading.Tasks", - "System.IO", - "Cake.Core", - "Cake.Core.IO", - "Cake.Core.Scripting", - "Cake.Core.Diagnostics" - }; - } - - private ISet GetDefaultReferences() - { - // Prepare the default assemblies. - var references = new HashSet(); - references.Add(typeof(Action).GetTypeInfo().Assembly.Location); // mscorlib or System.Private.Core - references.Add(typeof(IQueryable).GetTypeInfo().Assembly.Location); // System.Core or System.Linq.Expressions - - references.Add(typeof(IScriptHost).Assembly.Location); // Cake.Core - references.Add(typeof(EnvironmentAliases).Assembly.Location); // Cake.Common - - references.Add(typeof(Uri).GetTypeInfo().Assembly.Location); // System - references.Add(typeof(Enumerable).GetTypeInfo().Assembly.Location); // System.Linq - references.Add(typeof(XmlReader).GetTypeInfo().Assembly.Location); // System.Xml - references.Add(typeof(XDocument).GetTypeInfo().Assembly.Location); // System.Xml.Linq - references.Add(typeof(DataTable).GetTypeInfo().Assembly.Location); // System.Data - references.Add(typeof(ZipArchive).GetTypeInfo().Assembly.Location); // System.IO.Compression - references.Add(typeof(ZipFile).GetTypeInfo().Assembly.Location); // System.IO.Compression.FileSystem - references.Add(typeof(HttpClient).GetTypeInfo().Assembly.Location); // System.Net.Http - references.Add(typeof(DataContractJsonSerializer).GetTypeInfo().Assembly.Location); // System.Runtime.Serialization - - // Return the assemblies. - return references; - } - private static ScriptHost GetHostObject() { return new ScriptHost From bd4f04c3ce7f660104412fb2a5034b9d683f85e7 Mon Sep 17 00:00:00 2001 From: Mattias Karlsson Date: Wed, 24 Nov 2021 15:56:46 +0100 Subject: [PATCH 2/4] (GH-148) Also use Basic.Reference.Assemblies * fixes #148 --- src/Cake.Scripting/Cake.Scripting.csproj | 1 + .../CodeGen/CakeScriptGenerator.cs | 10 ++++- .../Polyfill/IReferenceAssemblyResolver.cs | 19 ++++++++ .../Reflection/ReferenceAssemblyResolver.cs | 43 +++++++++++++++++++ src/Cake.Scripting/ScriptingModule.cs | 2 + 5 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 src/Cake.Scripting/Polyfill/IReferenceAssemblyResolver.cs create mode 100644 src/Cake.Scripting/Reflection/ReferenceAssemblyResolver.cs diff --git a/src/Cake.Scripting/Cake.Scripting.csproj b/src/Cake.Scripting/Cake.Scripting.csproj index 7782b09..4987fa7 100644 --- a/src/Cake.Scripting/Cake.Scripting.csproj +++ b/src/Cake.Scripting/Cake.Scripting.csproj @@ -15,6 +15,7 @@ + diff --git a/src/Cake.Scripting/CodeGen/CakeScriptGenerator.cs b/src/Cake.Scripting/CodeGen/CakeScriptGenerator.cs index 4108666..c3efa6b 100644 --- a/src/Cake.Scripting/CodeGen/CakeScriptGenerator.cs +++ b/src/Cake.Scripting/CodeGen/CakeScriptGenerator.cs @@ -40,6 +40,7 @@ public sealed class CakeScriptGenerator : IScriptGenerationService private readonly IScriptAliasFinder _aliasFinder; private readonly ICakeAliasGenerator _aliasGenerator; private readonly IScriptConventions _scriptConventions; + private readonly IReferenceAssemblyResolver _referenceAssemblyResolver; private readonly DirectoryPath _addinRoot; private readonly ScriptHost _hostObject; @@ -53,6 +54,7 @@ public CakeScriptGenerator( ICakeAliasGenerator aliasGenerator, ICakeLog log, IScriptConventions scriptConventions, + IReferenceAssemblyResolver referenceAssemblyResolver, IEnumerable loadDirectiveProviders = null) { _fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem)); @@ -65,6 +67,7 @@ public CakeScriptGenerator( _aliasGenerator = aliasGenerator ?? throw new ArgumentNullException(nameof(aliasGenerator)); _analyzer = new ScriptAnalyzer(_fileSystem, _environment, _log, loadDirectiveProviders); _scriptConventions = scriptConventions ?? throw new ArgumentNullException(nameof(scriptConventions)); + _referenceAssemblyResolver = referenceAssemblyResolver ?? throw new ArgumentNullException(nameof(referenceAssemblyResolver)); _addinRoot = GetAddinPath(_environment.WorkingDirectory); _hostObject = GetHostObject(); @@ -112,7 +115,12 @@ public CakeScript Generate(FileChange fileChange) // Load all references. _log.Verbose("Adding references..."); - var references = new HashSet(_scriptConventions.GetDefaultAssemblies(_environment.ApplicationRoot).Select(a => FilePath.FromString(a.Location))); + var references = new HashSet( + _scriptConventions + .GetDefaultAssemblies(_environment.ApplicationRoot) + .Union(_referenceAssemblyResolver.GetReferenceAssemblies()) + .Select(a => FilePath.FromString(a.Location))); + references.AddRange(result.References.Select(r => new FilePath(r))); // Find aliases diff --git a/src/Cake.Scripting/Polyfill/IReferenceAssemblyResolver.cs b/src/Cake.Scripting/Polyfill/IReferenceAssemblyResolver.cs new file mode 100644 index 0000000..675fcdf --- /dev/null +++ b/src/Cake.Scripting/Polyfill/IReferenceAssemblyResolver.cs @@ -0,0 +1,19 @@ +using System.Reflection; + +#pragma warning disable IDE0130 +// Temporary polyfill see https://github.com/cake-build/cake/pull/3715 +namespace Cake.Core.Scripting +#pragma warning restore IDE0130 +{ + /// + /// Represents a framework reference assembly resolver. + /// + public interface IReferenceAssemblyResolver + { + /// + /// Finds framwork reference assemblies. + /// + /// The resolved reference assemblies. + Assembly[] GetReferenceAssemblies(); + } +} \ No newline at end of file diff --git a/src/Cake.Scripting/Reflection/ReferenceAssemblyResolver.cs b/src/Cake.Scripting/Reflection/ReferenceAssemblyResolver.cs new file mode 100644 index 0000000..5524852 --- /dev/null +++ b/src/Cake.Scripting/Reflection/ReferenceAssemblyResolver.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Cake.Core.Diagnostics; +using Cake.Core.Scripting; + +namespace Cake.Scripting.Reflection +{ + public sealed class ReferenceAssemblyResolver : IReferenceAssemblyResolver + { + private readonly ICakeLog _log; + + public ReferenceAssemblyResolver(ICakeLog log) + { + _log = log; + } + + public Assembly[] GetReferenceAssemblies() + { + IEnumerable TryGetReferenceAssemblies() + { + foreach (var reference in Basic.Reference.Assemblies.Net60.All) + { + Assembly name; + try + { + name = Assembly.Load(System.IO.Path.GetFileNameWithoutExtension(reference.FilePath)); + } + catch (Exception ex) + { + _log.Debug(log => log("Failed to load {0}\r\n{1}", reference.FilePath, ex)); + continue; + } + + yield return name; + } + } + + return TryGetReferenceAssemblies().ToArray(); + } + } +} diff --git a/src/Cake.Scripting/ScriptingModule.cs b/src/Cake.Scripting/ScriptingModule.cs index 00453f5..6267eb3 100644 --- a/src/Cake.Scripting/ScriptingModule.cs +++ b/src/Cake.Scripting/ScriptingModule.cs @@ -10,6 +10,7 @@ using Cake.Scripting.CodeGen; using Cake.Scripting.CodeGen.Generators; using Cake.Scripting.IO; +using Cake.Scripting.Reflection; namespace Cake.Scripting { @@ -41,6 +42,7 @@ public void Register(ICakeContainerRegistrar registrar) registrar.RegisterType().As().Singleton(); registrar.RegisterType().As().Singleton(); registrar.RegisterType().As().Singleton(); + registrar.RegisterType().As().Singleton(); } } } From f63ec8311bf7d1598f091b9f1be0f3b9ed162546 Mon Sep 17 00:00:00 2001 From: Mattias Karlsson Date: Wed, 24 Nov 2021 19:24:28 +0100 Subject: [PATCH 3/4] Update src/Cake.Scripting/Cake.Scripting.csproj Co-authored-by: Sean Fausett --- src/Cake.Scripting/Cake.Scripting.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Cake.Scripting/Cake.Scripting.csproj b/src/Cake.Scripting/Cake.Scripting.csproj index 4987fa7..a7a6ba1 100644 --- a/src/Cake.Scripting/Cake.Scripting.csproj +++ b/src/Cake.Scripting/Cake.Scripting.csproj @@ -15,7 +15,7 @@ - + From c00ca7356a1c90e6a0b73c8f5abf7d945053ec24 Mon Sep 17 00:00:00 2001 From: Mattias Karlsson Date: Wed, 24 Nov 2021 08:56:03 +0100 Subject: [PATCH 4/4] Add GitHub Actions & Remove Bitrise Badges --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 20b1e5a..2df79e6 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,17 @@ # Bakery + [![NuGet](https://img.shields.io/nuget/v/Cake.Bakery.svg)](https://www.nuget.org/packages/Cake.Bakery) [![MyGet](https://img.shields.io/myget/cake/vpre/Cake.Bakery.svg?label=myget)](https://www.myget.org/gallery/cake) -Cake server for code generation and script analysis +Cake server for code generation and script analysis, used for i.e. intellisense support in Visual Studio Code. ## Build Status -|Build server|Platform|Develop|Master| -|:--:|:--:|:--:|:--:| -|AppVeyor|Windows|[![Build status](https://ci.appveyor.com/api/projects/status/ayjo26v8rbhp2eqt/branch/develop?svg=true)](https://ci.appveyor.com/project/cakebuild/bakery/branch/develop)|[![Build status](https://ci.appveyor.com/api/projects/status/ayjo26v8rbhp2eqt/branch/develop?svg=true)](https://ci.appveyor.com/project/cakebuild/bakery/branch/master)| -|Bitrise|OS X|[![Build Status](https://www.bitrise.io/app/000857f04ffa750e/status.svg?token=B72wRhe84cgWLCI5k_dgNw&branch=develop)](https://www.bitrise.io/app/000857f04ffa750e)|[![Build Status](https://www.bitrise.io/app/000857f04ffa750e/status.svg?token=B72wRhe84cgWLCI5k_dgNw&branch=master)](https://www.bitrise.io/app/000857f04ffa750e)| -|Bitrise|Linux|[![Build Status](https://www.bitrise.io/app/704fc45fd74ac20f/status.svg?token=TnnmPBUFK5KISi5WhME5MQ&branch=develop)](https://www.bitrise.io/app/704fc45fd74ac20f)|[![Build Status](https://www.bitrise.io/app/704fc45fd74ac20f/status.svg?token=TnnmPBUFK5KISi5WhME5MQ&branch=master)](https://www.bitrise.io/app/704fc45fd74ac20f)| +| Build server | Platform | Develop| Master | +|-------------------|:-------------:|:------:|:------:| +| AppVeyor | Windows | [![Build status](https://ci.appveyor.com/api/projects/status/ayjo26v8rbhp2eqt/branch/develop?svg=true)](https://ci.appveyor.com/project/cakebuild/bakery/branch/develop) | [![Build status](https://ci.appveyor.com/api/projects/status/ayjo26v8rbhp2eqt/branch/develop?svg=true)](https://ci.appveyor.com/project/cakebuild/bakery/branch/master)| +| GitHub Actions | Windows | [![Build status](https://github.com/cake-build/bakery/actions/workflows/build.yml/badge.svg?branch=develop)](https://github.com/cake-build/bakery/actions/workflows/build.yml) | [![Build status](https://github.com/cake-build/bakery/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/cake-build/bakery/actions/workflows/build.yml) | +| GitHub Actions | macOS / Linux | [![Posix Build status](https://github.com/cake-build/bakery/actions/workflows/posixbuild.yml/badge.svg?branch=develop)](https://github.com/cake-build/bakery/actions/workflows/posixbuild.yml) | [![Posix Build status](https://github.com/cake-build/bakery/actions/workflows/posixbuild.yml/badge.svg?branch=master)](https://github.com/cake-build/bakery/actions/workflows/posixbuild.yml) | ## Code of Conduct