FIR: regard property accessor without body as FirDefaultPropertyAccessor

This commit is contained in:
Jinseong Jeon
2020-03-20 22:04:51 +03:00
committed by Mikhail Glukhikh
parent e26a3ad033
commit e46a4246d2
23 changed files with 67 additions and 36 deletions
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
@@ -242,13 +243,16 @@ class RawFirBuilder(
propertyTypeRef: FirTypeRef,
isGetter: Boolean,
): FirPropertyAccessor {
if (this == null) {
if (this == null || !hasBody()) {
val propertySource = property.toFirSourceElement()
return if (isGetter) {
FirDefaultPropertyGetter(propertySource, baseSession, propertyTypeRef, property.visibility)
} else {
FirDefaultPropertySetter(propertySource, baseSession, propertyTypeRef, property.visibility)
}
val accessorVisibility = this?.visibility ?: property.visibility
return FirDefaultPropertyAccessor
.createGetterOrSetter(propertySource, baseSession, propertyTypeRef, accessorVisibility, isGetter)
.also {
if (this != null) {
it.extractAnnotationsFrom(this)
}
}
}
val source = this.toFirSourceElement()
val accessorTarget = FirFunctionTarget(labelName = null, isLambda = false)
@@ -343,6 +347,10 @@ class RawFirBuilder(
}
}
private fun FirDefaultPropertyAccessor.extractAnnotationsFrom(annotated: KtAnnotated) {
annotated.extractAnnotationsTo(this.annotations)
}
private fun KtAnnotated.extractAnnotationsTo(container: MutableList<FirAnnotationCall>) {
for (annotationEntry in annotationEntries) {
container += annotationEntry.convert<FirAnnotationCall>()
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getStartOffsetIn
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.parents
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners
@@ -258,7 +259,8 @@ class RawFirBuilderTotalKotlinTestCase : AbstractRawFirBuilderTestCase() {
(it.parent is KtUserType || it.parent is KtInstanceExpressionWithLabel ||
it.parent is KtValueArgumentName || it.parent is KtTypeConstraint) ||
it.getStrictParentOfType<KtPackageDirective>() != null ||
it.getStrictParentOfType<KtImportDirective>() != null
it.getStrictParentOfType<KtImportDirective>() != null ||
(it is KtPropertyAccessor && !it.hasBody())
}
if (psiSetDirect.isNotEmpty()) {
println("Total of $counter files processed successfully")
@@ -49,6 +49,22 @@ abstract class FirDefaultPropertyAccessor(
final override var body: FirBlock?
get() = null
set(_) {}
companion object {
fun createGetterOrSetter(
source: FirSourceElement?,
session: FirSession,
propertyTypeRef: FirTypeRef,
visibility: Visibility,
isGetter: Boolean
): FirDefaultPropertyAccessor {
return if (isGetter) {
FirDefaultPropertyGetter(source, session, propertyTypeRef, visibility)
} else {
FirDefaultPropertySetter(source, session, propertyTypeRef, visibility)
}
}
}
}
class FirDefaultPropertyGetter(
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
open class A<T> {
open var x: T = "Fail" as T
get
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
import kotlin.reflect.KMutableProperty
class Bar(name: String) {
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
class Outer {
class Nested {
fun fn(): String {
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// WITH_RUNTIME
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// WITH_RUNTIME
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// WITH_RUNTIME
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JS_IR
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
class A {
private var foo = 1
get() {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// IGNORE_BACKEND: JS_IR
// TODO: muted automatically, investigate should it be ran for JS or not
// IGNORE_BACKEND: JS
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
class Test {
companion object {
-1
View File
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
class App {
fun init() {
s = "OK"
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
class My {
lateinit var x: String
private set
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
class My {
lateinit var x: String
private set
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
interface A {
val foo: String
}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// FILE: box.kt
object Test {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// FILE: a.kt
package a
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// WITH_RUNTIME
@@ -72,17 +72,25 @@ FILE fqName:<root> fileName:/classLevelProperties.kt
RETURN type=kotlin.Nothing from='public final fun <get-test5> (): kotlin.Int declared in <root>.C'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test5 type:kotlin.Int visibility:private' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.C declared in <root>.C.<get-test5>' type=<root>.C origin=null
FUN name:<set-test5> visibility:private modality:FINAL <> ($this:<root>.C, value:kotlin.Int) returnType:kotlin.Unit
FUN DEFAULT_PROPERTY_ACCESSOR name:<set-test5> visibility:private modality:FINAL <> ($this:<root>.C, <set-?>:kotlin.Int) returnType:kotlin.Unit
correspondingProperty: PROPERTY name:test5 visibility:public modality:FINAL [var]
$this: VALUE_PARAMETER name:<this> type:<root>.C
VALUE_PARAMETER name:value index:0 type:kotlin.Int
VALUE_PARAMETER name:<set-?> index:0 type:kotlin.Int
BLOCK_BODY
SET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test5 type:kotlin.Int visibility:private' type=kotlin.Unit origin=null
receiver: GET_VAR '<this>: <root>.C declared in <root>.C.<set-test5>' type=<root>.C origin=null
value: GET_VAR '<set-?>: kotlin.Int declared in <root>.C.<set-test5>' type=kotlin.Int origin=null
PROPERTY name:test6 visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:test6 type:kotlin.Int visibility:private [final]
EXPRESSION_BODY
CONST Int type=kotlin.Int value=1
FUN name:<get-test6> visibility:public modality:FINAL <> ($this:<root>.C) returnType:kotlin.Int
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test6> visibility:public modality:FINAL <> ($this:<root>.C) returnType:kotlin.Int
correspondingProperty: PROPERTY name:test6 visibility:public modality:FINAL [val]
$this: VALUE_PARAMETER name:<this> type:<root>.C
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-test6> (): kotlin.Int declared in <root>.C'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test6 type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.C declared in <root>.C.<get-test6>' type=<root>.C origin=null
PROPERTY name:test7 visibility:public modality:FINAL [delegated,val]
FIELD PROPERTY_DELEGATE name:test7$delegate type:kotlin.Lazy<kotlin.Int> visibility:private [final]
EXPRESSION_BODY
@@ -53,15 +53,21 @@ FILE fqName:<root> fileName:/packageLevelProperties.kt
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-test5> (): kotlin.Int declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test5 type:kotlin.Int visibility:private [static]' type=kotlin.Int origin=null
FUN name:<set-test5> visibility:private modality:FINAL <> (value:kotlin.Int) returnType:kotlin.Unit
FUN DEFAULT_PROPERTY_ACCESSOR name:<set-test5> visibility:private modality:FINAL <> (<set-?>:kotlin.Int) returnType:kotlin.Unit
correspondingProperty: PROPERTY name:test5 visibility:public modality:FINAL [var]
VALUE_PARAMETER name:value index:0 type:kotlin.Int
VALUE_PARAMETER name:<set-?> index:0 type:kotlin.Int
BLOCK_BODY
SET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test5 type:kotlin.Int visibility:private [static]' type=kotlin.Unit origin=null
value: GET_VAR '<set-?>: kotlin.Int declared in <root>.<set-test5>' type=kotlin.Int origin=null
PROPERTY name:test6 visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:test6 type:kotlin.Int visibility:private [final,static]
EXPRESSION_BODY
CONST Int type=kotlin.Int value=1
FUN name:<get-test6> visibility:public modality:FINAL <> () returnType:kotlin.Int
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test6> visibility:public modality:FINAL <> () returnType:kotlin.Int
correspondingProperty: PROPERTY name:test6 visibility:public modality:FINAL [val]
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-test6> (): kotlin.Int declared in <root>'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test6 type:kotlin.Int visibility:private [final,static]' type=kotlin.Int origin=null
PROPERTY name:test7 visibility:public modality:FINAL [delegated,val]
FIELD PROPERTY_DELEGATE name:test7$delegate type:kotlin.Lazy<kotlin.Int> visibility:private [final,static]
EXPRESSION_BODY
@@ -48,10 +48,14 @@ FILE fqName:<root> fileName:/propertyReferences.kt
RETURN type=kotlin.Nothing from='public final fun <get-varWithPrivateSet> (): kotlin.Int declared in <root>.C'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:varWithPrivateSet type:kotlin.Int visibility:private' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.C declared in <root>.C.<get-varWithPrivateSet>' type=<root>.C origin=null
FUN name:<set-varWithPrivateSet> visibility:private modality:FINAL <> ($this:<root>.C, value:kotlin.Int) returnType:kotlin.Unit
FUN DEFAULT_PROPERTY_ACCESSOR name:<set-varWithPrivateSet> visibility:private modality:FINAL <> ($this:<root>.C, <set-?>:kotlin.Int) returnType:kotlin.Unit
correspondingProperty: PROPERTY name:varWithPrivateSet visibility:public modality:FINAL [var]
$this: VALUE_PARAMETER name:<this> type:<root>.C
VALUE_PARAMETER name:value index:0 type:kotlin.Int
VALUE_PARAMETER name:<set-?> index:0 type:kotlin.Int
BLOCK_BODY
SET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:varWithPrivateSet type:kotlin.Int visibility:private' type=kotlin.Unit origin=null
receiver: GET_VAR '<this>: <root>.C declared in <root>.C.<set-varWithPrivateSet>' type=<root>.C origin=null
value: GET_VAR '<set-?>: kotlin.Int declared in <root>.C.<set-varWithPrivateSet>' type=kotlin.Int origin=null
PROPERTY name:varWithProtectedSet visibility:public modality:FINAL [var]
FIELD PROPERTY_BACKING_FIELD name:varWithProtectedSet type:kotlin.Int visibility:private
EXPRESSION_BODY
@@ -63,10 +67,14 @@ FILE fqName:<root> fileName:/propertyReferences.kt
RETURN type=kotlin.Nothing from='public final fun <get-varWithProtectedSet> (): kotlin.Int declared in <root>.C'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:varWithProtectedSet type:kotlin.Int visibility:private' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.C declared in <root>.C.<get-varWithProtectedSet>' type=<root>.C origin=null
FUN name:<set-varWithProtectedSet> visibility:protected modality:FINAL <> ($this:<root>.C, value:kotlin.Int) returnType:kotlin.Unit
FUN DEFAULT_PROPERTY_ACCESSOR name:<set-varWithProtectedSet> visibility:protected modality:FINAL <> ($this:<root>.C, <set-?>:kotlin.Int) returnType:kotlin.Unit
correspondingProperty: PROPERTY name:varWithProtectedSet visibility:public modality:FINAL [var]
$this: VALUE_PARAMETER name:<this> type:<root>.C
VALUE_PARAMETER name:value index:0 type:kotlin.Int
VALUE_PARAMETER name:<set-?> index:0 type:kotlin.Int
BLOCK_BODY
SET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:varWithProtectedSet type:kotlin.Int visibility:private' type=kotlin.Unit origin=null
receiver: GET_VAR '<this>: <root>.C declared in <root>.C.<set-varWithProtectedSet>' type=<root>.C origin=null
value: GET_VAR '<set-?>: kotlin.Int declared in <root>.C.<set-varWithProtectedSet>' type=kotlin.Int origin=null
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
@@ -270,7 +278,7 @@ FILE fqName:<root> fileName:/propertyReferences.kt
PROPERTY name:test_varWithPrivateSet visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:test_varWithPrivateSet type:kotlin.reflect.KMutableProperty1<<root>.C, kotlin.Int> visibility:private [final,static]
EXPRESSION_BODY
PROPERTY_REFERENCE 'public final varWithPrivateSet: kotlin.Int [var]' field='FIELD PROPERTY_BACKING_FIELD name:varWithPrivateSet type:kotlin.Int visibility:private' getter='public final fun <get-varWithPrivateSet> (): kotlin.Int declared in <root>.C' setter='private final fun <set-varWithPrivateSet> (value: kotlin.Int): kotlin.Unit declared in <root>.C' type=kotlin.reflect.KMutableProperty1<<root>.C, kotlin.Int> origin=null
PROPERTY_REFERENCE 'public final varWithPrivateSet: kotlin.Int [var]' field='FIELD PROPERTY_BACKING_FIELD name:varWithPrivateSet type:kotlin.Int visibility:private' getter='public final fun <get-varWithPrivateSet> (): kotlin.Int declared in <root>.C' setter='private final fun <set-varWithPrivateSet> (<set-?>: kotlin.Int): kotlin.Unit declared in <root>.C' type=kotlin.reflect.KMutableProperty1<<root>.C, kotlin.Int> origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test_varWithPrivateSet> visibility:public modality:FINAL <> () returnType:kotlin.reflect.KMutableProperty1<<root>.C, kotlin.Int>
correspondingProperty: PROPERTY name:test_varWithPrivateSet visibility:public modality:FINAL [val]
BLOCK_BODY
@@ -279,7 +287,7 @@ FILE fqName:<root> fileName:/propertyReferences.kt
PROPERTY name:test_varWithProtectedSet visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:test_varWithProtectedSet type:kotlin.reflect.KMutableProperty1<<root>.C, kotlin.Int> visibility:private [final,static]
EXPRESSION_BODY
PROPERTY_REFERENCE 'public final varWithProtectedSet: kotlin.Int [var]' field='FIELD PROPERTY_BACKING_FIELD name:varWithProtectedSet type:kotlin.Int visibility:private' getter='public final fun <get-varWithProtectedSet> (): kotlin.Int declared in <root>.C' setter='protected final fun <set-varWithProtectedSet> (value: kotlin.Int): kotlin.Unit declared in <root>.C' type=kotlin.reflect.KMutableProperty1<<root>.C, kotlin.Int> origin=null
PROPERTY_REFERENCE 'public final varWithProtectedSet: kotlin.Int [var]' field='FIELD PROPERTY_BACKING_FIELD name:varWithProtectedSet type:kotlin.Int visibility:private' getter='public final fun <get-varWithProtectedSet> (): kotlin.Int declared in <root>.C' setter='protected final fun <set-varWithProtectedSet> (<set-?>: kotlin.Int): kotlin.Unit declared in <root>.C' type=kotlin.reflect.KMutableProperty1<<root>.C, kotlin.Int> origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test_varWithProtectedSet> visibility:public modality:FINAL <> () returnType:kotlin.reflect.KMutableProperty1<<root>.C, kotlin.Int>
correspondingProperty: PROPERTY name:test_varWithProtectedSet visibility:public modality:FINAL [val]
BLOCK_BODY