|
' 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
Imports System.Collections.Generic
Imports System.Collections.Immutable
Imports System.Diagnostics
Imports System.Globalization
Imports System.Runtime.InteropServices
Imports System.Threading
Imports Microsoft.CodeAnalysis.PooledObjects
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Emit
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports TypeKind = Microsoft.CodeAnalysis.TypeKind
Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Friend NotInheritable Class SourcePropertySymbol
Inherits PropertySymbol
Implements IAttributeTargetSymbol
Private ReadOnly _containingType As SourceMemberContainerTypeSymbol
Private ReadOnly _name As String
Private _lazyMetadataName As String
Private ReadOnly _syntaxRef As SyntaxReference
Private ReadOnly _blockRef As SyntaxReference
Private ReadOnly _location As Location
Private ReadOnly _flags As SourceMemberFlags
Private _lazyType As TypeSymbol
Private _lazyParameters As ImmutableArray(Of ParameterSymbol)
Private _getMethod As MethodSymbol
Private _setMethod As MethodSymbol
Private _backingField As FieldSymbol
Private _lazyDocComment As String
Private _lazyExpandedDocComment As String
Private _lazyMeParameter As ParameterSymbol
' Attributes on property. Set once after construction. IsNull means not set.
Private _lazyCustomAttributesBag As CustomAttributesBag(Of VisualBasicAttributeData)
' Attributes on return type of the property. Set once after construction. IsNull means not set.
Private _lazyReturnTypeCustomAttributesBag As CustomAttributesBag(Of VisualBasicAttributeData)
' The explicitly implemented interface properties, or Empty if none.
Private _lazyImplementedProperties As ImmutableArray(Of PropertySymbol)
' The overridden or hidden property.
Private _lazyOverriddenProperties As OverriddenMembersResult(Of PropertySymbol)
Private _lazyState As Integer
<Flags>
Private Enum StateFlags As Integer
SymbolDeclaredEvent = &H1 ' Bit value for generating SymbolDeclaredEvent
TypeConstraintsChecked = &H2
End Enum
Private Sub New(container As SourceMemberContainerTypeSymbol,
name As String,
flags As SourceMemberFlags,
syntaxRef As SyntaxReference,
blockRef As SyntaxReference,
location As Location)
Debug.Assert(container IsNot Nothing)
Debug.Assert(syntaxRef IsNot Nothing)
Debug.Assert(location IsNot Nothing)
_containingType = container
_name = name
_syntaxRef = syntaxRef
_blockRef = blockRef
_location = location
_flags = flags
_lazyState = 0
End Sub
Friend Shared Function Create(containingType As SourceMemberContainerTypeSymbol,
bodyBinder As Binder,
syntax As PropertyStatementSyntax,
blockSyntaxOpt As PropertyBlockSyntax,
diagnostics As DiagnosticBag) As SourcePropertySymbol
' Decode the flags.
Dim modifiers = DecodeModifiers(syntax.Modifiers,
containingType,
bodyBinder,
diagnostics)
Dim identifier = syntax.Identifier
Dim name = identifier.ValueText
Dim omitFurtherDiagnostics As Boolean = String.IsNullOrEmpty(name)
Dim location = identifier.GetLocation()
Dim syntaxRef = bodyBinder.GetSyntaxReference(syntax)
Dim blockRef = If(blockSyntaxOpt Is Nothing, Nothing, bodyBinder.GetSyntaxReference(blockSyntaxOpt))
Dim prop = New SourcePropertySymbol(containingType, name, modifiers.AllFlags, syntaxRef, blockRef, location)
bodyBinder = New LocationSpecificBinder(BindingLocation.PropertySignature, prop, bodyBinder)
If syntax.AttributeLists.Count = 0 Then
prop.SetCustomAttributeData(CustomAttributesBag(Of VisualBasicAttributeData).Empty)
End If
Dim accessorFlags = modifiers.AllFlags And (Not SourceMemberFlags.AccessibilityMask)
Dim getMethod As SourcePropertyAccessorSymbol = Nothing
Dim setMethod As SourcePropertyAccessorSymbol = Nothing
If blockSyntaxOpt IsNot Nothing Then
For Each accessor In blockSyntaxOpt.Accessors
Dim accessorKind = accessor.BlockStatement.Kind
If accessorKind = SyntaxKind.GetAccessorStatement Then
Dim accessorMethod = CreateAccessor(prop, SourceMemberFlags.MethodKindPropertyGet, accessorFlags, bodyBinder, accessor, diagnostics)
If getMethod Is Nothing Then
getMethod = accessorMethod
Else
diagnostics.Add(ERRID.ERR_DuplicatePropertyGet, accessorMethod.Locations(0))
End If
ElseIf accessorKind = SyntaxKind.SetAccessorStatement Then
Dim accessorMethod = CreateAccessor(prop, SourceMemberFlags.MethodKindPropertySet, accessorFlags, bodyBinder, accessor, diagnostics)
If setMethod Is Nothing Then
setMethod = accessorMethod
Else
diagnostics.Add(ERRID.ERR_DuplicatePropertySet, accessorMethod.Locations(0))
End If
End If
Next
End If
Dim isReadOnly = (modifiers.FoundFlags And SourceMemberFlags.ReadOnly) <> 0
Dim isWriteOnly = (modifiers.FoundFlags And SourceMemberFlags.WriteOnly) <> 0
If Not prop.IsMustOverride Then
If isReadOnly Then
If getMethod IsNot Nothing Then
If getMethod.LocalAccessibility <> Accessibility.NotApplicable Then
diagnostics.Add(ERRID.ERR_ReadOnlyNoAccessorFlag, GetAccessorBlockBeginLocation(getMethod))
End If
ElseIf blockSyntaxOpt IsNot Nothing Then
diagnostics.Add(ERRID.ERR_ReadOnlyHasNoGet, location)
End If
If setMethod IsNot Nothing Then
diagnostics.Add(ERRID.ERR_ReadOnlyHasSet, setMethod.Locations(0))
End If
End If
If isWriteOnly Then
If setMethod IsNot Nothing Then
If setMethod.LocalAccessibility <> Accessibility.NotApplicable Then
diagnostics.Add(ERRID.ERR_WriteOnlyNoAccessorFlag, GetAccessorBlockBeginLocation(setMethod))
End If
ElseIf blockSyntaxOpt IsNot Nothing Then
diagnostics.Add(ERRID.ERR_WriteOnlyHasNoWrite, location)
End If
If getMethod IsNot Nothing Then
diagnostics.Add(ERRID.ERR_WriteOnlyHasGet, getMethod.Locations(0))
End If
End If
If (getMethod IsNot Nothing) AndAlso (setMethod IsNot Nothing) Then
If (getMethod.LocalAccessibility <> Accessibility.NotApplicable) AndAlso (setMethod.LocalAccessibility <> Accessibility.NotApplicable) Then
' Both accessors have explicit accessibility. Report an error on the second.
Dim accessor = If(getMethod.Locations(0).SourceSpan.Start < setMethod.Locations(0).SourceSpan.Start, setMethod, getMethod)
diagnostics.Add(ERRID.ERR_OnlyOneAccessorForGetSet, GetAccessorBlockBeginLocation(accessor))
ElseIf prop.IsOverridable AndAlso
((getMethod.LocalAccessibility = Accessibility.Private) OrElse (setMethod.LocalAccessibility = Accessibility.Private)) Then
' If either accessor is Private, property cannot be Overridable.
bodyBinder.ReportModifierError(syntax.Modifiers, ERRID.ERR_BadPropertyAccessorFlags3, diagnostics, s_overridableModifierKinds)
End If
End If
If (Not isReadOnly) AndAlso
(Not isWriteOnly) AndAlso
((getMethod Is Nothing) OrElse (setMethod Is Nothing)) AndAlso
(blockSyntaxOpt IsNot Nothing) AndAlso
(Not prop.IsMustOverride) Then
diagnostics.Add(ERRID.ERR_PropMustHaveGetSet, location)
End If
End If
If blockSyntaxOpt Is Nothing Then
' Generate backing field for auto property.
If Not prop.IsMustOverride Then
If isWriteOnly Then
diagnostics.Add(ERRID.ERR_AutoPropertyCantBeWriteOnly, location)
End If
Debug.Assert(WellKnownMembers.IsSynthesizedAttributeOptional(WellKnownMember.System_Runtime_CompilerServices_CompilerGeneratedAttribute__ctor))
Dim fieldName = "_" + prop._name
prop._backingField = New SynthesizedPropertyBackingFieldSymbol(prop, fieldName, isShared:=prop.IsShared)
End If
Dim flags = prop._flags And Not SourceMemberFlags.MethodKindMask
' Generate accessors for auto property or abstract property.
If Not isWriteOnly Then
prop._getMethod = New SourcePropertyAccessorSymbol(
prop,
Binder.GetAccessorName(prop.Name, MethodKind.PropertyGet, isWinMd:=False),
flags Or SourceMemberFlags.MethodKindPropertyGet,
prop._syntaxRef,
prop.Locations)
End If
If Not isReadOnly Then
prop._setMethod = New SourcePropertyAccessorSymbol(
prop,
Binder.GetAccessorName(prop.Name, MethodKind.PropertySet,
isWinMd:=prop.IsCompilationOutputWinMdObj()),
flags Or SourceMemberFlags.MethodKindPropertySet Or SourceMemberFlags.MethodIsSub,
prop._syntaxRef,
prop.Locations)
End If
Else
prop._getMethod = getMethod
prop._setMethod = setMethod
End If
Debug.Assert((prop._getMethod Is Nothing) OrElse prop._getMethod.ImplicitlyDefinedBy Is prop)
Debug.Assert((prop._setMethod Is Nothing) OrElse prop._setMethod.ImplicitlyDefinedBy Is prop)
Return prop
End Function
Friend Shared Function CreateWithEvents(
containingType As SourceMemberContainerTypeSymbol,
bodyBinder As Binder,
identifier As SyntaxToken,
syntaxRef As SyntaxReference,
modifiers As MemberModifiers,
firstFieldDeclarationOfType As Boolean,
diagnostics As BindingDiagnosticBag) As SourcePropertySymbol
Dim name = identifier.ValueText
' we will require AccessedThroughPropertyAttribute
bodyBinder.ReportUseSiteInfoForSynthesizedAttribute(WellKnownMember.System_Runtime_CompilerServices_AccessedThroughPropertyAttribute__ctor,
DirectCast(identifier.Parent, VisualBasicSyntaxNode),
diagnostics)
Dim omitFurtherDiagnostics As Boolean = String.IsNullOrEmpty(name)
Dim location = identifier.GetLocation()
' WithEvents instance property is always overridable
Dim memberFlags = modifiers.AllFlags
If (memberFlags And SourceMemberFlags.Shared) = 0 Then
memberFlags = modifiers.AllFlags Or SourceMemberFlags.Overridable
End If
If firstFieldDeclarationOfType Then
memberFlags = memberFlags Or SourceMemberFlags.FirstFieldDeclarationOfType
End If
Dim prop = New SourcePropertySymbol(containingType,
name,
memberFlags,
syntaxRef,
Nothing,
location)
' no implements.
prop._lazyImplementedProperties = ImmutableArray(Of PropertySymbol).Empty
prop.SetCustomAttributeData(CustomAttributesBag(Of VisualBasicAttributeData).Empty)
Dim fieldName = "_" + prop._name
prop._backingField = New SourceWithEventsBackingFieldSymbol(prop, syntaxRef, fieldName)
' Generate synthesized accessors for auto property or abstract property.
prop._getMethod = New SynthesizedWithEventsGetAccessorSymbol(
containingType,
prop)
prop._setMethod = New SynthesizedWithEventsSetAccessorSymbol(
containingType,
prop,
bodyBinder.GetSpecialType(SpecialType.System_Void, identifier, diagnostics),
valueParameterName:=StringConstants.WithEventsValueParameterName)
Debug.Assert((prop._getMethod Is Nothing) OrElse prop._getMethod.ImplicitlyDefinedBy Is prop)
Debug.Assert((prop._setMethod Is Nothing) OrElse prop._setMethod.ImplicitlyDefinedBy Is prop)
Return prop
End Function
Friend Sub CloneParametersForAccessor(method As MethodSymbol, parameterBuilder As ArrayBuilder(Of ParameterSymbol))
Dim overriddenMethod As MethodSymbol = method.OverriddenMethod
For Each parameter In Me.Parameters
Dim clone As ParameterSymbol = New SourcePropertyClonedParameterSymbolForAccessors(DirectCast(parameter, SourceParameterSymbol), method)
If overriddenMethod IsNot Nothing Then
CustomModifierUtils.CopyParameterCustomModifiers(overriddenMethod.Parameters(parameter.Ordinal), clone)
End If
parameterBuilder.Add(clone)
Next
End Sub
''' <summary>
''' Property declaration syntax node.
''' It is either PropertyStatement for normal properties or FieldDeclarationSyntax for WithEvents ones.
''' </summary>
Friend ReadOnly Property DeclarationSyntax As DeclarationStatementSyntax
Get
Dim syntax = _syntaxRef.GetVisualBasicSyntax()
If syntax.Kind = SyntaxKind.PropertyStatement Then
Return DirectCast(syntax, PropertyStatementSyntax)
Else
Debug.Assert(syntax.Kind = SyntaxKind.ModifiedIdentifier)
Return DirectCast(syntax.Parent.Parent, FieldDeclarationSyntax)
End If
End Get
End Property
Public Overrides ReadOnly Property ReturnsByRef As Boolean
Get
Return False
End Get
End Property
Public Overrides ReadOnly Property RefCustomModifiers As ImmutableArray(Of CustomModifier)
Get
Return ImmutableArray(Of CustomModifier).Empty
End Get
End Property
Public Overrides ReadOnly Property Type As TypeSymbol
Get
EnsureSignature()
Return _lazyType
End Get
End Property
Private Function ComputeType(diagnostics As BindingDiagnosticBag) As TypeSymbol
Dim binder = BinderBuilder.CreateBinderForType(DirectCast(ContainingModule, SourceModuleSymbol), _syntaxRef.SyntaxTree, _containingType)
binder = New LocationSpecificBinder(BindingLocation.PropertyType, Me, binder)
If IsWithEvents Then
Dim syntax = DirectCast(_syntaxRef.GetSyntax(), ModifiedIdentifierSyntax)
Return SourceMemberFieldSymbol.ComputeWithEventsFieldType(
Me,
syntax,
binder,
ignoreTypeSyntaxDiagnostics:=(_flags And SourceMemberFlags.FirstFieldDeclarationOfType) = 0,
diagnostics:=diagnostics)
Else
Dim syntax = DirectCast(_syntaxRef.GetSyntax(), PropertyStatementSyntax)
Dim asClause = syntax.AsClause
If asClause IsNot Nothing AndAlso
asClause.Kind = SyntaxKind.AsNewClause AndAlso
(DirectCast(asClause, AsNewClauseSyntax).NewExpression.Kind = SyntaxKind.AnonymousObjectCreationExpression) Then
Return ErrorTypeSymbol.UnknownResultType
Else
Dim getErrorInfo As Func(Of DiagnosticInfo) = Nothing
Dim omitFurtherDiagnostics As Boolean = String.IsNullOrEmpty(_name)
If Not omitFurtherDiagnostics Then
If binder.OptionStrict = OptionStrict.On Then
getErrorInfo = ErrorFactory.GetErrorInfo_ERR_StrictDisallowsImplicitProc
ElseIf binder.OptionStrict = OptionStrict.Custom Then
getErrorInfo = ErrorFactory.GetErrorInfo_WRN_ObjectAssumedProperty1_WRN_MissingAsClauseinProperty
End If
End If
Dim identifier = syntax.Identifier
Dim type = binder.DecodeIdentifierType(identifier, asClause, getErrorInfo, diagnostics)
Debug.Assert(type IsNot Nothing)
If Not type.IsErrorType() Then
Dim errorLocation = SourceSymbolHelpers.GetAsClauseLocation(identifier, asClause)
AccessCheck.VerifyAccessExposureForMemberType(Me, errorLocation, type, diagnostics)
Dim restrictedType As TypeSymbol = Nothing
If type.IsRestrictedTypeOrArrayType(restrictedType) Then
Binder.ReportDiagnostic(diagnostics, errorLocation, ERRID.ERR_RestrictedType1, restrictedType)
End If
Dim getMethod = Me.GetMethod
If getMethod IsNot Nothing AndAlso getMethod.IsIterator Then
Dim originalRetTypeDef = type.OriginalDefinition
If originalRetTypeDef.SpecialType <> SpecialType.System_Collections_Generic_IEnumerable_T AndAlso
originalRetTypeDef.SpecialType <> SpecialType.System_Collections_Generic_IEnumerator_T AndAlso
type.SpecialType <> SpecialType.System_Collections_IEnumerable AndAlso
type.SpecialType <> SpecialType.System_Collections_IEnumerator Then
Binder.ReportDiagnostic(diagnostics, errorLocation, ERRID.ERR_BadIteratorReturn)
End If
End If
End If
Return type
End If
End If
End Function
Public Overrides ReadOnly Property Name As String
Get
Return _name
End Get
End Property
Public Overrides ReadOnly Property MetadataName As String
Get
If _lazyMetadataName Is Nothing Then
OverloadingHelper.SetMetadataNameForAllOverloads(_name, SymbolKind.Property, _containingType)
Debug.Assert(_lazyMetadataName IsNot Nothing)
End If
Return _lazyMetadataName
End Get
End Property
Friend Overrides Sub SetMetadataName(metadataName As String)
Dim old = Interlocked.CompareExchange(_lazyMetadataName, metadataName, Nothing)
Debug.Assert(old Is Nothing OrElse old = metadataName)
End Sub
Public Overrides ReadOnly Property ContainingSymbol As Symbol
Get
Return _containingType
End Get
End Property
Public Overrides ReadOnly Property ContainingType As NamedTypeSymbol
Get
Return _containingType
End Get
End Property
Public ReadOnly Property ContainingSourceType As SourceMemberContainerTypeSymbol
Get
Return _containingType
End Get
End Property
Friend Overrides Function GetLexicalSortKey() As LexicalSortKey
' WARNING: this should not allocate memory!
Return New LexicalSortKey(_location, Me.DeclaringCompilation)
End Function
Public Overrides ReadOnly Property Locations As ImmutableArray(Of Location)
Get
Return ImmutableArray.Create(_location)
End Get
End Property
Public Overrides ReadOnly Property DeclaringSyntaxReferences As ImmutableArray(Of SyntaxReference)
Get
Return GetDeclaringSyntaxReferenceHelper(_syntaxRef)
End Get
End Property
Friend Overrides Function IsDefinedInSourceTree(tree As SyntaxTree, definedWithinSpan As TextSpan?, Optional cancellationToken As CancellationToken = Nothing) As Boolean
Dim propertyStatementSyntax = Me.Syntax
Return propertyStatementSyntax IsNot Nothing AndAlso IsDefinedInSourceTree(propertyStatementSyntax.Parent, tree, definedWithinSpan, cancellationToken)
End Function
Public ReadOnly Property DefaultAttributeLocation As AttributeLocation Implements IAttributeTargetSymbol.DefaultAttributeLocation
Get
Return AttributeLocation.Property
End Get
End Property
Private Function GetAttributeDeclarations() As OneOrMany(Of SyntaxList(Of AttributeListSyntax))
If Me.IsWithEvents Then
Return Nothing
End If
Return OneOrMany.Create(DirectCast(_syntaxRef.GetSyntax, PropertyStatementSyntax).AttributeLists)
End Function
Private Function GetReturnTypeAttributeDeclarations() As OneOrMany(Of SyntaxList(Of AttributeListSyntax))
If Me.IsWithEvents Then
Return Nothing
End If
Dim asClauseOpt = DirectCast(Me.Syntax, PropertyStatementSyntax).AsClause
If asClauseOpt Is Nothing Then
Return Nothing
End If
Return OneOrMany.Create(asClauseOpt.Attributes)
End Function
Friend Function GetAttributesBag() As CustomAttributesBag(Of VisualBasicAttributeData)
If _lazyCustomAttributesBag Is Nothing OrElse Not _lazyCustomAttributesBag.IsSealed Then
LoadAndValidateAttributes(Me.GetAttributeDeclarations(), _lazyCustomAttributesBag)
End If
Return _lazyCustomAttributesBag
End Function
Friend Function GetReturnTypeAttributesBag() As CustomAttributesBag(Of VisualBasicAttributeData)
If _lazyReturnTypeCustomAttributesBag Is Nothing OrElse Not _lazyReturnTypeCustomAttributesBag.IsSealed Then
LoadAndValidateAttributes(GetReturnTypeAttributeDeclarations(), _lazyReturnTypeCustomAttributesBag, symbolPart:=AttributeLocation.Return)
End If
Return _lazyReturnTypeCustomAttributesBag
End Function
''' <summary>
''' Gets the attributes applied on this symbol.
''' Returns an empty array if there are no attributes.
''' </summary>
''' <remarks>
''' NOTE: This method should always be kept as a NotOverridable method.
''' If you want to override attribute binding logic for a sub-class, then override <see cref="GetAttributesBag"/> method.
''' </remarks>
Public Overloads Overrides Function GetAttributes() As ImmutableArray(Of VisualBasicAttributeData)
Return Me.GetAttributesBag().Attributes
End Function
Private Function GetDecodedWellKnownAttributeData() As CommonPropertyWellKnownAttributeData
Dim attributesBag As CustomAttributesBag(Of VisualBasicAttributeData) = Me._lazyCustomAttributesBag
If attributesBag Is Nothing OrElse Not attributesBag.IsDecodedWellKnownAttributeDataComputed Then
attributesBag = Me.GetAttributesBag()
End If
Return DirectCast(attributesBag.DecodedWellKnownAttributeData, CommonPropertyWellKnownAttributeData)
End Function
Private Function GetDecodedReturnTypeWellKnownAttributeData() As CommonReturnTypeWellKnownAttributeData
Dim attributesBag As CustomAttributesBag(Of VisualBasicAttributeData) = Me._lazyReturnTypeCustomAttributesBag
If attributesBag Is Nothing OrElse Not attributesBag.IsDecodedWellKnownAttributeDataComputed Then
attributesBag = Me.GetReturnTypeAttributesBag()
End If
Return DirectCast(attributesBag.DecodedWellKnownAttributeData, CommonReturnTypeWellKnownAttributeData)
End Function
Friend Overrides Function EarlyDecodeWellKnownAttribute(ByRef arguments As EarlyDecodeWellKnownAttributeArguments(Of EarlyWellKnownAttributeBinder, NamedTypeSymbol, AttributeSyntax, AttributeLocation)) As VisualBasicAttributeData
Debug.Assert(arguments.AttributeType IsNot Nothing)
Debug.Assert(Not arguments.AttributeType.IsErrorType())
Dim boundAttribute As VisualBasicAttributeData = Nothing
Dim obsoleteData As ObsoleteAttributeData = Nothing
If EarlyDecodeDeprecatedOrExperimentalOrObsoleteAttribute(arguments, boundAttribute, obsoleteData) Then
If obsoleteData IsNot Nothing Then
arguments.GetOrCreateData(Of CommonPropertyEarlyWellKnownAttributeData)().ObsoleteAttributeData = obsoleteData
End If
Return boundAttribute
ElseIf VisualBasicAttributeData.IsTargetEarlyAttribute(arguments.AttributeType, arguments.AttributeSyntax, AttributeDescription.OverloadResolutionPriorityAttribute) Then
If Not CanHaveOverloadResolutionPriority Then
'Cannot use 'OverloadResolutionPriorityAttribute' on this member.
Return Nothing
End If
Dim hasAnyDiagnostics As Boolean = False
Dim attrdata = arguments.Binder.GetAttribute(arguments.AttributeSyntax, arguments.AttributeType, hasAnyDiagnostics)
If Not attrdata.HasErrors Then
Dim priority As Integer = attrdata.GetConstructorArgument(Of Integer)(0, SpecialType.System_Int32)
arguments.GetOrCreateData(Of CommonPropertyEarlyWellKnownAttributeData)().OverloadResolutionPriority = priority
Return If(Not hasAnyDiagnostics, attrdata, Nothing)
Else
Return Nothing
End If
End If
Return MyBase.EarlyDecodeWellKnownAttribute(arguments)
End Function
Friend Overrides Sub DecodeWellKnownAttribute(ByRef arguments As DecodeWellKnownAttributeArguments(Of AttributeSyntax, VisualBasicAttributeData, AttributeLocation))
Debug.Assert(arguments.AttributeSyntaxOpt IsNot Nothing)
Dim attrData = arguments.Attribute
Dim diagnostics = DirectCast(arguments.Diagnostics, BindingDiagnosticBag)
If attrData.IsTargetAttribute(AttributeDescription.TupleElementNamesAttribute) Then
diagnostics.Add(ERRID.ERR_ExplicitTupleElementNamesAttribute, arguments.AttributeSyntaxOpt.Location)
End If
If arguments.SymbolPart = AttributeLocation.Return Then
Dim isMarshalAs = attrData.IsTargetAttribute(AttributeDescription.MarshalAsAttribute)
' write-only property doesn't accept any return type attributes other than MarshalAs
' MarshalAs is applied on the "Value" parameter of the setter if the property has no parameters and the containing type is an interface .
If _getMethod Is Nothing AndAlso _setMethod IsNot Nothing AndAlso
(Not isMarshalAs OrElse Not SynthesizedParameterSymbol.IsMarshalAsAttributeApplicable(_setMethod)) Then
diagnostics.Add(ERRID.WRN_ReturnTypeAttributeOnWriteOnlyProperty, arguments.AttributeSyntaxOpt.GetLocation())
Return
End If
If isMarshalAs Then
MarshalAsAttributeDecoder(Of CommonReturnTypeWellKnownAttributeData, AttributeSyntax, VisualBasicAttributeData, AttributeLocation).
Decode(arguments, AttributeTargets.Field, MessageProvider.Instance)
Return
End If
Else
If attrData.IsTargetAttribute(AttributeDescription.SpecialNameAttribute) Then
arguments.GetOrCreateData(Of CommonPropertyWellKnownAttributeData).HasSpecialNameAttribute = True
Return
ElseIf attrData.IsTargetAttribute(AttributeDescription.ExcludeFromCodeCoverageAttribute) Then
arguments.GetOrCreateData(Of CommonPropertyWellKnownAttributeData).HasExcludeFromCodeCoverageAttribute = True
Return
ElseIf Not IsWithEvents AndAlso attrData.IsTargetAttribute(AttributeDescription.DebuggerHiddenAttribute) Then
' if neither getter or setter is marked by DebuggerHidden Dev11 reports a warning
If Not (_getMethod IsNot Nothing AndAlso DirectCast(_getMethod, SourcePropertyAccessorSymbol).HasDebuggerHiddenAttribute OrElse
_setMethod IsNot Nothing AndAlso DirectCast(_setMethod, SourcePropertyAccessorSymbol).HasDebuggerHiddenAttribute) Then
diagnostics.Add(ERRID.WRN_DebuggerHiddenIgnoredOnProperties, arguments.AttributeSyntaxOpt.GetLocation())
End If
Return
ElseIf arguments.Attribute.IsTargetAttribute(AttributeDescription.OverloadResolutionPriorityAttribute) Then
If Not CanHaveOverloadResolutionPriority Then
diagnostics.Add(If(IsOverrides,
ERRID.ERR_CannotApplyOverloadResolutionPriorityToOverride,
ERRID.ERR_CannotApplyOverloadResolutionPriorityToMember),
arguments.AttributeSyntaxOpt.GetLocation())
Else
InternalSyntax.Parser.CheckFeatureAvailability(diagnostics,
arguments.AttributeSyntaxOpt.GetLocation(),
DirectCast(arguments.AttributeSyntaxOpt.SyntaxTree.Options, VisualBasicParseOptions).LanguageVersion,
InternalSyntax.Feature.OverloadResolutionPriority)
End If
Return
End If
End If
MyBase.DecodeWellKnownAttribute(arguments)
End Sub
Friend Overrides ReadOnly Property IsDirectlyExcludedFromCodeCoverage As Boolean
Get
Dim data = GetDecodedWellKnownAttributeData()
Return data IsNot Nothing AndAlso data.HasExcludeFromCodeCoverageAttribute
End Get
End Property
Friend Overrides ReadOnly Property HasSpecialName As Boolean
Get
Dim data = GetDecodedWellKnownAttributeData()
Return data IsNot Nothing AndAlso data.HasSpecialNameAttribute
End Get
End Property
Friend ReadOnly Property ReturnTypeMarshallingInformation As MarshalPseudoCustomAttributeData
Get
Dim data = GetDecodedReturnTypeWellKnownAttributeData()
Return If(data IsNot Nothing, data.MarshallingInformation, Nothing)
End Get
End Property
Public Overrides ReadOnly Property IsMustOverride As Boolean
Get
Return (_flags And SourceMemberFlags.MustOverride) <> 0
End Get
End Property
Public Overrides ReadOnly Property IsNotOverridable As Boolean
Get
Return (_flags And SourceMemberFlags.NotOverridable) <> 0
End Get
End Property
Public Overrides ReadOnly Property IsOverridable As Boolean
Get
Return (_flags And SourceMemberFlags.Overridable) <> 0
End Get
End Property
Public Overrides ReadOnly Property IsOverrides As Boolean
Get
Return (_flags And SourceMemberFlags.Overrides) <> 0
End Get
End Property
Public Overrides ReadOnly Property IsShared As Boolean
Get
Return (_flags And SourceMemberFlags.Shared) <> 0
End Get
End Property
Public Overrides ReadOnly Property IsDefault As Boolean
Get
Return (_flags And SourceMemberFlags.Default) <> 0
End Get
End Property
Public Overrides ReadOnly Property IsWriteOnly As Boolean
Get
Return (_flags And SourceMemberFlags.WriteOnly) <> 0
End Get
End Property
Public Overrides ReadOnly Property IsReadOnly As Boolean
Get
Return (_flags And SourceMemberFlags.ReadOnly) <> 0
End Get
End Property
Public Overrides ReadOnly Property GetMethod As MethodSymbol
Get
Return _getMethod
End Get
End Property
Public Overrides ReadOnly Property SetMethod As MethodSymbol
Get
Return _setMethod
End Get
End Property
Public Overrides ReadOnly Property IsOverloads As Boolean
Get
If (_flags And SourceMemberFlags.Shadows) <> 0 Then
Return False
ElseIf (_flags And SourceMemberFlags.Overloads) <> 0 Then
Return True
Else
Return (_flags And SourceMemberFlags.Overrides) <> 0
End If
End Get
End Property
Public Overrides Function GetOverloadResolutionPriority() As Integer
Dim data As CommonPropertyEarlyWellKnownAttributeData = Me.GetEarlyDecodedWellKnownAttributeData()
Return If(data?.OverloadResolutionPriority, 0)
End Function
Private Function GetEarlyDecodedWellKnownAttributeData() As CommonPropertyEarlyWellKnownAttributeData
Dim attributesBag As CustomAttributesBag(Of VisualBasicAttributeData) = Me._lazyCustomAttributesBag
If attributesBag Is Nothing OrElse Not attributesBag.IsEarlyDecodedWellKnownAttributeDataComputed Then
attributesBag = Me.GetAttributesBag()
End If
Return DirectCast(attributesBag.EarlyDecodedWellKnownAttributeData, CommonPropertyEarlyWellKnownAttributeData)
End Function
Public Overrides ReadOnly Property IsWithEvents As Boolean
Get
Return (_flags And SourceMemberFlags.WithEvents) <> 0
End Get
End Property
Friend Overrides ReadOnly Property ShadowsExplicitly As Boolean
Get
Return (_flags And SourceMemberFlags.Shadows) <> 0
End Get
End Property
''' <summary> True if 'Overloads' is explicitly specified in method's declaration </summary>
Friend ReadOnly Property OverloadsExplicitly As Boolean
Get
Return (_flags And SourceMemberFlags.Overloads) <> 0
End Get
End Property
''' <summary> True if 'Overrides' is explicitly specified in method's declaration </summary>
Friend ReadOnly Property OverridesExplicitly As Boolean
Get
Return (_flags And SourceMemberFlags.Overrides) <> 0
End Get
End Property
Friend Overrides ReadOnly Property CallingConvention As Microsoft.Cci.CallingConvention
Get
Return (If(IsShared, Microsoft.Cci.CallingConvention.Default, Microsoft.Cci.CallingConvention.HasThis))
End Get
End Property
Public Overrides ReadOnly Property Parameters As ImmutableArray(Of ParameterSymbol)
Get
EnsureSignature()
Return _lazyParameters
End Get
End Property
Private Sub EnsureSignature()
If _lazyParameters.IsDefault Then
Dim diagnostics = BindingDiagnosticBag.GetInstance()
Dim sourceModule = DirectCast(ContainingModule, SourceModuleSymbol)
Dim params As ImmutableArray(Of ParameterSymbol) = ComputeParameters(diagnostics)
Dim retType As TypeSymbol = ComputeType(diagnostics)
' For an overriding property, we need to copy custom modifiers from the property we override.
Dim overriddenMembers As OverriddenMembersResult(Of PropertySymbol)
If Not Me.IsOverrides OrElse Not OverrideHidingHelper.CanOverrideOrHide(Me) Then
overriddenMembers = OverriddenMembersResult(Of PropertySymbol).Empty
Else
' Since we cannot expose parameters and return type to the outside world yet,
' let's create a fake symbol to use for overriding resolution
Dim fakeParamsBuilder = ArrayBuilder(Of ParameterSymbol).GetInstance(params.Length)
For Each param As ParameterSymbol In params
fakeParamsBuilder.Add(New SignatureOnlyParameterSymbol(
param.Type,
ImmutableArray(Of CustomModifier).Empty,
ImmutableArray(Of CustomModifier).Empty,
defaultConstantValue:=Nothing,
isParamArray:=False,
isByRef:=param.IsByRef,
isOut:=False,
isOptional:=param.IsOptional))
Next
overriddenMembers = OverrideHidingHelper(Of PropertySymbol).
MakeOverriddenMembers(New SignatureOnlyPropertySymbol(Me.Name, _containingType,
Me.IsReadOnly, Me.IsWriteOnly,
fakeParamsBuilder.ToImmutableAndFree(),
returnsByRef:=False,
[type]:=retType,
typeCustomModifiers:=ImmutableArray(Of CustomModifier).Empty,
refCustomModifiers:=ImmutableArray(Of CustomModifier).Empty,
isOverrides:=True, isWithEvents:=Me.IsWithEvents))
End If
Debug.Assert(IsDefinition)
Dim overridden = overriddenMembers.OverriddenMember
If overridden IsNot Nothing Then
' Copy custom modifiers
Dim returnTypeWithCustomModifiers As TypeSymbol = overridden.Type
' We do an extra check before copying the return type to handle the case where the overriding
' property (incorrectly) has a different return type than the overridden property. In such cases,
' we want to retain the original (incorrect) return type to avoid hiding the return type
' given in source.
If retType.IsSameType(returnTypeWithCustomModifiers, TypeCompareKind.IgnoreCustomModifiersAndArraySizesAndLowerBounds) Then
retType = CustomModifierUtils.CopyTypeCustomModifiers(returnTypeWithCustomModifiers, retType)
End If
params = CustomModifierUtils.CopyParameterCustomModifiers(overridden.Parameters, params)
End If
' Unlike PropertySymbol, in SourcePropertySymbol we cache the result of MakeOverriddenOfHiddenMembers, because we use
' it heavily while validating methods and emitting.
Interlocked.CompareExchange(_lazyOverriddenProperties, overriddenMembers, Nothing)
Interlocked.CompareExchange(_lazyType, retType, Nothing)
sourceModule.AtomicStoreArrayAndDiagnostics(
_lazyParameters,
params,
diagnostics)
diagnostics.Free()
End If
End Sub
Public Overrides ReadOnly Property ParameterCount As Integer
Get
If Not Me._lazyParameters.IsDefault Then
Return Me._lazyParameters.Length
End If
Dim decl = Me.DeclarationSyntax
If decl.Kind = SyntaxKind.PropertyStatement Then
Dim paramList As ParameterListSyntax = DirectCast(decl, PropertyStatementSyntax).ParameterList
Return If(paramList Is Nothing, 0, paramList.Parameters.Count)
End If
Return MyBase.ParameterCount
End Get
End Property
Private Function ComputeParameters(diagnostics As BindingDiagnosticBag) As ImmutableArray(Of ParameterSymbol)
If Me.IsWithEvents Then
' no parameters
Return ImmutableArray(Of ParameterSymbol).Empty
End If
Dim binder = CreateBinderForTypeDeclaration()
Dim syntax = DirectCast(_syntaxRef.GetSyntax(), PropertyStatementSyntax)
Dim parameters = binder.DecodePropertyParameterList(Me, syntax.ParameterList, diagnostics)
If IsDefault Then
' Default properties must have required parameters.
If Not HasRequiredParameters(parameters) Then
diagnostics.Add(ERRID.ERR_DefaultPropertyWithNoParams, _location)
End If
' 'touch' System_Reflection_DefaultMemberAttribute__ctor to make sure all diagnostics are reported
binder.ReportUseSiteInfoForSynthesizedAttribute(WellKnownMember.System_Reflection_DefaultMemberAttribute__ctor,
syntax,
diagnostics)
End If
Return parameters
End Function
Friend Overrides ReadOnly Property MeParameter As ParameterSymbol
Get
If IsShared Then
Return Nothing
Else
If _lazyMeParameter Is Nothing Then
Interlocked.CompareExchange(Of ParameterSymbol)(_lazyMeParameter, New MeParameterSymbol(Me), Nothing)
End If
Return _lazyMeParameter
End If
End Get
End Property
Public Overrides ReadOnly Property ExplicitInterfaceImplementations As ImmutableArray(Of PropertySymbol)
Get
If _lazyImplementedProperties.IsDefault Then
Dim diagnostics = BindingDiagnosticBag.GetInstance()
Dim sourceModule = DirectCast(Me.ContainingModule, SourceModuleSymbol)
sourceModule.AtomicStoreArrayAndDiagnostics(_lazyImplementedProperties,
ComputeExplicitInterfaceImplementations(diagnostics),
diagnostics)
diagnostics.Free()
End If
Return _lazyImplementedProperties
End Get
End Property
Private Function ComputeExplicitInterfaceImplementations(diagnostics As BindingDiagnosticBag) As ImmutableArray(Of PropertySymbol)
Dim binder = CreateBinderForTypeDeclaration()
Dim syntax = DirectCast(_syntaxRef.GetSyntax(), PropertyStatementSyntax)
Return BindImplementsClause(_containingType, binder, Me, syntax, diagnostics)
End Function
''' <summary>
''' Helper method for accessors to get the overridden accessor methods. Should only be called by the
''' accessor method symbols.
''' </summary>
''' <param name="getter">True to get implemented getters, False to get implemented setters</param>
''' <returns>All the accessors of the given kind implemented by this property.</returns>
Friend Function GetAccessorImplementations(getter As Boolean) As ImmutableArray(Of MethodSymbol)
Dim implementedProperties = ExplicitInterfaceImplementations
Debug.Assert(Not implementedProperties.IsDefault)
If implementedProperties.IsEmpty Then
Return ImmutableArray(Of MethodSymbol).Empty
Else
Dim builder As ArrayBuilder(Of MethodSymbol) = ArrayBuilder(Of MethodSymbol).GetInstance()
For Each implementedProp In implementedProperties
Dim accessor = If(getter, implementedProp.GetMethod, implementedProp.SetMethod)
If accessor IsNot Nothing AndAlso accessor.RequiresImplementation() Then
builder.Add(accessor)
End If
Next
Return builder.ToImmutableAndFree()
End If
End Function
Friend Overrides ReadOnly Property OverriddenMembers As OverriddenMembersResult(Of PropertySymbol)
Get
EnsureSignature()
Return Me._lazyOverriddenProperties
End Get
End Property
Public Overrides ReadOnly Property TypeCustomModifiers As ImmutableArray(Of CustomModifier)
Get
Dim overridden = Me.OverriddenProperty
If overridden Is Nothing Then
Return ImmutableArray(Of CustomModifier).Empty
Else
Return overridden.TypeCustomModifiers
End If
End Get
End Property
Public Overrides ReadOnly Property DeclaredAccessibility As Accessibility
Get
Return CType((_flags And SourceMemberFlags.AccessibilityMask), Accessibility)
End Get
End Property
Public Overrides ReadOnly Property IsImplicitlyDeclared As Boolean
Get
Return _containingType.AreMembersImplicitlyDeclared
End Get
End Property
Friend ReadOnly Property IsCustomProperty As Boolean
Get
' Auto and WithEvents properties have backing fields
Return _backingField Is Nothing AndAlso Not IsMustOverride
End Get
End Property
Friend ReadOnly Property IsAutoProperty As Boolean
Get
Return Not IsWithEvents AndAlso _backingField IsNot Nothing
End Get
End Property
Friend Overrides ReadOnly Property AssociatedField As FieldSymbol
Get
Return _backingField
End Get
End Property
''' <summary>
''' Property declaration syntax node.
''' It is either PropertyStatement for normal properties or ModifiedIdentifier for WithEvents ones.
''' </summary>
Friend ReadOnly Property Syntax As VisualBasicSyntaxNode
Get
Return If(_syntaxRef IsNot Nothing, _syntaxRef.GetVisualBasicSyntax(), Nothing)
End Get
End Property
Friend ReadOnly Property SyntaxReference As SyntaxReference
Get
Return Me._syntaxRef
End Get
End Property
Friend ReadOnly Property BlockSyntaxReference As SyntaxReference
Get
Return Me._blockRef
End Get
End Property
Friend Overrides ReadOnly Property ObsoleteAttributeData As ObsoleteAttributeData
Get
' If there are no attributes then this symbol is not Obsolete.
If (Not Me._containingType.AnyMemberHasAttributes) Then
Return Nothing
End If
Dim lazyCustomAttributesBag = Me._lazyCustomAttributesBag
If (lazyCustomAttributesBag IsNot Nothing AndAlso lazyCustomAttributesBag.IsEarlyDecodedWellKnownAttributeDataComputed) Then
Dim data = DirectCast(_lazyCustomAttributesBag.EarlyDecodedWellKnownAttributeData, CommonPropertyEarlyWellKnownAttributeData)
Return If(data IsNot Nothing, data.ObsoleteAttributeData, Nothing)
End If
Return ObsoleteAttributeData.Uninitialized
End Get
End Property
' Get the location of the implements name for an explicit implemented property, for later error reporting.
Friend Function GetImplementingLocation(implementedProperty As PropertySymbol) As Location
Debug.Assert(ExplicitInterfaceImplementations.Contains(implementedProperty))
Dim propertySyntax = TryCast(_syntaxRef.GetSyntax(), PropertyStatementSyntax)
If propertySyntax IsNot Nothing AndAlso propertySyntax.ImplementsClause IsNot Nothing Then
Dim binder = CreateBinderForTypeDeclaration()
Dim implementingSyntax = FindImplementingSyntax(Of PropertySymbol)(propertySyntax.ImplementsClause,
Me,
implementedProperty,
_containingType,
binder)
Return implementingSyntax.GetLocation()
End If
Return If(Locations.FirstOrDefault(), NoLocation.Singleton)
End Function
Private Function CreateBinderForTypeDeclaration() As Binder
Dim binder = BinderBuilder.CreateBinderForType(DirectCast(ContainingModule, SourceModuleSymbol), _syntaxRef.SyntaxTree, _containingType)
Return New LocationSpecificBinder(BindingLocation.PropertySignature, Me, binder)
End Function
Private Shared Function CreateAccessor([property] As SourcePropertySymbol,
kindFlags As SourceMemberFlags,
propertyFlags As SourceMemberFlags,
bodyBinder As Binder,
syntax As AccessorBlockSyntax,
diagnostics As DiagnosticBag) As SourcePropertyAccessorSymbol
Dim accessor = SourcePropertyAccessorSymbol.CreatePropertyAccessor([property], kindFlags, propertyFlags, bodyBinder, syntax, diagnostics)
Debug.Assert(accessor IsNot Nothing)
Dim localAccessibility = accessor.LocalAccessibility
If Not IsAccessibilityMoreRestrictive([property].DeclaredAccessibility, localAccessibility) Then
ReportAccessorAccessibilityError(bodyBinder, syntax, ERRID.ERR_BadPropertyAccessorFlagsRestrict, diagnostics)
ElseIf [property].IsNotOverridable AndAlso localAccessibility = Accessibility.Private Then
ReportAccessorAccessibilityError(bodyBinder, syntax, ERRID.ERR_BadPropertyAccessorFlags1, diagnostics)
ElseIf [property].IsDefault AndAlso localAccessibility = Accessibility.Private Then
ReportAccessorAccessibilityError(bodyBinder, syntax, ERRID.ERR_BadPropertyAccessorFlags2, diagnostics)
End If
Return accessor
End Function
''' <summary>
''' Return true if the accessor accessibility is more restrictive
''' than the property accessibility, otherwise false.
''' </summary>
Private Shared Function IsAccessibilityMoreRestrictive([property] As Accessibility, accessor As Accessibility) As Boolean
If accessor = Accessibility.NotApplicable Then
Return True
End If
Return (accessor < [property]) AndAlso ((accessor <> Accessibility.Protected) OrElse ([property] <> Accessibility.Friend))
End Function
Public Overrides Function GetDocumentationCommentXml(Optional preferredCulture As CultureInfo = Nothing, Optional expandIncludes As Boolean = False, Optional cancellationToken As CancellationToken = Nothing) As String
If expandIncludes Then
Return GetAndCacheDocumentationComment(Me, preferredCulture, expandIncludes, _lazyExpandedDocComment, cancellationToken)
Else
Return GetAndCacheDocumentationComment(Me, preferredCulture, expandIncludes, _lazyDocComment, cancellationToken)
End If
End Function
Private Shared Function DecodeModifiers(modifiers As SyntaxTokenList,
container As SourceMemberContainerTypeSymbol,
binder As Binder,
diagBag As DiagnosticBag) As MemberModifiers
' Decode the flags.
Dim propertyModifiers = binder.DecodeModifiers(modifiers,
SourceMemberFlags.AllAccessibilityModifiers Or
SourceMemberFlags.Default Or
SourceMemberFlags.Overloads Or
SourceMemberFlags.Shadows Or
SourceMemberFlags.Shared Or
SourceMemberFlags.Overridable Or
SourceMemberFlags.NotOverridable Or
SourceMemberFlags.Overrides Or
SourceMemberFlags.MustOverride Or
SourceMemberFlags.ReadOnly Or
SourceMemberFlags.Iterator Or
SourceMemberFlags.WriteOnly,
ERRID.ERR_BadPropertyFlags1,
Accessibility.Public,
diagBag)
' Diagnose Shared with an overriding modifier.
Dim flags = propertyModifiers.FoundFlags
If (flags And SourceMemberFlags.Default) <> 0 AndAlso (flags And SourceMemberFlags.InvalidIfDefault) <> 0 Then
binder.ReportModifierError(modifiers, ERRID.ERR_BadFlagsWithDefault1, diagBag, InvalidModifiersIfDefault)
flags = flags And Not SourceMemberFlags.InvalidIfDefault
propertyModifiers = New MemberModifiers(flags, propertyModifiers.ComputedFlags)
End If
propertyModifiers = binder.ValidateSharedPropertyAndMethodModifiers(modifiers, propertyModifiers, True, container, diagBag)
Return propertyModifiers
End Function
Private Shared Function BindImplementsClause(containingType As SourceMemberContainerTypeSymbol,
bodyBinder As Binder,
prop As SourcePropertySymbol,
syntax As PropertyStatementSyntax,
diagnostics As BindingDiagnosticBag) As ImmutableArray(Of PropertySymbol)
If syntax.ImplementsClause IsNot Nothing Then
If prop.IsShared And Not containingType.IsModuleType Then
' Implementing with shared methods is illegal.
' Module case is caught inside ProcessImplementsClause and has different message.
Binder.ReportDiagnostic(diagnostics,
syntax.Modifiers.First(SyntaxKind.SharedKeyword),
ERRID.ERR_SharedOnProcThatImpl,
syntax.Identifier.ToString())
Else
Return ProcessImplementsClause(Of PropertySymbol)(syntax.ImplementsClause,
prop,
containingType,
bodyBinder,
diagnostics)
End If
End If
Return ImmutableArray(Of PropertySymbol).Empty
End Function
''' <summary>
''' Returns the location (span) of the accessor begin block.
''' (Used for consistency with the native compiler that
''' highlights the entire begin block for certain diagnostics.)
''' </summary>
Private Shared Function GetAccessorBlockBeginLocation(accessor As SourcePropertyAccessorSymbol) As Location
Dim syntaxTree = accessor.SyntaxTree
Dim block = DirectCast(accessor.BlockSyntax, AccessorBlockSyntax)
Debug.Assert(syntaxTree IsNot Nothing)
Debug.Assert(block IsNot Nothing)
Debug.Assert(block.BlockStatement IsNot Nothing)
Return syntaxTree.GetLocation(block.BlockStatement.Span)
End Function
Private Shared ReadOnly s_overridableModifierKinds() As SyntaxKind =
{
SyntaxKind.OverridableKeyword
}
Private Shared ReadOnly s_accessibilityModifierKinds() As SyntaxKind =
{
SyntaxKind.PrivateKeyword,
SyntaxKind.ProtectedKeyword,
SyntaxKind.FriendKeyword,
SyntaxKind.PublicKeyword
}
''' <summary>
''' Report an error associated with the accessor accessibility modifier.
''' </summary>
Private Shared Sub ReportAccessorAccessibilityError(binder As Binder,
syntax As AccessorBlockSyntax,
errorId As ERRID,
diagnostics As DiagnosticBag)
binder.ReportModifierError(syntax.BlockStatement.Modifiers, errorId, diagnostics, s_accessibilityModifierKinds)
End Sub
Private Shared Function HasRequiredParameters(parameters As ImmutableArray(Of ParameterSymbol)) As Boolean
For Each parameter In parameters
If Not parameter.IsOptional AndAlso Not parameter.IsParamArray Then
Return True
End If
Next
Return False
End Function
''' <summary>
''' Gets the syntax tree.
''' </summary>
Friend ReadOnly Property SyntaxTree As SyntaxTree
Get
Return _syntaxRef.SyntaxTree
End Get
End Property
' This should be called at most once after the attributes are bound. Attributes must be bound after the class
' and members are fully declared to avoid infinite recursion.
Private Sub SetCustomAttributeData(attributeData As CustomAttributesBag(Of VisualBasicAttributeData))
Debug.Assert(attributeData IsNot Nothing)
Debug.Assert(_lazyCustomAttributesBag Is Nothing)
_lazyCustomAttributesBag = attributeData
End Sub
Friend Overrides Sub GenerateDeclarationErrors(cancellationToken As CancellationToken)
MyBase.GenerateDeclarationErrors(cancellationToken)
' Ensure return type attributes are bound
Dim type = Me.Type
Dim unusedParameters = Me.Parameters
Me.GetReturnTypeAttributesBag()
Dim unusedImplementations = Me.ExplicitInterfaceImplementations
If (_lazyState And StateFlags.TypeConstraintsChecked) = 0 Then
Dim sourceModule = DirectCast(Me.ContainingModule, SourceModuleSymbol)
Dim diagnostics = BindingDiagnosticBag.GetInstance()
type.CheckAllConstraints(DeclaringCompilation.LanguageVersion,
Locations(0), diagnostics, template:=New CompoundUseSiteInfo(Of AssemblySymbol)(diagnostics, sourceModule.ContainingAssembly))
sourceModule.AtomicSetFlagAndStoreDiagnostics(_lazyState, StateFlags.TypeConstraintsChecked, 0, diagnostics)
diagnostics.Free()
End If
If DeclaringCompilation.EventQueue IsNot Nothing Then
DirectCast(Me.ContainingModule, SourceModuleSymbol).AtomicSetFlagAndRaiseSymbolDeclaredEvent(_lazyState, StateFlags.SymbolDeclaredEvent, 0, Me)
End If
End Sub
Friend Overrides ReadOnly Property IsMyGroupCollectionProperty As Boolean
Get
Return False
End Get
End Property
Friend Overrides Sub AddSynthesizedAttributes(moduleBuilder As PEModuleBuilder, ByRef attributes As ArrayBuilder(Of SynthesizedAttributeData))
MyBase.AddSynthesizedAttributes(moduleBuilder, attributes)
If Me.Type.ContainsTupleNames() Then
AddSynthesizedAttribute(attributes, DeclaringCompilation.SynthesizeTupleNamesAttribute(Type))
End If
End Sub
Public Overrides ReadOnly Property IsRequired As Boolean
Get
Return False
End Get
End Property
End Class
End Namespace
|