()
| 1942 | } |
| 1943 | |
| 1944 | func (s *Scanner) scanNumber() ast.Kind { |
| 1945 | start := s.pos |
| 1946 | var fixedPart string |
| 1947 | if s.char() == '0' { |
| 1948 | s.pos++ |
| 1949 | if s.char() == '_' { |
| 1950 | s.tokenFlags |= ast.TokenFlagsContainsSeparator | ast.TokenFlagsContainsInvalidSeparator |
| 1951 | s.errorAt(diagnostics.Numeric_separators_are_not_allowed_here, s.pos, 1) |
| 1952 | s.pos = start |
| 1953 | fixedPart = s.scanNumberFragment() |
| 1954 | } else { |
| 1955 | digits, isOctal := s.scanDigits() |
| 1956 | if digits == "" { |
| 1957 | fixedPart = "0" |
| 1958 | } else if !isOctal { |
| 1959 | s.tokenFlags |= ast.TokenFlagsContainsLeadingZero |
| 1960 | fixedPart = digits |
| 1961 | } else { |
| 1962 | val, _ := strconv.ParseInt(digits, 8, 64) |
| 1963 | s.tokenValue = strconv.FormatInt(val, 10) |
| 1964 | s.tokenFlags |= ast.TokenFlagsOctal |
| 1965 | withMinus := s.token == ast.KindMinusToken |
| 1966 | literal := core.IfElse(withMinus, "-", "") + "0o" + strconv.FormatInt(val, 8) |
| 1967 | if withMinus { |
| 1968 | start-- |
| 1969 | } |
| 1970 | s.errorAt(diagnostics.Octal_literals_are_not_allowed_Use_the_syntax_0, start, s.pos-start, literal) |
| 1971 | return ast.KindNumericLiteral |
| 1972 | } |
| 1973 | } |
| 1974 | } else { |
| 1975 | fixedPart = s.scanNumberFragment() |
| 1976 | } |
| 1977 | fixedPartEnd := s.pos |
| 1978 | fractionalPart := "" |
| 1979 | exponentPreamble := "" |
| 1980 | exponentPart := "" |
| 1981 | if s.char() == '.' { |
| 1982 | s.pos++ |
| 1983 | fractionalPart = s.scanNumberFragment() |
| 1984 | } |
| 1985 | end := s.pos |
| 1986 | if s.char() == 'E' || s.char() == 'e' { |
| 1987 | s.pos++ |
| 1988 | s.tokenFlags |= ast.TokenFlagsScientific |
| 1989 | if s.char() == '+' || s.char() == '-' { |
| 1990 | s.pos++ |
| 1991 | } |
| 1992 | startNumericPart := s.pos |
| 1993 | exponentPart = s.scanNumberFragment() |
| 1994 | if exponentPart == "" { |
| 1995 | s.error(diagnostics.Digit_expected) |
| 1996 | } else { |
| 1997 | exponentPreamble = s.text[end:startNumericPart] |
| 1998 | end = s.pos |
| 1999 | } |
| 2000 | } |
| 2001 | if s.tokenFlags&ast.TokenFlagsContainsSeparator != 0 { |
no test coverage detected