private bool TryParseNumber([NotNullWhen(true)] out ExpressionSyntax?literalSyntax) { literalSyntax = null; if (_lexer.PeekTokenType() == TokenType.Number) { var numberToken = ReadTokenIntoString(); if (ulong.TryParse(numberToken, NumberStyles.None, CultureInfo.InvariantCulture, out var number)) { literalSyntax = new IntegerLiteralSyntax(number, _lexer.LastPosition); return(true); } else { _diagnosticSink.Add(DiagnosticCode.InvalidNumericLiteral, _lexer.LastPosition, numberToken); return(false); } } else { _diagnosticSink.Add(DiagnosticCode.ExpectedExpression, _lexer.Position, ReadTokenIntoString()); return(false); } }
public override void VisitIntegerLiteralSyntax(IntegerLiteralSyntax syntax) { // syntax.Value is always positive and can't be greater than the greatest 64 bit integer if (syntax.Value > long.MaxValue) { diagnosticWriter.Write(DiagnosticBuilder.ForPosition(syntax).InvalidInteger()); } base.VisitIntegerLiteralSyntax(syntax); }
public void Integer_literal_that_is_too_large_fails() { var position = new TextPosition(10, 3, 4); var syntax = new IntegerLiteralSyntax((ulong)int.MaxValue + 1, position); var method = new CompiledMethod("Test::Method"); var builder = new BasicBlockGraphBuilder().GetInitialBlockBuilder(); var nameResolver = new TestingResolver(new ScopedVariableMap()); var diagnostics = new TestingDiagnosticSink(); var localIndex = ExpressionCompiler.TryCompileExpression( syntax, SimpleType.Int32, method, builder, nameResolver, diagnostics); Assert.That(localIndex, Is.EqualTo(-1)); diagnostics.AssertDiagnosticAt(DiagnosticCode.TypeMismatch, position) .WithActual("uint32").WithExpected("int32"); }
public virtual void VisitIntegerLiteral(IntegerLiteralSyntax node) { }