Add test for overloading expect MemberDescriptors discrimination
Issue #KT-38298
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* Copyright 2010-2020 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.gradle
|
||||
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.psi.util.PsiTreeUtil
|
||||
import com.intellij.testFramework.runInEdtAndGet
|
||||
import org.jetbrains.kotlin.idea.codeInsight.gradle.MultiplePluginVersionGradleImportingTestCase
|
||||
import org.jetbrains.kotlin.idea.core.util.toPsiFile
|
||||
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
||||
import org.jetbrains.kotlin.psi.KtTreeVisitorVoid
|
||||
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
||||
import org.jetbrains.plugins.gradle.tooling.annotation.PluginTargetVersions
|
||||
import org.junit.Test
|
||||
|
||||
// TODO: run this test on the Gradle plugin from the current build
|
||||
// 1. specify appropriate 'pluginVersion' in [PluginTargetVersions]
|
||||
// 2. avoid using fixed Gradle plugin version in testdata
|
||||
class ImportAndCheckNavigation : MultiplePluginVersionGradleImportingTestCase() {
|
||||
|
||||
@Test
|
||||
@PluginTargetVersions(gradleVersion = "5.0+", pluginVersion = "1.3.50+")
|
||||
fun testNavigationToCommonizedLibrary() {
|
||||
val files = configureAndImportProject()
|
||||
|
||||
files.forEach { vFile ->
|
||||
val referencesToTest = vFile.collectReferencesToTest()
|
||||
referencesToTest.forEach { (psiReference, expectedElementText) ->
|
||||
runReadAction {
|
||||
val referencedElement = psiReference.resolve()
|
||||
assertNotNull(
|
||||
"PSI reference \"${psiReference.canonicalText}\" in ${vFile.relPath} can't be resolved",
|
||||
referencedElement
|
||||
)
|
||||
|
||||
val referencedElementText = referencedElement!!.text
|
||||
assertTrue(
|
||||
"Resolved reference \"${psiReference.canonicalText}\" from ${vFile.relPath} does not " +
|
||||
"contain \"$expectedElementText\", instead it contains \"$referencedElementText\"",
|
||||
expectedElementText in referencedElementText
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun testDataDirName() = "importAndCheckNavigation"
|
||||
|
||||
private fun configureAndImportProject(): List<VirtualFile> {
|
||||
val files = configureByFiles()
|
||||
importProject()
|
||||
return files
|
||||
}
|
||||
|
||||
private fun VirtualFile.collectReferencesToTest(): Map<PsiReference, String> {
|
||||
if (extension != "kt") return emptyMap()
|
||||
|
||||
val referencesToTest = mutableMapOf<PsiReference, String>()
|
||||
|
||||
runInEdtAndGet {
|
||||
val psiFile = toPsiFile(project)
|
||||
assertNotNull(
|
||||
"Can't get PSI file for $relPath",
|
||||
psiFile
|
||||
)
|
||||
|
||||
psiFile!!.accept(object : KtTreeVisitorVoid() {
|
||||
override fun visitComment(comment: PsiComment) {
|
||||
val commentText = comment.text ?: return
|
||||
|
||||
val unwrappedCommentText = if (commentText.startsWith("/*")) {
|
||||
commentText.removePrefix("/*").removeSuffix("*/")
|
||||
} else {
|
||||
commentText.removePrefix("//")
|
||||
}.trim(Char::isWhitespace)
|
||||
|
||||
if (unwrappedCommentText.startsWith("NAVIGATION-TARGET:")) {
|
||||
val expectedElementText = unwrappedCommentText.substringAfter("NAVIGATION-TARGET:").trimStart(Char::isWhitespace)
|
||||
assertTrue(
|
||||
"Empty expected element text in $relPath in comment \"$commentText\" at offset ${comment.startOffset}",
|
||||
expectedElementText.isNotEmpty()
|
||||
)
|
||||
|
||||
val nextElement = PsiTreeUtil.skipSiblingsForward(
|
||||
comment,
|
||||
PsiWhiteSpace::class.java, PsiComment::class.java
|
||||
)
|
||||
assertNotNull(
|
||||
"Next element not found in $relPath after comment \"$commentText\" at offset ${comment.startOffset}",
|
||||
nextElement
|
||||
)
|
||||
|
||||
val reference = nextElement!!.findReferenceAt(0)
|
||||
assertNotNull(
|
||||
"Can find PSI reference for \"${nextElement.text}\" in $relPath at offset ${nextElement.startOffset}",
|
||||
reference
|
||||
)
|
||||
|
||||
referencesToTest[reference!!] = expectedElementText
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
return referencesToTest
|
||||
}
|
||||
|
||||
private val VirtualFile.relPath: String
|
||||
get() = canonicalPath?.removePrefix(projectPath)?.trimStart('/', '\\') ?: name
|
||||
}
|
||||
Vendored
+49
@@ -0,0 +1,49 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
maven("https://dl.bintray.com/kotlin/kotlin-dev") // TODO: use the Gradle plugin from the current build
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.0-dev-7568") // TODO: use the Gradle plugin from the current build
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
kotlin("multiplatform")
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven("https://dl.bintray.com/kotlin/kotlin-dev") // TODO: use the Gradle plugin from the current build
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
kotlin {
|
||||
val commonMain by sourceSets.getting {
|
||||
dependencies {
|
||||
implementation(kotlin("stdlib-common"))
|
||||
implementation(kotlin("stdlib"))
|
||||
}
|
||||
}
|
||||
|
||||
val commonTest by sourceSets.getting {
|
||||
dependencies {
|
||||
implementation(kotlin("test-common"))
|
||||
implementation(kotlin("test-annotations-common"))
|
||||
}
|
||||
}
|
||||
|
||||
// there is no Linux HMPP shortcut preset, so need to configure targets and common source sets manually
|
||||
val linuxMain by sourceSets.creating { dependsOn(commonMain) }
|
||||
val linuxTest by sourceSets.creating { dependsOn(commonTest) }
|
||||
|
||||
linuxX64 {
|
||||
compilations["main"].defaultSourceSet.dependsOn(linuxMain)
|
||||
compilations["test"].defaultSourceSet.dependsOn(linuxTest)
|
||||
}
|
||||
|
||||
linuxArm64 {
|
||||
compilations["main"].defaultSourceSet.dependsOn(linuxMain)
|
||||
compilations["test"].defaultSourceSet.dependsOn(linuxTest)
|
||||
}
|
||||
}
|
||||
Vendored
+2
@@ -0,0 +1,2 @@
|
||||
kotlin.mpp.enableGranularSourceSetsMetadata=true
|
||||
kotlin.native.enableDependencyPropagation=false
|
||||
Vendored
+16
@@ -0,0 +1,16 @@
|
||||
pluginManagement {
|
||||
resolutionStrategy {
|
||||
eachPlugin {
|
||||
if (requested.id.name == "multiplatform") {
|
||||
useModule("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.0-dev-7568") // TODO: use the Gradle plugin from the current build
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven("https://dl.bintray.com/kotlin/kotlin-dev") // TODO: use the Gradle plugin from the current build
|
||||
gradlePluginPortal()
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.name = "test"
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
package arm64
|
||||
|
||||
import kotlinx.cinterop.CPointer
|
||||
import platform.posix.FILE
|
||||
import platform.posix.fopen
|
||||
import platform.posix.fprintf
|
||||
import platform.zlib.uInt
|
||||
|
||||
fun test() {
|
||||
val file: CPointer< /* NAVIGATION-TARGET:typealias FILE = */ FILE> = /* NAVIGATION-TARGET:external fun fopen */ fopen("file.txt", "r") ?: return
|
||||
fun f1(): /* NAVIGATION-TARGET:typealias uInt = */ uInt = TODO()
|
||||
/* NAVIGATION-TARGET:external fun fprintf */ fprintf(null, "")
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
package common
|
||||
|
||||
import kotlinx.cinterop.CPointer
|
||||
import platform.posix.FILE
|
||||
import platform.posix.fopen
|
||||
import platform.posix.fprintf
|
||||
import platform.zlib.uInt
|
||||
|
||||
fun test() {
|
||||
val file: CPointer< /* NAVIGATION-TARGET:expect class FILE */ FILE> = /* NAVIGATION-TARGET:external expect fun fopen */ fopen("file.txt", "r") ?: return
|
||||
fun f1(): /* NAVIGATION-TARGET:expect class uInt */ uInt = TODO()
|
||||
/* NAVIGATION-TARGET:external expect fun fprintf */ fprintf(null, "")
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
package x64
|
||||
|
||||
import kotlinx.cinterop.CPointer
|
||||
import platform.posix.FILE
|
||||
import platform.posix.fopen
|
||||
import platform.posix.fprintf
|
||||
import platform.zlib.uInt
|
||||
|
||||
fun test() {
|
||||
val file: CPointer< /* NAVIGATION-TARGET:typealias FILE = */ FILE> = /* NAVIGATION-TARGET:external fun fopen */ fopen("file.txt", "r") ?: return
|
||||
fun f1(): /* NAVIGATION-TARGET:typealias uInt = */ uInt = TODO()
|
||||
/* NAVIGATION-TARGET:external fun fprintf */ fprintf(null, "")
|
||||
}
|
||||
Reference in New Issue
Block a user