FIR checker: introduce member property checker
This commit is contained in:
committed by
Mikhail Glukhikh
parent
2bf22caeb7
commit
5167d69b7c
@@ -3,11 +3,11 @@ interface Some {
|
||||
open fun bar() {}
|
||||
|
||||
open val x: Int
|
||||
open val y = 1
|
||||
open val y = <!PROPERTY_INITIALIZER_IN_INTERFACE!>1<!>
|
||||
open val z get() = 1
|
||||
|
||||
open var xx: Int
|
||||
open var yy = 1
|
||||
open var yy = <!PROPERTY_INITIALIZER_IN_INTERFACE!>1<!>
|
||||
open var zz: Int
|
||||
set(value) {
|
||||
field = value
|
||||
|
||||
+120
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
* 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.fir.analysis.checkers.declaration
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.extended.report
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
|
||||
|
||||
// See old FE's [DeclarationsChecker]
|
||||
object FirMemberPropertyChecker : FirBasicDeclarationChecker() {
|
||||
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
if (declaration !is FirRegularClass) {
|
||||
return
|
||||
}
|
||||
for (member in declaration.declarations) {
|
||||
if (member is FirProperty) {
|
||||
checkProperty(declaration, member, reporter)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkProperty(containingDeclaration: FirRegularClass, property: FirProperty, reporter: DiagnosticReporter) {
|
||||
if (inInterface(containingDeclaration) &&
|
||||
property.visibility == Visibilities.Private &&
|
||||
!property.isAbstract &&
|
||||
(property.getter == null || property.getter is FirDefaultPropertyAccessor)
|
||||
) {
|
||||
property.source?.let { source ->
|
||||
reporter.report(source, FirErrors.PRIVATE_PROPERTY_IN_INTERFACE)
|
||||
}
|
||||
}
|
||||
|
||||
if (property.isAbstract) {
|
||||
if (!containingDeclaration.isAbstract && !containingDeclaration.isSealed && !inEnumClass(containingDeclaration)) {
|
||||
property.source?.let { source ->
|
||||
reporter.report(source, FirErrors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if (property.delegate != null) {
|
||||
property.delegate!!.source?.let {
|
||||
if (inInterface(containingDeclaration)) {
|
||||
reporter.report(FirErrors.DELEGATED_PROPERTY_IN_INTERFACE.on(it, property.delegate!!))
|
||||
} else {
|
||||
reporter.report(FirErrors.ABSTRACT_DELEGATED_PROPERTY.on(it, property.delegate!!))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
checkAccessor(property.getter, property.delegate) { src, symbol ->
|
||||
reporter.report(FirErrors.ABSTRACT_PROPERTY_WITH_GETTER.on(src, symbol))
|
||||
}
|
||||
checkAccessor(property.setter, property.delegate) { src, symbol ->
|
||||
if (symbol.fir.visibility == Visibilities.Private && property.visibility != Visibilities.Private) {
|
||||
reporter.report(FirErrors.PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY.on(src, symbol))
|
||||
} else {
|
||||
reporter.report(FirErrors.ABSTRACT_PROPERTY_WITH_SETTER.on(src, symbol))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
checkPropertyInitializer(containingDeclaration, property, reporter)
|
||||
|
||||
if (property.isOpen) {
|
||||
checkAccessor(property.setter, property.delegate) { src, symbol ->
|
||||
if (symbol.fir.visibility == Visibilities.Private && property.visibility != Visibilities.Private) {
|
||||
reporter.report(FirErrors.PRIVATE_SETTER_FOR_OPEN_PROPERTY.on(src, symbol))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkPropertyInitializer(containingDeclaration: FirRegularClass, property: FirProperty, reporter: DiagnosticReporter) {
|
||||
property.initializer?.source?.let {
|
||||
if (property.isAbstract) {
|
||||
reporter.report(FirErrors.ABSTRACT_PROPERTY_WITH_INITIALIZER.on(it, property.initializer!!))
|
||||
} else if (inInterface(containingDeclaration)) {
|
||||
reporter.report(FirErrors.PROPERTY_INITIALIZER_IN_INTERFACE.on(it, property.initializer!!))
|
||||
}
|
||||
}
|
||||
if (property.isAbstract) {
|
||||
if (property.initializer == null && property.delegate == null && property.returnTypeRef is FirImplicitTypeRef) {
|
||||
property.source?.let {
|
||||
reporter.report(FirErrors.PROPERTY_WITH_NO_TYPE_NO_INITIALIZER.on(it, property.symbol))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkAccessor(
|
||||
accessor: FirPropertyAccessor?,
|
||||
delegate: FirExpression?,
|
||||
report: (FirSourceElement, FirPropertyAccessorSymbol) -> Unit,
|
||||
) {
|
||||
if (accessor != null && accessor !is FirDefaultPropertyAccessor && accessor.hasBody && delegate == null) {
|
||||
accessor.source?.let {
|
||||
report.invoke(it, accessor.symbol)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun inInterface(containingDeclaration: FirRegularClass): Boolean =
|
||||
containingDeclaration.classKind == ClassKind.INTERFACE
|
||||
|
||||
private fun inEnumClass(containingDeclaration: FirRegularClass): Boolean =
|
||||
containingDeclaration.classKind == ClassKind.ENUM_CLASS
|
||||
}
|
||||
@@ -12,7 +12,9 @@ import org.jetbrains.kotlin.fir.FirEffectiveVisibility
|
||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
@@ -147,6 +149,23 @@ object FirErrors {
|
||||
val LOCAL_OBJECT_NOT_ALLOWED by error1<FirSourceElement, KtNamedDeclaration, Name>(SourceElementPositioningStrategies.DECLARATION_NAME)
|
||||
val LOCAL_INTERFACE_NOT_ALLOWED by error1<FirSourceElement, KtNamedDeclaration, Name>(SourceElementPositioningStrategies.DECLARATION_NAME)
|
||||
|
||||
// Properties & accessors
|
||||
val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error0<FirSourceElement, KtModifierListOwner>(SourceElementPositioningStrategies.MODALITY_MODIFIER)
|
||||
val PRIVATE_PROPERTY_IN_INTERFACE by error0<FirSourceElement, KtModifierListOwner>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER)
|
||||
|
||||
val ABSTRACT_PROPERTY_WITH_INITIALIZER by error1<FirSourceElement, PsiElement, FirExpression>()
|
||||
val PROPERTY_INITIALIZER_IN_INTERFACE by error1<FirSourceElement, PsiElement, FirExpression>()
|
||||
val PROPERTY_WITH_NO_TYPE_NO_INITIALIZER by error1<FirSourceElement, PsiElement, FirPropertySymbol>()
|
||||
|
||||
val ABSTRACT_DELEGATED_PROPERTY by error1<FirSourceElement, PsiElement, FirExpression>()
|
||||
val DELEGATED_PROPERTY_IN_INTERFACE by error1<FirSourceElement, PsiElement, FirExpression>()
|
||||
// TODO: val ACCESSOR_FOR_DELEGATED_PROPERTY by error1<FirSourceElement, PsiElement, FirPropertyAccessorSymbol>()
|
||||
|
||||
val ABSTRACT_PROPERTY_WITH_GETTER by error1<FirSourceElement, PsiElement, FirPropertyAccessorSymbol>()
|
||||
val ABSTRACT_PROPERTY_WITH_SETTER by error1<FirSourceElement, PsiElement, FirPropertyAccessorSymbol>()
|
||||
val PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY by error1<FirSourceElement, PsiElement, FirPropertyAccessorSymbol>()
|
||||
val PRIVATE_SETTER_FOR_OPEN_PROPERTY by error1<FirSourceElement, PsiElement, FirPropertyAccessorSymbol>()
|
||||
|
||||
// Control flow diagnostics
|
||||
val UNINITIALIZED_VARIABLE by error1<FirSourceElement, PsiElement, FirPropertySymbol>()
|
||||
val WRONG_INVOCATION_KIND by warning3<FirSourceElement, PsiElement, AbstractFirBasedSymbol<*>, EventOccurrencesRange, EventOccurrencesRange>()
|
||||
|
||||
+1
@@ -43,6 +43,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
|
||||
|
||||
override val regularClassCheckers: Set<FirRegularClassChecker> = setOf(
|
||||
FirTypeMismatchOnOverrideChecker,
|
||||
FirMemberPropertyChecker,
|
||||
)
|
||||
|
||||
override val constructorCheckers: Set<FirConstructorChecker> = setOf(
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.fir.declarations
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirRegularClassBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder
|
||||
@@ -35,15 +36,24 @@ fun FirTypeParameterBuilder.addDefaultBoundIfNecessary(isFlexible: Boolean = fal
|
||||
}
|
||||
}
|
||||
|
||||
inline val FirRegularClass.modality get() = status.modality
|
||||
inline val FirRegularClass.isSealed get() = status.modality == Modality.SEALED
|
||||
inline val FirRegularClass.isAbstract get() = status.modality == Modality.ABSTRACT
|
||||
|
||||
inline val FirRegularClass.isInner get() = status.isInner
|
||||
inline val FirRegularClass.isCompanion get() = status.isCompanion
|
||||
inline val FirRegularClass.isData get() = status.isData
|
||||
inline val FirRegularClass.isInline get() = status.isInline
|
||||
inline val FirRegularClass.isFun get() = status.isFun
|
||||
|
||||
inline val FirMemberDeclaration.modality get() = status.modality
|
||||
inline val FirMemberDeclaration.isAbstract get() = status.modality == Modality.ABSTRACT
|
||||
inline val FirMemberDeclaration.isOpen get() = status.modality == Modality.OPEN
|
||||
|
||||
inline val FirMemberDeclaration.visibility get() = status.visibility
|
||||
inline val FirMemberDeclaration.allowsToHaveFakeOverride: Boolean
|
||||
get() = !Visibilities.isPrivate(visibility) && visibility != Visibilities.InvisibleFake
|
||||
|
||||
inline val FirMemberDeclaration.isActual get() = status.isActual
|
||||
inline val FirMemberDeclaration.isExpect get() = status.isExpect
|
||||
inline val FirMemberDeclaration.isInner get() = status.isInner
|
||||
@@ -64,6 +74,7 @@ inline val FirPropertyAccessor.modality get() = status.modality
|
||||
inline val FirPropertyAccessor.visibility get() = status.visibility
|
||||
inline val FirPropertyAccessor.isInline get() = status.isInline
|
||||
inline val FirPropertyAccessor.isExternal get() = status.isExternal
|
||||
inline val FirPropertyAccessor.hasBody get() = body != null
|
||||
|
||||
inline val FirProperty.allowsToHaveFakeOverride: Boolean
|
||||
get() = !Visibilities.isPrivate(visibility) && visibility != Visibilities.InvisibleFake
|
||||
|
||||
@@ -5,22 +5,22 @@ abstract class MyAbstractClass() {
|
||||
val a: Int
|
||||
val a1: Int = 1
|
||||
abstract val a2: Int
|
||||
abstract val a3: Int = 1
|
||||
abstract val a3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>1<!>
|
||||
|
||||
var b: Int private set
|
||||
var b1: Int = 0; private set
|
||||
abstract var b2: Int private set
|
||||
abstract var b3: Int = 0; private set
|
||||
abstract var b3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; private set
|
||||
|
||||
var c: Int set(v: Int) { field = v }
|
||||
var c1: Int = 0; set(v: Int) { field = v }
|
||||
abstract var c2: Int set(v: Int) { field = v }
|
||||
abstract var c3: Int = 0; set(v: Int) { field = v }
|
||||
abstract var c2: Int <!ABSTRACT_PROPERTY_WITH_SETTER!>set(v: Int) { field = v }<!>
|
||||
abstract var c3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; <!ABSTRACT_PROPERTY_WITH_SETTER!>set(v: Int) { field = v }<!>
|
||||
|
||||
val e: Int get() = a
|
||||
val e1: Int = 0; get() = a
|
||||
abstract val e2: Int get() = a
|
||||
abstract val e3: Int = 0; get() = a
|
||||
abstract val e2: Int <!ABSTRACT_PROPERTY_WITH_GETTER!>get() = a<!>
|
||||
abstract val e3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; <!ABSTRACT_PROPERTY_WITH_GETTER!>get() = a<!>
|
||||
|
||||
//methods
|
||||
fun f()
|
||||
|
||||
@@ -4,23 +4,23 @@ class MyClass() {
|
||||
//properties
|
||||
val a: Int
|
||||
val a1: Int = 1
|
||||
abstract val a2: Int
|
||||
abstract val a3: Int = 1
|
||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> val a2: Int
|
||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> val a3: Int = 1
|
||||
|
||||
var b: Int private set
|
||||
var b1: Int = 0; private set
|
||||
abstract var b2: Int private set
|
||||
abstract var b3: Int = 0; private set
|
||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> var b2: Int private set
|
||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> var b3: Int = 0; private set
|
||||
|
||||
var c: Int set(v: Int) { field = v }
|
||||
var c1: Int = 0; set(v: Int) { field = v }
|
||||
abstract var c2: Int set(v: Int) { field = v }
|
||||
abstract var c3: Int = 0; set(v: Int) { field = v }
|
||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> var c2: Int set(v: Int) { field = v }
|
||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> var c3: Int = 0; set(v: Int) { field = v }
|
||||
|
||||
val e: Int get() = a
|
||||
val e1: Int = 0; get() = a
|
||||
abstract val e2: Int get() = a
|
||||
abstract val e3: Int = 0; get() = a
|
||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> val e2: Int get() = a
|
||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> val e3: Int = 0; get() = a
|
||||
|
||||
//methods
|
||||
fun f()
|
||||
|
||||
+14
-14
@@ -3,24 +3,24 @@ package abstract
|
||||
interface MyTrait {
|
||||
//properties
|
||||
val a: Int
|
||||
val a1: Int = 1
|
||||
val a1: Int = <!PROPERTY_INITIALIZER_IN_INTERFACE!>1<!>
|
||||
abstract val a2: Int
|
||||
abstract val a3: Int = 1
|
||||
abstract val a3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>1<!>
|
||||
|
||||
var b: Int private set
|
||||
var b1: Int = 0; private set
|
||||
var b1: Int = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>; private set
|
||||
abstract var b2: Int private set
|
||||
abstract var b3: Int = 0; private set
|
||||
abstract var b3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; private set
|
||||
|
||||
var c: Int set(v: Int) { field = v }
|
||||
var c1: Int = 0; set(v: Int) { field = v }
|
||||
abstract var c2: Int set(v: Int) { field = v }
|
||||
abstract var c3: Int = 0; set(v: Int) { field = v }
|
||||
var c1: Int = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>; set(v: Int) { field = v }
|
||||
abstract var c2: Int <!ABSTRACT_PROPERTY_WITH_SETTER!>set(v: Int) { field = v }<!>
|
||||
abstract var c3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; <!ABSTRACT_PROPERTY_WITH_SETTER!>set(v: Int) { field = v }<!>
|
||||
|
||||
val e: Int get() = a
|
||||
val e1: Int = 0; get() = a
|
||||
abstract val e2: Int get() = a
|
||||
abstract val e3: Int = 0; get() = a
|
||||
val e1: Int = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>; get() = a
|
||||
abstract val e2: Int <!ABSTRACT_PROPERTY_WITH_GETTER!>get() = a<!>
|
||||
abstract val e3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; <!ABSTRACT_PROPERTY_WITH_GETTER!>get() = a<!>
|
||||
|
||||
//methods
|
||||
fun f()
|
||||
@@ -30,16 +30,16 @@ interface MyTrait {
|
||||
|
||||
//property accessors
|
||||
var i: Int abstract get abstract set
|
||||
var i1: Int = 0; abstract get abstract set
|
||||
var i1: Int = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>; abstract get abstract set
|
||||
|
||||
var j: Int get() = i; abstract set
|
||||
var j1: Int = 0; get() = i; abstract set
|
||||
var j1: Int = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>; get() = i; abstract set
|
||||
|
||||
var k: Int abstract set
|
||||
var k1: Int = 0; abstract set
|
||||
var k1: Int = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>; abstract set
|
||||
|
||||
var l: Int abstract get abstract set
|
||||
var l1: Int = 0; abstract get abstract set
|
||||
var l1: Int = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>; abstract get abstract set
|
||||
|
||||
var n: Int abstract get abstract set(v: Int) {}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
// NI_EXPECTED_FILE
|
||||
|
||||
interface T {
|
||||
val a = <!UNRESOLVED_REFERENCE!>Foo<!>.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
val a = <!UNRESOLVED_REFERENCE!>Foo<!>.<!PROPERTY_INITIALIZER_IN_INTERFACE!><!UNRESOLVED_REFERENCE!>bar<!>()<!>
|
||||
}
|
||||
@@ -62,9 +62,9 @@ interface E : A {
|
||||
override var a: Int
|
||||
get() = 0
|
||||
// Errors here and below
|
||||
private set(arg) {}
|
||||
<!PRIVATE_SETTER_FOR_OPEN_PROPERTY!>private set(arg) {}<!>
|
||||
|
||||
override var b: Int
|
||||
get() = 0
|
||||
private set(arg) {}
|
||||
<!PRIVATE_SETTER_FOR_OPEN_PROPERTY!>private set(arg) {}<!>
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
interface My {
|
||||
val x: Int = 0
|
||||
val x: Int = <!PROPERTY_INITIALIZER_IN_INTERFACE!>0<!>
|
||||
get() = field
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ interface T {
|
||||
final val c : Int
|
||||
get() = 42
|
||||
|
||||
final val d = 1
|
||||
final val d = <!PROPERTY_INITIALIZER_IN_INTERFACE!>1<!>
|
||||
}
|
||||
|
||||
class A {
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
abstract class A {
|
||||
abstract val a: Int by Delegate()
|
||||
abstract val a: Int by <!ABSTRACT_DELEGATED_PROPERTY!>Delegate()<!>
|
||||
}
|
||||
|
||||
class Delegate {
|
||||
|
||||
@@ -7,22 +7,22 @@ enum class MyEnum() {
|
||||
val a: Int
|
||||
val a1: Int = 1
|
||||
abstract val a2: Int
|
||||
abstract val a3: Int = 1
|
||||
abstract val a3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>1<!>
|
||||
|
||||
var b: Int private set
|
||||
var b1: Int = 0; private set
|
||||
abstract var b2: Int private set
|
||||
abstract var b3: Int = 0; private set
|
||||
abstract var b3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; private set
|
||||
|
||||
var c: Int set(v: Int) { field = v }
|
||||
var c1: Int = 0; set(v: Int) { field = v }
|
||||
abstract var c2: Int set(v: Int) { field = v }
|
||||
abstract var c3: Int = 0; set(v: Int) { field = v }
|
||||
abstract var c2: Int <!ABSTRACT_PROPERTY_WITH_SETTER!>set(v: Int) { field = v }<!>
|
||||
abstract var c3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; <!ABSTRACT_PROPERTY_WITH_SETTER!>set(v: Int) { field = v }<!>
|
||||
|
||||
val e: Int get() = a
|
||||
val e1: Int = 0; get() = a
|
||||
abstract val e2: Int get() = a
|
||||
abstract val e3: Int = 0; get() = a
|
||||
abstract val e2: Int <!ABSTRACT_PROPERTY_WITH_GETTER!>get() = a<!>
|
||||
abstract val e3: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>0<!>; <!ABSTRACT_PROPERTY_WITH_GETTER!>get() = a<!>
|
||||
|
||||
//methods
|
||||
fun f()
|
||||
|
||||
+4
-4
@@ -1,7 +1,7 @@
|
||||
abstract class Test() {
|
||||
abstract val x : Int
|
||||
abstract val x1 : Int get
|
||||
abstract val x2 : Int get() = 1
|
||||
abstract val x2 : Int <!ABSTRACT_PROPERTY_WITH_GETTER!>get() = 1<!>
|
||||
|
||||
val a : Int
|
||||
val b : Int get
|
||||
@@ -22,9 +22,9 @@ abstract class Test() {
|
||||
abstract var y1 : Int get
|
||||
abstract var y2 : Int set
|
||||
abstract var y3 : Int set get
|
||||
abstract var y4 : Int set get() = 1
|
||||
abstract var y5 : Int set(x) {} get() = 1
|
||||
abstract var y6 : Int set(x) {}
|
||||
abstract var y4 : Int set <!ABSTRACT_PROPERTY_WITH_GETTER!>get() = 1<!>
|
||||
abstract var y5 : Int <!ABSTRACT_PROPERTY_WITH_SETTER!>set(x) {}<!> <!ABSTRACT_PROPERTY_WITH_GETTER!>get() = 1<!>
|
||||
abstract var y6 : Int <!ABSTRACT_PROPERTY_WITH_SETTER!>set(x) {}<!>
|
||||
|
||||
var v : Int
|
||||
var v1 : Int get
|
||||
|
||||
@@ -17,7 +17,7 @@ class B(const val constructor: Int = 5)
|
||||
abstract class C {
|
||||
<!INCOMPATIBLE_MODIFIERS!>open<!> <!INCOMPATIBLE_MODIFIERS!>const<!> val x: Int = 6
|
||||
|
||||
<!INCOMPATIBLE_MODIFIERS!>abstract<!> <!INCOMPATIBLE_MODIFIERS!>const<!> val y: Int = 7
|
||||
<!INCOMPATIBLE_MODIFIERS!>abstract<!> <!INCOMPATIBLE_MODIFIERS!>const<!> val y: Int = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>7<!>
|
||||
|
||||
companion object {
|
||||
const val inCompaionObject = 8
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
interface My {
|
||||
private val x: Int
|
||||
<!PRIVATE_PROPERTY_IN_INTERFACE!>private<!> val x: Int
|
||||
<!INCOMPATIBLE_MODIFIERS!>private<!> <!INCOMPATIBLE_MODIFIERS!>abstract<!> val xx: Int
|
||||
private val xxx: Int
|
||||
get() = 0
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ interface Foo {
|
||||
expect class NonAbstractClass : Foo {
|
||||
abstract fun bar()
|
||||
|
||||
abstract val baz: Int
|
||||
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> val baz: Int
|
||||
|
||||
abstract override fun foo()
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ interface Test<in I, out O> {
|
||||
val internal_val: I
|
||||
public val public_val: I
|
||||
protected val protected_val: I
|
||||
private val private_val: I
|
||||
<!PRIVATE_PROPERTY_IN_INTERFACE!>private<!> val private_val: I
|
||||
|
||||
var interlan_private_set: O
|
||||
private set
|
||||
@@ -10,7 +10,7 @@ interface Test<in I, out O> {
|
||||
private set
|
||||
protected var protected_private_set: O
|
||||
private set
|
||||
private var private_private_set: O
|
||||
<!PRIVATE_PROPERTY_IN_INTERFACE!>private<!> var private_private_set: O
|
||||
private set
|
||||
|
||||
fun internal_fun(i: O) : I
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
abstract class Base() {
|
||||
abstract fun foo() = {}
|
||||
fun boo() : Unit
|
||||
abstract val a = ""
|
||||
abstract val a = <!ABSTRACT_PROPERTY_WITH_INITIALIZER!>""<!>
|
||||
val b
|
||||
var d
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user