Skip to content
This repository was archived by the owner on Sep 1, 2020. It is now read-only.

Commit 9afc167

Browse files
committed
Merge pull request #12 from puffnfresh/feature/short-byte-literals
Add support for literal Byte and Short values.
2 parents 9753f23 + 9d5098f commit 9afc167

File tree

6 files changed

+88
-16
lines changed

6 files changed

+88
-16
lines changed

src/compiler/scala/tools/nsc/ast/parser/CommonTokens.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ abstract class CommonTokens {
2020
final val FLOATLIT = 4
2121
final val DOUBLELIT = 5
2222
final val STRINGLIT = 6
23+
final val BYTELIT = 12
24+
final val SHORTLIT = 13
2325

2426
/** keywords */
2527
final val NEW = 20

src/compiler/scala/tools/nsc/ast/parser/Parsers.scala

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,7 @@ self =>
643643
def isDefIntro = isTemplateIntro || isDclIntro
644644

645645
def isNumericLit: Boolean = in.token match {
646-
case INTLIT | LONGLIT | FLOATLIT | DOUBLELIT => true
646+
case BYTELIT | SHORTLIT | INTLIT | LONGLIT | FLOATLIT | DOUBLELIT => true
647647
case _ => false
648648
}
649649

@@ -659,7 +659,7 @@ self =>
659659
def isMacro = in.token == IDENTIFIER && in.name == nme.MACROkw
660660

661661
def isLiteralToken(token: Token) = token match {
662-
case CHARLIT | INTLIT | LONGLIT | FLOATLIT | DOUBLELIT |
662+
case BYTELIT | SHORTLIT | CHARLIT | INTLIT | LONGLIT | FLOATLIT | DOUBLELIT |
663663
STRINGLIT | INTERPOLATIONID | SYMBOLLIT | TRUE | FALSE | NULL => true
664664
case _ => false
665665
}
@@ -1186,6 +1186,8 @@ self =>
11861186
case LONGLIT => in.intVal(isNegated)
11871187
case FLOATLIT => in.floatVal(isNegated).toFloat
11881188
case DOUBLELIT => in.floatVal(isNegated)
1189+
case BYTELIT => in.intVal(isNegated).toByte
1190+
case SHORTLIT => in.intVal(isNegated).toShort
11891191
case STRINGLIT | STRINGPART => in.strVal.intern()
11901192
case TRUE => true
11911193
case FALSE => false
@@ -1958,7 +1960,7 @@ self =>
19581960
case IDENTIFIER | BACKQUOTED_IDENT | THIS =>
19591961
val t = stableId()
19601962
in.token match {
1961-
case INTLIT | LONGLIT | FLOATLIT | DOUBLELIT =>
1963+
case BYTELIT | SHORTLIT | INTLIT | LONGLIT | FLOATLIT | DOUBLELIT =>
19621964
t match {
19631965
case Ident(nme.MINUS) =>
19641966
return literal(isNegated = true, inPattern = true, start = start)
@@ -1977,7 +1979,7 @@ self =>
19771979
case USCORE =>
19781980
in.nextToken()
19791981
atPos(start, start) { Ident(nme.WILDCARD) }
1980-
case CHARLIT | INTLIT | LONGLIT | FLOATLIT | DOUBLELIT |
1982+
case BYTELIT | SHORTLIT | CHARLIT | INTLIT | LONGLIT | FLOATLIT | DOUBLELIT |
19811983
STRINGLIT | INTERPOLATIONID | SYMBOLLIT | TRUE | FALSE | NULL =>
19821984
literal(inPattern = true)
19831985
case LPAREN =>

src/compiler/scala/tools/nsc/ast/parser/Scanners.scala

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,7 @@ trait Scanners extends ScannersCommon {
594594

595595
/** Can token end a statement? */
596596
def inLastOfStat(token: Token) = token match {
597-
case CHARLIT | INTLIT | LONGLIT | FLOATLIT | DOUBLELIT | STRINGLIT | SYMBOLLIT |
597+
case CHARLIT | BYTELIT | SHORTLIT | INTLIT | LONGLIT | FLOATLIT | DOUBLELIT | STRINGLIT | SYMBOLLIT |
598598
IDENTIFIER | BACKQUOTED_IDENT | THIS | NULL | TRUE | FALSE | RETURN | USCORE |
599599
TYPE | XMLSTART | RPAREN | RBRACKET | RBRACE =>
600600
true
@@ -911,8 +911,12 @@ trait Scanners extends ScannersCommon {
911911
} else {
912912
var value: Long = 0
913913
val divider = if (base == 10) 1 else 2
914-
val limit: Long =
915-
if (token == LONGLIT) Long.MaxValue else Int.MaxValue
914+
val limit: Long = token match {
915+
case LONGLIT => Long.MaxValue
916+
case BYTELIT => Byte.MaxValue
917+
case SHORTLIT => Short.MaxValue
918+
case _ => Int.MaxValue
919+
}
916920
var i = 0
917921
val len = strVal.length
918922
while (i < len) {
@@ -996,7 +1000,6 @@ trait Scanners extends ScannersCommon {
9961000
}
9971001
def restOfUncertainToken() = {
9981002
def isEfd = ch match { case 'e' | 'E' | 'f' | 'F' | 'd' | 'D' => true ; case _ => false }
999-
def isL = ch match { case 'l' | 'L' => true ; case _ => false }
10001003

10011004
if (base <= 10 && isEfd)
10021005
getFraction()
@@ -1005,17 +1008,25 @@ trait Scanners extends ScannersCommon {
10051008
// as soon as a 0 is read in `case '0'` of method fetchToken.
10061009
if (base == 8 && notSingleZero) syntaxError("Non-zero integral values may not have a leading zero.")
10071010
setStrVal()
1008-
if (isL) {
1009-
nextChar()
1010-
token = LONGLIT
1011+
ch match {
1012+
case 'l' | 'L' =>
1013+
nextChar()
1014+
token = LONGLIT
1015+
case 'z' | 'Z' =>
1016+
nextChar()
1017+
token = BYTELIT
1018+
case 's' | 'S' =>
1019+
nextChar()
1020+
token = SHORTLIT
1021+
case _ =>
1022+
checkNoLetter()
10111023
}
1012-
else checkNoLetter()
10131024
}
10141025
}
10151026

1016-
if (base > 10 || ch != '.')
1027+
if (base > 10 || ch != '.') {
10171028
restOfUncertainToken()
1018-
else {
1029+
} else {
10191030
val lookahead = lookaheadReader
10201031
val c = lookahead.getc()
10211032

@@ -1095,6 +1106,10 @@ trait Scanners extends ScannersCommon {
10951106
"int(" + intVal + ")"
10961107
case LONGLIT =>
10971108
"long(" + intVal + ")"
1109+
case BYTELIT =>
1110+
"byte(" + intVal + ")"
1111+
case SHORTLIT =>
1112+
"short(" + intVal + ")"
10981113
case FLOATLIT =>
10991114
"float(" + floatVal + ")"
11001115
case DOUBLELIT =>
@@ -1212,6 +1227,8 @@ trait Scanners extends ScannersCommon {
12121227
case CHARLIT => "character literal"
12131228
case INTLIT => "integer literal"
12141229
case LONGLIT => "long literal"
1230+
case BYTELIT => "byte literal"
1231+
case SHORTLIT => "short literal"
12151232
case FLOATLIT => "float literal"
12161233
case DOUBLELIT => "double literal"
12171234
case STRINGLIT | STRINGPART | INTERPOLATIONID => "string literal"

src/compiler/scala/tools/nsc/javac/JavaScanners.scala

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ trait JavaScanners extends ast.parser.ScannersCommon {
150150
case INTLIT => "integer literal"
151151
case LONGLIT => "long literal"
152152
case STRINGLIT => "string literal"
153+
case BYTELIT => "byte literal"
154+
case SHORTLIT => "short literal"
153155
case EOF => "eof"
154156
case ERROR => "something"
155157
case AMP => "`&'"
@@ -728,8 +730,13 @@ trait JavaScanners extends ast.parser.ScannersCommon {
728730
} else {
729731
var value: Long = 0
730732
val divider = if (base == 10) 1 else 2
731-
val limit: Long =
732-
if (token == LONGLIT) Long.MaxValue else Int.MaxValue
733+
val limit: Long = token match {
734+
case BYTELIT => Byte.MaxValue
735+
case SHORTLIT => Short.MaxValue
736+
case LONGLIT => Long.MaxValue
737+
case _ => Int.MaxValue
738+
}
739+
733740
var i = 0
734741
val len = name.length
735742
while (i < len) {
@@ -804,6 +811,12 @@ trait JavaScanners extends ast.parser.ScannersCommon {
804811
if (in.ch == 'l' || in.ch == 'L') {
805812
in.next()
806813
token = LONGLIT
814+
} else if (in.ch == 'z' || in.ch == 'Z') {
815+
in.next()
816+
token = BYTELIT
817+
} else if (in.ch == 's' || in.ch == 'S') {
818+
in.next()
819+
token = SHORTLIT
807820
}
808821
}
809822

test/files/run/literals.check

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,22 @@ test "\0x61\0x62".trim() == "x61\0x62" was successful
77

88
test (65 : Byte) == 'A' was successful
99

10+
test 1z == 1 was successful
11+
test -1z == -1 was successful
12+
test 1Z == 1 was successful
13+
test -1Z == -1 was successful
14+
test 0xffZ == -1 was successful
15+
test 0xFFz == -1 was successful
16+
test 0x0aZ == 0xAz was successful
17+
18+
test 1s == 1 was successful
19+
test -1s == -1 was successful
20+
test 1S == 1 was successful
21+
test -1S == -1 was successful
22+
test 0xffffS == -1 was successful
23+
test 0xFFFFs == -1 was successful
24+
test 0x0aS == 0xAs was successful
25+
1026
test 0X01 == 1 was successful
1127
test 0x01 == 1 was successful
1228
test 0x10 == 16 was successful

test/files/run/literals.scala

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,28 @@ object Test {
4646

4747
println
4848

49+
// byte
50+
check_success[Byte]("1z == 1", 1z, 1.toByte)
51+
check_success[Byte]("-1z == -1", -1z, -1.toByte)
52+
check_success[Byte]("1Z == 1", 1Z, 1.toByte)
53+
check_success[Byte]("-1Z == -1", -1Z, -1.toByte)
54+
check_success[Byte]("0xffZ == -1", 0xffZ, -1.toByte)
55+
check_success[Byte]("0xFFz == -1", 0xFFz, -1.toByte)
56+
check_success[Byte]("0x0aZ == 0xAz", 0x0aZ, 0xAz)
57+
58+
println
59+
60+
// short
61+
check_success[Short]("1s == 1", 1s, 1.toShort)
62+
check_success[Short]("-1s == -1", -1s, -1.toShort)
63+
check_success[Short]("1S == 1", 1S, 1.toShort)
64+
check_success[Short]("-1S == -1", -1S, -1.toShort)
65+
check_success[Short]("0xffffS == -1", 0xffffS, -1.toShort)
66+
check_success[Short]("0xFFFFs == -1", 0xFFFFs, -1.toShort)
67+
check_success[Short]("0x0aS == 0xAs", 0x0aS, 0xAs)
68+
69+
println
70+
4971
// int
5072
check_success("0X01 == 1", 0X01, 1)
5173
check_success("0x01 == 1", 0x01, 1)

0 commit comments

Comments
 (0)