()
| 2042 | } |
| 2043 | |
| 2044 | func (s *Scanner) scanNumberFragment() string { |
| 2045 | start := s.pos |
| 2046 | allowSeparator := false |
| 2047 | isPreviousTokenSeparator := false |
| 2048 | var result strings.Builder |
| 2049 | for { |
| 2050 | before := s.pos |
| 2051 | s.scanASCIIWhile(func(b byte) bool { |
| 2052 | return b >= '0' && b <= '9' |
| 2053 | }) |
| 2054 | if s.pos > before { |
| 2055 | allowSeparator = true |
| 2056 | isPreviousTokenSeparator = false |
| 2057 | } |
| 2058 | ch := s.char() |
| 2059 | if ch == '_' { |
| 2060 | s.tokenFlags |= ast.TokenFlagsContainsSeparator |
| 2061 | if allowSeparator { |
| 2062 | allowSeparator = false |
| 2063 | isPreviousTokenSeparator = true |
| 2064 | result.WriteString(s.text[start:s.pos]) |
| 2065 | } else { |
| 2066 | s.tokenFlags |= ast.TokenFlagsContainsInvalidSeparator |
| 2067 | if isPreviousTokenSeparator { |
| 2068 | s.errorAt(diagnostics.Multiple_consecutive_numeric_separators_are_not_permitted, s.pos, 1) |
| 2069 | } else { |
| 2070 | s.errorAt(diagnostics.Numeric_separators_are_not_allowed_here, s.pos, 1) |
| 2071 | } |
| 2072 | } |
| 2073 | s.pos++ |
| 2074 | start = s.pos |
| 2075 | continue |
| 2076 | } |
| 2077 | break |
| 2078 | } |
| 2079 | if isPreviousTokenSeparator { |
| 2080 | s.tokenFlags |= ast.TokenFlagsContainsInvalidSeparator |
| 2081 | s.errorAt(diagnostics.Numeric_separators_are_not_allowed_here, s.pos-1, 1) |
| 2082 | } |
| 2083 | if result.Len() == 0 { |
| 2084 | return s.text[start:s.pos] |
| 2085 | } |
| 2086 | result.WriteString(s.text[start:s.pos]) |
| 2087 | return result.String() |
| 2088 | } |
| 2089 | |
| 2090 | func (s *Scanner) scanDigits() (string, bool) { |
| 2091 | start := s.pos |
no test coverage detected