Skip to content

Commit 32e6c60

Browse files
committed
WIP
1 parent 578acf7 commit 32e6c60

File tree

4 files changed

+32
-10
lines changed

4 files changed

+32
-10
lines changed

src/compiler/scala/tools/nsc/PipelineMain.scala

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package scala.tools.nsc
77
import java.io.File
88
import java.nio.ByteBuffer
99
import java.nio.file.{Files, Path, Paths}
10+
import java.util.Collections
1011

1112
import javax.tools.{SimpleJavaFileObject, ToolProvider}
1213

@@ -16,7 +17,7 @@ import scala.concurrent.{Await, ExecutionContext, Future, Promise}
1617
import scala.reflect.internal.pickling.PickleBuffer
1718
import scala.reflect.internal.util.FakePos
1819
import scala.reflect.io.{VirtualDirectory, VirtualFile}
19-
import scala.tools.nsc.backend.{ClassfileInfo, ScalaClass, ScalaRawClass}
20+
import scala.tools.nsc.backend.{ClassfileInfo, JavaPlatform, ScalaClass, ScalaRawClass}
2021
import scala.tools.nsc.classpath.{DirectoryClassPath, VirtualDirectoryClassPath}
2122
import scala.tools.nsc.io.AbstractFile
2223
import scala.tools.nsc.reporters.{ConsoleReporter, Reporter}
@@ -77,6 +78,7 @@ class PipelineMainClass(label: String, parallelism: Int, strategy: BuildStrategy
7778
}
7879
}
7980
private val allPickleData = new java.util.concurrent.ConcurrentHashMap[Path, PickleClassPath[_]]
81+
private val allParsedInfos = new java.util.concurrent.ConcurrentHashMap[AbstractFile, ClassfileInfo]
8082

8183
def process(args: Array[String]): Boolean = {
8284
println(s"parallelism = $parallelism, strategy = $strategy")
@@ -358,6 +360,7 @@ class PipelineMainClass(label: String, parallelism: Int, strategy: BuildStrategy
358360
javaDone.completeWith(Future {
359361
val opts = java.util.Arrays.asList("-d", command.settings.outdir.value, "-cp", command.settings.outdir.value + File.pathSeparator + command.settings.classpath.value)
360362
val compileTask = ToolProvider.getSystemJavaCompiler.getTask(null, null, null, opts, null, fileManager.getJavaFileObjects(javaSources.toArray: _*))
363+
compileTask.setProcessors(Collections.emptyList())
361364
compileTask.call()
362365
})
363366
} else {
@@ -409,10 +412,17 @@ class PipelineMainClass(label: String, parallelism: Int, strategy: BuildStrategy
409412
case vf: VirtualFile =>
410413
val iterator = replacements.iterator.flatMap(_.classInfo.get(vf))
411414
if (iterator.hasNext)
412-
Some(iterator.next())
415+
return Some(iterator.next())
413416
else None
414417
case _ => None
415418
}
419+
allParsedInfos.get(file) match {
420+
case null => None
421+
case info => Some(info)
422+
}
423+
}
424+
override def parsed(file: AbstractFile, clazz: g.ClassSymbol, info: ClassfileInfo): Unit = {
425+
allParsedInfos.put(file, info)
416426
}
417427
}
418428
g.platform.addClassPathPlugin(plugin)

src/compiler/scala/tools/nsc/backend/Platform.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ trait Platform {
5454
*/
5555
abstract class ClassPathPlugin {
5656
def info(file: AbstractFile, clazz: ClassSymbol): Option[ClassfileInfo]
57+
def parsed(file: AbstractFile, clazz: ClassSymbol, info: ClassfileInfo): Unit = ()
5758
def modifyClassPath(classPath: Seq[ClassPath]): Seq[ClassPath] = classPath
5859
}
5960

@@ -83,6 +84,9 @@ trait Platform {
8384
case (None, plugin) => plugin.info(file, clazz)
8485
}
8586
}
87+
final def classFileInfoParsed(file: AbstractFile, clazz: ClassSymbol, info: ClassfileInfo): Unit = if (classPathPlugins eq Nil) None else {
88+
classPathPlugins.foreach(_.parsed(file, clazz, info))
89+
}
8690
}
8791

