README: document nit_env.sh
[nit.git] / src / literal.nit
index ef4851b..b183301 100644 (file)
@@ -20,6 +20,7 @@ module literal
 import phase
 
 redef class ToolContext
+       # Parses literal values in the whole AST and produces errors if needed
        var literal_phase: Phase = new LiteralPhase(self, null)
 end
 
@@ -44,11 +45,6 @@ private class LiteralVisitor
 
        var toolcontext: ToolContext
 
-       init(toolcontext: ToolContext)
-       do
-               self.toolcontext = toolcontext
-       end
-
        redef fun visit(n)
        do
                n.accept_literal(self)
@@ -60,22 +56,33 @@ redef class ANode
        private fun accept_literal(v: LiteralVisitor) do end
 end
 
-redef class AIntExpr
-       # The value of the literal int once computed.
-       var value: nullable Int
-end
+redef class AExpr
+       # Get `self` as a `String`.
+       # Return null if not a string.
+       fun as_string: nullable String
+       do
+               if not self isa AStringFormExpr then return null
+               return self.value.as(not null)
+       end
 
-redef class ADecIntExpr
-       redef fun accept_literal(v)
+       # Get `self` as an `Int`.
+       # Return null if not an integer.
+       fun as_int: nullable Int
        do
-               self.value = self.n_number.text.to_i
+               if not self isa AIntegerExpr then return null
+               return self.value.as(not null).to_i
        end
 end
 
-redef class AHexIntExpr
-       redef fun accept_literal(v)
-       do
-               self.value = self.n_hex_number.text.substring_from(2).to_hex
+redef class AIntegerExpr
+       # The value of the literal int once computed.
+       var value: nullable Numeric
+
+       redef fun accept_literal(v) do
+               value = n_integer.text.to_num
+               if value == null then
+                       v.toolcontext.error(hot_location, "Error: invalid literal `{n_integer.text}`")
+               end
        end
 end
 
@@ -95,7 +102,7 @@ redef class ACharExpr
        do
                var txt = self.n_char.text.unescape_nit
                if txt.length != 3 then
-                       v.toolcontext.error(self.hot_location, "Invalid character literal {txt}")
+                       v.toolcontext.error(self.hot_location, "Syntax Error: invalid character literal `{txt}`.")
                        return
                end
                self.value = txt.chars[1]