KT-64719 K2 KAPT stub generation should fail on syntax errors
This commit is contained in:
committed by
Space Team
parent
bace053ea9
commit
894df8f641
+13
@@ -37,6 +37,7 @@ import java.util.zip.ZipOutputStream
|
|||||||
import kotlin.io.path.appendText
|
import kotlin.io.path.appendText
|
||||||
import kotlin.io.path.deleteExisting
|
import kotlin.io.path.deleteExisting
|
||||||
import kotlin.io.path.outputStream
|
import kotlin.io.path.outputStream
|
||||||
|
import kotlin.io.path.writeText
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
abstract class Kapt3BaseIT : KGPBaseTest() {
|
abstract class Kapt3BaseIT : KGPBaseTest() {
|
||||||
@@ -1448,4 +1449,16 @@ open class Kapt3IT : Kapt3BaseIT() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@DisplayName("KT-64719 KAPT stub generation should fail on files with syntax errors")
|
||||||
|
@GradleTest
|
||||||
|
fun testTopLevelSyntaxError(gradleVersion: GradleVersion) {
|
||||||
|
project("simple".withPrefix, gradleVersion) {
|
||||||
|
javaSourcesDir().resolve("invalid.kt").writeText("fun foo() { !!! }")
|
||||||
|
|
||||||
|
buildAndFail(":kaptGenerateStubsKotlin") {
|
||||||
|
assertOutputContains("invalid.kt:1:16 Expecting an element")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -133,15 +133,8 @@ private class Kapt4AnalysisHandlerExtension : FirAnalysisHandlerExtension() {
|
|||||||
reportOutputFiles: Boolean,
|
reportOutputFiles: Boolean,
|
||||||
overriddenMetadataVersion: BinaryVersion?
|
overriddenMetadataVersion: BinaryVersion?
|
||||||
) {
|
) {
|
||||||
fun onError(message: String) {
|
|
||||||
if(options[KaptFlag.STRICT]) {
|
|
||||||
logger.error(message)
|
|
||||||
} else {
|
|
||||||
logger.warn(message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val (stubGenerationTime, classesToStubs) = measureTimeMillis {
|
val (stubGenerationTime, classesToStubs) = measureTimeMillis {
|
||||||
generateStubs(module, files, options, ::onError, overriddenMetadataVersion)
|
generateStubs(module, files, options, logger, overriddenMetadataVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info { "Java stub generation took $stubGenerationTime ms" }
|
logger.info { "Java stub generation took $stubGenerationTime ms" }
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.asJava.findFacadeClass
|
|||||||
import org.jetbrains.kotlin.asJava.toLightClass
|
import org.jetbrains.kotlin.asJava.toLightClass
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
import org.jetbrains.kotlin.config.LanguageVersion
|
import org.jetbrains.kotlin.config.LanguageVersion
|
||||||
|
import org.jetbrains.kotlin.diagnostics.PsiDiagnosticUtils.offsetToLineAndColumn
|
||||||
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
||||||
import org.jetbrains.kotlin.idea.references.KtReference
|
import org.jetbrains.kotlin.idea.references.KtReference
|
||||||
import org.jetbrains.kotlin.kapt3.base.KaptFlag
|
import org.jetbrains.kotlin.kapt3.base.KaptFlag
|
||||||
@@ -43,9 +44,10 @@ import org.jetbrains.kotlin.psi.psiUtil.parameterIndex
|
|||||||
import org.jetbrains.kotlin.resolve.calls.util.getCalleeExpressionIfAny
|
import org.jetbrains.kotlin.resolve.calls.util.getCalleeExpressionIfAny
|
||||||
import org.jetbrains.kotlin.utils.toMetadataVersion
|
import org.jetbrains.kotlin.utils.toMetadataVersion
|
||||||
import org.jetbrains.kotlin.kapt3.base.KaptOptions
|
import org.jetbrains.kotlin.kapt3.base.KaptOptions
|
||||||
import org.jetbrains.kotlin.kapt3.base.javac.kaptError
|
import org.jetbrains.kotlin.kapt3.base.util.KaptLogger
|
||||||
import org.jetbrains.kotlin.kapt3.stubs.MembersPositionComparator
|
import org.jetbrains.kotlin.kapt3.stubs.MembersPositionComparator
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.children
|
import org.jetbrains.kotlin.psi.psiUtil.children
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType
|
||||||
import org.jetbrains.kotlin.utils.Printer
|
import org.jetbrains.kotlin.utils.Printer
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@@ -53,13 +55,21 @@ internal fun generateStubs(
|
|||||||
module: KtSourceModule,
|
module: KtSourceModule,
|
||||||
files: List<PsiFile>,
|
files: List<PsiFile>,
|
||||||
options: KaptOptions,
|
options: KaptOptions,
|
||||||
onError: (messages: String) -> Unit,
|
logger: KaptLogger,
|
||||||
overriddenMetadataVersion: BinaryVersion? = null,
|
overriddenMetadataVersion: BinaryVersion? = null,
|
||||||
metadataRenderer: (Printer.(Metadata) -> Unit)? = null
|
metadataRenderer: (Printer.(Metadata) -> Unit)? = null
|
||||||
): Map<KtLightClass, KaptStub?> =
|
): Map<KtLightClass, KaptStub?> {
|
||||||
analyze(module) {
|
for (file in files) {
|
||||||
StubGenerator(files.filterIsInstance<KtFile>(), options, onError, metadataRenderer, overriddenMetadataVersion).generateStubs()
|
file.findDescendantOfType<PsiErrorElement>()?.let {
|
||||||
|
val pos = offsetToLineAndColumn(it.containingFile.viewProvider.document, it.textRange.startOffset)
|
||||||
|
logger.error("${file.virtualFile.path}:${pos.line}:${pos.column} ${it.errorDescription}")
|
||||||
|
return emptyMap()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return analyze(module) {
|
||||||
|
StubGenerator(files.filterIsInstance<KtFile>(), options, logger, metadataRenderer, overriddenMetadataVersion).generateStubs()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class KaptStub(val source: String, val kaptMetadata: ByteArray) {
|
class KaptStub(val source: String, val kaptMetadata: ByteArray) {
|
||||||
fun writeMetadata(forSource: File) {
|
fun writeMetadata(forSource: File) {
|
||||||
@@ -72,7 +82,7 @@ context(KtAnalysisSession)
|
|||||||
private class StubGenerator(
|
private class StubGenerator(
|
||||||
private val files: List<KtFile>,
|
private val files: List<KtFile>,
|
||||||
options: KaptOptions,
|
options: KaptOptions,
|
||||||
private val onError: (String) -> Unit,
|
private val logger: KaptLogger,
|
||||||
private val metadataRenderer: (Printer.(Metadata) -> Unit)? = null,
|
private val metadataRenderer: (Printer.(Metadata) -> Unit)? = null,
|
||||||
private val overriddenMetadataVersion: BinaryVersion? = null,
|
private val overriddenMetadataVersion: BinaryVersion? = null,
|
||||||
) {
|
) {
|
||||||
@@ -80,6 +90,7 @@ private class StubGenerator(
|
|||||||
private val stripMetadata = options[KaptFlag.STRIP_METADATA]
|
private val stripMetadata = options[KaptFlag.STRIP_METADATA]
|
||||||
private val keepKdocComments = options[KaptFlag.KEEP_KDOC_COMMENTS_IN_STUBS]
|
private val keepKdocComments = options[KaptFlag.KEEP_KDOC_COMMENTS_IN_STUBS]
|
||||||
private val dumpDefaultParameterValues = options[KaptFlag.DUMP_DEFAULT_PARAMETER_VALUES]
|
private val dumpDefaultParameterValues = options[KaptFlag.DUMP_DEFAULT_PARAMETER_VALUES]
|
||||||
|
private val onError = if (options[KaptFlag.STRICT]) logger::error else logger::warn
|
||||||
|
|
||||||
|
|
||||||
fun generateStubs(): Map<KtLightClass, KaptStub?> =
|
fun generateStubs(): Map<KtLightClass, KaptStub?> =
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClass
|
|||||||
import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoots
|
import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoots
|
||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||||
import org.jetbrains.kotlin.kapt3.base.KaptContext
|
import org.jetbrains.kotlin.kapt3.base.KaptContext
|
||||||
import org.jetbrains.kotlin.kapt3.base.KaptFlag
|
|
||||||
import org.jetbrains.kotlin.kapt3.base.KaptOptions
|
import org.jetbrains.kotlin.kapt3.base.KaptOptions
|
||||||
import org.jetbrains.kotlin.kapt3.base.javac.reportKaptError
|
import org.jetbrains.kotlin.kapt3.base.javac.reportKaptError
|
||||||
|
import org.jetbrains.kotlin.kapt3.base.util.KaptLogger
|
||||||
import org.jetbrains.kotlin.kapt3.base.util.WriterBackedKaptLogger
|
import org.jetbrains.kotlin.kapt3.base.util.WriterBackedKaptLogger
|
||||||
import org.jetbrains.kotlin.kapt3.test.KaptMessageCollectorProvider
|
import org.jetbrains.kotlin.kapt3.test.KaptMessageCollectorProvider
|
||||||
import org.jetbrains.kotlin.kapt3.test.kaptOptionsProvider
|
import org.jetbrains.kotlin.kapt3.test.kaptOptionsProvider
|
||||||
@@ -27,7 +27,9 @@ import org.jetbrains.kotlin.kotlinp.KotlinpSettings
|
|||||||
import org.jetbrains.kotlin.test.model.*
|
import org.jetbrains.kotlin.test.model.*
|
||||||
import org.jetbrains.kotlin.test.services.*
|
import org.jetbrains.kotlin.test.services.*
|
||||||
import org.jetbrains.kotlin.utils.Printer
|
import org.jetbrains.kotlin.utils.Printer
|
||||||
|
import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.io.PrintWriter
|
||||||
|
|
||||||
internal class Kapt4Facade(private val testServices: TestServices) :
|
internal class Kapt4Facade(private val testServices: TestServices) :
|
||||||
AbstractTestFacade<ResultingArtifact.Source, Kapt4ContextBinaryArtifact>() {
|
AbstractTestFacade<ResultingArtifact.Source, Kapt4ContextBinaryArtifact>() {
|
||||||
@@ -82,10 +84,34 @@ private fun run(
|
|||||||
withJdk = false,
|
withJdk = false,
|
||||||
WriterBackedKaptLogger(isVerbose = false),
|
WriterBackedKaptLogger(isVerbose = false),
|
||||||
)
|
)
|
||||||
val onError = { message: String ->
|
|
||||||
context.reportKaptError(*message.split("\n").toTypedArray())
|
val logger = object : KaptLogger {
|
||||||
|
override val errorWriter: PrintWriter
|
||||||
|
get() = shouldNotBeCalled()
|
||||||
|
override val infoWriter: PrintWriter
|
||||||
|
get() = shouldNotBeCalled()
|
||||||
|
override val isVerbose: Boolean
|
||||||
|
get() = shouldNotBeCalled()
|
||||||
|
override val warnWriter: PrintWriter
|
||||||
|
get() = shouldNotBeCalled()
|
||||||
|
|
||||||
|
override fun error(message: String) {
|
||||||
|
context.reportKaptError(*message.split("\n").toTypedArray())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun exception(e: Throwable) {
|
||||||
|
error(e.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun info(message: String) {
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun warn(message: String) {
|
||||||
|
error(message)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return context to generateStubs(module, files, options, onError, metadataRenderer = { renderMetadata(it) })
|
|
||||||
|
return context to generateStubs(module, files, options, logger, metadataRenderer = { renderMetadata(it) })
|
||||||
}
|
}
|
||||||
|
|
||||||
internal data class Kapt4ContextBinaryArtifact(
|
internal data class Kapt4ContextBinaryArtifact(
|
||||||
|
|||||||
Reference in New Issue
Block a user