typeresolution.vb
来自「大名鼎鼎的mono是.NET平台的跨平台(支持linux」· VB 代码 · 共 1,025 行 · 第 1/4 页
VB
1,025 行
' ' Visual Basic.Net Compiler' Copyright (C) 2004 - 2007 Rolf Bjarne Kvinge, RKvinge@novell.com' ' This library is free software; you can redistribute it and/or' modify it under the terms of the GNU Lesser General Public' License as published by the Free Software Foundation; either' version 2.1 of the License, or (at your option) any later version.' ' This library is distributed in the hope that it will be useful,' but WITHOUT ANY WARRANTY; without even the implied warranty of' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU' Lesser General Public License for more details.' ' You should have received a copy of the GNU Lesser General Public' License along with this library; if not, write to the Free Software' Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA' #If DEBUG Then#Const EXTENDEDDEBUG = 0#End IfPublic Class TypeResolution Inherits Helper Friend BuiltInTypes As New ArrayList(New Type() {Compiler.TypeCache.System_Boolean, Compiler.TypeCache.System_Byte, Compiler.TypeCache.System_Char, Compiler.TypeCache.System_DateTime, Compiler.TypeCache.System_Double, Compiler.TypeCache.System_Int32, Compiler.TypeCache.System_int64, Compiler.TypeCache.System_Object, Compiler.TypeCache.System_int16, Compiler.TypeCache.System_Single, Compiler.TypeCache.System_String, Compiler.TypeCache.System_SByte, Compiler.TypeCache.System_UInt16, Compiler.TypeCache.System_UInt32, Compiler.TypeCache.System_Uint64}) Friend NumericTypes As New ArrayList(New Type() {Compiler.TypeCache.System_Byte, Compiler.TypeCache.System_SByte, Compiler.TypeCache.System_Decimal, Compiler.TypeCache.System_Double, Compiler.TypeCache.System_Single, Compiler.TypeCache.System_int16, Compiler.TypeCache.System_UInt16, Compiler.TypeCache.System_Int32, Compiler.TypeCache.System_UInt32, Compiler.TypeCache.System_int64, Compiler.TypeCache.System_Uint64}) Friend IntegralTypes As New ArrayList(New Type() {Compiler.TypeCache.System_Byte, Compiler.TypeCache.System_SByte, Compiler.TypeCache.System_int16, Compiler.TypeCache.System_Uint16, Compiler.TypeCache.System_Int32, Compiler.TypeCache.System_UInt32, Compiler.TypeCache.System_int64, Compiler.TypeCache.System_Uint64}) Private valCanBeContainBy(15)() As Type Public Shared Conversion As TypeConversionInfo(,) Shared Sub New() Dim highest As Integer Dim tmp As Array = System.Enum.GetValues(GetType(TypeCode)) highest = CInt(tmp.GetValue(tmp.GetUpperBound(0))) ReDim Conversion(highest, highest) For i As Integer = 0 To highest For j As Integer = 0 To highest Conversion(i, j) = New TypeConversionInfo If j = TypeCode.Object OrElse j = i Then Conversion(i, j).Conversion = ConversionType.Implicit Else Conversion(i, j).Conversion = ConversionType.Explicit End If Next Next setImplicit(TypeCode.SByte, New TypeCode() {TypeCode.Int16, TypeCode.Int32, TypeCode.Int64, TypeCode.Decimal, TypeCode.Single, TypeCode.Double}) setImplicit(TypeCode.Byte, New TypeCode() {TypeCode.Int16, TypeCode.UInt16, TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64, TypeCode.Decimal, TypeCode.Single, TypeCode.Double}) setImplicit(TypeCode.Int16, New TypeCode() {TypeCode.Int32, TypeCode.Int64, TypeCode.Decimal, TypeCode.Single, TypeCode.Double}) setImplicit(TypeCode.UInt16, New TypeCode() {TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64, TypeCode.Decimal, TypeCode.Single, TypeCode.Double}) setImplicit(TypeCode.Int32, New TypeCode() {TypeCode.Int64, TypeCode.Decimal, TypeCode.Single, TypeCode.Double}) setImplicit(TypeCode.UInt32, New TypeCode() {TypeCode.Int64, TypeCode.UInt64, TypeCode.Decimal, TypeCode.Single, TypeCode.Double}) setImplicit(TypeCode.Int64, New TypeCode() {TypeCode.Decimal, TypeCode.Single, TypeCode.Double}) setImplicit(TypeCode.UInt64, New TypeCode() {TypeCode.Decimal, TypeCode.Single, TypeCode.Double}) setImplicit(TypeCode.Decimal, New TypeCode() {TypeCode.Single, TypeCode.Double}) setImplicit(TypeCode.Single, New TypeCode() {TypeCode.Double}) setImplicit(TypeCode.Double, New TypeCode() {}) setImplicit(TypeCode.Char, New TypeCode() {TypeCode.String}) Conversion(TypeCode.Byte, TypeCode.Byte).BinaryAddResult = TypeCode.Byte Conversion(TypeCode.Boolean, TypeCode.Boolean).BinaryAddResult = TypeCode.SByte End Sub Sub New(ByVal Compiler As Compiler) MyBase.New(Compiler) valCanBeContainBy(getTypeIndex(BuiltInDataTypes.Boolean)) = Nothing valCanBeContainBy(getTypeIndex(BuiltInDataTypes.Byte)) = New Type() {Compiler.TypeCache.System_Byte, Compiler.TypeCache.System_Int16, Compiler.TypeCache.System_UInt16, Compiler.TypeCache.System_Int32, Compiler.TypeCache.System_UInt32, Compiler.TypeCache.System_Int64, Compiler.TypeCache.System_UInt64, Compiler.TypeCache.System_Decimal, Compiler.TypeCache.System_Double, Compiler.TypeCache.System_Single} valCanBeContainBy(getTypeIndex(BuiltInDataTypes.Char)) = Nothing valCanBeContainBy(getTypeIndex(BuiltInDataTypes.Date)) = Nothing valCanBeContainBy(getTypeIndex(BuiltInDataTypes.Decimal)) = New Type() {Compiler.TypeCache.System_Decimal, Compiler.TypeCache.System_Double, Compiler.TypeCache.System_Single} valCanBeContainBy(getTypeIndex(BuiltInDataTypes.Double)) = New Type() {Compiler.TypeCache.System_Double} valCanBeContainBy(getTypeIndex(BuiltInDataTypes.Integer)) = New Type() {Compiler.TypeCache.System_Int32, Compiler.TypeCache.System_Int64, Compiler.TypeCache.System_Decimal, Compiler.TypeCache.System_Double, Compiler.TypeCache.System_Single} valCanBeContainBy(getTypeIndex(BuiltInDataTypes.Long)) = New Type() {Compiler.TypeCache.System_Int64, Compiler.TypeCache.System_Decimal, Compiler.TypeCache.System_Double, Compiler.TypeCache.System_Single} valCanBeContainBy(getTypeIndex(BuiltInDataTypes.Object)) = Nothing valCanBeContainBy(getTypeIndex(BuiltInDataTypes.[SByte])) = New Type() {Compiler.TypeCache.System_SByte, Compiler.TypeCache.System_Int16, Compiler.TypeCache.System_Int32, Compiler.TypeCache.System_Int64, Compiler.TypeCache.System_Decimal, Compiler.TypeCache.System_Double, Compiler.TypeCache.System_Single} valCanBeContainBy(getTypeIndex(BuiltInDataTypes.Short)) = New Type() {Compiler.TypeCache.System_Int16, Compiler.TypeCache.System_Int32, Compiler.TypeCache.System_Int64, Compiler.TypeCache.System_Decimal, Compiler.TypeCache.System_Double, Compiler.TypeCache.System_Single} valCanBeContainBy(getTypeIndex(BuiltInDataTypes.Single)) = New Type() {Compiler.TypeCache.System_Double, Compiler.TypeCache.System_Single} valCanBeContainBy(getTypeIndex(BuiltInDataTypes.String)) = Nothing valCanBeContainBy(getTypeIndex(BuiltInDataTypes.[UInteger])) = New Type() {Compiler.TypeCache.System_UInt32, Compiler.TypeCache.System_Int64, Compiler.TypeCache.System_UInt64, Compiler.TypeCache.System_Decimal, Compiler.TypeCache.System_Double, Compiler.TypeCache.System_Single} valCanBeContainBy(getTypeIndex(BuiltInDataTypes.[ULong])) = New Type() {Compiler.TypeCache.System_UInt64, Compiler.TypeCache.System_Decimal, Compiler.TypeCache.System_Double, Compiler.TypeCache.System_Single} valCanBeContainBy(getTypeIndex(BuiltInDataTypes.[UShort])) = New Type() {Compiler.TypeCache.System_UInt16, Compiler.TypeCache.System_Int32, Compiler.TypeCache.System_UInt32, Compiler.TypeCache.System_Int64, Compiler.TypeCache.System_UInt64, Compiler.TypeCache.System_Decimal, Compiler.TypeCache.System_Double, Compiler.TypeCache.System_Single} End Sub ''' <summary> ''' Returns the type of the builtin type. ''' If it isn't a builtin type, then it returns nothing, ''' </summary> ''' <param name="tp"></param> ''' <returns></returns> ''' <remarks></remarks> Function BuiltInTypeToType(ByVal tp As BuiltInDataTypes) As Type Return KeywordToType(CType(tp, KS)) End Function Function IsBuiltInType(ByVal Type As Type) As Boolean Return BuiltInTypes.Contains(Type) End Function Shared Function TypeCodeToBuiltInType(ByVal tp As TypeCode) As BuiltInDataTypes Select Case tp Case TypeCode.Boolean Return BuiltInDataTypes.Boolean Case TypeCode.Byte Return BuiltInDataTypes.Byte Case TypeCode.Char Return BuiltInDataTypes.Char Case TypeCode.DateTime Return BuiltInDataTypes.Date Case TypeCode.DBNull Throw New InternalException("") Case TypeCode.Decimal Return BuiltInDataTypes.Decimal Case TypeCode.Double Return BuiltInDataTypes.Double Case TypeCode.Empty Throw New InternalException("") Case TypeCode.Int16 Return BuiltInDataTypes.Short Case TypeCode.Int32 Return BuiltInDataTypes.Integer Case TypeCode.Int64 Return BuiltInDataTypes.Long Case TypeCode.Object Return BuiltInDataTypes.Object Case TypeCode.SByte Return BuiltInDataTypes.SByte Case TypeCode.Single Return BuiltInDataTypes.Single Case TypeCode.String Return BuiltInDataTypes.String Case TypeCode.UInt16 Return BuiltInDataTypes.UShort Case TypeCode.UInt32 Return BuiltInDataTypes.UInteger Case TypeCode.UInt64 Return BuiltInDataTypes.ULong Case Else Throw New InternalException("") End Select End Function Shared Function BuiltInTypeToTypeCode(ByVal Type As BuiltInDataTypes) As TypeCode Select Case Type Case BuiltInDataTypes.Boolean Return TypeCode.Boolean Case BuiltInDataTypes.Byte Return TypeCode.Byte Case BuiltInDataTypes.Char Return TypeCode.Char Case BuiltInDataTypes.Date Return TypeCode.DateTime Case BuiltInDataTypes.Decimal Return TypeCode.Decimal Case BuiltInDataTypes.Double Return TypeCode.Double Case BuiltInDataTypes.Integer Return TypeCode.Int32 Case BuiltInDataTypes.Long Return TypeCode.Int64 Case BuiltInDataTypes.Object Return TypeCode.Object Case BuiltInDataTypes.SByte Return TypeCode.SByte Case BuiltInDataTypes.Short Return TypeCode.Int16 Case BuiltInDataTypes.Single Return TypeCode.Single Case BuiltInDataTypes.String Return TypeCode.String Case BuiltInDataTypes.UInteger Return TypeCode.UInt32 Case BuiltInDataTypes.ULong Return TypeCode.UInt64 Case BuiltInDataTypes.UShort Return TypeCode.UInt16 Case Else Throw New InternalException("") End Select End Function Function TypeCodeToTypeDescriptor(ByVal Code As TypeCode) As Type Return TypeCodeToType(Code) End Function Function TypeCodeToType(ByVal Code As TypeCode) As Type Select Case Code Case TypeCode.Boolean Return Compiler.TypeCache.System_Boolean Case TypeCode.Byte Return Compiler.TypeCache.System_Byte Case TypeCode.Char Return Compiler.TypeCache.System_Char Case TypeCode.DateTime Return Compiler.TypeCache.System_DateTime Case TypeCode.DBNull Throw New InternalException("") Case TypeCode.Decimal Return Compiler.TypeCache.System_Decimal Case TypeCode.Double Return Compiler.TypeCache.System_Double Case TypeCode.Empty Throw New InternalException("") Case TypeCode.Int16 Return Compiler.TypeCache.System_Int16 Case TypeCode.Int32 Return Compiler.TypeCache.System_Int32 Case TypeCode.Int64 Return Compiler.TypeCache.System_Int64 Case TypeCode.Object Return Compiler.TypeCache.System_Object Case TypeCode.SByte Return Compiler.TypeCache.System_SByte Case TypeCode.Single Return Compiler.TypeCache.System_Single Case TypeCode.String Return Compiler.TypeCache.System_String Case TypeCode.UInt16 Return Compiler.TypeCache.System_UInt16 Case TypeCode.UInt32 Return Compiler.TypeCache.System_UInt32 Case TypeCode.UInt64 Return Compiler.TypeCache.System_UInt64 Case Else Throw New InternalException("") End Select End Function Private Shared Function getTypeIndex(ByVal special As BuiltInDataTypes) As Integer Select Case special Case BuiltInDataTypes.Boolean Return 0 Case BuiltInDataTypes.Byte Return 1 Case BuiltInDataTypes.Char Return 2 Case BuiltInDataTypes.Date Return 3 Case BuiltInDataTypes.Decimal Return 4 Case BuiltInDataTypes.Double Return 5 Case BuiltInDataTypes.Integer Return 6 Case BuiltInDataTypes.Long Return 7 Case BuiltInDataTypes.Object Return 8
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?