1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2012 Jean Privat <jean@pryen.org>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Parsing of literal values in the abstract syntax tree.
22 redef class ToolContext
23 var literal_phase
: Phase = new LiteralPhase(self, null)
26 private class LiteralPhase
29 redef fun process_nmodule
(nmodule
) do nmodule
.do_literal
(toolcontext
)
33 # Visit the module to compute the real value of the literal-related node of the AST.
34 # Warnings and errors are displayed on the toolcontext.
35 fun do_literal
(toolcontext
: ToolContext)
37 var v
= new LiteralVisitor(toolcontext
)
42 private class LiteralVisitor
45 var toolcontext
: ToolContext
49 n
.accept_literal
(self)
55 private fun accept_literal
(v
: LiteralVisitor) do end
59 # Get `self` as a `String`.
60 # Return null if not a string.
61 fun as_string
: nullable String
63 if not self isa AStringFormExpr then return null
64 return self.value
.as(not null)
67 # Get `self` as an `Int`.
68 # Return null if not an integer.
69 fun as_int
: nullable Int
71 if not self isa AIntExpr then return null
72 return self.value
.as(not null)
75 # Get `self` as a single identifier.
76 # Return null if not a single identifier.
77 fun as_id
: nullable String
79 if self isa AMethidExpr then
80 return self.collect_text
82 if not self isa ACallExpr then return null
83 if not self.n_expr
isa AImplicitSelfExpr then return null
84 if not self.n_args
.n_exprs
.is_empty
then return null
91 # The value of the literal int once computed.
92 var value
: nullable Int
95 redef class ADecIntExpr
96 redef fun accept_literal
(v
)
98 self.value
= self.n_number
.text
.to_i
102 redef class AHexIntExpr
103 redef fun accept_literal
(v
)
105 self.value
= self.n_hex_number
.text
.substring_from
(2).to_hex
109 redef class AFloatExpr
110 # The value of the literal float once computed.
111 var value
: nullable Float
112 redef fun accept_literal
(v
)
114 self.value
= self.n_float
.text
.to_f
118 redef class ACharExpr
119 # The value of the literal char once computed.
120 var value
: nullable Char
121 redef fun accept_literal
(v
)
123 var txt
= self.n_char
.text
.unescape_nit
124 if txt
.length
!= 3 then
125 v
.toolcontext
.error
(self.hot_location
, "Invalid character literal {txt}")
128 self.value
= txt
.chars
[1]
132 redef class AStringFormExpr
133 # The value of the literal string once computed.
134 var value
: nullable String
135 redef fun accept_literal
(v
)
137 var txt
= self.n_string
.text
140 if txt
.chars
[0] == txt
.chars
[1] and txt
.length
>= 6 then
143 if txt
.chars
[0] == '"' and txt
.chars
[3] == '\n' then behead
= 4 # ignore first \n in """
145 self.value
= txt
.substring
(behead
, txt
.length
- behead
- betail
).unescape_nit