IC tests: add infrastructure for K1/K2 lookups comparison

Adapt lookup tests to allow running K1 and K2 on the same testdata
and compare the lookups recorded.
This commit is contained in:
Ilya Chernikov
2024-02-26 11:04:59 +01:00
committed by Space Team
parent 684d0b8690
commit 1989e8f094
40 changed files with 838 additions and 73 deletions
@@ -24,7 +24,7 @@ data class BuildLogFinder(
private val isJsEnabled: Boolean = false,
private val isScopeExpansionEnabled: Boolean = false,
private val isKlibEnabled: Boolean = false,
private val isFirEnabled: Boolean = false,
private val isFirEnabled: Boolean = true,
private val isJpsBuild: Boolean = false,
) {
companion object {
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.incremental.testingUtils
import com.intellij.openapi.util.io.FileUtil
import java.io.File
import java.util.*
import kotlin.math.max
private val COMMANDS = listOf("new", "touch", "delete")
@@ -30,28 +29,59 @@ enum class TouchPolicy {
CHECKSUM
}
fun copyTestSources(testDataDir: File, sourceDestinationDir: File, filePrefix: String): Map<File, File> {
/**
* Optional suffix (first filename extension) that could be inserted before first "regular" extension
*/
enum class OptionalVariantSuffix {
None,
K1,
K2;
companion object {
/**
* A regex used to recognize a variant suffix in the filename.
* Note: Should match all possible suffixes, but "None", and should be compatible with comparison logic in `genVariantMatchingName`
*/
val anySuffixRegex = Regex(".(K[12]).")
}
}
fun String.genVariantMatchingName(expectedOptionalVariant: OptionalVariantSuffix): String? {
if (expectedOptionalVariant == OptionalVariantSuffix.None) return this
val variantMatch = OptionalVariantSuffix.anySuffixRegex.find(this) ?: return this
if (variantMatch.groups[1]?.value != expectedOptionalVariant.name) return null
return removeRange(variantMatch.range.first, variantMatch.range.last)
}
fun copyTestSources(
testDataDir: File,
sourceDestinationDir: File,
filePrefix: String,
optionalVariantSuffix: OptionalVariantSuffix = OptionalVariantSuffix.None,
): Map<File, File> {
val mapping = hashMapOf<File, File>()
FileUtil.copyDir(testDataDir, sourceDestinationDir) {
it.isDirectory || it.name.startsWith(filePrefix) && (it.name.endsWith(".kt") || it.name.endsWith(".java"))
}
for (file in sourceDestinationDir.walk()) {
if (!file.isFile) continue
val renamedFile =
if (filePrefix.isEmpty()) {
file
fun copyDir(fromDir: File, toDir: File) {
FileUtil.ensureExists(toDir)
for (file in fromDir.listFiles().orEmpty()) {
if (file.isDirectory) {
copyDir(file, File(toDir, file.name))
} else if (file.name.endsWith(".kt") || file.name.endsWith(".java")) {
val nameWithoutVariant = file.name.genVariantMatchingName(optionalVariantSuffix) ?: continue // prefixed but with different variant
if (nameWithoutVariant.startsWith(filePrefix)) {
val targetFile = File(toDir, nameWithoutVariant.substring(filePrefix.length))
if (nameWithoutVariant != file.name /* variant-prefixed file replaces the one without a variant prefix */ ||
!mapping.containsKey(targetFile)
) {
FileUtil.copy(file, targetFile)
mapping[targetFile] = file
}
}
}
else {
File(sourceDestinationDir, file.name.removePrefix(filePrefix)).apply {
file.renameTo(this)
}
}
mapping[renamedFile] = File(testDataDir, file.name)
}
copyDir(testDataDir, sourceDestinationDir)
return mapping
}
@@ -59,7 +89,8 @@ fun getModificationsToPerform(
testDataDir: File,
moduleNames: Collection<String>?,
allowNoFilesWithSuffixInTestData: Boolean,
touchPolicy: TouchPolicy
touchPolicy: TouchPolicy,
optionalVariantSuffix: OptionalVariantSuffix = OptionalVariantSuffix.None,
): List<List<Modification>> {
fun getModificationsForIteration(newSuffix: String, touchSuffix: String, deleteSuffix: String): List<Modification> {
@@ -92,21 +123,30 @@ fun getModificationsToPerform(
deleteSuffix to { path, _ -> DeleteFile(path) }
)
val modifications = ArrayList<Modification>()
val modifications = LinkedHashMap<String, Modification>()
for (file in testDataDir.walkTopDown()) {
if (!file.isFile) continue
val relativeFilePath = file.toRelativeString(testDataDir)
val (suffix, createModification) = rules.entries.firstOrNull { file.path.endsWith(it.key) } ?: continue
val (moduleName, fileName) = splitToModuleNameAndFileName(relativeFilePath)
// NOTE: the code do not allow to combine module prefixes with directory structure
val relativeFilePath = file.toRelativeString(testDataDir)
val relativeFilePathWithoutVariant =
relativeFilePath.genVariantMatchingName(optionalVariantSuffix) ?: continue
val (moduleName, fileName) = splitToModuleNameAndFileName(relativeFilePathWithoutVariant)
val srcDir = moduleName?.let { "$it/src" } ?: "src"
modifications.add(createModification(srcDir + "/" + fileName.removeSuffix(suffix), file))
val targetPath = srcDir + "/" + fileName.removeSuffix(suffix)
if (relativeFilePathWithoutVariant != relativeFilePath /* variant-prefixed file replaces the one without a variant prefix */ ||
!modifications.containsKey(targetPath)
) {
modifications[targetPath] = createModification(targetPath, file)
}
}
return modifications
return modifications.values.toList()
}
val haveFilesWithoutNumbers = testDataDir.walkTopDown().any { it.name.matches(".+\\.($COMMANDS_AS_REGEX_PART)$".toRegex()) }
@@ -22,6 +22,7 @@ abstract class AbstractIncrementalK1JsKlibCompilerRunnerTest : AbstractIncrement
override val buildLogFinder: BuildLogFinder
get() = super.buildLogFinder.copy(
isFirEnabled = false,
isKlibEnabled = true,
isJsEnabled = true,
isScopeExpansionEnabled = scopeExpansionMode != CompileScopeExpansionMode.NEVER,
@@ -29,7 +29,7 @@ abstract class AbstractIncrementalK1JsKlibMultiModuleCompilerRunnerTest :
}
override val buildLogFinder: BuildLogFinder
get() = super.buildLogFinder.copy(isKlibEnabled = true)
get() = super.buildLogFinder.copy(isFirEnabled = false, isKlibEnabled = true)
override fun makeForSingleModule(
moduleCacheDir: File,
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.incremental
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.incremental.testingUtils.BuildLogFinder
import java.io.File
abstract class AbstractIncrementalK1JvmCompilerRunnerTest : AbstractIncrementalJvmCompilerRunnerTest() {
@@ -17,4 +18,6 @@ abstract class AbstractIncrementalK1JvmCompilerRunnerTest : AbstractIncrementalJ
}
}
override val buildLogFinder: BuildLogFinder
get() = super.buildLogFinder.copy(isFirEnabled = false)
}
@@ -90,6 +90,9 @@ fun main(args: Array<String>) {
testClass<AbstractJvmLookupTrackerTest> {
model("incremental/lookupTracker/jvm", extension = null, recursive = false)
}
testClass<AbstractK1JvmLookupTrackerTest> {
model("incremental/lookupTracker/jvm", extension = null, recursive = false)
}
testClass<AbstractJsKlibLookupTrackerTest> {
// todo: investigate why lookups are different from non-klib js
model("incremental/lookupTracker/jsKlib", extension = null, recursive = false)
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.jps.build
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.incremental.testingUtils.BuildLogFinder
abstract class AbstractIncrementalK1JvmJpsTest(
allowNoFilesWithSuffixInTestData: Boolean = false
@@ -17,4 +18,7 @@ abstract class AbstractIncrementalK1JvmJpsTest(
}
super.updateCommandLineArguments(arguments)
}
override val buildLogFinder: BuildLogFinder
get() = super.buildLogFinder.copy(isFirEnabled = false)
}
@@ -21,14 +21,16 @@ import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.incremental.isKotlinFile
import org.jetbrains.kotlin.incremental.js.*
import org.jetbrains.kotlin.incremental.makeModuleFile
import org.jetbrains.kotlin.incremental.testingUtils.TouchPolicy
import org.jetbrains.kotlin.incremental.testingUtils.copyTestSources
import org.jetbrains.kotlin.incremental.testingUtils.getModificationsToPerform
import org.jetbrains.kotlin.incremental.testingUtils.*
import org.jetbrains.kotlin.incremental.utils.TestLookupTracker
import org.jetbrains.kotlin.incremental.utils.TestMessageCollector
import org.jetbrains.kotlin.jps.build.fixtures.EnableICFixture
import org.jetbrains.kotlin.jps.incremental.createTestingCompilerEnvironment
import org.jetbrains.kotlin.jps.incremental.runJSCompiler
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.test.kotlinPathsForDistDirectoryForTests
import org.jetbrains.kotlin.utils.JsMetadataVersion
@@ -66,6 +68,10 @@ abstract class AbstractJvmLookupTrackerTest : AbstractLookupTrackerTest() {
}
}
open fun configureAdditionalArgs(args: K2JVMCompilerArguments) {
args.useFirLT = false
}
override fun runCompiler(filesToCompile: Iterable<File>, env: JpsCompilerEnvironment): Any? {
val moduleFile = makeModuleFile(
name = "test",
@@ -82,8 +88,8 @@ abstract class AbstractJvmLookupTrackerTest : AbstractLookupTrackerTest() {
disableDefaultScriptingPlugin = true
buildFile = moduleFile.canonicalPath
reportOutputFiles = true
useFirLT = false
}
configureAdditionalArgs(args)
val argsArray = ArgumentUtils.convertArgumentsToStringList(args).toTypedArray()
try {
@@ -100,6 +106,24 @@ abstract class AbstractJvmLookupTrackerTest : AbstractLookupTrackerTest() {
}
}
abstract class AbstractK1JvmLookupTrackerTest : AbstractJvmLookupTrackerTest() {
override var filterBuiltins = true
override var distinguishPackageAndClassLookups = false
override fun setUp() {
super.setUp()
optionalVariantSuffix = OptionalVariantSuffix.K1
}
override fun configureAdditionalArgs(args: K2JVMCompilerArguments) {
args.languageVersion = "1.9"
}
override val buildLogFinder: BuildLogFinder
get() = BuildLogFinder(isGradleEnabled = false, isFirEnabled = false)
}
abstract class AbstractJsKlibLookupTrackerTest : AbstractJsLookupTrackerTest() {
override fun configureAdditionalArgs(args: K2JSCompilerArguments) {
args.irProduceKlibDir = true
@@ -181,6 +205,9 @@ abstract class AbstractLookupTrackerTest : TestWithWorkingDir() {
protected lateinit var srcDir: File
protected lateinit var outDir: File
private val enableICFixture = EnableICFixture()
protected var optionalVariantSuffix: OptionalVariantSuffix = OptionalVariantSuffix.K2
protected open var filterBuiltins = false
protected open var distinguishPackageAndClassLookups = true
override fun setUp() {
super.setUp()
@@ -200,6 +227,9 @@ abstract class AbstractLookupTrackerTest : TestWithWorkingDir() {
protected abstract fun processCompilationResults(outputItemsCollector: OutputItemsCollectorImpl, services: Services)
protected abstract fun runCompiler(filesToCompile: Iterable<File>, env: JpsCompilerEnvironment): Any?
protected open val buildLogFinder: BuildLogFinder
get() = BuildLogFinder(isGradleEnabled = false)
fun doTest(path: String) {
val sb = StringBuilder()
fun StringBuilder.indentln(string: String) {
@@ -228,13 +258,14 @@ abstract class AbstractLookupTrackerTest : TestWithWorkingDir() {
}
val testDir = File(path)
val workToOriginalFileMap = HashMap(copyTestSources(testDir, srcDir, filePrefix = ""))
val workToOriginalFileMap = HashMap(copyTestSources(testDir, srcDir, filePrefix = "", optionalVariantSuffix = optionalVariantSuffix))
var dirtyFiles = srcDir.walk().filterTo(HashSet()) { it.isKotlinFile(setOf("kt", "kts")) }
val steps = getModificationsToPerform(
testDir,
moduleNames = null,
allowNoFilesWithSuffixInTestData = true,
touchPolicy = TouchPolicy.CHECKSUM
touchPolicy = TouchPolicy.CHECKSUM,
optionalVariantSuffix = optionalVariantSuffix
)
.filter { it.isNotEmpty() }
@@ -255,8 +286,9 @@ abstract class AbstractLookupTrackerTest : TestWithWorkingDir() {
}
}
val expectedBuildLog = File(testDir, "build.log")
buildLogFinder.findBuildLog(testDir)?.let { expectedBuildLog ->
UsefulTestCase.assertSameLinesWithFile(expectedBuildLog.canonicalPath, sb.toString())
}
assertEquals(steps.size + 1, filesToLookups.size)
for ((i, lookupsAtStepI) in filesToLookups.withIndex()) {
@@ -317,7 +349,12 @@ abstract class AbstractLookupTrackerTest : TestWithWorkingDir() {
val end = column - 1
parts.add(lineContent.subSequence(start, end))
val lookups = lookupsFromColumn.mapTo(sortedSetOf()) { lookupInfo ->
lookupsFromColumn.mapNotNullTo(sortedSetOf()) { lookupInfo ->
if (filterBuiltins &&
ClassId(FqName(lookupInfo.scopeFqName), Name.identifier(lookupInfo.name)) in StandardClassIds.allBuiltinTypes
) {
null
} else {
val rest = lineContent.substring(end)
val name =
@@ -329,11 +366,16 @@ abstract class AbstractLookupTrackerTest : TestWithWorkingDir() {
else -> "(" + lookupInfo.name + ")"
}
lookupInfo.scopeKind.toString()[0].lowercaseChar()
.toString() + ":" + lookupInfo.scopeFqName.let { it.ifEmpty { "<root>" } } + name
}.joinToString(separator = " ", prefix = "/*", postfix = "*/")
parts.add(lookups)
val prefix =
if (distinguishPackageAndClassLookups) lookupInfo.scopeKind.toString()[0].lowercaseChar().toString()
else "p"
prefix + ":" + lookupInfo.scopeFqName.let { it.ifEmpty { "<root>" } } + name
}
}.takeIf { it.isNotEmpty() }
?.joinToString(separator = " ", prefix = "/*", postfix = "*/")
?.also {
parts.add(it)
}
start = end
}
@@ -0,0 +1,86 @@
/*
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.jps.build;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
import org.jetbrains.kotlin.test.KotlinTestUtils;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.runner.RunWith;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.jps.GenerateJpsPluginTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("jps/jps-plugin/testData/incremental/lookupTracker/jvm")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public class K1JvmLookupTrackerTestGenerated extends AbstractK1JvmLookupTrackerTest {
private void runTest(String testDataFilePath) {
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
}
public void testAllFilesPresentInJvm() {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("jps/jps-plugin/testData/incremental/lookupTracker/jvm"), Pattern.compile("^([^\\.]+)$"), null, false);
}
@TestMetadata("classifierMembers")
public void testClassifierMembers() {
runTest("jps/jps-plugin/testData/incremental/lookupTracker/jvm/classifierMembers/");
}
@TestMetadata("conventions")
public void testConventions() {
runTest("jps/jps-plugin/testData/incremental/lookupTracker/jvm/conventions/");
}
@TestMetadata("expressionType")
public void testExpressionType() {
runTest("jps/jps-plugin/testData/incremental/lookupTracker/jvm/expressionType/");
}
@TestMetadata("java")
public void testJava() {
runTest("jps/jps-plugin/testData/incremental/lookupTracker/jvm/java/");
}
@TestMetadata("jvmNameChanged")
public void testJvmNameChanged() {
runTest("jps/jps-plugin/testData/incremental/lookupTracker/jvm/jvmNameChanged/");
}
@TestMetadata("localDeclarations")
public void testLocalDeclarations() {
runTest("jps/jps-plugin/testData/incremental/lookupTracker/jvm/localDeclarations/");
}
@TestMetadata("packageDeclarations")
public void testPackageDeclarations() {
runTest("jps/jps-plugin/testData/incremental/lookupTracker/jvm/packageDeclarations/");
}
@TestMetadata("SAM")
public void testSAM() {
runTest("jps/jps-plugin/testData/incremental/lookupTracker/jvm/SAM/");
}
@TestMetadata("simple")
public void testSimple() {
runTest("jps/jps-plugin/testData/incremental/lookupTracker/jvm/simple/");
}
@TestMetadata("syntheticProperties")
public void testSyntheticProperties() {
runTest("jps/jps-plugin/testData/incremental/lookupTracker/jvm/syntheticProperties/");
}
@TestMetadata("typeAliasAndUsage")
public void testTypeAliasAndUsage() {
runTest("jps/jps-plugin/testData/incremental/lookupTracker/jvm/typeAliasAndUsage/");
}
}
@@ -2,6 +2,6 @@
Compiling files:
src/usages.kt
Exit code: COMPILATION_ERROR
No value passed for parameter 'x'.
No value passed for parameter 'x'.
No value passed for parameter 'function'.
No value passed for parameter 'x'
No value passed for parameter 'x'
No value passed for parameter 'function'
@@ -0,0 +1,7 @@
==== INITIAL BUILD ====
Compiling files:
src/usages.kt
Exit code: COMPILATION_ERROR
No value passed for parameter 'x'.
No value passed for parameter 'x'.
No value passed for parameter 'function'.
@@ -0,0 +1,14 @@
package foo
/*p:bar(C)*/import bar.C
/*p:bar(SAMInterface)*/import bar.SAMInterface
/*p:foo*/fun foo(c: /*p:bar*/C) /*p:bar(SAMInterface)*/{
/*p:bar(C)*/c./*p:bar.C p:bar.C(getFOO) p:bar.C(getFoo) p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/foo()
/*p:bar(C)*/c./*p:bar.C p:bar.SAMInterface(<SAM-CONSTRUCTOR>)*/foo /*p:kotlin(Function1)*/{ }
/*p:bar p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/C./*p:bar.C*/bar()
/*p:bar p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/C./*p:bar.C p:bar.SAMInterface(<SAM-CONSTRUCTOR>)*/bar /*p:kotlin(Function1)*/{}
/*p:bar p:bar.SAMInterface(<SAM-CONSTRUCTOR>) p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/SAMInterface()
/*p:bar p:bar.SAMInterface(<SAM-CONSTRUCTOR>)*/SAMInterface /*p:kotlin(Function1)*/{}
}
@@ -15,7 +15,7 @@ Exit code: OK
Compiling files:
src/usages.kt
Exit code: COMPILATION_ERROR
Unresolved reference 'vala'.
Unresolved reference 'vara'.
Unresolved reference 'foo'.
Unresolved reference 'bar'.
Unresolved reference: vala
Unresolved reference: vara
Unresolved reference: foo
Unresolved reference: bar
@@ -0,0 +1,7 @@
package foo
import bar.*
/*p:foo*/fun <T : /*p:foo*/A?, B : /*p:foo p:kotlin.collections*/Iterable</*p:foo p:kotlin*/Number>, C, D> test()
where C : /*p:foo p:kotlin*/Number, C : /*p:foo p:kotlin*/Comparable</*p:foo p:kotlin*/Number>, D : B
{}
@@ -0,0 +1,21 @@
==== INITIAL BUILD ====
Compiling files:
src/bar.kt
src/constraints.kt
src/foo.kt
src/usages.kt
Exit code: OK
==== STEP 1 ====
Compiling files:
src/usages.kt
Exit code: OK
==== STEP 2 ====
Compiling files:
src/usages.kt
Exit code: COMPILATION_ERROR
Unresolved reference 'vala'.
Unresolved reference 'vara'.
Unresolved reference 'foo'.
Unresolved reference 'bar'.
@@ -0,0 +1,69 @@
package foo
/*p:foo*/class A {
val a = 1
var b = ""
val c: /*p:foo p:foo.A p:foo.A.Companion*/String
get() = /*p:foo.A*/b
var d: /*p:foo p:foo.A p:foo.A.Companion*/String = "ddd"
get() = field
set(v) { field = v }
fun foo() {
/*p:foo.A*/a
/*p:foo.A*/foo()
/*p:foo(A)*/this./*p:foo.A*/a
/*p:foo(A)*/this./*p:foo.A*/foo()
/*p:foo p:foo.A p:foo.A(getBAZ) p:foo.A(getBaz) p:foo.A.Companion p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/baz()
/*p:foo p:foo.A p:foo.A.Companion p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/Companion./*p:foo.A.Companion*/a
/*p:foo p:foo.A p:foo.A.Companion p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/O./*p:foo.A.O*/v = "OK"
}
class B {
val a = 1
companion object CO {
fun bar(a: /*p:foo p:foo.A p:foo.A.B p:foo.A.B.CO p:foo.A.Companion*/Int) {}
}
}
inner class C
companion object {
val a = 1
fun baz() {}
}
object O {
var v = "vvv"
}
}
/*p:foo*/interface I {
var a: /*p:foo p:foo.I*/Int
fun foo()
class NI
}
/*p:foo*/object Obj : /*p:foo*/I {
override var a = 1
override fun foo() {}
val b = 1
fun bar(): /*p:foo p:foo.Obj*/I = /*p:foo(I) p:kotlin(Nothing)*/null as /*p:foo p:foo.Obj*/I
}
/*p:foo*/enum class E {
X,
Y;
val a = 1
fun foo() {
/*p:foo.E*/a
/*p:foo p:foo.E p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/Y./*p:foo.E*/a
/*p:foo.E*/foo()
/*p:foo p:foo.E p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/X./*p:foo.E*/foo()
}
}
@@ -0,0 +1,50 @@
package foo
import bar.*
/*p:foo*/fun usages(i: /*p:foo*/I) /*p:foo(E)*/{
/*p:foo p:foo(invoke) p:foo.A.Companion(invoke)*/A()./*p:foo.A*/a
/*p:foo p:foo(invoke) p:foo.A.Companion(invoke)*/A()./*p:foo.A*/b
/*p:foo p:foo(invoke) p:foo.A.Companion(invoke)*/A()./*p:foo.A*/c
/*p:foo p:foo(invoke) p:foo.A.Companion(invoke)*/A()./*p:foo.A*/d = "new value"
/*p:foo p:foo(invoke) p:foo.A.Companion(invoke)*/A()./*p:foo.A*/foo()
/*p:foo*/A./*p:foo.A p:foo.A.B.CO(invoke) p:foo.A.Companion*/B()./*p:foo.A.B*/a
/*p:foo*/A./*p:foo.A*/B./*p:foo.A.B p:foo.A.B.CO*/bar(1)
/*p:foo*/A./*p:foo.A*/B./*p:foo.A.B*/CO./*p:foo.A.B.CO*/bar(1)
/*p:foo p:foo.A(Companion)*/A
/*p:foo*/A./*p:foo.A p:foo.A.Companion*/a
/*p:foo*/A./*p:foo.A p:foo.A.Companion*/baz()
/*p:foo p:foo.A(Companion)*/A./*p:foo.A p:foo.A.Companion*/Companion
/*p:foo*/A./*p:foo.A*/Companion./*p:foo.A.Companion*/baz()
/*p:foo p:foo.A(O)*/A./*p:foo.A p:foo.A.Companion*/O
/*p:foo*/A./*p:foo.A*/O./*p:foo.A.O*/v = "OK"
/*p:foo(I)*/i./*p:foo.I*/a = 2
/*p:foo*/Obj./*p:foo.Obj*/a
/*p:foo*/Obj./*p:foo.Obj*/foo()
var ii: /*p:foo*/I = /*p:foo*/Obj
/*p:foo(I)*/ii./*p:foo.I*/a
/*p:foo(I)*/ii./*p:foo.I*/foo()
/*p:foo*/Obj./*p:foo.Obj*/b
val iii = /*p:foo p:foo(I)*/Obj./*p:foo.Obj*/bar()
/*p:foo(I)*/iii./*p:foo.I*/foo()
/*p:bar p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:foo.E*/X
/*p:bar p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:foo.E*/X./*p:foo.E*/a
/*p:bar p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:foo.E*/Y./*p:foo.E*/foo()
/*p:bar p:foo p:java.lang p:kotlin p:kotlin(Array) p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:foo.E*/values()
/*p:bar p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:foo.E*/valueOf("")
}
/*p:foo*/fun classifiers(
a: /*p:foo*/A,
ab: /*p:foo*/A./*p:foo.A*/B,
ac: /*p:foo*/A./*p:foo.A*/C,
abCo: /*p:foo*/A./*p:foo.A*/B./*p:foo.A.B*/CO,
aCompanion: /*p:foo*/A./*p:foo.A*/Companion,
aO: /*p:foo*/A./*p:foo.A*/O,
i: /*p:foo*/I,
ni: /*p:foo*/I./*p:foo.I*/NI,
obj: /*p:foo*/Obj,
e: /*p:foo*/E
) {}
@@ -0,0 +1,54 @@
package foo
import bar.*
/*p:foo*/fun usages(i: /*p:foo*/I) {
/*p:foo p:foo(invoke) p:foo.A.Companion(invoke)*/A()./*p:foo.A*/a
/*p:foo p:foo(invoke) p:foo.A.Companion(invoke)*/A()./*p:foo.A*/b
/*p:foo p:foo(invoke) p:foo.A.Companion(invoke)*/A()./*p:foo.A*/c
/*p:foo p:foo(invoke) p:foo.A.Companion(invoke)*/A()./*p:foo.A*/d = "new value"
/*p:foo p:foo(invoke) p:foo.A.Companion(invoke)*/A()./*p:foo.A*/foo()
/*p:foo*/A./*p:foo.A p:foo.A.B.CO(invoke) p:foo.A.Companion*/B()./*p:foo.A.B*/a
/*p:foo*/A./*p:foo.A*/B./*p:foo.A.B p:foo.A.B.CO*/bar(1)
/*p:foo*/A./*p:foo.A*/B./*p:foo.A.B*/CO./*p:foo.A.B.CO*/bar(1)
/*p:foo p:foo.A(Companion)*/A
/*p:foo*/A./*p:foo.A p:foo.A.Companion*/a
/*p:foo*/A./*p:foo.A p:foo.A.Companion*/baz()
/*p:foo p:foo.A(Companion)*/A./*p:foo.A p:foo.A.Companion*/Companion
/*p:foo*/A./*p:foo.A*/Companion./*p:foo.A.Companion*/baz()
/*p:foo p:foo.A(O)*/A./*p:foo.A p:foo.A.Companion*/O
/*p:foo*/A./*p:foo.A*/O./*p:foo.A.O*/v = "OK"
/*p:foo*/A./*p:bar p:foo p:foo.A p:foo.A.Companion p:foo.A.Companion(getVALA) p:foo.A.Companion(getVala) p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/vala
/*p:foo*/A./*p:bar p:foo p:foo.A p:foo.A.Companion p:foo.A.Companion(getVARA) p:foo.A.Companion(getVara) p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/vara()
/*p:foo(I)*/i./*p:foo.I*/a = 2
/*p:foo*/Obj./*p:foo.Obj*/a
/*p:foo*/Obj./*p:foo.Obj*/foo()
var ii: /*p:foo*/I = /*p:foo*/Obj
/*p:foo(I)*/ii./*p:foo.I*/a
/*p:foo(I)*/ii./*p:foo.I*/foo()
/*p:foo*/Obj./*p:foo.Obj*/b
val iii = /*p:foo p:foo(I)*/Obj./*p:foo.Obj*/bar()
/*p:foo(I)*/iii./*p:foo.I*/foo()
/*p:bar p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:foo.E*/X
/*p:bar p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:foo.E*/X./*p:foo.E*/a
/*p:bar p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:foo.E*/Y./*p:foo.E*/foo()
/*p:bar p:foo p:java.lang p:kotlin p:kotlin(Array) p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:foo.E*/values()
/*p:bar p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:foo.E*/valueOf("")
/*p:bar p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:foo.E*/foo
/*p:bar p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:foo.E*/bar()
}
/*p:foo*/fun classifiers(
a: /*p:foo*/A,
ab: /*p:foo*/A./*p:foo.A*/B,
ac: /*p:foo*/A./*p:foo.A*/C,
abCo: /*p:foo*/A./*p:foo.A*/B./*p:foo.A.B*/CO,
aCompanion: /*p:foo*/A./*p:foo.A*/Companion,
aO: /*p:foo*/A./*p:foo.A*/O,
i: /*p:foo*/I,
ni: /*p:foo*/I./*p:foo.I*/NI,
obj: /*p:foo*/Obj,
e: /*p:foo*/E
) {}
@@ -0,0 +1,18 @@
package foo.bar
/*p:foo.bar*/fun testComparisons(a: /*p:foo.bar*/A, b: /*p:foo.bar*/Int, c: /*p:foo.bar*/Any, na: /*p:foo.bar*/A?) {
/*p:foo.bar(A)*/a /*p:foo.bar.A(equals)*/== c
/*p:foo.bar(A)*/a /*p:foo.bar.A(equals)*/!= c
/*p:foo.bar(A)*/na /*p:foo.bar.A(equals)*/== /*p:foo.bar(A)*/a
/*p:foo.bar(A)*/na /*p:foo.bar.A(equals)*/== /*p:kotlin(Nothing)*/null
/*p:foo.bar(A)*/a /*p:foo.bar.A(compareTo)*/> b
/*p:foo.bar(A)*/a /*p:foo.bar.A(compareTo)*/< b
/*p:foo.bar(A)*/a /*p:foo.bar.A(compareTo)*/>= b
/*p:foo.bar(A)*/a /*p:foo.bar.A(compareTo)*/<= b
/*p:foo.bar(A)*/a /*p:foo.bar(compareTo) p:foo.bar.A(compareTo) p:foo.bar.A(getCOMPARETo) p:foo.bar.A(getCompareTo)*/> c
/*p:foo.bar(A)*/a /*p:foo.bar(compareTo) p:foo.bar.A(compareTo) p:foo.bar.A(getCOMPARETo) p:foo.bar.A(getCompareTo)*/< c
/*p:foo.bar(A)*/a /*p:foo.bar(compareTo) p:foo.bar.A(compareTo) p:foo.bar.A(getCOMPARETo) p:foo.bar.A(getCompareTo)*/>= c
/*p:foo.bar(A)*/a /*p:foo.bar(compareTo) p:foo.bar.A(compareTo) p:foo.bar.A(getCOMPARETo) p:foo.bar.A(getCompareTo)*/<= c
}
@@ -0,0 +1,35 @@
package foo.bar
/*p:foo.bar*/class A {
operator fun plus(a: /*p:foo.bar p:foo.bar.A*/Int) = /*p:foo.bar(A)*/this
operator fun timesAssign(a: /*p:foo.bar p:foo.bar.A*/Any?) {}
operator fun inc(): /*p:foo.bar p:foo.bar.A*/A = /*p:foo.bar(A)*/this
operator fun get(i: /*p:foo.bar p:foo.bar.A*/Int) = 1
operator fun contains(a: /*p:foo.bar p:foo.bar.A*/Int): /*p:foo.bar p:foo.bar.A*/Boolean = false
operator fun invoke() {}
operator fun compareTo(a: /*p:foo.bar p:foo.bar.A*/Int) = 0
operator fun component1() = /*p:foo.bar(A)*/this
operator fun iterator() = /*p:foo.bar(A)*/this
operator fun next() = /*p:foo.bar(A)*/this
}
/*p:foo.bar*/operator fun /*p:foo.bar*/A.minus(a: /*p:foo.bar*/Int) = /*p:foo.bar(A)*/this
/*p:foo.bar*/operator fun /*p:foo.bar*/A.divAssign(a: /*p:foo.bar*/Any?) {}
/*p:foo.bar*/operator fun /*p:foo.bar*/A.dec(): /*p:foo.bar*/A = /*p:foo.bar(A)*/this
/*p:foo.bar*/operator fun /*p:foo.bar*/A.not() {}
/*p:foo.bar*/operator fun /*p:foo.bar*/A.set(i: /*p:foo.bar*/Int, v: /*p:foo.bar*/Int) {}
/*p:foo.bar*/operator fun /*p:foo.bar*/A.contains(a: /*p:foo.bar*/Any): /*p:foo.bar*/Boolean = true
/*p:foo.bar*/operator fun /*p:foo.bar*/A.invoke(i: /*p:foo.bar*/Int) {}
/*p:foo.bar*/operator fun /*p:foo.bar*/A.compareTo(a: /*p:foo.bar*/Any) = 0
/*p:foo.bar*/operator fun /*p:foo.bar*/A.component2() = /*p:foo.bar(A)*/this
/*p:foo.bar*/operator fun /*p:foo.bar*/A?.iterator() = /*p:foo.bar(A)*/this!!
/*p:foo.bar*/operator fun /*p:foo.bar*/A.hasNext(): /*p:foo.bar*/Boolean = false
@@ -0,0 +1,30 @@
package foo.bar
/*p:kotlin.reflect(KProperty)*/import kotlin.reflect.KProperty
/*p:foo.bar*/class D1 {
operator fun getValue(t: /*p:foo.bar p:foo.bar.D1*/Any?, p: /*p:foo.bar.D1 p:kotlin.reflect*/KProperty<*>) = 1
}
/*p:foo.bar*/operator fun /*p:foo.bar*/D1.setValue(t: /*p:foo.bar*/Any?, p: /*p:kotlin.reflect*/KProperty<*>, v: /*p:foo.bar*/Int) {}
/*p:foo.bar(D2)*/open class D2 {
operator fun setValue(t: /*p:foo.bar p:foo.bar.D2*/Any?, p: /*p:foo.bar.D2 p:kotlin.reflect*/KProperty<*>, v: /*p:foo.bar p:foo.bar.D2*/Int) {}
}
/*p:foo.bar*/operator fun /*p:foo.bar*/D2.getValue(t: /*p:foo.bar*/Any?, p: /*p:kotlin.reflect*/KProperty<*>) = 1
/*p:foo.bar*/operator fun /*p:foo.bar*/D2.provideDelegate(p: /*p:foo.bar*/Any?, k: /*p:foo.bar*/Any) = /*p:foo.bar(D2)*/this
/*p:foo.bar*/class D3 : /*p:foo.bar*/D2() {
operator fun provideDelegate(p: /*p:foo.bar p:foo.bar.D2 p:foo.bar.D3*/Any?, k: /*p:foo.bar p:foo.bar.D2 p:foo.bar.D3*/Any) = /*p:foo.bar(D3)*/this
}
/*p:foo.bar*/val x1 by /*p:foo.bar p:foo.bar(provideDelegate) p:foo.bar.D1(getPROVIDEDelegate) p:foo.bar.D1(getProvideDelegate) p:foo.bar.D1(getValue) p:foo.bar.D1(provideDelegate) p:java.lang(provideDelegate) p:kotlin(provideDelegate) p:kotlin.annotation(provideDelegate) p:kotlin.collections(provideDelegate) p:kotlin.comparisons(provideDelegate) p:kotlin.io(provideDelegate) p:kotlin.jvm(provideDelegate) p:kotlin.ranges(provideDelegate) p:kotlin.sequences(provideDelegate) p:kotlin.text(provideDelegate)*/D1()
/*p:foo.bar*/var y1 by /*p:foo.bar p:foo.bar(provideDelegate) p:foo.bar(setValue) p:foo.bar.D1(getPROVIDEDelegate) p:foo.bar.D1(getProvideDelegate) p:foo.bar.D1(getSETValue) p:foo.bar.D1(getSetValue) p:foo.bar.D1(getValue) p:foo.bar.D1(provideDelegate) p:foo.bar.D1(setValue) p:java.lang(provideDelegate) p:kotlin(provideDelegate) p:kotlin.annotation(provideDelegate) p:kotlin.collections(provideDelegate) p:kotlin.comparisons(provideDelegate) p:kotlin.io(provideDelegate) p:kotlin.jvm(provideDelegate) p:kotlin.ranges(provideDelegate) p:kotlin.sequences(provideDelegate) p:kotlin.text(provideDelegate)*/D1()
/*p:foo.bar*/val x2 by /*p:foo.bar p:foo.bar(getValue) p:foo.bar(provideDelegate) p:foo.bar.D2(getGETValue) p:foo.bar.D2(getGetValue) p:foo.bar.D2(getPROVIDEDelegate) p:foo.bar.D2(getProvideDelegate) p:foo.bar.D2(getValue) p:foo.bar.D2(provideDelegate)*/D2()
/*p:foo.bar*/var y2 by /*p:foo.bar p:foo.bar(getValue) p:foo.bar(provideDelegate) p:foo.bar.D2(getGETValue) p:foo.bar.D2(getGetValue) p:foo.bar.D2(getPROVIDEDelegate) p:foo.bar.D2(getProvideDelegate) p:foo.bar.D2(getValue) p:foo.bar.D2(provideDelegate) p:foo.bar.D2(setValue)*/D2()
/*p:foo.bar*/val x3 by /*p:foo.bar p:foo.bar(getValue) p:foo.bar.D2(getValue) p:foo.bar.D2(provideDelegate) p:foo.bar.D3(getGETValue) p:foo.bar.D3(getGetValue) p:foo.bar.D3(getValue) p:foo.bar.D3(provideDelegate)*/D3()
/*p:foo.bar*/var y3 by /*p:foo.bar p:foo.bar(getValue) p:foo.bar.D2(getValue) p:foo.bar.D2(provideDelegate) p:foo.bar.D2(setValue) p:foo.bar.D3(getGETValue) p:foo.bar.D3(getGetValue) p:foo.bar.D3(getValue) p:foo.bar.D3(provideDelegate) p:foo.bar.D3(setValue)*/D3()
@@ -0,0 +1,24 @@
package foo.bar
/*p:foo.bar*/fun testOperators(a: /*p:foo.bar*/A, b: /*p:foo.bar*/Int) {
var d = /*p:foo.bar(A)*/a
/*p:foo.bar(A)*/d/*p:foo.bar.A(inc)*/++
/*p:foo.bar(A) p:foo.bar.A(inc)*/++/*p:foo.bar(A)*/d
/*p:foo.bar(A)*/d/*p:foo.bar(dec) p:foo.bar.A(dec) p:foo.bar.A(getDEC) p:foo.bar.A(getDec)*/--
/*p:foo.bar(A) p:foo.bar(dec) p:foo.bar.A(dec) p:foo.bar.A(getDEC) p:foo.bar.A(getDec)*/--/*p:foo.bar(A)*/d
/*p:foo.bar(A)*/a /*p:foo.bar.A(plus)*/+ b
/*p:foo.bar(A)*/a /*p:foo.bar(minus) p:foo.bar.A(getMINUS) p:foo.bar.A(getMinus) p:foo.bar.A(minus)*/- b
/*p:foo.bar(not) p:foo.bar.A(getNOT) p:foo.bar.A(getNot) p:foo.bar.A(not)*/!/*p:foo.bar(A)*/a
// for val
/*p:foo.bar(A)*/a /*p:foo.bar.A(timesAssign)*/*= b
/*p:foo.bar(A)*/a /*p:foo.bar(divAssign) p:foo.bar.A(divAssign) p:foo.bar.A(getDIVAssign) p:foo.bar.A(getDivAssign)*//= b
// for var
/*p:foo.bar(A)*/d /*p:foo.bar(plusAssign) p:foo.bar.A(getPLUSAssign) p:foo.bar.A(getPlusAssign) p:foo.bar.A(plus) p:foo.bar.A(plusAssign) p:java.lang(plusAssign) p:kotlin(plusAssign) p:kotlin.annotation(plusAssign) p:kotlin.collections(plusAssign) p:kotlin.comparisons(plusAssign) p:kotlin.io(plusAssign) p:kotlin.jvm(plusAssign) p:kotlin.ranges(plusAssign) p:kotlin.sequences(plusAssign) p:kotlin.text(plusAssign)*/+= b
/*p:foo.bar(A)*/d /*p:foo.bar(minus) p:foo.bar(minusAssign) p:foo.bar.A(getMINUS) p:foo.bar.A(getMINUSAssign) p:foo.bar.A(getMinus) p:foo.bar.A(getMinusAssign) p:foo.bar.A(minus) p:foo.bar.A(minusAssign) p:java.lang(minusAssign) p:kotlin(minusAssign) p:kotlin.annotation(minusAssign) p:kotlin.collections(minusAssign) p:kotlin.comparisons(minusAssign) p:kotlin.io(minusAssign) p:kotlin.jvm(minusAssign) p:kotlin.ranges(minusAssign) p:kotlin.sequences(minusAssign) p:kotlin.text(minusAssign)*/-= b
/*p:foo.bar(A)*/d /*p:foo.bar(times) p:foo.bar.A(getTIMES) p:foo.bar.A(getTimes) p:foo.bar.A(times) p:foo.bar.A(timesAssign) p:java.lang(times) p:kotlin(times) p:kotlin.annotation(times) p:kotlin.collections(times) p:kotlin.comparisons(times) p:kotlin.io(times) p:kotlin.jvm(times) p:kotlin.ranges(times) p:kotlin.sequences(times) p:kotlin.text(times)*/*= b
/*p:foo.bar(A)*/d /*p:foo.bar(div) p:foo.bar(divAssign) p:foo.bar.A(div) p:foo.bar.A(divAssign) p:foo.bar.A(getDIV) p:foo.bar.A(getDIVAssign) p:foo.bar.A(getDiv) p:foo.bar.A(getDivAssign) p:java.lang(div) p:kotlin(div) p:kotlin.annotation(div) p:kotlin.collections(div) p:kotlin.comparisons(div) p:kotlin.io(div) p:kotlin.jvm(div) p:kotlin.ranges(div) p:kotlin.sequences(div) p:kotlin.text(div)*//= b
}
@@ -0,0 +1,16 @@
package foo.bar
/*p:foo.bar*/fun testOther(a: /*p:foo.bar*/A, b: /*p:foo.bar*/Int, c: /*p:foo.bar*/Any, na: /*p:foo.bar*/A?) {
/*p:foo.bar(A) p:foo.bar(set) p:foo.bar.A(getSET) p:foo.bar.A(getSet) p:foo.bar.A(set)*/a[1] = /*p:foo.bar(A) p:foo.bar.A(get)*/a[2]
b /*p:foo.bar.A(contains)*/in /*p:foo.bar(A)*/a
"s" /*p:foo.bar(contains) p:foo.bar.A(contains) p:foo.bar.A(getCONTAINS) p:foo.bar.A(getContains)*/!in /*p:foo.bar(A)*/a
/*p:foo.bar.A(invoke)*/a()
/*p:foo.bar p:foo.bar(invoke) p:foo.bar.A(invoke)*/a(1)
val (/*p:foo.bar.A(component1)*/h, /*p:foo.bar(component2) p:foo.bar.A(component2) p:foo.bar.A(getComponent2)*/t) = /*p:foo.bar(A)*/a;
for ((/*p:foo.bar.A(component1)*/f, /*p:foo.bar(component2) p:foo.bar.A(component2) p:foo.bar.A(getComponent2)*/s) in /*p:foo.bar(A) p:foo.bar(hasNext) p:foo.bar.A(getHASNext) p:foo.bar.A(getHasNext) p:foo.bar.A(hasNext) p:foo.bar.A(iterator) p:foo.bar.A(next)*/a);
for ((/*p:foo.bar.A(component1)*/f, /*p:foo.bar(component2) p:foo.bar.A(component2) p:foo.bar.A(getComponent2)*/s) in /*p:foo.bar(A) p:foo.bar(hasNext) p:foo.bar(iterator) p:foo.bar.A(getHASNext) p:foo.bar.A(getHasNext) p:foo.bar.A(getITERATOR) p:foo.bar.A(getIterator) p:foo.bar.A(hasNext) p:foo.bar.A(iterator) p:foo.bar.A(next)*/na);
}
@@ -0,0 +1,15 @@
package foo
// From KT-10772 Problem with daemon on Idea 15.0.3 & 1-dev-25
/*p:foo*/fun <T> identity(): (T) -> T = /*p:kotlin(Function1) p:kotlin(Nothing)*/null as (T) -> T
/*p:foo*/fun <T> compute(f: () -> T) {
val result = f()
}
/*p:foo*/class Bar<T>(val t: T) {
init {
val a = /*p:foo.Bar p:foo.Bar(T)*/t
}
}
@@ -0,0 +1,19 @@
package foo
/*p:foo(A)*/open class A
/*p:foo*/class B : /*p:foo*/A()
/*p:foo*/fun getA() = /*p:foo*/A()
/*p:foo*/fun getB() = /*p:foo*/B()
/*p:foo*/fun getListOfA() = /*p:foo p:foo(A) p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.collections(List) p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/listOf(/*p:foo*/A())
/*p:foo*/fun getListOfB() = /*p:foo p:foo(B) p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.collections(List) p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/listOf(/*p:foo*/B())
/*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 testInferredType() {
/*p:foo*/useListOfA(/*p:foo p:foo(A) p:kotlin.collections(List)*/getListOfA())
/*p:foo*/useListOfA(/*p:foo p:foo(B) p:kotlin.collections(List)*/getListOfB())
/*p:foo*/useListOfB(/*p:foo p:foo(B) p:kotlin.collections(List)*/getListOfB())
}
@@ -0,0 +1,11 @@
package foo
/*p:foo*/class C
/*p:foo*/fun lambdaConsumer(fn: (/*p:foo*/A)->/*p:foo*/Unit) {}
/*p:foo*/fun extensionConsumer(fn: /*p:foo*/A.()->/*p:foo*/Unit) {}
/*p:foo*/fun testLambdaParameterType() {
/*p:foo*/lambdaConsumer /*p:foo(A) p:kotlin(Function1)*/{ /*p:foo(A)*/it }
/*p:foo*/extensionConsumer /*p:foo(A) p:kotlin(Function1)*/{ /*p:foo(A)*/this }
}
@@ -2,5 +2,5 @@
Compiling files:
src/usages.kt
Exit code: COMPILATION_ERROR
Unresolved reference 'IS'.
Unresolved reference 'IS'.
Unresolved reference: IS
Unresolved reference: IS
@@ -0,0 +1,6 @@
==== INITIAL BUILD ====
Compiling files:
src/usages.kt
Exit code: COMPILATION_ERROR
Unresolved reference 'IS'.
Unresolved reference 'IS'.
@@ -0,0 +1,45 @@
package foo
/*p:bar(C)*/import bar.C
import baz.*
/*p:foo*/fun usages() {
val c = /*p:bar*/C()
/*p:bar(C)*/c./*p:bar.C*/field
/*p:bar(C)*/c./*p:bar.C*/field = 2
/*p:bar(C)*/c./*p:bar.C*/func()
/*p:bar(C) p:bar.C(B)*/c./*p:bar.C*/B()
/*p:bar p:baz p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/C./*p:bar.C*/sfield
/*p:bar p:baz p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/C./*p:bar.C*/sfield = "new"
/*p:bar p:baz p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/C./*p:bar.C*/sfunc()
/*p:bar p:bar.C(S) p:baz p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/C./*p:bar.C*/S()
// inherited from I
/*p:bar(C)*/c./*p:bar.C*/ifunc()
/*p:bar p:baz p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/C./*p:bar.C*/isfield
// expected error: Unresolved reference: IS
/*p:bar p:baz p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/C./*p:bar.C*/IS()
val i: /*p:foo*/I = /*p:bar(C)*/c
/*p:foo(I)*/i./*p:foo.I*/ifunc()
/*p:baz p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/I./*p:foo.I*/isfield
/*p:baz p:foo p:foo.I(IS) p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/I./*p:foo.I*/IS()
/*p:baz p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:baz.E*/F
/*p:baz p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:baz.E*/F./*p:baz.E*/field
/*p:baz p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/E./*p:baz.E*/S./*p:baz.E*/func()
}
/*p:foo*/fun classifiers(
c: /*p:bar*/C,
b: /*p:bar*/C./*p:bar.C*/B,
s: /*p:bar*/C./*p:bar.C*/S,
cis: /*p:bar*/C./*p:bar.C*/IS,
i: /*p:foo*/I,
iis: /*p:foo*/I./*p:foo.I*/IS,
e: /*p:baz p:foo*/E
) {}
@@ -0,0 +1,6 @@
package foo
/*p:foo(A)*/open class A {
@/*p:foo p:foo.A p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/JvmName("g")
fun f() {}
}
@@ -0,0 +1,6 @@
package foo
/*p:foo(A)*/open class A {
@/*p:foo p:foo.A p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/JvmName("h")
fun f() {}
}
@@ -0,0 +1,5 @@
package foo
/*p:foo*/fun useAChild(a: /*p:foo*/AChild) {
/*p:foo(AChild)*/a./*p:foo.A p:foo.AChild*/f()
}
@@ -0,0 +1,49 @@
package local.declarations
import bar.*
/*p:local.declarations*/fun f(p: /*p:local.declarations*/Any) {
p.toString()
val a = 1
val b = a
fun localFun() = b
fun /*p:local.declarations*/Int.localExtFun() = localFun()
abstract class LocalI {
abstract var a: /*p:local.declarations*/Int
abstract fun foo()
}
class LocalC : LocalI() {
override var a = 1
override fun foo() {}
var b = "bbb"
fun bar() = b
}
val o = object {
val a = "aaa"
fun foo(): LocalI = /*p:kotlin(Nothing)*/null as LocalI
}
localFun()
1./*p:kotlin.Int(getLOCALExtFun) p:kotlin.Int(getLocalExtFun)*/localExtFun()
val c = LocalC()
c.a
c.b
c.foo()
c.bar()
val i: LocalI = c
i.a
i.foo()
o.a
val ii = o.foo()
ii.a
}
@@ -0,0 +1,17 @@
package foo
import bar.*
/*p:baz(C)*/import baz.C
/*p:foo*/val a = /*p:bar p:foo*/A()
/*p:foo*/var b: /*p:bar p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/baz./*p:baz*/B = /*p:bar p:baz(B) p:foo p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/baz./*p:baz*/B()
/*p:foo*/fun function(p: /*p:bar p:foo*/B): /*p:bar p:foo*/B /*p:kotlin(Nothing)*/{
/*p:bar(A) p:foo*/a
/*p:kotlin(Nothing)*/return /*p:bar p:foo*/B()
}
/*p:foo*/fun /*p:foo*/MyClass.extFunc(p: /**p:foo p:bar*//*p:foo p:kotlin*/Array</*p:bar p:foo*/B>, e: /*p:foo*/MyEnum, c: /**???*//*p:baz*/C): /*p:foo*/MyInterface /*p:kotlin(Nothing)*/{
/*p:bar p:baz(B) p:foo p:foo.MyClass p:foo.MyClass(getB) p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/b
/*p:kotlin(Nothing)*/return /*p:bar p:foo p:foo.MyClass p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/MyClass()
}
@@ -0,0 +1,6 @@
package foo.bar
/*p:foo.bar*/fun main(args: /*p:foo.bar p:kotlin*/Array</*p:foo.bar*/String>) {
val f: /*p:foo.bar p:kotlin*/Array</*p:foo.bar*/Int>
val s: /*p:foo.bar*/String
}
@@ -0,0 +1,8 @@
package foo
/*p:<root>(JavaClass)*/import JavaClass
/*p:foo*/class KotlinClass : /*p:<root>*/JavaClass() {
override fun getFoo() = 2
fun setFoo(i: /*p:JavaClass p:foo p:foo.KotlinClass*/Int) {}
}
@@ -3,19 +3,11 @@ Compiling files:
src/KotlinClass.kt
src/usages.kt
Exit code: COMPILATION_ERROR
Unresolved reference 'setFoo'.
'val' cannot be reassigned.
Overload resolution ambiguity between candidates:
var bazBaz: Int
val bazBaz: Int
Overload resolution ambiguity between candidates:
var bazBaz: Int
val bazBaz: Int
Unresolved reference 'boo'.
Overload resolution ambiguity between candidates:
var bazBaz: Int
val bazBaz: Int
Overload resolution ambiguity between candidates:
var bazBaz: Int
val bazBaz: Int
Unresolved reference 'boo'.
Unresolved reference: setFoo
Val cannot be reassigned
Unresolved reference: bazBaz
Unresolved reference: bazBaz
Unresolved reference: boo
Unresolved reference: bazBaz
Unresolved reference: bazBaz
Unresolved reference: boo
@@ -0,0 +1,21 @@
==== INITIAL BUILD ====
Compiling files:
src/KotlinClass.kt
src/usages.kt
Exit code: COMPILATION_ERROR
Unresolved reference 'setFoo'.
'val' cannot be reassigned.
Overload resolution ambiguity between candidates:
var bazBaz: Int
val bazBaz: Int
Overload resolution ambiguity between candidates:
var bazBaz: Int
val bazBaz: Int
Unresolved reference 'boo'.
Overload resolution ambiguity between candidates:
var bazBaz: Int
val bazBaz: Int
Overload resolution ambiguity between candidates:
var bazBaz: Int
val bazBaz: Int
Unresolved reference 'boo'.
@@ -0,0 +1,30 @@
package foo.bar
/*p:<root>(JavaClass)*/import JavaClass
/*p:foo(KotlinClass)*/import foo.KotlinClass
/*p:foo.bar*/fun test() {
val j = /*p:<root>*/JavaClass()
val k = /*p:foo*/KotlinClass()
/*p:<root>(JavaClass)*/j./*p:JavaClass*/getFoo()
/*p:<root>(JavaClass)*/j./*p:JavaClass p:JavaClass(getSETFoo) p:JavaClass(getSetFoo) p:foo.bar p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/setFoo(2)
/*p:<root>(JavaClass)*/j./*p:JavaClass p:JavaClass(getFOO) p:JavaClass(getFoo) p:JavaClass(setFoo)*/foo = 2
/*p:<root>(JavaClass)*/j./*p:JavaClass p:JavaClass(getFOO) p:JavaClass(getFoo) p:JavaClass(setFoo)*/foo
/*p:<root>(JavaClass)*/j./*p:JavaClass p:JavaClass(getBAR) p:JavaClass(getBar) p:JavaClass(setBar)*/bar
/*p:<root>(JavaClass)*/j./*p:JavaClass p:JavaClass(getBAR) p:JavaClass(getBar) p:JavaClass(setBar)*/bar = ""
/*p:<root>(JavaClass)*/j./*p:JavaClass p:JavaClass(getBAZBaz) p:JavaClass(getBazBaz) p:foo.bar p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/bazBaz
/*p:<root>(JavaClass)*/j./*p:JavaClass p:JavaClass(getBAZBaz) p:JavaClass(getBazBaz) p:foo.bar p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/bazBaz = ""
/*p:<root>(JavaClass)*/j./*p:JavaClass*/setBoo(2)
/*p:<root>(JavaClass)*/j./*p:JavaClass p:JavaClass(getBOO) p:JavaClass(getBoo) p:foo.bar p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/boo = 2
/*p:foo(KotlinClass)*/k./*p:JavaClass p:foo.KotlinClass*/getFoo() // getFoo may be an inner class in JavaClass
/*p:foo(KotlinClass)*/k./*p:JavaClass p:foo.KotlinClass*/setFoo(2)
/*p:foo(KotlinClass)*/k./*p:foo.KotlinClass p:foo.KotlinClass(getFOO) p:foo.KotlinClass(getFoo) p:foo.KotlinClass(setFoo)*/foo = 2
/*p:foo(KotlinClass)*/k./*p:foo.KotlinClass p:foo.KotlinClass(getFOO) p:foo.KotlinClass(getFoo) p:foo.KotlinClass(setFoo)*/foo
/*p:foo(KotlinClass)*/k./*p:foo.KotlinClass p:foo.KotlinClass(getBAR) p:foo.KotlinClass(getBar) p:foo.KotlinClass(setBar)*/bar
/*p:foo(KotlinClass)*/k./*p:foo.KotlinClass p:foo.KotlinClass(getBAR) p:foo.KotlinClass(getBar) p:foo.KotlinClass(setBar)*/bar = ""
/*p:foo(KotlinClass)*/k./*p:JavaClass p:foo.KotlinClass p:foo.KotlinClass(getBAZBaz) p:foo.KotlinClass(getBazBaz) p:foo.bar p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/bazBaz
/*p:foo(KotlinClass)*/k./*p:JavaClass p:foo.KotlinClass p:foo.KotlinClass(getBAZBaz) p:foo.KotlinClass(getBazBaz) p:foo.bar p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/bazBaz = ""
/*p:foo(KotlinClass)*/k./*p:JavaClass p:foo.KotlinClass*/setBoo(2)
/*p:foo(KotlinClass)*/k./*p:JavaClass p:foo.KotlinClass p:foo.KotlinClass(getBOO) p:foo.KotlinClass(getBoo) p:foo.bar p:java.lang p:kotlin p:kotlin.annotation p:kotlin.collections p:kotlin.comparisons p:kotlin.io p:kotlin.jvm p:kotlin.ranges p:kotlin.sequences p:kotlin.text*/boo = 2
}
@@ -0,0 +1,5 @@
package top
/*p:top*/fun typeAliasUsage(a: /*p:top*/TypeAlias) {
/*p:top(Foo)*/a./*p:top.Foo*/prop
}