From aa68082ebbb21e7aa76dbe80b515d7621227758d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AC=9D=E6=A1=82=E7=B6=B1?= Date: Mon, 29 Feb 2016 20:35:31 +0800 Subject: [PATCH] reconstruct of the compiler --- .../DynamicCode/vbc/DynamicCompiler.vb | 77 +++++++++++-------- .../Provider/ImportsAPI/APIProvider.vb | 17 ++++ .../Provider/Registry/TypeRegistry.vb | 6 ++ LINQ/LINQ/LDM/Expression/WhereClosure.vb | 6 ++ 4 files changed, 72 insertions(+), 34 deletions(-) diff --git a/LINQ/LINQ/Framewok/DynamicCode/vbc/DynamicCompiler.vb b/LINQ/LINQ/Framewok/DynamicCode/vbc/DynamicCompiler.vb index 8d15efc..2e8aeb4 100644 --- a/LINQ/LINQ/Framewok/DynamicCode/vbc/DynamicCompiler.vb +++ b/LINQ/LINQ/Framewok/DynamicCode/vbc/DynamicCompiler.vb @@ -1,8 +1,11 @@ Imports System.Text Imports System.CodeDom.Compiler -Imports Microsoft.VisualBasic.Linq.Statements Imports System.CodeDom +Imports Microsoft.VisualBasic.Linq.Statements Imports Microsoft.VisualBasic.CodeDOM_VBC +Imports Microsoft.VisualBasic.Linq.Framework.Provider +Imports Microsoft.VisualBasic.Linq.Framework.Provider.ImportsAPI +Imports System.Reflection Namespace Framework.DynamicCode.VBC @@ -10,49 +13,55 @@ Namespace Framework.DynamicCode.VBC ''' 编译整个LINQ语句的动态代码编译器 ''' ''' - Public Class DynamicCompiler : Implements System.IDisposable + Public Class DynamicCompiler : Implements IDisposable - ''' - ''' - ''' - ''' - Dim DotNETReferenceAssembliesDir As String - Dim LINQStatement As LINQStatement + Public ReadOnly Property EntityProvider As TypeRegistry + Public ReadOnly Property ApiProvider As APIProvider - Public Const ModuleName As String = "ILINQProgram" - Public Const SetObjectName As String = "SetObject" + Sub New(entity As TypeRegistry, api As APIProvider) + ApiProvider = api + EntityProvider = entity + End Sub - Dim ObjectModel As CodeNamespace + Sub New() + Call Me.New(TypeRegistry.LoadDefault, APIProvider.LoadDefault) + End Sub - Public ReadOnly Property CompiledCode As String - Get - Return GenerateCode(ObjectModel) - End Get - End Property + Public ReadOnly Property ImportsNamespace As List(Of String) = New List(Of String) + Public ReadOnly Property ReferenceList As New List(Of String) - ''' - ''' - ''' - ''' - ''' .NET Framework Reference Assembly文件夹的位置 - ''' - Sub New(LINQStatement As LINQStatement, SDK As String) - Me.LINQStatement = LINQStatement - Me.DotNETReferenceAssembliesDir = SDK + Public Sub [Imports](ns As String) + Dim types As Type() = ApiProvider.GetType(ns) + For Each nsDef As Type In types + Dim name As String = nsDef.FullName + If Not ImportsNamespace.Contains(name) Then + Call ImportsNamespace.Add(name) + End If + Dim assm As String = nsDef.Assembly.Location + If Not ReferenceList.Contains(assm) Then + Call ReferenceList.Add(assm) + End If + Next End Sub - Public Function DeclareAssembly() As CodeDom.CodeCompileUnit + Public Function Compile([declare] As CodeTypeDeclaration) As Type + Dim assmUnit As CodeCompileUnit = DeclareAssembly() + Dim ns As CodeNamespace = assmUnit.Namespaces.Item(0) + Call ns.Types.Add([declare]) + Call ns.Imports.AddRange(Me.ImportsNamespace.ImportsNamespace) + Dim assm As Assembly = CompileDll(assmUnit, ReferenceList, EntityProvider.SDK) + Dim types As Type() = assm.GetTypes + Dim name As String = [declare].Name + Dim LQuery = (From x As Type In types + Where String.Equals(x.Name, name) + Select x).FirstOrDefault + Return LQuery + End Function + + Public Shared Function DeclareAssembly() As CodeCompileUnit Dim Assembly As CodeDom.CodeCompileUnit = New CodeDom.CodeCompileUnit Dim DynamicCodeNameSpace As CodeDom.CodeNamespace = New CodeDom.CodeNamespace("LINQDynamicCodeCompiled") Assembly.Namespaces.Add(DynamicCodeNameSpace) - - DynamicCodeNameSpace.Types.Add(DeclareType) - DynamicCodeNameSpace.Imports.AddRange(New String() {}.ImportsNamespace) -#If DEBUG Then - Console.WriteLine(GenerateCode(DynamicCodeNameSpace)) -#End If - ObjectModel = DynamicCodeNameSpace - Return Assembly End Function diff --git a/LINQ/LINQ/Framewok/Provider/ImportsAPI/APIProvider.vb b/LINQ/LINQ/Framewok/Provider/ImportsAPI/APIProvider.vb index 271b524..e46b9fd 100644 --- a/LINQ/LINQ/Framewok/Provider/ImportsAPI/APIProvider.vb +++ b/LINQ/LINQ/Framewok/Provider/ImportsAPI/APIProvider.vb @@ -33,6 +33,19 @@ Namespace Framework.Provider.ImportsAPI Public Shared ReadOnly Property DefaultFile As String = App.ProductSharedDIR & "/API.Imports.json" + ''' + ''' 命名空间的大小写不敏感 + ''' + ''' + ''' + Public Overloads Function [GetType](ns As String) As Type() + If __nsList.ContainsKey(ns.ToLower.ShadowCopy(ns)) Then + Return __nsList(ns).Modules.ToArray(Function(x) x.GetType) + Else + Return New Type() {} + End If + End Function + Public Function Register(assm As Assembly) As Boolean Dim types As Type() = assm.GetTypes Dim LQuery = (From type As Type In types @@ -70,6 +83,10 @@ Namespace Framework.Provider.ImportsAPI Return Save(Path, encoding.GetEncodings) End Function + Public Shared Function LoadDefault() As APIProvider + Return LoadJsonFile(Of APIProvider)(DefaultFile) + End Function + Sub Save() Call Save(DefaultFile, Encodings.ASCII) End Sub diff --git a/LINQ/LINQ/Framewok/Provider/Registry/TypeRegistry.vb b/LINQ/LINQ/Framewok/Provider/Registry/TypeRegistry.vb index ef5cfd8..ed853cb 100644 --- a/LINQ/LINQ/Framewok/Provider/Registry/TypeRegistry.vb +++ b/LINQ/LINQ/Framewok/Provider/Registry/TypeRegistry.vb @@ -27,6 +27,12 @@ Namespace Framework.Provider End Set End Property + ''' + ''' .NET SDK directory + ''' + ''' + Public Property SDK As String + Dim _typeHash As Dictionary(Of String, TypeEntry) ''' diff --git a/LINQ/LINQ/LDM/Expression/WhereClosure.vb b/LINQ/LINQ/LDM/Expression/WhereClosure.vb index 208ea72..adc91d8 100644 --- a/LINQ/LINQ/LDM/Expression/WhereClosure.vb +++ b/LINQ/LINQ/LDM/Expression/WhereClosure.vb @@ -64,6 +64,12 @@ Namespace LDM.Expression Return [Function] End Function + Public Function BuildModule() As CodeTypeDeclaration + Dim type As New CodeTypeDeclaration(NameOf(WhereClosure)) + Call type.Members.Add(__buildFunc) + Return type + End Function + Sub New(expr As Token(Of Tokens)(), type As Type) Call MyBase.New(New Statements.Tokens.WhereClosure(expr)) End Sub