72def186a3
The change is needed for the parallel resolution (^KT-55750), so we can resolve the declaration under a lock that is specific to this declaration. Previously, if LL FIR was resolving some FirClass, LL FIR resolved all its children too, and it had no control over what parts of the FIR tree were modified. The same applied to the designation path, sometimes the classes on the designation path might be unexpectedly (and without lock) modified. This commit introduces LLFirResolveTarget, which specifies which exact declarations should be resolved during the lazy resolution of the declaration. All elements outside the declarations specified for resolve in LLFirResolveTarget, should not be modified. The logic of lazy transformers is the following: - Go to target declaration collecting all scopes from the file and containing classes - Resolve only declarations that are specified by the LLFirResolveTarget, performing the resolve under a separate lock for each declaration ^KT-56543 ^KT-57619 Fixed
164 lines
6.4 KiB
Kotlin
Vendored
164 lines
6.4 KiB
Kotlin
Vendored
@<!UNRESOLVED_REFERENCE!><!SYNTAX!><!>myAnnotation<!> <!WRONG_MODIFIER_TARGET!>public<!>
|
|
package illegal_modifiers
|
|
|
|
abstract class A() {
|
|
<!INCOMPATIBLE_MODIFIERS!>abstract<!> <!INCOMPATIBLE_MODIFIERS!>final<!> fun f()
|
|
abstract <!REDUNDANT_MODIFIER!>open<!> fun g()
|
|
<!INCOMPATIBLE_MODIFIERS!>final<!> <!INCOMPATIBLE_MODIFIERS!>open<!> fun h() {}
|
|
|
|
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>open var r: String<!>
|
|
get
|
|
<!WRONG_MODIFIER_TARGET!>abstract<!> protected set
|
|
}
|
|
|
|
<!WRONG_MODIFIER_TARGET!>final<!> interface T {}
|
|
|
|
class FinalClass() {
|
|
<!NON_FINAL_MEMBER_IN_FINAL_CLASS!>open<!> fun foo() {}
|
|
val i: Int = 1
|
|
<!WRONG_MODIFIER_TARGET!>open<!> get(): Int = field
|
|
var j: Int = 1
|
|
<!WRONG_MODIFIER_TARGET!>open<!> set(v: Int) {}
|
|
}
|
|
|
|
<!INCOMPATIBLE_MODIFIERS!>private<!> <!INCOMPATIBLE_MODIFIERS!>public<!> class C
|
|
<!INCOMPATIBLE_MODIFIERS!>private<!> <!INCOMPATIBLE_MODIFIERS!>public<!> object D
|
|
|
|
//A sample annotation to check annotation usage in parameters.
|
|
annotation class annotated(val text: String = "not given")
|
|
|
|
//Check legal modifiers in constructor
|
|
class LegalModifier(val a: Int, @annotated private var b: String, @annotated vararg v: Int)
|
|
|
|
//Check illegal modifier in constructor parameters
|
|
class IllegalModifiers1(
|
|
<!WRONG_MODIFIER_TARGET!>in<!>
|
|
<!INCOMPATIBLE_MODIFIERS!>out<!>
|
|
<!WRONG_MODIFIER_TARGET!>reified<!>
|
|
<!WRONG_MODIFIER_TARGET!>enum<!>
|
|
<!WRONG_MODIFIER_TARGET!>private<!>
|
|
<!WRONG_MODIFIER_TARGET!>const<!>
|
|
a: Int)
|
|
|
|
//Check multiple illegal modifiers in constructor
|
|
class IllegalModifiers2(<!WRONG_MODIFIER_TARGET!>private<!> <!INCOMPATIBLE_MODIFIERS!>abstract<!> a: Int)
|
|
|
|
|
|
//Check annotations with illegal modifiers in constructor
|
|
class IllegalModifiers3(@annotated <!WRONG_MODIFIER_TARGET!>public<!> <!WRONG_MODIFIER_TARGET!>abstract<!> b: String)
|
|
|
|
//Check annotations and vararg with illegal modifiers in constructor
|
|
class IllegalModifiers4(val a: Int, @annotated("a text") <!WRONG_MODIFIER_TARGET!>protected<!> vararg v: Int)
|
|
|
|
//Check illegal modifiers for functions and catch block
|
|
abstract class IllegalModifiers5() {
|
|
|
|
//Check illegal modifier in function parameter
|
|
abstract fun foo(<!WRONG_MODIFIER_TARGET!>public<!> a: Int, vararg v: String)
|
|
|
|
//Check multiple illegal modifiers in function parameter
|
|
abstract fun bar(<!WRONG_MODIFIER_TARGET!>public<!> <!WRONG_MODIFIER_TARGET!>abstract<!> a: Int, vararg v: String)
|
|
|
|
//Check annotations with illegal modifiers
|
|
abstract fun baz(@annotated("a text") <!WRONG_MODIFIER_TARGET!>public<!> <!WRONG_MODIFIER_TARGET!>abstract<!> a: Int)
|
|
|
|
private fun qux() {
|
|
|
|
//Check illegal modifier in catch block
|
|
try {} catch (<!WRONG_MODIFIER_TARGET!>in<!> <!INCOMPATIBLE_MODIFIERS!>out<!> <!WRONG_MODIFIER_TARGET!>reified<!> <!WRONG_MODIFIER_TARGET!>enum<!> <!WRONG_MODIFIER_TARGET!>public<!> e: Exception) {}
|
|
|
|
//Check multiple illegal modifiers in catch block
|
|
try {} catch (<!WRONG_MODIFIER_TARGET!>in<!> <!INCOMPATIBLE_MODIFIERS!>out<!> <!WRONG_MODIFIER_TARGET!>reified<!> <!WRONG_MODIFIER_TARGET!>enum<!> <!WRONG_MODIFIER_TARGET!>abstract<!> <!WRONG_MODIFIER_TARGET!>public<!> e: Exception) {}
|
|
|
|
//Check annotations with illegal modifiers
|
|
try {} catch (@annotated("a text") <!WRONG_MODIFIER_TARGET!>abstract<!> <!WRONG_MODIFIER_TARGET!>public<!> e: Exception) {}
|
|
}
|
|
}
|
|
|
|
//Check illegal modifiers on anonymous initializers
|
|
abstract class IllegalModifiers6() {
|
|
<!WRONG_MODIFIER_TARGET!>public<!> init {}
|
|
<!WRONG_MODIFIER_TARGET!>private<!> init {}
|
|
<!WRONG_MODIFIER_TARGET!>protected<!> init {}
|
|
<!WRONG_MODIFIER_TARGET!>vararg<!> init {}
|
|
<!WRONG_MODIFIER_TARGET!>abstract<!> init {}
|
|
<!WRONG_MODIFIER_TARGET!>open<!> init {}
|
|
<!WRONG_MODIFIER_TARGET!>final<!> init {}
|
|
|
|
<!WRONG_MODIFIER_TARGET!>public<!> <!WRONG_ANNOTATION_TARGET!>@annotated<!> init {}
|
|
|
|
<!WRONG_MODIFIER_TARGET!>private<!> <!NOT_AN_ANNOTATION_CLASS, WRONG_ANNOTATION_TARGET!>@IllegalModifiers6()<!> init {}
|
|
}
|
|
|
|
// strange inappropriate modifiers usages
|
|
<!WRONG_MODIFIER_TARGET!>override<!>
|
|
<!WRONG_MODIFIER_TARGET!>out<!>
|
|
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
|
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
|
<!WRONG_MODIFIER_TARGET!>reified<!>
|
|
class IllegalModifiers7() {
|
|
<!WRONG_MODIFIER_TARGET!>enum<!>
|
|
<!WRONG_MODIFIER_TARGET!>inner<!>
|
|
<!WRONG_MODIFIER_TARGET!>annotation<!>
|
|
<!WRONG_MODIFIER_TARGET!>out<!>
|
|
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
|
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
|
<!WRONG_MODIFIER_TARGET!>reified<!>
|
|
val x = 1
|
|
<!WRONG_MODIFIER_TARGET!>enum<!>
|
|
<!WRONG_MODIFIER_TARGET!>inner<!>
|
|
<!WRONG_MODIFIER_TARGET!>annotation<!>
|
|
<!WRONG_MODIFIER_TARGET!>out<!>
|
|
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
|
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
|
<!WRONG_MODIFIER_TARGET!>reified<!>
|
|
<!WRONG_MODIFIER_TARGET!>const<!>
|
|
fun foo() {}
|
|
}
|
|
|
|
// Secondary constructors
|
|
class IllegalModifiers8 {
|
|
<!WRONG_MODIFIER_TARGET!>abstract<!>
|
|
enum
|
|
<!REDUNDANT_MODIFIER, WRONG_MODIFIER_TARGET!>open<!>
|
|
<!WRONG_MODIFIER_TARGET!>inner<!>
|
|
<!WRONG_MODIFIER_TARGET!>annotation<!>
|
|
<!WRONG_MODIFIER_TARGET!>override<!>
|
|
<!WRONG_MODIFIER_TARGET!>out<!>
|
|
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
|
<!INCOMPATIBLE_MODIFIERS!>final<!>
|
|
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
|
<!WRONG_MODIFIER_TARGET!>reified<!>
|
|
<!INCOMPATIBLE_MODIFIERS!>const<!><!SYNTAX!><!>
|
|
constructor() {}
|
|
|
|
constructor(<!WRONG_MODIFIER_TARGET!>private<!> <!WRONG_MODIFIER_TARGET!>enum<!> <!INCOMPATIBLE_MODIFIERS!>abstract<!> x: Int) {}
|
|
}
|
|
|
|
class IllegalModifiers9 {
|
|
<!INCOMPATIBLE_MODIFIERS!>private<!> <!INCOMPATIBLE_MODIFIERS!>protected<!> constructor() {}
|
|
<!INCOMPATIBLE_MODIFIERS!>private<!> <!INCOMPATIBLE_MODIFIERS!>internal<!> constructor(x: Int) {}
|
|
}
|
|
|
|
// Illegal modifiers on primary constructor
|
|
|
|
class IllegalModifiers10
|
|
<!WRONG_MODIFIER_TARGET!>abstract<!>
|
|
<!WRONG_MODIFIER_TARGET!>enum<!>
|
|
<!REDUNDANT_MODIFIER, WRONG_MODIFIER_TARGET!>open<!>
|
|
<!WRONG_MODIFIER_TARGET!>inner<!>
|
|
<!WRONG_MODIFIER_TARGET!>annotation<!>
|
|
<!WRONG_MODIFIER_TARGET!>override<!>
|
|
<!WRONG_MODIFIER_TARGET!>out<!>
|
|
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
|
<!INCOMPATIBLE_MODIFIERS!>final<!>
|
|
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
|
<!WRONG_MODIFIER_TARGET!>reified<!>
|
|
<!INCOMPATIBLE_MODIFIERS!>const<!> constructor()
|
|
|
|
class IllegalModifiers11 <!INCOMPATIBLE_MODIFIERS!>private<!> <!INCOMPATIBLE_MODIFIERS!>protected<!> constructor()
|
|
|
|
class Outer {
|
|
<!INCOMPATIBLE_MODIFIERS!>inner<!> <!INCOMPATIBLE_MODIFIERS!>sealed<!> class Inner
|
|
}
|