Skip to content

Commit d1b94b0

Browse files
committed
[compiler, cbh] Create a custom xsbti.FileConverter when working with the in-memory source file for document compilation
#SCL-22338
1 parent 91b33be commit d1b94b0

File tree

1 file changed

+35
-19
lines changed

1 file changed

+35
-19
lines changed

scala/compile-server/src/org/jetbrains/jps/incremental/scala/local/IdeaIncrementalCompiler.scala

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package org.jetbrains.jps.incremental.scala.local
22

33
import org.jetbrains.jps.incremental.scala.Client
44
import org.jetbrains.plugins.scala.compiler.data.{CompilationData, DocumentCompilationData}
5-
import sbt.internal.inc.{AnalyzingCompiler, CompileOutput, PlainVirtualFileConverter, StringVirtualFile}
5+
import sbt.internal.inc.{AnalyzingCompiler, CompileOutput, StringVirtualFile}
66
import xsbti._
77
import xsbti.api.{ClassLike, DependencyContext}
88
import xsbti.compile.DependencyChanges
@@ -21,7 +21,8 @@ class IdeaIncrementalCompiler(scalac: AnalyzingCompiler)
2121
val progress = getProgress(client, compilationData.sources.size)
2222
val reporter = getReporter(client)
2323
val logger = getLogger(client)
24-
val clientCallback = new ClientCallback(client, compilationData.output.toPath)
24+
val converter = sbt.internal.inc.PlainVirtualFileConverter.converter
25+
val clientCallback = new ClientCallback(client, compilationData.output.toPath, converter)
2526

2627
val outputDirsCount = compilationData.outputGroups.map(_._2).distinct.size
2728
val out =
@@ -36,9 +37,9 @@ class IdeaIncrementalCompiler(scalac: AnalyzingCompiler)
3637

