Skip to content

Commit 3db0a69

Browse files
TATSUNO Yasuhirosjrd
authored andcommitted
Add number literal type (#47)
1 parent c2a5499 commit 3db0a69

File tree

7 files changed

+65
-2
lines changed

7 files changed

+65
-2
lines changed

samples/numberlit.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
declare module numberlit {
2+
3+
export type HttpStatuscode = 200 | 404 | 503 ;
4+
5+
// 1 to Int, 1.0 (which is valid-int) to Double
6+
export function floating(prob: 0.1 | 0.5 | 1.0): 0.0 | 1
7+
8+
export interface Machine {
9+
state?: 0 | 1;
10+
11+
setState(flag: 0 | 1 | boolean): 0 | 1;
12+
}
13+
}

samples/numberlit.ts.scala

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
import scala.scalajs.js
3+
import js.annotation._
4+
import js.|
5+
6+
package numberlit {
7+
8+
package numberlit {
9+
10+
@js.native
11+
trait Machine extends js.Object {
12+
var state: Int = js.native
13+
def setState(flag: Int | Boolean): Int = js.native
14+
}
15+
16+
@js.native
17+
@JSGlobal("numberlit")
18+
object Numberlit extends js.Object {
19+
type HttpStatuscode = Int
20+
def floating(prob: Double): Double | Int = js.native
21+
}
22+
23+
}
24+
25+
}

src/main/scala/org/scalajs/tools/tsimporter/Importer.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,12 @@ class Importer(val output: java.io.PrintWriter) {
270270
case ConstantType(StringLiteral(_)) =>
271271
TypeRef.String
272272

273+
case ConstantType(IntLiteral(i)) =>
274+
TypeRef.Int
275+
276+
case ConstantType(DoubleLiteral(d)) =>
277+
TypeRef.Double
278+
273279
case ObjectType(List(IndexMember(_, TypeRefTree(CoreType("string"), _), valueType))) =>
274280
val valueTpe = typeToScala(valueType)
275281
TypeRef(QualifiedName.Dictionary, List(valueTpe))

src/main/scala/org/scalajs/tools/tsimporter/Trees.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,11 @@ object Trees {
109109

110110
case class BooleanLiteral(value: Boolean) extends Literal
111111

112-
case class NumberLiteral(value: Double) extends Literal
112+
sealed trait NumberLiteral extends Literal
113+
114+
case class IntLiteral(value: Int) extends NumberLiteral
115+
116+
case class DoubleLiteral(value: Double) extends NumberLiteral
113117

114118
case class StringLiteral(value: String) extends Literal with PropertyName {
115119
override def name = value

src/main/scala/org/scalajs/tools/tsimporter/parser/TSDefLexical.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ class TSDefLexical extends Lexical with StdTokens with ImplicitConversions {
4141
// not standard, but I guess it could happen nevertheless
4242
digits => digits.foldLeft(0L)(_ * 8 + _).toString
4343
}
44-
| success("0")
4544
)
4645
| stringOf1(digit) ~ opt(stringOf1('.', digit)) ^^ {
4746
case part1 ~ part2 => part1 + (part2.getOrElse(""))

src/main/scala/org/scalajs/tools/tsimporter/parser/TSDefParser.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ class TSDefParser extends StdTokenParsers with ImplicitConversions {
173173
lazy val paramType: Parser[TypeTree] = (
174174
typeDesc
175175
| stringLiteral ^^ ConstantType
176+
| numberLiteral ^^ ConstantType
176177
)
177178

178179
lazy val optResultType =
@@ -216,6 +217,7 @@ class TSDefParser extends StdTokenParsers with ImplicitConversions {
216217
| objectType
217218
| functionType
218219
| stringType
220+
| numberType
219221
| typeQuery
220222
| tupleType
221223
| thisType
@@ -247,6 +249,9 @@ class TSDefParser extends StdTokenParsers with ImplicitConversions {
247249
lazy val stringType: Parser[TypeTree] =
248250
stringLiteral ^^ ConstantType
249251

252+
lazy val numberType: Parser[TypeTree] =
253+
numberLiteral ^^ ConstantType
254+
250255
lazy val thisType: Parser[TypeTree] =
251256
"this" ^^^ PolymorphicThisType
252257

@@ -319,6 +324,16 @@ class TSDefParser extends StdTokenParsers with ImplicitConversions {
319324
lazy val stringLiteral: Parser[StringLiteral] =
320325
stringLit ^^ StringLiteral
321326

327+
lazy val numberLiteral: Parser[NumberLiteral] =
328+
numericLit ^^ { s =>
329+
val d = s.toDouble
330+
if (!s.contains(".") && d.isValidInt) {
331+
IntLiteral(d.toInt)
332+
} else {
333+
DoubleLiteral(d)
334+
}
335+
}
336+
322337
private val isCoreTypeName =
323338
Set("any", "void", "number", "bool", "boolean", "string", "null", "undefined", "never")
324339

src/main/scala/org/scalajs/tools/tsimporter/sc/Definitions.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ object TypeRef {
296296
val Any = TypeRef(scala_js dot Name("Any"))
297297
val Dynamic = TypeRef(scala_js dot Name("Dynamic"))
298298
val Double = TypeRef(scala dot Name("Double"))
299+
val Int = TypeRef(scala dot Name("Int"))
299300
val Boolean = TypeRef(scala dot Name("Boolean"))
300301
val String = TypeRef(java_lang dot Name("String"))
301302
val Object = TypeRef(scala_js dot Name("Object"))

0 commit comments

Comments
 (0)