📄 expression.vb
字号:
''' </summary> ''' <remarks></remarks> Protected Sub StartResolve() If m_Resolving Then 'Recursive resolution. 'TODO: Find a meaningful error message Throw New InternalException(Me) End If m_Resolving = True#If EXTENDEDDEBUG Then If Me.TypeReferencesResolved = False Then Compiler.Report.WriteLine("TypeReferences not resolved for expression " & Me.ToString) End If#End If#If EXTENDEDDEBUG Then If m_Resolved Then Compiler.Report.WriteLine("Resolving expression " & Me.ToString & " more than once (Location: " & Me.Location.ToString & ")") End If#End If End Sub ''' <summary> ''' Is this expression beeing resolved (in Resolve)? ''' </summary> ''' <value></value> ''' <remarks></remarks> ReadOnly Property IsResolving() As Boolean Get Return m_Resolving End Get End Property ''' <summary> ''' Is this constant resolved? ''' </summary> ''' <value></value> ''' <remarks></remarks> Property IsResolved() As Boolean Get Return m_Resolved End Get Set(ByVal value As Boolean) m_Resolved = value End Set End Property ''' <summary> ''' Call StartResolve to enable check for recursive resolving. ''' Call EndResolve when finished resolving. ''' </summary> ''' <remarks></remarks> Protected Sub EndResolve(ByVal result As Boolean) If Not m_Resolving Then Throw New InternalException(Me) m_Resolving = False m_Resolved = result End Sub <Obsolete("Call ResolveExpression"), ComponentModel.EditorBrowsable(ComponentModel.EditorBrowsableState.Never)> Public NotOverridable Overrides Function ResolveCode(ByVal Info As ResolveInfo) As Boolean Return ResolveExpression(Info) End Function Overridable Function Clone(Optional ByVal NewParent As ParsedObject = Nothing) As Expression Helper.NotImplemented(Me.GetType.ToString & ".Clone() not implemented.") Return Nothing End Function Protected Overridable Function ResolveExpressionInternal(ByVal Info As ResolveInfo) As Boolean Helper.NotImplemented(Me.GetType.ToString & ".ResolveExpressionInternal(ResolveInfo) not implemented.") Return False End Function Function ResolveAddressOfExpression(ByVal DelegateType As Type) As Boolean Dim result As Boolean = True Dim aoe As AddressOfExpression = TryCast(Me, AddressOfExpression) If aoe Is Nothing Then result = False Else result = aoe.Resolve(DelegateType) AndAlso result End If Return result End Function Function GetObjectReference() As Expression Dim result As Expression If TypeOf Me Is GetRefExpression Then Return Me ElseIf TypeOf Me Is InstanceExpression Then Return Me ElseIf ExpressionType.IsValueType Then If TypeOf Me Is DeRefExpression Then Dim derefExp As DeRefExpression = DirectCast(Me, DeRefExpression) result = derefExp.Expression ElseIf Helper.CompareType(Me.ExpressionType.BaseType, Compiler.TypeCache.System_Enum) Then result = New BoxExpression(Me, Me, Me.ExpressionType) 'ElseIf Me.ExpressionType.IsValueType AndAlso Helper.IsNullableType(Compiler, Me.ExpressionType) = False Then ' result = New BoxExpression(Me, Me, Me.ExpressionType) Else result = New GetRefExpression(Me, Me) End If Else result = Me End If Return result End Function Function DereferenceByRef() As Expression Dim result As Expression If ExpressionType.IsByRef Then result = New DeRefExpression(Me, Me) Else result = Me End If Return result End Function ''' <summary> ''' The resulting expression is NOT resolved. ''' </summary> ''' <returns></returns> ''' <remarks></remarks> Function ReclassifyToPropertyAccessExpression() As Expression Dim result As Expression Select Case m_Classification.Classification Case ExpressionClassification.Classifications.PropertyGroup Dim pgClass As PropertyGroupClassification = Me.Classification.AsPropertyGroup result = New PropertyGroupToPropertyAccessExpression(Me, pgClass) Case ExpressionClassification.Classifications.Value Throw New InternalException(Me) Case ExpressionClassification.Classifications.Variable Throw New InternalException(Me) Case ExpressionClassification.Classifications.EventAccess Throw New InternalException(Me) Case ExpressionClassification.Classifications.LateBoundAccess Return New LateBoundAccessToPropertyAccessExpression(Me, Me.Classification.AsLateBoundAccess) Case ExpressionClassification.Classifications.MethodGroup Throw New InternalException(Me) Case ExpressionClassification.Classifications.MethodPointer Throw New InternalException(Me) Case ExpressionClassification.Classifications.PropertyAccess Throw New InternalException(Me) Case ExpressionClassification.Classifications.Void Throw New InternalException(Me) Case ExpressionClassification.Classifications.Type Throw New InternalException(Me) Case ExpressionClassification.Classifications.Namespace Throw New InternalException(Me) Case Else Throw New InternalException(Me) End Select Return result End Function Function ReclassifyMethodPointerToValueExpression(ByVal DelegateType As Type) As Expression Dim result As Expression = Nothing Helper.Assert(Classification.IsMethodPointerClassification) Helper.Assert(TypeOf Me Is AddressOfExpression) result = New DelegateOrObjectCreationExpression(Me, DelegateType, DirectCast(Me, AddressOfExpression)) Return result End Function ''' <summary> ''' Reclassifies an expression. ''' The resulting expression is NOT resolved. ''' </summary> ''' <returns></returns> ''' <remarks></remarks> Function ReclassifyToValueExpression() As Expression Dim result As Expression = Nothing Select Case m_Classification.Classification Case ExpressionClassification.Classifications.Value Return Me 'This expression is already a value expression. Case ExpressionClassification.Classifications.Variable result = New VariableToValueExpression(Me, Me.Classification.AsVariableClassification) Case ExpressionClassification.Classifications.MethodGroup result = New MethodGroupToValueExpression(Me, Me.Classification.AsMethodGroupClassification) Case ExpressionClassification.Classifications.PropertyAccess result = New PropertyAccessToValueExpression(Me, Me.Classification.AsPropertyAccess) Case ExpressionClassification.Classifications.PropertyGroup result = New PropertyGroupToValueExpression(Me, Me.Classification.AsPropertyGroup) Case ExpressionClassification.Classifications.LateBoundAccess result = New LateBoundAccessToValueExpression(Me, Me.Classification.AsLateBoundAccess) Case ExpressionClassification.Classifications.MethodPointer Throw New InternalException(Me, "Use the other overload.") Case ExpressionClassification.Classifications.EventAccess Throw New InternalException(Me) Case ExpressionClassification.Classifications.Void Throw New InternalException(Me) Case ExpressionClassification.Classifications.Type Return m_Classification.AsTypeClassification.MyGroup.DefaultInstanceAlias.ReclassifyToValueExpression Case ExpressionClassification.Classifications.Namespace Throw New InternalException(Me) Case Else Helper.NotImplemented() : Return Nothing End Select Return result End Function#End Region '#If DEBUG Then ' Protected Overrides Sub Finalize() ' If m_Resolving Then ' If Location IsNot Nothing Then ' Compiler.Report.WriteLine(vbnc.Report.ReportLevels.Debug, "Expression still resolving: " & Me.Location.ToString) ' Else ' Compiler.Report.WriteLine(vbnc.Report.ReportLevels.Debug, "Expression still resolving. (Location is lost already).") ' End If ' End If ' End Sub '#End If#If DEBUG Then Overridable Sub Dump(ByVal Dumper As IndentedTextWriter) Dumper.Write("<Dump of '" & Me.GetType.Name & "'>") End Sub#End If Overridable ReadOnly Property AsString() As String Get Return "<String representation of " & Me.GetType.FullName & " not implemented>" End Get End Property 'ReadOnly Property IsUnresolved() As Boolean ' Get ' Return ' End Get 'End PropertyEnd Class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -