提交 b4d9fe66 编写于 作者: M Matt Warren

Add support for NotInheritable and NotOverridable

上级 29a5cb13
......@@ -616,7 +616,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Public Overrides Function FieldDeclaration(name As String, type As SyntaxNode, Optional accessibility As Accessibility = Nothing, Optional modifiers As DeclarationModifiers = Nothing, Optional initializer As SyntaxNode = Nothing) As SyntaxNode
Return SyntaxFactory.FieldDeclaration(
attributeLists:=Nothing,
modifiers:=GetModifierList(accessibility, modifiers And s_fieldModifiers, isField:=True),
modifiers:=GetModifierList(accessibility, modifiers And s_fieldModifiers, DeclarationKind.Field),
declarators:=SyntaxFactory.SingletonSeparatedList(VariableDeclarator(type, name, initializer)))
End Function
......@@ -632,7 +632,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Dim statement = SyntaxFactory.MethodStatement(
kind:=If(returnType Is Nothing, SyntaxKind.SubStatement, SyntaxKind.FunctionStatement),
attributeLists:=Nothing,
modifiers:=GetModifierList(accessibility, modifiers And s_methodModifiers),
modifiers:=GetModifierList(accessibility, modifiers And s_methodModifiers, DeclarationKind.Method),
subOrFunctionKeyword:=If(returnType Is Nothing, SyntaxFactory.Token(SyntaxKind.SubKeyword), SyntaxFactory.Token(SyntaxKind.FunctionKeyword)),
identifier:=identifier.ToIdentifierToken(),
typeParameterList:=GetTypeParameters(typeParameters),
......@@ -663,7 +663,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Dim asClause = If(returnType IsNot Nothing, SyntaxFactory.SimpleAsClause(DirectCast(returnType, TypeSyntax)), Nothing)
Dim parameterList = GetParameterList(parameters)
Dim operatorToken = SyntaxFactory.Token(GetTokenKind(kind))
Dim modifierList As SyntaxTokenList = GetModifierList(accessibility, modifiers And s_methodModifiers)
Dim modifierList As SyntaxTokenList = GetModifierList(accessibility, modifiers And s_methodModifiers, DeclarationKind.Operator)
If kind = OperatorKind.ImplicitConversion OrElse kind = OperatorKind.ExplicitConversion Then
modifierList = modifierList.Add(SyntaxFactory.Token(
......@@ -776,7 +776,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Dim asClause = SyntaxFactory.SimpleAsClause(DirectCast(type, TypeSyntax))
Dim statement = SyntaxFactory.PropertyStatement(
attributeLists:=Nothing,
modifiers:=GetModifierList(accessibility, modifiers And s_propertyModifiers),
modifiers:=GetModifierList(accessibility, modifiers And s_propertyModifiers, DeclarationKind.Property),
identifier:=identifier.ToIdentifierToken(),
parameterList:=Nothing,
asClause:=asClause,
......@@ -814,7 +814,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Dim asClause = SyntaxFactory.SimpleAsClause(DirectCast(type, TypeSyntax))
Dim statement = SyntaxFactory.PropertyStatement(
attributeLists:=Nothing,
modifiers:=GetModifierList(accessibility, modifiers And s_indexerModifiers, isDefault:=True),
modifiers:=GetModifierList(accessibility, modifiers And s_indexerModifiers, DeclarationKind.Indexer, isDefault:=True),
identifier:=SyntaxFactory.Identifier("Item"),
parameterList:=SyntaxFactory.ParameterList(SyntaxFactory.SeparatedList(parameters.Cast(Of ParameterSyntax))),
asClause:=asClause,
......@@ -1059,7 +1059,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Dim prop = TryCast(declaration, PropertyStatementSyntax)
If prop IsNot Nothing Then
prop = prop.WithModifiers(WithIsDefault(prop.Modifiers, GetIsDefault(prop.Modifiers) And allowDefault))
prop = prop.WithModifiers(WithIsDefault(prop.Modifiers, GetIsDefault(prop.Modifiers) And allowDefault, GetDeclarationKind(declaration)))
Dim accessors = New List(Of AccessorBlockSyntax)
accessors.Add(CreateGetAccessorBlock(Nothing))
......@@ -1087,7 +1087,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Return isDefault
End Function
Private Function WithIsDefault(modifierList As SyntaxTokenList, isDefault As Boolean) As SyntaxTokenList
Private Function WithIsDefault(modifierList As SyntaxTokenList, isDefault As Boolean, kind As DeclarationKind) As SyntaxTokenList
Dim access As Accessibility
Dim modifiers As DeclarationModifiers
Dim currentIsDefault As Boolean
......@@ -1095,7 +1095,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Me.GetAccessibilityAndModifiers(modifierList, access, modifiers, currentIsDefault)
If currentIsDefault <> isDefault Then
Return GetModifierList(access, modifiers, isDefault)
Return GetModifierList(access, modifiers, kind, isDefault)
Else
Return modifierList
End If
......@@ -1119,7 +1119,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Return SyntaxFactory.ConstructorBlock(
subNewStatement:=SyntaxFactory.SubNewStatement(
attributeLists:=Nothing,
modifiers:=GetModifierList(accessibility, modifiers And s_constructorModifiers),
modifiers:=GetModifierList(accessibility, modifiers And s_constructorModifiers, DeclarationKind.Constructor),
parameterList:=If(parameters IsNot Nothing, SyntaxFactory.ParameterList(SyntaxFactory.SeparatedList(parameters.Cast(Of ParameterSyntax)())), SyntaxFactory.ParameterList())),
statements:=stats)
End Function
......@@ -1141,7 +1141,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Return SyntaxFactory.ClassBlock(
classStatement:=SyntaxFactory.ClassStatement(
attributeLists:=Nothing,
modifiers:=GetModifierList(accessibility, modifiers And s_classModifiers),
modifiers:=GetModifierList(accessibility, modifiers And s_classModifiers, DeclarationKind.Class),
identifier:=name.ToIdentifierToken(),
typeParameterList:=GetTypeParameters(typeParameters)),
[inherits]:=If(baseType IsNot Nothing, SyntaxFactory.SingletonList(SyntaxFactory.InheritsStatement(DirectCast(baseType, TypeSyntax))), Nothing),
......@@ -1177,7 +1177,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Return SyntaxFactory.StructureBlock(
structureStatement:=SyntaxFactory.StructureStatement(
attributeLists:=Nothing,
modifiers:=GetModifierList(accessibility, modifiers And s_structModifiers),
modifiers:=GetModifierList(accessibility, modifiers And s_structModifiers, DeclarationKind.Struct),
identifier:=name.ToIdentifierToken(),
typeParameterList:=GetTypeParameters(typeParameters)),
[inherits]:=Nothing,
......@@ -1212,7 +1212,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Return SyntaxFactory.InterfaceBlock(
interfaceStatement:=SyntaxFactory.InterfaceStatement(
attributeLists:=Nothing,
modifiers:=GetModifierList(accessibility, DeclarationModifiers.None),
modifiers:=GetModifierList(accessibility, DeclarationModifiers.None, DeclarationKind.Interface),
identifier:=name.ToIdentifierToken(),
typeParameterList:=GetTypeParameters(typeParameters)),
[inherits]:=If(itypes IsNot Nothing, SyntaxFactory.SingletonList(SyntaxFactory.InheritsStatement(SyntaxFactory.SeparatedList(itypes))), Nothing),
......@@ -1259,7 +1259,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Return SyntaxFactory.EnumBlock(
enumStatement:=SyntaxFactory.EnumStatement(
attributeLists:=Nothing,
modifiers:=GetModifierList(accessibility, modifiers),
modifiers:=GetModifierList(accessibility, modifiers And GetAllowedModifiers(SyntaxKind.EnumStatement), DeclarationKind.Enum),
identifier:=name.ToIdentifierToken(),
underlyingType:=Nothing),
members:=AsEnumMembers(members))
......@@ -1302,7 +1302,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Return SyntaxFactory.DelegateStatement(
kind:=kind,
attributeLists:=Nothing,
modifiers:=GetModifierList(accessibility, modifiers, kind),
modifiers:=GetModifierList(accessibility, modifiers And GetAllowedModifiers(kind), DeclarationKind.Delegate),
subOrFunctionKeyword:=If(kind = SyntaxKind.DelegateSubStatement, SyntaxFactory.Token(SyntaxKind.SubKeyword), SyntaxFactory.Token(SyntaxKind.FunctionKeyword)),
identifier:=name.ToIdentifierToken(),
typeParameterList:=GetTypeParameters(typeParameters),
......@@ -2350,7 +2350,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
GetAccessibilityAndModifiers(tokens, acc, currentMods, isDefault)
If (currentMods <> modifiers) Then
Dim newTokens = GetModifierList(acc, modifiers, declaration.Kind, isDefault)
Dim newTokens = GetModifierList(acc, modifiers And GetAllowedModifiers(declaration.Kind), GetDeclarationKind(declaration), isDefault)
Return WithModifierTokens(declaration, Merge(tokens, newTokens))
Else
Return declaration
......@@ -2523,7 +2523,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Return declaration
End If
Dim newTokens = GetModifierList(accessibility, mods, declaration.Kind, isDefault)
Dim newTokens = GetModifierList(accessibility, mods, GetDeclarationKind(declaration), isDefault)
Return WithModifierTokens(declaration, Merge(tokens, newTokens))
End Function
......@@ -2568,12 +2568,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
End Select
End Function
Private Function GetModifierList(accessibility As Accessibility, modifiers As DeclarationModifiers, kind As SyntaxKind, Optional isDefault As Boolean = False) As SyntaxTokenList
modifiers = modifiers And GetAllowedModifiers(kind)
Return GetModifierList(accessibility, modifiers, isDefault, kind = SyntaxKind.FieldDeclaration)
End Function
Private Function GetModifierList(accessibility As Accessibility, modifiers As DeclarationModifiers, Optional isDefault As Boolean = False, Optional isField As Boolean = False) As SyntaxTokenList
Private Function GetModifierList(accessibility As Accessibility, modifiers As DeclarationModifiers, kind As DeclarationKind, Optional isDefault As Boolean = False) As SyntaxTokenList
Dim _list = SyntaxFactory.TokenList()
If isDefault Then
......@@ -2632,8 +2627,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
_list = _list.Add(SyntaxFactory.Token(SyntaxKind.WriteOnlyKeyword))
End If
Dim isType = kind = DeclarationKind.Class Or kind = DeclarationKind.Struct Or kind = DeclarationKind.Interface Or kind = DeclarationKind.Enum
If modifiers.IsSealed Then
_list = _list.Add(SyntaxFactory.Token(SyntaxKind.NotInheritableKeyword))
If isType Then
_list = _list.Add(SyntaxFactory.Token(SyntaxKind.NotInheritableKeyword))
Else
_list = _list.Add(SyntaxFactory.Token(SyntaxKind.NotOverridableKeyword))
End If
End If
If modifiers.IsUnsafe Then
......@@ -2650,7 +2650,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
_list = _list.Add(SyntaxFactory.Token(SyntaxKind.PartialKeyword))
End If
If (isField AndAlso _list.Count = 0) Then
If (kind = DeclarationKind.Field AndAlso _list.Count = 0) Then
_list = _list.Add(SyntaxFactory.Token(SyntaxKind.DimKeyword))
End If
......@@ -2700,7 +2700,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
modifiers = modifiers Or DeclarationModifiers.ReadOnly
Case SyntaxKind.WriteOnlyKeyword
modifiers = modifiers Or DeclarationModifiers.WriteOnly
Case SyntaxKind.NotInheritableKeyword
Case SyntaxKind.NotInheritableKeyword, SyntaxKind.NotOverridableKeyword
modifiers = modifiers Or DeclarationModifiers.Sealed
Case SyntaxKind.WithEventsKeyword
modifiers = modifiers Or DeclarationModifiers.WithEvents
......@@ -3332,7 +3332,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Public Overrides Function EventDeclaration(name As String, type As SyntaxNode, Optional accessibility As Accessibility = Accessibility.NotApplicable, Optional modifiers As DeclarationModifiers = Nothing) As SyntaxNode
Return SyntaxFactory.EventStatement(
attributeLists:=Nothing,
modifiers:=GetModifierList(accessibility, modifiers, SyntaxKind.EventStatement),
modifiers:=GetModifierList(accessibility, modifiers And GetAllowedModifiers(SyntaxKind.EventStatement), DeclarationKind.Event),
customKeyword:=Nothing,
eventKeyword:=SyntaxFactory.Token(SyntaxKind.EventKeyword),
identifier:=name.ToIdentifierToken(),
......@@ -3375,7 +3375,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration
Dim evStatement = SyntaxFactory.EventStatement(
attributeLists:=Nothing,
modifiers:=GetModifierList(accessibility, modifiers, SyntaxKind.EventStatement),
modifiers:=GetModifierList(accessibility, modifiers And GetAllowedModifiers(SyntaxKind.EventStatement), DeclarationKind.Event),
customKeyword:=SyntaxFactory.Token(SyntaxKind.CustomKeyword),
eventKeyword:=SyntaxFactory.Token(SyntaxKind.EventKeyword),
identifier:=name.ToIdentifierToken(),
......
......@@ -810,6 +810,21 @@ End Function</x>.Value)
_g.MethodDeclaration("m", accessibility:=Accessibility.Private, modifiers:=DeclarationModifiers.Partial),
<x>Private Partial Sub m()
End Sub</x>.Value)
End Sub
<Fact>
Public Sub TestDeclarationModifiers()
VerifySyntax(Of MethodBlockSyntax)(
_g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Sealed),
<x>NotOverridable Sub m()
End Sub</x>.Value)
VerifySyntax(Of ClassBlockSyntax)(
_g.ClassDeclaration("c", modifiers:=DeclarationModifiers.Sealed),
<x>NotInheritable Class c
End Class</x>.Value)
End Sub
<Fact>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册