javac-wrapper: refactoring, fixes and tests

This commit is contained in:
baratynskiy
2017-06-27 17:24:10 +03:00
committed by Alexander Baratynskiy
parent 8494e54608
commit 01883a41cb
382 changed files with 42897 additions and 688 deletions
@@ -242,7 +242,10 @@ class K2JVMCompiler : CLICompiler<K2JVMCompilerArguments>() {
arguments: K2JVMCompilerArguments): Boolean { arguments: K2JVMCompilerArguments): Boolean {
if (arguments.useJavac) { if (arguments.useJavac) {
environment.configuration.put(JVMConfigurationKeys.USE_JAVAC, true) environment.configuration.put(JVMConfigurationKeys.USE_JAVAC, true)
return environment.registerJavac(compileJava = arguments.compileJava, arguments = arguments.javacArguments) if (arguments.compileJava) {
environment.configuration.put(JVMConfigurationKeys.COMPILE_JAVA, true)
}
return environment.registerJavac(arguments = arguments.javacArguments)
} }
return true return true
@@ -275,10 +275,11 @@ class KotlinCoreEnvironment private constructor(
fun registerJavac( fun registerJavac(
javaFiles: List<File> = allJavaFiles, javaFiles: List<File> = allJavaFiles,
kotlinFiles: List<KtFile> = sourceFiles, kotlinFiles: List<KtFile> = sourceFiles,
compileJava: Boolean = false, arguments: Array<String>? = null,
arguments: Array<String>? = null bootClasspath: List<File>? = null,
sourcePath: List<File>? = null
): Boolean { ): Boolean {
return JavacWrapperRegistrar.registerJavac(projectEnvironment.project, configuration, javaFiles, kotlinFiles, compileJava, arguments) return JavacWrapperRegistrar.registerJavac(projectEnvironment.project, configuration, javaFiles, kotlinFiles, arguments, bootClasspath, sourcePath, CliLightClassGenerationSupport(project))
} }
private val applicationEnvironment: CoreApplicationEnvironment private val applicationEnvironment: CoreApplicationEnvironment
@@ -159,7 +159,7 @@ object KotlinToJVMBytecodeCompiler {
writeOutput(state.configuration, state.factory, null) writeOutput(state.configuration, state.factory, null)
} }
if (projectConfiguration.getBoolean(JVMConfigurationKeys.USE_JAVAC)) { if (projectConfiguration.getBoolean(JVMConfigurationKeys.COMPILE_JAVA)) {
val singleModule = chunk.singleOrNull() val singleModule = chunk.singleOrNull()
if (singleModule != null) { if (singleModule != null) {
return JavacWrapper.getInstance(environment.project).use { return JavacWrapper.getInstance(environment.project).use {
@@ -20,6 +20,7 @@ import com.intellij.mock.MockProject
import com.sun.tools.javac.util.Context import com.sun.tools.javac.util.Context
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.STRONG_WARNING import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.STRONG_WARNING
import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport
import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.JVMConfigurationKeys
@@ -36,8 +37,10 @@ object JavacWrapperRegistrar {
configuration: CompilerConfiguration, configuration: CompilerConfiguration,
javaFiles: List<File>, javaFiles: List<File>,
kotlinFiles: List<KtFile>, kotlinFiles: List<KtFile>,
compileJava: Boolean, arguments: Array<String>?,
arguments: Array<String>? bootClasspath: List<File>?,
sourcePath: List<File>?,
lightClassGenerationSupport: CliLightClassGenerationSupport
): Boolean { ): Boolean {
val messageCollector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) val messageCollector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
@@ -54,8 +57,11 @@ object JavacWrapperRegistrar {
val jvmClasspathRoots = configuration.jvmClasspathRoots val jvmClasspathRoots = configuration.jvmClasspathRoots
val outputDirectory = configuration.get(JVMConfigurationKeys.OUTPUT_DIRECTORY) val outputDirectory = configuration.get(JVMConfigurationKeys.OUTPUT_DIRECTORY)
val compileJava = configuration.getBoolean(JVMConfigurationKeys.COMPILE_JAVA)
val kotlinSupertypesResolver = KotlinSupertypeResolverImpl(lightClassGenerationSupport)
val javacWrapper = JavacWrapper(javaFiles, kotlinFiles, arguments, jvmClasspathRoots, compileJava, outputDirectory, context) val javacWrapper = JavacWrapper(javaFiles, kotlinFiles, arguments, jvmClasspathRoots, bootClasspath, sourcePath,
kotlinSupertypesResolver, compileJava, outputDirectory, context)
project.registerService(JavacWrapper::class.java, javacWrapper) project.registerService(JavacWrapper::class.java, javacWrapper)
@@ -0,0 +1,39 @@
/*
* Copyright 2010-2017 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.javac
import com.intellij.psi.PsiClass
import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport
import org.jetbrains.kotlin.javac.KotlinSupertypeResolver
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtClassOrObject
class KotlinSupertypeResolverImpl(private val lightClassGenerationSupport: CliLightClassGenerationSupport) : KotlinSupertypeResolver {
override fun resolveSupertypes(classOrObject: KtClassOrObject): List<ClassId> {
val lightClass = lightClassGenerationSupport.getLightClass(classOrObject) ?: return emptyList()
return lightClass.superTypes
.mapNotNull { it.resolve()?.computeClassId() }
}
private fun PsiClass.computeClassId(): ClassId? =
containingClass?.computeClassId()?.createNestedClassId(Name.identifier(name!!)) ?: qualifiedName?.let { ClassId.topLevel(FqName(it)) }
}
@@ -115,7 +115,10 @@ public class JVMConfigurationKeys {
CompilerConfigurationKey.create("use fast class files reading implementation [experimental]"); CompilerConfigurationKey.create("use fast class files reading implementation [experimental]");
public static final CompilerConfigurationKey<Boolean> USE_JAVAC = public static final CompilerConfigurationKey<Boolean> USE_JAVAC =
CompilerConfigurationKey.create("use javac"); CompilerConfigurationKey.create("use javac [experimental]");
public static final CompilerConfigurationKey<Boolean> COMPILE_JAVA =
CompilerConfigurationKey.create("compile java files [experimental]");
public static final CompilerConfigurationKey<List<String>> ADDITIONAL_JAVA_MODULES = public static final CompilerConfigurationKey<List<String>> ADDITIONAL_JAVA_MODULES =
CompilerConfigurationKey.create("additional Java modules"); CompilerConfigurationKey.create("additional Java modules");
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.javac package org.jetbrains.kotlin.javac
import com.sun.tools.javac.main.Option
import com.sun.tools.javac.util.Options import com.sun.tools.javac.util.Options
import java.util.regex.Pattern import java.util.regex.Pattern
@@ -25,6 +26,8 @@ object JavacOptionsMapper {
arguments.forEach { options.putOption(it) } arguments.forEach { options.putOption(it) }
} }
fun setUTF8Encoding(options: Options) = options.put(Option.ENCODING, "UTF8")
private val optionPattern = Pattern.compile("\\s+") private val optionPattern = Pattern.compile("\\s+")
private fun Options.putOption(option: String) = private fun Options.putOption(option: String) =
@@ -35,6 +35,7 @@ import com.sun.tools.javac.jvm.ClassReader
import com.sun.tools.javac.main.JavaCompiler import com.sun.tools.javac.main.JavaCompiler
import com.sun.tools.javac.model.JavacElements import com.sun.tools.javac.model.JavacElements
import com.sun.tools.javac.model.JavacTypes import com.sun.tools.javac.model.JavacTypes
import com.sun.tools.javac.tree.DCTree
import com.sun.tools.javac.tree.JCTree import com.sun.tools.javac.tree.JCTree
import com.sun.tools.javac.util.Context import com.sun.tools.javac.util.Context
import com.sun.tools.javac.util.Log import com.sun.tools.javac.util.Log
@@ -48,10 +49,7 @@ import org.jetbrains.kotlin.load.java.structure.JavaAnnotation
import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.java.structure.JavaClassifier import org.jetbrains.kotlin.load.java.structure.JavaClassifier
import org.jetbrains.kotlin.load.java.structure.JavaPackage import org.jetbrains.kotlin.load.java.structure.JavaPackage
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.*
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.isSubpackageOf
import org.jetbrains.kotlin.name.parentOrNull
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import java.io.Closeable import java.io.Closeable
import java.io.File import java.io.File
@@ -67,6 +65,9 @@ class JavacWrapper(
kotlinFiles: Collection<KtFile>, kotlinFiles: Collection<KtFile>,
arguments: Array<String>?, arguments: Array<String>?,
jvmClasspathRoots: List<File>, jvmClasspathRoots: List<File>,
bootClasspath: List<File>?,
sourcePath: List<File>?,
val kotlinSupertypeResolver: KotlinSupertypeResolver,
private val compileJava: Boolean, private val compileJava: Boolean,
private val outputDirectory: File?, private val outputDirectory: File?,
private val context: Context private val context: Context
@@ -88,7 +89,7 @@ class JavacWrapper(
} }
val JAVA_LANG_ENUM by lazy { val JAVA_LANG_ENUM by lazy {
createCommonClassifierType(CommonClassNames.JAVA_LANG_ENUM) findClassInSymbols(CommonClassNames.JAVA_LANG_ENUM)
} }
val JAVA_LANG_ANNOTATION_ANNOTATION by lazy { val JAVA_LANG_ANNOTATION_ANNOTATION by lazy {
@@ -96,7 +97,10 @@ class JavacWrapper(
} }
init { init {
arguments?.toList()?.let { JavacOptionsMapper.map(Options.instance(context), it) } Options.instance(context).let { options ->
JavacOptionsMapper.setUTF8Encoding(options)
arguments?.toList()?.let { JavacOptionsMapper.map(options, it) }
}
} }
private val javac = object : JavaCompiler(context) { private val javac = object : JavaCompiler(context) {
@@ -106,9 +110,18 @@ class JavacWrapper(
private val fileManager = context[JavaFileManager::class.java] as JavacFileManager private val fileManager = context[JavaFileManager::class.java] as JavacFileManager
init { init {
// keep javadoc comments
javac.keepComments = true
// use rt.jar instead of lib/ct.sym // use rt.jar instead of lib/ct.sym
fileManager.setSymbolFileEnabled(false) fileManager.setSymbolFileEnabled(false)
fileManager.setLocation(StandardLocation.CLASS_PATH, jvmClasspathRoots) bootClasspath?.let {
val cp = fileManager.getLocation(StandardLocation.PLATFORM_CLASS_PATH) + jvmClasspathRoots
fileManager.setLocation(StandardLocation.PLATFORM_CLASS_PATH, it)
fileManager.setLocation(StandardLocation.CLASS_PATH, cp)
} ?: fileManager.setLocation(StandardLocation.CLASS_PATH, jvmClasspathRoots)
sourcePath?.let {
fileManager.setLocation(StandardLocation.SOURCE_PATH, sourcePath)
}
} }
private val names = Names.instance(context) private val names = Names.instance(context)
@@ -119,25 +132,36 @@ class JavacWrapper(
private val fileObjects = fileManager.getJavaFileObjectsFromFiles(javaFiles).toJavacList() private val fileObjects = fileManager.getJavaFileObjectsFromFiles(javaFiles).toJavacList()
private val compilationUnits: JavacList<JCTree.JCCompilationUnit> = fileObjects.map(javac::parse).toJavacList() private val compilationUnits: JavacList<JCTree.JCCompilationUnit> = fileObjects.map(javac::parse).toJavacList()
private val javaClasses = compilationUnits private val treeBasedJavaClasses = hashMapOf<ClassId, TreeBasedClass>()
.flatMap { unit ->
unit.typeDecls.flatMap { classDecl ->
TreeBasedClass(classDecl as JCTree.JCClassDecl,
trees.getPath(unit, classDecl),
this,
unit.sourceFile).withInnerClasses()
}
}
.associateBy(JavaClass::fqName)
private val javaClassesAssociatedByClassId = private val javaClassDeclarations = compilationUnits.flatMap { unit ->
javaClasses.values.associateBy { it.computeClassId() } unit.typeDecls.map { classDeclaration ->
val packageName = unit.packageName?.toString() ?: ""
val className = (classDeclaration as JCTree.JCClassDecl).simpleName.toString()
val classId = classId(packageName, className)
classId to Pair(classDeclaration, unit)
}
}.toMap()
private fun getTreeBasedClass(classId: ClassId): TreeBasedClass? {
if (treeBasedJavaClasses.containsKey(classId)) {
return treeBasedJavaClasses[classId]
}
val (classDeclaration, unit) = javaClassDeclarations[classId] ?: return null
val treeBasedClass = TreeBasedClass(classDeclaration,
trees.getPath(unit, classDeclaration),
this,
unit.sourceFile)
return treeBasedClass.apply { treeBasedJavaClasses[classId] = this }
}
private val javaPackages = compilationUnits private val javaPackages = compilationUnits
.mapNotNullTo(hashSetOf()) { unit -> .mapTo(hashSetOf<TreeBasedPackage>()) { unit ->
unit.packageName?.toString()?.let { packageName -> unit.packageName?.toString()?.let { packageName ->
TreeBasedPackage(packageName, this, unit.sourcefile) TreeBasedPackage(packageName, this, unit.sourcefile)
} } ?: TreeBasedPackage("<root>", this, unit.sourcefile)
} }
.associateBy(TreeBasedPackage::fqName) .associateBy(TreeBasedPackage::fqName)
@@ -146,12 +170,11 @@ class JavacWrapper(
it.sourceFile.isNameCompatible("package-info", JavaFileObject.Kind.SOURCE) && it.sourceFile.isNameCompatible("package-info", JavaFileObject.Kind.SOURCE) &&
it.packageName != null it.packageName != null
}.associateBy({ FqName(it.packageName!!.toString()) }) { compilationUnit -> }.associateBy({ FqName(it.packageName!!.toString()) }) { compilationUnit ->
compilationUnit.packageAnnotations.map { TreeBasedAnnotation(it, compilationUnit, this) } compilationUnit.packageAnnotations.map { TreeBasedAnnotation(it, getTreePath(it, compilationUnit), this) }
} }
val classifierResolver = ClassifierResolver(this)
private val kotlinClassifiersCache = KotlinClassifiersCache(if (javaFiles.isNotEmpty()) kotlinFiles else emptyList(), this) private val kotlinClassifiersCache = KotlinClassifiersCache(if (javaFiles.isNotEmpty()) kotlinFiles else emptyList(), this)
private val treePathResolverCache = TreePathResolverCache(this)
private val symbolBasedClassesCache = hashMapOf<String, SymbolBasedClass?>()
private val symbolBasedPackagesCache = hashMapOf<String, SymbolBasedPackage?>() private val symbolBasedPackagesCache = hashMapOf<String, SymbolBasedPackage?>()
fun compile(outDir: File? = null): Boolean = with(javac) { fun compile(outDir: File? = null): Boolean = with(javac) {
@@ -173,20 +196,20 @@ class JavacWrapper(
javac.close() javac.close()
} }
fun findClass(fqName: FqName, scope: GlobalSearchScope = EverythingGlobalScope()): JavaClass? {
javaClasses[fqName]?.let { javaClass ->
javaClass.virtualFile?.let { if (it in scope) return javaClass }
}
findClassInSymbols(fqName.asString())?.let { javaClass ->
javaClass.virtualFile?.let { if (it in scope) return javaClass }
}
return null
}
fun findClass(classId: ClassId, scope: GlobalSearchScope = EverythingGlobalScope()): JavaClass? { fun findClass(classId: ClassId, scope: GlobalSearchScope = EverythingGlobalScope()): JavaClass? {
javaClassesAssociatedByClassId[classId]?.let { javaClass -> if (classId.isNestedClass) {
val pathSegments = classId.relativeClassName.pathSegments().map { it.asString() }
val outerClassId = ClassId(classId.packageFqName, Name.identifier(pathSegments.first()))
var outerClass = findClass(outerClassId, scope) ?: return null
pathSegments.drop(1).forEach {
outerClass = outerClass.findInnerClass(Name.identifier(it)) ?: return null
}
return outerClass
}
getTreeBasedClass(classId)?.let { javaClass ->
javaClass.virtualFile?.let { if (it in scope) return javaClass } javaClass.virtualFile?.let { if (it in scope) return javaClass }
} }
@@ -202,7 +225,7 @@ class JavacWrapper(
return null return null
} }
fun findPackage(fqName: FqName, scope: GlobalSearchScope): JavaPackage? { fun findPackage(fqName: FqName, scope: GlobalSearchScope = EverythingGlobalScope()): JavaPackage? {
javaPackages[fqName]?.let { javaPackage -> javaPackages[fqName]?.let { javaPackage ->
javaPackage.virtualFile?.let { file -> javaPackage.virtualFile?.let { file ->
if (file in scope) return javaPackage if (file in scope) return javaPackage
@@ -224,9 +247,9 @@ class JavacWrapper(
packageSourceAnnotations[fqName] ?: emptyList() packageSourceAnnotations[fqName] ?: emptyList()
fun findClassesFromPackage(fqName: FqName): List<JavaClass> = fun findClassesFromPackage(fqName: FqName): List<JavaClass> =
javaClasses javaClassDeclarations
.filterKeys { it?.parentOrNull() == fqName } .filterKeys { it.packageFqName == fqName }
.flatMap { it.value.withInnerClasses() } + .map { getTreeBasedClass(it.key)!! } +
elements.getPackageElement(fqName.asString()) elements.getPackageElement(fqName.asString())
?.members() ?.members()
?.elements ?.elements
@@ -235,8 +258,9 @@ class JavacWrapper(
.orEmpty() .orEmpty()
fun knownClassNamesInPackage(fqName: FqName): Set<String> = fun knownClassNamesInPackage(fqName: FqName): Set<String> =
javaClasses.filterKeys { it?.parentOrNull() == fqName } javaClassDeclarations
.mapTo(hashSetOf()) { it.value.name.asString() } + .filterKeys { it.packageFqName == fqName }
.mapTo(hashSetOf()) { it.key.shortClassName.asString() } +
elements.getPackageElement(fqName.asString()) elements.getPackageElement(fqName.asString())
?.members_field ?.members_field
?.elements ?.elements
@@ -247,15 +271,15 @@ class JavacWrapper(
fun getTreePath(tree: JCTree, compilationUnit: CompilationUnitTree): TreePath = fun getTreePath(tree: JCTree, compilationUnit: CompilationUnitTree): TreePath =
trees.getPath(compilationUnit, tree) trees.getPath(compilationUnit, tree)
fun getKotlinClassifier(fqName: FqName): JavaClass? = fun getKotlinClassifier(classId: ClassId): JavaClass? =
kotlinClassifiersCache.getKotlinClassifier(fqName) kotlinClassifiersCache.getKotlinClassifier(classId)
fun isDeprecated(element: Element) = elements.isDeprecated(element) fun isDeprecated(element: Element) = elements.isDeprecated(element)
fun isDeprecated(typeMirror: TypeMirror) = isDeprecated(types.asElement(typeMirror)) fun isDeprecated(typeMirror: TypeMirror) = isDeprecated(types.asElement(typeMirror))
fun resolve(treePath: TreePath): JavaClassifier? = fun resolve(treePath: TreePath): JavaClassifier? =
treePathResolverCache.resolve(treePath) classifierResolver.resolve(treePath)
fun toVirtualFile(javaFileObject: JavaFileObject): VirtualFile? = fun toVirtualFile(javaFileObject: JavaFileObject): VirtualFile? =
javaFileObject.toUri().let { uri -> javaFileObject.toUri().let { uri ->
@@ -267,18 +291,23 @@ class JavacWrapper(
} }
} }
fun hasKotlinPackage(fqName: FqName) =
if (kotlinClassifiersCache.hasPackage(fqName)) {
fqName
}
else {
null
}
fun isDeprecatedInJavaDoc(treePath: TreePath) =
(trees.getDocCommentTree(treePath) as? DCTree.DCDocComment)?.comment?.isDeprecated ?: false
private inline fun <reified T> Iterable<T>.toJavacList() = JavacList.from(this) private inline fun <reified T> Iterable<T>.toJavacList() = JavacList.from(this)
private fun findClassInSymbols(fqName: String): SymbolBasedClass? { private fun findClassInSymbols(fqName: String): SymbolBasedClass? =
if (symbolBasedClassesCache.containsKey(fqName)) return symbolBasedClassesCache[fqName] elements.getTypeElement(fqName)?.let { symbol ->
SymbolBasedClass(symbol, this, symbol.classfile)
elements.getTypeElement(fqName)?.let { symbol -> }
SymbolBasedClass(symbol, this, symbol.classfile)
}.let { symbolBasedClass ->
symbolBasedClassesCache[fqName] = symbolBasedClass
return symbolBasedClass
}
}
private fun findPackageInSymbols(fqName: String): SymbolBasedPackage? { private fun findPackageInSymbols(fqName: String): SymbolBasedPackage? {
if (symbolBasedPackagesCache.containsKey(fqName)) return symbolBasedPackagesCache[fqName] if (symbolBasedPackagesCache.containsKey(fqName)) return symbolBasedPackagesCache[fqName]
@@ -322,12 +351,9 @@ class JavacWrapper(
} }
private fun TreeBasedClass.withInnerClasses(): List<TreeBasedClass> =
listOf(this) + innerClasses.values.flatMap { it.withInnerClasses() }
private fun Symbol.PackageSymbol.findClass(name: String): SymbolBasedClass? { private fun Symbol.PackageSymbol.findClass(name: String): SymbolBasedClass? {
val nameParts = name.replace("$", ".").split(".") val nameParts = name.replace("$", ".").split(".")
var symbol = members_field.getElementsByName(names.fromString(nameParts.first())) var symbol = members_field?.getElementsByName(names.fromString(nameParts.first()))
?.firstOrNull() as? Symbol.ClassSymbol ?: return null ?.firstOrNull() as? Symbol.ClassSymbol ?: return null
if (nameParts.size > 1) { if (nameParts.size > 1) {
symbol.complete() symbol.complete()
@@ -18,51 +18,73 @@ package org.jetbrains.kotlin.javac
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.search.SearchScope import com.intellij.psi.search.SearchScope
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.load.java.JavaVisibilities
import org.jetbrains.kotlin.load.java.structure.* import org.jetbrains.kotlin.load.java.structure.*
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
import org.jetbrains.kotlin.javac.wrappers.trees.find
import org.jetbrains.kotlin.javac.wrappers.trees.findInner
import org.jetbrains.kotlin.javac.wrappers.trees.tryToResolveByFqName
import org.jetbrains.kotlin.javac.wrappers.trees.tryToResolveInJavaLang
import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.visibilityModifierType
class KotlinClassifiersCache(sourceFiles: Collection<KtFile>, class KotlinClassifiersCache(sourceFiles: Collection<KtFile>,
private val javac: JavacWrapper) { private val javac: JavacWrapper) {
private val kotlinClasses: Map<FqName?, KtClassOrObject?> = sourceFiles.flatMap { ktFile -> private val kotlinPackages = hashSetOf<FqName>()
ktFile.collectDescendantsOfType<KtClassOrObject>().map { it.fqName to it } + private val kotlinClasses: Map<ClassId?, KtClassOrObject?> =
(ktFile.javaFileFacadeFqName to null) sourceFiles.flatMap { ktFile ->
}.toMap() kotlinPackages.add(ktFile.packageFqName)
ktFile.declarations
.filterIsInstance<KtClassOrObject>()
.map { it.computeClassId() to it }
}.toMap()
private val classifiers = hashMapOf<FqName, JavaClass>() private val classifiers = hashMapOf<ClassId, JavaClass>()
fun getKotlinClassifier(fqName: FqName) = classifiers[fqName] ?: createClassifier(fqName) fun getKotlinClassifier(classId: ClassId) = classifiers[classId] ?: createClassifier(classId)
private fun createClassifier(fqName: FqName): JavaClass? { fun createMockKotlinClassifier(classifier: KtClassOrObject,
if (!kotlinClasses.containsKey(fqName)) return null classId: ClassId) = MockKotlinClassifier(classId,
val kotlinClassifier = kotlinClasses[fqName] ?: return null classifier,
this,
javac)
.apply { classifiers[classId] = this }
return MockKotlinClassifier(fqName, fun hasPackage(packageFqName: FqName) = kotlinPackages.contains(packageFqName)
kotlinClassifier,
kotlinClassifier.typeParameters.isNotEmpty(), private fun createClassifier(classId: ClassId): JavaClass? {
javac) if (classId.isNestedClass) {
.apply { classifiers[fqName] = this } classifiers[classId]?.let { return it }
val pathSegments = classId.relativeClassName.pathSegments().map { it.asString() }
val outerClassId = ClassId(classId.packageFqName, Name.identifier(pathSegments.first()))
var outerClass: JavaClass = kotlinClasses[outerClassId]?.let { createMockKotlinClassifier(it, outerClassId) } ?: return null
pathSegments.drop(1).forEach {
outerClass = outerClass.findInnerClass(Name.identifier(it)) ?: return null
}
return outerClass.apply { classifiers[classId] = this }
}
val kotlinClassifier = kotlinClasses[classId] ?: return null
return createMockKotlinClassifier(kotlinClassifier, classId)
} }
} }
class MockKotlinClassifier(override val fqName: FqName, class MockKotlinClassifier(val classId: ClassId,
private val classOrObject: KtClassOrObject, private val classOrObject: KtClassOrObject,
val hasTypeParameters: Boolean, private val cache: KotlinClassifiersCache,
private val javac: JavacWrapper) : VirtualFileBoundJavaClass { private val javac: JavacWrapper) : VirtualFileBoundJavaClass {
override val fqName: FqName
get() = classId.asSingleFqName()
override val isAbstract: Boolean override val isAbstract: Boolean
get() = throw UnsupportedOperationException("Should not be called") get() = throw UnsupportedOperationException("Should not be called")
@@ -73,32 +95,26 @@ class MockKotlinClassifier(override val fqName: FqName,
get() = throw UnsupportedOperationException("Should not be called") get() = throw UnsupportedOperationException("Should not be called")
override val visibility: Visibility override val visibility: Visibility
get() = throw UnsupportedOperationException("Should not be called") get() = when (classOrObject.visibilityModifierType()) {
null, KtTokens.PUBLIC_KEYWORD -> Visibilities.PUBLIC
KtTokens.PRIVATE_KEYWORD -> Visibilities.PRIVATE
KtTokens.PROTECTED_KEYWORD -> Visibilities.PROTECTED
else -> JavaVisibilities.PACKAGE_VISIBILITY
}
override val typeParameters: List<JavaTypeParameter> override val typeParameters: List<JavaTypeParameter>
get() = throw UnsupportedOperationException("Should not be called") get() = throw UnsupportedOperationException("Should not be called")
override val supertypes: Collection<JavaClassifierType> override val supertypes: Collection<JavaClassifierType>
get() = classOrObject.superTypeListEntries get() = javac.kotlinSupertypeResolver.resolveSupertypes(classOrObject)
.map { superTypeListEntry -> .mapNotNull { javac.getKotlinClassifier(it) ?: javac.findClass(it) }
val userType = superTypeListEntry.typeAsUserType
arrayListOf<String>().apply {
userType?.referencedName?.let { add(it) }
var qualifier = userType?.qualifier
while (qualifier != null) {
qualifier.referencedName?.let { add(it) }
qualifier = qualifier.qualifier
}
}.reversed().joinToString(separator = ".") { it }
}
.mapNotNull { resolveSupertype(it, classOrObject, javac) }
.map { MockKotlinClassifierType(it) } .map { MockKotlinClassifierType(it) }
val innerClasses: Collection<JavaClass> val innerClasses: Collection<JavaClass>
get() = classOrObject.declarations.filterIsInstance<KtClassOrObject>() get() = classOrObject.declarations.filterIsInstance<KtClassOrObject>()
.mapNotNull { nestedClassOrObject -> .mapNotNull { nestedClassOrObject ->
nestedClassOrObject.fqName?.let { nestedClassOrObject.computeClassId()?.let {
javac.getKotlinClassifier(it) cache.createMockKotlinClassifier(nestedClassOrObject, it)
} }
} }
@@ -124,7 +140,13 @@ class MockKotlinClassifier(override val fqName: FqName,
get() = throw UnsupportedOperationException("Should not be called") get() = throw UnsupportedOperationException("Should not be called")
override val fields: Collection<JavaField> override val fields: Collection<JavaField>
get() = throw UnsupportedOperationException("Should not be called") get() = classOrObject.declarations
.filterIsInstance<KtProperty>()
.map(::MockKotlinField) + classOrObject.companionObjects.flatMap {
it.declarations
.filterIsInstance<KtProperty>()
.map(::MockKotlinField)
}
override val constructors: Collection<JavaConstructor> override val constructors: Collection<JavaConstructor>
get() = throw UnsupportedOperationException("Should not be called") get() = throw UnsupportedOperationException("Should not be called")
@@ -149,6 +171,12 @@ class MockKotlinClassifier(override val fqName: FqName,
override fun findInnerClass(name: Name) = override fun findInnerClass(name: Name) =
innerClasses.find { it.name == name } innerClasses.find { it.name == name }
val typeParametersNumber: Int
get() = classOrObject.typeParameters.size
val hasTypeParameters: Boolean
get() = typeParametersNumber > 0
} }
class MockKotlinClassifierType(override val classifier: JavaClassifier) : JavaClassifierType { class MockKotlinClassifierType(override val classifier: JavaClassifier) : JavaClassifierType {
@@ -176,88 +204,39 @@ class MockKotlinClassifierType(override val classifier: JavaClassifier) : JavaCl
} }
private fun resolveSupertype(name: String, class MockKotlinField(private val property: KtProperty) : JavaField {
classOrObject: KtClassOrObject, override val name: Name
javac: JavacWrapper): JavaClass? { get() = property.nameAsSafeName
val nameParts = name.split(".") override val annotations: Collection<JavaAnnotation>
val ktFile = classOrObject.containingKtFile get() = throw UnsupportedOperationException("Should not be called")
override val isDeprecatedInJavaDoc: Boolean
get() = throw UnsupportedOperationException("Should not be called")
override val isAbstract: Boolean
get() = throw UnsupportedOperationException("Should not be called")
override val isStatic: Boolean
get() = throw UnsupportedOperationException("Should not be called")
override val isFinal: Boolean
get() = throw UnsupportedOperationException("Should not be called")
override val visibility: Visibility
get() = throw UnsupportedOperationException("Should not be called")
override val containingClass: JavaClass
get() = throw UnsupportedOperationException("Should not be called")
override val isEnumEntry: Boolean
get() = throw UnsupportedOperationException("Should not be called")
override val type: JavaType
get() = throw UnsupportedOperationException("Should not be called")
override val initializerValue: Any?
get() {
if (!property.hasModifier(KtTokens.CONST_KEYWORD)) return null
val initializer = property.initializer ?: return null
tryToResolveInner(name, classOrObject, javac, nameParts)?.let { return it } return initializer.text.toIntOrNull() ?: initializer.text
ktFile.tryToResolvePackageClass(name, javac, nameParts)?.let { return it } }
tryToResolveByFqName(name, javac)?.let { return it } override val hasConstantNotNullInitializer: Boolean
ktFile.tryToResolveSingleTypeImport(name, javac, nameParts)?.let { return it } get() = throw UnsupportedOperationException("Should not be called")
ktFile.tryToResolveTypeImportOnDemand(name, javac, nameParts)?.let { return it }
tryToResolveInJavaLang(name, javac)?.let { return it }
return null override fun findAnnotation(fqName: FqName) = throw UnsupportedOperationException("Should not be called")
} }
private fun tryToResolveInner(name: String, private fun KtClassOrObject.computeClassId(): ClassId? =
classOrObject: KtClassOrObject, containingClassOrObject?.computeClassId()?.createNestedClassId(nameAsSafeName) ?: fqName?.let { ClassId.topLevel(it) }
javac: JavacWrapper,
nameParts: List<String>) =
classOrObject.containingClassOrObject?.let { containingClass ->
containingClass.fqName?.let {
javac.findClass(it) ?: javac.getKotlinClassifier(it)
}
}?.findInner(name, javac, nameParts)
private fun KtFile.tryToResolvePackageClass(name: String,
javac: JavacWrapper,
nameParts: List<String> = emptyList()): JavaClass? {
return if (nameParts.size > 1) {
find(FqName("${packageFqName.asString()}.${nameParts.first()}"), javac, nameParts)
}
else {
javac.findClass(FqName("${packageFqName.asString()}.$name"))
?: javac.getKotlinClassifier(FqName("${packageFqName.asString()}.$name"))
}
}
private fun KtFile.tryToResolveSingleTypeImport(name: String,
javac: JavacWrapper,
nameParts: List<String> = emptyList()): JavaClass? {
if (nameParts.size > 1) {
val foundImports = importDirectives.filter { it.text.endsWith(".${nameParts.first()}") }
foundImports.forEach { importDirective ->
importDirective.importedFqName?.let { importedFqName ->
find(importedFqName, javac, nameParts)?.let { importedClass ->
return importedClass
}
}
}
return null
}
else {
return importDirectives.find { importDirective ->
importDirective.text.endsWith(".$name")
}?.let { importDirective ->
importDirective.importedFqName?.let { fqName ->
javac.findClass(fqName) ?: javac.getKotlinClassifier(fqName)
}
}
}
}
private fun KtFile.tryToResolveTypeImportOnDemand(name: String,
javac: JavacWrapper,
nameParts: List<String> = emptyList()): JavaClass? {
val packagesWithAsterisk = importDirectives.filter { it.text.endsWith("*") }
if (nameParts.size > 1) {
packagesWithAsterisk.forEach { importDirective ->
find(FqName("${importDirective.importedFqName?.asString()}.${nameParts.first()}"),
javac,
nameParts)?.let { return it }
}
return null
}
else {
packagesWithAsterisk.forEach { importDirective ->
val fqName = "${importDirective.importedFqName?.asString()}.$name".let(::FqName)
javac.findClass(fqName)?.let { return it } ?: javac.getKotlinClassifier(fqName)?.let { return it }
}
return null
}
}
@@ -0,0 +1,24 @@
/*
* Copyright 2010-2017 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.javac
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtClassOrObject
interface KotlinSupertypeResolver {
fun resolveSupertypes(classOrObject: KtClassOrObject): List<ClassId>
}
@@ -31,6 +31,7 @@ import javax.lang.model.element.TypeElement
import javax.lang.model.element.VariableElement import javax.lang.model.element.VariableElement
import javax.lang.model.type.NoType import javax.lang.model.type.NoType
import javax.lang.model.type.TypeKind import javax.lang.model.type.TypeKind
import javax.lang.model.type.TypeMirror
import javax.tools.JavaFileObject import javax.tools.JavaFileObject
class SymbolBasedClass( class SymbolBasedClass(
@@ -61,10 +62,11 @@ class SymbolBasedClass(
get() = FqName(element.qualifiedName.toString()) get() = FqName(element.qualifiedName.toString())
override val supertypes: Collection<JavaClassifierType> override val supertypes: Collection<JavaClassifierType>
get() = element.interfaces.toMutableList() get() = arrayListOf<TypeMirror>()
.apply { .apply {
element.superclass.takeIf { it !is NoType }?.let(this::add) element.superclass.takeIf { it !is NoType }?.let(this::add)
} }
.apply { addAll(element.interfaces) }
.mapTo(arrayListOf()) { SymbolBasedClassifierType(it, javac) } .mapTo(arrayListOf()) { SymbolBasedClassifierType(it, javac) }
.apply { .apply {
if (isEmpty() && element.qualifiedName.toString() != CommonClassNames.JAVA_LANG_OBJECT) { if (isEmpty() && element.qualifiedName.toString() != CommonClassNames.JAVA_LANG_OBJECT) {
@@ -97,9 +99,17 @@ class SymbolBasedClass(
override val methods: Collection<JavaMethod> override val methods: Collection<JavaMethod>
get() = element.enclosedElements get() = element.enclosedElements
.filter { it.kind == ElementKind.METHOD } .filter { it.kind == ElementKind.METHOD && !isEnumValuesOrValueOf(it as ExecutableElement)}
.map { SymbolBasedMethod(it as ExecutableElement, javac) } .map { SymbolBasedMethod(it as ExecutableElement, javac) }
private fun isEnumValuesOrValueOf(method: ExecutableElement): Boolean {
return isEnum && when (method.simpleName.toString()) {
"values" -> method.parameters.isEmpty()
"valueOf" -> method.parameters.let { it.size == 1 && it.first().asType().toString() == "java.lang.String" }
else -> false
}
}
override val fields: Collection<JavaField> override val fields: Collection<JavaField>
get() = element.enclosedElements get() = element.enclosedElements
.filter { it.kind.isField && Name.isValidIdentifier(it.simpleName.toString()) } .filter { it.kind.isField && Name.isValidIdentifier(it.simpleName.toString()) }
@@ -32,7 +32,7 @@ sealed class SymbolBasedAnnotationArgument(
companion object { companion object {
fun create(value: Any, name: Name, javac: JavacWrapper): JavaAnnotationArgument = when (value) { fun create(value: Any, name: Name, javac: JavacWrapper): JavaAnnotationArgument = when (value) {
is AnnotationMirror -> SymbolBasedAnnotationAsAnnotationArgument(value, name, javac) is AnnotationMirror -> SymbolBasedAnnotationAsAnnotationArgument(value, name, javac)
is VariableElement -> SymbolBasedReferenceAnnotationArgument(value, javac) is VariableElement -> SymbolBasedReferenceAnnotationArgument(value, name, javac)
is TypeMirror -> SymbolBasedClassObjectAnnotationArgument(value, name, javac) is TypeMirror -> SymbolBasedClassObjectAnnotationArgument(value, name, javac)
is Collection<*> -> arrayAnnotationArguments(value, name, javac) is Collection<*> -> arrayAnnotationArguments(value, name, javac)
is AnnotationValue -> create(value.value, name, javac) is AnnotationValue -> create(value.value, name, javac)
@@ -59,10 +59,11 @@ class SymbolBasedAnnotationAsAnnotationArgument(
class SymbolBasedReferenceAnnotationArgument( class SymbolBasedReferenceAnnotationArgument(
val element: VariableElement, val element: VariableElement,
name: Name,
javac: JavacWrapper javac: JavacWrapper
) : SymbolBasedAnnotationArgument(Name.identifier(element.simpleName.toString()), javac), JavaEnumValueAnnotationArgument { ) : SymbolBasedAnnotationArgument(name, javac), JavaEnumValueAnnotationArgument {
override val entryName: Name? override val entryName: Name?
get() = Name.identifier(element.simpleName.toString()) get() = Name.identifier(name)
override fun resolve() = SymbolBasedField(element, javac) override fun resolve() = SymbolBasedField(element, javac)
@@ -82,18 +82,29 @@ class SymbolBasedClassifierType<out T : TypeMirror>(
} }
override val typeArguments: List<JavaType> override val typeArguments: List<JavaType>
get() = if (typeMirror.kind == TypeKind.DECLARED) { get() {
(typeMirror as DeclaredType).typeArguments.map { create(it, javac) } if (typeMirror.kind != TypeKind.DECLARED) return emptyList()
}
else { val arguments = arrayListOf<JavaType>()
emptyList() var type = typeMirror as DeclaredType
var staticType = false
while (!staticType) {
if (type.asElement().isStatic) {
staticType = true
} }
arguments.addAll(type.typeArguments.map { create(it, javac) })
type = type.enclosingType as? DeclaredType ?: return arguments
}
return arguments
}
override val isRaw: Boolean override val isRaw: Boolean
get() = when { get() = when {
typeMirror !is DeclaredType -> false typeMirror !is DeclaredType -> false
(typeMirror.asElement() as TypeElement).typeParameters.isEmpty() -> false (typeMirror.asElement() as TypeElement).typeParameters.isEmpty() -> false
else -> typeMirror.typeArguments.isEmpty() else -> typeMirror.typeArguments.isEmpty() || (typeMirror.asElement() as TypeElement).typeParameters.size != typeMirror.typeArguments.size
} }
override val classifierQualifiedName: String override val classifierQualifiedName: String
@@ -62,7 +62,7 @@ internal fun TypeElement.computeClassId(): ClassId? {
internal fun ExecutableElement.valueParameters(javac: JavacWrapper): List<JavaValueParameter> = internal fun ExecutableElement.valueParameters(javac: JavacWrapper): List<JavaValueParameter> =
parameters.mapIndexed { index, parameter -> parameters.mapIndexed { index, parameter ->
SymbolBasedValueParameter(parameter, SymbolBasedValueParameter(parameter,
parameter.simpleName.toString(), if (!parameter.simpleName.contentEquals("arg$index")) parameter.simpleName.toString() else "p$index",
index == parameters.lastIndex && isVarArgs, index == parameters.lastIndex && isVarArgs,
javac) javac)
} }
@@ -0,0 +1,348 @@
/*
* Copyright 2010-2017 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.javac.wrappers.trees
import com.sun.source.tree.Tree
import com.sun.source.util.TreePath
import com.sun.tools.javac.tree.JCTree
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.javac.JavacWrapper
import org.jetbrains.kotlin.javac.MockKotlinClassifier
import org.jetbrains.kotlin.load.java.JavaVisibilities
import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.java.structure.JavaClassifier
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
class ClassifierResolver(private val javac: JavacWrapper) {
private val cache = hashMapOf<Tree, JavaClassifier?>()
private val beingResolved = hashSetOf<Tree>()
fun resolve(treePath: TreePath): JavaClassifier? = with (treePath) {
if (cache.containsKey(leaf)) return cache[leaf]
if (treePath.leaf in beingResolved) return null
beingResolved(treePath.leaf)
return tryToResolve().apply {
cache[leaf] = this
removeBeingResolved(treePath.leaf)
}
}
// to avoid StackOverflow when there are cyclic dependencies
private fun beingResolved(tree: Tree) {
if (tree is JCTree.JCTypeApply) {
beingResolved(tree.clazz)
}
if (tree is JCTree.JCFieldAccess) {
beingResolved.add(tree)
beingResolved(tree.selected)
}
else beingResolved.add(tree)
}
private fun removeBeingResolved(tree: Tree) {
if (tree is JCTree.JCTypeApply) {
beingResolved(tree.clazz)
}
if (tree is JCTree.JCFieldAccess) {
beingResolved.remove(tree)
beingResolved(tree.selected)
}
else beingResolved.remove(tree)
}
private fun pathSegments(path: String): List<String> {
val pathSegments = arrayListOf<String>()
var numberOfBrackets = 0
var builder = StringBuilder()
path.forEach { char ->
when (char) {
'<' -> numberOfBrackets++
'>' -> numberOfBrackets--
'.' -> {
if (numberOfBrackets == 0) {
pathSegments.add(builder.toString())
builder = StringBuilder()
}
}
'@' -> {}
else -> if (numberOfBrackets == 0) builder.append(char)
}
}
return pathSegments.apply { add(builder.toString()) }
}
private fun TreePath.tryToResolve(): JavaClassifier? {
val pathSegments = pathSegments(leaf.toString())
return tryToGetTypeParameterFromMethod()?.let { return it } ?:
createResolutionScope(this).findClass(pathSegments.first(), pathSegments)
}
private fun TreePath.tryToGetTypeParameterFromMethod(): TreeBasedTypeParameter? =
(find { it is JCTree.JCMethodDecl } as? JCTree.JCMethodDecl)
?.typarams?.find { it.name.toString() == leaf.toString() }
?.let {
TreeBasedTypeParameter(it,
javac.getTreePath(it, compilationUnit),
javac)
}
private fun createResolutionScope(treePath: TreePath): Scope = CurrentClassAndInnerScope(javac, treePath)
}
private abstract class Scope(protected val javac: JavacWrapper,
protected val treePath: TreePath) {
abstract val parent: Scope?
abstract fun findClass(name: String, pathSegments: List<String>): JavaClassifier?
protected fun getJavaClassFromPathSegments(javaClass: JavaClass,
pathSegments: List<String>) =
if (pathSegments.size == 1) {
javaClass
}
else {
javaClass.findInnerOrNested(pathSegments.drop(1))
}
protected fun findImport(pathSegments: List<String>): JavaClass? {
pathSegments.forEachIndexed { index, _ ->
if (index == pathSegments.lastIndex) return null
val packageFqName = pathSegments.dropLast(index + 1).joinToString(separator = ".")
findPackage(packageFqName)?.let { pack ->
val className = pathSegments.takeLast(index + 1)
return findJavaOrKotlinClass(ClassId(pack, Name.identifier(className.first())))?.let { javaClass ->
getJavaClassFromPathSegments(javaClass, className)
}
}
}
return null
}
protected fun findJavaOrKotlinClass(classId: ClassId) = javac.findClass(classId) ?: javac.getKotlinClassifier(classId)
protected fun JavaClass.findInnerOrNested(name: Name, checkedSupertypes: HashSet<JavaClass> = hashSetOf()): JavaClass? {
findVisibleInnerOrNestedClass(name)?.let {
checkedSupertypes.addAll(collectAllSupertypes())
return it
}
return supertypes
.mapNotNull {
(it.classifier as? JavaClass)?.let { supertype ->
if (supertype !in checkedSupertypes) {
supertype.findInnerOrNested(name, checkedSupertypes)
} else null
}
}.singleOrNull()
}
protected fun findPackage(packageName: String): FqName? {
val fqName = if (packageName.isNotBlank()) FqName(packageName) else FqName.ROOT
javac.hasKotlinPackage(fqName)?.let { return it }
return javac.findPackage(fqName)?.fqName
}
private fun JavaClass.findVisibleInnerOrNestedClass(name: Name) = findInnerClass(name)?.let { innerOrNestedClass ->
when (innerOrNestedClass.visibility) {
Visibilities.PRIVATE -> null
JavaVisibilities.PACKAGE_VISIBILITY -> {
val classId = (innerOrNestedClass as? MockKotlinClassifier)?.classId ?: innerOrNestedClass.computeClassId()
if (classId?.packageFqName?.asString() == (treePath.compilationUnit.packageName?.toString() ?: "")) innerOrNestedClass else null
}
else -> innerOrNestedClass
}
}
private fun JavaClass.collectAllSupertypes(): Set<JavaClass> =
hashSetOf(this).apply {
supertypes.mapNotNull { it.classifier as? JavaClass }.forEach { addAll(it.collectAllSupertypes()) }
}
private fun JavaClass.findInnerOrNested(pathSegments: List<String>): JavaClass? =
pathSegments.fold(this) { javaClass, it -> javaClass.findInnerOrNested(Name.identifier(it)) ?: return null }
}
private class GlobalScope(javac: JavacWrapper, treePath: TreePath) : Scope(javac, treePath) {
override val parent: Scope?
get() = null
override fun findClass(name: String, pathSegments: List<String>): JavaClass? {
findByFqName(pathSegments)?.let { return it }
return findJavaOrKotlinClass(classId("java.lang", name))?.let { javaClass ->
getJavaClassFromPathSegments(javaClass, pathSegments)
}
}
private fun findByFqName(pathSegments: List<String>): JavaClass? {
pathSegments.forEachIndexed { index, _ ->
if (index != 0) {
val packageFqName = pathSegments.take(index).joinToString(separator = ".")
findPackage(packageFqName)?.let { pack ->
val className = pathSegments.drop(index)
findJavaOrKotlinClass(ClassId(pack, Name.identifier(className.first())))?.let { javaClass ->
return getJavaClassFromPathSegments(javaClass, className)
}
}
}
}
// try to find in <root>
return findJavaOrKotlinClass(classId("", pathSegments.first()))?.let { javaClass ->
getJavaClassFromPathSegments(javaClass, pathSegments)
}
}
}
private class ImportOnDemandScope(javac: JavacWrapper,
treePath: TreePath) : Scope(javac, treePath) {
override val parent: Scope
get() = GlobalScope(javac, treePath)
override fun findClass(name: String, pathSegments: List<String>): JavaClassifier? {
asteriskImports()
.mapNotNullTo(hashSetOf()) { findImport("$it$name".split(".")) }
.takeIf { it.isNotEmpty() }
?.let {
return it.singleOrNull()?.let { javaClass ->
getJavaClassFromPathSegments(javaClass, pathSegments)
}
}
return parent.findClass(name, pathSegments)
}
private fun asteriskImports() =
treePath.compilationUnit.imports
.mapNotNull {
val fqName = it.qualifiedIdentifier.toString()
if (fqName.endsWith("*")) {
fqName.dropLast(1)
}
else null
}
}
private class PackageScope(javac: JavacWrapper,
treePath: TreePath) : Scope(javac, treePath) {
override val parent: Scope
get() = ImportOnDemandScope(javac, treePath)
override fun findClass(name: String, pathSegments: List<String>): JavaClassifier? {
findJavaOrKotlinClass(classId(treePath.compilationUnit.packageName?.toString() ?: "", name))
?.let { javaClass ->
return getJavaClassFromPathSegments(javaClass, pathSegments)
}
return parent.findClass(name, pathSegments)
}
}
private class SingleTypeImportScope(javac: JavacWrapper,
treePath: TreePath) : Scope(javac, treePath) {
override val parent: Scope
get() = PackageScope(javac, treePath)
override fun findClass(name: String, pathSegments: List<String>): JavaClassifier? {
val imports = imports(name).toSet().takeIf { it.isNotEmpty() }
?: return parent.findClass(name, pathSegments)
imports.singleOrNull() ?: return null
return findImport(imports.first().split("."))
?.let { javaClass -> getJavaClassFromPathSegments(javaClass, pathSegments) }
}
private fun imports(firstSegment: String) =
(treePath.compilationUnit as JCTree.JCCompilationUnit).imports
.mapNotNull {
val fqName = it.qualifiedIdentifier.toString()
if (fqName.endsWith(".$firstSegment")) {
fqName
}
else null
}
}
private class CurrentClassAndInnerScope(javac: JavacWrapper,
treePath: TreePath) : Scope(javac, treePath) {
override val parent: Scope
get() = SingleTypeImportScope(javac, treePath)
override fun findClass(name: String, pathSegments: List<String>): JavaClassifier? {
val identifier = Name.identifier(name)
treePath.enclosingClasses.forEach {
(it as? TreeBasedClass)?.typeParameters
?.find { typeParameter -> typeParameter.name == identifier }
?.let { typeParameter -> return typeParameter }
it.findInnerOrNested(identifier)?.let { javaClass -> return getJavaClassFromPathSegments(javaClass, pathSegments) }
if (it.name == identifier && pathSegments.size == 1) return it
}
return parent.findClass(name, pathSegments)
}
private val TreePath.enclosingClasses: List<JavaClass>
get() {
val outerClasses = filterIsInstance<JCTree.JCClassDecl>()
.dropWhile { it.extending == leaf || leaf in it.implementing }
.asReversed()
.map { it.simpleName.toString() }
val packageName = compilationUnit.packageName?.toString() ?: ""
val outermostClassName = outerClasses.firstOrNull() ?: return emptyList()
val outermostClassId = classId(packageName, outermostClassName)
var outermostClass = javac.findClass(outermostClassId) ?: return emptyList()
val classes = arrayListOf<JavaClass>()
classes.add(outermostClass)
for (it in outerClasses.drop(1)) {
outermostClass = outermostClass.findInnerClass(Name.identifier(it))
?: throw AssertionError("Couldn't find a class ($it) that is surely defined in ${outermostClass.fqName?.asString()}")
classes.add(outermostClass)
}
return classes.reversed()
}
}
fun classId(packageName: String = "", className: String) = ClassId(FqName(packageName), Name.identifier(className))
@@ -16,38 +16,137 @@
package org.jetbrains.kotlin.javac.wrappers.trees package org.jetbrains.kotlin.javac.wrappers.trees
import com.sun.source.tree.CompilationUnitTree
import com.sun.source.util.TreePath import com.sun.source.util.TreePath
import com.sun.tools.javac.tree.JCTree import com.sun.tools.javac.tree.JCTree
import org.jetbrains.kotlin.javac.JavacWrapper import org.jetbrains.kotlin.javac.JavacWrapper
import org.jetbrains.kotlin.load.java.structure.JavaAnnotation import org.jetbrains.kotlin.load.java.structure.*
import org.jetbrains.kotlin.load.java.structure.JavaAnnotationArgument
import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.java.structure.JavaElement
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class TreeBasedAnnotation( class TreeBasedAnnotation(
private val annotation: JCTree.JCAnnotation, val annotation: JCTree.JCAnnotation,
private val compilationUnit: CompilationUnitTree, val treePath: TreePath,
private val javac: JavacWrapper val javac: JavacWrapper
) : JavaElement, JavaAnnotation { ) : JavaElement, JavaAnnotation {
constructor(
annotation: JCTree.JCAnnotation,
treePath: TreePath,
javac: JavacWrapper
) : this(annotation, treePath.compilationUnit, javac)
override val arguments: Collection<JavaAnnotationArgument> override val arguments: Collection<JavaAnnotationArgument>
get() = annotation.arguments.map { TreeBasedAnnotationArgument(Name.identifier(it.toString())) } get() = createAnnotationArguments(this, javac)
override val classId: ClassId? override val classId: ClassId?
get() = resolve()?.computeClassId() get() = resolve()?.computeClassId() ?: ClassId.topLevel(FqName(annotation.annotationType.toString().substringAfter("@")))
override fun resolve() = override fun resolve() =
javac.resolve(TreePath.getPath(compilationUnit, annotation.annotationType)) as? JavaClass javac.resolve(TreePath.getPath(treePath.compilationUnit, annotation.annotationType)) as? JavaClass
} }
class TreeBasedAnnotationArgument(override val name: Name) : JavaAnnotationArgument, JavaElement sealed class TreeBasedAnnotationArgument(override val name: Name,
val javac: JavacWrapper) : JavaAnnotationArgument, JavaElement
class TreeBasedLiteralAnnotationArgument(name: Name,
override val value: Any?,
javac: JavacWrapper) : TreeBasedAnnotationArgument(name, javac), JavaLiteralAnnotationArgument
class TreeBasedReferenceAnnotationArgument(name: Name,
private val treePath: TreePath,
private val field: JCTree.JCFieldAccess,
javac: JavacWrapper) : TreeBasedAnnotationArgument(name, javac), JavaEnumValueAnnotationArgument {
override fun resolve(): JavaField? {
val newTreePath = javac.getTreePath(field.selected, treePath.compilationUnit)
val javaClass = javac.resolve(newTreePath) as? JavaClass ?: return null
val fieldName = field.name.toString().let { Name.identifier(it) }
return javaClass.fields.find { it.name == fieldName }
}
}
class TreeBasedArrayAnnotationArgument(val args: List<JavaAnnotationArgument>,
name: Name,
javac: JavacWrapper): TreeBasedAnnotationArgument(name, javac), JavaArrayAnnotationArgument {
override fun getElements() = args
}
class TreeBasedJavaClassObjectAnnotationArgument(private val type: JCTree.JCExpression,
name: Name,
private val treePath: TreePath,
javac: JavacWrapper): TreeBasedAnnotationArgument(name, javac), JavaClassObjectAnnotationArgument {
override fun getReferencedType(): JavaType =
TreeBasedType.create(type, javac.getTreePath(type, treePath.compilationUnit), javac, emptyList())
}
class TreeBasedAnnotationAsAnnotationArgument(private val annotation: JCTree.JCAnnotation,
name: Name,
private val treePath: TreePath,
javac: JavacWrapper): TreeBasedAnnotationArgument(name, javac), JavaAnnotationAsAnnotationArgument {
override fun getAnnotation(): JavaAnnotation =
TreeBasedAnnotation(annotation, javac.getTreePath(annotation, treePath.compilationUnit), javac )
}
private fun createAnnotationArguments(annotation: TreeBasedAnnotation,
javac: JavacWrapper): Collection<JavaAnnotationArgument> {
val arguments = annotation.annotation.arguments
val javaClass = annotation.resolve() ?: return emptyList()
val methods = javaClass.methods
if (arguments.size != methods.size) return emptyList()
return methods.mapIndexedNotNull { index, it ->
createAnnotationArgument(arguments[index], it.name, annotation.treePath, javac, annotation)
}
}
private fun createAnnotationArgument(argument: JCTree.JCExpression,
name: Name,
treePath: TreePath,
javac: JavacWrapper,
annotation: TreeBasedAnnotation): JavaAnnotationArgument? =
when (argument) {
is JCTree.JCLiteral -> TreeBasedLiteralAnnotationArgument(name, argument.value, javac)
is JCTree.JCFieldAccess -> {
if (argument.name.contentEquals("class")) {
TreeBasedJavaClassObjectAnnotationArgument(argument.selected, name, treePath, javac)
} else {
TreeBasedReferenceAnnotationArgument(name, treePath, argument, javac)
}
}
is JCTree.JCAssign -> createAnnotationArgument(argument.rhs, name, treePath, javac, annotation)
is JCTree.JCNewArray -> arrayAnnotationArguments(argument.elems, name, treePath, javac, annotation)
is JCTree.JCAnnotation -> TreeBasedAnnotationAsAnnotationArgument(argument, name, treePath, javac)
is JCTree.JCParens -> createAnnotationArgument(argument.expr, name, treePath, javac, annotation)
is JCTree.JCBinary -> resolveArgumentValue(argument, annotation, name, treePath, javac)
is JCTree.JCUnary -> resolveArgumentValue(argument, annotation, name, treePath, javac)
else -> null
}
private fun resolveArgumentValue(argument: JCTree.JCExpression,
annotation: TreeBasedAnnotation,
name: Name,
treePath: TreePath,
javac: JavacWrapper): JavaAnnotationArgument? {
val containingAnnotation = annotation.resolve()
val type = containingAnnotation?.methods?.find { it.name == name }?.returnType ?: return null
val calculator = ValueCalculator(containingAnnotation, javac, treePath, type)
return calculator.getValue(argument)?.let { TreeBasedLiteralAnnotationArgument(name, it, javac) }
}
private fun arrayAnnotationArguments(values: List<JCTree.JCExpression>,
name: Name,
treePath: TreePath,
javac: JavacWrapper,
annotation: TreeBasedAnnotation): JavaArrayAnnotationArgument =
values.mapNotNull {
if (it is JCTree.JCNewArray) {
arrayAnnotationArguments(it.elems, name, treePath, javac, annotation)
}
else {
createAnnotationArgument(it, name, treePath, javac, annotation)
}
}.let { TreeBasedArrayAnnotationArgument(it, name, javac) }
@@ -50,54 +50,52 @@ class TreeBasedClass(
annotations.find { it.classId?.asSingleFqName() == fqName } annotations.find { it.classId?.asSingleFqName() == fqName }
override val isDeprecatedInJavaDoc: Boolean override val isDeprecatedInJavaDoc: Boolean
get() = false get() = javac.isDeprecatedInJavaDoc(treePath)
override val isAbstract: Boolean override val isAbstract: Boolean
get() = tree.modifiers.isAbstract || (isAnnotationType && methods.any { it.isAbstract }) get() = tree.modifiers.isAbstract || ((isAnnotationType || isEnum) && methods.any { it.isAbstract })
override val isStatic: Boolean override val isStatic: Boolean
get() = (outerClass?.isInterface ?: false) || tree.modifiers.isStatic get() = isEnum || isInterface || (outerClass?.isInterface ?: false) || tree.modifiers.isStatic
override val isFinal: Boolean override val isFinal: Boolean
get() = tree.modifiers.isFinal get() = isEnum || tree.modifiers.isFinal
override val visibility: Visibility override val visibility: Visibility
get() = if (outerClass?.isInterface ?: false) PUBLIC else tree.modifiers.visibility get() = if (outerClass?.isInterface == true) PUBLIC else tree.modifiers.visibility
override val typeParameters: List<JavaTypeParameter> override val typeParameters: List<JavaTypeParameter>
get() = tree.typeParameters.map { parameter -> get() = tree.typeParameters.map { parameter ->
TreeBasedTypeParameter(parameter, TreePath(treePath, parameter), javac) TreeBasedTypeParameter(parameter, TreePath(treePath, parameter), javac)
} }
override val fqName: FqName = override val fqName: FqName
treePath.reversed() get() = treePath.reversed()
.filterIsInstance<JCTree.JCClassDecl>() .filterIsInstance<JCTree.JCClassDecl>()
.joinToString( .joinToString(
separator = ".", separator = ".",
prefix = "${treePath.compilationUnit.packageName}.", transform = JCTree.JCClassDecl::name
transform = JCTree.JCClassDecl::name )
) .let { treePath.compilationUnit.packageName?.let { packageName -> FqName("$packageName.$it") } ?: FqName.topLevel(Name.identifier(it))}
.let(::FqName)
override val supertypes: Collection<JavaClassifierType> override val supertypes: Collection<JavaClassifierType>
get() = arrayListOf<JavaClassifierType>().apply { get() = arrayListOf<JavaClassifierType>().also { list ->
fun JCTree.mapToJavaClassifierType() = when {
this is JCTree.JCTypeApply -> TreeBasedGenericClassifierType(this, TreePath(treePath, this), javac)
this is JCTree.JCExpression -> TreeBasedNonGenericClassifierType(this, TreePath(treePath, this), javac)
else -> null
}
if (isEnum) { if (isEnum) {
javac.JAVA_LANG_ENUM?.let(this::add) createEnumSupertype(this, javac).let { list.add(it) }
} else if (isAnnotationType) { } else if (isAnnotationType) {
javac.JAVA_LANG_ANNOTATION_ANNOTATION?.let(this::add) javac.JAVA_LANG_ANNOTATION_ANNOTATION?.let { list.add(it) }
} }
tree.implementing?.mapNotNull { it.mapToJavaClassifierType() }?.let(this::addAll) tree.extending?.let {
tree.extending?.let { it.mapToJavaClassifierType()?.let(this::add) } (TreeBasedType.create(it, javac.getTreePath(it, treePath.compilationUnit), javac, emptyList()) as? JavaClassifierType)
?.let { list.add(it) }
}
tree.implementing?.mapNotNull {
TreeBasedType.create(it, javac.getTreePath(it, treePath.compilationUnit), javac, emptyList()) as? JavaClassifierType
}?.let { list.addAll(it) }
if (isEmpty()) { if (list.isEmpty()) {
javac.JAVA_LANG_OBJECT?.let(this::add) javac.JAVA_LANG_OBJECT?.let { list.add(it) }
} }
} }
@@ -155,3 +153,44 @@ class TreeBasedClass(
override fun findInnerClass(name: Name) = innerClasses[name] override fun findInnerClass(name: Name) = innerClasses[name]
} }
private fun createEnumSupertype(javaClass: JavaClass,
javac: JavacWrapper) = object : JavaClassifierType {
override val classifier: JavaClassifier?
get() = javac.JAVA_LANG_ENUM
override val typeArguments: List<JavaType>
get() = listOf(TypeArgument())
override val isRaw: Boolean
get() = false
override val annotations: Collection<JavaAnnotation>
get() = emptyList()
override val classifierQualifiedName: String
get() = (classifier as? JavaClass)?.fqName?.asString() ?: ""
override val presentableText: String
get() = classifierQualifiedName
override val isDeprecatedInJavaDoc: Boolean
get() = false
override fun findAnnotation(fqName: FqName) = null
private inner class TypeArgument : JavaClassifierType {
override val classifier: JavaClassifier?
get() = javaClass
override val typeArguments: List<JavaType>
get() = emptyList()
override val isRaw: Boolean
get() = false
override val annotations: Collection<JavaAnnotation>
get() = emptyList()
override val classifierQualifiedName: String
get() = javaClass.fqName!!.asString()
override val presentableText: String
get() = classifierQualifiedName
override val isDeprecatedInJavaDoc: Boolean
get() = false
override fun findAnnotation(fqName: FqName) = null
}
}
@@ -18,12 +18,15 @@ package org.jetbrains.kotlin.javac.wrappers.trees
import com.sun.source.util.TreePath import com.sun.source.util.TreePath
import com.sun.tools.javac.code.Flags import com.sun.tools.javac.code.Flags
import com.sun.tools.javac.code.TypeTag
import com.sun.tools.javac.tree.JCTree import com.sun.tools.javac.tree.JCTree
import org.jetbrains.kotlin.builtins.PrimitiveType
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.javac.JavacWrapper import org.jetbrains.kotlin.javac.JavacWrapper
import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.java.structure.JavaField import org.jetbrains.kotlin.load.java.structure.JavaField
import org.jetbrains.kotlin.load.java.structure.JavaPrimitiveType
import org.jetbrains.kotlin.load.java.structure.JavaType import org.jetbrains.kotlin.load.java.structure.JavaType
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -53,19 +56,16 @@ class TreeBasedField(
get() = tree.modifiers.flags and Flags.ENUM.toLong() != 0L get() = tree.modifiers.flags and Flags.ENUM.toLong() != 0L
override val type: JavaType override val type: JavaType
get() = TreeBasedType.create(tree.getType(), treePath, javac) get() = TreeBasedType.create(tree.getType(), treePath, javac, annotations)
override val initializerValue: Any? override val initializerValue: Any?
get() = tree.init?.let { initExpr -> get() = tree.init?.let { initExpr ->
if (hasConstantNotNullInitializer && initExpr is JCTree.JCLiteral) { if (hasConstantNotNullInitializer) ValueCalculator(containingClass, javac, treePath, type).getValue(initExpr) else null
initExpr.value
} else {
null
}
} }
override val hasConstantNotNullInitializer: Boolean override val hasConstantNotNullInitializer: Boolean
get() = tree.init?.let { get() = tree.init?.let {
if (it is JCTree.JCLiteral && it.value == null) return false
val type = this.type val type = this.type
isFinal && ((type is TreeBasedPrimitiveType) || isFinal && ((type is TreeBasedPrimitiveType) ||
@@ -74,3 +74,103 @@ class TreeBasedField(
} ?: false } ?: false
} }
class ValueCalculator(private val containingClass: JavaClass,
private val javac: JavacWrapper,
private val treePath: TreePath,
private val type: JavaType) {
fun getValue(expr: JCTree.JCExpression): Any? {
return when (expr) {
is JCTree.JCLiteral -> {
if (expr.typetag == TypeTag.BOOLEAN) {
expr.value != 0
}
else expr.value
}
is JCTree.JCIdent -> containingClass.fields
.find { it.name == expr.name.toString().let { Name.identifier(it) } }
?.initializerValue
is JCTree.JCFieldAccess -> fieldAccessValue(expr)
is JCTree.JCBinary -> binaryInitializerValue(expr)
is JCTree.JCParens -> getValue(expr.expr)
is JCTree.JCUnary -> unaryInitializerValue(expr)
else -> null
}
}
private fun fieldAccessValue(value: JCTree.JCFieldAccess): Any? {
val newTreePath = javac.getTreePath(value.selected, treePath.compilationUnit)
val javaClass = javac.resolve(newTreePath) as? JavaClass ?: return null
val fieldName = value.name.toString().let { Name.identifier(it) }
return javaClass.fields
.find { it.name == fieldName }
?.initializerValue
}
private fun unaryInitializerValue(value: JCTree.JCUnary): Any? {
val argValue = getValue(value.arg)
return when (value.tag) {
JCTree.Tag.COMPL -> (argValue as? Int)?.inv()
JCTree.Tag.NOT -> (argValue as? Boolean)?.let { !it }
else -> null
}
}
private fun binaryInitializerValue(value: JCTree.JCBinary): Any? {
val lhsValue = getValue(value.lhs) ?: return null
val rhsValue = getValue(value.rhs) ?: return null
return calculateValue(lhsValue, rhsValue, value.tag)
}
private fun calculateValue(lhsValue: Any?, rhsValue: Any?, opcode: JCTree.Tag): Any? {
if (lhsValue is String && opcode == JCTree.Tag.PLUS) return lhsValue + rhsValue
if (lhsValue is Boolean && rhsValue is Boolean) {
return when (opcode) {
JCTree.Tag.AND -> lhsValue && rhsValue
JCTree.Tag.OR -> lhsValue || rhsValue
JCTree.Tag.EQ -> lhsValue == rhsValue
JCTree.Tag.NE -> lhsValue != rhsValue
else -> null
}
}
val l = (lhsValue as? Number)?.toInt() ?: return null
val r = (rhsValue as? Number)?.toInt() ?: return null
return when (opcode) {
JCTree.Tag.PLUS -> getExpressionType(l + r)
JCTree.Tag.MINUS -> getExpressionType(l - r)
JCTree.Tag.MUL -> getExpressionType(l * r)
JCTree.Tag.DIV -> getExpressionType(l / r)
JCTree.Tag.MOD -> getExpressionType(l % r)
JCTree.Tag.SR -> getExpressionType(l shr r)
JCTree.Tag.SL -> getExpressionType(l shl r)
JCTree.Tag.BITAND -> getExpressionType(l and r)
JCTree.Tag.BITOR -> getExpressionType(l or r)
JCTree.Tag.BITXOR -> getExpressionType(l xor r)
JCTree.Tag.USR -> getExpressionType(l ushr r)
JCTree.Tag.EQ -> l == r
JCTree.Tag.NE -> l != r
JCTree.Tag.LT -> l < r
JCTree.Tag.LE -> l <= r
JCTree.Tag.GT -> l > r
JCTree.Tag.GE -> l >= r
else -> null
}
}
private fun getExpressionType(expression: Int): Any? {
val type = type as? JavaPrimitiveType ?: return null
return when (type.type) {
PrimitiveType.DOUBLE -> expression.toDouble()
PrimitiveType.INT -> expression
PrimitiveType.FLOAT -> expression.toFloat()
PrimitiveType.LONG -> expression.toLong()
PrimitiveType.SHORT -> expression.toShort()
PrimitiveType.BYTE -> expression.toByte()
else -> null
}
}
}
@@ -32,7 +32,7 @@ abstract class TreeBasedMember<out T : JCTree>(
) : TreeBasedElement<T>(tree, treePath, javac), JavaMember { ) : TreeBasedElement<T>(tree, treePath, javac), JavaMember {
override val isDeprecatedInJavaDoc: Boolean override val isDeprecatedInJavaDoc: Boolean
get() = false get() = javac.isDeprecatedInJavaDoc(treePath)
override val annotations: Collection<JavaAnnotation> by lazy { override val annotations: Collection<JavaAnnotation> by lazy {
tree.annotations().map { TreeBasedAnnotation(it, treePath, javac) } tree.annotations().map { TreeBasedAnnotation(it, treePath, javac) }
@@ -53,7 +53,7 @@ class TreeBasedMethod(
get() = tree.parameters.map { TreeBasedValueParameter(it, TreePath(treePath, it), javac) } get() = tree.parameters.map { TreeBasedValueParameter(it, TreePath(treePath, it), javac) }
override val returnType: JavaType override val returnType: JavaType
get() = TreeBasedType.create(tree.returnType, treePath, javac) get() = TreeBasedType.create(tree.returnType, treePath, javac, annotations)
override val hasAnnotationParameterDefaultValue: Boolean override val hasAnnotationParameterDefaultValue: Boolean
get() = tree.defaultValue != null get() = tree.defaultValue != null
@@ -42,15 +42,22 @@ class TreeBasedTypeParameter(
annotations.firstOrNull { it.classId?.asSingleFqName() == fqName } annotations.firstOrNull { it.classId?.asSingleFqName() == fqName }
override val isDeprecatedInJavaDoc: Boolean override val isDeprecatedInJavaDoc: Boolean
get() = false get() = javac.isDeprecatedInJavaDoc(treePath)
override val upperBounds: Collection<JavaClassifierType> override val upperBounds: Collection<JavaClassifierType>
get() = tree.bounds.mapNotNull { get() = tree.bounds.mapNotNull {
when (it) { TreeBasedType.create(it, TreePath(treePath, it), javac, emptyList()) as? JavaClassifierType
is JCTree.JCTypeApply -> TreeBasedGenericClassifierType(it, TreePath(treePath, it), javac)
is JCTree.JCIdent -> TreeBasedNonGenericClassifierType(it, TreePath(treePath, it), javac)
else -> null
}
} }
override fun equals(other: Any?): Boolean {
if (other !is TreeBasedTypeParameter) return false
return other.name == name && other.upperBounds == upperBounds
}
override fun hashCode(): Int {
var result = name.hashCode()
upperBounds.forEach { result = 37 * result + it.hashCode() }
return result
}
} }
@@ -40,13 +40,13 @@ class TreeBasedValueParameter(
annotations.find { it.classId?.asSingleFqName() == fqName } annotations.find { it.classId?.asSingleFqName() == fqName }
override val isDeprecatedInJavaDoc: Boolean override val isDeprecatedInJavaDoc: Boolean
get() = false get() = javac.isDeprecatedInJavaDoc(treePath)
override val name: Name override val name: Name
get() = Name.identifier(tree.name.toString()) get() = Name.identifier(tree.name.toString())
override val type: JavaType override val type: JavaType
get() = TreeBasedType.create(tree.getType(), treePath, javac) get() = TreeBasedType.create(tree.getType(), treePath, javac, annotations)
override val isVararg: Boolean override val isVararg: Boolean
get() = tree.modifiers.flags and Flags.VARARGS != 0L get() = tree.modifiers.flags and Flags.VARARGS != 0L
@@ -1,193 +0,0 @@
/*
* Copyright 2010-2017 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.javac.wrappers.trees
import com.sun.source.tree.Tree
import com.sun.source.util.TreePath
import com.sun.tools.javac.tree.JCTree
import org.jetbrains.kotlin.javac.JavacWrapper
import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.java.structure.JavaClassifier
import org.jetbrains.kotlin.name.FqName
class TreePathResolverCache(private val javac: JavacWrapper) {
private val cache = hashMapOf<Tree, JavaClassifier?>()
fun resolve(treePath: TreePath): JavaClassifier? = with(treePath) {
if (cache.containsKey(leaf)) return cache[leaf]
return tryToGetClassifier().apply { cache[leaf] = this }
}
private fun TreePath.tryToGetClassifier(): JavaClassifier? {
val name = leaf.toString().substringBefore("<").substringAfter("@")
val nameParts = name.split(".")
with(compilationUnit as JCTree.JCCompilationUnit) {
tryToResolveInner(name, javac, nameParts)?.let { return it }
tryToResolvePackageClass(name, javac, nameParts)?.let { return it }
tryToResolveByFqName(name, javac)?.let { return it }
tryToResolveSingleTypeImport(name, javac, nameParts)?.let { return it }
tryToResolveTypeImportOnDemand(name, javac, nameParts)?.let { return it }
tryToResolveInJavaLang(name, javac)?.let { return it }
}
return tryToResolveTypeParameter(javac)
}
private fun TreePath.tryToResolveInner(
name: String,
javac: JavacWrapper,
nameParts: List<String> = emptyList()
): JavaClass? = findEnclosingClasses(javac)?.forEach { javaClass ->
javaClass.findInner(name, javac, nameParts)?.let { inner -> return inner }
}.let { return null }
private fun TreePath.findEnclosingClasses(javac: JavacWrapper) =
filterIsInstance<JCTree.JCClassDecl>()
.filter { it.extending != leaf && !it.implementing.contains(leaf) }
.reversed()
.joinToString(separator = ".", prefix = "${compilationUnit.packageName}.") { it.simpleName }
.let { javac.findClass(FqName(it)) }
?.let {
arrayListOf(it).apply {
var enclosingClass = it.outerClass
while (enclosingClass != null) {
add(enclosingClass)
enclosingClass = enclosingClass.outerClass
}
}
}
private fun JCTree.JCCompilationUnit.tryToResolveSingleTypeImport(
name: String,
javac: JavacWrapper,
nameParts: List<String> = emptyList()
): JavaClass? {
nameParts.size.takeIf { it > 1 }?.let {
imports.filter { it.qualifiedIdentifier.toString().endsWith(".${nameParts.first()}") }
.forEach { import ->
find(FqName("${import.qualifiedIdentifier}"), javac, nameParts)?.let { javaClass ->
return javaClass
}
}
.let { return null }
}
return imports
.find { it.qualifiedIdentifier.toString().endsWith(".$name") }
?.let { import ->
FqName(import.qualifiedIdentifier.toString()).let { fqName ->
javac.findClass(fqName) ?: javac.getKotlinClassifier(fqName)
}
}
}
private fun JCTree.JCCompilationUnit.tryToResolvePackageClass(
name: String,
javac: JavacWrapper,
nameParts: List<String> = emptyList()
): JavaClass? {
return nameParts.size.takeIf { it > 1 }?.let {
find(FqName("$packageName.${nameParts.first()}"), javac, nameParts)
}
?: javac.findClass(FqName("$packageName.$name"))
?: javac.getKotlinClassifier(FqName("$packageName.$name"))
}
private fun JCTree.JCCompilationUnit.tryToResolveTypeImportOnDemand(
name: String,
javac: JavacWrapper,
nameParts: List<String> = emptyList()
): JavaClass? {
with(imports.filter { it.qualifiedIdentifier.toString().endsWith("*") }) {
nameParts.size.takeIf { it > 1 }
?.let {
forEach { pack ->
find(FqName("${pack.qualifiedIdentifier.toString().substringBefore("*")}${nameParts.first()}"),
javac,
nameParts)?.let { return it }
}.let { return null }
}
this.forEach {
val fqName = "${it.qualifiedIdentifier.toString().substringBefore("*")}$name".let(::FqName)
(javac.findClass(fqName) ?: javac.getKotlinClassifier(fqName))?.let { return it }
}.let { return null }
}
}
private fun TreePath.tryToResolveTypeParameter(javac: JavacWrapper) =
flatMap {
when (it) {
is JCTree.JCClassDecl -> it.typarams
is JCTree.JCMethodDecl -> it.typarams
else -> emptyList<JCTree.JCTypeParameter>()
}
}
.find { it.toString().substringBefore(" ") == leaf.toString() }
?.let {
TreeBasedTypeParameter(it,
javac.getTreePath(it, compilationUnit),
javac)
}
}
fun JavaClass.findInner(name: String,
javac: JavacWrapper,
nameParts: List<String> = emptyList()) : JavaClass? {
nameParts.size.takeIf { it > 1 }?.let {
return find(FqName("${fqName!!.asString()}.${nameParts[0]}"), javac, nameParts)
}
if (name == this.fqName?.shortName()?.asString()) return this
with(FqName("${fqName!!.asString()}.$name")) {
javac.findClass(this)?.let { return it }
javac.getKotlinClassifier(this)?.let { return it }
}
supertypes.mapNotNull { it.classifier as? JavaClass }
.forEach { javaClass ->
javaClass.findInner(name, javac)?.let { inner -> return inner }
}.let { return null }
}
fun tryToResolveByFqName(name: String,
javac: JavacWrapper) = with(FqName(name)) {
javac.findClass(this) ?: javac.getKotlinClassifier(this)
}
fun tryToResolveInJavaLang(name: String,
javac: JavacWrapper) = javac.findClass(FqName("java.lang.$name"))
fun find(fqName: FqName,
javac: JavacWrapper,
nameParts: List<String>): JavaClass? {
val initial = with(fqName) {
javac.findClass(this)
?: javac.getKotlinClassifier(this)
?: return null
}
nameParts.drop(1).fold(initial) {
javaClass, namePart -> javaClass.findInner(namePart, javac) ?: return null
}.let { return it }
}
@@ -30,23 +30,31 @@ import javax.lang.model.type.TypeKind
abstract class TreeBasedType<out T : JCTree>( abstract class TreeBasedType<out T : JCTree>(
val tree: T, val tree: T,
val treePath: TreePath, val treePath: TreePath,
val javac: JavacWrapper val javac: JavacWrapper,
override val annotations: Collection<JavaAnnotation>
) : JavaType, JavaAnnotationOwner { ) : JavaType, JavaAnnotationOwner {
companion object { companion object {
fun <Type : JCTree> create(tree: Type, treePath: TreePath, javac: JavacWrapper) = when (tree) { fun create(tree: JCTree, treePath: TreePath,
is JCTree.JCPrimitiveTypeTree -> TreeBasedPrimitiveType(tree, TreePath(treePath, tree), javac) javac: JavacWrapper, annotations: Collection<JavaAnnotation>): JavaType {
is JCTree.JCArrayTypeTree -> TreeBasedArrayType(tree, TreePath(treePath, tree), javac) val applicableAnnotations = annotations.filterTypeAnnotations()
is JCTree.JCWildcard -> TreeBasedWildcardType(tree, TreePath(treePath, tree), javac) return when (tree) {
is JCTree.JCTypeApply -> TreeBasedGenericClassifierType(tree, TreePath(treePath, tree), javac) is JCTree.JCPrimitiveTypeTree -> TreeBasedPrimitiveType(tree, javac.getTreePath(tree, treePath.compilationUnit), javac, applicableAnnotations)
is JCTree.JCExpression -> TreeBasedNonGenericClassifierType(tree, TreePath(treePath, tree), javac) is JCTree.JCArrayTypeTree -> TreeBasedArrayType(tree, javac.getTreePath(tree, treePath.compilationUnit), javac, applicableAnnotations)
else -> throw UnsupportedOperationException("Unsupported type: $tree") is JCTree.JCWildcard -> TreeBasedWildcardType(tree, javac.getTreePath(tree, treePath.compilationUnit), javac, applicableAnnotations)
is JCTree.JCTypeApply -> TreeBasedGenericClassifierType(tree, javac.getTreePath(tree, treePath.compilationUnit), javac, applicableAnnotations)
is JCTree.JCAnnotatedType -> {
val underlyingType = tree.underlyingType
val newAnnotations = tree.annotations
.map { TreeBasedAnnotation(it, javac.getTreePath(it, treePath.compilationUnit), javac) }
create(underlyingType, javac.getTreePath(underlyingType, treePath.compilationUnit), javac, newAnnotations)
}
is JCTree.JCExpression -> TreeBasedNonGenericClassifierType(tree, javac.getTreePath(tree, treePath.compilationUnit), javac, applicableAnnotations)
else -> throw UnsupportedOperationException("Unsupported type: $tree")
}
} }
} }
override val annotations: Collection<JavaAnnotation>
get() = emptyList()
override val isDeprecatedInJavaDoc: Boolean override val isDeprecatedInJavaDoc: Boolean
get() = false get() = false
@@ -63,8 +71,9 @@ abstract class TreeBasedType<out T : JCTree>(
class TreeBasedPrimitiveType( class TreeBasedPrimitiveType(
tree: JCTree.JCPrimitiveTypeTree, tree: JCTree.JCPrimitiveTypeTree,
treePath: TreePath, treePath: TreePath,
javac: JavacWrapper javac: JavacWrapper,
) : TreeBasedType<JCTree.JCPrimitiveTypeTree>(tree, treePath, javac), JavaPrimitiveType { annotations: Collection<JavaAnnotation>
) : TreeBasedType<JCTree.JCPrimitiveTypeTree>(tree, treePath, javac, annotations), JavaPrimitiveType {
override val type: PrimitiveType? override val type: PrimitiveType?
get() = if (tree.primitiveTypeKind == TypeKind.VOID) { get() = if (tree.primitiveTypeKind == TypeKind.VOID) {
@@ -79,22 +88,24 @@ class TreeBasedPrimitiveType(
class TreeBasedArrayType( class TreeBasedArrayType(
tree: JCTree.JCArrayTypeTree, tree: JCTree.JCArrayTypeTree,
treePath: TreePath, treePath: TreePath,
javac: JavacWrapper javac: JavacWrapper,
) : TreeBasedType<JCTree.JCArrayTypeTree>(tree, treePath, javac), JavaArrayType { annotations: Collection<JavaAnnotation>
) : TreeBasedType<JCTree.JCArrayTypeTree>(tree, treePath, javac, annotations), JavaArrayType {
override val componentType: JavaType override val componentType: JavaType
get() = create(tree.elemtype, treePath, javac) get() = create(tree.elemtype, treePath, javac, annotations)
} }
class TreeBasedWildcardType( class TreeBasedWildcardType(
tree: JCTree.JCWildcard, tree: JCTree.JCWildcard,
treePath: TreePath, treePath: TreePath,
javac: JavacWrapper javac: JavacWrapper,
) : TreeBasedType<JCTree.JCWildcard>(tree, treePath, javac), JavaWildcardType { annotations: Collection<JavaAnnotation>
) : TreeBasedType<JCTree.JCWildcard>(tree, treePath, javac, annotations), JavaWildcardType {
override val bound: JavaType? override val bound: JavaType?
get() = tree.bound?.let { create(it, treePath, javac) } get() = tree.bound?.let { create(it, treePath, javac, annotations) }
override val isExtends: Boolean override val isExtends: Boolean
get() = tree.kind.kind == BoundKind.EXTENDS get() = tree.kind.kind == BoundKind.EXTENDS
@@ -104,18 +115,47 @@ class TreeBasedWildcardType(
sealed class TreeBasedClassifierType<out T : JCTree>( sealed class TreeBasedClassifierType<out T : JCTree>(
tree: T, tree: T,
treePath: TreePath, treePath: TreePath,
javac: JavacWrapper javac: JavacWrapper,
) : TreeBasedType<T>(tree, treePath, javac), JavaClassifierType { annotations: Collection<JavaAnnotation>
) : TreeBasedType<T>(tree, treePath, javac, annotations), JavaClassifierType {
override val classifier: JavaClassifier? override val classifier: JavaClassifier?
get() = javac.resolve(treePath) get() = javac.resolve(treePath)
override val classifierQualifiedName: String override val classifierQualifiedName: String
get() = (classifier as? JavaClass)?.fqName?.asString() ?: treePath.leaf.toString() get() = (classifier as? JavaClass)?.fqName?.asString() ?: treePath.leaf.toString().substringBefore("<")
override val presentableText: String override val presentableText: String
get() = classifierQualifiedName get() = classifierQualifiedName
override val typeArguments: List<JavaType>
get() {
var tree: JCTree = tree
if (tree is JCTree.JCTypeApply) {
tree = tree.clazz
}
if (tree is JCTree.JCFieldAccess) {
val enclosingType = TreeBasedType.create(tree.selected, treePath, javac, annotations)
return (enclosingType as? JavaClassifierType)?.typeArguments ?: emptyList()
}
else {
val classifier = classifier as? JavaClass ?: return emptyList()
if (classifier is MockKotlinClassifier || classifier.isStatic) return emptyList()
return arrayListOf<JavaClass>().apply {
var outer = classifier.outerClass
var staticType = false
while (outer != null && !staticType) {
if (outer.isStatic) {
staticType = true
}
add(outer)
outer = outer.outerClass
}
}.flatMap { it.typeParameters.map(::TreeBasedTypeParameterType) }
}
}
private val typeParameter: JCTree.JCTypeParameter? private val typeParameter: JCTree.JCTypeParameter?
get() = treePath.flatMap { get() = treePath.flatMap {
when (it) { when (it) {
@@ -128,15 +168,36 @@ sealed class TreeBasedClassifierType<out T : JCTree>(
} }
class TreeBasedNonGenericClassifierType( class TreeBasedTypeParameterType(override val classifier: JavaTypeParameter) : JavaClassifierType {
tree: JCTree.JCExpression,
treePath: TreePath,
javac: JavacWrapper
) : TreeBasedClassifierType<JCTree.JCExpression>(tree, treePath, javac) {
override val typeArguments: List<JavaType> override val typeArguments: List<JavaType>
get() = emptyList() get() = emptyList()
override val isRaw: Boolean
get() = false
override val annotations: Collection<JavaAnnotation>
get() = classifier.annotations.filterTypeAnnotations()
override val classifierQualifiedName: String
get() = classifier.name.asString()
override val presentableText: String
get() = classifierQualifiedName
override fun findAnnotation(fqName: FqName) = annotations.find { it.classId?.asSingleFqName() == fqName }
override val isDeprecatedInJavaDoc: Boolean
get() = false
}
class TreeBasedNonGenericClassifierType(
tree: JCTree.JCExpression,
treePath: TreePath,
javac: JavacWrapper,
annotations: Collection<JavaAnnotation>
) : TreeBasedClassifierType<JCTree.JCExpression>(tree, treePath, javac, annotations) {
override val isRaw: Boolean override val isRaw: Boolean
get() = (classifier as? MockKotlinClassifier)?.hasTypeParameters get() = (classifier as? MockKotlinClassifier)?.hasTypeParameters
?: (classifier as? JavaClass)?.typeParameters?.isNotEmpty() ?: (classifier as? JavaClass)?.typeParameters?.isNotEmpty()
@@ -147,13 +208,39 @@ class TreeBasedNonGenericClassifierType(
class TreeBasedGenericClassifierType( class TreeBasedGenericClassifierType(
tree: JCTree.JCTypeApply, tree: JCTree.JCTypeApply,
treePath: TreePath, treePath: TreePath,
javac: JavacWrapper javac: JavacWrapper,
) : TreeBasedClassifierType<JCTree.JCTypeApply>(tree, treePath, javac) { annotations: Collection<JavaAnnotation>
) : TreeBasedClassifierType<JCTree.JCTypeApply>(tree, treePath, javac, annotations) {
override val classifier: JavaClassifier?
get() {
val newTree = tree.clazz
return if (newTree is JCTree.JCAnnotatedType) {
javac.resolve(javac.getTreePath(newTree.underlyingType, treePath.compilationUnit))
}
else super.classifier
}
override val annotations: Collection<JavaAnnotation>
get() {
val newTree = tree.clazz
return (newTree as? JCTree.JCAnnotatedType)?.annotations?.map { TreeBasedAnnotation(it, javac.getTreePath(it, treePath.compilationUnit), javac) }
?.toMutableList<JavaAnnotation>()
?.apply { addAll(super.annotations) }
?: super.annotations
}
override val typeArguments: List<JavaType> override val typeArguments: List<JavaType>
get() = tree.arguments.map { create(it, treePath, javac) } get() = tree.arguments.map { create(it, treePath, javac, emptyList()) }
.toMutableList()
.apply { addAll(super.typeArguments) }
override val isRaw: Boolean override val isRaw: Boolean
get() = false get() = classifier.let {
when (it) {
is MockKotlinClassifier -> tree.arguments.size != it.typeParametersNumber
else -> tree.arguments.size != (classifier as? JavaClass)?.typeParameters?.size
}
}
} }
@@ -19,9 +19,15 @@ package org.jetbrains.kotlin.javac.wrappers.trees
import com.sun.tools.javac.tree.JCTree import com.sun.tools.javac.tree.JCTree
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.javac.wrappers.symbols.SymbolBasedArrayAnnotationArgument
import org.jetbrains.kotlin.javac.wrappers.symbols.SymbolBasedField
import org.jetbrains.kotlin.javac.wrappers.symbols.SymbolBasedReferenceAnnotationArgument
import org.jetbrains.kotlin.load.java.JavaVisibilities import org.jetbrains.kotlin.load.java.JavaVisibilities
import org.jetbrains.kotlin.load.java.structure.JavaAnnotation
import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import javax.lang.model.element.Modifier import javax.lang.model.element.Modifier
internal val JCTree.JCModifiers.isAbstract: Boolean internal val JCTree.JCModifiers.isAbstract: Boolean
@@ -59,3 +65,37 @@ internal fun JCTree.annotations(): Collection<JCTree.JCAnnotation> = when (this)
fun JavaClass.computeClassId(): ClassId? = fun JavaClass.computeClassId(): ClassId? =
outerClass?.computeClassId()?.createNestedClassId(name) ?: fqName?.let { ClassId.topLevel(it) } outerClass?.computeClassId()?.createNestedClassId(name) ?: fqName?.let { ClassId.topLevel(it) }
fun Collection<JavaAnnotation>.filterTypeAnnotations(): Collection<JavaAnnotation> {
val filteredAnnotations = arrayListOf<JavaAnnotation>()
for (annotation in this) {
val annotationClass = annotation.resolve()
val targetAnnotation = annotationClass?.annotations?.find { it.classId == ClassId(FqName("java.lang.annotation"), Name.identifier("Target")) } ?: continue
val elementTypeArg = targetAnnotation.arguments.firstOrNull() ?: continue
when (elementTypeArg) {
is SymbolBasedArrayAnnotationArgument -> {
elementTypeArg.args.find { (it as? SymbolBasedReferenceAnnotationArgument)?.element?.simpleName?.contentEquals("TYPE_USE") ?: false }
?.let { filteredAnnotations.add(annotation) }
}
is SymbolBasedReferenceAnnotationArgument -> {
elementTypeArg.element.simpleName.takeIf { it.contentEquals("TYPE_USE") }
?.let { filteredAnnotations.add(annotation) }
}
is TreeBasedArrayAnnotationArgument -> {
elementTypeArg.args.find {
val field = (it as? TreeBasedReferenceAnnotationArgument)?.resolve() as? SymbolBasedField
field?.element?.simpleName?.contentEquals("TYPE_USE") ?: false
}?.let { filteredAnnotations.add(annotation) }
}
is TreeBasedReferenceAnnotationArgument -> {
(elementTypeArg.resolve() as? SymbolBasedField)?.let { field ->
field.element.simpleName.takeIf { it.contentEquals("TYPE_USE") }
?.let { filteredAnnotations.add(annotation) }
}
}
}
}
return filteredAnnotations
}
@@ -16,7 +16,5 @@ public abstract enum class AbstractEnum : kotlin.Enum<test.AbstractEnum!> {
// Static members // Static members
public final /*synthesized*/ fun valueOf(/*0*/ kotlin.String): test.AbstractEnum public final /*synthesized*/ fun valueOf(/*0*/ kotlin.String): test.AbstractEnum
public open fun valueOf(/*0*/ kotlin.String!): test.AbstractEnum!
public open fun values(): kotlin.Array<(out) test.AbstractEnum!>!
public final /*synthesized*/ fun values(): kotlin.Array<test.AbstractEnum> public final /*synthesized*/ fun values(): kotlin.Array<test.AbstractEnum>
} }
@@ -22,8 +22,6 @@ public open class ClassWithNestedEnum {
// Static members // Static members
public final /*synthesized*/ fun valueOf(/*0*/ kotlin.String): test.ClassWithNestedEnum.NestedEnum public final /*synthesized*/ fun valueOf(/*0*/ kotlin.String): test.ClassWithNestedEnum.NestedEnum
public open fun valueOf(/*0*/ kotlin.String!): test.ClassWithNestedEnum.NestedEnum!
public open fun values(): kotlin.Array<(out) test.ClassWithNestedEnum.NestedEnum!>!
public final /*synthesized*/ fun values(): kotlin.Array<test.ClassWithNestedEnum.NestedEnum> public final /*synthesized*/ fun values(): kotlin.Array<test.ClassWithNestedEnum.NestedEnum>
} }
} }
@@ -25,8 +25,6 @@ public/*package*/ interface Interface {
// Static members // Static members
public final /*synthesized*/ fun valueOf(/*0*/ kotlin.String): test.Interface.Kind public final /*synthesized*/ fun valueOf(/*0*/ kotlin.String): test.Interface.Kind
public open fun valueOf(/*0*/ kotlin.String!): test.Interface.Kind!
public open fun values(): kotlin.Array<(out) test.Interface.Kind!>!
public final /*synthesized*/ fun values(): kotlin.Array<test.Interface.Kind> public final /*synthesized*/ fun values(): kotlin.Array<test.Interface.Kind>
} }
} }
-2
View File
@@ -21,7 +21,5 @@ public final enum class Enum : kotlin.Enum<test.Enum!> {
// Static members // Static members
public final /*synthesized*/ fun valueOf(/*0*/ kotlin.String): test.Enum public final /*synthesized*/ fun valueOf(/*0*/ kotlin.String): test.Enum
public open fun valueOf(/*0*/ kotlin.String!): test.Enum!
public open fun values(): kotlin.Array<(out) test.Enum!>!
public final /*synthesized*/ fun values(): kotlin.Array<test.Enum> public final /*synthesized*/ fun values(): kotlin.Array<test.Enum>
} }
@@ -17,7 +17,5 @@ public final enum class EnumName : kotlin.Enum<test.EnumName!> {
// Static members // Static members
public final /*synthesized*/ fun valueOf(/*0*/ kotlin.String): test.EnumName public final /*synthesized*/ fun valueOf(/*0*/ kotlin.String): test.EnumName
public open fun valueOf(/*0*/ kotlin.String!): test.EnumName!
public open fun values(): kotlin.Array<(out) test.EnumName!>!
public final /*synthesized*/ fun values(): kotlin.Array<test.EnumName> public final /*synthesized*/ fun values(): kotlin.Array<test.EnumName>
} }
@@ -0,0 +1,18 @@
package test;
public enum EnumValues {
OK(0),
COMPILATION_ERROR(1),
INTERNAL_ERROR(2),
SCRIPT_EXECUTION_ERROR(3);
private final int code;
EnumValues(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
@@ -0,0 +1,5 @@
package test
import java.util.Locale
fun findCode(code: Int) = Locale.Category.values()
@@ -0,0 +1,27 @@
package test
public fun findCode(/*0*/ kotlin.Int): kotlin.Array<java.util.Locale.Category>
public final enum class EnumValues : kotlin.Enum<test.EnumValues!> {
enum entry OK
enum entry COMPILATION_ERROR
enum entry INTERNAL_ERROR
enum entry SCRIPT_EXECUTION_ERROR
private constructor EnumValues(/*0*/ kotlin.Int)
private final val code: kotlin.Int
public final /*fake_override*/ val name: kotlin.String
public final /*fake_override*/ val ordinal: kotlin.Int
protected final /*fake_override*/ fun clone(): kotlin.Any
public final /*fake_override*/ fun compareTo(/*0*/ test.EnumValues!): kotlin.Int
protected/*protected and package*/ final /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public open fun getCode(): kotlin.Int
public final /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<test.EnumValues!>!
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ kotlin.String): test.EnumValues
public final /*synthesized*/ fun values(): kotlin.Array<test.EnumValues>
}
@@ -0,0 +1,10 @@
package test;
public abstract class InnerWithGenericOuter<T> {
public class Module {
}
protected abstract void test(Module module);
}
@@ -0,0 +1,7 @@
package test
class BasicTest : InnerWithGenericOuter<String>() {
override fun test(module: Module) {}
}
@@ -0,0 +1,15 @@
package test
public final class BasicTest : test.InnerWithGenericOuter<kotlin.String> {
public constructor BasicTest()
protected open fun test(/*0*/ test.InnerWithGenericOuter<kotlin.String>.Module): kotlin.Unit
}
public abstract class InnerWithGenericOuter</*0*/ T : kotlin.Any!> {
public constructor InnerWithGenericOuter</*0*/ T : kotlin.Any!>()
protected/*protected and package*/ abstract fun test(/*0*/ test.InnerWithGenericOuter<T!>.Module!): kotlin.Unit
public open inner class Module /*captured type parameters: /*0*/ T : kotlin.Any!*/ {
public constructor Module()
}
}
@@ -0,0 +1,7 @@
package test;
public class JavaLangClass {
public static void func(Class<String> aClass) {}
}
@@ -0,0 +1,3 @@
package test
fun doNothing() = JavaLangClass.func(String::class.java)
@@ -0,0 +1,10 @@
package test
public fun doNothing(): kotlin.Unit
public open class JavaLangClass {
public constructor JavaLangClass()
// Static members
public open fun func(/*0*/ java.lang.Class<kotlin.String!>!): kotlin.Unit
}
@@ -19,8 +19,6 @@ public/*package*/ final enum class Kind : kotlin.Enum<test.Kind!> {
// Static members // Static members
public final /*synthesized*/ fun valueOf(/*0*/ kotlin.String): test.Kind public final /*synthesized*/ fun valueOf(/*0*/ kotlin.String): test.Kind
public open fun valueOf(/*0*/ kotlin.String!): test.Kind!
public open fun values(): kotlin.Array<(out) test.Kind!>!
public final /*synthesized*/ fun values(): kotlin.Array<test.Kind> public final /*synthesized*/ fun values(): kotlin.Array<test.Kind>
} }
@@ -4,4 +4,6 @@ public class ReturnType {
public static javax.lang.model.element.Element getElement() { return null; } public static javax.lang.model.element.Element getElement() { return null; }
public static java.lang.Class<String> getJavaLangClass() { return null; }
} }
@@ -1,3 +1,5 @@
package test package test
fun getElement() = ReturnType.getElement() fun getElement() = ReturnType.getElement()
fun getJavaLangClass() = ReturnType.getJavaLangClass()
@@ -1,10 +1,12 @@
package test package test
public fun getElement(): javax.lang.model.element.Element! public fun getElement(): javax.lang.model.element.Element!
public fun getJavaLangClass(): java.lang.Class<kotlin.String!>!
public open class ReturnType { public open class ReturnType {
public constructor ReturnType() public constructor ReturnType()
// Static members // Static members
public open fun getElement(): javax.lang.model.element.Element! public open fun getElement(): javax.lang.model.element.Element!
public open fun getJavaLangClass(): java.lang.Class<kotlin.String!>!
} }
@@ -1,16 +0,0 @@
package test;
public class UseKotlinInner extends KotlinClass {
KotlinInner getKotlinInner() { return null; }
JavaInner getJavaInner() { return null; }
KotlinInner3 getKotlinInner3() { return null; }
}
class JavaClass2 {
static class JavaInner {}
}
@@ -1,19 +0,0 @@
package test
private open class KotlinClass : KotlinInterface.KotlinInner2() {
inner class KotlinInner
}
private interface KotlinInterface {
open class KotlinInner2 : JavaClass2() {
class KotlinInner3
}
}
private fun getKotlinInner() = UseKotlinInner().kotlinInner
private fun getJavaInner() = UseKotlinInner().javaInner
private fun getKotlinInner3() = UseKotlinInner().kotlinInner3
@@ -1,39 +0,0 @@
package test
private fun getJavaInner(): test.JavaClass2.JavaInner!
private fun getKotlinInner(): test.KotlinClass.KotlinInner!
private fun getKotlinInner3(): test.KotlinInterface.KotlinInner2.KotlinInner3!
public/*package*/ open class JavaClass2 {
public/*package*/ constructor JavaClass2()
public/*package*/ open class JavaInner {
public/*package*/ constructor JavaInner()
}
}
private open class KotlinClass : test.KotlinInterface.KotlinInner2 {
public constructor KotlinClass()
public final inner class KotlinInner {
public constructor KotlinInner()
}
}
private interface KotlinInterface {
public open class KotlinInner2 : test.JavaClass2 {
public constructor KotlinInner2()
public final class KotlinInner3 {
public constructor KotlinInner3()
}
}
}
public open class UseKotlinInner : test.KotlinClass {
public constructor UseKotlinInner()
public/*package*/ open fun getJavaInner(): test.JavaClass2.JavaInner!
public/*package*/ open fun getKotlinInner(): test.KotlinClass.KotlinInner!
public/*package*/ open fun getKotlinInner3(): test.KotlinInterface.KotlinInner2.KotlinInner3!
}
@@ -0,0 +1,15 @@
package
public interface MyTrait : java.lang.Object {
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any!
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ fun getClass(): java.lang.Class<*>!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public final override /*1*/ /*fake_override*/ fun notify(): kotlin.Unit
public final override /*1*/ /*fake_override*/ fun notifyAll(): kotlin.Unit
public abstract override /*1*/ fun toString(): kotlin.String
public abstract override /*1*/ fun wait(): kotlin.Unit
public final override /*1*/ /*fake_override*/ fun wait(/*0*/ p0: kotlin.Long): kotlin.Unit
public final override /*1*/ /*fake_override*/ fun wait(/*0*/ p0: kotlin.Long, /*1*/ p1: kotlin.Int): kotlin.Unit
}
@@ -1,3 +1,4 @@
// JAVAC_EXPECTED_FILE
interface MyTrait: <!PLATFORM_CLASS_MAPPED_TO_KOTLIN, INTERFACE_WITH_SUPERCLASS!>Object<!> { interface MyTrait: <!PLATFORM_CLASS_MAPPED_TO_KOTLIN, INTERFACE_WITH_SUPERCLASS!>Object<!> {
override fun toString(): String override fun toString(): String
public override fun finalize() public override fun finalize()
@@ -0,0 +1,67 @@
package
public open class Bar {
public constructor Bar()
public final val v: kotlin.Int = 1
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final fun v(): kotlin.Int
}
public final class Barr : Bar {
public constructor Barr()
public final override /*1*/ /*fake_override*/ val v: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final override /*1*/ /*fake_override*/ fun v(): kotlin.Int
}
public final class Foo1 : java.util.ArrayList<kotlin.Int> {
public constructor Foo1()
invisible_fake final override /*1*/ /*fake_override*/ var elementData: kotlin.Array<(out) kotlin.Any!>!
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var modCount: kotlin.Int
invisible_fake final override /*1*/ /*fake_override*/ var size: kotlin.Int
public open override /*1*/ /*fake_override*/ val size: kotlin.Int
public open override /*1*/ /*fake_override*/ fun add(/*0*/ element: kotlin.Int): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
invisible_fake open override /*1*/ /*fake_override*/ fun batchRemove(/*0*/ p0: kotlin.collections.(Mutable)Collection<*>!, /*1*/ p1: kotlin.Boolean): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public open override /*1*/ /*fake_override*/ fun contains(/*0*/ element: kotlin.Int): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
invisible_fake open override /*1*/ /*fake_override*/ fun elementData(/*0*/ p0: kotlin.Int): kotlin.Int!
public open override /*1*/ /*fake_override*/ fun ensureCapacity(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun ensureCapacityInternal(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun ensureExplicitCapacity(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
invisible_fake open override /*1*/ /*fake_override*/ fun fastRemove(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): kotlin.Int
invisible_fake open override /*1*/ /*fake_override*/ fun grow(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun indexOf(/*0*/ element: kotlin.Int): kotlin.Int
public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<kotlin.Int>
public open override /*1*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: kotlin.Int): kotlin.Int
public open override /*1*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator<kotlin.Int>
public open override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator<kotlin.Int>
invisible_fake open override /*1*/ /*fake_override*/ fun outOfBoundsMsg(/*0*/ p0: kotlin.Int): kotlin.String!
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheck(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheckForAdd(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun readObject(/*0*/ p0: java.io.ObjectInputStream!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun remove(/*0*/ element: kotlin.Int): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAt(/*0*/ p0: kotlin.Int): kotlin.Int
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun removeRange(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.Int): kotlin.Int
public open override /*1*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList<kotlin.Int>
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>!
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public open override /*1*/ /*fake_override*/ fun trimToSize(): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun writeObject(/*0*/ p0: java.io.ObjectOutputStream!): kotlin.Unit
}
@@ -1,4 +1,4 @@
// JAVAC_EXPECTED_FILE
class Foo1() : java.util.ArrayList<Int>() class Foo1() : java.util.ArrayList<Int>()
open class Bar() { open class Bar() {
@@ -4,11 +4,11 @@ import java.lang.annotation.*;
public class DocumentedAnnotations { public class DocumentedAnnotations {
@Documented public @interface DocAnn; @Documented public @interface DocAnn {};
public @interface NotDocAnn; public @interface NotDocAnn {};
@Documented @Retention(RetentionPolicy.RUNTIME) public @interface RunDocAnn; @Documented @Retention(RetentionPolicy.RUNTIME) public @interface RunDocAnn {};
} }
// FILE: DocumentedAnnotations.kt // FILE: DocumentedAnnotations.kt
@@ -1,7 +1,7 @@
// !CHECK_TYPE // !CHECK_TYPE
// FILE: test/A.java // FILE: test/A.java
package test package test;
import java.util.Arrays; import java.util.Arrays;
@@ -1,3 +1,16 @@
package package
public fun foo(/*0*/ args: kotlin.Array<kotlin.String>): kotlin.Unit public fun foo(/*0*/ args: kotlin.Array<kotlin.String>): kotlin.Unit
package test {
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public open fun main(/*0*/ args: kotlin.Array<(out) kotlin.String!>!): kotlin.Unit
}
}
@@ -16,3 +16,13 @@ public fun g5(): kotlin.reflect.KClass<out test.GenericSam<kotlin.String>>
public fun g6(): kotlin.reflect.KFunction1<@kotlin.ParameterName(name = "t") kotlin.String!, kotlin.Unit> public fun g6(): kotlin.reflect.KFunction1<@kotlin.ParameterName(name = "t") kotlin.String!, kotlin.Unit>
public fun g7(): kotlin.reflect.KClass<out test.GenericSam<kotlin.String>> public fun g7(): kotlin.reflect.KClass<out test.GenericSam<kotlin.String>>
public fun g8(): kotlin.reflect.KFunction1<@kotlin.ParameterName(name = "t") kotlin.String!, kotlin.Unit> public fun g8(): kotlin.reflect.KFunction1<@kotlin.ParameterName(name = "t") kotlin.String!, kotlin.Unit>
package test {
public interface GenericSam</*0*/ T : kotlin.Any!> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract operator fun invoke(/*0*/ t: T!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@@ -1,7 +1,7 @@
// FILE: JavaClass.java // FILE: JavaClass.java
import org.jetbrains.annotations.Nullable import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull import org.jetbrains.annotations.NotNull;
public class JavaClass { public class JavaClass {
static Integer foo() { static Integer foo() {
@@ -0,0 +1,65 @@
package
public fun bar(): kotlin.Unit
public fun </*0*/ T : kotlin.Throwable> tryCatch(): kotlin.Unit
public inline fun </*0*/ reified E : kotlin.Exception /* = java.lang.Exception */, /*1*/ R> tryCatch(/*0*/ lazy: () -> R, /*1*/ failure: (E) -> R): R
public final class XException</*0*/ T> : kotlin.Throwable {
public constructor XException</*0*/ T>(/*0*/ p: T)
public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable?
public open override /*1*/ /*fake_override*/ val message: kotlin.String?
public final val p: T
public final override /*1*/ /*fake_override*/ fun addSuppressed(/*0*/ p0: kotlin.Throwable!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun fillInStackTrace(): kotlin.Throwable!
public open override /*1*/ /*fake_override*/ fun getLocalizedMessage(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun getStackTrace(): kotlin.Array<(out) java.lang.StackTraceElement!>!
public final override /*1*/ /*fake_override*/ fun getSuppressed(): kotlin.Array<(out) kotlin.Throwable!>!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun initCause(/*0*/ p0: kotlin.Throwable!): kotlin.Throwable!
public open override /*1*/ /*fake_override*/ fun printStackTrace(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ p0: java.io.PrintStream!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ p0: java.io.PrintWriter!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun setStackTrace(/*0*/ p0: kotlin.Array<(out) java.lang.StackTraceElement!>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class YException</*0*/ T> : java.lang.RuntimeException {
public constructor YException</*0*/ T>(/*0*/ p: T)
public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable?
public open override /*1*/ /*fake_override*/ val message: kotlin.String?
public final val p: T
public final override /*1*/ /*fake_override*/ fun addSuppressed(/*0*/ p0: kotlin.Throwable!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun fillInStackTrace(): kotlin.Throwable!
public open override /*1*/ /*fake_override*/ fun getLocalizedMessage(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun getStackTrace(): kotlin.Array<(out) java.lang.StackTraceElement!>!
public final override /*1*/ /*fake_override*/ fun getSuppressed(): kotlin.Array<(out) kotlin.Throwable!>!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun initCause(/*0*/ p0: kotlin.Throwable!): kotlin.Throwable!
public open override /*1*/ /*fake_override*/ fun printStackTrace(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ p0: java.io.PrintStream!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ p0: java.io.PrintWriter!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun setStackTrace(/*0*/ p0: kotlin.Array<(out) java.lang.StackTraceElement!>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class ZException</*0*/ T> : kotlin.Exception /* = java.lang.Exception */ {
public constructor ZException</*0*/ T>(/*0*/ p: T)
public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable?
public open override /*1*/ /*fake_override*/ val message: kotlin.String?
public final val p: T
public final override /*1*/ /*fake_override*/ fun addSuppressed(/*0*/ p0: kotlin.Throwable!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun fillInStackTrace(): kotlin.Throwable!
public open override /*1*/ /*fake_override*/ fun getLocalizedMessage(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun getStackTrace(): kotlin.Array<(out) java.lang.StackTraceElement!>!
public final override /*1*/ /*fake_override*/ fun getSuppressed(): kotlin.Array<(out) kotlin.Throwable!>!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun initCause(/*0*/ p0: kotlin.Throwable!): kotlin.Throwable!
public open override /*1*/ /*fake_override*/ fun printStackTrace(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ p0: java.io.PrintStream!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ p0: java.io.PrintWriter!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun setStackTrace(/*0*/ p0: kotlin.Array<(out) java.lang.StackTraceElement!>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,3 +1,4 @@
// JAVAC_EXPECTED_FILE
// See KT-9816, KT-9742 // See KT-9816, KT-9742
// Not allowed in Java // Not allowed in Java
@@ -0,0 +1,24 @@
package
public final class TestIface : java.lang.Runnable {
public constructor TestIface(/*0*/ r: java.lang.Runnable)
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*delegation*/ fun run(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class TestObject : java.lang.Object {
public constructor TestObject(/*0*/ o: java.lang.Object)
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any!
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ fun getClass(): java.lang.Class<*>!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public final override /*1*/ /*fake_override*/ fun notify(): kotlin.Unit
public final override /*1*/ /*fake_override*/ fun notifyAll(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final override /*1*/ /*fake_override*/ fun wait(): kotlin.Unit
public final override /*1*/ /*fake_override*/ fun wait(/*0*/ p0: kotlin.Long): kotlin.Unit
public final override /*1*/ /*fake_override*/ fun wait(/*0*/ p0: kotlin.Long, /*1*/ p1: kotlin.Int): kotlin.Unit
}
@@ -1,3 +1,4 @@
// JAVAC_EXPECTED_FILE
class TestIface(r : Runnable) : Runnable by r {} class TestIface(r : Runnable) : Runnable by r {}
class TestObject(o : <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>Object<!>) : <!PLATFORM_CLASS_MAPPED_TO_KOTLIN, DELEGATION_NOT_TO_INTERFACE!>Object<!> by o {} class TestObject(o : <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>Object<!>) : <!PLATFORM_CLASS_MAPPED_TO_KOTLIN, DELEGATION_NOT_TO_INTERFACE!>Object<!> by o {}
@@ -3,7 +3,7 @@
// FILE: A.java // FILE: A.java
public class A { public class A {
public static int a = 1 public static int a = 1;
public static void foo() {} public static void foo() {}
public static void baz(String s) {} public static void baz(String s) {}
} }
@@ -18,3 +18,17 @@ public open class K : foo.A {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
} }
} }
package foo {
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public/*package*/ open fun bar(/*0*/ s: kotlin.Double): kotlin.Unit
private open fun foo(/*0*/ s: kotlin.Int): kotlin.Unit
}
}
@@ -9,3 +9,28 @@ public final class K : p.J.C {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final fun dynamic.test(): kotlin.Unit public final fun dynamic.test(): kotlin.Unit
} }
package p {
public open class J {
public constructor J()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public open class C {
public constructor C()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
private open fun sam(/*0*/ sam: p.J.Sam!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface Sam {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract fun sam(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
}
@@ -1,5 +1,39 @@
package package
package j {
public interface Base {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class Derived1 : j.Impl {
public constructor Derived1()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class Derived2 : j.Impl {
public constructor Derived2()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ abstract class Impl : j.Base {
public/*package*/ constructor Impl()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
package k { package k {
public val d1: j.Derived1 public val d1: j.Derived1
public val d2: j.Derived2 public val d2: j.Derived2
@@ -0,0 +1,43 @@
package
package other {
public final class Your {
public constructor Your()
internal final fun bar(): test.Internal!
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
package test {
public final class His {
public constructor His()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
internal final fun internal(): test.Internal!
private final fun private(): test.Internal!
protected final fun protected(): test.Internal!
public final fun public(): test.Internal!
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ open class Internal {
public/*package*/ constructor Internal()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class My {
public constructor My()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public open fun foo(): test.Internal!
}
}
@@ -1,3 +1,4 @@
// JAVAC_EXPECTED_FILE
// FILE: test/My.java // FILE: test/My.java
package test; package test;
@@ -1,7 +1,7 @@
// !CHECK_TYPE // !CHECK_TYPE
// FILE: Predicate.java // FILE: Predicate.java
import org.jetbrains.annotations.NotNull import org.jetbrains.annotations.NotNull;
public interface Predicate<T extends CharSequence> { public interface Predicate<T extends CharSequence> {
// Same effect with @Nullable here // Same effect with @Nullable here
@@ -0,0 +1,13 @@
package
package test {
public fun foo(/*0*/ u: test.Usage): kotlin.Unit
public open class Usage {
public constructor Usage()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun foo(/*0*/ c: kotlin.collections.(Mutable)Collection<*>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@@ -1,3 +1,4 @@
// JAVAC_EXPECTED_FILE
// FILE: java/util/Collection.java // FILE: java/util/Collection.java
package java.util; package java.util;
@@ -1,5 +1,73 @@
package package
package java {
package java.awt {
package java.awt.event {
}
}
package java.beans {
package java.beans.beancontext {
}
}
package java.io {
}
package java.lang {
package java.lang.annotation {
}
package java.lang.reflect {
}
}
package java.net {
}
package java.nio {
package java.nio.charset {
}
}
package java.rmi {
}
package java.security {
}
package java.sql {
}
package java.util {
public open class Collection {
public constructor Collection()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
package java.util.concurrent {
package java.util.concurrent.atomic {
}
package java.util.concurrent.locks {
}
}
package java.util.regex {
}
}
}
package test { package test {
public fun foo(/*0*/ u: test.Usage): kotlin.Unit public fun foo(/*0*/ u: test.Usage): kotlin.Unit
@@ -0,0 +1,34 @@
package
public fun </*0*/ E> commonSupertype(/*0*/ x: E, /*1*/ y: E): E
public fun foo(): kotlin.Unit
public final class A</*0*/ T> : java.util.AbstractCollection<T> {
public constructor A</*0*/ T>()
public open override /*1*/ val size: kotlin.Int
public open override /*1*/ /*fake_override*/ fun add(/*0*/ element: T!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun contains(/*0*/ element: T!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): A<T>.MyIt
public open override /*1*/ /*fake_override*/ fun remove(/*0*/ element: T!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>!
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final inner class MyIt /*captured type parameters: /*0*/ T*/ : kotlin.collections.MutableIterator<T> {
public constructor MyIt()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ fun hasNext(): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ fun next(): T
public open override /*1*/ fun remove(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@@ -1,5 +1,6 @@
// !CHECK_TYPE // !CHECK_TYPE
// !DIAGNOSTICS: -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_VARIABLE // !DIAGNOSTICS: -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_VARIABLE
// JAVAC_EXPECTED_FILE
import java.util.* import java.util.*
class A<T> : AbstractCollection<T>() { class A<T> : AbstractCollection<T>() {
+1 -1
View File
@@ -5,7 +5,7 @@
public class B<T> { public class B<T> {
public String gav() { public String gav() {
return "" return "";
} }
public static <T> B<T> create() { public static <T> B<T> create() {
@@ -1,3 +1,4 @@
// JAVAC_SKIP
// FILE: JavaClass.java // FILE: JavaClass.java
public class JavaClass { public class JavaClass {
public void foo(? x) {} public void foo(? x) {}
@@ -7,3 +7,24 @@ public final class Foo</*0*/ T> : p.J.Sub<T> {
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
} }
package p {
public interface J {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public interface Sub</*0*/ T : kotlin.Any!> : p.J.Super<T!> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface Super</*0*/ T : kotlin.Any!> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
}
@@ -0,0 +1,96 @@
package
public abstract class AL : java.util.ArrayList<p.P> {
public constructor AL()
invisible_fake final override /*1*/ /*fake_override*/ var elementData: kotlin.Array<(out) kotlin.Any!>!
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var modCount: kotlin.Int
invisible_fake final override /*1*/ /*fake_override*/ var size: kotlin.Int
public open override /*1*/ /*fake_override*/ val size: kotlin.Int
public open override /*1*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: p.P): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun add(/*0*/ element: p.P): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ elements: kotlin.collections.Collection<p.P>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<p.P>): kotlin.Boolean
invisible_fake open override /*1*/ /*fake_override*/ fun batchRemove(/*0*/ p0: kotlin.collections.(Mutable)Collection<*>!, /*1*/ p1: kotlin.Boolean): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public open override /*1*/ /*fake_override*/ fun contains(/*0*/ element: p.P): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<p.P>): kotlin.Boolean
invisible_fake open override /*1*/ /*fake_override*/ fun elementData(/*0*/ p0: kotlin.Int): p.P!
public open override /*1*/ /*fake_override*/ fun ensureCapacity(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun ensureCapacityInternal(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun ensureExplicitCapacity(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
invisible_fake open override /*1*/ /*fake_override*/ fun fastRemove(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): p.P
invisible_fake open override /*1*/ /*fake_override*/ fun grow(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun indexOf(/*0*/ element: p.P): kotlin.Int
public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<p.P>
public open override /*1*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: p.P): kotlin.Int
public open override /*1*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator<p.P>
public open override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator<p.P>
invisible_fake open override /*1*/ /*fake_override*/ fun outOfBoundsMsg(/*0*/ p0: kotlin.Int): kotlin.String!
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheck(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheckForAdd(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun readObject(/*0*/ p0: java.io.ObjectInputStream!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun remove(/*0*/ element: p.P): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<p.P>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAt(/*0*/ p0: kotlin.Int): p.P
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun removeRange(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<p.P>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: p.P): p.P
public open override /*1*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList<p.P>
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>!
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public open override /*1*/ /*fake_override*/ fun trimToSize(): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun writeObject(/*0*/ p0: java.io.ObjectOutputStream!): kotlin.Unit
}
public abstract class K : p.C<p.P> {
public constructor K()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ p: p.A<p.P!>): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
package p {
public interface A</*0*/ TA> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun foo(/*0*/ p: p.A<TA>): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class B</*0*/ TB : kotlin.Any!> : p.A<TB!> {
public constructor B</*0*/ TB : kotlin.Any!>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open override /*1*/ fun foo(/*0*/ p: p.A<TB!>): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class C</*0*/ TC : kotlin.Any!> : p.B<TC!>, p.A<TC!> {
public constructor C</*0*/ TC : kotlin.Any!>()
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun foo(/*0*/ p: p.A<TC!>): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface G</*0*/ TG : kotlin.Any!> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class P {
public constructor P()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@@ -1,3 +1,4 @@
// JAVAC_EXPECTED_FILE
// FILE: p/G.java // FILE: p/G.java
package p; package p;
@@ -7,3 +7,29 @@ public abstract class K : p.C {
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
} }
package p {
public interface A {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun </*0*/ TA : kotlin.Any!> foo(/*0*/ p: TA!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class B : p.A {
public constructor B()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open override /*1*/ fun </*0*/ TB : kotlin.Any!> foo(/*0*/ p: TB!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class C : p.B, p.A {
public constructor C()
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun </*0*/ TA : kotlin.Any!> foo(/*0*/ p: TA!): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}
}
+11
View File
@@ -1,3 +1,14 @@
package package
public fun foo(/*0*/ a: aa.A): kotlin.Unit public fun foo(/*0*/ a: aa.A): kotlin.Unit
package aa {
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun f(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@@ -0,0 +1,11 @@
package
public fun main(): kotlin.Unit
@missing.Ann /* annotation class not found */ public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@missing.Ann /* annotation class not found */ public open fun foo(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,3 +1,4 @@
// JAVAC_EXPECTED_FILE
// FILE: A.java // FILE: A.java
@missing.Ann(x = "") @missing.Ann(x = "")
public class A { public class A {
@@ -0,0 +1,124 @@
package
public fun foo(/*0*/ a: A<kotlin.String>, /*1*/ b: B, /*2*/ ic: IC, /*3*/ ka: KA<kotlin.String>, /*4*/ kb: KB, /*5*/ al: java.util.ArrayList<kotlin.String>): kotlin.Unit
public abstract class A</*0*/ T : kotlin.Any!> : kotlin.collections.MutableCollection<T!> {
public constructor A</*0*/ T : kotlin.Any!>()
public abstract override /*1*/ /*fake_override*/ val size: kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun add(/*0*/ element: T!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*1*/ fun contains(/*0*/ element: T!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<T!>
public abstract override /*1*/ /*fake_override*/ fun remove(/*0*/ element: T!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public abstract class B : kotlin.collections.MutableCollection<kotlin.String!> {
public constructor B()
public abstract override /*1*/ /*fake_override*/ val size: kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun add(/*0*/ element: kotlin.String!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*1*/ fun contains(/*0*/ x: kotlin.String!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<kotlin.String!>
public abstract override /*1*/ /*fake_override*/ fun remove(/*0*/ element: kotlin.String!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface IC : kotlin.collections.MutableCollection<kotlin.String!> {
public abstract override /*1*/ /*fake_override*/ val size: kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun add(/*0*/ element: kotlin.String!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public abstract override /*1*/ fun contains(/*0*/ x: kotlin.String!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<kotlin.String!>
public abstract override /*1*/ /*fake_override*/ fun remove(/*0*/ element: kotlin.String!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public abstract class KA</*0*/ T> : java.util.AbstractList<T> {
public constructor KA</*0*/ T>()
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var modCount: kotlin.Int
public abstract override /*1*/ /*fake_override*/ val size: kotlin.Int
public open override /*1*/ /*fake_override*/ fun add(/*0*/ element: T!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: T!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*1*/ fun contains(/*0*/ x: T): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): T!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun indexOf(/*0*/ element: T!): kotlin.Int
public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<T!>
public open override /*1*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: T!): kotlin.Int
public open override /*1*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator<T!>
public open override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator<T!>
invisible_fake open override /*1*/ /*fake_override*/ fun outOfBoundsMsg(/*0*/ p0: kotlin.Int): kotlin.String!
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheckForAdd(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun remove(/*0*/ element: T!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAt(/*0*/ p0: kotlin.Int): T!
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun removeRange(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: T!): T!
public open override /*1*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList<T!>
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>!
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public abstract class KB : java.util.AbstractList<kotlin.String>, IC {
public constructor KB()
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var modCount: kotlin.Int
public abstract override /*2*/ /*fake_override*/ val size: kotlin.Int
public open override /*1*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.String!): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun add(/*0*/ element: kotlin.String!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*2*/ fun contains(/*0*/ element: kotlin.String): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): kotlin.String!
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun indexOf(/*0*/ element: kotlin.String!): kotlin.Int
public open override /*2*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<kotlin.String!>
public open override /*1*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: kotlin.String!): kotlin.Int
public open override /*1*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator<kotlin.String!>
public open override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator<kotlin.String!>
invisible_fake open override /*1*/ /*fake_override*/ fun outOfBoundsMsg(/*0*/ p0: kotlin.Int): kotlin.String!
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheckForAdd(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun remove(/*0*/ element: kotlin.String!): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAt(/*0*/ p0: kotlin.Int): kotlin.String!
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun removeRange(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.String!): kotlin.String!
public open override /*1*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList<kotlin.String!>
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>!
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,4 +1,5 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -PARAMETER_NAME_CHANGED_ON_OVERRIDE // !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -PARAMETER_NAME_CHANGED_ON_OVERRIDE
// JAVAC_EXPECTED_FILE
// FILE: A.java // FILE: A.java
abstract public class A<T> implements java.util.Collection<T> { abstract public class A<T> implements java.util.Collection<T> {
@@ -12,7 +13,7 @@ abstract public class B implements java.util.Collection<String> {
} }
// FILE: IC.java // FILE: IC.java
public interface IC implements java.util.Collection<String> { public interface IC extends java.util.Collection<String> {
public boolean contains(Object x); public boolean contains(Object x);
} }
@@ -0,0 +1,124 @@
package
public fun foo(/*0*/ a: A<kotlin.String>, /*1*/ b: B, /*2*/ ic: IC, /*3*/ ka: KA<kotlin.String>, /*4*/ kb: KB, /*5*/ al: java.util.ArrayList<kotlin.String>, /*6*/ cs: kotlin.collections.Collection<kotlin.String>, /*7*/ ca: kotlin.collections.Collection<kotlin.Any?>): kotlin.Unit
public abstract class A</*0*/ T : kotlin.Any!> : kotlin.collections.MutableCollection<T!> {
public constructor A</*0*/ T : kotlin.Any!>()
public abstract override /*1*/ /*fake_override*/ val size: kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun add(/*0*/ element: T!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public abstract override /*1*/ /*fake_override*/ fun contains(/*0*/ element: T!): kotlin.Boolean
public open override /*1*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<T!>
public abstract override /*1*/ /*fake_override*/ fun remove(/*0*/ element: T!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public abstract class B : kotlin.collections.MutableCollection<kotlin.String!> {
public constructor B()
public abstract override /*1*/ /*fake_override*/ val size: kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun add(/*0*/ element: kotlin.String!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public abstract override /*1*/ /*fake_override*/ fun contains(/*0*/ element: kotlin.String!): kotlin.Boolean
public open override /*1*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<kotlin.String!>
public abstract override /*1*/ /*fake_override*/ fun remove(/*0*/ element: kotlin.String!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface IC : kotlin.collections.MutableCollection<kotlin.String!> {
public abstract override /*1*/ /*fake_override*/ val size: kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun add(/*0*/ element: kotlin.String!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public abstract override /*1*/ /*fake_override*/ fun contains(/*0*/ element: kotlin.String!): kotlin.Boolean
public abstract override /*1*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<kotlin.String!>
public abstract override /*1*/ /*fake_override*/ fun remove(/*0*/ element: kotlin.String!): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public abstract class KA</*0*/ T> : java.util.AbstractList<T> {
public constructor KA</*0*/ T>()
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var modCount: kotlin.Int
public abstract override /*1*/ /*fake_override*/ val size: kotlin.Int
public open override /*1*/ /*fake_override*/ fun add(/*0*/ element: T!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: T!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun contains(/*0*/ element: T!): kotlin.Boolean
public open override /*1*/ fun containsAll(/*0*/ x: kotlin.collections.Collection<T>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): T!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun indexOf(/*0*/ element: T!): kotlin.Int
public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<T!>
public open override /*1*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: T!): kotlin.Int
public open override /*1*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator<T!>
public open override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator<T!>
invisible_fake open override /*1*/ /*fake_override*/ fun outOfBoundsMsg(/*0*/ p0: kotlin.Int): kotlin.String!
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheckForAdd(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun remove(/*0*/ element: T!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAt(/*0*/ p0: kotlin.Int): T!
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun removeRange(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<T!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: T!): T!
public open override /*1*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList<T!>
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>!
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public abstract class KB : java.util.AbstractList<kotlin.String>, IC {
public constructor KB()
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var modCount: kotlin.Int
public abstract override /*2*/ /*fake_override*/ val size: kotlin.Int
public open override /*1*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.String!): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun add(/*0*/ element: kotlin.String!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun contains(/*0*/ element: kotlin.String!): kotlin.Boolean
public open override /*2*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String>): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): kotlin.String!
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun indexOf(/*0*/ element: kotlin.String!): kotlin.Int
public open override /*2*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<kotlin.String!>
public open override /*1*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: kotlin.String!): kotlin.Int
public open override /*1*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator<kotlin.String!>
public open override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator<kotlin.String!>
invisible_fake open override /*1*/ /*fake_override*/ fun outOfBoundsMsg(/*0*/ p0: kotlin.Int): kotlin.String!
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheckForAdd(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun remove(/*0*/ element: kotlin.String!): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAt(/*0*/ p0: kotlin.Int): kotlin.String!
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun removeRange(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.String!): kotlin.String!
public open override /*1*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList<kotlin.String!>
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>!
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,4 +1,5 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -PARAMETER_NAME_CHANGED_ON_OVERRIDE // !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -PARAMETER_NAME_CHANGED_ON_OVERRIDE
// JAVAC_EXPECTED_FILE
// FILE: A.java // FILE: A.java
import java.util.*; import java.util.*;
@@ -16,7 +17,7 @@ abstract public class B implements java.util.Collection<String> {
// FILE: IC.java // FILE: IC.java
import java.util.*; import java.util.*;
public interface IC implements java.util.Collection<String> { public interface IC extends java.util.Collection<String> {
public boolean containsAll(Collection<?> x); public boolean containsAll(Collection<?> x);
} }
@@ -0,0 +1,28 @@
package
public fun foo(/*0*/ m: MyMap): kotlin.Unit
public abstract class MyMap : java.util.AbstractMap<kotlin.Double!, kotlin.CharSequence!> {
public constructor MyMap()
public abstract override /*1*/ /*fake_override*/ val entries: kotlin.collections.MutableSet<kotlin.collections.MutableMap.MutableEntry<kotlin.Double!, kotlin.CharSequence!>>
invisible_fake final override /*1*/ /*fake_override*/ var keySet: kotlin.collections.(Mutable)Set<kotlin.Double!>!
public open override /*1*/ /*fake_override*/ val keys: kotlin.collections.MutableSet<kotlin.Double!>
public open override /*1*/ /*fake_override*/ val size: kotlin.Int
invisible_fake final override /*1*/ /*fake_override*/ var values: kotlin.collections.(Mutable)Collection<kotlin.CharSequence!>!
public open override /*1*/ /*fake_override*/ val values: kotlin.collections.MutableCollection<kotlin.CharSequence!>
public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any!
public open override /*1*/ /*fake_override*/ fun containsKey(/*0*/ key: kotlin.Double!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun containsValue(/*0*/ value: kotlin.CharSequence!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open override /*1*/ fun get(/*0*/ key: kotlin.Double!): kotlin.String?
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun put(/*0*/ key: kotlin.Double!, /*1*/ value: kotlin.CharSequence!): kotlin.CharSequence?
public open override /*1*/ /*fake_override*/ fun putAll(/*0*/ from: kotlin.collections.Map<out kotlin.Double!, kotlin.CharSequence!>): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun remove(/*0*/ key: kotlin.Double!): kotlin.CharSequence?
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
invisible_fake open override /*1*/ /*fake_override*/ fun eq(/*0*/ p0: kotlin.Any!, /*1*/ p1: kotlin.Any!): kotlin.Boolean
}
@@ -1,4 +1,5 @@
// !DIAGNOSTICS: -UNUSED_VALUE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE // !DIAGNOSTICS: -UNUSED_VALUE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE
// JAVAC_EXPECTED_FILE
// FILE: MyMap.java // FILE: MyMap.java
abstract public class MyMap extends java.util.AbstractMap<Double, CharSequence> { abstract public class MyMap extends java.util.AbstractMap<Double, CharSequence> {
@@ -0,0 +1,76 @@
package
public fun main(/*0*/ a: A<kotlin.String>, /*1*/ b: B<kotlin.String>, /*2*/ c: java.util.ArrayList<kotlin.String>): kotlin.Unit
public abstract class A</*0*/ F : kotlin.Any!> : B<F!> {
public constructor A</*0*/ F : kotlin.Any!>()
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var modCount: kotlin.Int
public abstract override /*1*/ /*fake_override*/ val size: kotlin.Int
public open override /*1*/ /*fake_override*/ fun add(/*0*/ element: F!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: F!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ elements: kotlin.collections.Collection<F!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<F!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun contains(/*0*/ element: F!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<F!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): F!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun indexOf(/*0*/ element: F!): kotlin.Int
public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<F!>
public open override /*1*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: F!): kotlin.Int
public open override /*1*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator<F!>
public open override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator<F!>
invisible_fake open override /*1*/ /*fake_override*/ fun outOfBoundsMsg(/*0*/ p0: kotlin.Int): kotlin.String!
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheckForAdd(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ fun remove(/*0*/ element: F!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<F!>): kotlin.Boolean
public open override /*1*/ fun removeAt(/*0*/ x: kotlin.Int): F!
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun removeRange(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<F!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: F!): F!
public open override /*1*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList<F!>
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>!
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
invisible_fake const final override /*1*/ /*fake_override*/ val MAX_ARRAY_SIZE: kotlin.Int = 2147483639
invisible_fake open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> finishToArray(/*0*/ p0: kotlin.Array<(out) T!>!, /*1*/ p1: kotlin.collections.(Mutable)Iterator<*>!): kotlin.Array<(out) T!>!
invisible_fake open override /*1*/ /*fake_override*/ fun hugeCapacity(/*0*/ p0: kotlin.Int): kotlin.Int
}
public abstract class B</*0*/ T> : kotlin.collections.MutableList<T>, java.util.AbstractList<T> {
public constructor B</*0*/ T>()
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var modCount: kotlin.Int
public abstract override /*2*/ /*fake_override*/ val size: kotlin.Int
public open override /*2*/ /*fake_override*/ fun add(/*0*/ element: T): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: T): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ elements: kotlin.collections.Collection<T>): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<T>): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun contains(/*0*/ element: T): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<T>): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*2*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): T
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*2*/ /*fake_override*/ fun indexOf(/*0*/ element: T): kotlin.Int
public open override /*2*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<T>
public open override /*2*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: T): kotlin.Int
public open override /*2*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator<T>
public open override /*2*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator<T>
invisible_fake open override /*1*/ /*fake_override*/ fun outOfBoundsMsg(/*0*/ p0: kotlin.Int): kotlin.String!
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheckForAdd(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*2*/ fun remove(/*0*/ element: T): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<T>): kotlin.Boolean
public open override /*2*/ fun removeAt(/*0*/ index: kotlin.Int): T
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun removeRange(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<T>): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: T): T
public open override /*2*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList<T>
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>!
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,3 +1,4 @@
// JAVAC_EXPECTED_FILE
// FILE: A.java // FILE: A.java
abstract public class A<F> extends B<F> { abstract public class A<F> extends B<F> {
public F remove(int x) { } public F remove(int x) { }
@@ -0,0 +1,76 @@
package
public fun main(/*0*/ a: A, /*1*/ b: B, /*2*/ c: java.util.ArrayList<kotlin.Int>): kotlin.Unit
public abstract class A : B {
public constructor A()
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var modCount: kotlin.Int
public abstract override /*1*/ /*fake_override*/ val size: kotlin.Int
public open override /*1*/ /*fake_override*/ fun add(/*0*/ element: kotlin.Int): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun contains(/*0*/ element: kotlin.Int): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): kotlin.Int
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun indexOf(/*0*/ element: kotlin.Int): kotlin.Int
public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<kotlin.Int>
public open override /*1*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: kotlin.Int): kotlin.Int
public open override /*1*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator<kotlin.Int>
public open override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator<kotlin.Int>
invisible_fake open override /*1*/ /*fake_override*/ fun outOfBoundsMsg(/*0*/ p0: kotlin.Int): kotlin.String!
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheckForAdd(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ fun remove(/*0*/ element: kotlin.Int): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
public open override /*1*/ fun removeAt(/*0*/ index: kotlin.Int): kotlin.Int
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun removeRange(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.Int): kotlin.Int
public open override /*1*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList<kotlin.Int>
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>!
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
invisible_fake const final override /*1*/ /*fake_override*/ val MAX_ARRAY_SIZE: kotlin.Int = 2147483639
invisible_fake open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> finishToArray(/*0*/ p0: kotlin.Array<(out) T!>!, /*1*/ p1: kotlin.collections.(Mutable)Iterator<*>!): kotlin.Array<(out) T!>!
invisible_fake open override /*1*/ /*fake_override*/ fun hugeCapacity(/*0*/ p0: kotlin.Int): kotlin.Int
}
public abstract class B : kotlin.collections.MutableList<kotlin.Int>, java.util.AbstractList<kotlin.Int> {
public constructor B()
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var modCount: kotlin.Int
public abstract override /*2*/ /*fake_override*/ val size: kotlin.Int
public open override /*2*/ /*fake_override*/ fun add(/*0*/ element: kotlin.Int): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.Int): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun contains(/*0*/ element: kotlin.Int): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*2*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): kotlin.Int
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*2*/ /*fake_override*/ fun indexOf(/*0*/ element: kotlin.Int): kotlin.Int
public open override /*2*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<kotlin.Int>
public open override /*2*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: kotlin.Int): kotlin.Int
public open override /*2*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator<kotlin.Int>
public open override /*2*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator<kotlin.Int>
invisible_fake open override /*1*/ /*fake_override*/ fun outOfBoundsMsg(/*0*/ p0: kotlin.Int): kotlin.String!
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheckForAdd(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*2*/ fun remove(/*0*/ element: kotlin.Int): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
public open override /*2*/ fun removeAt(/*0*/ index: kotlin.Int): kotlin.Int
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun removeRange(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<kotlin.Int>): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.Int): kotlin.Int
public open override /*2*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList<kotlin.Int>
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>!
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,3 +1,4 @@
// JAVAC_EXPECTED_FILE
// FILE: A.java // FILE: A.java
abstract public class A extends B { abstract public class A extends B {
public Integer removeAt(int x) { } public Integer removeAt(int x) { }
@@ -1,3 +1,4 @@
// JAVAC_SKIP
// FILE: A.java // FILE: A.java
public class A { public class A {
public B b() {} public B b() {}
@@ -0,0 +1,106 @@
package
public abstract class A : java.util.ArrayList<kotlin.String!> {
public constructor A()
invisible_fake final override /*1*/ /*fake_override*/ var elementData: kotlin.Array<(out) kotlin.Any!>!
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var modCount: kotlin.Int
public final override /*1*/ val size: kotlin.Int
invisible_fake final override /*1*/ /*fake_override*/ var size: kotlin.Int
public open override /*1*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.String!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun add(/*0*/ element: kotlin.String!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
invisible_fake open override /*1*/ /*fake_override*/ fun batchRemove(/*0*/ p0: kotlin.collections.(Mutable)Collection<*>!, /*1*/ p1: kotlin.Boolean): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public open override /*1*/ /*fake_override*/ fun contains(/*0*/ element: kotlin.String!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
invisible_fake open override /*1*/ /*fake_override*/ fun elementData(/*0*/ p0: kotlin.Int): kotlin.String!
public open override /*1*/ /*fake_override*/ fun ensureCapacity(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun ensureCapacityInternal(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun ensureExplicitCapacity(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
invisible_fake open override /*1*/ /*fake_override*/ fun fastRemove(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): kotlin.String!
invisible_fake open override /*1*/ /*fake_override*/ fun grow(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun indexOf(/*0*/ element: kotlin.String!): kotlin.Int
public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<kotlin.String!>
public open override /*1*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: kotlin.String!): kotlin.Int
public open override /*1*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator<kotlin.String!>
public open override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator<kotlin.String!>
invisible_fake open override /*1*/ /*fake_override*/ fun outOfBoundsMsg(/*0*/ p0: kotlin.Int): kotlin.String!
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheck(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheckForAdd(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun readObject(/*0*/ p0: java.io.ObjectInputStream!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun remove(/*0*/ element: kotlin.String!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAt(/*0*/ p0: kotlin.Int): kotlin.String!
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun removeRange(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.String!): kotlin.String!
public open override /*1*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList<kotlin.String!>
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>!
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public open override /*1*/ /*fake_override*/ fun trimToSize(): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun writeObject(/*0*/ p0: java.io.ObjectOutputStream!): kotlin.Unit
// Static members
invisible_fake const final override /*1*/ /*fake_override*/ val DEFAULT_CAPACITY: kotlin.Int = 10
invisible_fake final override /*1*/ /*fake_override*/ val EMPTY_ELEMENTDATA: kotlin.Array<(out) kotlin.Any!>!
invisible_fake const final override /*1*/ /*fake_override*/ val MAX_ARRAY_SIZE: kotlin.Int = 2147483639
invisible_fake const final override /*1*/ /*fake_override*/ val serialVersionUID: kotlin.Long = 8683452581122892189.toLong()
invisible_fake open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> finishToArray(/*0*/ p0: kotlin.Array<(out) T!>!, /*1*/ p1: kotlin.collections.(Mutable)Iterator<*>!): kotlin.Array<(out) T!>!
invisible_fake open override /*1*/ /*fake_override*/ fun hugeCapacity(/*0*/ p0: kotlin.Int): kotlin.Int
invisible_fake open override /*1*/ /*fake_override*/ fun subListRangeCheck(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int): kotlin.Unit
}
public final class B : A {
public constructor B()
invisible_fake final override /*1*/ /*fake_override*/ var elementData: kotlin.Array<(out) kotlin.Any!>!
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var modCount: kotlin.Int
public open override /*1*/ val size: kotlin.Int = 1
invisible_fake final override /*1*/ /*fake_override*/ var size: kotlin.Int
public open override /*1*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.String!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun add(/*0*/ element: kotlin.String!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
invisible_fake open override /*1*/ /*fake_override*/ fun batchRemove(/*0*/ p0: kotlin.collections.(Mutable)Collection<*>!, /*1*/ p1: kotlin.Boolean): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public open override /*1*/ /*fake_override*/ fun contains(/*0*/ element: kotlin.String!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
invisible_fake open override /*1*/ /*fake_override*/ fun elementData(/*0*/ p0: kotlin.Int): kotlin.String!
public open override /*1*/ /*fake_override*/ fun ensureCapacity(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun ensureCapacityInternal(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun ensureExplicitCapacity(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
invisible_fake open override /*1*/ /*fake_override*/ fun fastRemove(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): kotlin.String!
invisible_fake open override /*1*/ /*fake_override*/ fun grow(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun indexOf(/*0*/ element: kotlin.String!): kotlin.Int
public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator<kotlin.String!>
public open override /*1*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: kotlin.String!): kotlin.Int
public open override /*1*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator<kotlin.String!>
public open override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator<kotlin.String!>
invisible_fake open override /*1*/ /*fake_override*/ fun outOfBoundsMsg(/*0*/ p0: kotlin.Int): kotlin.String!
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheck(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheckForAdd(/*0*/ p0: kotlin.Int): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun readObject(/*0*/ p0: java.io.ObjectInputStream!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun remove(/*0*/ element: kotlin.String!): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun removeAt(/*0*/ p0: kotlin.Int): kotlin.String!
protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun removeRange(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<kotlin.String!>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.String!): kotlin.String!
public open override /*1*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList<kotlin.String!>
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>!
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public open override /*1*/ /*fake_override*/ fun trimToSize(): kotlin.Unit
invisible_fake open override /*1*/ /*fake_override*/ fun writeObject(/*0*/ p0: java.io.ObjectOutputStream!): kotlin.Unit
}
@@ -1,3 +1,4 @@
// JAVAC_EXPECTED_FILE
// FILE: A.java // FILE: A.java
abstract public class A extends java.util.ArrayList<String> { abstract public class A extends java.util.ArrayList<String> {
@@ -1,5 +1,43 @@
package package
package a {
public open class M {
public constructor M()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public open inner class Inner {
public constructor Inner()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class Nested {
public constructor Nested()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
private open inner class PrInner {
private constructor PrInner()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
private open class PrNested {
private constructor PrNested()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
}
package b { package b {
public fun f(): kotlin.Unit public fun f(): kotlin.Unit
} }
@@ -1,5 +1,27 @@
package package
package a {
public open class M {
public constructor M()
public/*package*/ final var m: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
package b {
public open class F : a.M {
public constructor F()
invisible_fake final override /*1*/ /*fake_override*/ var m: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
package c { package c {
public fun f(): kotlin.Unit public fun f(): kotlin.Unit
} }
@@ -0,0 +1,30 @@
package
package backend {
public open class ECallable {
public constructor ECallable()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public final fun test(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
package frontend {
public final class JvmDeclarationOrigin {
public constructor JvmDeclarationOrigin()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public companion object Companion {
private constructor Companion()
public final val NO_ORIGIN: frontend.JvmDeclarationOrigin
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
}
@@ -1,3 +1,4 @@
// JAVAC_EXPECTED_FILE
// FILE: backend/asmutil/AsmUtil.java // FILE: backend/asmutil/AsmUtil.java
package backend.asmutil; package backend.asmutil;
+19
View File
@@ -1,5 +1,24 @@
package package
package a {
public open class M {
public constructor M()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public open class Inner {
public constructor Inner(/*0*/ i: kotlin.Int)
private final var i: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun getI(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
}
package b { package b {
public fun doSmth(/*0*/ b: a.M.Inner): a.M.Inner public fun doSmth(/*0*/ b: a.M.Inner): a.M.Inner
public fun foo(): kotlin.Unit public fun foo(): kotlin.Unit
+14
View File
@@ -1,5 +1,19 @@
package package
package a {
public open class C</*0*/ B : a.C<B!>!> {
public constructor C</*0*/ B : a.C<B!>!>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun foo(): a.C<(raw) a.C<*>!>!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public open fun create(): a.C<*>!
}
}
package d { package d {
public fun test(): kotlin.Unit public fun test(): kotlin.Unit
} }
@@ -1,5 +1,18 @@
package package
package a {
public interface JC</*0*/ T : kotlin.Any!> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun getIterable(): kotlin.collections.(Mutable)Iterable<T!>!
public abstract fun getIterator(): kotlin.collections.(Mutable)Iterator<T!>!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract fun setIterable(/*0*/ iterable: kotlin.collections.(Mutable)Iterable<T!>!): kotlin.Unit
public abstract fun setIterator(/*0*/ iterator: kotlin.collections.(Mutable)Iterator<T!>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
package n { package n {
public fun foo(/*0*/ c: a.JC<kotlin.Int>, /*1*/ iterator: kotlin.collections.Iterator<kotlin.Int>, /*2*/ iterable: kotlin.collections.Iterable<kotlin.Int>): kotlin.Unit public fun foo(/*0*/ c: a.JC<kotlin.Int>, /*1*/ iterator: kotlin.collections.Iterator<kotlin.Int>, /*2*/ iterable: kotlin.collections.Iterable<kotlin.Int>): kotlin.Unit
} }

Some files were not shown because too many files have changed in this diff Show More