KT-31714: Close files after analysis in incremental KAPT

Artifact transform used to analyze classpath was not closing files, which
caused java.nio.file.FileSystemException. This commit fixes that, and all
input streams are closed after use.

Fixes: KT-31714
This commit is contained in:
Ivan Gavrilovic
2019-05-31 12:43:12 +01:00
committed by Yan Zhulanow
parent 695f202e46
commit 7a2332fe36
@@ -43,7 +43,9 @@ private fun visitDirectory(directory: File): ClasspathEntryData {
it.extension == "class" && !it.relativeTo(directory).toString().toLowerCase().startsWith("meta-inf")
}.forEach {
val internalName = it.relativeTo(directory).invariantSeparatorsPath.dropLast(".class".length)
analyzeInputStream(it.inputStream(), internalName, entryData)
BufferedInputStream(it.inputStream()).use { inputStream ->
analyzeInputStream(inputStream, internalName, entryData)
}
}
return entryData
@@ -58,7 +60,9 @@ private fun visitJar(jar: File): ClasspathEntryData {
val entry = entries.nextElement()
if (entry.name.endsWith("class") && !entry.name.toLowerCase().startsWith("meta-inf")) {
analyzeInputStream(zipFile.getInputStream(entry), entry.name.dropLast(".class".length), entryData)
BufferedInputStream(zipFile.getInputStream(entry)).use { inputStream ->
analyzeInputStream(inputStream, entry.name.dropLast(".class".length), entryData)
}
}
}
}
@@ -69,7 +73,7 @@ private fun visitJar(jar: File): ClasspathEntryData {
private fun analyzeInputStream(input: InputStream, internalName: String, entryData: ClasspathEntryData) {
val abiExtractor = ClassAbiExtractor(ClassWriter(0))
val typeDependenciesExtractor = ClassTypeExtractorVisitor(abiExtractor)
ClassReader(BufferedInputStream(input).readBytes()).accept(
ClassReader(input.readBytes()).accept(
typeDependenciesExtractor,
ClassReader.SKIP_CODE or ClassReader.SKIP_DEBUG or ClassReader.SKIP_FRAMES
)