Kapt: Remove kapt1 from Kotlin compiler

This commit is contained in:
Yan Zhulanow
2018-05-17 00:06:11 +03:00
parent 662b79780d
commit 6e362f6734
79 changed files with 43 additions and 1308 deletions
@@ -31,7 +31,7 @@ public class ClassBuilderFactories {
@NotNull
@Override
public ClassBuilderMode getClassBuilderMode() {
return ClassBuilderMode.full(false);
return ClassBuilderMode.FULL;
}
@NotNull
@@ -56,21 +56,15 @@ public class ClassBuilderFactories {
}
};
public static ClassBuilderFactory TEST = new TestClassBuilderFactory(false);
public static ClassBuilderFactory TEST = new TestClassBuilderFactory();
public static ClassBuilderFactory TEST_WITH_SOURCE_RETENTION_ANNOTATIONS = new TestClassBuilderFactory(true);
public static class TestClassBuilderFactory implements ClassBuilderFactory {
private final boolean generateSourceRetentionAnnotations;
public TestClassBuilderFactory(boolean generateSourceRetentionAnnotations) {
this.generateSourceRetentionAnnotations = generateSourceRetentionAnnotations;
}
public TestClassBuilderFactory() {}
@NotNull
@Override
public ClassBuilderMode getClassBuilderMode() {
return ClassBuilderMode.full(generateSourceRetentionAnnotations);
return ClassBuilderMode.FULL;
}
@NotNull
@@ -101,37 +95,33 @@ public class ClassBuilderFactories {
}
@NotNull
public static ClassBuilderFactory binaries(boolean generateSourceRetentionAnnotations) {
return new ClassBuilderFactory() {
@NotNull
@Override
public ClassBuilderMode getClassBuilderMode() {
return ClassBuilderMode.full(generateSourceRetentionAnnotations);
}
public static ClassBuilderFactory BINARIES = new ClassBuilderFactory() {
@NotNull
@Override
public ClassBuilderMode getClassBuilderMode() {
return ClassBuilderMode.FULL;
}
@NotNull
@Override
public ClassBuilder newClassBuilder(@NotNull JvmDeclarationOrigin origin) {
return new AbstractClassBuilder.Concrete(new BinaryClassWriter());
}
@NotNull
@Override
public ClassBuilder newClassBuilder(@NotNull JvmDeclarationOrigin origin) {
return new AbstractClassBuilder.Concrete(new BinaryClassWriter());
}
@Override
public String asText(ClassBuilder builder) {
throw new UnsupportedOperationException("BINARIES generator asked for text");
}
@Override
public String asText(ClassBuilder builder) {
throw new UnsupportedOperationException("BINARIES generator asked for text");
}
@Override
public byte[] asBytes(ClassBuilder builder) {
ClassWriter visitor = (ClassWriter) builder.getVisitor();
return visitor.toByteArray();
}
@Override
public byte[] asBytes(ClassBuilder builder) {
ClassWriter visitor = (ClassWriter) builder.getVisitor();
return visitor.toByteArray();
}
@Override
public void close() {
}
};
}
@Override
public void close() {}
};
private ClassBuilderFactories() {
}
@@ -35,15 +35,11 @@ public class ClassBuilderMode {
this.generateSourceRetentionAnnotations = generateSourceRetentionAnnotations;
this.generateMultiFileFacadePartClasses = generateMultiFileFacadePartClasses;
}
public static ClassBuilderMode full(boolean generateSourceRetentionAnnotations) {
return generateSourceRetentionAnnotations ? KAPT : FULL;
}
/**
* Full function bodies
*/
private final static ClassBuilderMode FULL = new ClassBuilderMode(
public final static ClassBuilderMode FULL = new ClassBuilderMode(
/* bodies = */ true,
/* metadata = */ true,
/* sourceRetention = */ false,
@@ -57,15 +53,6 @@ public class ClassBuilderMode {
/* metadata = */ false,
/* sourceRetention = */ true,
/* generateMultiFileFacadePartClasses = */ false);
/**
* Function signatures + metadata (to support incremental compilation with kapt)
*/
public final static ClassBuilderMode KAPT = new ClassBuilderMode(
/* bodies = */ false,
/* metadata = */ true,
/* sourceRetention = */ true,
/* generateMultiFileFacadePartClasses = */ false);
/**
* Function signatures + metadata (to support incremental compilation with kapt)
@@ -196,7 +196,7 @@ public class JvmSerializerExtension extends SerializerExtension {
@Override
public void serializeErrorType(@NotNull KotlinType type, @NotNull ProtoBuf.Type.Builder builder) {
if (classBuilderMode == ClassBuilderMode.KAPT || classBuilderMode == ClassBuilderMode.KAPT3) {
if (classBuilderMode == ClassBuilderMode.KAPT3) {
builder.setClassName(stringTable.getStringIndex(TypeSignatureMappingKt.NON_EXISTENT_CLASS_NAME));
return;
}
+2 -5
View File
@@ -37,13 +37,10 @@ dependencies {
sourceSets {
"main" {
projectDefault()
java.srcDirs("../../plugins/annotation-collector/src",
"../builtins-serializer/src",
java.srcDirs("../builtins-serializer/src",
"../javac-wrapper/src")
}
"test" {
java.srcDirs("../../plugins/annotation-collector/test")
}
"test" { }
}
testsJar {}
@@ -16,17 +16,15 @@
package org.jetbrains.kotlin.cli.jvm
import org.jetbrains.kotlin.annotation.AnnotationCollectorCommandLineProcessor
import org.jetbrains.kotlin.annotation.AnnotationCollectorComponentRegistrar
import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
object BundledCompilerPlugins {
val componentRegistrars: List<ComponentRegistrar>
get() = listOf(AnnotationCollectorComponentRegistrar())
get() = emptyList()
val commandLineProcessors: List<CommandLineProcessor>
get() = listOf(AnnotationCollectorCommandLineProcessor())
get() = emptyList()
}
@@ -420,10 +420,9 @@ object KotlinToJVMBytecodeCompiler {
sourceFiles: List<KtFile>,
module: Module?
): GenerationState {
val isKapt2Enabled = environment.project.getUserData(IS_KAPT2_ENABLED_KEY) ?: false
val generationState = GenerationState.Builder(
environment.project,
ClassBuilderFactories.binaries(isKapt2Enabled),
ClassBuilderFactories.BINARIES,
result.moduleDescriptor,
result.bindingContext,
sourceFiles,
@@ -422,10 +422,9 @@ object KotlinToJVMBytecodeCompiler {
sourceFiles: List<KtFile>,
module: Module?
): GenerationState {
val isKapt2Enabled = environment.project.getUserData(IS_KAPT2_ENABLED_KEY) ?: false
val generationState = GenerationState.Builder(
environment.project,
ClassBuilderFactories.binaries(isKapt2Enabled),
ClassBuilderFactories.BINARIES,
result.moduleDescriptor,
result.bindingContext,
sourceFiles,
@@ -422,10 +422,9 @@ object KotlinToJVMBytecodeCompiler {
sourceFiles: List<KtFile>,
module: Module?
): GenerationState {
val isKapt2Enabled = environment.project.getUserData(IS_KAPT2_ENABLED_KEY) ?: false
val generationState = GenerationState.Builder(
environment.project,
ClassBuilderFactories.binaries(isKapt2Enabled),
ClassBuilderFactories.BINARIES,
result.moduleDescriptor,
result.bindingContext,
sourceFiles,
@@ -1,21 +0,0 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.cli.jvm.config
import com.intellij.openapi.util.Key
val IS_KAPT2_ENABLED_KEY = Key<Boolean>("IsKapt2EnabledKey")
@@ -89,7 +89,7 @@ open class GenericReplCompiler(disposable: Disposable,
val generationState = GenerationState.Builder(
psiFile.project,
ClassBuilderFactories.binaries(false),
ClassBuilderFactories.BINARIES,
compilerState.analyzerEngine.module,
compilerState.analyzerEngine.trace.bindingContext,
listOf(psiFile),
@@ -24,7 +24,7 @@ import java.io.File
abstract class AbstractKapt3BuilderModeBytecodeShapeTest : CodegenTestCase() {
private companion object {
var TEST_LIGHT_ANALYSIS: ClassBuilderFactory = object : ClassBuilderFactories.TestClassBuilderFactory(false) {
var TEST_LIGHT_ANALYSIS: ClassBuilderFactory = object : ClassBuilderFactories.TestClassBuilderFactory() {
override fun getClassBuilderMode() = ClassBuilderMode.KAPT3
}
}
@@ -21,7 +21,7 @@ import java.io.File
abstract class AbstractLightAnalysisModeTest : CodegenTestCase() {
private companion object {
var TEST_LIGHT_ANALYSIS: ClassBuilderFactory = object : ClassBuilderFactories.TestClassBuilderFactory(false) {
var TEST_LIGHT_ANALYSIS: ClassBuilderFactory = object : ClassBuilderFactories.TestClassBuilderFactory() {
override fun getClassBuilderMode() = ClassBuilderMode.LIGHT_ANALYSIS_FOR_TESTS
}
}
@@ -32,7 +32,6 @@ import org.jetbrains.kotlin.android.quickfix.AbstractAndroidQuickFixMultiFileTes
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidBoxTest
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidBytecodeShapeTest
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidSyntheticPropertyDescriptorTest
import org.jetbrains.kotlin.annotation.AbstractAnnotationProcessorBoxTest
import org.jetbrains.kotlin.checkers.AbstractJavaAgainstKotlinBinariesCheckerTest
import org.jetbrains.kotlin.checkers.AbstractJavaAgainstKotlinSourceCheckerTest
import org.jetbrains.kotlin.checkers.AbstractJsCheckerTest
@@ -1016,12 +1015,6 @@ fun main(args: Array<String>) {
}
}
testGroup("plugins/annotation-collector/test", "plugins/annotation-collector/testData") {
testClass<AbstractAnnotationProcessorBoxTest> {
model("collectToFile", recursive = false, extension = null)
}
}
testGroup("plugins/kapt3/kapt3-compiler/test", "plugins/kapt3/kapt3-compiler/testData") {
testClass<AbstractClassFileToSourceStubConverterTest> {
model("converter")
@@ -32,7 +32,6 @@ import org.jetbrains.kotlin.android.quickfix.AbstractAndroidQuickFixMultiFileTes
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidBoxTest
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidBytecodeShapeTest
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidSyntheticPropertyDescriptorTest
import org.jetbrains.kotlin.annotation.AbstractAnnotationProcessorBoxTest
import org.jetbrains.kotlin.checkers.AbstractJavaAgainstKotlinBinariesCheckerTest
import org.jetbrains.kotlin.checkers.AbstractJavaAgainstKotlinSourceCheckerTest
import org.jetbrains.kotlin.checkers.AbstractJsCheckerTest
@@ -1006,12 +1005,6 @@ fun main(args: Array<String>) {
}
}
testGroup("plugins/annotation-collector/test", "plugins/annotation-collector/testData") {
testClass<AbstractAnnotationProcessorBoxTest> {
model("collectToFile", recursive = false, extension = null)
}
}
testGroup("plugins/kapt3/kapt3-compiler/test", "plugins/kapt3/kapt3-compiler/testData") {
testClass<AbstractClassFileToSourceStubConverterTest> {
model("converter")
@@ -31,7 +31,6 @@ import org.jetbrains.kotlin.android.quickfix.AbstractAndroidQuickFixMultiFileTes
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidBoxTest
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidBytecodeShapeTest
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidSyntheticPropertyDescriptorTest
import org.jetbrains.kotlin.annotation.AbstractAnnotationProcessorBoxTest
import org.jetbrains.kotlin.checkers.AbstractJavaAgainstKotlinBinariesCheckerTest
import org.jetbrains.kotlin.checkers.AbstractJavaAgainstKotlinSourceCheckerTest
import org.jetbrains.kotlin.checkers.AbstractJsCheckerTest
@@ -1018,12 +1017,6 @@ fun main(args: Array<String>) {
}
}
testGroup("plugins/annotation-collector/test", "plugins/annotation-collector/testData") {
testClass<AbstractAnnotationProcessorBoxTest> {
model("collectToFile", recursive = false, extension = null)
}
}
testGroup("plugins/kapt3/kapt3-compiler/test", "plugins/kapt3/kapt3-compiler/testData") {
testClass<AbstractClassFileToSourceStubConverterTest> {
model("converter")
@@ -31,7 +31,6 @@ import org.jetbrains.kotlin.android.quickfix.AbstractAndroidQuickFixMultiFileTes
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidBoxTest
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidBytecodeShapeTest
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidSyntheticPropertyDescriptorTest
import org.jetbrains.kotlin.annotation.AbstractAnnotationProcessorBoxTest
import org.jetbrains.kotlin.checkers.AbstractJavaAgainstKotlinBinariesCheckerTest
import org.jetbrains.kotlin.checkers.AbstractJavaAgainstKotlinSourceCheckerTest
import org.jetbrains.kotlin.checkers.AbstractJsCheckerTest
@@ -1018,12 +1017,6 @@ fun main(args: Array<String>) {
}
}
testGroup("plugins/annotation-collector/test", "plugins/annotation-collector/testData") {
testClass<AbstractAnnotationProcessorBoxTest> {
model("collectToFile", recursive = false, extension = null)
}
}
testGroup("plugins/kapt3/kapt3-compiler/test", "plugins/kapt3/kapt3-compiler/testData") {
testClass<AbstractClassFileToSourceStubConverterTest> {
model("converter")
@@ -460,7 +460,7 @@ class KotlinEvaluator(val codeFragment: KtCodeFragment, val sourcePosition: Sour
val state = GenerationState.Builder(
fileForDebugger.project,
if (!DEBUG_MODE) ClassBuilderFactories.binaries(false) else ClassBuilderFactories.TEST,
if (!DEBUG_MODE) ClassBuilderFactories.BINARIES else ClassBuilderFactories.TEST,
moduleDescriptor,
bindingContext,
files,
@@ -112,7 +112,7 @@ class KtCompilingExecutor(file: ScratchFile) : ScratchExecutor(file) {
val state = GenerationState.Builder(
file.project,
ClassBuilderFactories.binaries(false),
ClassBuilderFactories.BINARIES,
resolutionFacade.moduleDescriptor,
bindingContext,
files,
@@ -174,7 +174,7 @@ class KJVMCompilerImpl : KJVMCompilerProxy {
val generationState = GenerationState.Builder(
psiFile.project,
ClassBuilderFactories.binaries(false),
ClassBuilderFactories.BINARIES,
analysisResult.moduleDescriptor,
analysisResult.bindingContext,
sourceFiles,
@@ -170,7 +170,7 @@ class ParcelableDeclarationChecker : DeclarationChecker {
val typeMapper = KotlinTypeMapper(
bindingContext,
ClassBuilderMode.full(false),
ClassBuilderMode.FULL,
IncompatibleClassTracker.DoNothing,
descriptor.module.name.asString(),
/* isJvm8Target */ false,
@@ -1,270 +0,0 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.annotation
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.ClassBuilder
import org.jetbrains.kotlin.codegen.ClassBuilderFactory
import org.jetbrains.kotlin.codegen.DelegatingClassBuilder
import org.jetbrains.kotlin.codegen.DelegatingClassBuilderFactory
import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
import org.jetbrains.org.objectweb.asm.*
import java.io.File
import java.io.IOException
import java.io.Writer
import java.util.regex.Pattern
import java.util.regex.PatternSyntaxException
abstract class AnnotationCollectorExtensionBase(val supportInheritedAnnotations: Boolean) : ClassBuilderInterceptorExtension {
private object RecordTypes {
val ANNOTATED_CLASS = "c"
val ANNOTATED_METHOD = "m"
val ANNOTATED_FIELD = "f"
val SHORTENED_ANNOTATION = "a"
val SHORTENED_PACKAGE_NAME = "p"
val CLASS_DECLARATION = "d"
}
protected abstract val annotationFilterList: List<String>?
private val shortenedAnnotationCache = ShortenedNameCache(RecordTypes.SHORTENED_ANNOTATION)
private val shortenedPackageNameCache = ShortenedNameCache(RecordTypes.SHORTENED_PACKAGE_NAME)
override fun interceptClassBuilderFactory(
interceptedFactory: ClassBuilderFactory,
bindingContext: BindingContext,
diagnostics: DiagnosticSink
): ClassBuilderFactory {
return AnnotationCollectorClassBuilderFactory(interceptedFactory, getWriter(diagnostics), diagnostics)
}
protected abstract fun getWriter(diagnostic: DiagnosticSink): Writer
protected abstract fun closeWriter()
private inner class AnnotationCollectorClassBuilderFactory(
delegateFactory: ClassBuilderFactory,
val writer: Writer,
val diagnostics: DiagnosticSink
) : DelegatingClassBuilderFactory(delegateFactory) {
override fun newClassBuilder(origin: JvmDeclarationOrigin): DelegatingClassBuilder {
return AnnotationCollectorClassBuilder(delegate.newClassBuilder(origin), writer, diagnostics)
}
override fun close() {
closeWriter()
delegate.close()
}
}
private inner class AnnotationCollectorClassBuilder(
internal val delegateClassBuilder: ClassBuilder,
val writer: Writer,
val diagnostics: DiagnosticSink
) : DelegatingClassBuilder() {
private val annotationFilterEnabled: Boolean
private val annotationFilters: List<Pattern>
init {
val nullableAnnotations = annotationFilterList?.map { it.compilePatternOpt() } ?: listOf()
annotationFilterEnabled = nullableAnnotations.isNotEmpty()
annotationFilters = nullableAnnotations.filterNotNull()
}
private val classVisitor: ClassVisitor by lazy {
object : ClassVisitor(Opcodes.ASM5, super.getVisitor()) {
override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? {
recordAnnotation(null, RecordTypes.ANNOTATED_CLASS, desc)
return super.visitAnnotation(desc, visible)
}
}
}
private lateinit var currentClassSimpleName: String
private lateinit var currentPackageName: String
override fun getVisitor() = classVisitor
override fun getDelegate() = delegateClassBuilder
override fun defineClass(
origin: PsiElement?,
version: Int,
access: Int,
name: String,
signature: String?,
superName: String,
interfaces: Array<out String>
) {
val currentClassSimpleName = name.substringAfterLast('/')
val currentPackageName = name.substringBeforeLast('/', "").replace('/', '.')
this.currentClassSimpleName = currentClassSimpleName
this.currentPackageName = currentPackageName
if (supportInheritedAnnotations) {
recordClass(currentPackageName, currentClassSimpleName)
}
super.defineClass(origin, version, access, name, signature, superName, interfaces)
}
override fun newField(
origin: JvmDeclarationOrigin,
access: Int,
name: String,
desc: String,
signature: String?,
value: Any?
): FieldVisitor {
return object : FieldVisitor(Opcodes.ASM5, super.newField(origin, access, name, desc, signature, value)) {
override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? {
recordAnnotation(name, RecordTypes.ANNOTATED_FIELD, desc)
return super.visitAnnotation(desc, visible)
}
}
}
override fun newMethod(
origin: JvmDeclarationOrigin,
access: Int,
name: String,
desc: String,
signature: String?,
exceptions: Array<out String>?
): MethodVisitor {
return object : MethodVisitor(Opcodes.ASM5, super.newMethod(origin, access, name, desc, signature, exceptions)) {
override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? {
recordAnnotation(name, RecordTypes.ANNOTATED_METHOD, desc)
return super.visitAnnotation(desc, visible)
}
}
}
private fun isAnnotationHandled(annotationFqName: String): Boolean {
return if (annotationFilterEnabled)
annotationFilters.any { it.matcher(annotationFqName).matches() }
else annotationFqName != JvmAnnotationNames.METADATA_FQ_NAME.asString()
}
private fun recordClass(packageName: String, className: String) {
if (!isValidName(packageName) || !isValidName(className)) return
val packageNameId = if (!packageName.isEmpty())
shortenedPackageNameCache.save(packageName, writer)
else null
val outputClassName = getOutputClassName(packageNameId, className)
writer.write("${RecordTypes.CLASS_DECLARATION} $outputClassName\n")
}
private fun recordAnnotation(name: String?, type: String, annotationDesc: String) {
val annotationFqName = Type.getType(annotationDesc).className
if (!isAnnotationHandled(annotationFqName) || !isValidName(annotationFqName)) return
if (name != null && !isValidName(name)) return
try {
val packageName = this.currentPackageName
if (!isValidName(packageName)) return
val className = this.currentClassSimpleName
if (!isValidName(className)) return
val annotationId = shortenedAnnotationCache.save(annotationFqName, writer)
val packageNameId = if (!packageName.isEmpty())
shortenedPackageNameCache.save(packageName, writer)
else null
val outputClassName = getOutputClassName(packageNameId, className)
val elementName = if (name != null) " $name" else ""
writer.write("$type $annotationId $outputClassName$elementName\n")
}
catch (e: IOException) {
throw e
}
}
private fun isValidName(name: String): Boolean {
return ' ' !in name
}
private fun getOutputClassName(packageNameId: String?, className: String): String {
return if (packageNameId == null) className else "$packageNameId/$className"
}
private fun String.compilePatternOpt(): Pattern? {
return try {
Pattern.compile(this)
}
catch (e: PatternSyntaxException) {
null
}
}
}
private class ShortenedNameCache(val type: String) {
private val internalCache = hashMapOf<String, String>()
private var counter: Int = 0
fun save(name: String, writer: Writer): String {
return internalCache.getOrPut(name) {
val resultId = counter.toString()
writer.write("$type $name $resultId\n")
counter += 1
resultId
}
}
}
}
class AnnotationCollectorExtension(
override val annotationFilterList: List<String>? = null,
private val outputFilename: String? = null,
supportInheritedAnnotations: Boolean
) : AnnotationCollectorExtensionBase(supportInheritedAnnotations) {
private var writerInternal: Writer? = null
override fun closeWriter() {
writerInternal?.close()
}
override fun getWriter(diagnostic: DiagnosticSink): Writer {
return writerInternal ?: try {
with (File(outputFilename)) {
val parent = parentFile
if (!parent.exists()) parent.mkdirs()
writerInternal = bufferedWriter()
writerInternal!!
}
}
catch (e: IOException) {
throw e
}
}
}
@@ -1,99 +0,0 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.annotation
import com.intellij.mock.MockProject
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension
import org.jetbrains.kotlin.compiler.plugin.CliOption
import org.jetbrains.kotlin.compiler.plugin.CliOptionProcessingException
import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.CompilerConfigurationKey
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
import java.io.File
object AnnotationCollectorConfigurationKeys {
val ANNOTATION_FILTER_LIST: CompilerConfigurationKey<List<String>> =
CompilerConfigurationKey.create<List<String>>("annotation filter regular expressions")
val OUTPUT_FILENAME: CompilerConfigurationKey<String> =
CompilerConfigurationKey.create<String>("annotation file name")
val STUBS_PATH: CompilerConfigurationKey<String> =
CompilerConfigurationKey.create<String>("stubs output directory")
val INHERITED: CompilerConfigurationKey<String> =
CompilerConfigurationKey.create<String>("support inherited annotations")
}
class AnnotationCollectorCommandLineProcessor : CommandLineProcessor {
companion object {
val ANNOTATION_COLLECTOR_COMPILER_PLUGIN_ID: String = "org.jetbrains.kotlin.kapt"
val ANNOTATION_FILTER_LIST_OPTION: CliOption =
CliOption("annotations", "<path>", "Annotation filter regular expressions, separated by commas", required = false)
val OUTPUT_FILENAME_OPTION: CliOption =
CliOption("output", "<path>", "File in which annotated declarations will be placed", required = false)
val STUBS_PATH_OPTION: CliOption =
CliOption("stubs", "<path>", "Output path for stubs", required = false)
val INHERITED_ANNOTATIONS_OPTION: CliOption =
CliOption("inherited", "<true/false>",
"True if collecting Kotlin class names for inherited annotations is needed", required = false)
}
override val pluginId: String = ANNOTATION_COLLECTOR_COMPILER_PLUGIN_ID
override val pluginOptions: Collection<CliOption> =
listOf(ANNOTATION_FILTER_LIST_OPTION, OUTPUT_FILENAME_OPTION, STUBS_PATH_OPTION, INHERITED_ANNOTATIONS_OPTION)
override fun processOption(option: CliOption, value: String, configuration: CompilerConfiguration) {
when (option) {
ANNOTATION_FILTER_LIST_OPTION -> {
val annotations = value.split(',').filter { !it.isEmpty() }.toList()
configuration.put(AnnotationCollectorConfigurationKeys.ANNOTATION_FILTER_LIST, annotations)
}
OUTPUT_FILENAME_OPTION -> configuration.put(AnnotationCollectorConfigurationKeys.OUTPUT_FILENAME, value)
STUBS_PATH_OPTION -> configuration.put(AnnotationCollectorConfigurationKeys.STUBS_PATH, value)
INHERITED_ANNOTATIONS_OPTION -> configuration.put(AnnotationCollectorConfigurationKeys.INHERITED, value)
else -> throw CliOptionProcessingException("Unknown option: ${option.name}")
}
}
}
class AnnotationCollectorComponentRegistrar : ComponentRegistrar {
override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) {
val supportInheritedAnnotations = "true" == (configuration.get(AnnotationCollectorConfigurationKeys.INHERITED) ?: "true")
val annotationFilterList = configuration.get(AnnotationCollectorConfigurationKeys.ANNOTATION_FILTER_LIST)
val outputFilename = configuration.get(AnnotationCollectorConfigurationKeys.OUTPUT_FILENAME)
if (outputFilename != null) {
val collectorExtension = AnnotationCollectorExtension(annotationFilterList, outputFilename, supportInheritedAnnotations)
ClassBuilderInterceptorExtension.registerExtension(project, collectorExtension)
}
val stubs = configuration.get(AnnotationCollectorConfigurationKeys.STUBS_PATH)
if (stubs != null) {
val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE)
val reportOutputFiles = configuration.getBoolean(CommonConfigurationKeys.REPORT_OUTPUT_FILES)
AnalysisHandlerExtension.registerExtension(project, StubProducerExtension(File(stubs), messageCollector, reportOutputFiles))
}
}
}
@@ -1,82 +0,0 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.annotation
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.common.output.outputUtils.writeAll
import org.jetbrains.kotlin.codegen.*
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
import org.jetbrains.org.objectweb.asm.ClassWriter
import java.io.File
class StubProducerExtension(
private val stubsOutputDir: File,
private val messageCollector: MessageCollector,
private val reportOutputFiles: Boolean
) : AnalysisHandlerExtension {
override fun analysisCompleted(
project: Project,
module: ModuleDescriptor,
bindingTrace: BindingTrace,
files: Collection<KtFile>
): AnalysisResult? {
val generationState = GenerationState.Builder(
project,
StubClassBuilderFactory(),
module,
bindingTrace.bindingContext,
files.toList(),
CompilerConfiguration.EMPTY
).build()
KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION)
if (!stubsOutputDir.exists()) stubsOutputDir.mkdirs()
generationState.factory.writeAll(stubsOutputDir, messageCollector, reportOutputFiles)
generationState.destroy()
return AnalysisResult.success(BindingContext.EMPTY, module, shouldGenerateCode = false)
}
}
private class StubClassBuilderFactory : ClassBuilderFactory {
override fun getClassBuilderMode() = ClassBuilderMode.KAPT
override fun newClassBuilder(origin: JvmDeclarationOrigin) = AbstractClassBuilder.Concrete(
ClassWriter(ClassWriter.COMPUTE_FRAMES or ClassWriter.COMPUTE_MAXS))
override fun asText(builder: ClassBuilder) = throw UnsupportedOperationException("BINARIES generator asked for text")
override fun asBytes(builder: ClassBuilder): ByteArray {
val visitor = builder.visitor as ClassWriter
return visitor.toByteArray()
}
override fun close() {
}
}
@@ -1,88 +0,0 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.annotation
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.codegen.CodegenTestFiles
import org.jetbrains.kotlin.codegen.CodegenTestUtil
import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
import org.jetbrains.kotlin.test.*
import java.io.File
import java.io.StringWriter
abstract class AbstractAnnotationProcessorBoxTest : KotlinTestWithEnvironmentManagement() {
fun doTest(path: String) {
val testDir = File(path)
fun filesByExtension(ext: String) = testDir
.listFiles { file -> file.isFile && file.extension.equals(ext, ignoreCase = true) }
.sortedBy { it.name }
val testName = getTestName(true)
val ktFiles = filesByExtension("kt")
val supportInheritedAnnotations = testName.contains("inherited", ignoreCase = true)
val supportStubs = testName.contains("stubs", ignoreCase = true)
val javaFiles = filesByExtension("java")
val javaSourceRoot =
if (javaFiles.isNotEmpty()) {
KotlinTestUtils.tmpDir("java-files").also { javaSourceRoot ->
javaFiles.forEach { javaFile -> javaFile.copyTo(File(javaSourceRoot, javaFile.name)) }
}
}
else null
val configuration = KotlinTestUtils.newConfiguration(
ConfigurationKind.ALL, TestJdkKind.MOCK_JDK, listOf(KotlinTestUtils.getAnnotationsJar()), listOfNotNull(javaSourceRoot)
)
val environment = KotlinCoreEnvironment.createForTests(testRootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES)
val project = environment.project
val collectorExtension = AnnotationCollectorExtensionForTests(supportInheritedAnnotations)
ClassBuilderInterceptorExtension.registerExtension(project, collectorExtension)
if (supportStubs) {
val stubsDir = KotlinTestUtils.tmpDir("class-stubs")
val stubProducerExtension = StubProducerExtension(stubsDir, MessageCollector.NONE, false)
AnalysisHandlerExtension.registerExtension(project, stubProducerExtension)
}
val testFiles = ktFiles.map { KotlinTestUtils.createFile(it.name, KotlinTestUtils.doLoadFile(it), environment.project) }
CodegenTestUtil.generateFiles(environment, CodegenTestFiles.create(testFiles))
val actualAnnotations = collectorExtension.stringWriter.toString()
val expectedAnnotationsFile = File(path + "annotations.txt")
KotlinTestUtils.assertEqualsToFile(expectedAnnotationsFile, actualAnnotations)
}
private class AnnotationCollectorExtensionForTests(
supportInheritedAnnotations: Boolean
) : AnnotationCollectorExtensionBase(supportInheritedAnnotations) {
val stringWriter = StringWriter()
override fun getWriter(diagnostic: DiagnosticSink) = stringWriter
override fun closeWriter() {}
override val annotationFilterList = listOf<String>()
}
}
@@ -1,136 +0,0 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.annotation;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
import org.jetbrains.kotlin.test.KotlinTestUtils;
import org.jetbrains.kotlin.test.TargetBackend;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.runner.RunWith;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("plugins/annotation-collector/testData/collectToFile")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public class AnnotationProcessorBoxTestGenerated extends AbstractAnnotationProcessorBoxTest {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath);
}
public void testAllFilesPresentInCollectToFile() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("plugins/annotation-collector/testData/collectToFile"), Pattern.compile("^([^\\.]+)$"), TargetBackend.ANY, false);
}
@TestMetadata("annotatedGettersSetters")
public void testAnnotatedGettersSetters() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/annotatedGettersSetters/");
}
@TestMetadata("annotationInSameFile")
public void testAnnotationInSameFile() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/annotationInSameFile/");
}
@TestMetadata("anonymousClasses")
public void testAnonymousClasses() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/anonymousClasses/");
}
@TestMetadata("classAnnotations")
public void testClassAnnotations() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/classAnnotations/");
}
@TestMetadata("constructors")
public void testConstructors() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/constructors/");
}
@TestMetadata("defaultPackage")
public void testDefaultPackage() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/defaultPackage/");
}
@TestMetadata("fieldAnnotations")
public void testFieldAnnotations() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/fieldAnnotations/");
}
@TestMetadata("inheritedComplex")
public void testInheritedComplex() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/inheritedComplex/");
}
@TestMetadata("inheritedSimple")
public void testInheritedSimple() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/inheritedSimple/");
}
@TestMetadata("inheritedTopLevel")
public void testInheritedTopLevel() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/inheritedTopLevel/");
}
@TestMetadata("localClasses")
public void testLocalClasses() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/localClasses/");
}
@TestMetadata("localFunctions")
public void testLocalFunctions() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/localFunctions/");
}
@TestMetadata("methodAnnotations")
public void testMethodAnnotations() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/methodAnnotations/");
}
@TestMetadata("multiFileTopLevelAnnotated")
public void testMultiFileTopLevelAnnotated() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/multiFileTopLevelAnnotated/");
}
@TestMetadata("nestedClasses")
public void testNestedClasses() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/nestedClasses/");
}
@TestMetadata("platformStatic")
public void testPlatformStatic() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/platformStatic/");
}
@TestMetadata("retentionPoliciesJavaAnnotations")
public void testRetentionPoliciesJavaAnnotations() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotations/");
}
@TestMetadata("retentionPoliciesJavaAnnotationsStubs")
public void testRetentionPoliciesJavaAnnotationsStubs() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/retentionPoliciesJavaAnnotationsStubs/");
}
@TestMetadata("retentionPoliciesKotlinAnnotations")
public void testRetentionPoliciesKotlinAnnotations() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotations/");
}
@TestMetadata("retentionPoliciesKotlinAnnotationsStubs")
public void testRetentionPoliciesKotlinAnnotationsStubs() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/retentionPoliciesKotlinAnnotationsStubs/");
}
@TestMetadata("topLevelAnnotated")
public void testTopLevelAnnotated() throws Exception {
runTest("plugins/annotation-collector/testData/collectToFile/topLevelAnnotated/");
}
}
@@ -1,12 +0,0 @@
package org.test
public data class SomeClass(val arg: Any? = null) {
public val immutableProperty: Int = 5
@java.lang.Deprecated get
public var mutableProperty: String = "String"
@java.lang.Deprecated get
@java.lang.Deprecated set
}
@@ -1,14 +0,0 @@
a java.lang.Deprecated 0
p org.test 0
m 0 0/SomeClass getImmutableProperty
a org.jetbrains.annotations.NotNull 1
f 1 0/SomeClass mutableProperty
m 0 0/SomeClass getMutableProperty
m 1 0/SomeClass getMutableProperty
m 0 0/SomeClass setMutableProperty
a org.jetbrains.annotations.Nullable 2
f 2 0/SomeClass arg
m 2 0/SomeClass getArg
m 2 0/SomeClass component1
m 1 0/SomeClass copy
m 1 0/SomeClass copy$default
@@ -1,12 +0,0 @@
package org.test
@Retention(AnnotationRetention.BINARY)
public annotation class SomeAnnotation
@SomeAnnotation public class SomeClass {
@SomeAnnotation public fun annotatedFunction() {
}
}
@@ -1,8 +0,0 @@
a kotlin.annotation.Retention 0
p org.test 0
c 0 0/SomeAnnotation
a java.lang.annotation.Retention 1
c 1 0/SomeAnnotation
a org.test.SomeAnnotation 2
c 2 0/SomeClass
m 2 0/SomeClass annotatedFunction
@@ -1,3 +0,0 @@
a java.lang.Deprecated 0
p org.test 0
f 0 0/SomeClass$a$1 property
@@ -1,13 +0,0 @@
package org.test
public class SomeClass {
private fun a() {
object : Any() {
@java.lang.Deprecated
val property: Int = 5
}
}
}
@@ -1,4 +0,0 @@
a java.lang.Deprecated 0
p org.test 0
c 0 0/SomeClass
c 0 0/SomeObject
@@ -1,5 +0,0 @@
package org.test
@java.lang.Deprecated public class SomeClass
@java.lang.Deprecated public object SomeObject
@@ -1,4 +0,0 @@
a java.lang.Deprecated 0
p org.test 0
m 0 0/SomeClass <init>
m 0 0/SomeClass <init>
@@ -1,13 +0,0 @@
package org.test
public class SomeClass {
@java.lang.Deprecated constructor() {
}
@java.lang.Deprecated constructor(s: String) {
}
}
@@ -1,12 +0,0 @@
a java.lang.Deprecated 0
f 0 SomeClass annotatedProperty
a org.jetbrains.annotations.Nullable 1
f 1 SomeClass annotatedProperty
m 1 SomeClass getAnnotatedProperty
m 0 SomeClass annotatedFunction
f 1 SomeClass arg
m 1 SomeClass getArg
m 1 SomeClass component1
a org.jetbrains.annotations.NotNull 2
m 2 SomeClass copy
m 2 SomeClass copy$default
@@ -1,9 +0,0 @@
data public class SomeClass(val arg: Any? = null) {
@java.lang.Deprecated public var annotatedProperty: String? = null
@java.lang.Deprecated public inline fun annotatedFunction() {
}
}
@@ -1,7 +0,0 @@
a java.lang.Deprecated 0
p org.test 0
f 0 0/SomeClass annotatedVal
a org.jetbrains.annotations.Nullable 1
f 1 0/SomeClass annotatedVal
m 1 0/SomeClass getAnnotatedVal
f 0 0/SomeClass annotatedVar
@@ -1,11 +0,0 @@
package org.test
public class SomeClass {
@java.lang.Deprecated
public val annotatedVal: String? = null
@java.lang.Deprecated
public var annotatedVar: Int = 5
}
@@ -1,18 +0,0 @@
p org.test 0
d 0/Ann1
a java.lang.annotation.Inherited 0
c 0 0/Ann1
a java.lang.annotation.Retention 1
c 1 0/Ann1
d 0/Ann2
c 0 0/Ann2
c 1 0/Ann2
d 0/D
d 0/C
d 0/B
a org.test.Ann2 2
c 2 0/B
d 0/A
a org.test.Ann1 3
c 3 0/A
d 0/A$DefaultImpls
@@ -1,19 +0,0 @@
package org.test
import java.lang.annotation.Inherited
@Inherited
annotation class Ann1
@Inherited
annotation class Ann2
@Ann1
interface A
@Ann2
open class B : A
open class C : B()
class D : C()
@@ -1,11 +0,0 @@
p org.test 0
d 0/Ann
a java.lang.annotation.Inherited 0
c 0 0/Ann
a java.lang.annotation.Retention 1
c 1 0/Ann
d 0/B
d 0/A
a org.test.Ann 2
c 2 0/A
d 0/A$DefaultImpls
@@ -1,11 +0,0 @@
package org.test
import java.lang.annotation.Inherited
@Inherited
annotation class Ann
@Ann
interface A
class B : A
@@ -1,4 +0,0 @@
p org.test 0
d 0/InheritedTopLevelKt
a org.jetbrains.annotations.NotNull 0
m 0 0/InheritedTopLevelKt getTopLevelProperty
@@ -1,8 +0,0 @@
package org.test
fun topLevelFunction() {
}
val topLevelProperty: String
get() = "text"
@@ -1,7 +0,0 @@
a java.lang.Deprecated 0
p org.test 0
c 0 0/SomeClass$someFunction$LocalClass
f 0 0/SomeClass$someFunction$LocalClass annotatedProperty
a org.jetbrains.annotations.Nullable 1
f 1 0/SomeClass$someFunction$LocalClass annotatedProperty
m 1 0/SomeClass$someFunction$LocalClass getAnnotatedProperty
@@ -1,17 +0,0 @@
package org.test
public class SomeClass {
public fun someFunction() {
@java.lang.Deprecated class LocalClass {
public @java.lang.Deprecated var annotatedProperty: String? = null
public inline fun annotatedFunction() {
}
}
}
}
@@ -1,4 +0,0 @@
a java.lang.Deprecated 0
p org.test 0
m 0 0/Class$method$1 invoke
m 0 0/LocalFunctionsKt$function$1 invoke
@@ -1,11 +0,0 @@
package org.test
class Class {
fun method() {
@java.lang.Deprecated fun localFunctionInsideMethod() {}
}
}
fun function() {
@java.lang.Deprecated fun localFunctionInsideFunction() {}
}
@@ -1,8 +0,0 @@
a java.lang.annotation.Retention 0
p org.test 0
c 0 0/Ann
a org.test.Ann 1
m 1 0/Child overridenWithAnnotation
m 1 0/Child childMethod
m 1 0/Parent overridenWithoutAnnotation
m 1 0/Parent notOverriden
@@ -1,25 +0,0 @@
package org.test
annotation class Ann
open class Parent {
@Ann
open fun overridenWithoutAnnotation() {}
open fun overridenWithAnnotation() {}
@Ann
fun notOverriden() {}
open fun notAnnotated() {}
}
class Child : Parent() {
override fun overridenWithoutAnnotation() {}
@Ann
override fun overridenWithAnnotation() {}
@Ann
fun childMethod() {}
}
@@ -1,3 +0,0 @@
package org.test
annotation class Ann
@@ -1,10 +0,0 @@
a org.test.Ann 0
p org.test 0
m 0 0/TestFacade__PartAKt funA
m 0 0/TestFacade__PartAKt valA$annotations
m 0 0/TestFacade__PartBKt funB
m 0 0/TestFacade__PartBKt valB$annotations
m 0 0/TestFacade funA
m 0 0/TestFacade funB
a java.lang.annotation.Retention 1
c 1 0/Ann
@@ -1,10 +0,0 @@
@file:JvmMultifileClass
@file:JvmName("TestFacade")
package org.test
@Ann
fun funA() {}
@Ann
val valA = 4
@@ -1,10 +0,0 @@
@file:JvmMultifileClass
@file:JvmName("TestFacade")
package org.test
@Ann
fun funB() {}
@Ann
val valB = 4
@@ -1,7 +0,0 @@
a java.lang.Deprecated 0
p org.test 0
c 0 0/SomeClass$SomeInnerObject
c 0 0/SomeClass$InnerClass
c 0 0/SomeClass$InnerClass$InnerClassInInnerClass
c 0 0/SomeClass$NestedClass
c 0 0/SomeClass$Companion
@@ -1,30 +0,0 @@
package org.test
public class SomeClass {
@java.lang.Deprecated
companion object {
}
@java.lang.Deprecated
object SomeInnerObject {
}
@java.lang.Deprecated
inner class InnerClass {
@java.lang.Deprecated
inner class InnerClassInInnerClass {
}
}
@java.lang.Deprecated
class NestedClass {
}
}
@@ -1,4 +0,0 @@
a kotlin.jvm.JvmStatic 0
p org.test 0
m 0 0/SomeClass$Companion a
m 0 0/SomeClass a
@@ -1,11 +0,0 @@
package org.test
public class SomeClass {
companion object {
@JvmStatic inline fun a() {
}
}
}
@@ -1,4 +0,0 @@
import java.lang.annotation.*;
@Retention(RetentionPolicy.CLASS)
public @interface ClassAnnotation {}
@@ -1,3 +0,0 @@
import java.lang.annotation.*;
public @interface DefaultAnnotation {}
@@ -1,4 +0,0 @@
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
public @interface RuntimeAnnotation {}
@@ -1,4 +0,0 @@
import java.lang.annotation.*;
@Retention(RetentionPolicy.SOURCE)
public @interface SourceAnnotation {}
@@ -1,6 +0,0 @@
a DefaultAnnotation 0
c 0 DafaultUsage
a ClassAnnotation 1
c 1 ClassUsage
a RuntimeAnnotation 2
c 2 RuntimeUsage
@@ -1,11 +0,0 @@
@DefaultAnnotation
class DafaultUsage
@SourceAnnotation
class SourceUsage
@ClassAnnotation
class ClassUsage
@RuntimeAnnotation
class RuntimeUsage
@@ -1,4 +0,0 @@
import java.lang.annotation.*;
@Retention(RetentionPolicy.CLASS)
public @interface ClassAnnotation {}
@@ -1,3 +0,0 @@
import java.lang.annotation.*;
public @interface DefaultAnnotation {}
@@ -1,4 +0,0 @@
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
public @interface RuntimeAnnotation {}
@@ -1,4 +0,0 @@
import java.lang.annotation.*;
@Retention(RetentionPolicy.SOURCE)
public @interface SourceAnnotation {}
@@ -1,8 +0,0 @@
a DefaultAnnotation 0
c 0 DafaultUsage
a SourceAnnotation 1
c 1 SourceUsage
a ClassAnnotation 2
c 2 ClassUsage
a RuntimeAnnotation 3
c 3 RuntimeUsage
@@ -1,11 +0,0 @@
@DefaultAnnotation
class DafaultUsage
@SourceAnnotation
class SourceUsage
@ClassAnnotation
class ClassUsage
@RuntimeAnnotation
class RuntimeUsage
@@ -1,10 +0,0 @@
annotation class DefaultAnnotation
@Retention(AnnotationRetention.SOURCE)
annotation class SourceAnnotation
@Retention(AnnotationRetention.BINARY)
annotation class BinaryAnnotation
@Retention(AnnotationRetention.RUNTIME)
annotation class RuntimeAnnotation
@@ -1,15 +0,0 @@
a java.lang.annotation.Retention 0
c 0 DefaultAnnotation
a kotlin.annotation.Retention 1
c 1 SourceAnnotation
c 0 SourceAnnotation
c 1 BinaryAnnotation
c 0 BinaryAnnotation
c 1 RuntimeAnnotation
c 0 RuntimeAnnotation
a DefaultAnnotation 2
c 2 DafaultUsage
a BinaryAnnotation 3
c 3 BinaryUsage
a RuntimeAnnotation 4
c 4 RuntimeUsage
@@ -1,11 +0,0 @@
@DefaultAnnotation
class DafaultUsage
@SourceAnnotation
class SourceUsage
@BinaryAnnotation
class BinaryUsage
@RuntimeAnnotation
class RuntimeUsage
@@ -1,10 +0,0 @@
annotation class DefaultAnnotation
@Retention(AnnotationRetention.SOURCE)
annotation class SourceAnnotation
@Retention(AnnotationRetention.BINARY)
annotation class BinaryAnnotation
@Retention(AnnotationRetention.RUNTIME)
annotation class RuntimeAnnotation
@@ -1,17 +0,0 @@
a java.lang.annotation.Retention 0
c 0 DefaultAnnotation
a kotlin.annotation.Retention 1
c 1 SourceAnnotation
c 0 SourceAnnotation
c 1 BinaryAnnotation
c 0 BinaryAnnotation
c 1 RuntimeAnnotation
c 0 RuntimeAnnotation
a DefaultAnnotation 2
c 2 DafaultUsage
a SourceAnnotation 3
c 3 SourceUsage
a BinaryAnnotation 4
c 4 BinaryUsage
a RuntimeAnnotation 5
c 5 RuntimeUsage
@@ -1,11 +0,0 @@
@DefaultAnnotation
class DafaultUsage
@SourceAnnotation
class SourceUsage
@BinaryAnnotation
class BinaryUsage
@RuntimeAnnotation
class RuntimeUsage
@@ -1,6 +0,0 @@
a java.lang.annotation.Retention 0
p org.test 0
c 0 0/Ann
a org.test.Ann 1
m 1 0/TopLevelAnnotatedKt someAnnotatedFunction
m 1 0/TopLevelAnnotatedKt someAnnotatedValue$annotations
@@ -1,9 +0,0 @@
package org.test
annotation class Ann
@Ann
fun someAnnotatedFunction() {}
@Ann
val someAnnotatedValue = 4