delegateorobjectcreationexpression.vb
来自「大名鼎鼎的mono是.NET平台的跨平台(支持linux」· VB 代码 · 共 193 行
VB
193 行
' ' 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>''' DelegateCreationExpression ::= "New" NonArrayTypeName "(" Expression ")"''' ObjectCreationExpression ::= "New" NonArrayTypeName [ "(" [ ArgumentList ] ")" ]''' ''' A New expression is classified as a value and the result is the new instance of the type.''' </summary>''' <remarks></remarks>Public Class DelegateOrObjectCreationExpression Inherits Expression Private m_NonArrayTypeName As NonArrayTypeName Private m_ArgumentList As ArgumentList Private m_ResolvedType As Type Private m_MethodClassification As MethodGroupClassification Private m_IsDelegateCreationExpression As Boolean ''' <summary> ''' If this is a value type creation expression with no parameters. ''' </summary> ''' <remarks></remarks> Private m_IsValueTypeInitializer As Boolean Public Overrides Function ResolveTypeReferences() As Boolean Dim result As Boolean = True If m_NonArrayTypeName IsNot Nothing Then result = m_NonArrayTypeName.ResolveTypeReferences AndAlso result m_ResolvedType = m_NonArrayTypeName.ResolvedType End If If m_ArgumentList IsNot Nothing Then result = m_ArgumentList.ResolveTypeReferences AndAlso result Return result End Function Sub New(ByVal Parent As ParsedObject) MyBase.New(Parent) End Sub Sub New(ByVal Parent As ParsedObject, ByVal DelegateType As Type, ByVal AddressOfExpression As AddressOfExpression) MyBase.New(Parent) m_IsDelegateCreationExpression = True m_ResolvedType = DelegateType m_ArgumentList = New ArgumentList(Me, AddressOfExpression) End Sub Sub New(ByVal Parent As ParsedObject, ByVal TypeName As NonArrayTypeName, ByVal ArgumentList As ArgumentList) MyBase.new(Parent) Me.Init(TypeName, ArgumentList) End Sub Sub Init(ByVal TypeName As NonArrayTypeName, ByVal ArgumentList As ArgumentList) m_NonArrayTypeName = TypeName m_ArgumentList = ArgumentList End Sub Sub Init(ByVal Type As Type, ByVal ArgumentList As ArgumentList) m_ResolvedType = Type m_ArgumentList = ArgumentList End Sub ReadOnly Property NonArrayTypeName() As NonArrayTypeName Get Return m_NonArrayTypeName End Get End Property ReadOnly Property IsDelegateCreationExpression() As Boolean Get Return m_IsDelegateCreationExpression End Get End Property Protected Overrides Function GenerateCodeInternal(ByVal Info As EmitInfo) As Boolean Dim result As Boolean = True If m_IsDelegateCreationExpression Then result = m_ArgumentList(0).Expression.Classification.AsMethodPointerClassification.GenerateCode(Info) AndAlso result ElseIf m_IsValueTypeInitializer Then If Info.DesiredType.IsByRef Then Dim type As Type = Helper.GetTypeOrTypeBuilder(m_ResolvedType) Emitter.EmitInitObj(Info, type) Else Dim type As Type = Helper.GetTypeOrTypeBuilder(m_ResolvedType) Dim local As LocalBuilder = Info.ILGen.DeclareLocal(type) Emitter.EmitLoadVariableLocation(Info, local) Emitter.EmitInitObj(Info, type) Emitter.EmitLoadVariable(Info, local) End If Else Dim ctor As ConstructorInfo ctor = m_MethodClassification.ResolvedConstructor result = m_ArgumentList.GenerateCode(Info, ctor.GetParameters) AndAlso result Emitter.EmitNew(Info, ctor) End If Return result End Function Overrides ReadOnly Property ExpressionType() As Type Get Return Classification.AsValueClassification.Type End Get End Property Protected Overrides Function ResolveExpressionInternal(ByVal Info As ResolveInfo) As Boolean Dim result As Boolean = True Helper.Assert(m_ResolvedType IsNot Nothing) If m_IsDelegateCreationExpression = False Then m_IsDelegateCreationExpression = Helper.CompareType(m_ResolvedType.BaseType, Compiler.TypeCache.System_MulticastDelegate) End If If m_ArgumentList IsNot Nothing Then result = m_ArgumentList.ResolveCode(Info) AndAlso result Else m_ArgumentList = New ArgumentList(Me) End If If result = False Then Return result If m_IsDelegateCreationExpression Then Dim type As Type = m_ResolvedType If m_ArgumentList.Count <> 1 Then result = Compiler.Report.ShowMessage(Messages.VBNC32008) AndAlso result End If If result AndAlso m_ArgumentList(0).Expression.Classification.IsMethodPointerClassification = False Then result = Compiler.Report.ShowMessage(Messages.VBNC32008) AndAlso result End If If result Then result = m_ArgumentList(0).Expression.ResolveAddressOfExpression(type) AndAlso result Classification = New ValueClassification(Me, type) End If Else Dim resolvedType As Type = m_ResolvedType If resolvedType.IsValueType AndAlso m_ArgumentList.Count = 0 Then 'Nothing to resolve. A structure with no parameters can always be created. m_IsValueTypeInitializer = True ElseIf resolvedType.IsClass OrElse resolvedType.IsValueType Then Dim ctors As ConstructorInfo() Dim finalArguments As Generic.List(Of Argument) = Nothing ctors = resolvedType.GetConstructors(BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly) m_MethodClassification = New MethodGroupClassification(Me, Nothing, Nothing, ctors) result = m_MethodClassification.AsMethodGroupClassification.ResolveGroup(m_ArgumentList, finalArguments) AndAlso result If result = False Then Helper.AddError("Delegate problems 3, " & Me.Location.ToString(Compiler) & ">" & Me.Parent.Location.ToString(Compiler)) Else result = m_ArgumentList.ReplaceAndVerifyArguments(finalArguments, m_MethodClassification.ResolvedMethod) AndAlso result End If Else Helper.AddError("Delegate problems 4, " & Me.Location.ToString(Compiler)) End If Classification = New ValueClassification(Me, resolvedType) End If Return result End Function#If DEBUG Then Public Overrides Sub Dump(ByVal Dumper As IndentedTextWriter) Dumper.Write("New ") Compiler.Dumper.Dump(m_NonArrayTypeName) Dumper.Write("(") Compiler.Dumper.Dump(m_ArgumentList) Dumper.Write(")") End Sub#End IfEnd Class
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?