-
Notifications
You must be signed in to change notification settings - Fork 4k
/
CharacterInfo.vb
502 lines (423 loc) · 25.8 KB
/
CharacterInfo.vb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
'-----------------------------------------------------------------------------
' Contains the definition of the Scanner, which produces tokens from text
'-----------------------------------------------------------------------------
Option Strict On
Option Explicit On
Option Infer On
Imports System.Globalization
Namespace Microsoft.CodeAnalysis.VisualBasic
''' <summary>
''' Provides members for determining Syntax facts about characters and Unicode conversions.
''' </summary>
Partial Public Class SyntaxFacts
'/*****************************************************************************/
'// MakeFullWidth - Converts a half-width to full-width character
Friend Shared Function MakeFullWidth(c As Char) As Char
Debug.Assert(IsHalfWidth(c))
Return Convert.ToChar(Convert.ToUInt16(c) + s_fullwidth)
End Function
Friend Shared Function IsHalfWidth(c As Char) As Boolean
Return c >= ChrW(&H21S) AndAlso c <= ChrW(&H7ES)
End Function
'// MakeHalfWidth - Converts a full-width character to half-width
Friend Shared Function MakeHalfWidth(c As Char) As Char
Debug.Assert(IsFullWidth(c))
Return Convert.ToChar(Convert.ToUInt16(c) - s_fullwidth)
End Function
'// IsFullWidth - Returns if the character is full width
Friend Shared Function IsFullWidth(c As Char) As Boolean
' Do not use "AndAlso" or it will not inline.
Return c > ChrW(&HFF00US) And c < ChrW(&HFF5FUS)
End Function
''' <summary>
''' Determines if Unicode character represents a whitespace.
''' </summary>
''' <param name="c">The Unicode character.</param>
''' <returns>A boolean value set to True if character represents whitespace.</returns>
Public Shared Function IsWhitespace(c As Char) As Boolean
Return (SPACE = c) OrElse (CHARACTER_TABULATION = c) OrElse (c > ChrW(128) AndAlso IsWhitespaceNotAscii(c))
End Function
''' <summary>
''' Determines if Unicode character represents a XML whitespace.
''' </summary>
''' <param name="c">The unicode character</param>
''' <returns>A boolean value set to True if character represents XML whitespace.</returns>
Public Shared Function IsXmlWhitespace(c As Char) As Boolean
Return (SPACE = c) OrElse (CHARACTER_TABULATION = c) OrElse (c > ChrW(128) AndAlso XmlCharType.IsWhiteSpace(c))
End Function
Friend Shared Function IsWhitespaceNotAscii(ch As Char) As Boolean
Select Case ch
Case NO_BREAK_SPACE, IDEOGRAPHIC_SPACE, ChrW(&H2000S) To ChrW(&H200BS)
Return True
Case Else
Return CharUnicodeInfo.GetUnicodeCategory(ch) = UnicodeCategory.SpaceSeparator
End Select
End Function
Private Const s_fullwidth = CInt(&HFF00L - &H0020L)
Friend Const CHARACTER_TABULATION As Char = ChrW(&H0009)
Friend Const LINE_FEED As Char = ChrW(&H000A)
Friend Const CARRIAGE_RETURN As Char = ChrW(&H000D)
Friend Const SPACE As Char = ChrW(&H0020)
Friend Const NO_BREAK_SPACE As Char = ChrW(&H00A0)
Friend Const IDEOGRAPHIC_SPACE As Char = ChrW(&H3000)
Friend Const LINE_SEPARATOR As Char = ChrW(&H2028)
Friend Const PARAGRAPH_SEPARATOR As Char = ChrW(&H2029)
Friend Const NEXT_LINE As Char = ChrW(&H0085)
Friend Const LEFT_SINGLE_QUOTATION_MARK As Char = ChrW(&H2018) REM ‘
Friend Const RIGHT_SINGLE_QUOTATION_MARK As Char = ChrW(&H2019) REM ’
Friend Const LEFT_DOUBLE_QUOTATION_MARK As Char = ChrW(&H201C) REM “
Friend Const RIGHT_DOUBLE_QUOTATION_MARK As Char = ChrW(&H201D) REM ”
Friend Const FULLWIDTH_APOSTROPHE As Char = ChrW(s_fullwidth + AscW("'"c)) REM '
Friend Const FULLWIDTH_QUOTATION_MARK As Char = ChrW(s_fullwidth + AscW(""""c)) REM "
Friend Const FULLWIDTH_DIGIT_ZERO As Char = ChrW(s_fullwidth + AscW("0"c)) REM 0
Friend Const FULLWIDTH_DIGIT_ONE As Char = ChrW(s_fullwidth + AscW("1"c)) REM 1
Friend Const FULLWIDTH_DIGIT_SEVEN As Char = ChrW(s_fullwidth + AscW("7"c)) REM 7
Friend Const FULLWIDTH_DIGIT_NINE As Char = ChrW(s_fullwidth + AscW("9"c)) REM 9
Friend Const FULLWIDTH_LOW_LINE As Char = ChrW(s_fullwidth + AscW("_"c)) REM _
Friend Const FULLWIDTH_COLON As Char = ChrW(s_fullwidth + AscW(":"c)) REM :
Friend Const FULLWIDTH_SOLIDUS As Char = ChrW(s_fullwidth + AscW("/"c)) REM /
Friend Const FULLWIDTH_HYPHEN_MINUS As Char = ChrW(s_fullwidth + AscW("-"c)) REM -
Friend Const FULLWIDTH_PLUS_SIGN As Char = ChrW(s_fullwidth + AscW("+"c)) REM +
Friend Const FULLWIDTH_NUMBER_SIGN As Char = ChrW(s_fullwidth + AscW("#"c)) REM #
Friend Const FULLWIDTH_EQUALS_SIGN As Char = ChrW(s_fullwidth + AscW("="c)) REM =
Friend Const FULLWIDTH_LESS_THAN_SIGN As Char = ChrW(s_fullwidth + AscW("<"c)) REM <
Friend Const FULLWIDTH_GREATER_THAN_SIGN As Char = ChrW(s_fullwidth + AscW(">"c)) REM >
Friend Const FULLWIDTH_LEFT_PARENTHESIS As Char = ChrW(s_fullwidth + AscW("("c)) REM (
Friend Const FULLWIDTH_LEFT_SQUARE_BRACKET As Char = ChrW(s_fullwidth + AscW("["c)) REM [
Friend Const FULLWIDTH_RIGHT_SQUARE_BRACKET As Char = ChrW(s_fullwidth + AscW("]"c)) REM ]
Friend Const FULLWIDTH_LEFT_CURLY_BRACKET As Char = ChrW(s_fullwidth + AscW("{"c)) REM {
Friend Const FULLWIDTH_RIGHT_CURLY_BRACKET As Char = ChrW(s_fullwidth + AscW("}"c)) REM }
Friend Const FULLWIDTH_AMPERSAND As Char = ChrW(s_fullwidth + AscW("&"c)) REM &
Friend Const FULLWIDTH_DOLLAR_SIGN As Char = ChrW(s_fullwidth + AscW("$"c)) REM $
Friend Const FULLWIDTH_QUESTION_MARK As Char = ChrW(s_fullwidth + AscW("?"c)) REM ?
Friend Const FULLWIDTH_FULL_STOP As Char = ChrW(s_fullwidth + AscW("."c)) REM .
Friend Const FULLWIDTH_COMMA As Char = ChrW(s_fullwidth + AscW(","c)) REM ,
Friend Const FULLWIDTH_PERCENT_SIGN As Char = ChrW(s_fullwidth + AscW("%"c)) REM %
Friend Const FULLWIDTH_LATIN_CAPITAL_LETTER_B As Char = ChrW(s_fullwidth + AscW("B"c)) REM B
Friend Const FULLWIDTH_LATIN_CAPITAL_LETTER_H As Char = ChrW(s_fullwidth + AscW("H"c)) REM H
Friend Const FULLWIDTH_LATIN_CAPITAL_LETTER_O As Char = ChrW(s_fullwidth + AscW("O"c)) REM O
Friend Const FULLWIDTH_LATIN_CAPITAL_LETTER_E As Char = ChrW(s_fullwidth + AscW("E"c)) REM E
Friend Const FULLWIDTH_LATIN_CAPITAL_LETTER_A As Char = ChrW(s_fullwidth + AscW("A"c)) REM A
Friend Const FULLWIDTH_LATIN_CAPITAL_LETTER_F As Char = ChrW(s_fullwidth + AscW("F"c)) REM F
Friend Const FULLWIDTH_LATIN_CAPITAL_LETTER_C As Char = ChrW(s_fullwidth + AscW("C"c)) REM C
Friend Const FULLWIDTH_LATIN_CAPITAL_LETTER_P As Char = ChrW(s_fullwidth + AscW("P"c)) REM P
Friend Const FULLWIDTH_LATIN_CAPITAL_LETTER_M As Char = ChrW(s_fullwidth + AscW("M"c)) REM M
Friend Const FULLWIDTH_LATIN_SMALL_LETTER_B As Char = ChrW(s_fullwidth + AscW("b"c)) REM b
Friend Const FULLWIDTH_LATIN_SMALL_LETTER_H As Char = ChrW(s_fullwidth + AscW("h"c)) REM h
Friend Const FULLWIDTH_LATIN_SMALL_LETTER_O As Char = ChrW(s_fullwidth + AscW("o"c)) REM o
Friend Const FULLWIDTH_LATIN_SMALL_LETTER_E As Char = ChrW(s_fullwidth + AscW("e"c)) REM e
Friend Const FULLWIDTH_LATIN_SMALL_LETTER_A As Char = ChrW(s_fullwidth + AscW("a"c)) REM a
Friend Const FULLWIDTH_LATIN_SMALL_LETTER_F As Char = ChrW(s_fullwidth + AscW("f"c)) REM f
Friend Const FULLWIDTH_LATIN_SMALL_LETTER_C As Char = ChrW(s_fullwidth + AscW("c"c)) REM c
Friend Const FULLWIDTH_LATIN_SMALL_LETTER_P As Char = ChrW(s_fullwidth + AscW("p"c)) REM p
Friend Const FULLWIDTH_LATIN_SMALL_LETTER_M As Char = ChrW(s_fullwidth + AscW("m"c)) REM m
Friend Const FULLWIDTH_LEFT_PARENTHESIS_STRING As String = FULLWIDTH_LEFT_PARENTHESIS
Friend Const FULLWIDTH_RIGHT_PARENTHESIS_STRING As String = ChrW(s_fullwidth + AscW(")"c))
Friend Const FULLWIDTH_LEFT_CURLY_BRACKET_STRING As String = FULLWIDTH_LEFT_CURLY_BRACKET
Friend Const FULLWIDTH_RIGHT_CURLY_BRACKET_STRING As String = FULLWIDTH_RIGHT_CURLY_BRACKET
Friend Const FULLWIDTH_FULL_STOP_STRING As String = FULLWIDTH_FULL_STOP
Friend Const FULLWIDTH_COMMA_STRING As String = FULLWIDTH_COMMA
Friend Const FULLWIDTH_EQUALS_SIGN_STRING As String = FULLWIDTH_EQUALS_SIGN
Friend Const FULLWIDTH_PLUS_SIGN_STRING As String = FULLWIDTH_PLUS_SIGN
Friend Const FULLWIDTH_HYPHEN_MINUS_STRING As String = FULLWIDTH_HYPHEN_MINUS
Friend Const FULLWIDTH_ASTERISK_STRING As String = ChrW(s_fullwidth + AscW("*"c))
Friend Const FULLWIDTH_SOLIDUS_STRING As String = FULLWIDTH_SOLIDUS
Friend Const FULLWIDTH_REVERSE_SOLIDUS_STRING As String = ChrW(s_fullwidth + AscW("\"c))
Friend Const FULLWIDTH_COLON_STRING As String = FULLWIDTH_COLON
Friend Const FULLWIDTH_CIRCUMFLEX_ACCENT_STRING As String = ChrW(s_fullwidth + AscW("^"c))
Friend Const FULLWIDTH_AMPERSAND_STRING As String = FULLWIDTH_AMPERSAND
Friend Const FULLWIDTH_NUMBER_SIGN_STRING As String = FULLWIDTH_NUMBER_SIGN
Friend Const FULLWIDTH_EXCLAMATION_MARK_STRING As String = ChrW(s_fullwidth + AscW("!"c))
Friend Const FULLWIDTH_QUESTION_MARK_STRING As String = FULLWIDTH_QUESTION_MARK
Friend Const FULLWIDTH_COMMERCIAL_AT_STRING As String = ChrW(s_fullwidth + AscW("@"c))
Friend Const FULLWIDTH_LESS_THAN_SIGN_STRING As String = FULLWIDTH_LESS_THAN_SIGN
Friend Const FULLWIDTH_GREATER_THAN_SIGN_STRING As String = FULLWIDTH_GREATER_THAN_SIGN
''' <summary>
''' Determines if the Unicode character is a newline character.
''' </summary>
''' <param name="c">The Unicode character.</param>
''' <returns>A boolean value set to True if character is a newline character.</returns>
Public Shared Function IsNewLine(c As Char) As Boolean
Return CARRIAGE_RETURN = c OrElse LINE_FEED = c OrElse (c >= NEXT_LINE AndAlso (NEXT_LINE = c OrElse LINE_SEPARATOR = c OrElse PARAGRAPH_SEPARATOR = c))
End Function
Friend Shared Function IsSingleQuote(c As Char) As Boolean
' // Besides the half width and full width ', we also check for Unicode
' // LEFT SINGLE QUOTATION MARK and RIGHT SINGLE QUOTATION MARK because
' // IME editors paste them in. This isn't really technically correct
' // because we ignore the left-ness or right-ness, but see VS 170991
Return c = "'"c OrElse (c >= LEFT_SINGLE_QUOTATION_MARK AndAlso (c = FULLWIDTH_APOSTROPHE Or c = LEFT_SINGLE_QUOTATION_MARK Or c = RIGHT_SINGLE_QUOTATION_MARK))
End Function
Friend Shared Function IsDoubleQuote(c As Char) As Boolean
' // Besides the half width and full width ", we also check for Unicode
' // LEFT DOUBLE QUOTATION MARK and RIGHT DOUBLE QUOTATION MARK because
' // IME editors paste them in. This isn't really technically correct
' // because we ignore the left-ness or right-ness, but see VS 170991
Return c = """"c OrElse (c >= LEFT_DOUBLE_QUOTATION_MARK AndAlso (c = FULLWIDTH_QUOTATION_MARK Or c = LEFT_DOUBLE_QUOTATION_MARK Or c = RIGHT_DOUBLE_QUOTATION_MARK))
End Function
Friend Shared Function IsLeftCurlyBracket(c As Char) As Boolean
Return c = "{"c OrElse c = FULLWIDTH_LEFT_CURLY_BRACKET
End Function
Friend Shared Function IsRightCurlyBracket(c As Char) As Boolean
Return c = "}"c OrElse c = FULLWIDTH_RIGHT_CURLY_BRACKET
End Function
''' <summary>
''' Determines if the unicode character is a colon character.
''' </summary>
''' <param name="c">The unicode character.</param>
''' <returns>A boolean value set to True if character is a colon character.</returns>
Public Shared Function IsColon(c As Char) As Boolean
Return c = ":"c OrElse c = FULLWIDTH_COLON
End Function
''' <summary>
''' Determines if the unicode character is a underscore character.
''' </summary>
''' <param name="c">The unicode character.</param>
''' <returns>A boolean value set to True if character is an underscore character.</returns>
Public Shared Function IsUnderscore(c As Char) As Boolean
' NOTE: fullwidth _ is not considered any special.
Return c = "_"c
End Function
''' <summary>
''' Determines if the unicode character is a hash character.
''' </summary>
''' <param name="c">The unicode character.</param>
''' <returns>A boolean value set to True if character is a hash character.</returns>
Public Shared Function IsHash(c As Char) As Boolean
Return c = "#"c OrElse c = FULLWIDTH_NUMBER_SIGN
End Function
''' <summary>
''' Determines if the Unicode character can be the starting character of a Visual Basic identifier.
''' </summary>
''' <param name="c">The Unicode character.</param>
''' <returns>A boolean value set to True if character can be part of a valid start character in an identifier.</returns>
Public Shared Function IsIdentifierStartCharacter(
c As Char
) As Boolean
'TODO: make easy cases fast (or check if they already are)
Dim CharacterProperties As UnicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c)
Return IsPropAlpha(CharacterProperties) OrElse
IsPropLetterDigit(CharacterProperties) OrElse
IsPropConnectorPunctuation(CharacterProperties)
End Function
' TODO: replace CByte with something faster.
Friend Shared Function IntegralLiteralCharacterValue(
Digit As Char
) As Byte
If IsFullWidth(Digit) Then
Digit = MakeHalfWidth(Digit)
End If
Dim u As Integer = AscW(Digit)
If IsDecimalDigit(Digit) Then
Return CByte(u - AscW("0"c))
ElseIf Digit >= "A"c AndAlso Digit <= "F"c Then
Return CByte(u + (10 - AscW("A"c)))
Else
Debug.Assert(Digit >= "a"c AndAlso Digit <= "f"c, "Surprising digit.")
Return CByte(u + (10 - AscW("a"c)))
End If
End Function
Friend Shared Function BeginsBaseLiteral(c As Char) As Boolean
Return (c = "H"c Or c = "O"c Or c = "B"c Or c = "h"c Or c = "o"c Or c = "b"c) OrElse
(IsFullWidth(c) AndAlso (c = FULLWIDTH_LATIN_CAPITAL_LETTER_H Or c = FULLWIDTH_LATIN_SMALL_LETTER_H) Or
(c = FULLWIDTH_LATIN_CAPITAL_LETTER_O Or c = FULLWIDTH_LATIN_SMALL_LETTER_O) Or
(c = FULLWIDTH_LATIN_CAPITAL_LETTER_B Or c = FULLWIDTH_LATIN_SMALL_LETTER_B))
End Function
Private Shared ReadOnly s_isIDChar As Boolean() =
{
False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, True, True,
True, True, True, True, True, True, True, True, False, False,
False, False, False, False, False, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True,
True, False, False, False, False, True, False, True, True, True,
True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True,
True, True, True, False, False, False, False, False
}
Friend Shared Function IsNarrowIdentifierCharacter(c As UInt16) As Boolean
Return s_isIDChar(c)
'Select Case c
' Case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
' 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
' 41, 42, 43, 44, 45, 46, 47
' Return False
' Case 48, 49, 50, 51, 52, 53, 54, 55, 56, 57
' Return True
' Case 58, 59, 60, 61, 62, 63, 64
' Return False
' Case 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
' 81, 82, 83, 84, 85, 86, 87, 88, 89, 90
' Return True
' Case 91, 92, 93, 94
' Return False
' Case 95
' Return True
' Case 96
' Return False
' Case 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
' 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122
' Return True
'End Select
Return False
End Function
''' <summary>
''' Determines if the Unicode character can be a part of a Visual Basic identifier.
''' </summary>
''' <param name="c">The Unicode character.</param>
''' <returns>A boolean value set to True if character can be part of a valid identifier.</returns>
Public Shared Function IsIdentifierPartCharacter(c As Char) As Boolean
If c < ChrW(128) Then
Return IsNarrowIdentifierCharacter(Convert.ToUInt16(c))
End If
Return IsWideIdentifierCharacter(c)
End Function
''' <summary>
''' Determines if the name is a valid identifier.
''' </summary>
''' <param name="name">The identifier name.</param>
''' <returns>A boolean value set to True if name is valid identifier.</returns>
Public Shared Function IsValidIdentifier(name As String) As Boolean
If String.IsNullOrEmpty(name) Then
Return False
End If
If Not IsIdentifierStartCharacter(name(0)) Then
Return False
End If
Dim nameLength As Integer = name.Length
For i As Integer = 1 To nameLength - 1 ' NB: start at 1
If Not IsIdentifierPartCharacter(name(i)) Then
Return False
End If
Next
Return True
End Function
''' <summary>
''' Creates a half width form Unicode character string.
''' </summary>
''' <param name="text">The text representing the original identifier. This can be in full width or half width Unicode form. </param>
''' <returns>A string representing the text in a half width Unicode form.</returns>
Public Shared Function MakeHalfWidthIdentifier(text As String) As String
If text Is Nothing Then
Return text
End If
Dim characters As Char() = Nothing
For i = 0 To text.Length - 1
Dim c = text(i)
If IsFullWidth(c) Then
If characters Is Nothing Then
characters = New Char(text.Length - 1) {}
text.CopyTo(0, characters, 0, i)
End If
characters(i) = MakeHalfWidth(c)
ElseIf characters IsNot Nothing Then
characters(i) = c
End If
Next
Return If(characters Is Nothing, text, New String(characters))
End Function
Friend Shared Function IsWideIdentifierCharacter(c As Char) As Boolean
Dim CharacterProperties As UnicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c)
Return IsPropAlphaNumeric(CharacterProperties) OrElse
IsPropLetterDigit(CharacterProperties) OrElse
IsPropConnectorPunctuation(CharacterProperties) OrElse
IsPropCombining(CharacterProperties) OrElse
IsPropOtherFormat(CharacterProperties)
End Function
Friend Shared Function BeginsExponent(c As Char) As Boolean
Return c = "E"c Or c = "e"c Or c = FULLWIDTH_LATIN_CAPITAL_LETTER_E Or c = FULLWIDTH_LATIN_SMALL_LETTER_E
End Function
Friend Shared Function IsBinaryDigit(c As Char) As Boolean
Return (c >= "0"c And c <= "1"c) Or
(c >= FULLWIDTH_DIGIT_ZERO And c <= FULLWIDTH_DIGIT_ONE)
End Function
Friend Shared Function IsOctalDigit(c As Char) As Boolean
Return (c >= "0"c And c <= "7"c) Or
(c >= FULLWIDTH_DIGIT_ZERO And c <= FULLWIDTH_DIGIT_SEVEN)
End Function
Friend Shared Function IsDecimalDigit(c As Char) As Boolean
Return (c >= "0"c And c <= "9"c) Or
(c >= FULLWIDTH_DIGIT_ZERO And c <= FULLWIDTH_DIGIT_NINE)
End Function
Friend Shared Function IsHexDigit(c As Char) As Boolean
Return IsDecimalDigit(c) OrElse
(c >= "a"c And c <= "f"c) OrElse
(c >= "A"c And c <= "F"c) OrElse
(c >= FULLWIDTH_LATIN_SMALL_LETTER_A And c <= FULLWIDTH_LATIN_SMALL_LETTER_F) OrElse
(c >= FULLWIDTH_LATIN_CAPITAL_LETTER_A And c <= FULLWIDTH_LATIN_CAPITAL_LETTER_F)
End Function
Friend Shared Function IsDateSeparatorCharacter(c As Char) As Boolean
Return c = "/"c Or c = "-"c Or c = FULLWIDTH_SOLIDUS Or c = FULLWIDTH_HYPHEN_MINUS
End Function
Friend Shared ReadOnly DaysToMonth365() As Integer = New Integer(13 - 1) {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}
Friend Shared ReadOnly DaysToMonth366() As Integer = New Integer(13 - 1) {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}
Friend Shared Function IsLetterC(ch As Char) As Boolean
Return _
ch = "c"c Or ch = "C"c Or ch = FULLWIDTH_LATIN_CAPITAL_LETTER_C Or ch = FULLWIDTH_LATIN_SMALL_LETTER_C
End Function
''' <summary>
''' matches one char or another.
''' Typical usage is for matching lowercase and uppercase.
''' </summary>
Friend Shared Function MatchOneOrAnother(ch As Char, one As Char, another As Char) As Boolean
Return ch = one Or ch = another
End Function
''' <summary>
''' matches one char or another.
''' it will try normal width and then fullwidth variations.
''' Typical usage is for matching lowercase and uppercase.
''' </summary>
Friend Shared Function MatchOneOrAnotherOrFullwidth(ch As Char, one As Char, another As Char) As Boolean
Debug.Assert(IsHalfWidth(one))
Debug.Assert(IsHalfWidth(another))
If IsFullWidth(ch) Then
ch = MakeHalfWidth(ch)
End If
Return ch = one Or ch = another
End Function
Friend Shared Function IsPropAlpha(CharacterProperties As UnicodeCategory) As Boolean
Return CharacterProperties <= UnicodeCategory.OtherLetter
End Function
Friend Shared Function IsPropAlphaNumeric(CharacterProperties As UnicodeCategory) As Boolean
Return CharacterProperties <= UnicodeCategory.DecimalDigitNumber
End Function
Friend Shared Function IsPropLetterDigit(CharacterProperties As UnicodeCategory) As Boolean
Return CharacterProperties = UnicodeCategory.LetterNumber
End Function
Friend Shared Function IsPropConnectorPunctuation(CharacterProperties As UnicodeCategory) As Boolean
Return CharacterProperties = UnicodeCategory.ConnectorPunctuation
End Function
Friend Shared Function IsPropCombining(CharacterProperties As UnicodeCategory) As Boolean
Return CharacterProperties >= UnicodeCategory.NonSpacingMark AndAlso
CharacterProperties <= UnicodeCategory.EnclosingMark
End Function
Friend Shared Function IsConnectorPunctuation(c As Char) As Boolean
Return CharUnicodeInfo.GetUnicodeCategory(c) = UnicodeCategory.ConnectorPunctuation
End Function
Friend Shared Function IsSpaceSeparator(c As Char) As Boolean
Return CharUnicodeInfo.GetUnicodeCategory(c) = UnicodeCategory.SpaceSeparator
End Function
Friend Shared Function IsPropOtherFormat(CharacterProperties As UnicodeCategory) As Boolean
Return CharacterProperties = UnicodeCategory.Format
End Function
Friend Shared Function IsSurrogate(c As Char) As Boolean
Return Char.IsSurrogate(c)
End Function
Friend Shared Function IsHighSurrogate(c As Char) As Boolean
Return Char.IsHighSurrogate(c)
End Function
Friend Shared Function IsLowSurrogate(c As Char) As Boolean
Return Char.IsLowSurrogate(c)
End Function
Friend Shared Function ReturnFullWidthOrSelf(c As Char) As Char
If IsHalfWidth(c) Then
Return MakeFullWidth(c)
End If
Return c
End Function
End Class
End Namespace