[Expect/Actual] Add testdata on hierarchical expect/actual matching
This commit is contained in:
@@ -41,10 +41,7 @@ import org.jetbrains.kotlin.idea.AbstractExpressionSelectionTest
|
|||||||
import org.jetbrains.kotlin.idea.index.AbstractKotlinTypeAliasByExpansionShortNameIndexTest
|
import org.jetbrains.kotlin.idea.index.AbstractKotlinTypeAliasByExpansionShortNameIndexTest
|
||||||
import org.jetbrains.kotlin.idea.AbstractSmartSelectionTest
|
import org.jetbrains.kotlin.idea.AbstractSmartSelectionTest
|
||||||
import org.jetbrains.kotlin.idea.actions.AbstractGotoTestOrCodeActionTest
|
import org.jetbrains.kotlin.idea.actions.AbstractGotoTestOrCodeActionTest
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractIdeCompiledLightClassTest
|
import org.jetbrains.kotlin.idea.caches.resolve.*
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractIdeLightClassTest
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractMultiModuleLineMarkerTest
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractMultiPlatformHighlightingTest
|
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.*
|
import org.jetbrains.kotlin.idea.codeInsight.*
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractCodeInsightActionTest
|
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractCodeInsightActionTest
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractGenerateHashCodeAndEqualsActionTest
|
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractGenerateHashCodeAndEqualsActionTest
|
||||||
@@ -672,6 +669,10 @@ fun main(args: Array<String>) {
|
|||||||
model("multiModuleHighlighting/multiplatform/", recursive = false, extension = null)
|
model("multiModuleHighlighting/multiplatform/", recursive = false, extension = null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testClass<AbstractHierarchicalExpectActualTest> {
|
||||||
|
model("multiModuleHighlighting/hierarchicalExpectActualMatching/", recursive = false, extension = null)
|
||||||
|
}
|
||||||
|
|
||||||
testClass<AbstractQuickFixMultiModuleTest> {
|
testClass<AbstractQuickFixMultiModuleTest> {
|
||||||
model("multiModuleQuickFix", recursive = false, extension = null)
|
model("multiModuleQuickFix", recursive = false, extension = null)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,10 +50,7 @@ import org.jetbrains.kotlin.idea.AbstractExpressionSelectionTest
|
|||||||
import org.jetbrains.kotlin.idea.index.AbstractKotlinTypeAliasByExpansionShortNameIndexTest
|
import org.jetbrains.kotlin.idea.index.AbstractKotlinTypeAliasByExpansionShortNameIndexTest
|
||||||
import org.jetbrains.kotlin.idea.AbstractSmartSelectionTest
|
import org.jetbrains.kotlin.idea.AbstractSmartSelectionTest
|
||||||
import org.jetbrains.kotlin.idea.actions.AbstractGotoTestOrCodeActionTest
|
import org.jetbrains.kotlin.idea.actions.AbstractGotoTestOrCodeActionTest
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractIdeCompiledLightClassTest
|
import org.jetbrains.kotlin.idea.caches.resolve.*
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractIdeLightClassTest
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractMultiModuleLineMarkerTest
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractMultiPlatformHighlightingTest
|
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.*
|
import org.jetbrains.kotlin.idea.codeInsight.*
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractCodeInsightActionTest
|
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractCodeInsightActionTest
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractGenerateHashCodeAndEqualsActionTest
|
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractGenerateHashCodeAndEqualsActionTest
|
||||||
@@ -685,6 +682,10 @@ fun main(args: Array<String>) {
|
|||||||
model("multiModuleHighlighting/multiplatform/", recursive = false, extension = null)
|
model("multiModuleHighlighting/multiplatform/", recursive = false, extension = null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testClass<AbstractHierarchicalExpectActualTest> {
|
||||||
|
model("multiModuleHighlighting/hierarchicalExpectActualMatching/", recursive = false, extension = null)
|
||||||
|
}
|
||||||
|
|
||||||
testClass<AbstractQuickFixMultiModuleTest> {
|
testClass<AbstractQuickFixMultiModuleTest> {
|
||||||
model("multiModuleQuickFix", recursive = false, extension = null)
|
model("multiModuleQuickFix", recursive = false, extension = null)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,10 +41,7 @@ import org.jetbrains.kotlin.idea.AbstractExpressionSelectionTest
|
|||||||
import org.jetbrains.kotlin.idea.index.AbstractKotlinTypeAliasByExpansionShortNameIndexTest
|
import org.jetbrains.kotlin.idea.index.AbstractKotlinTypeAliasByExpansionShortNameIndexTest
|
||||||
import org.jetbrains.kotlin.idea.AbstractSmartSelectionTest
|
import org.jetbrains.kotlin.idea.AbstractSmartSelectionTest
|
||||||
import org.jetbrains.kotlin.idea.actions.AbstractGotoTestOrCodeActionTest
|
import org.jetbrains.kotlin.idea.actions.AbstractGotoTestOrCodeActionTest
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractIdeCompiledLightClassTest
|
import org.jetbrains.kotlin.idea.caches.resolve.*
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractIdeLightClassTest
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractMultiModuleLineMarkerTest
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractMultiPlatformHighlightingTest
|
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.*
|
import org.jetbrains.kotlin.idea.codeInsight.*
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractCodeInsightActionTest
|
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractCodeInsightActionTest
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractGenerateHashCodeAndEqualsActionTest
|
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractGenerateHashCodeAndEqualsActionTest
|
||||||
@@ -649,6 +646,10 @@ fun main(args: Array<String>) {
|
|||||||
model("multiModuleHighlighting/multiplatform/", recursive = false, extension = null)
|
model("multiModuleHighlighting/multiplatform/", recursive = false, extension = null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testClass<AbstractHierarchicalExpectActualTest> {
|
||||||
|
model("multiModuleHighlighting/hierarchicalExpectActualMatching/", recursive = false, extension = null)
|
||||||
|
}
|
||||||
|
|
||||||
testClass<AbstractQuickFixMultiModuleTest> {
|
testClass<AbstractQuickFixMultiModuleTest> {
|
||||||
model("multiModuleQuickFix", recursive = false, extension = null)
|
model("multiModuleQuickFix", recursive = false, extension = null)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,10 +41,7 @@ import org.jetbrains.kotlin.idea.AbstractExpressionSelectionTest
|
|||||||
import org.jetbrains.kotlin.idea.index.AbstractKotlinTypeAliasByExpansionShortNameIndexTest
|
import org.jetbrains.kotlin.idea.index.AbstractKotlinTypeAliasByExpansionShortNameIndexTest
|
||||||
import org.jetbrains.kotlin.idea.AbstractSmartSelectionTest
|
import org.jetbrains.kotlin.idea.AbstractSmartSelectionTest
|
||||||
import org.jetbrains.kotlin.idea.actions.AbstractGotoTestOrCodeActionTest
|
import org.jetbrains.kotlin.idea.actions.AbstractGotoTestOrCodeActionTest
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractIdeCompiledLightClassTest
|
import org.jetbrains.kotlin.idea.caches.resolve.*
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractIdeLightClassTest
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractMultiModuleLineMarkerTest
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractMultiPlatformHighlightingTest
|
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.*
|
import org.jetbrains.kotlin.idea.codeInsight.*
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractCodeInsightActionTest
|
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractCodeInsightActionTest
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractGenerateHashCodeAndEqualsActionTest
|
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractGenerateHashCodeAndEqualsActionTest
|
||||||
@@ -653,6 +650,10 @@ fun main(args: Array<String>) {
|
|||||||
model("multiModuleHighlighting/multiplatform/", recursive = false, extension = null)
|
model("multiModuleHighlighting/multiplatform/", recursive = false, extension = null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testClass<AbstractHierarchicalExpectActualTest> {
|
||||||
|
model("multiModuleHighlighting/hierarchicalExpectActualMatching/", recursive = false, extension = null)
|
||||||
|
}
|
||||||
|
|
||||||
testClass<AbstractQuickFixMultiModuleTest> {
|
testClass<AbstractQuickFixMultiModuleTest> {
|
||||||
model("multiModuleQuickFix", recursive = false, extension = null)
|
model("multiModuleQuickFix", recursive = false, extension = null)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,10 +41,7 @@ import org.jetbrains.kotlin.idea.AbstractExpressionSelectionTest
|
|||||||
import org.jetbrains.kotlin.idea.index.AbstractKotlinTypeAliasByExpansionShortNameIndexTest
|
import org.jetbrains.kotlin.idea.index.AbstractKotlinTypeAliasByExpansionShortNameIndexTest
|
||||||
import org.jetbrains.kotlin.idea.AbstractSmartSelectionTest
|
import org.jetbrains.kotlin.idea.AbstractSmartSelectionTest
|
||||||
import org.jetbrains.kotlin.idea.actions.AbstractGotoTestOrCodeActionTest
|
import org.jetbrains.kotlin.idea.actions.AbstractGotoTestOrCodeActionTest
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractIdeCompiledLightClassTest
|
import org.jetbrains.kotlin.idea.caches.resolve.*
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractIdeLightClassTest
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractMultiModuleLineMarkerTest
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.AbstractMultiPlatformHighlightingTest
|
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.*
|
import org.jetbrains.kotlin.idea.codeInsight.*
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractCodeInsightActionTest
|
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractCodeInsightActionTest
|
||||||
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractGenerateHashCodeAndEqualsActionTest
|
import org.jetbrains.kotlin.idea.codeInsight.generate.AbstractGenerateHashCodeAndEqualsActionTest
|
||||||
@@ -651,6 +648,10 @@ fun main(args: Array<String>) {
|
|||||||
model("multiModuleHighlighting/multiplatform/", recursive = false, extension = null)
|
model("multiModuleHighlighting/multiplatform/", recursive = false, extension = null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testClass<AbstractHierarchicalExpectActualTest> {
|
||||||
|
model("multiModuleHighlighting/hierarchicalExpectActualMatching/", recursive = false, extension = null)
|
||||||
|
}
|
||||||
|
|
||||||
testClass<AbstractQuickFixMultiModuleTest> {
|
testClass<AbstractQuickFixMultiModuleTest> {
|
||||||
model("multiModuleQuickFix", recursive = false, extension = null)
|
model("multiModuleQuickFix", recursive = false, extension = null)
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
actual class A
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
MODULE top { platform=[JVM, JS, Native] }
|
||||||
|
MODULE left { platform=[JVM, JS, Native] }
|
||||||
|
MODULE right { platform=[JVM, JS, Native] }
|
||||||
|
MODULE bottom { platform=[JVM] }
|
||||||
|
|
||||||
|
left -> top { kind=DEPENDS_ON }
|
||||||
|
right -> top { kind=DEPENDS_ON }
|
||||||
|
bottom -> left, right { kind=DEPENDS_ON }
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
package sample
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
package sample
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
expect class A
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
ActualizedInLeft()
|
||||||
|
ActualizedInRight()
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
MODULE top { platform=[JVM, JS, Native] }
|
||||||
|
MODULE left { platform=[JVM, JS, Native] }
|
||||||
|
MODULE right { platform=[JVM, JS, Native] }
|
||||||
|
MODULE bottom { platform=[JVM] }
|
||||||
|
|
||||||
|
left -> top { kind=DEPENDS_ON }
|
||||||
|
right -> top { kind=DEPENDS_ON }
|
||||||
|
bottom -> left, right { kind=DEPENDS_ON }
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
actual class ActualizedInLeft
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
actual class ActualizedInRight
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
expect class ActualizedInLeft
|
||||||
|
expect class ActualizedInRight
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
actual class A {
|
||||||
|
actual fun foo(): Int = 45
|
||||||
|
fun fromBottom(): Int = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
A().foo()
|
||||||
|
|
||||||
|
// Any behaviour is acceptable, as the code is erroneous.
|
||||||
|
// At the time of writing this test, we resolve to nearest A, i.e.
|
||||||
|
// 'fromBottom' is resolved, and 'fromLeft' is not.
|
||||||
|
A().<!UNRESOLVED_REFERENCE("fromLeft")!>fromLeft<!>()
|
||||||
|
A().fromBottom()
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
MODULE top { platform=[JVM, JS, Native] }
|
||||||
|
MODULE left { platform=[JVM, JS, Native] }
|
||||||
|
MODULE right { platform=[JVM, JS, Native] }
|
||||||
|
MODULE bottom { platform=[JVM] }
|
||||||
|
|
||||||
|
left -> top { kind=DEPENDS_ON }
|
||||||
|
right -> top { kind=DEPENDS_ON }
|
||||||
|
bottom -> left, right { kind=DEPENDS_ON }
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
actual class A /* Left */ {
|
||||||
|
actual fun foo(): Int = 42
|
||||||
|
fun fromLeft(): String = ""
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
package sample
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
expect class <!AMBIGUOUS_ACTUALS("Class 'A'", "bottom for JVM, left")!>A<!> {
|
||||||
|
fun <!AMBIGUOUS_ACTUALS("Function 'foo'", "bottom for JVM, left")!>foo<!>(): Int
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
A().foo()
|
||||||
|
// fromLeft should be resolved, because 'left' comes first in dependencies order!
|
||||||
|
A().fromLeft()
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
MODULE top { platform=[JVM, JS, Native] }
|
||||||
|
MODULE left { platform=[JVM, JS, Native] }
|
||||||
|
MODULE right { platform=[JVM, JS, Native] }
|
||||||
|
MODULE bottom { platform=[JVM] }
|
||||||
|
|
||||||
|
left -> top { kind=DEPENDS_ON }
|
||||||
|
right -> top { kind=DEPENDS_ON }
|
||||||
|
bottom -> left, right { kind=DEPENDS_ON }
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
actual class A /* Left */ {
|
||||||
|
actual fun foo(): Int = 42
|
||||||
|
fun fromLeft(): String = ""
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
actual class A /* Right */ {
|
||||||
|
actual fun foo(): Int = 100500
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
expect class A {
|
||||||
|
fun foo(): Int
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
expect class A
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
actual class A
|
||||||
|
|
||||||
|
// Error: ACTUAL_WITHOUT_EXPECT, becuase we shouldn't see expects through usual dependencies
|
||||||
|
actual class <!ACTUAL_WITHOUT_EXPECT("Actual class 'B'", "")!>B<!>
|
||||||
|
|
||||||
|
// OK: though we can't actualize B, we can see it and use it.
|
||||||
|
fun useB(<!UNUSED_PARAMETER("b")!>b<!>: B) {
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
actual class A
|
||||||
|
|
||||||
|
// Error: ACTUAL_WITHOUT_EXPECT, becuase we shouldn't see expects through usual dependencies
|
||||||
|
actual class <!ACTUAL_WITHOUT_EXPECT("Actual class 'B'", "")!>B<!>
|
||||||
|
|
||||||
|
// OK: though we can't actualize B, we can see it and use it.
|
||||||
|
fun useB(<!UNUSED_PARAMETER("b")!>b<!>: B) {
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
expect class <!NO_ACTUAL_FOR_EXPECT("class 'B'", "b-common", "")!>B<!>
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
MODULE a-common { platform=[JVM, JS, Native] }
|
||||||
|
MODULE a-js { platform=[JS] }
|
||||||
|
MODULE a-jvm { platform=[JVM] }
|
||||||
|
MODULE b-common { platform=[JVM, JS, Native] }
|
||||||
|
|
||||||
|
a-js -> a-common { kind=DEPENDS_ON }
|
||||||
|
a-jvm -> a-common { kind=DEPENDS_ON }
|
||||||
|
|
||||||
|
a-common -> b-common { kind=DEPENDENCY }
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
actual class A
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
MODULE top { platform=[JVM, JS, Native] }
|
||||||
|
MODULE middle { platform=[JVM, JS] }
|
||||||
|
MODULE bottom { platform=[JVM] }
|
||||||
|
|
||||||
|
middle -> top { kind=DEPENDS_ON }
|
||||||
|
bottom -> middle { kind=DEPENDS_ON }
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
actual class A
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
expect class <!AMBIGUOUS_ACTUALS("Class 'A'", "bottom for JVM, middle")!>A<!>
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
class <!ACTUAL_MISSING!>ActualInMiddleCompatibleInBottom<!>
|
||||||
|
actual class CompatibleInMiddleActualInBottom
|
||||||
|
|
||||||
|
class <!ACTUAL_MISSING!>CompatibleInMiddleAndBottom<!>
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
MODULE top { platform=[JVM, JS, Native] }
|
||||||
|
MODULE middle { platform=[JVM, JS] }
|
||||||
|
MODULE bottom { platform=[JVM] }
|
||||||
|
|
||||||
|
middle -> top { kind=DEPENDS_ON }
|
||||||
|
bottom -> middle { kind=DEPENDS_ON }
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
actual class ActualInMiddleCompatibleInBottom
|
||||||
|
class <!ACTUAL_MISSING!>CompatibleInMiddleActualInBottom<!>
|
||||||
|
|
||||||
|
class <!ACTUAL_MISSING!>CompatibleInMiddleAndBottom<!>
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
expect class <!AMBIGUOUS_ACTUALS("Class 'ActualInMiddleCompatibleInBottom'", "bottom for JVM, middle")!>ActualInMiddleCompatibleInBottom<!>
|
||||||
|
expect class <!AMBIGUOUS_ACTUALS("Class 'CompatibleInMiddleActualInBottom'", "bottom for JVM, middle")!>CompatibleInMiddleActualInBottom<!>
|
||||||
|
|
||||||
|
expect class <!AMBIGUOUS_ACTUALS("Class 'CompatibleInMiddleAndBottom'", "bottom for JVM, middle")!>CompatibleInMiddleAndBottom<!>
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
<!ACTUAL_WITHOUT_EXPECT("Class 'A'", " The following declaration is incompatible because visibility is different: public final expect class A ")!>private<!> class A
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
MODULE top { platform=[JVM, JS, Native] }
|
||||||
|
MODULE middle { platform=[JVM, JS] }
|
||||||
|
MODULE bottom { platform=[JVM] }
|
||||||
|
|
||||||
|
middle -> top { kind=DEPENDS_ON }
|
||||||
|
bottom -> middle { kind=DEPENDS_ON }
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
actual class A
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
expect class <!AMBIGUOUS_ACTUALS("Class 'A'", "middle, bottom for JVM")!>A<!>
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
actual fun foo<!ACTUAL_WITHOUT_EXPECT("Actual function 'foo'", " The following declaration is incompatible because number of value parameters is different: public expect fun foo(): Int ")!>(x: Int)<!>: Int = x
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
MODULE top { platform=[JVM, JS, Native] }
|
||||||
|
MODULE middle { platform=[JVM, JS] }
|
||||||
|
MODULE bottom { platform=[JVM] }
|
||||||
|
|
||||||
|
middle -> top { kind=DEPENDS_ON }
|
||||||
|
bottom -> middle { kind=DEPENDS_ON }
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
actual fun foo(): Int = 42
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
expect fun foo(): Int
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
actual class <!AMBIGUOUS_EXPECTS("Actual class 'A'", "right, left")!>A<!>
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
MODULE right { platform=[JVM, Native] }
|
||||||
|
MODULE left { platform=[JVM, JS] }
|
||||||
|
MODULE bottom { platform=[JVM] }
|
||||||
|
|
||||||
|
bottom -> right { kind=DEPENDS_ON }
|
||||||
|
bottom -> left { kind=DEPENDS_ON }
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
expect class A
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
expect class A
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
// Note that here we have no ambiguity, becuase we don't consider
|
||||||
|
// declarations without 'expect' as potential weakly-compatible 'expect'-counterpart
|
||||||
|
actual class A
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
MODULE right { platform=[JVM, Native] }
|
||||||
|
MODULE left { platform=[JVM, JS] }
|
||||||
|
MODULE bottom { platform=[JVM] }
|
||||||
|
|
||||||
|
bottom -> right { kind=DEPENDS_ON }
|
||||||
|
bottom -> left { kind=DEPENDS_ON }
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
expect class <!AMBIGUOUS_ACTUALS("Class 'A'", "bottom.kt, right.kt")!>A<!>
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class A
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
actual fun foo(): Int = 42
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
MODULE right { platform=[JVM, Native] }
|
||||||
|
MODULE left { platform=[JVM, JS] }
|
||||||
|
MODULE bottom { platform=[JVM] }
|
||||||
|
|
||||||
|
bottom -> right { kind=DEPENDS_ON }
|
||||||
|
bottom -> left { kind=DEPENDS_ON }
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
expect fun foo(): Int
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
expect fun foo<!NO_ACTUAL_FOR_EXPECT("function 'foo'", "bottom for JVM", " The following declaration is incompatible because number of value parameters is different: public actual fun foo(): Int ")!>(x: Int)<!>: Int
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
expect class ExpectInCommonActualInMiddle
|
||||||
|
expect class ExpectInCommonActualInPlatforms
|
||||||
|
|
||||||
|
expect class <!NO_ACTUAL_FOR_EXPECT("class 'ExpectInCommonWithoutActual'", "js for JS", ""), NO_ACTUAL_FOR_EXPECT("class 'ExpectInCommonWithoutActual'", "jvm for JVM", "")!>ExpectInCommonWithoutActual<!>
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
MODULE common { platform=[JVM, JS, Native] }
|
||||||
|
MODULE jvmAndJs { platform=[JVM, JS] }
|
||||||
|
MODULE jvm { platform=[JVM] }
|
||||||
|
MODULE js { platform=[JS] }
|
||||||
|
|
||||||
|
jvm -> jvmAndJs { kind=DEPENDS_ON }
|
||||||
|
js -> jvmAndJs { kind=DEPENDS_ON }
|
||||||
|
jvmAndJs -> common { kind=DEPENDS_ON }
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
actual class ExpectInCommonActualInPlatforms
|
||||||
|
|
||||||
|
actual class ExpectInMiddleActualInPlatforms
|
||||||
|
|
||||||
|
expect class <!NO_ACTUAL_FOR_EXPECT("class 'ExpectInJsWithoutActual'", "js for JS", "")!>ExpectInJsWithoutActual<!>
|
||||||
|
|
||||||
|
expect class ExpectInJsActualInJs
|
||||||
|
actual class ExpectInJsActualInJs
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
actual class ExpectInCommonActualInPlatforms
|
||||||
|
actual class ExpectInMiddleActualInPlatforms
|
||||||
|
|
||||||
|
expect class <!NO_ACTUAL_FOR_EXPECT("class 'ExpectInJvmWithoutActual'", "jvm for JVM", "")!>ExpectInJvmWithoutActual<!>
|
||||||
|
|
||||||
|
expect class ExpectInJvmActualInJvm
|
||||||
|
actual class ExpectInJvmActualInJvm
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
actual class ExpectInCommonActualInMiddle
|
||||||
|
|
||||||
|
expect class ExpectInMiddleActualInPlatforms
|
||||||
|
|
||||||
|
expect class <!NO_ACTUAL_FOR_EXPECT("class 'ExpectInMiddleWithoutActual'", "js for JS", ""), NO_ACTUAL_FOR_EXPECT("class 'ExpectInMiddleWithoutActual'", "jvm for JVM", "")!>ExpectInMiddleWithoutActual<!>
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
expect class <!NO_ACTUAL_FOR_EXPECT("class 'ExpectInCommonActualInJsOnly'", "jvm for JVM", "")!>ExpectInCommonActualInJsOnly<!>
|
||||||
|
expect class <!NO_ACTUAL_FOR_EXPECT("class 'ExpectInCommonActualInJvmOnly'", "js for JS", "")!>ExpectInCommonActualInJvmOnly<!>
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
MODULE common { platform=[JVM, JS, Native] }
|
||||||
|
MODULE jvmAndJs { platform=[JVM, JS] }
|
||||||
|
MODULE jvm { platform=[JVM] }
|
||||||
|
MODULE js { platform=[JS] }
|
||||||
|
|
||||||
|
jvm -> jvmAndJs { kind=DEPENDS_ON }
|
||||||
|
js -> jvmAndJs { kind=DEPENDS_ON }
|
||||||
|
jvmAndJs -> common { kind=DEPENDS_ON }
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
actual class ExpectInCommonActualInJsOnly
|
||||||
|
actual class ExpectInMiddleActualInJsOnly
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
actual class ExpectInCommonActualInJvmOnly
|
||||||
|
actual class ExpectInMiddleActualInJvmOnly
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
expect class <!NO_ACTUAL_FOR_EXPECT("class 'ExpectInMiddleActualInJsOnly'", "jvm for JVM", "")!>ExpectInMiddleActualInJsOnly<!>
|
||||||
|
expect class <!NO_ACTUAL_FOR_EXPECT("class 'ExpectInMiddleActualInJvmOnly'", "js for JS", "")!>ExpectInMiddleActualInJvmOnly<!>
|
||||||
+91
@@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. 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.idea.caches.resolve
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiFile
|
||||||
|
import com.intellij.util.io.exists
|
||||||
|
import org.jetbrains.kotlin.checkers.utils.CheckerTestUtil
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||||
|
import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromTextFile
|
||||||
|
import org.jetbrains.kotlin.idea.project.platform
|
||||||
|
import org.jetbrains.kotlin.idea.resolve.frontendService
|
||||||
|
import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest
|
||||||
|
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
||||||
|
import org.jetbrains.kotlin.idea.test.allKotlinFiles
|
||||||
|
import org.jetbrains.kotlin.idea.util.module
|
||||||
|
import org.jetbrains.kotlin.idea.util.sourceRoots
|
||||||
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||||
|
import java.io.File
|
||||||
|
import java.nio.file.Paths
|
||||||
|
|
||||||
|
abstract class AbstractMultiModuleIdeResolveTest : AbstractMultiModuleTest() {
|
||||||
|
fun doTest(testDataPath: String) {
|
||||||
|
val testRoot = File(testDataPath)
|
||||||
|
|
||||||
|
val dependenciesTxt = File(testDataPath, "dependencies.txt")
|
||||||
|
require(dependenciesTxt.exists()) {
|
||||||
|
"${dependenciesTxt.absolutePath} does not exist. dependencies.txt is required"
|
||||||
|
}
|
||||||
|
|
||||||
|
// This will implicitly copy all source files to temporary directory, clearing them from diagnostic markup in process
|
||||||
|
setupMppProjectFromTextFile(testRoot)
|
||||||
|
|
||||||
|
for (tempFile in project.allKotlinFiles()) {
|
||||||
|
checkFile(tempFile, tempFile.findCorrespondingFileInTestDir(testRoot))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun KtFile.findCorrespondingFileInTestDir(testDir: File): File {
|
||||||
|
val tempRootPath = Paths.get(this.module!!.sourceRoots.single().path)
|
||||||
|
val tempProjectDirPath = tempRootPath.parent
|
||||||
|
val tempSourcePath = Paths.get(this.virtualFilePath)
|
||||||
|
|
||||||
|
val relativeToProjectRootPath = tempProjectDirPath.relativize(tempSourcePath)
|
||||||
|
|
||||||
|
val testSourcesProjectDirPath = testDir.toPath()
|
||||||
|
val testSourcePath = testSourcesProjectDirPath.resolve(relativeToProjectRootPath)
|
||||||
|
|
||||||
|
require(testSourcePath.exists()) {
|
||||||
|
"Can't find file in testdata for copied file $this: checked at path ${testSourcePath.toAbsolutePath()}"
|
||||||
|
}
|
||||||
|
|
||||||
|
return testSourcePath.toFile()
|
||||||
|
}
|
||||||
|
|
||||||
|
protected open fun checkFile(file: KtFile, expectedFile: File) {
|
||||||
|
val resolutionFacade = file.getResolutionFacade()
|
||||||
|
val (bindingContext, moduleDescriptor) = resolutionFacade.analyzeWithAllCompilerChecks(listOf(file))
|
||||||
|
|
||||||
|
val actualDiagnostics = CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(
|
||||||
|
bindingContext,
|
||||||
|
file,
|
||||||
|
markDynamicCalls = false,
|
||||||
|
dynamicCallDescriptors = mutableListOf(),
|
||||||
|
platform = null, // we don't need to attach platform-description string to diagnostic here
|
||||||
|
withNewInference = false,
|
||||||
|
languageVersionSettings = resolutionFacade.frontendService(),
|
||||||
|
dataFlowValueFactory = resolutionFacade.frontendService(),
|
||||||
|
moduleDescriptor = moduleDescriptor as ModuleDescriptorImpl
|
||||||
|
)
|
||||||
|
|
||||||
|
val actualTextWithDiagnostics = CheckerTestUtil.addDiagnosticMarkersToText(
|
||||||
|
file,
|
||||||
|
actualDiagnostics,
|
||||||
|
diagnosticToExpectedDiagnostic = emptyMap(),
|
||||||
|
getFileText = { it.text },
|
||||||
|
uncheckedDiagnostics = emptyList(),
|
||||||
|
withNewInferenceDirective = false,
|
||||||
|
renderDiagnosticMessages = true
|
||||||
|
).toString()
|
||||||
|
|
||||||
|
KotlinTestUtils.assertEqualsToFile(expectedFile, actualTextWithDiagnostics)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class AbstractHierarchicalExpectActualTest : AbstractMultiModuleIdeResolveTest() {
|
||||||
|
override fun getTestDataPath(): String = "${PluginTestCaseBase.getTestDataPathBase()}/hierarchicalExpectActual"
|
||||||
|
}
|
||||||
Generated
+96
@@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. 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.idea.caches.resolve;
|
||||||
|
|
||||||
|
import com.intellij.testFramework.TestDataPath;
|
||||||
|
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
|
||||||
|
import org.jetbrains.kotlin.test.KotlinTestUtils;
|
||||||
|
import org.jetbrains.kotlin.test.TargetBackend;
|
||||||
|
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.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
|
||||||
|
@SuppressWarnings("all")
|
||||||
|
@TestMetadata("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public class HierarchicalExpectActualTestGenerated extends AbstractHierarchicalExpectActualTest {
|
||||||
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
|
KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAllFilesPresentInHierarchicalExpectActualMatching() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching"), Pattern.compile("^([^\\.]+)$"), TargetBackend.ANY, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("diamondActualOnOnePath")
|
||||||
|
public void testDiamondActualOnOnePath() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching/diamondActualOnOnePath/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("diamondDuplicateActuals")
|
||||||
|
public void testDiamondDuplicateActuals() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching/diamondDuplicateActuals/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("diamondSeesTwoActuals")
|
||||||
|
public void testDiamondSeesTwoActuals() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching/diamondSeesTwoActuals/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("differentKindsOfDependencies")
|
||||||
|
public void testDifferentKindsOfDependencies() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching/differentKindsOfDependencies/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("duplicateActualsExplicit")
|
||||||
|
public void testDuplicateActualsExplicit() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching/duplicateActualsExplicit/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("duplicateActualsImplicit")
|
||||||
|
public void testDuplicateActualsImplicit() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching/duplicateActualsImplicit/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("duplicateActualsOneWeaklyIncompatible")
|
||||||
|
public void testDuplicateActualsOneWeaklyIncompatible() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching/duplicateActualsOneWeaklyIncompatible/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("duplicateActualsOneWithStrongIncompatibility")
|
||||||
|
public void testDuplicateActualsOneWithStrongIncompatibility() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching/duplicateActualsOneWithStrongIncompatibility/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("duplicateExpectsExplicit")
|
||||||
|
public void testDuplicateExpectsExplicit() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching/duplicateExpectsExplicit/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("duplicateExpectsImplicit")
|
||||||
|
public void testDuplicateExpectsImplicit() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching/duplicateExpectsImplicit/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("duplicateExpectsWithStrongIncompatibility")
|
||||||
|
public void testDuplicateExpectsWithStrongIncompatibility() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching/duplicateExpectsWithStrongIncompatibility/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("hierarcicalActualization")
|
||||||
|
public void testHierarcicalActualization() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching/hierarcicalActualization/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("incompleteActualization")
|
||||||
|
public void testIncompleteActualization() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleHighlighting/hierarchicalExpectActualMatching/incompleteActualization/");
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user