/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/Symbols/DisplayClassVariable.vb
236 строк
9 KB
Fred Silberberg
Implement Required Members for VB (#66084)
10 май 2023, 23:13
Не верифицирован
10 май 2023, 23:13
974bb4e
Код
Авторство
О чём код?
' Licensed to the .NET Foundation under one or more agreements. ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. Imports System.Collections.Immutable Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Imports Roslyn.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.ExpressionEvaluator Friend Enum DisplayClassVariableKind Local Parameter [Me] End Enum ''' <summary> ''' A field in a display class that represents a captured variable: ''' either a local, a parameter, or "me". ''' </summary> <DebuggerDisplay("{GetDebuggerDisplay(), nq}")> Friend NotInheritable Class DisplayClassVariable Friend ReadOnly Name As String Friend ReadOnly Kind As DisplayClassVariableKind Friend ReadOnly DisplayClassInstance As DisplayClassInstance Friend ReadOnly DisplayClassFields As ConsList(Of FieldSymbol) Friend Sub New( name As String, kind As DisplayClassVariableKind, displayClassInstance As DisplayClassInstance, displayClassFields As ConsList(Of FieldSymbol)) Debug.Assert(displayClassFields.Any()) Me.Name = name Me.Kind = kind Me.DisplayClassInstance = displayClassInstance Me.DisplayClassFields = displayClassFields ' Verify all type parameters are substituted. Debug.Assert(Me.ContainingSymbol.IsContainingSymbolOfAllTypeParameters(Me.Type)) End Sub Friend ReadOnly Property Type As TypeSymbol Get Return Me.DisplayClassFields.Head.Type End Get End Property Friend ReadOnly Property ContainingSymbol As Symbol Get Return Me.DisplayClassInstance.ContainingSymbol End Get End Property Friend Function ToOtherMethod(method As MethodSymbol, typeMap As TypeSubstitution) As DisplayClassVariable Dim otherInstance = Me.DisplayClassInstance.ToOtherMethod(method, typeMap) Return SubstituteFields(otherInstance, typeMap) End Function Friend Function ToBoundExpression(syntax As SyntaxNode, isLValue As Boolean, suppressVirtualCalls As Boolean) As BoundExpression Dim expr = Me.DisplayClassInstance.ToBoundExpression(syntax) Dim fields = ArrayBuilder(Of FieldSymbol).GetInstance() fields.AddRange(Me.DisplayClassFields) fields.ReverseContents() For Each field In fields expr = New BoundFieldAccess(syntax, expr, field, isLValue, suppressVirtualCalls, constantsInProgressOpt:=Nothing, type:=field.Type).MakeCompilerGenerated() Next fields.Free() Return expr End Function Friend Function SubstituteFields(otherInstance As DisplayClassInstance, typeMap As TypeSubstitution) As DisplayClassVariable Dim otherFields = SubstituteFields(Me.DisplayClassFields, typeMap) Return New DisplayClassVariable(Me.Name, Me.Kind, otherInstance, otherFields) End Function Private Function GetDebuggerDisplay() As String Return DisplayClassInstance.GetDebuggerDisplay(DisplayClassFields) End Function Private Shared Function SubstituteFields(fields As ConsList(Of FieldSymbol), typeMap As TypeSubstitution) As ConsList(Of FieldSymbol) If Not fields.Any() Then Return ConsList(Of FieldSymbol).Empty End If Dim head = SubstituteField(fields.Head, typeMap) Dim tail = SubstituteFields(fields.Tail, typeMap) Return tail.Prepend(head) End Function Private Shared Function SubstituteField(field As FieldSymbol, typeMap As TypeSubstitution) As FieldSymbol Debug.Assert(Not field.IsShared) Debug.Assert(Not field.IsReadOnly OrElse field.IsAnonymousTypeField(Nothing)) Debug.Assert(field.CustomModifiers.Length = 0) Debug.Assert(Not field.HasConstantValue) Return New EEDisplayClassFieldSymbol(typeMap.SubstituteNamedType(field.ContainingType), field.Name, typeMap.SubstituteType(field.Type), field.DeclaredAccessibility) End Function Private NotInheritable Class EEDisplayClassFieldSymbol Inherits FieldSymbol Private ReadOnly _container As NamedTypeSymbol Private ReadOnly _name As String Private ReadOnly _type As TypeSymbol Private ReadOnly _accessibility As Accessibility Friend Sub New(container As NamedTypeSymbol, name As String, type As TypeSymbol, accessibility As Accessibility) _container = container _name = name _type = type _accessibility = accessibility End Sub Public Overrides ReadOnly Property Name As String Get Return _name End Get End Property Public Overrides ReadOnly Property ContainingSymbol As Symbol Get Return _container End Get End Property Public Overrides ReadOnly Property AssociatedSymbol As Symbol Get Throw ExceptionUtilities.Unreachable End Get End Property Public Overrides ReadOnly Property CustomModifiers As ImmutableArray(Of CustomModifier) Get Return ImmutableArray(Of CustomModifier).Empty End Get End Property Public Overrides ReadOnly Property DeclaredAccessibility As Accessibility Get Return _accessibility ' Used by SymbolDisplay End Get End Property Public Overrides ReadOnly Property DeclaringSyntaxReferences As ImmutableArray(Of SyntaxReference) Get Throw ExceptionUtilities.Unreachable End Get End Property Public Overrides ReadOnly Property IsConst As Boolean Get Return False End Get End Property Public Overrides ReadOnly Property HasConstantValue As Boolean Get Return False End Get End Property Friend Overrides Function GetConstantValue(inProgress As ConstantFieldsInProgress) As ConstantValue Return Nothing End Function Public Overrides ReadOnly Property IsReadOnly As Boolean Get Return False End Get End Property Public Overrides ReadOnly Property IsShared As Boolean Get Return False End Get End Property Public Overrides ReadOnly Property Locations As ImmutableArray(Of Location) Get Throw ExceptionUtilities.Unreachable End Get End Property Public Overrides ReadOnly Property Type As TypeSymbol Get Return _type End Get End Property Friend Overrides ReadOnly Property HasRuntimeSpecialName As Boolean Get Throw ExceptionUtilities.Unreachable End Get End Property Friend Overrides ReadOnly Property HasSpecialName As Boolean Get Throw ExceptionUtilities.Unreachable End Get End Property Friend Overrides ReadOnly Property IsNotSerialized As Boolean Get Throw ExceptionUtilities.Unreachable End Get End Property Friend Overrides ReadOnly Property MarshallingInformation As MarshalPseudoCustomAttributeData Get Throw ExceptionUtilities.Unreachable End Get End Property Friend Overrides ReadOnly Property ObsoleteAttributeData As ObsoleteAttributeData Get Throw ExceptionUtilities.Unreachable End Get End Property Friend Overrides ReadOnly Property TypeLayoutOffset As Integer? Get Throw ExceptionUtilities.Unreachable End Get End Property Public Overrides ReadOnly Property IsRequired As Boolean Get Return False End Get End Property End Class End Class End Namespace