From f19c0c3fb922a51574bb7255d028beceb3b8f147 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 19 Oct 2018 20:17:27 +0300 Subject: [PATCH] Minor: Fix inspection warnings in 'kotlin-annotation-processing' --- .idea/dictionaries/yan.xml | 2 + .../jetbrains/kotlin/kapt3/Kapt3Extension.kt | 143 ++++----- .../org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt | 109 ++++--- .../kotlin/kapt3/javac/KaptJavaFileObject.kt | 8 +- .../kotlin/kapt3/javac/KaptTreeMaker.kt | 5 + .../stubs/ClassFileToSourceStubConverter.kt | 271 +++++++++--------- .../kotlin/kapt3/stubs/ErrorTypeCorrector.kt | 94 +++--- .../kotlin/kapt3/stubs/KDocCommentKeeper.kt | 2 +- .../kapt3/stubs/KaptLineMappingCollector.kt | 4 +- .../kapt3/stubs/SignatureParserVisitor.kt | 71 ++--- .../kotlin/kapt3/stubs/parseParameters.kt | 13 +- .../util/MessageCollectorBackedKaptLogger.kt | 2 +- .../util/MessageCollectorBackedWriter.kt | 5 +- .../jetbrains/kotlin/kapt3/util/asmUtils.kt | 5 +- .../AbstractKotlinKapt3IntegrationTest.kt | 68 ++--- .../kapt3/test/AbstractKotlinKapt3Test.kt | 2 +- .../kapt3/test/KotlinKapt3IntegrationTests.kt | 54 ++-- 17 files changed, 454 insertions(+), 404 deletions(-) diff --git a/.idea/dictionaries/yan.xml b/.idea/dictionaries/yan.xml index 7d130d3e394..68e55508f60 100644 --- a/.idea/dictionaries/yan.xml +++ b/.idea/dictionaries/yan.xml @@ -8,6 +8,8 @@ parceler repl uast + unboxed + unmute \ No newline at end of file diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Extension.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Extension.kt index 07e48853f23..0249ca5b5e2 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Extension.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Extension.kt @@ -64,18 +64,18 @@ import javax.annotation.processing.Processor import com.sun.tools.javac.util.List as JavacList class ClasspathBasedKapt3Extension( - paths: KaptPaths, - options: Map, - javacOptions: Map, - annotationProcessorFqNames: List, - aptMode: AptMode, - val useLightAnalysis: Boolean, - correctErrorTypes: Boolean, - mapDiagnosticLocations: Boolean, - strictMode: Boolean, - pluginInitializedTime: Long, - logger: MessageCollectorBackedKaptLogger, - compilerConfiguration: CompilerConfiguration + paths: KaptPaths, + options: Map, + javacOptions: Map, + annotationProcessorFqNames: List, + aptMode: AptMode, + private val useLightAnalysis: Boolean, + correctErrorTypes: Boolean, + mapDiagnosticLocations: Boolean, + strictMode: Boolean, + pluginInitializedTime: Long, + logger: MessageCollectorBackedKaptLogger, + compilerConfiguration: CompilerConfiguration ) : AbstractKapt3Extension( paths, options, javacOptions, annotationProcessorFqNames, aptMode, pluginInitializedTime, logger, correctErrorTypes, mapDiagnosticLocations, strictMode, @@ -91,10 +91,10 @@ class ClasspathBasedKapt3Extension( } override fun analysisCompleted( - project: Project, - module: ModuleDescriptor, - bindingTrace: BindingTrace, - files: Collection + project: Project, + module: ModuleDescriptor, + bindingTrace: BindingTrace, + files: Collection ): AnalysisResult? { try { return super.analysisCompleted(project, module, bindingTrace, files) @@ -105,17 +105,17 @@ class ClasspathBasedKapt3Extension( } abstract class AbstractKapt3Extension( - val paths: KaptPaths, - val options: Map, - val javacOptions: Map, - val annotationProcessorFqNames: List, - val aptMode: AptMode, - val pluginInitializedTime: Long, - val logger: MessageCollectorBackedKaptLogger, - val correctErrorTypes: Boolean, - val mapDiagnosticLocations: Boolean, - val strictMode: Boolean, - val compilerConfiguration: CompilerConfiguration + val paths: KaptPaths, + private val options: Map, + private val javacOptions: Map, + val annotationProcessorFqNames: List, + private val aptMode: AptMode, + private val pluginInitializedTime: Long, + val logger: MessageCollectorBackedKaptLogger, + val correctErrorTypes: Boolean, + val mapDiagnosticLocations: Boolean, + val strictMode: Boolean, + val compilerConfiguration: CompilerConfiguration ) : PartialAnalysisHandlerExtension() { private var annotationProcessingComplete = false @@ -127,12 +127,12 @@ abstract class AbstractKapt3Extension( } override fun doAnalysis( - project: Project, - module: ModuleDescriptor, - projectContext: ProjectContext, - files: Collection, - bindingTrace: BindingTrace, - componentProvider: ComponentProvider + project: Project, + module: ModuleDescriptor, + projectContext: ProjectContext, + files: Collection, + bindingTrace: BindingTrace, + componentProvider: ComponentProvider ): AnalysisResult? { if (aptMode == APT_ONLY) { return AnalysisResult.EMPTY @@ -142,14 +142,14 @@ abstract class AbstractKapt3Extension( } override fun analysisCompleted( - project: Project, - module: ModuleDescriptor, - bindingTrace: BindingTrace, - files: Collection + project: Project, + module: ModuleDescriptor, + bindingTrace: BindingTrace, + files: Collection ): AnalysisResult? { if (setAnnotationProcessingComplete()) return null - fun doNotGenerateCode() = AnalysisResult.Companion.success(BindingContext.EMPTY, module, shouldGenerateCode = false) + fun doNotGenerateCode() = AnalysisResult.success(BindingContext.EMPTY, module, shouldGenerateCode = false) logger.info { "Initial analysis took ${System.currentTimeMillis() - pluginInitializedTime} ms" } @@ -201,10 +201,11 @@ abstract class AbstractKapt3Extension( doNotGenerateCode() } else { AnalysisResult.RetryWithAdditionalJavaRoots( - bindingTrace.bindingContext, - module, - listOf(paths.sourcesOutputDir), - addToEnvironment = true) + bindingTrace.bindingContext, + module, + listOf(paths.sourcesOutputDir), + addToEnvironment = true + ) } } @@ -222,24 +223,25 @@ abstract class AbstractKapt3Extension( } private fun contextForStubGeneration( - project: Project, - module: ModuleDescriptor, - bindingContext: BindingContext, - files: List + project: Project, + module: ModuleDescriptor, + bindingContext: BindingContext, + files: List ): KaptContextForStubGeneration { val builderFactory = OriginCollectingClassBuilderFactory(ClassBuilderMode.KAPT3) val targetId = TargetId( - name = compilerConfiguration[CommonConfigurationKeys.MODULE_NAME] ?: module.name.asString(), - type = "java-production") + name = compilerConfiguration[CommonConfigurationKeys.MODULE_NAME] ?: module.name.asString(), + type = "java-production" + ) val generationState = GenerationState.Builder( - project, - builderFactory, - module, - bindingContext, - files, - compilerConfiguration + project, + builderFactory, + module, + bindingContext, + files, + compilerConfiguration ).targetId(targetId).build() val (classFilesCompilationTime) = measureTimeMillis { @@ -294,29 +296,30 @@ abstract class AbstractKapt3Extension( } protected open fun saveIncrementalData( - kaptContext: KaptContextForStubGeneration, - messageCollector: MessageCollector, - converter: ClassFileToSourceStubConverter) { + kaptContext: KaptContextForStubGeneration, + messageCollector: MessageCollector, + converter: ClassFileToSourceStubConverter + ) { val incrementalDataOutputDir = paths.incrementalDataOutputDir ?: return val reportOutputFiles = kaptContext.generationState.configuration.getBoolean(CommonConfigurationKeys.REPORT_OUTPUT_FILES) kaptContext.generationState.factory.writeAll( - incrementalDataOutputDir, - if (!reportOutputFiles) null else fun(file: OutputFile, sources: List, output: File) { - val stubFileObject = converter.bindings[file.relativePath.substringBeforeLast(".class", missingDelimiterValue = "")] - if (stubFileObject != null) { - val stubFile = File(paths.stubsOutputDir, stubFileObject.name) - val lineMappingsFile = File(stubFile.parentFile, stubFile.nameWithoutExtension + KAPT_METADATA_EXTENSION) + incrementalDataOutputDir, + if (!reportOutputFiles) null else fun(file: OutputFile, sources: List, output: File) { + val stubFileObject = converter.bindings[file.relativePath.substringBeforeLast(".class", missingDelimiterValue = "")] + if (stubFileObject != null) { + val stubFile = File(paths.stubsOutputDir, stubFileObject.name) + val lineMappingsFile = File(stubFile.parentFile, stubFile.nameWithoutExtension + KAPT_METADATA_EXTENSION) - for (file in listOf(stubFile, lineMappingsFile)) { - if (file.exists()) { - messageCollector.report(OUTPUT, OutputMessageUtil.formatOutputMessage(sources, file)) - } + for (outputFile in listOf(stubFile, lineMappingsFile)) { + if (outputFile.exists()) { + messageCollector.report(OUTPUT, OutputMessageUtil.formatOutputMessage(sources, outputFile)) } } - - messageCollector.report(OUTPUT, OutputMessageUtil.formatOutputMessage(sources, output)) } + + messageCollector.report(OUTPUT, OutputMessageUtil.formatOutputMessage(sources, output)) + } ) } @@ -346,7 +349,7 @@ private class PrettyWithWorkarounds(private val context: Context, val out: Write } } -private inline fun measureTimeMillis(block: () -> T) : Pair { +private inline fun measureTimeMillis(block: () -> T): Pair { val start = System.currentTimeMillis() val result = block() return Pair(System.currentTimeMillis() - start, result) diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt index 0205d7c37a7..fcf69db048e 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/Kapt3Plugin.kt @@ -74,47 +74,47 @@ import java.util.* object Kapt3ConfigurationKeys { val SOURCE_OUTPUT_DIR: CompilerConfigurationKey = - CompilerConfigurationKey.create(SOURCE_OUTPUT_DIR_OPTION.description) + CompilerConfigurationKey.create(SOURCE_OUTPUT_DIR_OPTION.description) val CLASS_OUTPUT_DIR: CompilerConfigurationKey = - CompilerConfigurationKey.create(CLASS_OUTPUT_DIR_OPTION.description) + CompilerConfigurationKey.create(CLASS_OUTPUT_DIR_OPTION.description) val STUBS_OUTPUT_DIR: CompilerConfigurationKey = - CompilerConfigurationKey.create(STUBS_OUTPUT_DIR_OPTION.description) + CompilerConfigurationKey.create(STUBS_OUTPUT_DIR_OPTION.description) val INCREMENTAL_DATA_OUTPUT_DIR: CompilerConfigurationKey = - CompilerConfigurationKey.create(INCREMENTAL_DATA_OUTPUT_DIR_OPTION.description) + CompilerConfigurationKey.create(INCREMENTAL_DATA_OUTPUT_DIR_OPTION.description) val ANNOTATION_PROCESSOR_CLASSPATH: CompilerConfigurationKey> = - CompilerConfigurationKey.create>(ANNOTATION_PROCESSOR_CLASSPATH_OPTION.description) + CompilerConfigurationKey.create>(ANNOTATION_PROCESSOR_CLASSPATH_OPTION.description) val APT_OPTIONS: CompilerConfigurationKey = - CompilerConfigurationKey.create(APT_OPTIONS_OPTION.description) + CompilerConfigurationKey.create(APT_OPTIONS_OPTION.description) val JAVAC_CLI_OPTIONS: CompilerConfigurationKey = - CompilerConfigurationKey.create(JAVAC_CLI_OPTIONS_OPTION.description) + CompilerConfigurationKey.create(JAVAC_CLI_OPTIONS_OPTION.description) val ANNOTATION_PROCESSORS: CompilerConfigurationKey> = - CompilerConfigurationKey.create>(ANNOTATION_PROCESSORS_OPTION.description) + CompilerConfigurationKey.create>(ANNOTATION_PROCESSORS_OPTION.description) val VERBOSE_MODE: CompilerConfigurationKey = - CompilerConfigurationKey.create(VERBOSE_MODE_OPTION.description) + CompilerConfigurationKey.create(VERBOSE_MODE_OPTION.description) val INFO_AS_WARNINGS: CompilerConfigurationKey = - CompilerConfigurationKey.create(INFO_AS_WARNINGS_OPTION.description) + CompilerConfigurationKey.create(INFO_AS_WARNINGS_OPTION.description) @Deprecated("Use APT_MODE instead.") val APT_ONLY: CompilerConfigurationKey = - CompilerConfigurationKey.create(APT_ONLY_OPTION.description) + CompilerConfigurationKey.create(APT_ONLY_OPTION.description) val APT_MODE: CompilerConfigurationKey = - CompilerConfigurationKey.create(APT_MODE_OPTION.description) + CompilerConfigurationKey.create(APT_MODE_OPTION.description) val USE_LIGHT_ANALYSIS: CompilerConfigurationKey = - CompilerConfigurationKey.create(USE_LIGHT_ANALYSIS_OPTION.description) + CompilerConfigurationKey.create(USE_LIGHT_ANALYSIS_OPTION.description) val CORRECT_ERROR_TYPES: CompilerConfigurationKey = - CompilerConfigurationKey.create(CORRECT_ERROR_TYPES_OPTION.description) + CompilerConfigurationKey.create(CORRECT_ERROR_TYPES_OPTION.description) val MAP_DIAGNOSTIC_LOCATIONS: CompilerConfigurationKey = CompilerConfigurationKey.create(MAP_DIAGNOSTIC_LOCATIONS_OPTION.description) @@ -125,61 +125,81 @@ object Kapt3ConfigurationKeys { class Kapt3CommandLineProcessor : CommandLineProcessor { companion object { - val ANNOTATION_PROCESSING_COMPILER_PLUGIN_ID: String = "org.jetbrains.kotlin.kapt3" + const val ANNOTATION_PROCESSING_COMPILER_PLUGIN_ID: String = "org.jetbrains.kotlin.kapt3" val CONFIGURATION = CliOption("configuration", "", "Encoded configuration", required = false) val SOURCE_OUTPUT_DIR_OPTION: CliOption = - CliOption("sources", "", "Output path for the generated files", required = false) + CliOption("sources", "", "Output path for the generated files", required = false) val CLASS_OUTPUT_DIR_OPTION: CliOption = - CliOption("classes", "", "Output path for the class files", required = false) + CliOption("classes", "", "Output path for the class files", required = false) val STUBS_OUTPUT_DIR_OPTION: CliOption = - CliOption("stubs", "", "Output path for the Java stubs", required = false) + CliOption("stubs", "", "Output path for the Java stubs", required = false) val INCREMENTAL_DATA_OUTPUT_DIR_OPTION: CliOption = - CliOption("incrementalData", "", "Output path for the incremental data", required = false) + CliOption("incrementalData", "", "Output path for the incremental data", required = false) val ANNOTATION_PROCESSOR_CLASSPATH_OPTION: CliOption = - CliOption("apclasspath", "", "Annotation processor classpath", - required = false, allowMultipleOccurrences = true) + CliOption( + "apclasspath", "", "Annotation processor classpath", + required = false, allowMultipleOccurrences = true + ) val APT_OPTIONS_OPTION: CliOption = - CliOption("apoptions", "options map", "Encoded annotation processor options", - required = false, allowMultipleOccurrences = false) + CliOption( + "apoptions", "options map", "Encoded annotation processor options", + required = false, allowMultipleOccurrences = false + ) val JAVAC_CLI_OPTIONS_OPTION: CliOption = - CliOption("javacArguments", "javac CLI options map", "Encoded javac CLI options", - required = false, allowMultipleOccurrences = false) + CliOption( + "javacArguments", "javac CLI options map", "Encoded javac CLI options", + required = false, allowMultipleOccurrences = false + ) val ANNOTATION_PROCESSORS_OPTION: CliOption = - CliOption("processors", "", "Annotation processor qualified names", - required = false, allowMultipleOccurrences = true) + CliOption( + "processors", "", "Annotation processor qualified names", + required = false, allowMultipleOccurrences = true + ) val VERBOSE_MODE_OPTION: CliOption = - CliOption("verbose", "true | false", "Enable verbose output", required = false) + CliOption("verbose", "true | false", "Enable verbose output", required = false) val INFO_AS_WARNINGS_OPTION: CliOption = - CliOption("infoAsWarnings", "true | false", "Show information messages as warnings", required = false) + CliOption("infoAsWarnings", "true | false", "Show information messages as warnings", required = false) @Deprecated("Use APT_MODE_OPTION instead.") val APT_ONLY_OPTION: CliOption = - CliOption("aptOnly", "true | false", "Run only annotation processing, do not compile Kotlin files", required = false) + CliOption("aptOnly", "true | false", "Run only annotation processing, do not compile Kotlin files", required = false) val APT_MODE_OPTION: CliOption = - CliOption("aptMode", "apt | stubs | stubsAndApt | compile", - "Annotation processing mode: only apt, only stub generation, both, or with the subsequent compilation", - required = false) + CliOption( + "aptMode", "apt | stubs | stubsAndApt | compile", + "Annotation processing mode: only apt, only stub generation, both, or with the subsequent compilation", + required = false + ) val USE_LIGHT_ANALYSIS_OPTION: CliOption = - CliOption("useLightAnalysis", "true | false", "Do not analyze declaration bodies if can", required = false) + CliOption("useLightAnalysis", "true | false", "Do not analyze declaration bodies if can", required = false) val CORRECT_ERROR_TYPES_OPTION: CliOption = - CliOption("correctErrorTypes", "true | false", "Replace generated or error types with ones from the generated sources", required = false) + CliOption( + "correctErrorTypes", + "true | false", + "Replace generated or error types with ones from the generated sources", + required = false + ) val MAP_DIAGNOSTIC_LOCATIONS_OPTION: CliOption = - CliOption("mapDiagnosticLocations", "true | false", "Map diagnostic reported on kapt stubs to original locations in Kotlin sources", required = false) + CliOption( + "mapDiagnosticLocations", + "true | false", + "Map diagnostic reported on kapt stubs to original locations in Kotlin sources", + required = false + ) val STRICT_MODE_OPTION: CliOption = CliOption("strict", "true | false", "Show errors on incompatibilities during stub generation", required = false) @@ -188,10 +208,12 @@ class Kapt3CommandLineProcessor : CommandLineProcessor { override val pluginId: String = ANNOTATION_PROCESSING_COMPILER_PLUGIN_ID override val pluginOptions: Collection = - listOf(SOURCE_OUTPUT_DIR_OPTION, ANNOTATION_PROCESSOR_CLASSPATH_OPTION, APT_OPTIONS_OPTION, JAVAC_CLI_OPTIONS_OPTION, - CLASS_OUTPUT_DIR_OPTION, VERBOSE_MODE_OPTION, STUBS_OUTPUT_DIR_OPTION, APT_ONLY_OPTION, APT_MODE_OPTION, - USE_LIGHT_ANALYSIS_OPTION, CORRECT_ERROR_TYPES_OPTION, ANNOTATION_PROCESSORS_OPTION, INCREMENTAL_DATA_OUTPUT_DIR_OPTION, - CONFIGURATION, MAP_DIAGNOSTIC_LOCATIONS_OPTION, INFO_AS_WARNINGS_OPTION, STRICT_MODE_OPTION) + listOf( + SOURCE_OUTPUT_DIR_OPTION, ANNOTATION_PROCESSOR_CLASSPATH_OPTION, APT_OPTIONS_OPTION, JAVAC_CLI_OPTIONS_OPTION, + CLASS_OUTPUT_DIR_OPTION, VERBOSE_MODE_OPTION, STUBS_OUTPUT_DIR_OPTION, APT_ONLY_OPTION, APT_MODE_OPTION, + USE_LIGHT_ANALYSIS_OPTION, CORRECT_ERROR_TYPES_OPTION, ANNOTATION_PROCESSORS_OPTION, INCREMENTAL_DATA_OUTPUT_DIR_OPTION, + CONFIGURATION, MAP_DIAGNOSTIC_LOCATIONS_OPTION, INFO_AS_WARNINGS_OPTION, STRICT_MODE_OPTION + ) override fun processOption(option: CliOption, value: String, configuration: CompilerConfiguration) { when (option) { @@ -238,14 +260,13 @@ class Kapt3ComponentRegistrar : ComponentRegistrar { } override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { - val aptMode = AptMode.parse(configuration.get(Kapt3ConfigurationKeys.APT_MODE) ?: - configuration.get(Kapt3ConfigurationKeys.APT_ONLY)) + val aptMode = AptMode.parse(configuration.get(Kapt3ConfigurationKeys.APT_MODE) ?: configuration.get(Kapt3ConfigurationKeys.APT_ONLY)) val isVerbose = configuration.get(Kapt3ConfigurationKeys.VERBOSE_MODE) == "true" val infoAsWarnings = configuration.get(Kapt3ConfigurationKeys.INFO_AS_WARNINGS) == "true" val strictMode = configuration.get(Kapt3ConfigurationKeys.STRICT_MODE) == "true" val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) - ?: PrintingMessageCollector(System.err, MessageRenderer.PLAIN_FULL_PATHS, isVerbose) + ?: PrintingMessageCollector(System.err, MessageRenderer.PLAIN_FULL_PATHS, isVerbose) val logger = MessageCollectorBackedKaptLogger(isVerbose, infoAsWarnings, messageCollector) fun abortAnalysis() = AnalysisHandlerExtension.registerExtension(project, AbortAnalysisHandlerExtension()) @@ -365,7 +386,7 @@ class Kapt3ComponentRegistrar : ComponentRegistrar { bindingTrace: BindingTrace, files: Collection ): AnalysisResult? { - return AnalysisResult.Companion.success(bindingTrace.bindingContext, module, shouldGenerateCode = false) + return AnalysisResult.success(bindingTrace.bindingContext, module, shouldGenerateCode = false) } } } diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/javac/KaptJavaFileObject.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/javac/KaptJavaFileObject.kt index 01b966e65fd..382aec753ce 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/javac/KaptJavaFileObject.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/javac/KaptJavaFileObject.kt @@ -25,10 +25,10 @@ import javax.lang.model.element.NestingKind import javax.tools.JavaFileObject class KaptJavaFileObject( - val compilationUnit: JCTree.JCCompilationUnit, - val clazz: JCTree.JCClassDecl, - val file: File? = null, - val timestamp: Long = System.currentTimeMillis() + val compilationUnit: JCTree.JCCompilationUnit, + val clazz: JCTree.JCClassDecl, + val file: File? = null, + val timestamp: Long = System.currentTimeMillis() ) : JavaFileObject { override fun toString() = "${javaClass.simpleName}[$name]" diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/javac/KaptTreeMaker.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/javac/KaptTreeMaker.kt index b13e6b1f4e6..183929de73a 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/javac/KaptTreeMaker.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/javac/KaptTreeMaker.kt @@ -38,6 +38,7 @@ class KaptTreeMaker(context: Context, kaptContext: KaptContextForStubGeneration) val nameTable: Name.Table = Names.instance(context).table + @Suppress("FunctionName") fun Type(type: Type): JCTree.JCExpression { convertBuiltinType(type)?.let { return it } if (type.sort == ARRAY) { @@ -46,14 +47,17 @@ class KaptTreeMaker(context: Context, kaptContext: KaptContextForStubGeneration) return FqName(type.internalName) } + @Suppress("FunctionName") fun FqName(internalOrFqName: String): JCTree.JCExpression { val path = getQualifiedName(internalOrFqName).convertSpecialFqName().split('.') assert(path.isNotEmpty()) return FqName(path) } + @Suppress("FunctionName") fun FqName(fqName: FqName) = FqName(fqName.pathSegments().map { it.asString() }) + @Suppress("FunctionName") private fun FqName(path: List): JCTree.JCExpression { if (path.size == 1) return SimpleName(path.single()) @@ -162,6 +166,7 @@ class KaptTreeMaker(context: Context, kaptContext: KaptContextForStubGeneration) return TypeIdent(typeTag) } + @Suppress("FunctionName") fun SimpleName(name: String): JCTree.JCExpression = Ident(name(name)) fun name(name: String): Name = nameTable.fromString(name) diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt index 65a35b43c7a..58a279f644a 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt @@ -63,31 +63,31 @@ import javax.lang.model.element.ElementKind import com.sun.tools.javac.util.List as JavacList class ClassFileToSourceStubConverter( - val kaptContext: KaptContextForStubGeneration, - val generateNonExistentClass: Boolean, - val correctErrorTypes: Boolean, - val strictMode: Boolean + val kaptContext: KaptContextForStubGeneration, + val generateNonExistentClass: Boolean, + val correctErrorTypes: Boolean, + val strictMode: Boolean ) { private companion object { - private val VISIBILITY_MODIFIERS = (Opcodes.ACC_PUBLIC or Opcodes.ACC_PRIVATE or Opcodes.ACC_PROTECTED).toLong() - private val MODALITY_MODIFIERS = (Opcodes.ACC_FINAL or Opcodes.ACC_ABSTRACT).toLong() + private const val VISIBILITY_MODIFIERS = (Opcodes.ACC_PUBLIC or Opcodes.ACC_PRIVATE or Opcodes.ACC_PROTECTED).toLong() + private const val MODALITY_MODIFIERS = (Opcodes.ACC_FINAL or Opcodes.ACC_ABSTRACT).toLong() - private val CLASS_MODIFIERS = VISIBILITY_MODIFIERS or MODALITY_MODIFIERS or + private const val CLASS_MODIFIERS = VISIBILITY_MODIFIERS or MODALITY_MODIFIERS or (Opcodes.ACC_DEPRECATED or Opcodes.ACC_INTERFACE or Opcodes.ACC_ANNOTATION or Opcodes.ACC_ENUM or Opcodes.ACC_STATIC).toLong() - private val METHOD_MODIFIERS = VISIBILITY_MODIFIERS or MODALITY_MODIFIERS or + private const val METHOD_MODIFIERS = VISIBILITY_MODIFIERS or MODALITY_MODIFIERS or (Opcodes.ACC_DEPRECATED or Opcodes.ACC_SYNCHRONIZED or Opcodes.ACC_NATIVE or Opcodes.ACC_STATIC or Opcodes.ACC_STRICT).toLong() - private val FIELD_MODIFIERS = VISIBILITY_MODIFIERS or MODALITY_MODIFIERS or + private const val FIELD_MODIFIERS = VISIBILITY_MODIFIERS or MODALITY_MODIFIERS or (Opcodes.ACC_VOLATILE or Opcodes.ACC_TRANSIENT or Opcodes.ACC_ENUM or Opcodes.ACC_STATIC).toLong() - private val PARAMETER_MODIFIERS = FIELD_MODIFIERS or Flags.PARAMETER or Flags.VARARGS or Opcodes.ACC_FINAL.toLong() + private const val PARAMETER_MODIFIERS = FIELD_MODIFIERS or Flags.PARAMETER or Flags.VARARGS or Opcodes.ACC_FINAL.toLong() private val BLACKLISTED_ANNOTATIONS = listOf( - "java.lang.Deprecated", "kotlin.Deprecated", // Deprecated annotations - "java.lang.Synthetic", - "synthetic.kotlin.jvm.GeneratedByJvmOverloads", // kapt3-related annotation for marking JvmOverloads-generated methods - "kotlin.jvm." // Kotlin annotations from runtime + "java.lang.Deprecated", "kotlin.Deprecated", // Deprecated annotations + "java.lang.Synthetic", + "synthetic.kotlin.jvm.GeneratedByJvmOverloads", // kapt3-related annotation for marking JvmOverloads-generated methods + "kotlin.jvm." // Kotlin annotations from runtime ) private val NON_EXISTENT_CLASS_NAME = FqName("error.NonExistentClass") @@ -95,8 +95,8 @@ class ClassFileToSourceStubConverter( private val JAVA_KEYWORD_FILTER_REGEX = "[a-z]+".toRegex() private val JAVA_KEYWORDS = Tokens.TokenKind.values() - .filter { JAVA_KEYWORD_FILTER_REGEX.matches(it.toString().orEmpty()) } - .mapTo(hashSetOf(), Any::toString) + .filter { JAVA_KEYWORD_FILTER_REGEX.matches(it.toString().orEmpty()) } + .mapTo(hashSetOf(), Any::toString) } private val _bindings = mutableMapOf() @@ -130,12 +130,13 @@ class ClassFileToSourceStubConverter( private fun generateNonExistentClass(): JCCompilationUnit { val nonExistentClass = treeMaker.ClassDef( - treeMaker.Modifiers((Flags.PUBLIC or Flags.FINAL).toLong()), - treeMaker.name(NON_EXISTENT_CLASS_NAME.shortName().asString()), - JavacList.nil(), - null, - JavacList.nil(), - JavacList.nil()) + treeMaker.Modifiers((Flags.PUBLIC or Flags.FINAL).toLong()), + treeMaker.name(NON_EXISTENT_CLASS_NAME.shortName().asString()), + JavacList.nil(), + null, + JavacList.nil(), + JavacList.nil() + ) val topLevel = treeMaker.TopLevelJava9Aware(treeMaker.FqName(NON_EXISTENT_CLASS_NAME.parent()), JavacList.of(nonExistentClass)) @@ -145,7 +146,7 @@ class ClassFileToSourceStubConverter( return topLevel } - class KaptStub(val file: JCCompilationUnit, val kaptMetadata: ByteArray? = null) { + class KaptStub(val file: JCCompilationUnit, private val kaptMetadata: ByteArray? = null) { fun writeMetadataIfNeeded(forSource: File) { if (kaptMetadata == null) { return @@ -166,7 +167,7 @@ class ClassFileToSourceStubConverter( val descriptor = origin.descriptor ?: return null // Nested classes will be processed during the outer classes conversion - if ((descriptor as? ClassDescriptor)?.isNested ?: false) return null + if ((descriptor as? ClassDescriptor)?.isNested == true) return null val lineMappings = KaptLineMappingCollector(kaptContext) @@ -245,7 +246,7 @@ class ClassFileToSourceStubConverter( val shortName = importedFqName.shortName() if (shortName.asString() == classDeclaration.simpleName.toString()) continue - val importedReference = resolveImportReference@ run { + val importedReference = /* resolveImportReference */ run { val referenceExpression = getReferenceExpression(importDirective.importedReference) ?: return@run null val bindingContext = kaptContext.bindingContext @@ -283,10 +284,10 @@ class ClassFileToSourceStubConverter( * Returns false for the inner classes or if the origin for the class was not found. */ private fun convertClass( - clazz: ClassNode, - lineMappings: KaptLineMappingCollector, - packageFqName: String, - isTopLevel: Boolean + clazz: ClassNode, + lineMappings: KaptLineMappingCollector, + packageFqName: String, + isTopLevel: Boolean ): JCClassDecl? { if (isSynthetic(clazz.access)) return null if (!checkIfValidTypeName(clazz, Type.getObjectType(clazz.name))) return null @@ -300,14 +301,16 @@ class ClassFileToSourceStubConverter( val isEnum = clazz.isEnum() val isAnnotation = clazz.isAnnotation() - val modifiers = convertModifiers(flags, - if (isEnum) ElementKind.ENUM else ElementKind.CLASS, - packageFqName, clazz.visibleAnnotations, clazz.invisibleAnnotations, descriptor.annotations) + val modifiers = convertModifiers( + flags, + if (isEnum) ElementKind.ENUM else ElementKind.CLASS, + packageFqName, clazz.visibleAnnotations, clazz.invisibleAnnotations, descriptor.annotations + ) val isDefaultImpls = clazz.name.endsWith("${descriptor.name.asString()}\$DefaultImpls") - && isPublic(clazz.access) && isFinal(clazz.access) - && descriptor is ClassDescriptor - && descriptor.kind == ClassKind.INTERFACE + && isPublic(clazz.access) && isFinal(clazz.access) + && descriptor is ClassDescriptor + && descriptor.kind == ClassKind.INTERFACE // DefaultImpls without any contents don't have INNERCLASS'es inside it (and inside the parent interface) if (isDefaultImpls && (isTopLevel || (clazz.fields.isNullOrEmpty() && clazz.methods.isNullOrEmpty()))) { @@ -357,12 +360,15 @@ class ClassFileToSourceStubConverter( val def = data.correspondingClass?.let { convertClass(it, lineMappings, packageFqName, false) } - convertField(data.field, clazz, lineMappings, packageFqName, treeMaker.NewClass( + convertField( + data.field, clazz, lineMappings, packageFqName, treeMaker.NewClass( /* enclosing = */ null, /* typeArgs = */ JavacList.nil(), /* clazz = */ treeMaker.Ident(treeMaker.name(data.field.name)), /* args = */ args, - /* def = */ def)) + /* def = */ def + ) + ) } val fields = mapJList(clazz.fields) { @@ -390,12 +396,13 @@ class ClassFileToSourceStubConverter( val superTypes = calculateSuperTypes(clazz, genericType) return treeMaker.ClassDef( - modifiers, - treeMaker.name(simpleName), - genericType.typeParameters, - superTypes.superClass, - superTypes.interfaces, - enumValues + fields + methods + nestedClasses).keepKdocComments(clazz) + modifiers, + treeMaker.name(simpleName), + genericType.typeParameters, + superTypes.superClass, + superTypes.interfaces, + enumValues + fields + methods + nestedClasses + ).keepKdocComments(clazz) } private class ClassSupertypes(val superClass: JCExpression?, val interfaces: JavacList) @@ -456,7 +463,7 @@ class ClassFileToSourceStubConverter( val (resolvedAsClasses, otherSuperTypes) = resolvedSuperTypes .partition { it.second?.isError == false - && (it.second?.constructor?.declarationDescriptor as? ClassDescriptor)?.kind == ClassKind.CLASS + && (it.second?.constructor?.declarationDescriptor as? ClassDescriptor)?.kind == ClassKind.CLASS } if (resolvedAsClasses.size > 1) { @@ -526,8 +533,8 @@ class ClassFileToSourceStubConverter( // Java forbids outer and inner class names to be the same. Check if the names are different private tailrec fun doesInnerClassNameConflictWithOuter( - clazz: ClassNode, - outerClass: ClassNode? = findContainingClassNode(clazz) + clazz: ClassNode, + outerClass: ClassNode? = findContainingClassNode(clazz) ): Boolean { if (outerClass == null) return false if (treeMaker.getSimpleName(clazz) == treeMaker.getSimpleName(outerClass)) return true @@ -559,11 +566,11 @@ class ClassFileToSourceStubConverter( } private fun convertField( - field: FieldNode, - containingClass: ClassNode, - lineMappings: KaptLineMappingCollector, - packageFqName: String, - explicitInitializer: JCExpression? = null + field: FieldNode, + containingClass: ClassNode, + lineMappings: KaptLineMappingCollector, + packageFqName: String, + explicitInitializer: JCExpression? = null ): JCVariableDecl? { if (isSynthetic(field.access) || isIgnored(field.invisibleAnnotations)) return null // not needed anymore @@ -606,8 +613,8 @@ class ClassFileToSourceStubConverter( val value = field.value val initializer = explicitInitializer - ?: convertValueOfPrimitiveTypeOrString(value) - ?: if (isFinal(field.access)) convertLiteralExpression(getDefaultValue(type)) else null + ?: convertValueOfPrimitiveTypeOrString(value) + ?: if (isFinal(field.access)) convertLiteralExpression(getDefaultValue(type)) else null lineMappings.registerField(containingClass, field) @@ -615,16 +622,16 @@ class ClassFileToSourceStubConverter( } private fun convertMethod( - method: MethodNode, - containingClass: ClassNode, - lineMappings: KaptLineMappingCollector, - packageFqName: String + method: MethodNode, + containingClass: ClassNode, + lineMappings: KaptLineMappingCollector, + packageFqName: String ): JCMethodDecl? { if (isIgnored(method.invisibleAnnotations)) return null val descriptor = kaptContext.origins[method]?.descriptor as? CallableDescriptor ?: return null val isAnnotationHolderForProperty = descriptor is PropertyDescriptor && isSynthetic(method.access) - && isStatic(method.access) && method.name.endsWith("\$annotations") + && isStatic(method.access) && method.name.endsWith("\$annotations") if (isSynthetic(method.access) && !isAnnotationHolderForProperty) return null @@ -641,11 +648,12 @@ class ClassFileToSourceStubConverter( if (!isValidIdentifier(name, canBeConstructor = isConstructor)) return null val modifiers = convertModifiers( - if (containingClass.isEnum() && isConstructor) - (method.access.toLong() and VISIBILITY_MODIFIERS.inv()) - else - method.access.toLong(), - ElementKind.METHOD, packageFqName, visibleAnnotations, method.invisibleAnnotations, descriptor.annotations) + if (containingClass.isEnum() && isConstructor) + (method.access.toLong() and VISIBILITY_MODIFIERS.inv()) + else + method.access.toLong(), + ElementKind.METHOD, packageFqName, visibleAnnotations, method.invisibleAnnotations, descriptor.annotations + ) val asmReturnType = Type.getReturnType(method.desc) val jcReturnType = if (isConstructor) null else treeMaker.Type(asmReturnType) @@ -665,14 +673,15 @@ class ClassFileToSourceStubConverter( val varargs = if (lastParameter && isArrayType && method.isVarargs()) Flags.VARARGS else 0L val modifiers = convertModifiers( - info.flags or varargs or Flags.PARAMETER, - ElementKind.PARAMETER, - packageFqName, - info.visibleAnnotations, - info.invisibleAnnotations, - Annotations.EMPTY /* TODO */) + info.flags or varargs or Flags.PARAMETER, + ElementKind.PARAMETER, + packageFqName, + info.visibleAnnotations, + info.invisibleAnnotations, + Annotations.EMPTY /* TODO */ + ) - val name = info.name.takeIf { isValidIdentifier(it) } ?: "p${index}_" + info.name.hashCode().ushr(1) + val name = info.name.takeIf { isValidIdentifier(it) } ?: ("p" + index + "_" + info.name.hashCode().ushr(1)) val type = treeMaker.Type(info.type) treeMaker.VarDef(modifiers, treeMaker.name(name), type, null) } @@ -680,8 +689,8 @@ class ClassFileToSourceStubConverter( val exceptionTypes = mapJList(method.exceptions) { treeMaker.FqName(it) } val valueParametersFromDescriptor = descriptor.valueParameters - val (genericSignature, returnType) = extractMethodSignatureTypes( - descriptor, exceptionTypes, jcReturnType, method, parameters, valueParametersFromDescriptor) + val (genericSignature, returnType) = + extractMethodSignatureTypes(descriptor, exceptionTypes, jcReturnType, method, parameters, valueParametersFromDescriptor) val defaultValue = method.annotationDefault?.let { convertLiteralExpression(it) } @@ -718,9 +727,9 @@ class ClassFileToSourceStubConverter( lineMappings.registerMethod(containingClass, method) return treeMaker.MethodDef( - modifiers, treeMaker.name(name), returnType, genericSignature.typeParameters, - genericSignature.parameterTypes, genericSignature.exceptionTypes, - body, defaultValue + modifiers, treeMaker.name(name), returnType, genericSignature.typeParameters, + genericSignature.parameterTypes, genericSignature.exceptionTypes, + body, defaultValue ).keepKdocComments(method).keepSignature(lineMappings, method) } @@ -730,36 +739,34 @@ class ClassFileToSourceStubConverter( } private fun extractMethodSignatureTypes( - descriptor: CallableDescriptor, - exceptionTypes: JavacList, - jcReturnType: JCExpression?, method: MethodNode, - parameters: JavacList, - valueParametersFromDescriptor: List + descriptor: CallableDescriptor, + exceptionTypes: JavacList, + jcReturnType: JCExpression?, method: MethodNode, + parameters: JavacList, + valueParametersFromDescriptor: List ): Pair { val genericSignature = signatureParser.parseMethodSignature( - method.signature, parameters, exceptionTypes, jcReturnType, - nonErrorParameterTypeProvider = { index, lazyType -> - if (descriptor is PropertySetterDescriptor && valueParametersFromDescriptor.size == 1 && index == 0) { - getNonErrorType(descriptor.correspondingProperty.returnType, METHOD_PARAMETER_TYPE, - ktTypeProvider = { - val setterOrigin = (kaptContext.origins[method]?.element as? KtCallableDeclaration) - ?.takeIf { it !is KtFunction } + method.signature, parameters, exceptionTypes, jcReturnType, + nonErrorParameterTypeProvider = { index, lazyType -> + if (descriptor is PropertySetterDescriptor && valueParametersFromDescriptor.size == 1 && index == 0) { + getNonErrorType(descriptor.correspondingProperty.returnType, METHOD_PARAMETER_TYPE, + ktTypeProvider = { + val setterOrigin = (kaptContext.origins[method]?.element as? KtCallableDeclaration) + ?.takeIf { it !is KtFunction } - setterOrigin?.typeReference - }, - ifNonError = { lazyType() }) - } - else if (descriptor is FunctionDescriptor && valueParametersFromDescriptor.size == parameters.size) { - getNonErrorType(valueParametersFromDescriptor[index].type, METHOD_PARAMETER_TYPE, - ktTypeProvider = { - (kaptContext.origins[method]?.element as? KtFunction)?.valueParameters?.get(index)?.typeReference - }, - ifNonError = { lazyType() }) - } - else { - lazyType() - } - }) + setterOrigin?.typeReference + }, + ifNonError = { lazyType() }) + } else if (descriptor is FunctionDescriptor && valueParametersFromDescriptor.size == parameters.size) { + getNonErrorType(valueParametersFromDescriptor[index].type, METHOD_PARAMETER_TYPE, + ktTypeProvider = { + (kaptContext.origins[method]?.element as? KtFunction)?.valueParameters?.get(index)?.typeReference + }, + ifNonError = { lazyType() }) + } else { + lazyType() + } + }) val returnType = getNonErrorType( descriptor.returnType, RETURN_TYPE, @@ -779,10 +786,10 @@ class ClassFileToSourceStubConverter( } private inline fun getNonErrorType( - type: KotlinType?, - kind: ErrorTypeCorrector.TypeKind, - ktTypeProvider: () -> KtTypeReference?, - ifNonError: () -> T + type: KotlinType?, + kind: ErrorTypeCorrector.TypeKind, + ktTypeProvider: () -> KtTypeReference?, + ifNonError: () -> T ): T { if (!correctErrorTypes) { return ifNonError() @@ -802,8 +809,8 @@ class ClassFileToSourceStubConverter( if (nonErrorType is JCFieldAccess) { val qualifier = nonErrorType.selected if (nonErrorType.name.toString() == NON_EXISTENT_CLASS_NAME.shortName().asString() - && qualifier is JCIdent - && qualifier.name.toString() == NON_EXISTENT_CLASS_NAME.parent().asString() + && qualifier is JCIdent + && qualifier.name.toString() == NON_EXISTENT_CLASS_NAME.parent().asString() ) { @Suppress("UNCHECKED_CAST") return treeMaker.FqName("java.lang.Object") as T @@ -834,25 +841,25 @@ class ClassFileToSourceStubConverter( @Suppress("NOTHING_TO_INLINE") private inline fun convertModifiers( - access: Int, - kind: ElementKind, - packageFqName: String, - visibleAnnotations: List?, - invisibleAnnotations: List?, - descriptorAnnotations: Annotations + access: Int, + kind: ElementKind, + packageFqName: String, + visibleAnnotations: List?, + invisibleAnnotations: List?, + descriptorAnnotations: Annotations ): JCModifiers = convertModifiers(access.toLong(), kind, packageFqName, visibleAnnotations, invisibleAnnotations, descriptorAnnotations) private fun convertModifiers( - access: Long, - kind: ElementKind, - packageFqName: String, - visibleAnnotations: List?, - invisibleAnnotations: List?, - descriptorAnnotations: Annotations + access: Long, + kind: ElementKind, + packageFqName: String, + visibleAnnotations: List?, + invisibleAnnotations: List?, + descriptorAnnotations: Annotations ): JCModifiers { - fun convertAndAdd(list: JavacList, anno: AnnotationNode): JavacList { - val annotationDescriptor = descriptorAnnotations.singleOrNull { checkIfAnnotationValueMatches(anno, AnnotationValue(it)) } - val annotationTree = convertAnnotation(anno, packageFqName, annotationDescriptor) ?: return list + fun convertAndAdd(list: JavacList, annotation: AnnotationNode): JavacList { + val annotationDescriptor = descriptorAnnotations.singleOrNull { checkIfAnnotationValueMatches(annotation, AnnotationValue(it)) } + val annotationTree = convertAnnotation(annotation, packageFqName, annotationDescriptor) ?: return list return list.prepend(annotationTree) } @@ -871,10 +878,10 @@ class ClassFileToSourceStubConverter( } private fun convertAnnotation( - annotation: AnnotationNode, - packageFqName: String? = "", - annotationDescriptor: AnnotationDescriptor? = null, - filtered: Boolean = true + annotation: AnnotationNode, + packageFqName: String? = "", + annotationDescriptor: AnnotationDescriptor? = null, + filtered: Boolean = true ): JCAnnotation? { val annotationType = Type.getType(annotation.desc) val fqName = treeMaker.getQualifiedName(annotationType) @@ -885,9 +892,9 @@ class ClassFileToSourceStubConverter( val ktAnnotation = (annotationDescriptor?.source as? PsiSourceElement)?.psi as? KtAnnotationEntry val argMapping = ktAnnotation?.calleeExpression - ?.getResolvedCall(kaptContext.bindingContext)?.valueArguments - ?.mapKeys { it.key.name.asString() } - ?: emptyMap() + ?.getResolvedCall(kaptContext.bindingContext)?.valueArguments + ?.mapKeys { it.key.name.asString() } + ?: emptyMap() val useSimpleName = '.' in fqName && fqName.substringBeforeLast('.', "") == packageFqName @@ -922,7 +929,7 @@ class ClassFileToSourceStubConverter( val args = value?.arguments?.mapNotNull { it.getArgumentExpression() } ?: emptyList() val singleArg = args.singleOrNull() - if (constantValue.isOfPrimiviteType()) { + if (constantValue.isOfPrimitiveType()) { // Do not inline primitive constants tryParseReferenceToIntConstant(singleArg)?.let { return it } } @@ -1115,7 +1122,7 @@ class ClassFileToSourceStubConverter( } } -private fun Any?.isOfPrimiviteType(): Boolean = when(this) { +private fun Any?.isOfPrimitiveType(): Boolean = when (this) { is Boolean, is Byte, is Int, is Long, is Short, is Char, is Float, is Double -> true else -> false } diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ErrorTypeCorrector.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ErrorTypeCorrector.kt index 2a8ad05addf..c4fdaf190e8 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ErrorTypeCorrector.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ErrorTypeCorrector.kt @@ -37,9 +37,9 @@ import org.jetbrains.kotlin.types.* private typealias SubstitutionMap = Map> class ErrorTypeCorrector( - private val converter: ClassFileToSourceStubConverter, - private val typeKind: TypeKind, - file: KtFile + private val converter: ClassFileToSourceStubConverter, + private val typeKind: TypeKind, + file: KtFile ) { private val defaultType = converter.treeMaker.FqName(Object::class.java.name) @@ -54,7 +54,7 @@ class ErrorTypeCorrector( val importedFqName = importDirective.importedFqName ?: continue val importedReference = getReferenceExpression(importDirective.importedReference) - ?.let { bindingContext[BindingContext.REFERENCE_TARGET, it] } + ?.let { bindingContext[BindingContext.REFERENCE_TARGET, it] } if (importedReference is CallableDescriptor) continue @@ -90,40 +90,47 @@ class ErrorTypeCorrector( val baseExpression: JCTree.JCExpression - if (target is TypeAliasDescriptor) { - val typeAlias = target.source.getPsi() as? KtTypeAlias - val actualType = typeAlias?.getTypeReference() ?: return convert(target.expandedType) - return convert(actualType, typeAlias.getSubstitutions(type)) - } else if (target is ClassConstructorDescriptor) { - val asmType = converter.kaptContext.generationState.typeMapper - .mapType(target.constructedClass.defaultType, null, TypeMappingMode.GENERIC_ARGUMENT) - - baseExpression = converter.treeMaker.Type(asmType) - } else if (target is ClassDescriptor) { - // We only get here if some type were an error type. In other words, 'type' is either an error type or its argument, - // so it's impossible it to be unboxed primitive. - val asmType = converter.kaptContext.generationState.typeMapper.mapType(target.defaultType, null, TypeMappingMode.GENERIC_ARGUMENT) - baseExpression = converter.treeMaker.Type(asmType) - } else { - val referencedName = type.referencedName ?: return defaultType - val qualifier = type.qualifier - - if (qualifier == null) { - if (referencedName in substitutions) { - val (typeParameter, projection) = substitutions.getValue(referencedName) - return convertTypeProjection(projection, typeParameter.variance, emptyMap()) - } - - aliasedImports[referencedName]?.let { return it } + when (target) { + is TypeAliasDescriptor -> { + val typeAlias = target.source.getPsi() as? KtTypeAlias + val actualType = typeAlias?.getTypeReference() ?: return convert(target.expandedType) + return convert(actualType, typeAlias.getSubstitutions(type)) } + is ClassConstructorDescriptor -> { + val asmType = converter.kaptContext.generationState.typeMapper + .mapType(target.constructedClass.defaultType, null, TypeMappingMode.GENERIC_ARGUMENT) - baseExpression = when { - qualifier != null -> { - val qualifierType = convertUserType(qualifier, substitutions) - if (qualifierType === defaultType) return defaultType // Do not allow to use 'defaultType' as a qualifier - treeMaker.Select(qualifierType, treeMaker.name(referencedName)) + baseExpression = converter.treeMaker.Type(asmType) + } + is ClassDescriptor -> { + // We only get here if some type were an error type. In other words, 'type' is either an error type or its argument, + // so it's impossible it to be unboxed primitive. + val asmType = converter.kaptContext.generationState.typeMapper + .mapType(target.defaultType, null, TypeMappingMode.GENERIC_ARGUMENT) + + baseExpression = converter.treeMaker.Type(asmType) + } + else -> { + val referencedName = type.referencedName ?: return defaultType + val qualifier = type.qualifier + + if (qualifier == null) { + if (referencedName in substitutions) { + val (typeParameter, projection) = substitutions.getValue(referencedName) + return convertTypeProjection(projection, typeParameter.variance, emptyMap()) + } + + aliasedImports[referencedName]?.let { return it } + } + + baseExpression = when { + qualifier != null -> { + val qualifierType = convertUserType(qualifier, substitutions) + if (qualifierType === defaultType) return defaultType // Do not allow to use 'defaultType' as a qualifier + treeMaker.Select(qualifierType, treeMaker.name(referencedName)) + } + else -> treeMaker.SimpleName(referencedName) } - else -> treeMaker.SimpleName(referencedName) } } @@ -147,8 +154,7 @@ class ErrorTypeCorrector( val variance = if (typeArgument != null && typeParameter != null) { KotlinTypeMapper.getVarianceForWildcard(typeParameter, typeArgument, typeMappingMode) - } - else { + } else { null } @@ -157,9 +163,9 @@ class ErrorTypeCorrector( } private fun convertTypeProjection( - projection: KtTypeProjection, - variance: Variance?, - substitutions: SubstitutionMap + projection: KtTypeProjection, + variance: Variance?, + substitutions: SubstitutionMap ): JCTree.JCExpression { fun unbounded() = treeMaker.Wildcard(treeMaker.TypeBoundKind(BoundKind.UNBOUND), null) @@ -183,10 +189,6 @@ class ErrorTypeCorrector( } } - private fun convertTypeProjection() { - - } - private fun convertFunctionType(type: KtFunctionType, substitutions: SubstitutionMap): JCTree.JCExpression { val receiverType = type.receiverTypeReference var parameterTypes = mapJList(type.parameters) { convert(it.typeReference, substitutions) } @@ -207,8 +209,8 @@ class ErrorTypeCorrector( if (typeParameters.size != arguments.size) { val kaptContext = converter.kaptContext - kaptContext.compiler.log.report( - kaptContext.kaptError("${typeParameters.size} parameters are expected but ${arguments.size} passed")) + val error = kaptContext.kaptError("${typeParameters.size} parameters are expected but ${arguments.size} passed") + kaptContext.compiler.log.report(error) return emptyMap() } diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/KDocCommentKeeper.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/KDocCommentKeeper.kt index 63c7e86c7f1..5d7869a4739 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/KDocCommentKeeper.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/KDocCommentKeeper.kt @@ -87,7 +87,7 @@ class KDocCommentKeeper(private val kaptContext: KaptContextForStubGeneration) { && descriptor is PropertyAccessorDescriptor && kaptContext.bindingContext[BindingContext.BACKING_FIELD_REQUIRED, descriptor.correspondingProperty] == true ) { - // Do not place the smae documentation on backing field and property accessors + // Do not place documentation on backing field and property accessors return } diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/KaptLineMappingCollector.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/KaptLineMappingCollector.kt index 00e7880fa5e..d91e7a7fc53 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/KaptLineMappingCollector.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/KaptLineMappingCollector.kt @@ -47,8 +47,8 @@ class KaptLineMappingCollector(private val kaptContext: KaptContextForStubGenera register(field, clazz.name + "#" + field.name) } - fun registerSignature(decl: JCTree.JCMethodDecl, method: MethodNode) { - signatureInfo[decl.getJavacSignature()] = method.name + method.desc + fun registerSignature(declaration: JCTree.JCMethodDecl, method: MethodNode) { + signatureInfo[declaration.getJavacSignature()] = method.name + method.desc } private fun register(asmNode: Any, fqName: String) { diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/SignatureParserVisitor.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/SignatureParserVisitor.kt index ba85dc6ad80..c65b42b6fe0 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/SignatureParserVisitor.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/SignatureParserVisitor.kt @@ -92,24 +92,24 @@ private class SignatureNode(val kind: ElementKind, val name: String? = null) { val children: MutableList = SmartList() } -class SignatureParser(val treeMaker: KaptTreeMaker) { +class SignatureParser(private val treeMaker: KaptTreeMaker) { class ClassGenericSignature( - val typeParameters: JavacList, - val superClass: JCExpression, - val interfaces: JavacList + val typeParameters: JavacList, + val superClass: JCExpression, + val interfaces: JavacList ) class MethodGenericSignature( - val typeParameters: JavacList, - val parameterTypes: JavacList, - val exceptionTypes: JavacList, - val returnType: JCExpression? + val typeParameters: JavacList, + val parameterTypes: JavacList, + val exceptionTypes: JavacList, + val returnType: JCExpression? ) - + fun parseClassSignature( - signature: String?, - rawSuperClass: JCExpression, - rawInterfaces: JavacList + signature: String?, + rawSuperClass: JCExpression, + rawInterfaces: JavacList ): ClassGenericSignature { if (signature == null) { return ClassGenericSignature(JavacList.nil(), rawSuperClass, rawInterfaces) @@ -128,11 +128,11 @@ class SignatureParser(val treeMaker: KaptTreeMaker) { } fun parseMethodSignature( - signature: String?, - rawParameters: JavacList, - rawExceptionTypes: JavacList, - rawReturnType: JCExpression?, - nonErrorParameterTypeProvider: (Int, () -> JCExpression) -> JCExpression + signature: String?, + rawParameters: JavacList, + rawExceptionTypes: JavacList, + rawReturnType: JCExpression?, + nonErrorParameterTypeProvider: (Int, () -> JCExpression) -> JCExpression ): MethodGenericSignature { if (signature == null) { val parameters = mapJListIndexed(rawParameters) { index, it -> @@ -164,8 +164,8 @@ class SignatureParser(val treeMaker: KaptTreeMaker) { } fun parseFieldSignature( - signature: String?, - rawType: JCExpression + signature: String?, + rawType: JCExpression ): JCExpression { if (signature == null) return rawType @@ -208,8 +208,9 @@ class SignatureParser(val treeMaker: KaptTreeMaker) { for (innerClass in innerClasses) { expression = makeExpressionForClassTypeWithArguments( - treeMaker.Select(expression, treeMaker.name(innerClass.name!!)), - innerClass.children) + treeMaker.Select(expression, treeMaker.name(innerClass.name!!)), + innerClass.children + ) } expression @@ -273,12 +274,12 @@ private fun SignatureNode.split(l1: MutableList, e1: ElementKind, } private fun SignatureNode.split( - l1: MutableList, - e1: ElementKind, - l2: MutableList, - e2: ElementKind, - l3: MutableList, - e3: ElementKind + l1: MutableList, + e1: ElementKind, + l2: MutableList, + e2: ElementKind, + l3: MutableList, + e3: ElementKind ) { for (child in children) { val kind = child.kind @@ -292,14 +293,14 @@ private fun SignatureNode.split( } private fun SignatureNode.split( - l1: MutableList, - e1: ElementKind, - l2: MutableList, - e2: ElementKind, - l3: MutableList, - e3: ElementKind, - l4: MutableList, - e4: ElementKind + l1: MutableList, + e1: ElementKind, + l2: MutableList, + e2: ElementKind, + l3: MutableList, + e3: ElementKind, + l4: MutableList, + e4: ElementKind ) { for (child in children) { val kind = child.kind diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/parseParameters.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/parseParameters.kt index ad55448912a..0f0fe0c18a4 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/parseParameters.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/parseParameters.kt @@ -27,11 +27,12 @@ import org.jetbrains.org.objectweb.asm.tree.MethodNode import java.util.* internal class ParameterInfo( - val flags: Long, - val name: String, - val type: Type, - val visibleAnnotations: List?, - val invisibleAnnotations: List?) + val flags: Long, + val name: String, + val type: Type, + val visibleAnnotations: List?, + val invisibleAnnotations: List? +) internal fun MethodNode.getParametersInfo(containingClass: ClassNode): List { val localVariables = this.localVariables ?: emptyList() @@ -63,7 +64,7 @@ internal fun MethodNode.getParametersInfo(containingClass: ClassNode): List")) { diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/util/MessageCollectorBackedKaptLogger.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/util/MessageCollectorBackedKaptLogger.kt index a2b718e1cc4..7368ef31900 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/util/MessageCollectorBackedKaptLogger.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/util/MessageCollectorBackedKaptLogger.kt @@ -20,7 +20,7 @@ class MessageCollectorBackedKaptLogger( val messageCollector: MessageCollector = PrintingMessageCollector(System.err, MessageRenderer.PLAIN_FULL_PATHS, isVerbose) ) : KaptLogger { private companion object { - val PREFIX = "[kapt] " + const val PREFIX = "[kapt] " } override val errorWriter = makeWriter(ERROR) diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/util/MessageCollectorBackedWriter.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/util/MessageCollectorBackedWriter.kt index 21f08ab34d6..9842c42fe8b 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/util/MessageCollectorBackedWriter.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/util/MessageCollectorBackedWriter.kt @@ -21,7 +21,10 @@ import org.jetbrains.kotlin.cli.common.messages.GroupingMessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector import java.io.Writer -class MessageCollectorBackedWriter(val messageCollector: MessageCollector, val severity: CompilerMessageSeverity) : Writer() { +class MessageCollectorBackedWriter( + private val messageCollector: MessageCollector, + private val severity: CompilerMessageSeverity +) : Writer() { override fun write(buffer: CharArray, offset: Int, length: Int) { val message = String(buffer, offset, length).trim().trim('\n', '\r') if (message.isNotEmpty()) { diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/util/asmUtils.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/util/asmUtils.kt index b8ec6c35ee5..55f38c1d377 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/util/asmUtils.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/util/asmUtils.kt @@ -26,7 +26,6 @@ import org.jetbrains.org.objectweb.asm.tree.MethodNode internal fun isEnum(access: Int) = (access and Opcodes.ACC_ENUM) != 0 internal fun isPublic(access: Int) = (access and Opcodes.ACC_PUBLIC) != 0 internal fun isSynthetic(access: Int) = (access and Opcodes.ACC_SYNTHETIC) != 0 -internal fun isPrivate(access: Int) = (access and Opcodes.ACC_PRIVATE) != 0 internal fun isFinal(access: Int) = (access and Opcodes.ACC_FINAL) != 0 internal fun isStatic(access: Int) = (access and Opcodes.ACC_STATIC) != 0 internal fun isAbstract(access: Int) = (access and Opcodes.ACC_ABSTRACT) != 0 @@ -40,13 +39,13 @@ internal fun List?.isNullOrEmpty() = this == null || this.isEmpty() internal fun MethodNode.isJvmOverloadsGenerated(): Boolean { return (invisibleAnnotations?.any { it.isJvmOverloadsGenerated() } ?: false) - || (visibleAnnotations?.any { it.isJvmOverloadsGenerated() } ?: false) + || (visibleAnnotations?.any { it.isJvmOverloadsGenerated() } ?: false) } // Constant from DefaultParameterValueSubstitutor can't be used in Maven build because of ProGuard // rename this as well private val ANNOTATION_TYPE_DESCRIPTOR_FOR_JVMOVERLOADS_GENERATED_METHODS: String = - Type.getObjectType("synthetic/kotlin/jvm/GeneratedByJvmOverloads").descriptor + Type.getObjectType("synthetic/kotlin/jvm/GeneratedByJvmOverloads").descriptor private fun AnnotationNode.isJvmOverloadsGenerated(): Boolean { return this.desc == ANNOTATION_TYPE_DESCRIPTOR_FOR_JVMOVERLOADS_GENERATED_METHODS diff --git a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3IntegrationTest.kt b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3IntegrationTest.kt index 4405817468b..8dafa65e576 100644 --- a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3IntegrationTest.kt +++ b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3IntegrationTest.kt @@ -68,22 +68,22 @@ abstract class AbstractKotlinKapt3IntegrationTest : CodegenTestCase() { } protected open fun test( - name: String, - vararg supportedAnnotations: String, - options: Map = emptyMap(), - process: (Set, RoundEnvironment, ProcessingEnvironment) -> Unit + name: String, + vararg supportedAnnotations: String, + options: Map = emptyMap(), + process: (Set, RoundEnvironment, ProcessingEnvironment) -> Unit ) = testAP(true, name, options, process, *supportedAnnotations) - protected fun testAP( - shouldRun: Boolean, - name: String, - options: Map, - process: (Set, RoundEnvironment, ProcessingEnvironment) -> Unit, - vararg supportedAnnotations: String + private fun testAP( + shouldRun: Boolean, + name: String, + options: Map, + process: (Set, RoundEnvironment, ProcessingEnvironment) -> Unit, + vararg supportedAnnotations: String ) { this._options = options - val ktFileName = File(TEST_DATA_DIR, name + ".kt") + val ktFileName = File(TEST_DATA_DIR, "$name.kt") var started = false val processor = object : Processor { lateinit var processingEnv: ProcessingEnvironment @@ -103,10 +103,10 @@ abstract class AbstractKotlinKapt3IntegrationTest : CodegenTestCase() { } override fun getCompletions( - element: Element?, - annotation: AnnotationMirror?, - member: ExecutableElement?, - userText: String? + element: Element?, + annotation: AnnotationMirror?, + member: ExecutableElement?, + userText: String? ): Iterable? { return emptyList() } @@ -134,8 +134,10 @@ abstract class AbstractKotlinKapt3IntegrationTest : CodegenTestCase() { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.ALL, *javaSources) val project = myEnvironment.project - val kapt3Extension = Kapt3ExtensionForTests(project, processors, javaSources.toList(), sourceOutputDir, this.options, - stubsOutputDir = stubsDir, incrementalDataOutputDir = incrementalDataDir) + val kapt3Extension = Kapt3ExtensionForTests( + project, processors, javaSources.toList(), sourceOutputDir, this.options, + stubsOutputDir = stubsDir, incrementalDataOutputDir = incrementalDataDir + ) AnalysisHandlerExtension.registerExtension(project, kapt3Extension) @@ -146,9 +148,9 @@ abstract class AbstractKotlinKapt3IntegrationTest : CodegenTestCase() { GenerationUtils.compileFiles(myFiles.psiFiles, myEnvironment, classBuilderFactory).factory val actualRaw = kapt3Extension.savedStubs ?: error("Stubs were not saved") - val actual = StringUtil.convertLineSeparators(actualRaw.trim({ it <= ' ' })) - .trimTrailingWhitespacesAndAddNewlineAtEOF() - .let { AbstractClassFileToSourceStubConverterTest.removeMetadataAnnotationContents(it) } + val actual = StringUtil.convertLineSeparators(actualRaw.trim { it <= ' ' }) + .trimTrailingWhitespacesAndAddNewlineAtEOF() + .let { AbstractClassFileToSourceStubConverterTest.removeMetadataAnnotationContents(it) } KotlinTestUtils.assertEqualsToFile(txtFile, actual) } finally { @@ -158,13 +160,13 @@ abstract class AbstractKotlinKapt3IntegrationTest : CodegenTestCase() { } protected class Kapt3ExtensionForTests( - project: Project, - private val processors: List, - javaSourceRoots: List, - outputDir: File, - options: Map, - stubsOutputDir: File, - incrementalDataOutputDir: File + project: Project, + private val processors: List, + javaSourceRoots: List, + outputDir: File, + options: Map, + stubsOutputDir: File, + incrementalDataOutputDir: File ) : AbstractKapt3Extension( KaptPaths( project.basePath?.let(::File), @@ -186,17 +188,17 @@ abstract class AbstractKotlinKapt3IntegrationTest : CodegenTestCase() { } this.savedStubs = stubs - .map { it.file.prettyPrint(kaptContext.context) } - .sorted() - .joinToString(AbstractKotlinKapt3Test.FILE_SEPARATOR) + .map { it.file.prettyPrint(kaptContext.context) } + .sorted() + .joinToString(AbstractKotlinKapt3Test.FILE_SEPARATOR) super.saveStubs(kaptContext, stubs) } override fun saveIncrementalData( - kaptContext: KaptContextForStubGeneration, - messageCollector: MessageCollector, - converter: ClassFileToSourceStubConverter + kaptContext: KaptContextForStubGeneration, + messageCollector: MessageCollector, + converter: ClassFileToSourceStubConverter ) { if (this.savedBindings != null) { error("Bindings are already saved") diff --git a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt index ed08b97f326..ee201fb80e0 100644 --- a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt +++ b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/AbstractKotlinKapt3Test.kt @@ -208,7 +208,7 @@ abstract class AbstractKotlinKapt3Test : CodegenTestCase() { lines.filter { it.startsWith("// $name") }.toList() } - protected fun File.getOptionValues(name: String) = getRawOptionValues(name).map { it.drop("// ".length + name.length).trim() } + private fun File.getOptionValues(name: String) = getRawOptionValues(name).map { it.drop("// ".length + name.length).trim() } protected abstract fun check( kaptContext: KaptContextForStubGeneration, diff --git a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/KotlinKapt3IntegrationTests.kt b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/KotlinKapt3IntegrationTests.kt index 93d8ef88ff9..c3c417b42ef 100644 --- a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/KotlinKapt3IntegrationTests.kt +++ b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/KotlinKapt3IntegrationTests.kt @@ -31,15 +31,17 @@ import javax.lang.model.element.TypeElement class KotlinKapt3IntegrationTests : AbstractKotlinKapt3IntegrationTest(), Java9TestLauncher { override fun test( - name: String, - vararg supportedAnnotations: String, - options: Map, - process: (Set, RoundEnvironment, ProcessingEnvironment) -> Unit + name: String, + vararg supportedAnnotations: String, + options: Map, + process: (Set, RoundEnvironment, ProcessingEnvironment) -> Unit ) { super.test(name, *supportedAnnotations, options = options, process = process) - doTestWithJdk9(SingleJUnitTestRunner::class.java, - KotlinKapt3IntegrationTests::class.java.name + "#test" + getTestName(false)) + doTestWithJdk9( + SingleJUnitTestRunner::class.java, + KotlinKapt3IntegrationTests::class.java.name + "#test" + getTestName(false) + ) } @Test @@ -51,7 +53,7 @@ class KotlinKapt3IntegrationTests : AbstractKotlinKapt3IntegrationTest(), Java9T } @Test - fun testComments() = test("Simple", "test.MyAnnotation") { set, roundEnv, env -> + fun testComments() = test("Simple", "test.MyAnnotation") { _, _, env -> fun commentOf(className: String) = env.elementUtils.getDocComment(env.elementUtils.getTypeElement(className)) assert(commentOf("test.Simple") == " * KDoc comment.\n") @@ -73,19 +75,21 @@ class KotlinKapt3IntegrationTests : AbstractKotlinKapt3IntegrationTest(), Java9T } @Test - fun testStubsAndIncrementalDataForNestedClasses() = bindingsTest("NestedClasses") { stubsOutputDir, incrementalDataOutputDir, bindings -> - assert(File(stubsOutputDir, "test/Simple.java").exists()) - assert(!File(stubsOutputDir, "test/Simple/InnerClass.java").exists()) + fun testStubsAndIncrementalDataForNestedClasses() { + bindingsTest("NestedClasses") { stubsOutputDir, incrementalDataOutputDir, bindings -> + assert(File(stubsOutputDir, "test/Simple.java").exists()) + assert(!File(stubsOutputDir, "test/Simple/InnerClass.java").exists()) - assert(File(incrementalDataOutputDir, "test/Simple.class").exists()) - assert(File(incrementalDataOutputDir, "test/Simple\$Companion.class").exists()) - assert(File(incrementalDataOutputDir, "test/Simple\$InnerClass.class").exists()) - assert(File(incrementalDataOutputDir, "test/Simple\$NestedClass.class").exists()) - assert(File(incrementalDataOutputDir, "test/Simple\$NestedClass\$NestedNestedClass.class").exists()) + assert(File(incrementalDataOutputDir, "test/Simple.class").exists()) + assert(File(incrementalDataOutputDir, "test/Simple\$Companion.class").exists()) + assert(File(incrementalDataOutputDir, "test/Simple\$InnerClass.class").exists()) + assert(File(incrementalDataOutputDir, "test/Simple\$NestedClass.class").exists()) + assert(File(incrementalDataOutputDir, "test/Simple\$NestedClass\$NestedNestedClass.class").exists()) - assert(bindings.any { it.key == "test/Simple" && it.value.name == "test/Simple.java" }) - assert(bindings.none { it.key.contains("Companion") }) - assert(bindings.none { it.key.contains("InnerClass") }) + assert(bindings.any { it.key == "test/Simple" && it.value.name == "test/Simple.java" }) + assert(bindings.none { it.key.contains("Companion") }) + assert(bindings.none { it.key.contains("InnerClass") }) + } } private fun bindingsTest(name: String, test: (File, File, Map) -> Unit) { @@ -103,8 +107,8 @@ class KotlinKapt3IntegrationTests : AbstractKotlinKapt3IntegrationTest(), Java9T @Test fun testOptions() = test( - "Simple", "test.MyAnnotation", - options = mapOf("firstKey" to "firstValue", "secondKey" to "") + "Simple", "test.MyAnnotation", + options = mapOf("firstKey" to "firstValue", "secondKey" to "") ) { _, _, env -> val options = env.options assertEquals("firstValue", options["firstKey"]) @@ -117,11 +121,11 @@ class KotlinKapt3IntegrationTests : AbstractKotlinKapt3IntegrationTest(), Java9T val annotatedElements = roundEnv.getElementsAnnotatedWith(set.single()) assertEquals(1, annotatedElements.size) val constructors = annotatedElements - .first() - .enclosedElements - .filter { it.kind == ElementKind.CONSTRUCTOR } - .map { it as ExecutableElement } - .sortedBy { it.parameters.size } + .first() + .enclosedElements + .filter { it.kind == ElementKind.CONSTRUCTOR } + .map { it as ExecutableElement } + .sortedBy { it.parameters.size } assertEquals(2, constructors.size) assertEquals(2, constructors[0].parameters.size) assertEquals(3, constructors[1].parameters.size)