[FIR] Only mark declaration name with ACTUAL_WITHOUT_EXPECT

#KT-58827 Fixed
This commit is contained in:
Kirill Rakhman
2023-06-21 17:13:00 +02:00
committed by Space Team
parent 3e6175fe30
commit c95a9ff55e
31 changed files with 130 additions and 105 deletions
@@ -1146,7 +1146,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
parameter<Map<ExpectActualCompatibility<Symbol>, Collection<Symbol>>>("compatibility")
}
val ACTUAL_WITHOUT_EXPECT by error<KtNamedDeclaration> {
val ACTUAL_WITHOUT_EXPECT by error<KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME_ONLY) {
parameter<Symbol>("declaration")
parameter<Map<ExpectActualCompatibility<Symbol>, Collection<Symbol>>>("compatibility")
}
@@ -45,6 +45,7 @@ enum class PositioningStrategy(private val strategy: String? = null) {
VAL_OR_VAR_NODE,
SECONDARY_CONSTRUCTOR_DELEGATION_CALL,
DECLARATION_NAME,
DECLARATION_NAME_ONLY,
DECLARATION_SIGNATURE,
DECLARATION_SIGNATURE_OR_DEFAULT,
VISIBILITY_MODIFIER,
@@ -616,7 +616,7 @@ object FirErrors {
val ACTUAL_ANNOTATION_CONFLICTING_DEFAULT_ARGUMENT_VALUE by error1<PsiElement, FirVariableSymbol<*>>()
val EXPECTED_FUNCTION_SOURCE_WITH_DEFAULT_ARGUMENTS_NOT_FOUND by error0<PsiElement>()
val NO_ACTUAL_FOR_EXPECT by error3<KtNamedDeclaration, FirBasedSymbol<*>, FirModuleData, Map<ExpectActualCompatibility<FirBasedSymbol<*>>, Collection<FirBasedSymbol<*>>>>(SourceElementPositioningStrategies.INCOMPATIBLE_DECLARATION)
val ACTUAL_WITHOUT_EXPECT by error2<KtNamedDeclaration, FirBasedSymbol<*>, Map<ExpectActualCompatibility<FirBasedSymbol<*>>, Collection<FirBasedSymbol<*>>>>()
val ACTUAL_WITHOUT_EXPECT by error2<KtNamedDeclaration, FirBasedSymbol<*>, Map<ExpectActualCompatibility<FirBasedSymbol<*>>, Collection<FirBasedSymbol<*>>>>(SourceElementPositioningStrategies.DECLARATION_NAME_ONLY)
val AMBIGUOUS_ACTUALS by error2<KtNamedDeclaration, FirBasedSymbol<*>, Collection<FirBasedSymbol<*>>>(SourceElementPositioningStrategies.INCOMPATIBLE_DECLARATION)
val AMBIGUOUS_EXPECTS by error2<KtNamedDeclaration, FirBasedSymbol<*>, Collection<FirModuleData>>(SourceElementPositioningStrategies.INCOMPATIBLE_DECLARATION)
val NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS by error2<KtNamedDeclaration, FirBasedSymbol<*>, List<Pair<FirBasedSymbol<*>, Map<Incompatible<FirBasedSymbol<*>>, Collection<FirBasedSymbol<*>>>>>>(SourceElementPositioningStrategies.ACTUAL_DECLARATION_NAME)
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.diagnostics
import com.intellij.lang.LighterASTNode
import com.intellij.openapi.util.Ref
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElement
import com.intellij.psi.tree.IElementType
import com.intellij.psi.tree.TokenSet
import com.intellij.util.diff.FlyweightCapableTreeStructure
@@ -18,7 +17,6 @@ import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.psi.KtParameter.VAL_VAR_TOKEN_SET
import org.jetbrains.kotlin.psi.psiUtil.allChildren
import org.jetbrains.kotlin.psi.stubs.elements.KtConstantExpressionElementType
import org.jetbrains.kotlin.psi.stubs.elements.KtStringTemplateExpressionElementType
import org.jetbrains.kotlin.psi.stubs.elements.KtTokenSets
@@ -189,7 +187,7 @@ object LightTreePositioningStrategies {
}
}
val DECLARATION_NAME: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
private open class BaseDeclarationNameStrategy : LightTreePositioningStrategy() {
override fun mark(
node: LighterASTNode,
startOffset: Int,
@@ -198,15 +196,7 @@ object LightTreePositioningStrategies {
): List<TextRange> {
val nameIdentifier = tree.nameIdentifier(node)
if (nameIdentifier != null) {
if (node.tokenType == KtNodeTypes.CLASS || node.tokenType == KtNodeTypes.OBJECT_DECLARATION) {
val startElement =
tree.modifierList(node)?.let { modifierList -> tree.findChildByType(modifierList, KtTokens.ENUM_KEYWORD) }
?: tree.findChildByType(node, TokenSet.create(KtTokens.CLASS_KEYWORD, KtTokens.OBJECT_KEYWORD))
?: node
return markRange(startElement, nameIdentifier, startOffset, endOffset, tree, node)
}
return markElement(nameIdentifier, startOffset, endOffset, tree, node)
return markNameIdentifier(nameIdentifier, startOffset, endOffset, tree, node)
}
if (node.tokenType == KtNodeTypes.FUN) {
return DECLARATION_SIGNATURE.mark(node, startOffset, endOffset, tree)
@@ -214,6 +204,36 @@ object LightTreePositioningStrategies {
return DEFAULT.mark(node, startOffset, endOffset, tree)
}
protected open fun markNameIdentifier(
nameIdentifier: LighterASTNode,
startOffset: Int,
endOffset: Int,
tree: FlyweightCapableTreeStructure<LighterASTNode>,
node: LighterASTNode,
): List<TextRange> {
return markElement(nameIdentifier, startOffset, endOffset, tree, node)
}
}
val DECLARATION_NAME: LightTreePositioningStrategy = object : BaseDeclarationNameStrategy() {
override fun markNameIdentifier(
nameIdentifier: LighterASTNode,
startOffset: Int,
endOffset: Int,
tree: FlyweightCapableTreeStructure<LighterASTNode>,
node: LighterASTNode,
): List<TextRange> {
if (node.tokenType == KtNodeTypes.CLASS || node.tokenType == KtNodeTypes.OBJECT_DECLARATION) {
val startElement =
tree.modifierList(node)?.let { modifierList -> tree.findChildByType(modifierList, KtTokens.ENUM_KEYWORD) }
?: tree.findChildByType(node, TokenSet.create(KtTokens.CLASS_KEYWORD, KtTokens.OBJECT_KEYWORD))
?: node
return markRange(startElement, nameIdentifier, startOffset, endOffset, tree, node)
}
return markElement(nameIdentifier, startOffset, endOffset, tree, node)
}
override fun isValid(node: LighterASTNode, tree: FlyweightCapableTreeStructure<LighterASTNode>): Boolean {
//in FE 1.0 this is part of DeclarationHeader abstract strategy
if (node.tokenType != KtNodeTypes.OBJECT_DECLARATION
@@ -229,6 +249,8 @@ object LightTreePositioningStrategies {
}
}
val DECLARATION_NAME_ONLY: LightTreePositioningStrategy = BaseDeclarationNameStrategy()
val ACTUAL_DECLARATION_NAME: LightTreePositioningStrategy = object : LightTreePositioningStrategy() {
override fun mark(
node: LighterASTNode,
@@ -161,6 +161,20 @@ object PositioningStrategies {
}
}
@JvmField
val DECLARATION_NAME_ONLY: PositioningStrategy<KtNamedDeclaration> = object : DeclarationHeader<KtNamedDeclaration>() {
override fun mark(element: KtNamedDeclaration): List<TextRange> {
val nameIdentifier = element.nameIdentifier
if (nameIdentifier != null) {
return markElement(nameIdentifier)
}
if (element is KtNamedFunction) {
return DECLARATION_SIGNATURE.mark(element)
}
return DEFAULT.mark(element)
}
}
@JvmField
val DECLARATION_SIGNATURE: PositioningStrategy<KtDeclaration> = object : DeclarationHeader<KtDeclaration>() {
override fun mark(element: KtDeclaration): List<TextRange> {
@@ -43,6 +43,11 @@ object SourceElementPositioningStrategies {
PositioningStrategies.DECLARATION_NAME
)
val DECLARATION_NAME_ONLY = SourceElementPositioningStrategy(
LightTreePositioningStrategies.DECLARATION_NAME_ONLY,
PositioningStrategies.DECLARATION_NAME_ONLY
)
val DECLARATION_SIGNATURE = SourceElementPositioningStrategy(
LightTreePositioningStrategies.DECLARATION_SIGNATURE,
PositioningStrategies.DECLARATION_SIGNATURE
@@ -10,4 +10,4 @@ expect class Counter {
operator fun dec(): Counter
}
<!ACTUAL_WITHOUT_EXPECT!>actual typealias Counter = Int<!>
actual typealias <!ACTUAL_WITHOUT_EXPECT!>Counter<!> = Int
@@ -15,10 +15,10 @@
// FILE: jvm.kt
actual interface My {
actual fun openFunPositive() = Unit
<!ACTUAL_WITHOUT_EXPECT!>actual fun openFunNegative()<!>
actual fun <!ACTUAL_WITHOUT_EXPECT!>openFunNegative<!>()
actual fun abstractFun()
actual val openValPositive: Int get() = 0
<!ACTUAL_WITHOUT_EXPECT!>actual val openValNegative: Int<!>
actual val <!ACTUAL_WITHOUT_EXPECT!>openValNegative<!>: Int
actual val abstractVal: Int
}
@@ -2,7 +2,7 @@
// FILE: common.kt
expect class Foo {
<!ACTUAL_WITHOUT_EXPECT!>actual fun bar()<!>
actual fun <!ACTUAL_WITHOUT_EXPECT!>bar<!>()
}
// MODULE: m1-jvm()()(m1-common)
@@ -22,7 +22,7 @@ fun foo1(x: String) {}
fun foo2(x: Int, y: Int) {}
fun foo2(x: String) {}
<!ACTUAL_WITHOUT_EXPECT!>actual fun foo3(): String = ""<!>
actual fun <!ACTUAL_WITHOUT_EXPECT!>foo3<!>(): String = ""
fun foo4(x: Int): String = ""
actual class NoArgConstructor {
@@ -16,12 +16,12 @@ expect open class Foo3
// FILE: jvm.kt
interface Foo1
<!ACTUAL_WITHOUT_EXPECT!>actual interface Foo2<!>
actual interface <!ACTUAL_WITHOUT_EXPECT!>Foo2<!>
<!ACTUAL_WITHOUT_EXPECT!>actual var s: String = "value"<!>
actual var <!ACTUAL_WITHOUT_EXPECT!>s<!>: String = "value"
fun foo2(): Int = 0
<!ACTUAL_WITHOUT_EXPECT!>actual class <!PACKAGE_OR_CLASSIFIER_REDECLARATION!>Foo3<!><!>
actual class <!ACTUAL_WITHOUT_EXPECT, PACKAGE_OR_CLASSIFIER_REDECLARATION!>Foo3<!>
class <!PACKAGE_OR_CLASSIFIER_REDECLARATION!>Foo3<!>
@@ -42,9 +42,9 @@ actual fun interface F1 {
actual fun run()
}
<!ACTUAL_WITHOUT_EXPECT!>actual interface F2 {
actual interface <!ACTUAL_WITHOUT_EXPECT!>F2<!> {
actual fun run()
}<!>
}
actual typealias F3 = java.lang.Runnable
@@ -62,6 +62,6 @@ interface F6Typealias {
fun run()
}
<!ACTUAL_WITHOUT_EXPECT!>actual typealias F6 = F6Typealias<!>
actual typealias <!ACTUAL_WITHOUT_EXPECT!>F6<!> = F6Typealias
<!ACTUAL_WITHOUT_EXPECT!>actual typealias F7 = NotSam<!>
actual typealias <!ACTUAL_WITHOUT_EXPECT!>F7<!> = NotSam
@@ -30,9 +30,9 @@ actual open class Container {
actual fun protectedFun1() {} // OK: protected -> public
actual protected fun protectedFun2() {} // OK: protected -> protected
<!ACTUAL_WITHOUT_EXPECT!>actual internal fun protectedFun3() {}<!> // BAD: protected -> internal
<!ACTUAL_WITHOUT_EXPECT!>actual protected fun internalFun3() {}<!> // BAD: internal -> protected
actual internal fun <!ACTUAL_WITHOUT_EXPECT!>protectedFun3<!>() {} // BAD: protected -> internal
actual protected fun <!ACTUAL_WITHOUT_EXPECT!>internalFun3<!>() {} // BAD: internal -> protected
<!ACTUAL_WITHOUT_EXPECT!>actual open fun openInternalFun() {}<!> // BAD: internal+open -> public
<!ACTUAL_WITHOUT_EXPECT!>actual internal fun openPublicFun() {}<!> // BAD: open+public -> internal
actual open fun <!ACTUAL_WITHOUT_EXPECT!>openInternalFun<!>() {} // BAD: internal+open -> public
actual internal fun <!ACTUAL_WITHOUT_EXPECT!>openPublicFun<!>() {} // BAD: open+public -> internal
}
@@ -13,7 +13,7 @@ expect class Foo : I, C, J
// FILE: jvm.kt
actual class Foo : I, C(), J
<!ACTUAL_WITHOUT_EXPECT!>actual class Bar<!>
actual class <!ACTUAL_WITHOUT_EXPECT!>Bar<!>
// MODULE: m3-js()()(m1-common)
// FILE: js.kt
@@ -1,5 +0,0 @@
// MODULE: common
// TARGET_PLATFORM: Common
// MODULE: main()()(common)
<!ACTUAL_WITHOUT_EXPECT!>actual class A<!>
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: common
// TARGET_PLATFORM: Common
@@ -34,7 +34,7 @@ interface KotlinXStringDemoInterface {
// FILE: StringDemoInterface.kt
actual typealias StringDemoInterface = KotlinXStringDemoInterface
<!ACTUAL_WITHOUT_EXPECT("actual fun StringDemoInterface.plusK(): <ERROR TYPE REF: Unresolved name: value>; The following declaration is incompatible: expect fun StringDemoInterface.plusK(): String")!>actual fun StringDemoIn<!INCOMPATIBLE_MATCHING!>terface.plusK() = <!EXPECT_CLASS_AS_FUNCTION!>StringValue<!>(value).plus("K")<!>.<!UNRESOLVED_REFERENCE!>value<!><!>
actual fun StringDemoIn<!INCOMPATIBLE_MATCHING!>terface.<!ACTUAL_WITHOUT_EXPECT("actual fun StringDemoInterface.plusK(): <ERROR TYPE REF: Unresolved name: value>; The following declaration is incompatible: expect fun StringDemoInterface.plusK(): String")!>plusK<!>() = <!EXPECT_CLASS_AS_FUNCTION!>StringValue<!>(value).plus("K")<!>.<!UNRESOLVED_REFERENCE!>value<!>
// FILE: main.kt
class StringDemo(override val value: String) : StringDemoInterface
@@ -8,19 +8,19 @@
class Nested
inner class Inner
}<!>
<!ACTUAL_WITHOUT_EXPECT!>actual class CommonClass {
<!ACTUAL_WITHOUT_EXPECT!>actual fun memberFun() {}<!>
<!ACTUAL_WITHOUT_EXPECT!>actual val memberProp: Int = 42<!>
<!ACTUAL_WITHOUT_EXPECT!>actual class Nested<!>
<!ACTUAL_WITHOUT_EXPECT!>actual inner class Inner<!>
}<!>
actual class <!ACTUAL_WITHOUT_EXPECT!>CommonClass<!> {
actual fun <!ACTUAL_WITHOUT_EXPECT!>memberFun<!>() {}
actual val <!ACTUAL_WITHOUT_EXPECT!>memberProp<!>: Int = 42
actual class <!ACTUAL_WITHOUT_EXPECT!>Nested<!>
actual inner class <!ACTUAL_WITHOUT_EXPECT!>Inner<!>
}
<!NO_ACTUAL_FOR_EXPECT{JVM}!>expect fun commonFun()<!>
<!ACTUAL_WITHOUT_EXPECT!>actual fun commonFun() {}<!>
actual fun <!ACTUAL_WITHOUT_EXPECT!>commonFun<!>() {}
<!NO_ACTUAL_FOR_EXPECT{JVM}!>expect val commonProperty: String<!>
<!ACTUAL_WITHOUT_EXPECT!>actual val commonProperty: String
get() = "hello"<!>
actual val <!ACTUAL_WITHOUT_EXPECT!>commonProperty<!>: String
get() = "hello"
// MODULE: intermediate()()(common)
// TARGET_PLATFORM: Common
@@ -31,19 +31,19 @@ expect class IntermediateClass {
class Nested
inner class Inner
}
<!ACTUAL_WITHOUT_EXPECT!>actual class IntermediateClass {
<!ACTUAL_WITHOUT_EXPECT!>actual fun memberFun() {}<!>
<!ACTUAL_WITHOUT_EXPECT!>actual val memberProp: Int = 42<!>
<!ACTUAL_WITHOUT_EXPECT!>actual class Nested<!>
<!ACTUAL_WITHOUT_EXPECT!>actual inner class Inner<!>
}<!>
actual class <!ACTUAL_WITHOUT_EXPECT!>IntermediateClass<!> {
actual fun <!ACTUAL_WITHOUT_EXPECT!>memberFun<!>() {}
actual val <!ACTUAL_WITHOUT_EXPECT!>memberProp<!>: Int = 42
actual class <!ACTUAL_WITHOUT_EXPECT!>Nested<!>
actual inner class <!ACTUAL_WITHOUT_EXPECT!>Inner<!>
}
expect fun intermediateFun()
<!ACTUAL_WITHOUT_EXPECT!>actual fun intermediateFun() {}<!>
actual fun <!ACTUAL_WITHOUT_EXPECT!>intermediateFun<!>() {}
expect val intermediateProperty: String
<!ACTUAL_WITHOUT_EXPECT!>actual val intermediateProperty: String
get() = "hello"<!>
actual val <!ACTUAL_WITHOUT_EXPECT!>intermediateProperty<!>: String
get() = "hello"
// MODULE: main()()(intermediate)
@@ -53,16 +53,16 @@ expect class PlatformClass {
class Nested
inner class Inner
}
<!ACTUAL_WITHOUT_EXPECT!>actual class PlatformClass {
<!ACTUAL_WITHOUT_EXPECT!>actual fun memberFun() {}<!>
<!ACTUAL_WITHOUT_EXPECT!>actual val memberProp: Int = 42<!>
<!ACTUAL_WITHOUT_EXPECT!>actual class Nested<!>
<!ACTUAL_WITHOUT_EXPECT!>actual inner class Inner<!>
}<!>
actual class <!ACTUAL_WITHOUT_EXPECT!>PlatformClass<!> {
actual fun <!ACTUAL_WITHOUT_EXPECT!>memberFun<!>() {}
actual val <!ACTUAL_WITHOUT_EXPECT!>memberProp<!>: Int = 42
actual class <!ACTUAL_WITHOUT_EXPECT!>Nested<!>
actual inner class <!ACTUAL_WITHOUT_EXPECT!>Inner<!>
}
expect fun platformFun()
<!ACTUAL_WITHOUT_EXPECT!>actual fun platformFun() {}<!>
actual fun <!ACTUAL_WITHOUT_EXPECT!>platformFun<!>() {}
expect val platformProperty: String
<!ACTUAL_WITHOUT_EXPECT!>actual val platformProperty: String
get() = "hello"<!>
actual val <!ACTUAL_WITHOUT_EXPECT!>platformProperty<!>: String
get() = "hello"
@@ -5,7 +5,7 @@ expect fun parameterCount()
fun parameterCount(p: String) {}
<!NO_ACTUAL_FOR_EXPECT{JVM}!>expect fun parameterCount2()<!>
<!ACTUAL_WITHOUT_EXPECT!>actual fun parameterCount2(p: String) {}<!>
actual fun <!ACTUAL_WITHOUT_EXPECT!>parameterCount2<!>(p: String) {}
expect fun callableKind(): Int
val callableKind: Int = 1
@@ -16,9 +16,9 @@ fun typeParameterCount() {}
<!NO_ACTUAL_FOR_EXPECT{JVM}!>expect enum class EnumEntries {
ONE, TWO;
}<!>
<!ACTUAL_WITHOUT_EXPECT!>actual enum class EnumEntries {
actual enum class <!ACTUAL_WITHOUT_EXPECT!>EnumEntries<!> {
ONE;
}<!>
}
expect fun vararg(bar: Int)
fun vararg(vararg bar: Int) = Unit
@@ -1,12 +1,12 @@
<!ACTUAL_WITHOUT_EXPECT!><!DEPRECATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>header<!> <!INCOMPATIBLE_MODIFIERS!>impl<!> class First<!>
<!DEPRECATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>header<!> <!INCOMPATIBLE_MODIFIERS!>impl<!> class <!ACTUAL_WITHOUT_EXPECT!>First<!>
<!DEPRECATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>header<!> <!INCOMPATIBLE_MODIFIERS!>expect<!> class Second
<!ACTUAL_WITHOUT_EXPECT!><!DEPRECATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>header<!> <!INCOMPATIBLE_MODIFIERS!>actual<!> class Third<!>
<!DEPRECATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>header<!> <!INCOMPATIBLE_MODIFIERS!>actual<!> class <!ACTUAL_WITHOUT_EXPECT!>Third<!>
<!ACTUAL_WITHOUT_EXPECT!><!DEPRECATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>impl<!> <!INCOMPATIBLE_MODIFIERS!>expect<!> class Fourth<!>
<!DEPRECATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>impl<!> <!INCOMPATIBLE_MODIFIERS!>expect<!> class <!ACTUAL_WITHOUT_EXPECT!>Fourth<!>
<!ACTUAL_WITHOUT_EXPECT!><!DEPRECATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>impl<!> <!INCOMPATIBLE_MODIFIERS!>actual<!> class Fifth<!>
<!DEPRECATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>impl<!> <!INCOMPATIBLE_MODIFIERS!>actual<!> class <!ACTUAL_WITHOUT_EXPECT!>Fifth<!>
<!ACTUAL_WITHOUT_EXPECT!><!INCOMPATIBLE_MODIFIERS!>expect<!> <!INCOMPATIBLE_MODIFIERS!>actual<!> class Sixth<!>
<!INCOMPATIBLE_MODIFIERS!>expect<!> <!INCOMPATIBLE_MODIFIERS!>actual<!> class <!ACTUAL_WITHOUT_EXPECT!>Sixth<!>
@@ -23,6 +23,6 @@ actual inline class Foo1(val x: Int) {
actual inline class <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>Foo2<!>(val x: String)
actual <!ABSENCE_OF_PRIMARY_CONSTRUCTOR_FOR_VALUE_CLASS!>inline<!> class Foo3
<!ACTUAL_WITHOUT_EXPECT!>actual inline class NonInlineExpect(val x: Int)<!>
actual inline class <!ACTUAL_WITHOUT_EXPECT!>NonInlineExpect<!>(val x: Int)
<!ACTUAL_WITHOUT_EXPECT!>actual class NonInlineActual actual constructor(actual val x: Int)<!>
actual class <!ACTUAL_WITHOUT_EXPECT!>NonInlineActual<!> actual constructor(actual val x: Int)
@@ -6,6 +6,6 @@
// MODULE: m1-jvm()()(m1-common)
// FILE: jvm.kt
<!ACTUAL_WITHOUT_EXPECT!>actual class SomeClass {
actual class <!ACTUAL_WITHOUT_EXPECT!>SomeClass<!> {
actual fun foo() {}
}<!>
}
@@ -23,7 +23,7 @@ fun foo() {
// FILE: jvm.kt
class Outer <!ACTUAL_WITHOUT_EXPECT!>actual constructor()<!> {
<!ACTUAL_WITHOUT_EXPECT!>actual class Nested<!>
actual class <!ACTUAL_WITHOUT_EXPECT!>Nested<!>
<!WRONG_MODIFIER_TARGET!>actual<!> init {}
}
@@ -8,10 +8,10 @@ package common
// FILE: jvm.kt
package jvm
<!ACTUAL_WITHOUT_EXPECT!>actual fun foo() {}<!>
actual fun <!ACTUAL_WITHOUT_EXPECT!>foo<!>() {}
// MODULE: m3-js()()(m1-common)
// FILE: js.kt
package js
<!ACTUAL_WITHOUT_EXPECT!>actual fun foo() {}<!>
actual fun <!ACTUAL_WITHOUT_EXPECT!>foo<!>() {}
@@ -1,11 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect fun foo()
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
<!NON_MEMBER_FUNCTION_NO_BODY!>actual fun foo()<!>
<!ACTUAL_WITHOUT_EXPECT, NON_MEMBER_FUNCTION_NO_BODY!>actual fun bar()<!>
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -1,4 +0,0 @@
// MODULE: m1-jvm
// FILE: jvm.kt
<!ACTUAL_WITHOUT_EXPECT!>actual fun foo() { }<!>
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-jvm
// FILE: jvm.kt
@@ -7,7 +7,7 @@ expect fun nonInlineFun()
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
<!ACTUAL_WITHOUT_EXPECT!>actual fun inlineFun() { }<!>
actual fun <!ACTUAL_WITHOUT_EXPECT!>inlineFun<!>() { }
actual fun nonInlineFun() { }
// MODULE: m3-js()()(m1-common)
@@ -17,10 +17,10 @@ expect inline fun f6(crossinline s: () -> String)
// FILE: jvm.kt
actual inline fun f1(noinline s: () -> String) {}
<!ACTUAL_WITHOUT_EXPECT!>actual inline fun f2(noinline s: () -> String) {}<!>
actual inline fun <!ACTUAL_WITHOUT_EXPECT!>f2<!>(noinline s: () -> String) {}
actual inline fun f3(s: () -> String) {}
actual inline fun f4(crossinline s: () -> String) {}
<!ACTUAL_WITHOUT_EXPECT!>actual inline fun f5(crossinline s: () -> String) {}<!>
actual inline fun <!ACTUAL_WITHOUT_EXPECT!>f5<!>(crossinline s: () -> String) {}
actual inline fun f6(s: () -> String) {}
<!ACTUAL_WITHOUT_EXPECT!>actual fun f7(vararg x: Any) {}<!>
<!ACTUAL_WITHOUT_EXPECT!>actual fun f8(x: Any) {}<!>
actual fun <!ACTUAL_WITHOUT_EXPECT!>f7<!>(vararg x: Any) {}
actual fun <!ACTUAL_WITHOUT_EXPECT!>f8<!>(x: Any) {}
@@ -18,17 +18,17 @@ expect var v2: Boolean
// MODULE: m1-jvm()()(m1-common)
// FILE: jvm.kt
<!ACTUAL_WITHOUT_EXPECT!>actual var v1: Boolean = false
private set<!>
actual var <!ACTUAL_WITHOUT_EXPECT!>v1<!>: Boolean = false
private set
actual var v2: Boolean = false
<!ACTUAL_WITHOUT_EXPECT!>actual var v3: Boolean = false
private set<!>
actual var <!ACTUAL_WITHOUT_EXPECT!>v3<!>: Boolean = false
private set
actual open class C {
<!ACTUAL_WITHOUT_EXPECT!>actual var foo: Boolean = false
protected set<!>
actual var <!ACTUAL_WITHOUT_EXPECT!>foo<!>: Boolean = false
protected set
}
open class C2Typealias {