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 + -
显示快捷键?