/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Portable/Scanner/KeywordTable.vb
405 строк
19 KB
Julien Couvreur
Warn for multiple blank lines in source (#65451)
17 ноя 2022, 22:55
Не верифицирован
17 ноя 2022, 22:55
a8824e8
Код
Авторство
О чём код?
' 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.VisualBasic.Syntax.OperatorPrecedence Namespace Microsoft.CodeAnalysis.VisualBasic.Syntax Friend Class KeywordTable Shared Sub New() '// Note: "CanFollowExpr" says whether this token can come after an expression. '// e.g. "Dim x = From i In <expression> Select i" is valid, therefore "Select" can come follow an expression. '// The complete list was discovered through the tool in vb\Language\Tools\VBGrammarAnalyzer\vbgrammar.html '// If you add keywords, then make sure that they're added to the official language grammar, and re-run the tool. Const New7to8 As UShort = 1US << 8 Const QueryClause As UShort = 1US << 9 Const CanFollowExpr As UShort = 1US << 10 Const None As UShort = 0US '// Kind New7to8 Precedence QueryClause CanFollowExpr Dim keywordInitData As UShort() = New UShort() { SyntaxKind.AddHandlerKeyword, None, SyntaxKind.AddressOfKeyword, None, SyntaxKind.AliasKeyword, None, SyntaxKind.AndKeyword, PrecedenceAnd Or CanFollowExpr, SyntaxKind.AndAlsoKeyword, PrecedenceAnd Or CanFollowExpr, SyntaxKind.AsKeyword, None, SyntaxKind.BooleanKeyword, None, SyntaxKind.ByRefKeyword, None, SyntaxKind.ByteKeyword, None, SyntaxKind.ByValKeyword, None, SyntaxKind.CallKeyword, None, SyntaxKind.CaseKeyword, None, SyntaxKind.CatchKeyword, None, SyntaxKind.CBoolKeyword, None, SyntaxKind.CByteKeyword, None, SyntaxKind.CCharKeyword, None, SyntaxKind.CDateKeyword, None, SyntaxKind.CDecKeyword, None, SyntaxKind.CDblKeyword, None, SyntaxKind.CharKeyword, None, SyntaxKind.CIntKeyword, None, SyntaxKind.ClassKeyword, None, SyntaxKind.CLngKeyword, None, SyntaxKind.CObjKeyword, None, SyntaxKind.ConstKeyword, None, SyntaxKind.ContinueKeyword, New7to8, SyntaxKind.CSByteKeyword, New7to8, SyntaxKind.CShortKeyword, None, SyntaxKind.CSngKeyword, None, SyntaxKind.CStrKeyword, None, SyntaxKind.CTypeKeyword, None, SyntaxKind.CUIntKeyword, New7to8, SyntaxKind.CULngKeyword, New7to8, SyntaxKind.CUShortKeyword, New7to8, SyntaxKind.DateKeyword, None, SyntaxKind.DecimalKeyword, None, SyntaxKind.DeclareKeyword, None, SyntaxKind.DefaultKeyword, None, SyntaxKind.DelegateKeyword, None, SyntaxKind.DimKeyword, None, SyntaxKind.DirectCastKeyword, None, SyntaxKind.DoKeyword, None, SyntaxKind.DoubleKeyword, None, SyntaxKind.EachKeyword, None, SyntaxKind.ElseKeyword, CanFollowExpr, SyntaxKind.ElseIfKeyword, None, SyntaxKind.EndKeyword, None, SyntaxKind.EnumKeyword, None, SyntaxKind.EraseKeyword, None, SyntaxKind.ErrorKeyword, None, SyntaxKind.EventKeyword, None, SyntaxKind.ExitKeyword, None, SyntaxKind.FalseKeyword, None, SyntaxKind.FinallyKeyword, None, SyntaxKind.ForKeyword, None, SyntaxKind.FriendKeyword, None, SyntaxKind.FunctionKeyword, None, SyntaxKind.GetKeyword, None, SyntaxKind.GetTypeKeyword, None, SyntaxKind.GetXmlNamespaceKeyword, None, SyntaxKind.GlobalKeyword, New7to8, SyntaxKind.GoToKeyword, None, SyntaxKind.HandlesKeyword, None, SyntaxKind.IfKeyword, None, SyntaxKind.ImplementsKeyword, CanFollowExpr, SyntaxKind.ImportsKeyword, None, SyntaxKind.InKeyword, CanFollowExpr, SyntaxKind.InheritsKeyword, None, SyntaxKind.IntegerKeyword, None, SyntaxKind.InterfaceKeyword, None, SyntaxKind.IsKeyword, PrecedenceRelational Or CanFollowExpr, SyntaxKind.IsNotKeyword, PrecedenceRelational Or New7to8 Or CanFollowExpr, SyntaxKind.LetKeyword, QueryClause Or CanFollowExpr, SyntaxKind.LibKeyword, None, SyntaxKind.LikeKeyword, PrecedenceRelational Or CanFollowExpr, SyntaxKind.LongKeyword, None, SyntaxKind.LoopKeyword, None, SyntaxKind.MeKeyword, None, SyntaxKind.ModKeyword, PrecedenceModulus Or CanFollowExpr, SyntaxKind.ModuleKeyword, None, SyntaxKind.MustInheritKeyword, None, SyntaxKind.MustOverrideKeyword, None, SyntaxKind.MyBaseKeyword, None, SyntaxKind.MyClassKeyword, None, SyntaxKind.NameOfKeyword, None, SyntaxKind.NamespaceKeyword, None, SyntaxKind.NarrowingKeyword, New7to8, SyntaxKind.NextKeyword, None, SyntaxKind.NewKeyword, None, SyntaxKind.NotKeyword, PrecedenceNot, SyntaxKind.NothingKeyword, None, SyntaxKind.NotInheritableKeyword, None, SyntaxKind.NotOverridableKeyword, None, SyntaxKind.ObjectKeyword, None, SyntaxKind.OfKeyword, New7to8, SyntaxKind.OnKeyword, CanFollowExpr, SyntaxKind.OperatorKeyword, New7to8, SyntaxKind.OptionKeyword, None, SyntaxKind.OptionalKeyword, None, SyntaxKind.OrKeyword, PrecedenceOr Or CanFollowExpr, SyntaxKind.OrElseKeyword, PrecedenceOr Or CanFollowExpr, SyntaxKind.OverloadsKeyword, None, SyntaxKind.OverridableKeyword, None, SyntaxKind.OverridesKeyword, None, SyntaxKind.ParamArrayKeyword, None, SyntaxKind.PartialKeyword, New7to8, SyntaxKind.PrivateKeyword, None, SyntaxKind.PropertyKeyword, None, SyntaxKind.ProtectedKeyword, None, SyntaxKind.PublicKeyword, None, SyntaxKind.RaiseEventKeyword, None, SyntaxKind.ReadOnlyKeyword, None, SyntaxKind.ReferenceKeyword, None, SyntaxKind.ReDimKeyword, None, SyntaxKind.REMKeyword, CanFollowExpr, SyntaxKind.RemoveHandlerKeyword, None, SyntaxKind.ResumeKeyword, None, SyntaxKind.ReturnKeyword, None, SyntaxKind.SByteKeyword, New7to8, SyntaxKind.SelectKeyword, QueryClause Or CanFollowExpr, SyntaxKind.SetKeyword, None, SyntaxKind.ShadowsKeyword, None, SyntaxKind.SharedKeyword, None, SyntaxKind.ShortKeyword, None, SyntaxKind.SingleKeyword, None, SyntaxKind.StaticKeyword, None, SyntaxKind.StepKeyword, CanFollowExpr, SyntaxKind.StopKeyword, None, SyntaxKind.StringKeyword, None, SyntaxKind.StructureKeyword, None, SyntaxKind.SubKeyword, None, SyntaxKind.SyncLockKeyword, None, SyntaxKind.ThenKeyword, CanFollowExpr, SyntaxKind.ThrowKeyword, None, SyntaxKind.ToKeyword, CanFollowExpr, SyntaxKind.TrueKeyword, None, SyntaxKind.TryKeyword, None, SyntaxKind.TryCastKeyword, New7to8, SyntaxKind.TypeOfKeyword, None, SyntaxKind.UIntegerKeyword, New7to8, SyntaxKind.ULongKeyword, New7to8, SyntaxKind.UShortKeyword, New7to8, SyntaxKind.UsingKeyword, New7to8, SyntaxKind.WhenKeyword, None, SyntaxKind.WhileKeyword, None, SyntaxKind.WideningKeyword, New7to8, SyntaxKind.WithKeyword, None, SyntaxKind.WithEventsKeyword, None, SyntaxKind.WriteOnlyKeyword, None, SyntaxKind.XorKeyword, PrecedenceXor Or CanFollowExpr, SyntaxKind.AggregateKeyword, QueryClause Or CanFollowExpr, SyntaxKind.AllKeyword, None, SyntaxKind.AnsiKeyword, None, SyntaxKind.AscendingKeyword, CanFollowExpr, SyntaxKind.AssemblyKeyword, None, SyntaxKind.AutoKeyword, None, SyntaxKind.BinaryKeyword, None, SyntaxKind.ByKeyword, CanFollowExpr, SyntaxKind.CompareKeyword, None, SyntaxKind.CustomKeyword, None, SyntaxKind.DescendingKeyword, CanFollowExpr, SyntaxKind.DisableKeyword, None, SyntaxKind.DistinctKeyword, QueryClause Or CanFollowExpr, SyntaxKind.EnableKeyword, None, SyntaxKind.EqualsKeyword, CanFollowExpr, SyntaxKind.ExplicitKeyword, None, SyntaxKind.ExternalSourceKeyword, None, SyntaxKind.ExternalChecksumKeyword, None, SyntaxKind.FromKeyword, QueryClause Or CanFollowExpr, SyntaxKind.GroupKeyword, QueryClause Or CanFollowExpr, SyntaxKind.InferKeyword, None, SyntaxKind.IntoKeyword, CanFollowExpr, SyntaxKind.IsFalseKeyword, None, SyntaxKind.IsTrueKeyword, None, SyntaxKind.JoinKeyword, QueryClause Or CanFollowExpr, SyntaxKind.KeyKeyword, None, SyntaxKind.MidKeyword, None, SyntaxKind.OffKeyword, None, SyntaxKind.OrderKeyword, QueryClause Or CanFollowExpr, SyntaxKind.OutKeyword, None, SyntaxKind.PreserveKeyword, None, SyntaxKind.RegionKeyword, None, SyntaxKind.SkipKeyword, QueryClause Or CanFollowExpr, SyntaxKind.StrictKeyword, None, SyntaxKind.TextKeyword, None, SyntaxKind.TakeKeyword, QueryClause Or CanFollowExpr, SyntaxKind.UnicodeKeyword, None, SyntaxKind.UntilKeyword, None, SyntaxKind.WarningKeyword, None, SyntaxKind.WhereKeyword, QueryClause Or CanFollowExpr, SyntaxKind.AsyncKeyword, None, SyntaxKind.AwaitKeyword, PrecedenceAwait, SyntaxKind.IteratorKeyword, None, SyntaxKind.YieldKeyword, None, SyntaxKind.EndIfKeyword, None, SyntaxKind.GosubKeyword, None, SyntaxKind.TypeKeyword, None, SyntaxKind.VariantKeyword, None, SyntaxKind.WendKeyword, None, SyntaxKind.CommaToken, CanFollowExpr, SyntaxKind.AmpersandToken, PrecedenceConcatenate Or CanFollowExpr, SyntaxKind.SingleQuoteToken, None, SyntaxKind.OpenParenToken, CanFollowExpr, SyntaxKind.CloseParenToken, CanFollowExpr, SyntaxKind.OpenBraceToken, None, SyntaxKind.CloseBraceToken, CanFollowExpr, SyntaxKind.AsteriskToken, PrecedenceMultiply Or CanFollowExpr, SyntaxKind.PlusToken, PrecedenceAdd Or CanFollowExpr, SyntaxKind.MinusToken, PrecedenceAdd Or CanFollowExpr, SyntaxKind.SlashToken, PrecedenceMultiply Or CanFollowExpr, SyntaxKind.LessThanToken, PrecedenceRelational Or CanFollowExpr, SyntaxKind.LessThanEqualsToken, PrecedenceRelational Or CanFollowExpr, SyntaxKind.LessThanGreaterThanToken, PrecedenceRelational Or CanFollowExpr, SyntaxKind.EqualsToken, PrecedenceRelational Or CanFollowExpr, SyntaxKind.GreaterThanToken, PrecedenceRelational Or CanFollowExpr, SyntaxKind.GreaterThanEqualsToken, PrecedenceRelational, SyntaxKind.BackslashToken, PrecedenceIntegerDivide Or CanFollowExpr, SyntaxKind.CaretToken, PrecedenceExponentiate Or CanFollowExpr, SyntaxKind.ColonEqualsToken, None, SyntaxKind.AmpersandEqualsToken, PrecedenceConcatenate, SyntaxKind.AsteriskEqualsToken, PrecedenceMultiply, SyntaxKind.PlusEqualsToken, PrecedenceAdd, SyntaxKind.MinusEqualsToken, PrecedenceAdd, SyntaxKind.SlashEqualsToken, PrecedenceMultiply, SyntaxKind.BackslashEqualsToken, PrecedenceIntegerDivide, SyntaxKind.CaretEqualsToken, PrecedenceExponentiate, SyntaxKind.LessThanLessThanToken, PrecedenceShift, SyntaxKind.GreaterThanGreaterThanToken, PrecedenceShift, SyntaxKind.LessThanLessThanEqualsToken, PrecedenceShift, SyntaxKind.GreaterThanGreaterThanEqualsToken, PrecedenceShift, SyntaxKind.PercentGreaterThanToken, CanFollowExpr } For i As Integer = 0 To keywordInitData.Length - 1 Step 2 Dim bits = keywordInitData(i + 1) AddKeyword( Token:=DirectCast(keywordInitData(i), SyntaxKind), New7To8:=(bits And New7to8) <> 0, Precedence:=CType(bits And &HFF, OperatorPrecedence), isQueryClause:=(bits And QueryClause) <> 0, canFollowExpr:=(bits And CanFollowExpr) <> 0 ) Next End Sub Public Structure KeywordDescription Public kdOperPrec As OperatorPrecedence Public kdNew7To8kwd As Boolean Public kdIsQueryClause As Boolean '// Note: "CanFollowExpr" says whether this token can come after an expression. '// e.g. "Dim x = From i In <expression> Select i" is valid, therefore "Select" can come follow an expression. '// The complete list was discovered through the tool in vb\Language\Tools\VBGrammarAnalyzer\vbgrammar.html '// If you add keywords, then make sure that they're added to the official language grammar, and re-run the tool. Public kdCanFollowExpr As Boolean Public Sub New( New7To8 As Boolean, Precedence As OperatorPrecedence, isQueryClause As Boolean, canFollowExpr As Boolean) Me.kdNew7To8kwd = New7To8 Me.kdOperPrec = Precedence Me.kdIsQueryClause = isQueryClause Me.kdCanFollowExpr = canFollowExpr End Sub End Structure Private Shared ReadOnly s_keywords As New Dictionary(Of String, SyntaxKind)(IdentifierComparison.Comparer) Private Shared ReadOnly s_keywordProperties As New Dictionary(Of UShort, KeywordDescription) Friend Shared Function TokenOfString(tokenName As String) As SyntaxKind Debug.Assert(tokenName IsNot Nothing) tokenName = EnsureHalfWidth(tokenName) Dim kind As SyntaxKind If Not s_keywords.TryGetValue(tokenName, kind) Then kind = SyntaxKind.IdentifierToken End If Return kind End Function Private Shared Function EnsureHalfWidth(s As String) As String Dim result As Char() = Nothing For i As Integer = 0 To s.Length - 1 Dim ch = s(i) If SyntaxFacts.IsFullWidth(ch) Then ch = SyntaxFacts.MakeHalfWidth(ch) If result Is Nothing Then result = New Char(s.Length - 1) {} For j As Integer = 0 To i - 1 result(j) = s(j) Next End If result(i) = ch Else If result IsNot Nothing Then result(i) = ch End If End If Next If result IsNot Nothing Then Return New String(result) Else Return s End If End Function Friend Shared Function CanFollowExpression(kind As SyntaxKind) As Boolean Dim description As KeywordDescription = Nothing If (s_keywordProperties.TryGetValue(kind, description)) Then Return description.kdCanFollowExpr End If Return False End Function Friend Shared Function IsQueryClause(kind As SyntaxKind) As Boolean Dim description As KeywordDescription = Nothing If (s_keywordProperties.TryGetValue(kind, description)) Then Return description.kdIsQueryClause End If Return False End Function Friend Shared Function TokenOpPrec(kind As SyntaxKind) As OperatorPrecedence Dim description As KeywordDescription = Nothing If (s_keywordProperties.TryGetValue(kind, description)) Then Return description.kdOperPrec End If Debug.Assert(False, "the kind is not found") Return PrecedenceNone End Function Private Shared Sub AddKeyword( Token As SyntaxKind, New7To8 As Boolean, Precedence As OperatorPrecedence, isQueryClause As Boolean, canFollowExpr As Boolean) Dim keyword As New KeywordDescription(New7To8, Precedence, isQueryClause, canFollowExpr) s_keywordProperties.Add(Token, keyword) Dim Name = SyntaxFacts.GetText(Token) Debug.Assert(Name IsNot Nothing) s_keywords.Add(Name, Token) End Sub End Class '//------------------------------------------------------------------------------------------------- '// '// OperatorPrecedence.Precedence levels of unary and binary operators. '// Friend Enum OperatorPrecedence As Byte PrecedenceNone = 0 PrecedenceXor PrecedenceOr PrecedenceAnd PrecedenceNot PrecedenceRelational PrecedenceShift PrecedenceConcatenate PrecedenceAdd PrecedenceModulus PrecedenceIntegerDivide PrecedenceMultiply PrecedenceNegate PrecedenceExponentiate PrecedenceAwait End Enum End Namespace