Merge: Basename fix
[nit.git] / src / literal.nit
index 9ea79f0..b183301 100644 (file)
 # Parsing of literal values in the abstract syntax tree.
 module literal
 
-import parser
-import toolcontext
 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
 
@@ -46,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)
@@ -62,12 +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
-       redef fun accept_literal(v)
+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
+
+       # 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 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
 
@@ -87,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]