/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/SymbolExtensions.vb
99 строк
4 KB
Tomáš Matoušek
Generated names refactoring & support for function breakpoints on local functions (#55558)
13 авг 2021, 02:47
Не верифицирован
13 авг 2021, 02:47
d1e617d
Код
Авторство
О чём код?
' 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 System.Collections.ObjectModel Imports System.Runtime.CompilerServices Imports System.Runtime.InteropServices Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Namespace Microsoft.CodeAnalysis.VisualBasic.ExpressionEvaluator Friend Module SymbolExtensions <Extension> Friend Function GetCustomTypeInfoPayload(method As MethodSymbol) As ReadOnlyCollection(Of Byte) Return method.DeclaringCompilation.GetCustomTypeInfoPayload(method.ReturnType) End Function <Extension> Public Function IsContainingSymbolOfAllTypeParameters(containingSymbol As Symbol, type As TypeSymbol) As Boolean Return type.VisitType(s_hasInvalidTypeParameterFunc, containingSymbol) Is Nothing End Function Private ReadOnly s_hasInvalidTypeParameterFunc As Func(Of TypeSymbol, Symbol, Boolean) = AddressOf HasInvalidTypeParameter Private Function HasInvalidTypeParameter(type As TypeSymbol, containingSymbol As Symbol) As Boolean If type.TypeKind = TypeKind.TypeParameter Then Dim symbol = type.ContainingSymbol While containingSymbol IsNot Nothing AndAlso containingSymbol.Kind <> SymbolKind.Namespace If containingSymbol = symbol Then Return False End If containingSymbol = containingSymbol.ContainingSymbol End While Return True End If Return False End Function ''' <summary> ''' In VB, the type parameters of state machine classes (i.e. for implementing async ''' or iterator methods) are mangled. We unmangle them here so that the unmangled ''' names will bind properly. (Code gen only uses the ordinal, so the name shouldn't ''' affect behavior). ''' </summary> <Extension> Public Function GetUnmangledName(sourceTypeParameter As TypeParameterSymbol) As String Dim sourceName = sourceTypeParameter.Name If sourceName.StartsWith(GeneratedNameConstants.StateMachineTypeParameterPrefix, StringComparison.Ordinal) Then Debug.Assert(sourceTypeParameter.ContainingSymbol.Name. StartsWith(GeneratedNameConstants.StateMachineTypeNamePrefix, StringComparison.Ordinal)) Debug.Assert(sourceName.Length > GeneratedNameConstants.StateMachineTypeParameterPrefix.Length) Return sourceName.Substring(GeneratedNameConstants.StateMachineTypeParameterPrefix.Length) End If Return sourceName End Function <Extension> Friend Function IsClosureOrStateMachineType(type As TypeSymbol) As Boolean Return type.IsClosureType() OrElse type.IsStateMachineType() End Function <Extension> Friend Function IsClosureType(type As TypeSymbol) As Boolean Return type.Name.StartsWith(GeneratedNameConstants.DisplayClassPrefix, StringComparison.Ordinal) End Function <Extension> Friend Function IsStateMachineType(type As TypeSymbol) As Boolean Return type.Name.StartsWith(GeneratedNameConstants.StateMachineTypeNamePrefix, StringComparison.Ordinal) End Function <Extension> Friend Function GetAllTypeParameters(method As MethodSymbol) As ImmutableArray(Of TypeParameterSymbol) Dim builder = ArrayBuilder(Of TypeParameterSymbol).GetInstance() method.ContainingType.GetAllTypeParameters(builder) builder.AddRange(method.TypeParameters) Return builder.ToImmutableAndFree() End Function <Extension> Friend Function IsAnonymousTypeField(field As FieldSymbol, <Out> ByRef unmangledName As String) As Boolean If GeneratedNameParser.GetKind(field.ContainingType.Name) <> GeneratedNameKind.AnonymousType Then unmangledName = Nothing Return False End If unmangledName = field.Name If unmangledName(0) = "$"c Then unmangledName = unmangledName.Substring(1) End If Return True End Function End Module End Namespace