@@ -39,6 +39,8 @@ import scala.util.control.NonFatal
39
39
* @author Martin Odersky
40
40
*/
41
41
abstract class ClassfileParser (reader : ReusableInstance [ReusableDataReader ]) {
42
+ import ClassfileParser ._
43
+
42
44
val symbolTable : SymbolTable {
43
45
def settings : Settings
44
46
}
@@ -80,7 +82,6 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
80
82
protected var srcfile0 : Option [AbstractFile ] = None
81
83
protected def moduleClass : Symbol = staticModule.moduleClass
82
84
protected val TASTYUUIDLength : Int = 16
83
- private var sawPrivateConstructor = false
84
85
private var YtastyReader = false
85
86
86
87
private def ownerForFlags (jflags : JavaAccFlags ) = if (jflags.isStatic) moduleClass else clazz
@@ -543,14 +544,9 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
543
544
parseAttributes(clazz, completer)
544
545
545
546
in.bp = fieldsStartBp
546
- 0 until u2() foreach (_ => parseField())
547
- sawPrivateConstructor = false
548
- 0 until u2() foreach (_ => parseMethod())
549
- val needsConstructor = (
550
- ! sawPrivateConstructor
551
- && ! instanceScope.containsName(nme.CONSTRUCTOR )
552
- && ((sflags & (INTERFACE | JAVA_ANNOTATION )) == (INTERFACE | JAVA_ANNOTATION ))
553
- )
547
+ u2() times parseField()
548
+ u2() times parseMethod()
549
+ val needsConstructor = (sflags & JAVA_ANNOTATION ) != 0L
554
550
if (needsConstructor)
555
551
instanceScope enter clazz.newClassConstructor(NoPosition )
556
552
@@ -568,7 +564,7 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
568
564
var sym = clazz.owner
569
565
while (sym.isClass && ! sym.isModuleClass) {
570
566
for (t <- sym.tpe.typeArgs)
571
- classTParams = classTParams + (t.typeSymbol.name -> t.typeSymbol)
567
+ classTParams += (t.typeSymbol.name -> t.typeSymbol)
572
568
573
569
sym = sym.owner
574
570
}
@@ -581,9 +577,9 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
581
577
if ((sflags & PRIVATE ) != 0L ) {
582
578
in.skip(4 ); skipAttributes()
583
579
} else {
584
- val name = readName()
580
+ val name = readName()
585
581
val lazyInfo = new MemberTypeCompleter (name, jflags, pool.getExternalName(u2()).value)
586
- val sym = ownerForFlags(jflags).newValue(name.toTermName, NoPosition , sflags)
582
+ val sym = ownerForFlags(jflags).newValue(name.toTermName, NoPosition , sflags)
587
583
588
584
// Note: the info may be overwritten later with a generic signature
589
585
// parsed from SignatureATTR
@@ -615,27 +611,20 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
615
611
616
612
def parseMethod (): Unit = {
617
613
val jflags = readMethodFlags()
618
- val sflags = jflags.toScalaFlags
619
614
if (jflags.isPrivate) {
620
- val isConstructor = pool.getName(u2()).value == " <init>" // opt avoid interning a Name for private methods we're about to discard
621
- if (isConstructor)
622
- sawPrivateConstructor = true
623
- in.skip(2 ); skipAttributes()
615
+ in.skip(4 ); skipAttributes()
624
616
} else {
625
- if ((sflags & PRIVATE ) != 0L ) {
626
- in.skip(4 ); skipAttributes()
627
- } else {
628
- val name = readName()
629
- val sym = ownerForFlags(jflags).newMethod(name.toTermName, NoPosition , sflags)
630
- // Note: the info may be overwritten later with a generic signature
631
- // parsed from SignatureATTR
632
- val lazyInfo = new MemberTypeCompleter (name, jflags, pool.getExternalName(u2()).value)
633
- sym.info = lazyInfo
634
- propagatePackageBoundary(jflags, sym)
635
- parseAttributes(sym, lazyInfo)
636
- addJavaFlagsAnnotations(sym, jflags)
637
- getScope(jflags) enter sym
638
- }
617
+ val name = readName()
618
+ val sflags = jflags.toScalaFlags
619
+ val sym = ownerForFlags(jflags).newMethod(name.toTermName, NoPosition , sflags)
620
+ // Note: the info may be overwritten later with a generic signature
621
+ // parsed from SignatureATTR
622
+ val lazyInfo = new MemberTypeCompleter (name, jflags, pool.getExternalName(u2()).value)
623
+ sym.info = lazyInfo
624
+ propagatePackageBoundary(jflags, sym)
625
+ parseAttributes(sym, lazyInfo)
626
+ addJavaFlagsAnnotations(sym, jflags)
627
+ getScope(jflags) enter sym
639
628
}
640
629
}
641
630
@@ -865,7 +854,7 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
865
854
case tpnme.RuntimeAnnotationATTR =>
866
855
val numAnnots = u2()
867
856
val annots = new ListBuffer [AnnotationInfo ]
868
- for (n <- 0 until numAnnots; annot <- parseAnnotation(u2()))
857
+ for (n <- 0 until numAnnots; annot <- parseAnnotation(u2()))
869
858
annots += annot
870
859
/* `sym.withAnnotations(annots)`, like `sym.addAnnotation(annot)`, prepends,
871
860
* so if we parsed in classfile order we would wind up with the annotations
@@ -933,7 +922,7 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
933
922
}
934
923
}
935
924
// begin parseAttributes
936
- for (i <- 0 until u2()) parseAttribute()
925
+ u2() times parseAttribute()
937
926
}
938
927
939
928
@@ -967,15 +956,16 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
967
956
case ARRAY_TAG =>
968
957
val arr = new ArrayBuffer [ClassfileAnnotArg ]()
969
958
var hasError = false
970
- for (i <- 0 until index)
959
+ index times {
971
960
parseAnnotArg() match {
972
961
case Some (c) => arr += c
973
962
case None => hasError = true
974
963
}
964
+ }
975
965
if (hasError) None
976
966
else Some (ArrayAnnotArg (arr.toArray))
977
967
case ANNOTATION_TAG =>
978
- parseAnnotation(index) map (NestedAnnotArg (_))
968
+ parseAnnotation(index). map(NestedAnnotArg (_))
979
969
}
980
970
}
981
971
@@ -989,7 +979,7 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
989
979
val nargs = u2()
990
980
val nvpairs = new ListBuffer [(Name , ClassfileAnnotArg )]
991
981
var hasError = false
992
- for (i <- 0 until nargs) {
982
+ nargs times {
993
983
val name = readName()
994
984
parseAnnotArg() match {
995
985
case Some (c) => nvpairs += ((name, c))
@@ -1016,7 +1006,7 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
1016
1006
* if the corresponding flag is set in `flags`.
1017
1007
*/
1018
1008
def addJavaFlagsAnnotations (sym : Symbol , flags : JavaAccFlags ): Unit =
1019
- flags.toScalaAnnotations(symbolTable) foreach (ann => sym.addAnnotation(ann ))
1009
+ flags.toScalaAnnotations(symbolTable). foreach( sym.addAnnotation(_ ))
1020
1010
1021
1011
/** Enter own inner classes in the right scope. It needs the scopes to be set up,
1022
1012
* and implicitly current class' superclasses.
@@ -1179,7 +1169,7 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
1179
1169
1180
1170
case ARRAY_TAG =>
1181
1171
val num = u2()
1182
- for (i <- 0 until num) skipAnnotArg()
1172
+ num times skipAnnotArg()
1183
1173
1184
1174
case ANNOTATION_TAG =>
1185
1175
in.skip(2 ) // type
@@ -1188,7 +1178,7 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
1188
1178
1189
1179
def skipAnnotArgs () = {
1190
1180
val numArgs = u2()
1191
- for (i <- 0 until numArgs) {
1181
+ numArgs times {
1192
1182
in.skip(2 )
1193
1183
skipAnnotArg()
1194
1184
}
@@ -1281,7 +1271,7 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
1281
1271
} else if (! isScalaRaw && innersStart != - 1 ) {
1282
1272
in.bp = innersStart
1283
1273
val entries = u2()
1284
- for (_ <- 0 until entries) {
1274
+ entries times {
1285
1275
val innerIndex, outerIndex, nameIndex = u2()
1286
1276
val jflags = readInnerClassFlags()
1287
1277
if (innerIndex != 0 && outerIndex != 0 && nameIndex != 0 )
@@ -1502,3 +1492,8 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
1502
1492
protected def getScope (flags : JavaAccFlags ): Scope =
1503
1493
if (flags.isStatic) staticScope else instanceScope
1504
1494
}
1495
+ object ClassfileParser {
1496
+ private implicit class GoodTimes (val n : Int ) extends AnyVal {
1497
+ def times (body : => Unit ) = (1 to n).foreach(_ => body)
1498
+ }
1499
+ }
0 commit comments