Simplify DefaultImportProvider, introduce "low priority imports"

Previously, packages `java.lang` and `kotlin.jvm` were imported on JVM
by default on the same rights, causing problems when the same classifier
existed both in `java.lang` and `kotlin.jvm`. Since the only known case
of such conflict were type aliases to JVM classes, the corresponding
classes (expansions of those type aliases) were manually excluded from
default imports. This made the code in DefaultImportProvider complicated
and resulted in multiple problems, regarding both correctness and
performance (see 82364ad3e5, a9f2f5c7d0, dd3dbda719).

This change adds a new concept, a "low priority import", and treats
`java.lang` as such. Since these imports are now separated from the rest
of default imports in LazyImportScope via secondaryClassImportResolver,
conflicts between classifiers are handled naturally: the one from
`kotlin.jvm` always wins (unless the one from `java.lang` is imported
explicitly, of course). This approach is simpler, safer and does not
require any memory to cache anything.

Skip ResolveToJava.kt test for javac-based resolve; it now fails because
of a weird issue which I didn't have time to investigate (this is OK
because it's a corner case of an experimental functionality)
This commit is contained in:
Alexander Udalov
2018-04-04 01:14:04 +02:00
parent 857cc0f728
commit 1f0fb4823f
22 changed files with 175 additions and 161 deletions
@@ -29,7 +29,6 @@ object JvmPlatform : TargetPlatform("JVM") {
ArrayList<ImportPath>().apply { ArrayList<ImportPath>().apply {
addAll(Common.getDefaultImports(includeKotlinComparisons)) addAll(Common.getDefaultImports(includeKotlinComparisons))
add(ImportPath.fromString("java.lang.*"))
add(ImportPath.fromString("kotlin.jvm.*")) add(ImportPath.fromString("kotlin.jvm.*"))
fun addAllClassifiersFromScope(scope: MemberScope) { fun addAllClassifiersFromScope(scope: MemberScope) {
@@ -46,6 +45,8 @@ object JvmPlatform : TargetPlatform("JVM") {
} }
override val defaultLowPriorityImports: List<ImportPath> = listOf(ImportPath.fromString("java.lang.*"))
override fun getDefaultImports(includeKotlinComparisons: Boolean): List<ImportPath> = defaultImports(includeKotlinComparisons) override fun getDefaultImports(includeKotlinComparisons: Boolean): List<ImportPath> = defaultImports(includeKotlinComparisons)
override val platformConfigurator: PlatformConfigurator = JvmPlatformConfigurator override val platformConfigurator: PlatformConfigurator = JvmPlatformConfigurator
@@ -24,7 +24,11 @@ abstract class TargetPlatform(val platformName: String) {
override fun toString() = platformName override fun toString() = platformName
abstract val platformConfigurator: PlatformConfigurator abstract val platformConfigurator: PlatformConfigurator
open val defaultLowPriorityImports: List<ImportPath> get() = emptyList()
abstract fun getDefaultImports(includeKotlinComparisons: Boolean): List<ImportPath> abstract fun getDefaultImports(includeKotlinComparisons: Boolean): List<ImportPath>
open val excludedImports: List<FqName> get() = emptyList() open val excludedImports: List<FqName> get() = emptyList()
abstract val multiTargetPlatform: MultiTargetPlatform abstract val multiTargetPlatform: MultiTargetPlatform
@@ -16,73 +16,24 @@
package org.jetbrains.kotlin.resolve.lazy package org.jetbrains.kotlin.resolve.lazy
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.LanguageFeature.DefaultImportOfPackageKotlinComparisons import org.jetbrains.kotlin.config.LanguageFeature.DefaultImportOfPackageKotlinComparisons
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.isChildOf
import org.jetbrains.kotlin.name.isSubpackageOf
import org.jetbrains.kotlin.resolve.ImportPath import org.jetbrains.kotlin.resolve.ImportPath
import org.jetbrains.kotlin.resolve.SinceKotlinAccessibility import org.jetbrains.kotlin.resolve.SinceKotlinAccessibility
import org.jetbrains.kotlin.resolve.TargetPlatform import org.jetbrains.kotlin.resolve.TargetPlatform
import org.jetbrains.kotlin.resolve.checkSinceKotlinVersionAccessibility
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.storage.getValue import org.jetbrains.kotlin.storage.getValue
class DefaultImportProvider( class DefaultImportProvider(
storageManager: StorageManager, storageManager: StorageManager,
moduleDescriptor: ModuleDescriptor,
private val targetPlatform: TargetPlatform, private val targetPlatform: TargetPlatform,
private val languageVersionSettings: LanguageVersionSettings private val languageVersionSettings: LanguageVersionSettings
) { ) {
companion object {
private val PACKAGES_WITH_ALIASES = listOf(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME, KotlinBuiltIns.TEXT_PACKAGE_FQ_NAME)
private fun ModuleDescriptor.findTypeAliasesInPackages(packages: Collection<FqName>): Collection<TypeAliasDescriptor> {
val result = mutableListOf<TypeAliasDescriptor>()
for (dependencyModuleDescriptor in allDependencyModules) {
if (dependencyModuleDescriptor !is ModuleDescriptorImpl) continue
for (packageFqName in packages) {
dependencyModuleDescriptor.packageFragmentProviderForContent.getPackageFragments(packageFqName)
.flatMapTo(result) { packageFragmentDescriptor ->
packageFragmentDescriptor.getMemberScope()
.getContributedDescriptors(DescriptorKindFilter.TYPE_ALIASES)
.filterIsInstance<TypeAliasDescriptor>()
}
}
}
return result
}
}
val defaultImports: List<ImportPath> by storageManager.createLazyValue { val defaultImports: List<ImportPath> by storageManager.createLazyValue {
targetPlatform.getDefaultImports(languageVersionSettings.supportsFeature(DefaultImportOfPackageKotlinComparisons)) targetPlatform.getDefaultImports(languageVersionSettings.supportsFeature(DefaultImportOfPackageKotlinComparisons))
} }
val excludedImports: List<FqName> by storageManager.createLazyValue { val allDefaultImports: List<ImportPath> by storageManager.createLazyValue {
val builtinTypeAliases = defaultImports + targetPlatform.defaultLowPriorityImports
moduleDescriptor.findTypeAliasesInPackages(PACKAGES_WITH_ALIASES)
.filter { it.checkSinceKotlinVersionAccessibility(languageVersionSettings) == SinceKotlinAccessibility.Accessible }
val nonKotlinDefaultImportedPackages =
defaultImports
.filter { it.isAllUnder }
.mapNotNull {
it.fqName.takeUnless { it.isSubpackageOf(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME) }
}
val nonKotlinAliasedTypeFqNames =
builtinTypeAliases
.mapNotNull { it.expandedType.constructor.declarationDescriptor?.fqNameSafe }
.filter { nonKotlinDefaultImportedPackages.any(it::isChildOf) }
nonKotlinAliasedTypeFqNames + targetPlatform.excludedImports
} }
} }
@@ -45,6 +45,7 @@ class FileScopeFactory(
private val ktImportsFactory: KtImportsFactory, private val ktImportsFactory: KtImportsFactory,
private val platformToKotlinClassMap: PlatformToKotlinClassMap, private val platformToKotlinClassMap: PlatformToKotlinClassMap,
private val defaultImportProvider: DefaultImportProvider, private val defaultImportProvider: DefaultImportProvider,
private val targetPlatform: TargetPlatform,
private val languageVersionSettings: LanguageVersionSettings, private val languageVersionSettings: LanguageVersionSettings,
private val deprecationResolver: DeprecationResolver private val deprecationResolver: DeprecationResolver
) { ) {
@@ -53,6 +54,10 @@ class FileScopeFactory(
ktImportsFactory.createImportDirectivesNotCached(defaultImportProvider.defaultImports) ktImportsFactory.createImportDirectivesNotCached(defaultImportProvider.defaultImports)
} }
private val defaultLowPriorityImports by storageManager.createLazyValue {
ktImportsFactory.createImportDirectivesNotCached(targetPlatform.defaultLowPriorityImports)
}
fun createScopesForFile(file: KtFile, existingImports: ImportingScope? = null): FileScopes { fun createScopesForFile(file: KtFile, existingImports: ImportingScope? = null): FileScopes {
val packageView = moduleDescriptor.getPackage(file.packageFqName) val packageView = moduleDescriptor.getPackage(file.packageFqName)
val packageFragment = topLevelDescriptorProvider.getPackageFragmentOrDiagnoseFailure(file.packageFqName, file) val packageFragment = topLevelDescriptorProvider.getPackageFragmentOrDiagnoseFailure(file.packageFqName, file)
@@ -60,10 +65,16 @@ class FileScopeFactory(
return FilesScopesBuilder(file, existingImports, packageFragment, packageView).result return FilesScopesBuilder(file, existingImports, packageFragment, packageView).result
} }
private data class DefaultImportResolvers(
val explicit: LazyImportResolver,
val allUnder: LazyImportResolver,
val lowPriority: LazyImportResolver
)
private fun createDefaultImportResolvers( private fun createDefaultImportResolvers(
extraImports: Collection<KtImportDirective>, extraImports: Collection<KtImportDirective>,
aliasImportNames: Collection<FqName> aliasImportNames: Collection<FqName>
): Pair<LazyImportResolver, LazyImportResolver> { ): DefaultImportResolvers {
val tempTrace = TemporaryBindingTrace.create(bindingTrace, "Transient trace for default imports lazy resolve", false) val tempTrace = TemporaryBindingTrace.create(bindingTrace, "Transient trace for default imports lazy resolve", false)
val allImplicitImports = defaultImports concat extraImports val allImplicitImports = defaultImports concat extraImports
@@ -73,22 +84,29 @@ class FileScopeFactory(
allImplicitImports.filter { it.isAllUnder || it.importedFqName !in aliasImportNames } allImplicitImports.filter { it.isAllUnder || it.importedFqName !in aliasImportNames }
} }
val defaultExplicitImportResolver = createImportResolver( val explicit = createImportResolver(
ExplicitImportsIndexed(defaultImportsFiltered), ExplicitImportsIndexed(defaultImportsFiltered),
tempTrace, tempTrace,
packageFragment = null, packageFragment = null,
aliasImportNames = aliasImportNames aliasImportNames = aliasImportNames
) )
val defaultAllUnderImportResolver = val allUnder = createImportResolver(
createImportResolver( AllUnderImportsIndexed(defaultImportsFiltered),
AllUnderImportsIndexed(defaultImportsFiltered), tempTrace,
tempTrace, packageFragment = null,
packageFragment = null, aliasImportNames = aliasImportNames,
aliasImportNames = aliasImportNames, excludedImports = targetPlatform.excludedImports
excludedImports = defaultImportProvider.excludedImports )
) val lowPriority = createImportResolver(
AllUnderImportsIndexed(defaultLowPriorityImports.also { imports ->
assert(imports.all { it.isAllUnder }) { "All low priority imports must be all-under: $imports" }
}),
tempTrace,
packageFragment = null,
aliasImportNames = aliasImportNames
)
return defaultExplicitImportResolver to defaultAllUnderImportResolver return DefaultImportResolvers(explicit, allUnder, lowPriority)
} }
private val defaultImportResolvers by storageManager.createLazyValue { private val defaultImportResolvers by storageManager.createLazyValue {
@@ -152,7 +170,7 @@ class FileScopeFactory(
val result = FileScopes(lexicalScope, lazyImportingScope, importResolver) val result = FileScopes(lexicalScope, lazyImportingScope, importResolver)
private fun createDefaultImportResolversForFile(): Pair<LazyImportResolver, LazyImportResolver> { private fun createDefaultImportResolversForFile(): DefaultImportResolvers {
val extraImports = file.takeIf { it.isScript() }?.originalFile?.virtualFile?.let { vFile -> val extraImports = file.takeIf { it.isScript() }?.originalFile?.virtualFile?.let { vFile ->
val scriptExternalDependencies = getScriptExternalDependencies(vFile, file.project) val scriptExternalDependencies = getScriptExternalDependencies(vFile, file.project)
ktImportsFactory.createImportDirectives(scriptExternalDependencies?.imports?.map { ImportPath.fromString(it) }.orEmpty()) ktImportsFactory.createImportDirectives(scriptExternalDependencies?.imports?.map { ImportPath.fromString(it) }.orEmpty())
@@ -166,37 +184,40 @@ class FileScopeFactory(
} }
fun createImportingScope(): LazyImportScope { fun createImportingScope(): LazyImportScope {
val (defaultExplicitImportResolver, defaultAllUnderImportResolver) = createDefaultImportResolversForFile() val (defaultExplicitImportResolver, defaultAllUnderImportResolver, defaultLowPriorityImportResolver) =
createDefaultImportResolversForFile()
val dummyContainerDescriptor = DummyContainerDescriptor(file, packageFragment) val dummyContainerDescriptor = DummyContainerDescriptor(file, packageFragment)
var scope: ImportingScope var scope: ImportingScope
val debugName = "LazyFileScope for file " + file.name val debugName = "LazyFileScope for file " + file.name
scope = LazyImportScope( scope = LazyImportScope(
existingImports, defaultAllUnderImportResolver, LazyImportScope.FilteringKind.INVISIBLE_CLASSES, existingImports, defaultAllUnderImportResolver, defaultLowPriorityImportResolver,
LazyImportScope.FilteringKind.INVISIBLE_CLASSES,
"Default all under imports in $debugName (invisible classes only)" "Default all under imports in $debugName (invisible classes only)"
) )
scope = LazyImportScope( scope = LazyImportScope(
scope, allUnderImportResolver, LazyImportScope.FilteringKind.INVISIBLE_CLASSES, scope, allUnderImportResolver, null, LazyImportScope.FilteringKind.INVISIBLE_CLASSES,
"All under imports in $debugName (invisible classes only)" "All under imports in $debugName (invisible classes only)"
) )
scope = currentPackageScope(packageView, aliasImportNames, dummyContainerDescriptor, FilteringKind.INVISIBLE_CLASSES, scope) scope = currentPackageScope(packageView, aliasImportNames, dummyContainerDescriptor, FilteringKind.INVISIBLE_CLASSES, scope)
scope = LazyImportScope( scope = LazyImportScope(
scope, defaultAllUnderImportResolver, LazyImportScope.FilteringKind.VISIBLE_CLASSES, scope, defaultAllUnderImportResolver, defaultLowPriorityImportResolver, LazyImportScope.FilteringKind.VISIBLE_CLASSES,
"Default all under imports in $debugName (visible classes)" "Default all under imports in $debugName (visible classes)"
) )
scope = LazyImportScope( scope = LazyImportScope(
scope, allUnderImportResolver, LazyImportScope.FilteringKind.VISIBLE_CLASSES, scope, allUnderImportResolver, null, LazyImportScope.FilteringKind.VISIBLE_CLASSES,
"All under imports in $debugName (visible classes)" "All under imports in $debugName (visible classes)"
) )
scope = LazyImportScope( scope = LazyImportScope(
scope, defaultExplicitImportResolver, LazyImportScope.FilteringKind.ALL, scope, defaultExplicitImportResolver, null, LazyImportScope.FilteringKind.ALL,
"Default explicit imports in $debugName" "Default explicit imports in $debugName"
) )
@@ -204,7 +225,7 @@ class FileScopeFactory(
scope = currentPackageScope(packageView, aliasImportNames, dummyContainerDescriptor, FilteringKind.VISIBLE_CLASSES, scope) scope = currentPackageScope(packageView, aliasImportNames, dummyContainerDescriptor, FilteringKind.VISIBLE_CLASSES, scope)
return LazyImportScope(scope, explicitImportResolver, LazyImportScope.FilteringKind.ALL, "Explicit imports in $debugName") return LazyImportScope(scope, explicitImportResolver, null, LazyImportScope.FilteringKind.ALL, "Explicit imports in $debugName")
} }
} }
@@ -228,7 +249,7 @@ class FileScopeFactory(
return object : ImportingScope { return object : ImportingScope {
override val parent: ImportingScope? = parentScope override val parent: ImportingScope? = parentScope
override fun getContributedPackage(name: Name) = null override fun getContributedPackage(name: Name): Nothing? = null
override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? { override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? {
if (name in excludedNames) return null if (name in excludedNames) return null
@@ -38,7 +38,7 @@ import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.util.collectionUtils.concat import org.jetbrains.kotlin.util.collectionUtils.concat
import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.Printer
import org.jetbrains.kotlin.utils.addToStdlib.flatMapToNullable import org.jetbrains.kotlin.utils.addToStdlib.flatMapToNullable
import java.util.* import org.jetbrains.kotlin.utils.ifEmpty
interface IndexedImports { interface IndexedImports {
val imports: List<KtImportDirective> val imports: List<KtImportDirective>
@@ -208,6 +208,7 @@ class LazyImportResolver(
class LazyImportScope( class LazyImportScope(
override val parent: ImportingScope?, override val parent: ImportingScope?,
private val importResolver: LazyImportResolver, private val importResolver: LazyImportResolver,
private val secondaryImportResolver: LazyImportResolver?,
private val filteringKind: LazyImportScope.FilteringKind, private val filteringKind: LazyImportScope.FilteringKind,
private val debugName: String private val debugName: String
) : ImportingScope { ) : ImportingScope {
@@ -218,19 +219,23 @@ class LazyImportScope(
INVISIBLE_CLASSES INVISIBLE_CLASSES
} }
private fun isClassifierVisible(descriptor: ClassifierDescriptor): Boolean { private fun LazyImportResolver.isClassifierVisible(descriptor: ClassifierDescriptor): Boolean {
if (filteringKind == FilteringKind.ALL) return true if (filteringKind == FilteringKind.ALL) return true
if (importResolver.deprecationResolver.isHiddenInResolution(descriptor)) return false if (deprecationResolver.isHiddenInResolution(descriptor)) return false
val visibility = (descriptor as DeclarationDescriptorWithVisibility).visibility val visibility = (descriptor as DeclarationDescriptorWithVisibility).visibility
val includeVisible = filteringKind == FilteringKind.VISIBLE_CLASSES val includeVisible = filteringKind == FilteringKind.VISIBLE_CLASSES
if (!visibility.mustCheckInImports()) return includeVisible if (!visibility.mustCheckInImports()) return includeVisible
return Visibilities.isVisibleIgnoringReceiver(descriptor, importResolver.moduleDescriptor) == includeVisible return Visibilities.isVisibleIgnoringReceiver(descriptor, moduleDescriptor) == includeVisible
} }
override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? { override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? {
return importResolver.selectSingleFromImports(name) { scope, name -> return importResolver.getClassifier(name, location) ?: secondaryImportResolver?.getClassifier(name, location)
}
private fun LazyImportResolver.getClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? {
return selectSingleFromImports(name) { scope, _ ->
val descriptor = scope.getContributedClassifier(name, location) val descriptor = scope.getContributedClassifier(name, location)
if ((descriptor is ClassDescriptor || descriptor is TypeAliasDescriptor) && isClassifierVisible(descriptor)) if ((descriptor is ClassDescriptor || descriptor is TypeAliasDescriptor) && isClassifierVisible(descriptor))
descriptor descriptor
@@ -239,16 +244,20 @@ class LazyImportScope(
} }
} }
override fun getContributedPackage(name: Name) = null override fun getContributedPackage(name: Name): PackageViewDescriptor? = null
override fun getContributedVariables(name: Name, location: LookupLocation): Collection<VariableDescriptor> { override fun getContributedVariables(name: Name, location: LookupLocation): Collection<VariableDescriptor> {
if (filteringKind == FilteringKind.INVISIBLE_CLASSES) return listOf() if (filteringKind == FilteringKind.INVISIBLE_CLASSES) return listOf()
return importResolver.collectFromImports(name) { scope, name -> scope.getContributedVariables(name, location) } return importResolver.collectFromImports(name) { scope, _ -> scope.getContributedVariables(name, location) }.ifEmpty {
secondaryImportResolver?.collectFromImports(name) { scope, _ -> scope.getContributedVariables(name, location) }.orEmpty()
}
} }
override fun getContributedFunctions(name: Name, location: LookupLocation): Collection<FunctionDescriptor> { override fun getContributedFunctions(name: Name, location: LookupLocation): Collection<FunctionDescriptor> {
if (filteringKind == FilteringKind.INVISIBLE_CLASSES) return listOf() if (filteringKind == FilteringKind.INVISIBLE_CLASSES) return listOf()
return importResolver.collectFromImports(name) { scope, name -> scope.getContributedFunctions(name, location) } return importResolver.collectFromImports(name) { scope, _ -> scope.getContributedFunctions(name, location) }.ifEmpty {
secondaryImportResolver?.collectFromImports(name) { scope, _ -> scope.getContributedFunctions(name, location) }.orEmpty()
}
} }
override fun getContributedDescriptors( override fun getContributedDescriptors(
@@ -259,26 +268,49 @@ class LazyImportScope(
// we do not perform any filtering by visibility here because all descriptors from both visible/invisible filter scopes are to be added anyway // we do not perform any filtering by visibility here because all descriptors from both visible/invisible filter scopes are to be added anyway
if (filteringKind == FilteringKind.INVISIBLE_CLASSES) return listOf() if (filteringKind == FilteringKind.INVISIBLE_CLASSES) return listOf()
return importResolver.storageManager.compute { val storageManager = importResolver.storageManager
val descriptors = LinkedHashSet<DeclarationDescriptor>() if (secondaryImportResolver != null) {
assert(storageManager === secondaryImportResolver.storageManager) { "Multiple storage managers are not supported" }
}
return storageManager.compute {
val result = linkedSetOf<DeclarationDescriptor>()
val importedNames = if (secondaryImportResolver == null) null else hashSetOf<Name>()
for (directive in importResolver.indexedImports.imports) { for (directive in importResolver.indexedImports.imports) {
val importPath = directive.importPath ?: continue val importPath = directive.importPath ?: continue
val importedName = importPath.importedName val importedName = importPath.importedName
if (importedName == null || nameFilter(importedName)) { if (importedName == null || nameFilter(importedName)) {
descriptors.addAll( val newDescriptors =
importResolver.getImportScope(directive).getContributedDescriptors( importResolver.getImportScope(directive).getContributedDescriptors(kindFilter, nameFilter, changeNamesForAliased)
kindFilter, result.addAll(newDescriptors)
nameFilter,
changeNamesForAliased if (importedNames != null) {
) for (descriptor in newDescriptors) {
) importedNames.add(descriptor.name)
}
}
} }
} }
descriptors
secondaryImportResolver?.let { resolver ->
for (directive in resolver.indexedImports.imports) {
val newDescriptors =
resolver.getImportScope(directive).getContributedDescriptors(kindFilter, nameFilter, changeNamesForAliased)
for (descriptor in newDescriptors) {
if (descriptor.name !in importedNames!!) {
result.add(descriptor)
}
}
}
}
result
} }
} }
override fun toString() = "LazyImportScope: " + debugName override fun toString() = "LazyImportScope: $debugName"
override fun printStructure(p: Printer) { override fun printStructure(p: Printer) {
p.println(this::class.java.simpleName, ": ", debugName, " {") p.println(this::class.java.simpleName, ": ", debugName, " {")
@@ -288,11 +320,13 @@ class LazyImportScope(
p.println("}") p.println("}")
} }
override fun definitelyDoesNotContainName(name: Name) = importResolver.definitelyDoesNotContainName(name) override fun definitelyDoesNotContainName(name: Name): Boolean =
importResolver.definitelyDoesNotContainName(name) && secondaryImportResolver?.definitelyDoesNotContainName(name) != false
override fun recordLookup(name: Name, location: LookupLocation) { override fun recordLookup(name: Name, location: LookupLocation) {
importResolver.recordLookup(name, location) importResolver.recordLookup(name, location)
secondaryImportResolver?.recordLookup(name, location)
} }
override fun computeImportedNames() = importResolver.allNames override fun computeImportedNames(): Set<Name>? = importResolver.allNames?.union(secondaryImportResolver?.allNames.orEmpty())
} }
+1
View File
@@ -1,5 +1,6 @@
// !WITH_NEW_INFERENCE // !WITH_NEW_INFERENCE
// !CHECK_TYPE // !CHECK_TYPE
// JAVAC_SKIP
// FILE: f.kt // FILE: f.kt
@@ -136,14 +136,6 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
return packageFragmentProviderForWholeModuleWithDependencies return packageFragmentProviderForWholeModuleWithDependencies
} }
val packageFragmentProviderForContent: PackageFragmentProvider
get() {
assertValid()
return packageFragmentProviderForModuleContent.sure {
"Module $id was not initialized by the time packageFragmentProviderForContent was requested"
}
}
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
override fun <T> getCapability(capability: ModuleDescriptor.Capability<T>) = capabilities[capability] as? T override fun <T> getCapability(capability: ModuleDescriptor.Capability<T>) = capabilities[capability] as? T
} }
@@ -27,6 +27,8 @@ abstract class ImportInsertHelper {
/*TODO: implementation is not quite correct*/ /*TODO: implementation is not quite correct*/
abstract fun isImportedWithDefault(importPath: ImportPath, contextFile: KtFile): Boolean abstract fun isImportedWithDefault(importPath: ImportPath, contextFile: KtFile): Boolean
abstract fun isImportedWithLowPriorityDefaultImport(importPath: ImportPath, contextFile: KtFile): Boolean
abstract fun mayImportOnShortenReferences(descriptor: DeclarationDescriptor): Boolean abstract fun mayImportOnShortenReferences(descriptor: DeclarationDescriptor): Boolean
abstract val importSortComparator: Comparator<ImportPath> abstract val importSortComparator: Comparator<ImportPath>
@@ -260,7 +260,7 @@ class PsiBasedClassResolver @TestOnly constructor(private val targetClassFqName:
private fun KtFile.getDefaultImports(): List<ImportPath> { private fun KtFile.getDefaultImports(): List<ImportPath> {
val moduleInfo = getNullableModuleInfo() ?: return emptyList() val moduleInfo = getNullableModuleInfo() ?: return emptyList()
val versionSettings = IDELanguageSettingsProvider.getLanguageVersionSettings(moduleInfo, project) val versionSettings = IDELanguageSettingsProvider.getLanguageVersionSettings(moduleInfo, project)
return TargetPlatformDetector.getPlatform(this).getDefaultImports( val platform = TargetPlatformDetector.getPlatform(this)
versionSettings.supportsFeature(LanguageFeature.DefaultImportOfPackageKotlinComparisons) return platform.getDefaultImports(versionSettings.supportsFeature(LanguageFeature.DefaultImportOfPackageKotlinComparisons)) +
) platform.defaultLowPriorityImports
} }
@@ -139,7 +139,8 @@ object ReplaceWithAnnotationAnalyzer {
} }
private fun buildDefaultImportsScopes(resolutionFacade: ResolutionFacade, module: ModuleDescriptor): List<ImportingScope> { private fun buildDefaultImportsScopes(resolutionFacade: ResolutionFacade, module: ModuleDescriptor): List<ImportingScope> {
val (allUnderImports, aliasImports) = resolutionFacade.frontendService<DefaultImportProvider>().defaultImports.partition { it.isAllUnder } val (allUnderImports, aliasImports) =
resolutionFacade.frontendService<DefaultImportProvider>().allDefaultImports.partition { it.isAllUnder }
// this solution doesn't support aliased default imports with a different alias // this solution doesn't support aliased default imports with a different alias
// TODO: Create import directives from ImportPath, create ImportResolver, create LazyResolverScope, see FileScopeProviderImpl // TODO: Create import directives from ImportPath, create ImportResolver, create LazyResolverScope, see FileScopeProviderImpl
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.idea.core.targetDescriptors
import org.jetbrains.kotlin.idea.imports.ImportPathComparator import org.jetbrains.kotlin.idea.imports.ImportPathComparator
import org.jetbrains.kotlin.idea.imports.getImportableTargets import org.jetbrains.kotlin.idea.imports.getImportableTargets
import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.imports.importableFqName
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
import org.jetbrains.kotlin.idea.refactoring.fqName.isImported import org.jetbrains.kotlin.idea.refactoring.fqName.isImported
import org.jetbrains.kotlin.idea.resolve.frontendService import org.jetbrains.kotlin.idea.resolve.frontendService
import org.jetbrains.kotlin.idea.util.ImportDescriptorResult import org.jetbrains.kotlin.idea.util.ImportDescriptorResult
@@ -59,7 +60,13 @@ class ImportInsertHelperImpl(private val project: Project) : ImportInsertHelper(
override fun isImportedWithDefault(importPath: ImportPath, contextFile: KtFile): Boolean { override fun isImportedWithDefault(importPath: ImportPath, contextFile: KtFile): Boolean {
val defaultImportProvider = contextFile.getResolutionFacade().frontendService<DefaultImportProvider>() val defaultImportProvider = contextFile.getResolutionFacade().frontendService<DefaultImportProvider>()
return importPath.isImported(defaultImportProvider.defaultImports, defaultImportProvider.excludedImports) val platform = TargetPlatformDetector.getPlatform(contextFile)
return importPath.isImported(defaultImportProvider.allDefaultImports, platform.excludedImports)
}
override fun isImportedWithLowPriorityDefaultImport(importPath: ImportPath, contextFile: KtFile): Boolean {
val platform = TargetPlatformDetector.getPlatform(contextFile)
return importPath.isImported(platform.defaultLowPriorityImports, platform.excludedImports)
} }
override fun mayImportOnShortenReferences(descriptor: DeclarationDescriptor): Boolean { override fun mayImportOnShortenReferences(descriptor: DeclarationDescriptor): Boolean {
@@ -162,8 +162,8 @@ private fun renderImportName(fqName: FqName, isOnDemand: Boolean)
= if (isOnDemand) fqName.render() + ".*" else fqName.render() = if (isOnDemand) fqName.render() + ".*" else fqName.render()
private val DEFAULT_IMPORTS_SET: Set<FqName> = JvmPlatform.getDefaultImports( private val DEFAULT_IMPORTS_SET: Set<FqName> = JvmPlatform.getDefaultImports(
// TODO: use the correct LanguageVersionSettings instance here // TODO: use the correct LanguageVersionSettings instance here
LanguageVersionSettingsImpl.DEFAULT.supportsFeature(LanguageFeature.DefaultImportOfPackageKotlinComparisons) LanguageVersionSettingsImpl.DEFAULT.supportsFeature(LanguageFeature.DefaultImportOfPackageKotlinComparisons)
).filter { it.isAllUnder }.map { it.fqName }.toSet() ).plus(JvmPlatform.defaultLowPriorityImports).filter { it.isAllUnder }.map { it.fqName }.toSet()
private fun isImportedByDefault(c: KtLightClass) = c.qualifiedName?.let { FqName(it).parent() } in DEFAULT_IMPORTS_SET private fun isImportedByDefault(c: KtLightClass) = c.qualifiedName?.let { FqName(it).parent() } in DEFAULT_IMPORTS_SET
@@ -3,12 +3,12 @@ package foo
/*p:bar(SAMInterface)*/import bar.SAMInterface /*p:bar(SAMInterface)*/import bar.SAMInterface
/*p:foo*/fun foo(c: /*p:bar*/C) /*p:bar(SAMInterface)*/{ /*p:foo*/fun foo(c: /*p:bar*/C) /*p:bar(SAMInterface)*/{
/*p:bar(C)*/c./*c:bar.C c:bar.SAMInterface(<SAM-CONSTRUCTOR>) c:bar.C(getFoo) c:bar.C(getFOO) p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/foo() /*p:bar(C)*/c./*c:bar.C c:bar.SAMInterface(<SAM-CONSTRUCTOR>) c:bar.C(getFoo) c:bar.C(getFOO) p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/foo()
/*p:bar(C)*/c./*c:bar.C c:bar.SAMInterface(<SAM-CONSTRUCTOR>)*/foo /*p:kotlin(Function1) p:kotlin(String)*/{ } /*p:bar(C)*/c./*c:bar.C c:bar.SAMInterface(<SAM-CONSTRUCTOR>)*/foo /*p:kotlin(Function1) p:kotlin(String)*/{ }
/*p:bar p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/C./*c:bar.C c:bar.SAMInterface(<SAM-CONSTRUCTOR>)*/bar() /*p:bar p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/C./*c:bar.C c:bar.SAMInterface(<SAM-CONSTRUCTOR>)*/bar()
/*p:bar p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/C./*c:bar.C c:bar.SAMInterface(<SAM-CONSTRUCTOR>)*/bar /*p:kotlin(Function1) p:kotlin(String)*/{} /*p:bar p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/C./*c:bar.C c:bar.SAMInterface(<SAM-CONSTRUCTOR>)*/bar /*p:kotlin(Function1) p:kotlin(String)*/{}
/*p:bar c:bar.SAMInterface(<SAM-CONSTRUCTOR>) p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/SAMInterface() /*p:bar c:bar.SAMInterface(<SAM-CONSTRUCTOR>) p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/SAMInterface()
/*p:bar c:bar.SAMInterface(<SAM-CONSTRUCTOR>)*/SAMInterface /*p:kotlin(Function1) p:kotlin(String)*/{} /*p:bar c:bar.SAMInterface(<SAM-CONSTRUCTOR>)*/SAMInterface /*p:kotlin(Function1) p:kotlin(String)*/{}
} }
@@ -18,9 +18,9 @@ import bar.*
/*c:foo.A*/foo() /*c:foo.A*/foo()
/*p:foo(A) p:kotlin(Int)*/this./*c:foo.A*/a /*p:foo(A) p:kotlin(Int)*/this./*c:foo.A*/a
/*p:foo(A)*/this./*c:foo.A*/foo() /*p:foo(A)*/this./*c:foo.A*/foo()
/*c:foo.A c:foo.A(getBaz) c:foo.A(getBAZ) c:foo.A.Companion p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/baz() /*c:foo.A c:foo.A(getBaz) c:foo.A(getBAZ) c:foo.A.Companion p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/baz()
/*c:foo.A c:foo.A.Companion p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(Int)*/Companion./*c:foo.A.Companion*/a /*c:foo.A c:foo.A.Companion p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:kotlin(Int)*/Companion./*c:foo.A.Companion*/a
/*c:foo.A c:foo.A.Companion p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(String)*/O./*c:foo.A.O*/v = /*p:kotlin(String)*/"OK" /*c:foo.A c:foo.A.Companion p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:kotlin(String)*/O./*c:foo.A.O*/v = /*p:kotlin(String)*/"OK"
} }
class B { class B {
@@ -64,8 +64,8 @@ import bar.*
val a = /*p:kotlin(Int)*/1 val a = /*p:kotlin(Int)*/1
fun foo() { fun foo() {
/*c:foo.E p:kotlin(Int)*/a /*c:foo.E p:kotlin(Int)*/a
/*c:foo.E p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(Int)*/Y./*c:foo.E*/a /*c:foo.E p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:kotlin(Int)*/Y./*c:foo.E*/a
/*c:foo.E*/foo() /*c:foo.E*/foo()
/*c:foo.E p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/X./*c:foo.E*/foo() /*c:foo.E p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/X./*c:foo.E*/foo()
} }
} }
@@ -29,11 +29,11 @@ import bar.*
val iii = /*p:foo p:foo(I)*/Obj./*c:foo.Obj*/bar() val iii = /*p:foo p:foo(I)*/Obj./*c:foo.Obj*/bar()
/*p:foo(I)*/iii./*c:foo.I*/foo() /*p:foo(I)*/iii./*c:foo.I*/foo()
/*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/E./*c:foo.E*/X /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/E./*c:foo.E*/X
/*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(Int)*/E./*c:foo.E*/X./*c:foo.E*/a /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:kotlin(Int)*/E./*c:foo.E*/X./*c:foo.E*/a
/*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/E./*c:foo.E*/Y./*c:foo.E*/foo() /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/E./*c:foo.E*/Y./*c:foo.E*/foo()
/*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(Array)*/E./*c:foo.E*/values() /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:kotlin(Array)*/E./*c:foo.E*/values()
/*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/E./*c:foo.E*/valueOf(/*p:kotlin(String)*/"") /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/E./*c:foo.E*/valueOf(/*p:kotlin(String)*/"")
} }
/*p:foo*/fun classifiers( /*p:foo*/fun classifiers(
@@ -18,8 +18,8 @@ import bar.*
/*p:foo*/A./*c:foo.A*/Companion./*c:foo.A.Companion*/baz() /*p:foo*/A./*c:foo.A*/Companion./*c:foo.A.Companion*/baz()
/*p:foo c:foo.A(O)*/A./*c:foo.A.Companion c:foo.A*/O /*p:foo c:foo.A(O)*/A./*c:foo.A.Companion c:foo.A*/O
/*p:foo p:kotlin(String)*/A./*c:foo.A*/O./*c:foo.A.O*/v = /*p:kotlin(String)*/"OK" /*p:foo p:kotlin(String)*/A./*c:foo.A*/O./*c:foo.A.O*/v = /*p:kotlin(String)*/"OK"
/*p:foo*/A./*c:foo.A.Companion c:foo.A c:foo.A.Companion(getVala) c:foo.A.Companion(getVALA) p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/vala /*p:foo*/A./*c:foo.A.Companion c:foo.A c:foo.A.Companion(getVala) c:foo.A.Companion(getVALA) p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/vala
/*p:foo*/A./*c:foo.A c:foo.A.Companion c:foo.A.Companion(getVara) c:foo.A.Companion(getVARA) p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/vara() /*p:foo*/A./*c:foo.A c:foo.A.Companion c:foo.A.Companion(getVara) c:foo.A.Companion(getVARA) p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/vara()
/*p:foo(I) p:kotlin(Int)*/i./*c:foo.I*/a = /*p:kotlin(Int)*/2 /*p:foo(I) p:kotlin(Int)*/i./*c:foo.I*/a = /*p:kotlin(Int)*/2
/*p:foo p:kotlin(Int)*/Obj./*c:foo.Obj*/a /*p:foo p:kotlin(Int)*/Obj./*c:foo.Obj*/a
@@ -31,13 +31,13 @@ import bar.*
val iii = /*p:foo p:foo(I)*/Obj./*c:foo.Obj*/bar() val iii = /*p:foo p:foo(I)*/Obj./*c:foo.Obj*/bar()
/*p:foo(I)*/iii./*c:foo.I*/foo() /*p:foo(I)*/iii./*c:foo.I*/foo()
/*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/E./*c:foo.E*/X /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/E./*c:foo.E*/X
/*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(Int)*/E./*c:foo.E*/X./*c:foo.E*/a /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:kotlin(Int)*/E./*c:foo.E*/X./*c:foo.E*/a
/*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/E./*c:foo.E*/Y./*c:foo.E*/foo() /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/E./*c:foo.E*/Y./*c:foo.E*/foo()
/*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(Array)*/E./*c:foo.E*/values() /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:kotlin(Array)*/E./*c:foo.E*/values()
/*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/E./*c:foo.E*/valueOf(/*p:kotlin(String)*/"") /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/E./*c:foo.E*/valueOf(/*p:kotlin(String)*/"")
/*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/E./*c:foo.E*/foo /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/E./*c:foo.E*/foo
/*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/E./*c:foo.E*/bar() /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/E./*c:foo.E*/bar()
} }
/*p:foo*/fun classifiers( /*p:foo*/fun classifiers(
@@ -20,8 +20,8 @@ package foo.bar
} }
/*p:foo.bar*/val x1 by /*p:foo.bar c:foo.bar.D1(provideDelegate) c:foo.bar.D1(getProvideDelegate) c:foo.bar.D1(getPROVIDEDelegate) p:foo.bar(provideDelegate) p:kotlin(provideDelegate) p:kotlin.annotation(provideDelegate) p:kotlin.collections(provideDelegate) p:kotlin.ranges(provideDelegate) p:kotlin.sequences(provideDelegate) p:kotlin.text(provideDelegate) p:kotlin.io(provideDelegate) p:kotlin.comparisons(provideDelegate) p:java.lang(provideDelegate) p:kotlin.jvm(provideDelegate) c:foo.bar.D1(getValue)*/D1() /*p:foo.bar*/val x1 by /*p:foo.bar c:foo.bar.D1(provideDelegate) c:foo.bar.D1(getProvideDelegate) c:foo.bar.D1(getPROVIDEDelegate) p:foo.bar(provideDelegate) p:kotlin(provideDelegate) p:kotlin.annotation(provideDelegate) p:kotlin.collections(provideDelegate) p:kotlin.ranges(provideDelegate) p:kotlin.sequences(provideDelegate) p:kotlin.text(provideDelegate) p:kotlin.io(provideDelegate) p:kotlin.comparisons(provideDelegate) p:kotlin.jvm(provideDelegate) p:java.lang(provideDelegate) c:foo.bar.D1(getValue)*/D1()
/*p:foo.bar*/var y1 by /*p:foo.bar c:foo.bar.D1(provideDelegate) c:foo.bar.D1(getProvideDelegate) c:foo.bar.D1(getPROVIDEDelegate) p:foo.bar(provideDelegate) p:kotlin(provideDelegate) p:kotlin.annotation(provideDelegate) p:kotlin.collections(provideDelegate) p:kotlin.ranges(provideDelegate) p:kotlin.sequences(provideDelegate) p:kotlin.text(provideDelegate) p:kotlin.io(provideDelegate) p:kotlin.comparisons(provideDelegate) p:java.lang(provideDelegate) p:kotlin.jvm(provideDelegate) c:foo.bar.D1(getValue) c:foo.bar.D1(setValue) c:foo.bar.D1(getSetValue) c:foo.bar.D1(getSETValue) p:foo.bar(setValue)*/D1() /*p:foo.bar*/var y1 by /*p:foo.bar c:foo.bar.D1(provideDelegate) c:foo.bar.D1(getProvideDelegate) c:foo.bar.D1(getPROVIDEDelegate) p:foo.bar(provideDelegate) p:kotlin(provideDelegate) p:kotlin.annotation(provideDelegate) p:kotlin.collections(provideDelegate) p:kotlin.ranges(provideDelegate) p:kotlin.sequences(provideDelegate) p:kotlin.text(provideDelegate) p:kotlin.io(provideDelegate) p:kotlin.comparisons(provideDelegate) p:kotlin.jvm(provideDelegate) p:java.lang(provideDelegate) c:foo.bar.D1(getValue) c:foo.bar.D1(setValue) c:foo.bar.D1(getSetValue) c:foo.bar.D1(getSETValue) p:foo.bar(setValue)*/D1()
/*p:foo.bar*/val x2 by /*p:foo.bar c:foo.bar.D2(provideDelegate) c:foo.bar.D2(getProvideDelegate) c:foo.bar.D2(getPROVIDEDelegate) p:foo.bar(provideDelegate) c:foo.bar.D2(getValue) c:foo.bar.D2(getGetValue) c:foo.bar.D2(getGETValue) p:foo.bar(getValue)*/D2() /*p:foo.bar*/val x2 by /*p:foo.bar c:foo.bar.D2(provideDelegate) c:foo.bar.D2(getProvideDelegate) c:foo.bar.D2(getPROVIDEDelegate) p:foo.bar(provideDelegate) c:foo.bar.D2(getValue) c:foo.bar.D2(getGetValue) c:foo.bar.D2(getGETValue) p:foo.bar(getValue)*/D2()
/*p:foo.bar*/var y2 by /*p:foo.bar c:foo.bar.D2(provideDelegate) c:foo.bar.D2(getProvideDelegate) c:foo.bar.D2(getPROVIDEDelegate) p:foo.bar(provideDelegate) c:foo.bar.D2(getValue) c:foo.bar.D2(getGetValue) c:foo.bar.D2(getGETValue) p:foo.bar(getValue) c:foo.bar.D2(setValue)*/D2() /*p:foo.bar*/var y2 by /*p:foo.bar c:foo.bar.D2(provideDelegate) c:foo.bar.D2(getProvideDelegate) c:foo.bar.D2(getPROVIDEDelegate) p:foo.bar(provideDelegate) c:foo.bar.D2(getValue) c:foo.bar.D2(getGetValue) c:foo.bar.D2(getGETValue) p:foo.bar(getValue) c:foo.bar.D2(setValue)*/D2()
@@ -17,8 +17,8 @@ package foo.bar
/*p:foo.bar(A)*/a /*c:foo.bar.A(divAssign) c:foo.bar.A(getDivAssign) c:foo.bar.A(getDIVAssign) p:foo.bar(divAssign)*//= /*p:kotlin(Int)*/b /*p:foo.bar(A)*/a /*c:foo.bar.A(divAssign) c:foo.bar.A(getDivAssign) c:foo.bar.A(getDIVAssign) p:foo.bar(divAssign)*//= /*p:kotlin(Int)*/b
// for var // for var
/*p:foo.bar(A)*/d /*c:foo.bar.A(plusAssign) c:foo.bar.A(getPlusAssign) c:foo.bar.A(getPLUSAssign) p:foo.bar(plusAssign) p:kotlin(plusAssign) p:kotlin.annotation(plusAssign) p:kotlin.collections(plusAssign) p:kotlin.ranges(plusAssign) p:kotlin.sequences(plusAssign) p:kotlin.text(plusAssign) p:kotlin.io(plusAssign) p:kotlin.comparisons(plusAssign) p:java.lang(plusAssign) p:kotlin.jvm(plusAssign) c:foo.bar.A(plus)*/+= /*p:kotlin(Int)*/b /*p:foo.bar(A)*/d /*c:foo.bar.A(plusAssign) c:foo.bar.A(getPlusAssign) c:foo.bar.A(getPLUSAssign) p:foo.bar(plusAssign) p:kotlin(plusAssign) p:kotlin.annotation(plusAssign) p:kotlin.collections(plusAssign) p:kotlin.ranges(plusAssign) p:kotlin.sequences(plusAssign) p:kotlin.text(plusAssign) p:kotlin.io(plusAssign) p:kotlin.comparisons(plusAssign) p:kotlin.jvm(plusAssign) p:java.lang(plusAssign) c:foo.bar.A(plus)*/+= /*p:kotlin(Int)*/b
/*p:foo.bar(A)*/d /*c:foo.bar.A(minusAssign) c:foo.bar.A(getMinusAssign) c:foo.bar.A(getMINUSAssign) p:foo.bar(minusAssign) p:kotlin(minusAssign) p:kotlin.annotation(minusAssign) p:kotlin.collections(minusAssign) p:kotlin.ranges(minusAssign) p:kotlin.sequences(minusAssign) p:kotlin.text(minusAssign) p:kotlin.io(minusAssign) p:kotlin.comparisons(minusAssign) p:java.lang(minusAssign) p:kotlin.jvm(minusAssign) c:foo.bar.A(minus) c:foo.bar.A(getMinus) c:foo.bar.A(getMINUS) p:foo.bar(minus)*/-= /*p:kotlin(Int)*/b /*p:foo.bar(A)*/d /*c:foo.bar.A(minusAssign) c:foo.bar.A(getMinusAssign) c:foo.bar.A(getMINUSAssign) p:foo.bar(minusAssign) p:kotlin(minusAssign) p:kotlin.annotation(minusAssign) p:kotlin.collections(minusAssign) p:kotlin.ranges(minusAssign) p:kotlin.sequences(minusAssign) p:kotlin.text(minusAssign) p:kotlin.io(minusAssign) p:kotlin.comparisons(minusAssign) p:kotlin.jvm(minusAssign) p:java.lang(minusAssign) c:foo.bar.A(minus) c:foo.bar.A(getMinus) c:foo.bar.A(getMINUS) p:foo.bar(minus)*/-= /*p:kotlin(Int)*/b
/*p:foo.bar(A)*/d /*c:foo.bar.A(timesAssign) c:foo.bar.A(times) c:foo.bar.A(getTimes) c:foo.bar.A(getTIMES) p:foo.bar(times) p:kotlin(times) p:kotlin.annotation(times) p:kotlin.collections(times) p:kotlin.ranges(times) p:kotlin.sequences(times) p:kotlin.text(times) p:kotlin.io(times) p:kotlin.comparisons(times) p:java.lang(times) p:kotlin.jvm(times)*/*= /*p:kotlin(Int)*/b /*p:foo.bar(A)*/d /*c:foo.bar.A(timesAssign) c:foo.bar.A(times) c:foo.bar.A(getTimes) c:foo.bar.A(getTIMES) p:foo.bar(times) p:kotlin(times) p:kotlin.annotation(times) p:kotlin.collections(times) p:kotlin.ranges(times) p:kotlin.sequences(times) p:kotlin.text(times) p:kotlin.io(times) p:kotlin.comparisons(times) p:kotlin.jvm(times) p:java.lang(times)*/*= /*p:kotlin(Int)*/b
/*p:foo.bar(A)*/d /*c:foo.bar.A(divAssign) c:foo.bar.A(getDivAssign) c:foo.bar.A(getDIVAssign) p:foo.bar(divAssign) c:foo.bar.A(div) c:foo.bar.A(getDiv) c:foo.bar.A(getDIV) p:foo.bar(div) p:kotlin(div) p:kotlin.annotation(div) p:kotlin.collections(div) p:kotlin.ranges(div) p:kotlin.sequences(div) p:kotlin.text(div) p:kotlin.io(div) p:kotlin.comparisons(div) p:java.lang(div) p:kotlin.jvm(div)*//= /*p:kotlin(Int)*/b /*p:foo.bar(A)*/d /*c:foo.bar.A(divAssign) c:foo.bar.A(getDivAssign) c:foo.bar.A(getDIVAssign) p:foo.bar(divAssign) c:foo.bar.A(div) c:foo.bar.A(getDiv) c:foo.bar.A(getDIV) p:foo.bar(div) p:kotlin(div) p:kotlin.annotation(div) p:kotlin.collections(div) p:kotlin.ranges(div) p:kotlin.sequences(div) p:kotlin.text(div) p:kotlin.io(div) p:kotlin.comparisons(div) p:kotlin.jvm(div) p:java.lang(div)*//= /*p:kotlin(Int)*/b
} }
@@ -6,8 +6,8 @@ package foo
/*p:foo*/fun getA() = /*p:foo*/A() /*p:foo*/fun getA() = /*p:foo*/A()
/*p:foo*/fun getB() = /*p:foo*/B() /*p:foo*/fun getB() = /*p:foo*/B()
/*p:foo*/fun getListOfA() = /*p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:foo p:kotlin.collections(List) p:foo(A)*/listOf(/*p:foo*/A()) /*p:foo*/fun getListOfA() = /*p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:foo p:kotlin.collections(List) p:foo(A)*/listOf(/*p:foo*/A())
/*p:foo*/fun getListOfB() = /*p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:foo p:kotlin.collections(List) p:foo(B)*/listOf(/*p:foo*/B()) /*p:foo*/fun getListOfB() = /*p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:foo p:kotlin.collections(List) p:foo(B)*/listOf(/*p:foo*/B())
/*p:foo*/fun useListOfA(a: /*p:foo p:kotlin.collections*/List</*p:foo*/A>) {} /*p:foo*/fun useListOfA(a: /*p:foo p:kotlin.collections*/List</*p:foo*/A>) {}
/*p:foo*/fun useListOfB(b: /*p:foo p:kotlin.collections*/List</*p:foo*/B>) {} /*p:foo*/fun useListOfB(b: /*p:foo p:kotlin.collections*/List</*p:foo*/B>) {}
@@ -11,27 +11,27 @@ import baz.*
/*p:bar(C)*/c./*c:bar.C*/func() /*p:bar(C)*/c./*c:bar.C*/func()
/*p:bar(C) c:bar.C(B)*/c./*c:bar.C*/B() /*p:bar(C) c:bar.C(B)*/c./*c:bar.C*/B()
/*p:bar p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(String)*/C./*c:bar.C*/sfield /*p:bar p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:kotlin(String)*/C./*c:bar.C*/sfield
/*p:bar p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(String)*/C./*c:bar.C*/sfield = /*p:kotlin(String)*/"new" /*p:bar p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:kotlin(String)*/C./*c:bar.C*/sfield = /*p:kotlin(String)*/"new"
/*p:bar p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/C./*c:bar.C*/sfunc() /*p:bar p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/C./*c:bar.C*/sfunc()
/*p:bar p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm c:bar.C(S)*/C./*c:bar.C*/S() /*p:bar p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang c:bar.C(S)*/C./*c:bar.C*/S()
// inherited from I // inherited from I
/*p:bar(C)*/c./*c:bar.C*/ifunc() /*p:bar(C)*/c./*c:bar.C*/ifunc()
/*p:bar p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(String)*/C./*c:bar.C*/isfield /*p:bar p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:kotlin(String)*/C./*c:bar.C*/isfield
// expected error: Unresolved reference: IS // expected error: Unresolved reference: IS
/*p:bar p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/C./*c:bar.C*/IS() /*p:bar p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/C./*c:bar.C*/IS()
val i: /*p:foo*/I = /*p:bar(C)*/c val i: /*p:foo*/I = /*p:bar(C)*/c
/*p:foo(I)*/i./*c:foo.I*/ifunc() /*p:foo(I)*/i./*c:foo.I*/ifunc()
/*p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(String)*/I./*c:foo.I*/isfield /*p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:kotlin(String)*/I./*c:foo.I*/isfield
/*p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm c:foo.I(IS)*/I./*c:foo.I*/IS() /*p:foo p:baz p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang c:foo.I(IS)*/I./*c:foo.I*/IS()
/*p:baz p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/E./*c:baz.E*/F /*p:baz p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/E./*c:baz.E*/F
/*p:baz p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:kotlin(Int)*/E./*c:baz.E*/F./*c:baz.E*/field /*p:baz p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:kotlin(Int)*/E./*c:baz.E*/F./*c:baz.E*/field
/*p:baz p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/E./*c:baz.E*/S./*c:baz.E*/func() /*p:baz p:foo p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/E./*c:baz.E*/S./*c:baz.E*/func()
} }
/*p:foo*/fun classifiers( /*p:foo*/fun classifiers(
@@ -4,7 +4,7 @@ import bar.*
/*p:baz(C)*/import baz.C /*p:baz(C)*/import baz.C
/*p:foo*/val a = /*p:bar p:foo*/A() /*p:foo*/val a = /*p:bar p:foo*/A()
/*p:foo*/var b: /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/baz./*p:baz*/B = /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:baz(B)*/baz./*p:baz*/B() /*p:foo*/var b: /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/baz./*p:baz*/B = /*p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:baz(B)*/baz./*p:baz*/B()
/*p:foo*/fun function(p: /*p:foo p:bar*/B): /*p:foo p:bar*/B /*p:kotlin(Nothing)*/{ /*p:foo*/fun function(p: /*p:foo p:bar*/B): /*p:foo p:bar*/B /*p:kotlin(Nothing)*/{
/*p:foo p:bar(A)*/a /*p:foo p:bar(A)*/a
@@ -12,6 +12,6 @@ import bar.*
} }
/*p:foo*/fun /*p:foo*/MyClass.extFunc(p: /**p:foo p:bar*//*p:foo p:kotlin*/Array</*p:foo p:bar*/B>, e: /*p:foo*/MyEnum, c: /**???*//*p:baz*/C): /*p:foo*/MyInterface /*p:kotlin(Nothing)*/{ /*p:foo*/fun /*p:foo*/MyClass.extFunc(p: /**p:foo p:bar*//*p:foo p:kotlin*/Array</*p:foo p:bar*/B>, e: /*p:foo*/MyEnum, c: /**???*//*p:baz*/C): /*p:foo*/MyInterface /*p:kotlin(Nothing)*/{
/*c:foo.MyClass c:foo.MyClass(getB) p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm p:baz(B)*/b /*c:foo.MyClass c:foo.MyClass(getB) p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang p:baz(B)*/b
/*p:kotlin(Nothing)*/return /*c:foo.MyClass p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/MyClass() /*p:kotlin(Nothing)*/return /*c:foo.MyClass p:foo p:bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/MyClass()
} }
@@ -8,23 +8,23 @@ package foo.bar
val k = /*p:foo*/KotlinClass() val k = /*p:foo*/KotlinClass()
/*p:<root>(JavaClass) p:kotlin(Int)*/j./*c:JavaClass*/getFoo() /*p:<root>(JavaClass) p:kotlin(Int)*/j./*c:JavaClass*/getFoo()
/*p:<root>(JavaClass)*/j./*c:JavaClass c:JavaClass(getSetFoo) c:JavaClass(getSETFoo) p:foo.bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/setFoo(2) /*p:<root>(JavaClass)*/j./*c:JavaClass c:JavaClass(getSetFoo) c:JavaClass(getSETFoo) p:foo.bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/setFoo(2)
/*p:<root>(JavaClass) p:kotlin(Int)*/j./*c:JavaClass c:JavaClass(getFoo) c:JavaClass(getFOO) c:JavaClass(setFoo)*/foo = /*p:kotlin(Int)*/2 /*p:<root>(JavaClass) p:kotlin(Int)*/j./*c:JavaClass c:JavaClass(getFoo) c:JavaClass(getFOO) c:JavaClass(setFoo)*/foo = /*p:kotlin(Int)*/2
/*p:<root>(JavaClass) p:kotlin(Int)*/j./*c:JavaClass c:JavaClass(getFoo) c:JavaClass(getFOO) c:JavaClass(setFoo)*/foo /*p:<root>(JavaClass) p:kotlin(Int)*/j./*c:JavaClass c:JavaClass(getFoo) c:JavaClass(getFOO) c:JavaClass(setFoo)*/foo
/*p:<root>(JavaClass) p:kotlin(String)*/j./*c:JavaClass c:JavaClass(getBar) c:JavaClass(getBAR) c:JavaClass(setBar)*/bar /*p:<root>(JavaClass) p:kotlin(String)*/j./*c:JavaClass c:JavaClass(getBar) c:JavaClass(getBAR) c:JavaClass(setBar)*/bar
/*p:<root>(JavaClass) p:kotlin(String)*/j./*c:JavaClass c:JavaClass(getBar) c:JavaClass(getBAR) c:JavaClass(setBar)*/bar = /*p:kotlin(String)*/"" /*p:<root>(JavaClass) p:kotlin(String)*/j./*c:JavaClass c:JavaClass(getBar) c:JavaClass(getBAR) c:JavaClass(setBar)*/bar = /*p:kotlin(String)*/""
/*p:<root>(JavaClass)*/j./*c:JavaClass c:JavaClass(getBazBaz) c:JavaClass(getBAZBaz) p:foo.bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/bazBaz /*p:<root>(JavaClass)*/j./*c:JavaClass c:JavaClass(getBazBaz) c:JavaClass(getBAZBaz) p:foo.bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/bazBaz
/*p:<root>(JavaClass)*/j./*c:JavaClass c:JavaClass(getBazBaz) c:JavaClass(getBAZBaz) p:foo.bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/bazBaz = /*p:kotlin(String)*/"" /*p:<root>(JavaClass)*/j./*c:JavaClass c:JavaClass(getBazBaz) c:JavaClass(getBAZBaz) p:foo.bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/bazBaz = /*p:kotlin(String)*/""
/*p:<root>(JavaClass)*/j./*c:JavaClass*/setBoo(2) /*p:<root>(JavaClass)*/j./*c:JavaClass*/setBoo(2)
/*p:<root>(JavaClass)*/j./*c:JavaClass c:JavaClass(getBoo) c:JavaClass(getBOO) p:foo.bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm*/boo = /*p:kotlin(Int)*/2 /*p:<root>(JavaClass)*/j./*c:JavaClass c:JavaClass(getBoo) c:JavaClass(getBOO) p:foo.bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang*/boo = /*p:kotlin(Int)*/2
/*p:foo(KotlinClass) p:kotlin(Int)*/k./*c:foo.KotlinClass c:JavaClass*/getFoo() // getFoo may be an inner class in JavaClass /*p:foo(KotlinClass) p:kotlin(Int)*/k./*c:foo.KotlinClass c:JavaClass*/getFoo() // getFoo may be an inner class in JavaClass
/*p:foo(KotlinClass)*/k./*c:foo.KotlinClass c:JavaClass*/setFoo(2) /*p:foo(KotlinClass)*/k./*c:foo.KotlinClass c:JavaClass*/setFoo(2)
/*p:foo(KotlinClass) p:kotlin(Int)*/k./*c:foo.KotlinClass c:foo.KotlinClass(getFoo) c:foo.KotlinClass(getFOO) c:foo.KotlinClass(setFoo)*/foo = /*p:kotlin(Int)*/2 /*p:foo(KotlinClass) p:kotlin(Int)*/k./*c:foo.KotlinClass c:foo.KotlinClass(getFoo) c:foo.KotlinClass(getFOO) c:foo.KotlinClass(setFoo)*/foo = /*p:kotlin(Int)*/2
/*p:foo(KotlinClass) p:kotlin(Int)*/k./*c:foo.KotlinClass c:foo.KotlinClass(getFoo) c:foo.KotlinClass(getFOO) c:foo.KotlinClass(setFoo)*/foo /*p:foo(KotlinClass) p:kotlin(Int)*/k./*c:foo.KotlinClass c:foo.KotlinClass(getFoo) c:foo.KotlinClass(getFOO) c:foo.KotlinClass(setFoo)*/foo
/*p:foo(KotlinClass) p:kotlin(String)*/k./*c:foo.KotlinClass c:foo.KotlinClass(getBar) c:foo.KotlinClass(getBAR) c:foo.KotlinClass(setBar)*/bar /*p:foo(KotlinClass) p:kotlin(String)*/k./*c:foo.KotlinClass c:foo.KotlinClass(getBar) c:foo.KotlinClass(getBAR) c:foo.KotlinClass(setBar)*/bar
/*p:foo(KotlinClass) p:kotlin(String)*/k./*c:foo.KotlinClass c:foo.KotlinClass(getBar) c:foo.KotlinClass(getBAR) c:foo.KotlinClass(setBar)*/bar = /*p:kotlin(String)*/"" /*p:foo(KotlinClass) p:kotlin(String)*/k./*c:foo.KotlinClass c:foo.KotlinClass(getBar) c:foo.KotlinClass(getBAR) c:foo.KotlinClass(setBar)*/bar = /*p:kotlin(String)*/""
/*p:foo(KotlinClass)*/k./*c:foo.KotlinClass c:foo.KotlinClass(getBazBaz) c:foo.KotlinClass(getBAZBaz) p:foo.bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm c:JavaClass*/bazBaz /*p:foo(KotlinClass)*/k./*c:foo.KotlinClass c:foo.KotlinClass(getBazBaz) c:foo.KotlinClass(getBAZBaz) p:foo.bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang c:JavaClass*/bazBaz
/*p:foo(KotlinClass)*/k./*c:foo.KotlinClass c:foo.KotlinClass(getBazBaz) c:foo.KotlinClass(getBAZBaz) p:foo.bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm c:JavaClass*/bazBaz = /*p:kotlin(String)*/"" /*p:foo(KotlinClass)*/k./*c:foo.KotlinClass c:foo.KotlinClass(getBazBaz) c:foo.KotlinClass(getBAZBaz) p:foo.bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang c:JavaClass*/bazBaz = /*p:kotlin(String)*/""
/*p:foo(KotlinClass)*/k./*c:foo.KotlinClass c:JavaClass*/setBoo(2) /*p:foo(KotlinClass)*/k./*c:foo.KotlinClass c:JavaClass*/setBoo(2)
/*p:foo(KotlinClass)*/k./*c:foo.KotlinClass c:foo.KotlinClass(getBoo) c:foo.KotlinClass(getBOO) p:foo.bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:java.lang p:kotlin.jvm c:JavaClass*/boo = /*p:kotlin(Int)*/2 /*p:foo(KotlinClass)*/k./*c:foo.KotlinClass c:foo.KotlinClass(getBoo) c:foo.KotlinClass(getBOO) p:foo.bar p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.ranges p:kotlin.sequences p:kotlin.text p:kotlin.io p:kotlin.comparisons p:kotlin.jvm p:java.lang c:JavaClass*/boo = /*p:kotlin(Int)*/2
} }