src: update most tools to new constructors
[nit.git] / src / literal.nit
index bbc4e67..e39409f 100644 (file)
 # Parsing of literal values in the abstract syntax tree.
 module literal
 
-import parser
-import toolcontext
 import phase
 
-import modelbuilder #FIXME useless
-
 redef class ToolContext
        var literal_phase: Phase = new LiteralPhase(self, null)
 end
@@ -48,11 +44,6 @@ private class LiteralVisitor
 
        var toolcontext: ToolContext
 
-       init(toolcontext: ToolContext)
-       do
-               self.toolcontext = toolcontext
-       end
-
        redef fun visit(n)
        do
                n.accept_literal(self)
@@ -67,12 +58,22 @@ end
 redef class AIntExpr
        # The value of the literal int once computed.
        var value: nullable Int
+end
+
+redef class ADecIntExpr
        redef fun accept_literal(v)
        do
                self.value = self.n_number.text.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
+       end
+end
+
 redef class AFloatExpr
        # The value of the literal float once computed.
        var value: nullable Float
@@ -92,7 +93,7 @@ redef class ACharExpr
                        v.toolcontext.error(self.hot_location, "Invalid character literal {txt}")
                        return
                end
-               self.value = txt[1]
+               self.value = txt.chars[1]
        end
 end
 
@@ -102,8 +103,13 @@ redef class AStringFormExpr
        redef fun accept_literal(v)
        do
                var txt = self.n_string.text
-               var skip = 1
-               if txt[0] == txt[1] and txt.length >= 6 then skip = 3
-               self.value = txt.substring(skip, txt.length-(2*skip)).unescape_nit
+               var behead = 1
+               var betail = 1
+               if txt.chars[0] == txt.chars[1] and txt.length >= 6 then
+                       behead = 3
+                       betail = 3
+                       if txt.chars[0] == '"' and txt.chars[3] == '\n' then behead = 4 # ignore first \n in """
+               end
+               self.value = txt.substring(behead, txt.length - behead - betail).unescape_nit
        end
 end