8892
sealed abstract class ClassfileInfo {}

src/compiler/scala/tools/nsc/settings/AbsSettings.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ trait AbsSettings extends scala.reflect.internal.settings.AbsSettings {
1818
protected def allSettings: scala.collection.Set[Setting]
1919

2020
// settings minus internal usage settings
21-
def visibleSettings = allSettings filterNot (_.isInternalOnly)
21+
def visibleSettings = allSettings.iterator filterNot (_.isInternalOnly)
2222

2323
// only settings which differ from default
2424
def userSetSettings = visibleSettings filterNot (_.isDefault)

src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ package classfile
1010

1111
import java.io._
1212
import java.lang.Integer.toHexString
13+
import java.nio.ByteBuffer
1314

1415
import scala.collection.{immutable, mutable}
1516
import scala.collection.mutable.{ArrayBuffer, ListBuffer}
@@ -158,26 +159,32 @@ abstract class ClassfileParser {
158159
isScalaRaw = true
159160
currentClass = TermName(className)
160161
case ScalaClass(className, pickle) =>
162+
val pickle1 = pickle
161163
isScala = true
162164
currentClass = TermName(className)
163-
if (pickle.hasArray) {
164-
unpickler.unpickle(pickle.array, pickle.arrayOffset + pickle.position(), clazz, staticModule, file.name)
165+
if (pickle1.hasArray) {
166+
unpickler.unpickle(pickle1.array, pickle1.arrayOffset + pickle1.position(), clazz, staticModule, file.name)
165167
} else {
166-
val array = new Array[Byte](pickle.remaining)
167-
pickle.get(array)
168+
val array = new Array[Byte](pickle1.remaining)
169+
pickle1.get(array)
168170
unpickler.unpickle(array, 0, clazz, staticModule, file.name)
169171
}
170172
case ClassBytes(data) =>
171-
val array = new Array[Byte](data.remaining)
172-
data.get(array)
173+
val data1 = data.duplicate()
174+
val array = new Array[Byte](data1.remaining)
175+
data1.get(array)
173176
this.in = new AbstractFileReader(file, array)
177+
parseHeader()
178+
this.pool = newConstantPool
174179
parseClass()
175180
}
176181
case None =>
177182
this.in = new AbstractFileReader(file)
178183
parseHeader()
179184
this.pool = newConstantPool
180185
parseClass()
186+
if (!(isScala || isScalaRaw))
187+
loaders.platform.classFileInfoParsed(file, clazz, ClassBytes(ByteBuffer.wrap(in.buf)))
181188
}
182189
if (isScalaRaw && !isNothingOrNull) {
183190
unlinkRaw()
@@ -929,8 +936,8 @@ abstract class ClassfileParser {
929936
case Some(san: AnnotationInfo) =>
930937
val bytes =
931938
san.assocs.find({ _._1 == nme.bytes }).get._2.asInstanceOf[ScalaSigBytes].bytes
932-
933939
unpickler.unpickle(bytes, 0, clazz, staticModule, in.file.name)
940+
loaders.platform.classFileInfoParsed(file, clazz, ScalaClass(this.currentClass.toString, ByteBuffer.wrap(bytes)))
934941
case None =>
935942
throw new RuntimeException("Scala class file does not contain Scala annotation")
936943
}
@@ -1245,6 +1252,7 @@ abstract class ClassfileParser {
12451252
in.skip(attrLen)
12461253
case tpnme.ScalaATTR =>
12471254
isScalaRaw = true
1255+
loaders.platform.classFileInfoParsed(file, clazz, ScalaRawClass(this.currentClass.toString))
12481256
case tpnme.InnerClassesATTR if !isScala =>
12491257
val entries = u2
12501258
for (i <- 0 until entries) {

0 commit comments

Comments
 (0)