/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Portable/Parser/BlockContexts/InterfaceDeclarationBlockContext.vb
226 строк
9 KB
Jonathon Marolf
update headers
23 янв 2020, 04:01
Не верифицирован
23 янв 2020, 04:01
91571a3
Код
Авторство
О чём код?
' 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 Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Imports Microsoft.CodeAnalysis.VisualBasic.Syntax '----------------------------------------------------------------------------- ' Contains the definition of the BlockContext '----------------------------------------------------------------------------- Namespace Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax Friend NotInheritable Class InterfaceDeclarationBlockContext Inherits TypeBlockContext Friend Sub New(statement As StatementSyntax, prevContext As BlockContext) MyBase.New(SyntaxKind.InterfaceBlock, statement, prevContext) Debug.Assert(BlockKind = SyntaxKind.InterfaceBlock) End Sub Friend Overrides Function ProcessSyntax(node As VisualBasicSyntaxNode) As BlockContext ' davidsch - This replaces ParseInterfaceGroupStatement and ParseInterfaceMember Dim kind As SyntaxKind = node.Kind Do Select Case _state Case SyntaxKind.None Select Case node.Kind Case SyntaxKind.InheritsStatement _state = SyntaxKind.InheritsStatement Case Else _state = SyntaxKind.InterfaceStatement ' done with inherits End Select Case SyntaxKind.InheritsStatement Select Case node.Kind Case SyntaxKind.InheritsStatement Add(node) Return Me Case Else _inheritsDecls = BaseDeclarations(Of InheritsStatementSyntax)() _state = SyntaxKind.InterfaceStatement ' done with inherits End Select Case Else Exit Do End Select Loop ' we are in the interface's body Debug.Assert(_state = SyntaxKind.InterfaceStatement) Select Case kind Case _ SyntaxKind.DelegateSubStatement, SyntaxKind.DelegateFunctionStatement, SyntaxKind.SubStatement, SyntaxKind.FunctionStatement, SyntaxKind.EmptyStatement Add(node) Case SyntaxKind.IncompleteMember ' Incomplete members are always an error. node = Parser.ReportSyntaxError(node, ERRID.ERR_InterfaceMemberSyntax) Add(node) Case SyntaxKind.PropertyStatement ' Properties in interfaces cannot be initialized node = PropertyBlockContext.ReportErrorIfHasInitializer(DirectCast(node, PropertyStatementSyntax)) Add(node) Case SyntaxKind.SubNewStatement ' In Dev10 this is reported in Declared Add(Parser.ReportSyntaxError(node, ERRID.ERR_NewInInterface)) Case SyntaxKind.EventStatement Dim eventStatement = DirectCast(node, EventStatementSyntax) ' 'Custom' modifier invalid on event declared in an interface. If eventStatement.CustomKeyword IsNot Nothing Then eventStatement = Parser.ReportSyntaxError(eventStatement, ERRID.ERR_CustomEventInvInInterface) End If Add(eventStatement) Case SyntaxKind.EnumStatement Return New EnumDeclarationBlockContext(DirectCast(node, StatementSyntax), Me) Case SyntaxKind.ClassStatement Return New TypeBlockContext(SyntaxKind.ClassBlock, DirectCast(node, StatementSyntax), Me) Case SyntaxKind.StructureStatement Return New TypeBlockContext(SyntaxKind.StructureBlock, DirectCast(node, StatementSyntax), Me) Case SyntaxKind.InterfaceStatement Return New InterfaceDeclarationBlockContext(DirectCast(node, StatementSyntax), Me) Case SyntaxKind.FieldDeclaration Add(Parser.ReportSyntaxError(node, ERRID.ERR_InterfaceMemberSyntax)) Case SyntaxKind.LabelStatement node = Parser.ReportSyntaxError(node, ERRID.ERR_InvOutsideProc) Add(node) Case SyntaxKind.EnumBlock, SyntaxKind.ClassBlock, SyntaxKind.StructureBlock, SyntaxKind.InterfaceBlock ' Handle any block that can be created by this context Add(node) Case _ SyntaxKind.EndSubStatement, SyntaxKind.EndFunctionStatement, SyntaxKind.EndOperatorStatement, SyntaxKind.EndPropertyStatement, SyntaxKind.EndGetStatement, SyntaxKind.EndSetStatement, SyntaxKind.EndEventStatement, SyntaxKind.EndAddHandlerStatement, SyntaxKind.EndRemoveHandlerStatement, SyntaxKind.EndRaiseEventStatement Add(Parser.ReportSyntaxError(node, ERRID.ERR_InvInsideInterface)) Case _ SyntaxKind.StructureStatement, SyntaxKind.ClassStatement, SyntaxKind.InterfaceStatement, SyntaxKind.EnumStatement, SyntaxKind.DelegateSubStatement, SyntaxKind.NamespaceStatement ' End the current block and add the block to the context above which should be able to handle this kind of statement. Dim outerContext = EndBlock(Nothing) Return outerContext.ProcessSyntax(Parser.ReportSyntaxError(node, ERRID.ERR_InvInsideEndsInterface)) Case Else Add(Parser.ReportSyntaxError(node, ERRID.ERR_InvInsideInterface)) End Select Return Me End Function Friend Overrides Function TryLinkSyntax(node As VisualBasicSyntaxNode, ByRef newContext As BlockContext) As LinkResult newContext = Nothing If KindEndsBlock(node.Kind) Then Return UseSyntax(node, newContext) End If Select Case node.Kind Case _ SyntaxKind.DelegateSubStatement, SyntaxKind.DelegateFunctionStatement, SyntaxKind.EventStatement, SyntaxKind.SubStatement, SyntaxKind.SubNewStatement, SyntaxKind.FunctionStatement, SyntaxKind.PropertyStatement, SyntaxKind.InheritsStatement, SyntaxKind.EndSubStatement, SyntaxKind.EndFunctionStatement, SyntaxKind.EndOperatorStatement, SyntaxKind.EndPropertyStatement, SyntaxKind.EndGetStatement, SyntaxKind.EndSetStatement, SyntaxKind.EndEventStatement, SyntaxKind.EndAddHandlerStatement, SyntaxKind.EndRemoveHandlerStatement, SyntaxKind.EndRaiseEventStatement Return UseSyntax(node, newContext) Case _ SyntaxKind.ClassBlock, SyntaxKind.StructureBlock, SyntaxKind.InterfaceBlock Return UseSyntax(node, newContext, DirectCast(node, TypeBlockSyntax).EndBlockStatement.IsMissing) Case SyntaxKind.EnumBlock Return UseSyntax(node, newContext, DirectCast(node, EnumBlockSyntax).EndEnumStatement.IsMissing) Case Else newContext = Me Return LinkResult.Crumble End Select End Function Friend Overrides Function RecoverFromMismatchedEnd(statement As StatementSyntax) As BlockContext Debug.Assert(statement IsNot Nothing) ' The end construct is extraneous. Report an error and leave ' the current context alone. Dim stmtKind = statement.Kind Select Case (stmtKind) Case SyntaxKind.EndSubStatement, SyntaxKind.EndFunctionStatement, SyntaxKind.EndOperatorStatement, SyntaxKind.EndPropertyStatement, SyntaxKind.EndGetStatement, SyntaxKind.EndSetStatement, SyntaxKind.EndEventStatement, SyntaxKind.EndAddHandlerStatement, SyntaxKind.EndRemoveHandlerStatement, SyntaxKind.EndRaiseEventStatement ' Don't call the base RecoverFromMismatchedEnd which will ' add the wrong error. Let the process syntax add the error message. Return ProcessSyntax(statement) Case Else Return MyBase.RecoverFromMismatchedEnd(statement) End Select End Function End Class End Namespace