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 (see82364ad3e5,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:
@@ -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,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
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
@@ -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(
|
||||||
|
|||||||
+9
-9
@@ -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(
|
||||||
|
|||||||
+2
-2
@@ -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()
|
||||||
|
|||||||
+4
-4
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -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(
|
||||||
|
|||||||
+3
-3
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-7
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user