commit ec67a11287cf2e52abf9ccef66008f15f135f6a8 Author: Zoe Roux Date: Wed Mar 17 14:56:38 2021 +0100 Adding expression rewrites diff --git a/.idea/.idea.DotExperiments/.idea/.gitignore b/.idea/.idea.DotExperiments/.idea/.gitignore new file mode 100644 index 0000000..f61c3ff --- /dev/null +++ b/.idea/.idea.DotExperiments/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/modules.xml +/.idea.DotExperiments.iml +/contentModel.xml +/projectSettingsUpdater.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/.idea.DotExperiments/.idea/encodings.xml b/.idea/.idea.DotExperiments/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.DotExperiments/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.DotExperiments/.idea/indexLayout.xml b/.idea/.idea.DotExperiments/.idea/indexLayout.xml new file mode 100644 index 0000000..27ba142 --- /dev/null +++ b/.idea/.idea.DotExperiments/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.DotExperiments/.idea/riderModule.iml b/.idea/.idea.DotExperiments/.idea/riderModule.iml new file mode 100644 index 0000000..1a4e0d9 --- /dev/null +++ b/.idea/.idea.DotExperiments/.idea/riderModule.iml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.DotExperiments/.idea/vcs.xml b/.idea/.idea.DotExperiments/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/.idea.DotExperiments/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/DotExperiments.csproj b/DotExperiments.csproj new file mode 100644 index 0000000..94205a2 --- /dev/null +++ b/DotExperiments.csproj @@ -0,0 +1,11 @@ + + + + net5.0 + + + + + + + diff --git a/DotExperiments.sln b/DotExperiments.sln new file mode 100644 index 0000000..7774fca --- /dev/null +++ b/DotExperiments.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotExperiments", "DotExperiments.csproj", "{FB46BB47-A1DB-44CD-9FAF-50BD6E533008}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FB46BB47-A1DB-44CD-9FAF-50BD6E533008}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB46BB47-A1DB-44CD-9FAF-50BD6E533008}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB46BB47-A1DB-44CD-9FAF-50BD6E533008}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB46BB47-A1DB-44CD-9FAF-50BD6E533008}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/DotExperiments/.idea/.idea.DotExperiments/.idea/contentModel.xml b/DotExperiments/.idea/.idea.DotExperiments/.idea/contentModel.xml new file mode 100644 index 0000000..5d12d71 --- /dev/null +++ b/DotExperiments/.idea/.idea.DotExperiments/.idea/contentModel.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/DotExperiments/.idea/.idea.DotExperiments/.idea/indexLayout.xml b/DotExperiments/.idea/.idea.DotExperiments/.idea/indexLayout.xml new file mode 100644 index 0000000..27ba142 --- /dev/null +++ b/DotExperiments/.idea/.idea.DotExperiments/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/DotExperiments/.idea/.idea.DotExperiments/.idea/modules.xml b/DotExperiments/.idea/.idea.DotExperiments/.idea/modules.xml new file mode 100644 index 0000000..a03715a --- /dev/null +++ b/DotExperiments/.idea/.idea.DotExperiments/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/DotExperiments/.idea/.idea.DotExperiments/.idea/projectSettingsUpdater.xml b/DotExperiments/.idea/.idea.DotExperiments/.idea/projectSettingsUpdater.xml new file mode 100644 index 0000000..4bb9f4d --- /dev/null +++ b/DotExperiments/.idea/.idea.DotExperiments/.idea/projectSettingsUpdater.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/DotExperiments/.idea/.idea.DotExperiments/.idea/riderModule.iml b/DotExperiments/.idea/.idea.DotExperiments/.idea/riderModule.iml new file mode 100644 index 0000000..1a4e0d9 --- /dev/null +++ b/DotExperiments/.idea/.idea.DotExperiments/.idea/riderModule.iml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/DotExperiments/.idea/.idea.DotExperiments/.idea/vcs.xml b/DotExperiments/.idea/.idea.DotExperiments/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/DotExperiments/.idea/.idea.DotExperiments/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/DotExperiments/.idea/.idea.DotExperiments/.idea/workspace.xml b/DotExperiments/.idea/.idea.DotExperiments/.idea/workspace.xml new file mode 100644 index 0000000..2b38d03 --- /dev/null +++ b/DotExperiments/.idea/.idea.DotExperiments/.idea/workspace.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 1615988517462 + + + + + + + + + + + + + \ No newline at end of file diff --git a/Expressions/ExpressionConverter.cs b/Expressions/ExpressionConverter.cs new file mode 100644 index 0000000..1152478 --- /dev/null +++ b/Expressions/ExpressionConverter.cs @@ -0,0 +1,62 @@ +using System; +using System.Linq; +using System.Linq.Expressions; +using JetBrains.Annotations; + +namespace DotExperiments +{ + public static class ExpressionUtility + { + public static Expression Convert([CanBeNull] this Expression expr) + where T : Delegate + { + Expression e = expr switch + { + null => null, + LambdaExpression lambda => new ExpressionConverter(lambda).VisitAndConvert(), + _ => throw new ArgumentException("Can't convert a non lambda.") + }; + + return ExpressionRewrite.Rewrite(e); + } + + private class ExpressionConverter : ExpressionVisitor + where TTo : Delegate + { + private readonly LambdaExpression _expression; + private readonly ParameterExpression[] _newParams; + + internal ExpressionConverter(LambdaExpression expression) + { + _expression = expression; + + Type[] paramTypes = typeof(TTo).GetGenericArguments()[..^1]; + if (paramTypes.Length != _expression.Parameters.Count) + throw new ArgumentException("Parameter count from internal and external lambda are not matched."); + + _newParams = new ParameterExpression[paramTypes.Length]; + for (int i = 0; i < paramTypes.Length; i++) + { + if (_expression.Parameters[i].Type == paramTypes[i]) + _newParams[i] = _expression.Parameters[i]; + else + _newParams[i] = Expression.Parameter(paramTypes[i], _expression.Parameters[i].Name); + } + } + + internal Expression VisitAndConvert() + { + Type returnType = _expression.Type.GetGenericArguments().Last(); + Expression body = _expression.ReturnType == returnType + ? Visit(_expression.Body) + : Expression.Convert(Visit(_expression.Body)!, returnType); + return Expression.Lambda(body!, _newParams); + } + + protected override Expression VisitParameter(ParameterExpression node) + { + return _newParams.FirstOrDefault(x => x.Name == node.Name) ?? node; + } + } + } +} diff --git a/Expressions/ExpressionRewrite.cs b/Expressions/ExpressionRewrite.cs new file mode 100644 index 0000000..f9ccdf4 --- /dev/null +++ b/Expressions/ExpressionRewrite.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace DotExperiments +{ + public class ExpressionRewriteAttribute : Attribute + { + public string Link { get; } + public string Inner { get; } + + public ExpressionRewriteAttribute(string link, string inner = null) + { + Link = link; + Inner = inner; + } + } + + public class ExpressionRewrite : ExpressionVisitor + { + private string _inner; + private readonly List<(string inner, ParameterExpression param, ParameterExpression newParam)> _innerRewrites; + + private ExpressionRewrite() + { + _innerRewrites = new List<(string, ParameterExpression, ParameterExpression)>(); + } + + public static Expression Rewrite(Expression expression) + { + return new ExpressionRewrite().Visit(expression); + } + + public static Expression Rewrite(Expression expression) where T : Delegate + { + return (Expression)new ExpressionRewrite().Visit(expression); + } + + protected override Expression VisitMember(MemberExpression node) + { + (string inner, _, ParameterExpression p) = _innerRewrites.FirstOrDefault(x => x.param == node.Expression); + if (inner != null) + { + Expression param = inner.Split('.').Aggregate(p, Expression.Property); + node = Expression.Property(param, node.Member.Name); + } + + // Can't use node.Member directly because we want to support attribute override + MemberInfo member = node.Expression!.Type.GetProperty(node.Member.Name) ?? node.Member; + ExpressionRewriteAttribute attr = member!.GetCustomAttribute(); + if (attr == null) + return base.VisitMember(node); + + Expression property = attr.Link.Split('.').Aggregate(node.Expression, Expression.Property); + if (property is MemberExpression expr) + Visit(expr.Expression); + _inner = attr.Inner; + return property!; + } + + protected override Expression VisitLambda(Expression node) + { + (_, ParameterExpression oldParam, ParameterExpression param) = _innerRewrites + .FirstOrDefault(x => node.Parameters.Any(y => y == x.param)); + if (param == null) + return base.VisitLambda(node); + + ParameterExpression[] newParams = node.Parameters.Where(x => x != oldParam).Append(param).ToArray(); + return Expression.Lambda(Visit(node.Body)!, newParams); + } + + protected override Expression VisitMethodCall(MethodCallExpression node) + { + int count = node.Arguments.Count; + if (node.Object != null) + count++; + if (count != 2) + return base.VisitMethodCall(node); + + Expression instance = node.Object ?? node.Arguments.First(); + Expression argument = node.Object != null + ? node.Arguments.First() + : node.Arguments[1]; + + Type oldType = instance.Type; + instance = Visit(instance); + if (instance!.Type == oldType) + return base.VisitMethodCall(node); + + if (_inner != null && argument is LambdaExpression lambda) + { + // TODO this type handler will usually work with IEnumerable & others but won't work with everything. + Type type = oldType.GetGenericArguments().First(); + ParameterExpression oldParam = lambda.Parameters.FirstOrDefault(x => x.Type == type); + if (oldParam != null) + { + Type newType = instance.Type.GetGenericArguments().First(); + ParameterExpression newParam = Expression.Parameter(newType, oldParam.Name); + _innerRewrites.Add((_inner, oldParam, newParam)); + } + } + argument = Visit(argument); + + // TODO this method handler may not work for some methods (ex: method taking a Fun<> method won't have good generic arguments) + MethodInfo method = node.Method.IsGenericMethod + ? node.Method.GetGenericMethodDefinition().MakeGenericMethod(instance.Type.GetGenericArguments()) + : node.Method; + return node.Object != null + ? Expression.Call(instance, method!, argument) + : Expression.Call(null, method!, instance, argument!); + } + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..e0b8aa3 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# DotExperiment + +Dot experiments is a list of over engineered functions in dotnet. + +## Expressions + +A set of functions to convert and rewrite expressions. This allow users to transform expression's parameters & return type and rewrite accessors. + +Expression Convertor Usage: +```csharp +Expression> func = x => x > 100; +Expression> converted = ExpressionUtility.Convert>(func); +``` + +Expression Rewrite Usage: +```csharp +public class Parent +{ + public ICollection GenreLinks { get; set; } + + [ExpressionRewrite(nameof(GenreLinks), nameof(GenreLink.Genre))] + public ICollection Genres + { + get => GenreLinks?.Select(x => x.Genre); + set => GenreLinks = value?.Select(x => new GenreLink(this, x)).ToList(); + } +} + +public class Genre +{ + public bool Enabled { get; set; } +} + +public class GenreLink +{ + public Parent Parent { get ; set; } + public Genre Genre { get; set; } + + public GenreLink(Parent parent, Genre genre) + { + Parent = parent; + Genre = genre; + } +} + +Expression>> = x => x.Genres.Any(y => y.Enabled); +Expession rewrited = Expression.ExpressionRewrite(expression); +// rewrited contains: x => x.GenreLinks.Any(y => y.Genre.Enabled); +``` \ No newline at end of file diff --git a/obj/Debug/net5.0/.NETCoreApp,Version=v5.0.AssemblyAttributes.cs b/obj/Debug/net5.0/.NETCoreApp,Version=v5.0.AssemblyAttributes.cs new file mode 100644 index 0000000..614107e --- /dev/null +++ b/obj/Debug/net5.0/.NETCoreApp,Version=v5.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v5.0", FrameworkDisplayName = "")] diff --git a/obj/Debug/net5.0/DotExperiments.AssemblyInfo.cs b/obj/Debug/net5.0/DotExperiments.AssemblyInfo.cs new file mode 100644 index 0000000..1384bf4 --- /dev/null +++ b/obj/Debug/net5.0/DotExperiments.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("DotExperiments")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("DotExperiments")] +[assembly: System.Reflection.AssemblyTitleAttribute("DotExperiments")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/obj/Debug/net5.0/DotExperiments.AssemblyInfoInputs.cache b/obj/Debug/net5.0/DotExperiments.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d80c333 --- /dev/null +++ b/obj/Debug/net5.0/DotExperiments.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6578c792ece403e10aaf157c3825244f5d0ac4ef diff --git a/obj/Debug/net5.0/DotExperiments.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net5.0/DotExperiments.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..d7e2983 --- /dev/null +++ b/obj/Debug/net5.0/DotExperiments.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,8 @@ +is_global = true +build_property.TargetFramework = net5.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.PublishSingleFile = +build_property.IncludeAllContentForSelfExtract = +build_property._SupportedPlatformList = Android,iOS,Linux,macOS,Windows diff --git a/obj/Debug/net5.0/DotExperiments.assets.cache b/obj/Debug/net5.0/DotExperiments.assets.cache new file mode 100644 index 0000000..45f6606 Binary files /dev/null and b/obj/Debug/net5.0/DotExperiments.assets.cache differ diff --git a/obj/Debug/net5.0/DotExperiments.csprojAssemblyReference.cache b/obj/Debug/net5.0/DotExperiments.csprojAssemblyReference.cache new file mode 100644 index 0000000..2843456 Binary files /dev/null and b/obj/Debug/net5.0/DotExperiments.csprojAssemblyReference.cache differ diff --git a/obj/DotExperiments.csproj.nuget.dgspec.json b/obj/DotExperiments.csproj.nuget.dgspec.json new file mode 100644 index 0000000..ca66082 --- /dev/null +++ b/obj/DotExperiments.csproj.nuget.dgspec.json @@ -0,0 +1,72 @@ +{ + "format": 1, + "restore": { + "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj": {} + }, + "projects": { + "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj", + "projectName": "DotExperiments", + "projectPath": "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj", + "packagesPath": "/home/anonymus-raccoon/.nuget/packages/", + "outputPath": "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/anonymus-raccoon/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net5.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net5.0": { + "targetAlias": "net5.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net5.0": { + "targetAlias": "net5.0", + "dependencies": { + "JetBrains.Annotations": { + "target": "Package", + "version": "[2020.3.0, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[5.0.0, 5.0.0]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/5.0.201/RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/obj/DotExperiments.csproj.nuget.g.props b/obj/DotExperiments.csproj.nuget.g.props new file mode 100644 index 0000000..c834584 --- /dev/null +++ b/obj/DotExperiments.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /home/anonymus-raccoon/.nuget/packages/ + /home/anonymus-raccoon/.nuget/packages/ + PackageReference + 5.8.0 + + + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + \ No newline at end of file diff --git a/obj/DotExperiments.csproj.nuget.g.targets b/obj/DotExperiments.csproj.nuget.g.targets new file mode 100644 index 0000000..53cfaa1 --- /dev/null +++ b/obj/DotExperiments.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + \ No newline at end of file diff --git a/obj/project.assets.json b/obj/project.assets.json new file mode 100644 index 0000000..a77a5f6 --- /dev/null +++ b/obj/project.assets.json @@ -0,0 +1,112 @@ +{ + "version": 3, + "targets": { + "net5.0": { + "JetBrains.Annotations/2020.3.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/JetBrains.Annotations.dll": {} + }, + "runtime": { + "lib/netstandard2.0/JetBrains.Annotations.dll": {} + } + } + } + }, + "libraries": { + "JetBrains.Annotations/2020.3.0": { + "sha512": "FnX06vtxuoZnhZdR6UHt5kJ7HUC/syODfGLnhPDn1x5sXvvepNyCl4jMtPUzJfsPWh7q0Jo+AIYz5xaVbbyikA==", + "type": "package", + "path": "jetbrains.annotations/2020.3.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "icon.png", + "jetbrains.annotations.2020.3.0.nupkg.sha512", + "jetbrains.annotations.nuspec", + "lib/net20/JetBrains.Annotations.dll", + "lib/net20/JetBrains.Annotations.xml", + "lib/netstandard1.0/JetBrains.Annotations.deps.json", + "lib/netstandard1.0/JetBrains.Annotations.dll", + "lib/netstandard1.0/JetBrains.Annotations.xml", + "lib/netstandard2.0/JetBrains.Annotations.deps.json", + "lib/netstandard2.0/JetBrains.Annotations.dll", + "lib/netstandard2.0/JetBrains.Annotations.xml", + "lib/portable40-net40+sl5+win8+wp8+wpa81/JetBrains.Annotations.dll", + "lib/portable40-net40+sl5+win8+wp8+wpa81/JetBrains.Annotations.xml" + ] + } + }, + "projectFileDependencyGroups": { + "net5.0": [ + "JetBrains.Annotations >= 2020.3.0" + ] + }, + "packageFolders": { + "/home/anonymus-raccoon/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj", + "projectName": "DotExperiments", + "projectPath": "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj", + "packagesPath": "/home/anonymus-raccoon/.nuget/packages/", + "outputPath": "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/anonymus-raccoon/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net5.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net5.0": { + "targetAlias": "net5.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net5.0": { + "targetAlias": "net5.0", + "dependencies": { + "JetBrains.Annotations": { + "target": "Package", + "version": "[2020.3.0, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[5.0.0, 5.0.0]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/5.0.201/RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache new file mode 100644 index 0000000..5b292fd --- /dev/null +++ b/obj/project.nuget.cache @@ -0,0 +1,11 @@ +{ + "version": 2, + "dgSpecHash": "TZ/lo70fwlMcZSdro2yXAU3eCKzcvh30saL/a5culOGYgmYHy/9ylZJTi8NHW6YJKb33mZy3Xc2lb0OQ1gSsPg==", + "success": true, + "projectFilePath": "/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj", + "expectedPackageFiles": [ + "/home/anonymus-raccoon/.nuget/packages/jetbrains.annotations/2020.3.0/jetbrains.annotations.2020.3.0.nupkg.sha512", + "/home/anonymus-raccoon/.nuget/packages/microsoft.aspnetcore.app.ref/5.0.0/microsoft.aspnetcore.app.ref.5.0.0.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/obj/project.packagespec.json b/obj/project.packagespec.json new file mode 100644 index 0000000..3a91fe1 --- /dev/null +++ b/obj/project.packagespec.json @@ -0,0 +1 @@ +"version":"1.0.0","restore":{"projectUniqueName":"/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj","projectName":"DotExperiments","projectPath":"/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/DotExperiments.csproj","outputPath":"/home/anonymus-raccoon/Projects/Kyoo/DotExperiments/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["net5.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net5.0":{"targetAlias":"net5.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]}}"frameworks":{"net5.0":{"targetAlias":"net5.0","dependencies":{"JetBrains.Annotations":{"target":"Package","version":"[2020.3.0, )"}},"imports":["net461","net462","net47","net471","net472","net48"],"assetTargetFallback":true,"warn":true,"downloadDependencies":[{"name":"Microsoft.AspNetCore.App.Ref","version":"[5.0.0, 5.0.0]"}],"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/share/dotnet/sdk/5.0.201/RuntimeIdentifierGraph.json"}} \ No newline at end of file diff --git a/obj/rider.project.restore.info b/obj/rider.project.restore.info new file mode 100644 index 0000000..9dd7430 --- /dev/null +++ b/obj/rider.project.restore.info @@ -0,0 +1 @@ +16159886511185361 \ No newline at end of file