3738
try {
3839
scalac.compile(
39-
compilationData.sources.toArray.map(file => PlainVirtualFileConverter.converter.toVirtualFile(file.toPath)),
40-
compilationData.classpath.map(file => PlainVirtualFileConverter.converter.toVirtualFile(file.toPath)).toArray,
41-
PlainVirtualFileConverter.converter,
40+
compilationData.sources.toArray.map(file => converter.toVirtualFile(file.toPath)),
41+
compilationData.classpath.map(file => converter.toVirtualFile(file.toPath)).toArray,
42+
converter,
4243
emptyChanges,
4344
compilationData.scalaOptions.toArray,
4445
out,
@@ -58,19 +59,34 @@ class IdeaIncrementalCompiler(scalac: AnalyzingCompiler)
5859
def compileDocument(compilationData: DocumentCompilationData, client: Client): Unit = {
5960
val DocumentCompilationData(sourcePath, sourceContent, output, classpath, scalacOptions) = compilationData
6061

62+
val virtualFile = StringVirtualFile(sourcePath.toString, sourceContent)
63+
64+
val converter = new FileConverter {
65+
private val plain = sbt.internal.inc.PlainVirtualFileConverter.converter
66+
67+
override def toPath(ref: VirtualFileRef): Path = ref match {
68+
case `virtualFile` => sourcePath
69+
case vfr => plain.toPath(vfr)
70+
}
71+
72+
override def toVirtualFile(path: Path): VirtualFile = path match {
73+
case `sourcePath` => virtualFile
74+
case p => plain.toVirtualFile(p)
75+
}
76+
}
77+
6178
val progress = getProgress(client, 1)
6279
val reporter = getReporter(client)
6380
val logger = getLogger(client)
64-
val clientCallback = new ClientCallback(client, output)
81+
val clientCallback = new ClientCallback(client, output, converter)
6582

6683
val out = CompileOutput(output)
6784

68-
val virtualFile = StringVirtualFile(sourcePath.toString, sourceContent)
6985
try {
7086
scalac.compile(
7187
Array(virtualFile),
72-
classpath.toArray.map(PlainVirtualFileConverter.converter.toVirtualFile),
73-
PlainVirtualFileConverter.converter,
88+
classpath.toArray.map(converter.toVirtualFile),
89+
converter,
7490
emptyChanges,
7591
scalacOptions.toArray,
7692
out,
@@ -88,25 +104,25 @@ class IdeaIncrementalCompiler(scalac: AnalyzingCompiler)
88104

89105
}
90106

91-
private class ClientCallback(client: Client, output: Path) extends ClientCallbackBase {
107+
private class ClientCallback(client: Client, output: Path, converter: FileConverter) extends ClientCallbackBase(converter) {
92108

93109
override def generatedNonLocalClass(source: VirtualFileRef,
94110
classFile: Path,
95111
binaryClassName: String,
96112
srcClassName: String): Unit =
97-
client.generated(PlainVirtualFileConverter.converter.toPath(source).toFile, classFile.toFile, binaryClassName)
113+
client.generated(converter.toPath(source).toFile, classFile.toFile, binaryClassName)
98114

99115
override def generatedLocalClass(source: VirtualFileRef, classFile: Path): Unit =
100116
if (classFile.startsWith(output)) {
101117
val relative = output.relativize(classFile)
102118
val binaryClassName = relative.iterator().asScala.mkString(".").dropRight(".class".length)
103-
client.generated(PlainVirtualFileConverter.converter.toPath(source).toFile, classFile.toFile, binaryClassName)
119+
client.generated(converter.toPath(source).toFile, classFile.toFile, binaryClassName)
104120
}
105121

106122
override def enabled(): Boolean = false
107123
}
108124

109-
abstract class ClientCallbackBase extends xsbti.AnalysisCallback2 {
125+
abstract class ClientCallbackBase(converter: FileConverter) extends xsbti.AnalysisCallback2 {
110126

111127
override def isPickleJava: Boolean = false
112128

@@ -116,7 +132,7 @@ abstract class ClientCallbackBase extends xsbti.AnalysisCallback2 {
116132

117133
//noinspection ScalaDeprecation
118134
final override def api(sourceFile: File, classApi: ClassLike): Unit =
119-
api(PlainVirtualFileConverter.converter.toVirtualFile(sourceFile.toPath), classApi)
135+
api(converter.toVirtualFile(sourceFile.toPath), classApi)
120136

121137
override def binaryDependency(onBinaryEntry: Path,
122138
onBinaryClassName: String,
@@ -134,7 +150,7 @@ abstract class ClientCallbackBase extends xsbti.AnalysisCallback2 {
134150
onBinary.toPath,
135151
onBinaryClassName,
136152
fromClassName,
137-
PlainVirtualFileConverter.converter.toVirtualFile(fromSourceFile.toPath),
153+
converter.toVirtualFile(fromSourceFile.toPath),
138154
context
139155
)
140156

@@ -145,15 +161,15 @@ abstract class ClientCallbackBase extends xsbti.AnalysisCallback2 {
145161

146162
//noinspection ScalaDeprecation
147163
override def generatedLocalClass(source: File, classFile: File): Unit =
148-
generatedLocalClass(PlainVirtualFileConverter.converter.toVirtualFile(source.toPath), classFile.toPath)
164+
generatedLocalClass(converter.toVirtualFile(source.toPath), classFile.toPath)
149165

150166
//noinspection ScalaDeprecation
151167
final override def generatedNonLocalClass(source: File,
152168
classFile: File,
153169
binaryClassName: String,
154170
srcClassName: String): Unit =
155171
generatedNonLocalClass(
156-
PlainVirtualFileConverter.converter.toVirtualFile(source.toPath),
172+
converter.toVirtualFile(source.toPath),
157173
classFile.toPath,
158174
binaryClassName,
159175
srcClassName
@@ -177,7 +193,7 @@ abstract class ClientCallbackBase extends xsbti.AnalysisCallback2 {
177193

178194
//noinspection ScalaDeprecation
179195
final override def startSource(source: File): Unit =
180-
startSource(PlainVirtualFileConverter.converter.toVirtualFile(source.toPath))
196+
startSource(converter.toVirtualFile(source.toPath))
181197

182198
override def usedName(className: String, name: String, useScopes: util.EnumSet[xsbti.UseScope]): Unit = {}
183199

@@ -191,7 +207,7 @@ abstract class ClientCallbackBase extends xsbti.AnalysisCallback2 {
191207

192208
//noinspection ScalaDeprecation
193209
final override def mainClass(sourceFile: File, className: String): Unit =
194-
mainClass(PlainVirtualFileConverter.converter.toVirtualFile(sourceFile.toPath), className)
210+
mainClass(converter.toVirtualFile(sourceFile.toPath), className)
195211
}
196212

197213
private object emptyChanges extends DependencyChanges {

0 commit comments

Comments
 (0)