Skip to content

Commit 316d9c7

Browse files
author
Chaowlert
committed
Separate expression translator & debugger
1 parent f2e286b commit 316d9c7

10 files changed

+110
-33
lines changed

ExpressionDebugger.sln

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExpressionDebugger.Tests",
99
EndProject
1010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExpressionDebugger.Console", "ExpressionDebugger.Console\ExpressionDebugger.Console.csproj", "{71E2EC60-6780-4AB8-9773-91B4939560FB}"
1111
EndProject
12+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExpressionTranslator", "ExpressionTranslator\ExpressionTranslator.csproj", "{9B67882F-BE07-45C9-9B86-FB33A8B4EA5B}"
13+
EndProject
1214
Global
1315
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1416
Debug|Any CPU = Debug|Any CPU
@@ -27,6 +29,10 @@ Global
2729
{71E2EC60-6780-4AB8-9773-91B4939560FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
2830
{71E2EC60-6780-4AB8-9773-91B4939560FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
2931
{71E2EC60-6780-4AB8-9773-91B4939560FB}.Release|Any CPU.Build.0 = Release|Any CPU
32+
{9B67882F-BE07-45C9-9B86-FB33A8B4EA5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
33+
{9B67882F-BE07-45C9-9B86-FB33A8B4EA5B}.Debug|Any CPU.Build.0 = Debug|Any CPU
34+
{9B67882F-BE07-45C9-9B86-FB33A8B4EA5B}.Release|Any CPU.ActiveCfg = Release|Any CPU
35+
{9B67882F-BE07-45C9-9B86-FB33A8B4EA5B}.Release|Any CPU.Build.0 = Release|Any CPU
3036
EndGlobalSection
3137
GlobalSection(SolutionProperties) = preSolution
3238
HideSolutionNode = FALSE

ExpressionDebugger/ExpressionDebugger.csproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<TargetFramework>netstandard2.0</TargetFramework>
55
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
66
<Authors>Chaowlert Chaisrichalermpol</Authors>
7-
<Description>Step into debugging and generate readable script from linq expressions</Description>
7+
<Description>Step into debugging from linq expressions</Description>
88
<PackageProjectUrl>https://github.com/chaowlert/ExpressionDebugger</PackageProjectUrl>
99
<RepositoryUrl>https://github.com/chaowlert/ExpressionDebugger</RepositoryUrl>
1010
<PackageTags>expression;linq;debug</PackageTags>
@@ -22,4 +22,7 @@
2222
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
2323
</ItemGroup>
2424

25+
<ItemGroup>
26+
<ProjectReference Include="..\ExpressionTranslator\ExpressionTranslator.csproj" />
27+
</ItemGroup>
2528
</Project>

ExpressionDebugger/ExpressionExtensions.cs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,12 @@
22
using System.Diagnostics;
33
using System.IO;
44
using System.Reflection;
5-
using System.Reflection.Emit;
6-
using System.Runtime;
7-
using System.Runtime.CompilerServices;
5+
using System.Collections.Generic;
86

97
namespace System.Linq.Expressions
108
{
119
public static class ExpressionExtensions
1210
{
13-
/// <summary>
14-
/// Generate script text
15-
/// </summary>
16-
/// <param name="node">Expression</param>
17-
/// <returns>Script text</returns>
18-
public static string ToScript(this Expression node, ExpressionDefinitions definitions = null)
19-
{
20-
var translator = new ExpressionTranslator(definitions);
21-
return translator.Translate(node);
22-
}
2311

2412
/// <summary>
2513
/// Compile with debugging info injected
@@ -48,7 +36,7 @@ public static Delegate CompileWithDebugInfo(this LambdaExpression node, Expressi
4836
var script = translator.Translate(node);
4937
var compiler = new ExpressionCompiler(options);
5038
compiler.AddFile(script, Path.ChangeExtension(Path.GetRandomFileName(), ".cs"));
51-
var references = translator.TypeNames.Select(it => it.Key.Assembly).ToHashSet();
39+
var references = new HashSet<Assembly>(translator.TypeNames.Select(it => it.Key.Assembly));
5240
if (options.References != null)
5341
references.UnionWith(options.References);
5442
references.Add(typeof(object).Assembly);

ExpressionDebugger/Extensions.cs

Lines changed: 0 additions & 15 deletions
This file was deleted.

ExpressionDebugger/ExpressionTranslator.cs renamed to ExpressionTranslator/ExpressionTranslator.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
22
using System.Collections.Generic;
3+
#if !NETSTANDARD1_3
34
using System.Dynamic;
5+
#endif
46
using System.IO;
57
using System.Linq;
68
using System.Linq.Expressions;
@@ -418,11 +420,18 @@ private string Translate(Type type)
418420
return "ushort";
419421
if (type == typeof(void))
420422
return "void";
421-
if (type.IsNotPublic || typeof(IDynamicMetaObjectProvider).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo()))
423+
if (type.GetTypeInfo().IsNotPublic)
422424
{
423425
HasDynamic = true;
424426
return "dynamic";
425427
}
428+
#if !NETSTANDARD1_3
429+
if (typeof(IDynamicMetaObjectProvider).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo()))
430+
{
431+
HasDynamic = true;
432+
return "dynamic";
433+
}
434+
#endif
426435

427436
if (type.IsArray)
428437
{
@@ -813,6 +822,7 @@ protected override Expression VisitDefault(DefaultExpression node)
813822
return node;
814823
}
815824

825+
#if !NETSTANDARD1_3
816826
private static Expression Update(DynamicExpression node, IEnumerable<Expression> args)
817827
{
818828
// ReSharper disable PossibleMultipleEnumeration
@@ -904,6 +914,7 @@ protected override Expression VisitDynamic(DynamicExpression node)
904914
var dynArgs = VisitArguments("(" + Translate(node.Binder.GetType()) + ", ", node.Arguments, Visit, ")");
905915
return node.Update(dynArgs);
906916
}
917+
#endif
907918

908919
private IList<T> VisitArguments<T>(string open, IList<T> args, Func<T, T> func, string end, bool wrap = false, IList<string> prefix = null) where T : class
909920
{
@@ -1314,11 +1325,11 @@ protected override Expression VisitMethodCall(MethodCallExpression node)
13141325
{
13151326
obj = VisitGroup(node.Object, node.NodeType);
13161327
}
1317-
else if (!node.Method.IsPublic || node.Method.DeclaringType?.IsNotPublic == true)
1328+
else if (!node.Method.IsPublic || node.Method.DeclaringType?.GetTypeInfo().IsNotPublic == true)
13181329
{
13191330
isNotPublic = true;
13201331
var del = GetDelegateType(node.Method);
1321-
if (del.IsGenericTypeDefinition)
1332+
if (del.GetTypeInfo().IsGenericTypeDefinition)
13221333
{
13231334
var types = node.Method.GetParameters().Select(it => it.ParameterType);
13241335
if (node.Method.ReturnType != typeof(void))
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFrameworks>netstandard2.0;netstandard1.3;net45;net40</TargetFrameworks>
5+
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
6+
<Authors>Chaowlert Chaisrichalermpol</Authors>
7+
<Description>Translate from linq expressions to C# code</Description>
8+
<PackageProjectUrl>https://github.com/chaowlert/ExpressionDebugger</PackageProjectUrl>
9+
<RepositoryUrl>https://github.com/chaowlert/ExpressionDebugger</RepositoryUrl>
10+
<PackageTags>expression;linq;debug</PackageTags>
11+
<PackageIconUrl>https://cloud.githubusercontent.com/assets/5763993/26522656/41e28a6e-432f-11e7-9cae-7856f927d1a1.png</PackageIconUrl>
12+
<SignAssembly>True</SignAssembly>
13+
<PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
14+
<AssemblyOriginatorKeyFile>ExpressionTranslator.snk</AssemblyOriginatorKeyFile>
15+
<Version>2.0.0</Version>
16+
<FileVersion>2.0.0</FileVersion>
17+
<AssemblyVersion>2.0.0</AssemblyVersion>
18+
<RootNamespace>ExpressionDebugger</RootNamespace>
19+
</PropertyGroup>
20+
21+
<ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
22+
<Reference Include="System" />
23+
</ItemGroup>
24+
25+
<ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
26+
<Reference Include="System" />
27+
</ItemGroup>
28+
29+
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
30+
<PackageReference Include="System.Reflection.TypeExtensions" Version="4.3.0" />
31+
</ItemGroup>
32+
</Project>
596 Bytes
Binary file not shown.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using System.Linq.Expressions;
3+
4+
namespace ExpressionDebugger
5+
{
6+
public static class ExpressionTranslatorExtensions
7+
{
8+
/// <summary>
9+
/// Generate script text
10+
/// </summary>
11+
/// <param name="node">Expression</param>
12+
/// <returns>Script text</returns>
13+
public static string ToScript(this Expression node, ExpressionDefinitions definitions = null)
14+
{
15+
var translator = new ExpressionTranslator(definitions);
16+
return translator.Translate(node);
17+
}
18+
}
19+
}

ExpressionTranslator/Extensions.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Reflection;
5+
6+
namespace ExpressionDebugger
7+
{
8+
internal static class Extensions
9+
{
10+
public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
11+
{
12+
return new HashSet<T>(source);
13+
}
14+
15+
#if NET40
16+
public static Type GetTypeInfo(this Type type) {
17+
return type;
18+
}
19+
#endif
20+
21+
#if NET40 || NETSTANDARD1_3
22+
public static T GetCustomAttribute<T>(this MemberInfo memberInfo) where T : Attribute
23+
{
24+
return (T)memberInfo.GetCustomAttributes(typeof(T), true).SingleOrDefault();
25+
}
26+
27+
public static T GetCustomAttribute<T>(this Type type) where T : Attribute
28+
{
29+
return (T)type.GetTypeInfo().GetCustomAttributes(typeof(T), true).SingleOrDefault();
30+
}
31+
#endif
32+
}
33+
}

0 commit comments

Comments
 (0)