⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parameter.vb

📁 大名鼎鼎的mono是.NET平台的跨平台(支持linux
💻 VB
字号:
' ' 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' ''' <summary>''' Parameter            ::= [  Attributes  ]  ParameterModifier+  ParameterIdentifier  [  "As"  TypeName  ]  [  "="  ConstantExpression  ]''' ParameterModifier    ::= "ByVal" | "ByRef" | "Optional" | "ParamArray"''' ParameterIdentifier  ::= Identifier  [  ArrayNameModifier  ]''' </summary>''' <remarks></remarks>Public Class Parameter    Inherits ParsedObject    Implements INameable, IModifiable, IAttributableDeclaration    Private m_CustomAttributes As Attributes    Private m_Modifiers As Modifiers    Private m_ParameterIdentifier As ParameterIdentifier    Private m_TypeName As TypeName    Private m_ConstantExpression As Expression    Private m_ConstantValue As Object    Private m_ParameterType As Type    Private m_ParameterAttributes As ParameterAttributes = ParameterAttributes.None    Private m_ParameterBuilder As ParameterBuilder    ReadOnly Property Identifier() As ParameterIdentifier        Get            Return m_ParameterIdentifier        End Get    End Property    Sub New(ByVal Parent As ParameterList)        MyBase.New(Parent)    End Sub    Sub New(ByVal Parent As ParameterList, ByVal Name As String, ByVal ParameterType As Type)        MyBase.New(Parent)        m_ParameterIdentifier = New ParameterIdentifier(Me, Name)        m_ParameterType = ParameterType        m_Modifiers = New Modifiers()        'Helper.Assert(vbnc.Modifiers.IsNothing(m_Modifiers) = False)        Helper.Assert(m_ParameterIdentifier IsNot Nothing)    End Sub    Sub New(ByVal Parent As ParameterList, ByVal Name As String, ByVal ParameterType As TypeName)        MyBase.New(Parent)        m_ParameterIdentifier = New ParameterIdentifier(Me, Name)        m_TypeName = ParameterType        m_Modifiers = New Modifiers()        'Helper.Assert(vbnc.Modifiers.IsNothing(m_Modifiers) = False)        Helper.Assert(m_ParameterIdentifier IsNot Nothing)    End Sub    Sub Init(ByVal Attributes As Attributes, ByVal Modifiers As Modifiers, ByVal ParameterIdentifier As ParameterIdentifier, ByVal TypeName As TypeName, ByVal ConstantExpression As Expression)        m_CustomAttributes = Attributes        m_Modifiers = Modifiers        m_ParameterIdentifier = ParameterIdentifier        m_TypeName = TypeName        m_ConstantExpression = ConstantExpression        'Helper.Assert(vbnc.Modifiers.IsNothing(m_Modifiers) = False)        Helper.Assert(m_ParameterIdentifier IsNot Nothing)        '    Helper.Assert(m_TypeName IsNot Nothing)    End Sub    Function Clone(Optional ByVal NewParent As ParameterList = Nothing) As Parameter        If NewParent Is Nothing Then NewParent = DirectCast(Me.Parent, ParameterList)        Dim result As New Parameter(NewParent)        result.m_CustomAttributes = m_CustomAttributes        result.m_Modifiers = m_Modifiers        result.m_ParameterIdentifier = m_ParameterIdentifier.Clone(result)        If m_TypeName IsNot Nothing Then result.m_TypeName = m_TypeName.Clone(result)        If m_ConstantExpression IsNot Nothing Then result.m_ConstantExpression = m_ConstantExpression.clone(result)        Return result    End Function    ReadOnly Property HasConstantValue() As Boolean        Get            Return m_ConstantExpression IsNot Nothing        End Get    End Property    ReadOnly Property ConstantValue() As Object        Get            Return m_ConstantValue        End Get    End Property    ReadOnly Property CustomAttributes() As Attributes Implements IAttributableDeclaration.CustomAttributes        Get            Return m_CustomAttributes        End Get    End Property    Property ParameterAttributes() As ParameterAttributes        Get            Return m_ParameterAttributes        End Get        Set(ByVal value As ParameterAttributes)            m_ParameterAttributes = value        End Set    End Property    ReadOnly Property Position() As Integer        Get            Return Me.FindFirstParent(Of ParameterList).List.IndexOf(Me) + 1        End Get    End Property    ReadOnly Property ParameterType() As Type        Get            Helper.Assert(m_ParameterType IsNot Nothing)            Return m_ParameterType        End Get    End Property    ReadOnly Property ParameterBuilder() As ParameterBuilder        Get            Return m_ParameterBuilder        End Get    End Property    Public Property Name() As String        Get            Return m_ParameterIdentifier.Name        End Get        Set(ByVal value As String)            m_ParameterIdentifier = New ParameterIdentifier(Me, value)        End Set    End Property    Public ReadOnly Property Modifiers() As Modifiers Implements IModifiable.Modifiers        Get            Return m_Modifiers        End Get    End Property    Private ReadOnly Property ImplName() As String Implements INameable.Name        Get            Return Name        End Get    End Property    ReadOnly Property TypeName() As TypeName        Get            Return m_TypeName        End Get    End Property    <Obsolete("Call Define(Builder")> Public Overrides Function Define() As Boolean        Throw New InternalException(Me)    End Function    Private Function DefineInternal() As Boolean        Dim result As Boolean = True        If m_ParameterBuilder.IsOptional Then            If Helper.IsOnMS AndAlso ((Me.ParameterType.IsByRef AndAlso m_ConstantValue IsNot Nothing) OrElse (m_ParameterType.Equals(Compiler.TypeCache.System_Object) AndAlso m_ConstantValue IsNot Nothing AndAlso m_ConstantValue.GetType.Equals(Compiler.TypeCache.System_Object) = False)) Then                'HACK (a really big one...)                'The reflection.Emit is not able to set a constant value when the                 'parameter type is a byref type. Do all this to bypass all checks.                Dim mthd As MethodInfo                mthd = GetType(TypeBuilder).GetMethod("InternalSetConstantValue", BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.Static)                Dim m As System.Reflection.Module = DirectCast(GetType(ParameterBuilder).GetField("m_methodBuilder", BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance).GetValue(m_ParameterBuilder), MethodBuilder).GetModule                Dim tk As Integer = DirectCast(GetType(ParameterBuilder).GetField("m_pdToken", BindingFlags.NonPublic Or BindingFlags.Instance).GetValue(m_ParameterBuilder), ParameterToken).Token                Dim vt As Type = GetType(String).Assembly.GetType("System.Variant")                Dim ctor As ConstructorInfo                ctor = vt.GetConstructor(BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.ExactBinding, Nothing, New Type() {Compiler.TypeCache.System_Object}, Nothing)                Dim v As Object = Activator.CreateInstance(vt, New Object() {m_ConstantValue})                mthd.Invoke(Nothing, New Object() {m, tk, v})                'END HACK            Else                'Helper.Assert(m_ConstantValue Is Nothing OrElse (Type.GetTypeCode(m_ConstantValue.GetType) = Type.GetTypeCode(m_ParameterType)) OrElse m_ParameterType.IsEnum)                m_ParameterBuilder.SetConstant(m_ConstantValue)            End If        End If        If Me.Modifiers.Is(ModifierMasks.ParamArray) Then            Dim cab As CustomAttributeBuilder            cab = New CustomAttributeBuilder(Compiler.TypeCache.System_ParamArrayAttribute__ctor, New Object() {})            m_ParameterBuilder.SetCustomAttribute(cab)        End If        Return result    End Function    Overloads Function Define(ByVal Builder As ConstructorBuilder) As Boolean        m_ParameterBuilder = Builder.DefineParameter(Position, m_ParameterAttributes, Name)        Return DefineInternal()    End Function    Overloads Function Define(ByVal Builder As MethodBuilder) As Boolean        m_ParameterBuilder = Builder.DefineParameter(Position, m_ParameterAttributes, Name)        Return DefineInternal()    End Function    Public Overrides Function ResolveCode(ByVal Info As ResolveInfo) As Boolean        Dim result As Boolean = True        Me.CheckCodeNotResolved()        If m_CustomAttributes IsNot Nothing Then result = m_CustomAttributes.ResolveCode(info) AndAlso result        If m_ConstantExpression IsNot Nothing Then            result = m_ConstantExpression.ResolveExpression(info) AndAlso result        End If        If Me.Modifiers.Is(ModifierMasks.Optional) Then            m_ParameterAttributes = Reflection.ParameterAttributes.Optional            If m_ConstantExpression Is Nothing Then                Helper.AddError("Optional parameters must have a constant expression.")                result = False            ElseIf m_ConstantExpression.IsConstant = False Then                Helper.AddError("Optional expressions must be constant.")                result = False            Else                m_ConstantValue = m_ConstantExpression.ConstantValue                m_ConstantValue = TypeConverter.ConvertTo(m_ConstantValue, m_ParameterType)                If m_ConstantValue Is DBNull.Value Then                    m_ConstantValue = Nothing                End If            End If        Else            If m_ConstantExpression IsNot Nothing Then                Helper.AddError("Non-optional parameters cannot have constant expressions.")                result = False            End If        End If        Return result    End Function    Public Overrides Function ResolveTypeReferences() As Boolean        Dim result As Boolean = True        Me.CheckTypeReferencesNotResolved()        result = Helper.ResolveTypeReferences(m_ConstantExpression, m_TypeName, m_ParameterIdentifier) AndAlso result        If m_CustomAttributes IsNot Nothing Then result = m_CustomAttributes.ResolveTypeReferences AndAlso result        If result = False Then Return result        If m_ParameterType Is Nothing Then            If m_TypeName IsNot Nothing Then                m_ParameterType = m_TypeName.ResolvedType                If m_ParameterIdentifier.ArrayNameModifier IsNot Nothing Then                    If m_TypeName.IsArrayTypeName Then                        Helper.AddError()                    Else                        m_ParameterType = m_ParameterIdentifier.ArrayNameModifier.CreateArrayType(m_ParameterType)                    End If                End If            ElseIf m_ParameterIdentifier.Identifier.HasTypeCharacter Then                m_ParameterType = TypeCharacters.TypeCharacterToType(Compiler, m_ParameterIdentifier.Identifier.TypeCharacter)            Else                If Me.Location.File(Compiler).IsOptionStrictOn Then                    Helper.AddError("Parameter type must be specified.")                Else                    Helper.AddWarning("Parameter type should be specified.")                End If                m_ParameterType = Compiler.TypeCache.System_Object            End If        End If        Helper.Assert(m_ParameterType IsNot Nothing)        If m_Modifiers.Is(ModifierMasks.ByRef) Then            m_ParameterType = Compiler.TypeManager.MakeByRefType(Me, m_ParameterType)        End If        Return result    End Function    Friend Overrides Function GenerateCode(ByVal Info As EmitInfo) As Boolean        Dim result As Boolean = True        If Me.CustomAttributes IsNot Nothing Then            result = Me.CustomAttributes.GenerateCode(Info) AndAlso result        End If        Return result    End FunctionEnd Class

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -