Skip to content

Commit 1387795

Browse files
committed
Abstract skipBraces across parsers
1 parent 53b89c5 commit 1387795

File tree

3 files changed

+25
-27
lines changed

3 files changed

+25
-27
lines changed

compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -914,21 +914,11 @@ object JavaParsers {
914914
* This is necessary even for Java, because the filename defining a non-public classes cannot be determined from the
915915
* classname alone.
916916
*/
917-
class OutlineJavaParser(source: SourceFile)(implicit ctx: Context) extends JavaParser(source) {
918-
919-
def skipBraces(): Unit = {
920-
accept(LBRACE)
921-
var openBraces = 1
922-
while (in.token != EOF && openBraces > 0) {
923-
if (in.token == LBRACE) openBraces += 1
924-
else if (in.token == RBRACE) openBraces -= 1
925-
in.nextToken()
926-
}
927-
}
928-
917+
class OutlineJavaParser(source: SourceFile)(implicit ctx: Context) extends JavaParser(source) with OutlineParserCommon {
918+
override def skipBracesHook() = None
929919
override def typeBody(leadingToken: Int, parentName: Name, parentTParams: List[TypeDef]): (List[Tree], List[Tree]) = {
930920
skipBraces()
931-
(List(EmptyValDef), List(EmptyTree)))
921+
(List(EmptyValDef), List(EmptyTree))
932922
}
933923
}
934924
}

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,23 @@ object Parsers {
130130
ctx.error(msg, source atPos pos)
131131
}
132132

133+
trait OutlineParserCommon extends ParserCommon {
134+
def accept(token: Int): Int
135+
136+
def skipBracesHook(): Option[Tree]
137+
def skipBraces(): Unit = {
138+
accept(LBRACE)
139+
var openBraces = 1
140+
while (in.token != EOF && openBraces > 0) {
141+
skipBracesHook() getOrElse {
142+
if (in.token == LBRACE) openBraces += 1
143+
else if (in.token == RBRACE) openBraces -= 1
144+
in.nextToken()
145+
}
146+
}
147+
}
148+
}
149+
133150
class Parser(source: SourceFile)(implicit ctx: Context) extends ParserCommon(source) {
134151

135152
val in: Scanner = new Scanner(source)
@@ -2641,20 +2658,10 @@ object Parsers {
26412658
/** OutlineParser parses top-level declarations in `source` to find declared classes, ignoring their bodies (which
26422659
* must only have balanced braces). This is used to map class names to defining sources.
26432660
*/
2644-
class OutlineParser(source: SourceFile)(implicit ctx: Context) extends Parser(source) {
2661+
class OutlineParser(source: SourceFile)(implicit ctx: Context) extends Parser(source) with OutlineParserCommon {
26452662

2646-
def skipBraces(): Unit = {
2647-
accept(LBRACE)
2648-
var openBraces = 1
2649-
while (in.token != EOF && openBraces > 0) {
2650-
if (in.token == XMLSTART) xmlLiteral()
2651-
else {
2652-
if (in.token == LBRACE) openBraces += 1
2653-
else if (in.token == RBRACE) openBraces -= 1
2654-
in.nextToken()
2655-
}
2656-
}
2657-
}
2663+
def skipBracesHook(): Option[Tree] =
2664+
if (in.token == XMLSTART) Some(xmlLiteral()) else None
26582665

26592666
override def blockExpr(): Tree = {
26602667
skipBraces()
@@ -2663,7 +2670,7 @@ object Parsers {
26632670

26642671
override def templateBody() = {
26652672
skipBraces()
2666-
(EmptyValDef, List(EmptyTree)))
2673+
(EmptyValDef, List(EmptyTree))
26672674
}
26682675
}
26692676
}

compiler/src/dotty/tools/dotc/parsing/Scanners.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ object Scanners {
5757

5858
abstract class ScannerCommon(source: SourceFile)(implicit ctx: Context) extends CharArrayReader with TokenData {
5959
val buf = source.content
60+
def nextToken(): Unit
6061

6162
// Errors -----------------------------------------------------------------
6263

0 commit comments

Comments
 (0)