FIR: handle unresolved modality as questionable

This commit is contained in:
Mikhail Glukhikh
2018-03-21 13:11:56 +03:00
parent 737ec37486
commit a99578c354
33 changed files with 101 additions and 76 deletions
@@ -45,7 +45,7 @@ class RawFirBuilder(val session: FirSession) {
} }
} }
private val KtDeclaration.modality: Modality private val KtDeclaration.modality: Modality?
get() { get() {
val modifierType = modalityModifierType() val modifierType = modalityModifierType()
return when (modifierType) { return when (modifierType) {
@@ -53,7 +53,7 @@ class RawFirBuilder(val session: FirSession) {
KtTokens.SEALED_KEYWORD -> Modality.SEALED KtTokens.SEALED_KEYWORD -> Modality.SEALED
KtTokens.ABSTRACT_KEYWORD -> Modality.ABSTRACT KtTokens.ABSTRACT_KEYWORD -> Modality.ABSTRACT
KtTokens.OPEN_KEYWORD -> Modality.OPEN KtTokens.OPEN_KEYWORD -> Modality.OPEN
else -> Modality.FINAL // FIX ME else -> null
} }
} }
@@ -106,6 +106,16 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
else -> toString() else -> toString()
} }
private fun FirMemberDeclaration.modalityAsString(): String {
return modality?.name?.toLowerCase() ?: run {
if (this is FirCallableMember && this.isOverride) {
"open?"
} else {
"final?"
}
}
}
override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration) { override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration) {
memberDeclaration.annotations.renderAnnotations() memberDeclaration.annotations.renderAnnotations()
if (memberDeclaration.typeParameters.isNotEmpty()) { if (memberDeclaration.typeParameters.isNotEmpty()) {
@@ -113,7 +123,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
memberDeclaration.typeParameters.renderSeparated() memberDeclaration.typeParameters.renderSeparated()
print("> ") print("> ")
} }
print(memberDeclaration.visibility.asString() + " " + memberDeclaration.modality.name.toLowerCase() + " ") print(memberDeclaration.visibility.asString() + " " + memberDeclaration.modalityAsString() + " ")
if (memberDeclaration is FirCallableMember && memberDeclaration.isOverride) { if (memberDeclaration is FirCallableMember && memberDeclaration.isOverride) {
print("override ") print("override ")
} }
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirMemberDeclaration : FirTypeParameterContainer, FirNamedDeclaration, FirAnnotationContainer { interface FirMemberDeclaration : FirTypeParameterContainer, FirNamedDeclaration, FirAnnotationContainer {
val visibility: Visibility val visibility: Visibility
val modality: Modality val modality: Modality?
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitMemberDeclaration(this, data) visitor.visitMemberDeclaration(this, data)
@@ -5,10 +5,13 @@
package org.jetbrains.kotlin.fir.declarations package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirDescriptorOwner import org.jetbrains.kotlin.fir.FirDescriptorOwner
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirResolvedClass : FirClass, FirDescriptorOwner<FirResolvedClass> { interface FirResolvedClass : FirClass, FirDescriptorOwner<FirResolvedClass> {
override val modality: Modality
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitResolvedClass(this, data) visitor.visitResolvedClass(this, data)
} }
@@ -5,10 +5,13 @@
package org.jetbrains.kotlin.fir.declarations package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirDescriptorOwner import org.jetbrains.kotlin.fir.FirDescriptorOwner
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirResolvedTypeAlias : FirTypeAlias, FirDescriptorOwner<FirResolvedTypeAlias> { interface FirResolvedTypeAlias : FirTypeAlias, FirDescriptorOwner<FirResolvedTypeAlias> {
override val modality: Modality
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitResolvedTypeAlias(this, data) visitor.visitResolvedTypeAlias(this, data)
} }
@@ -21,7 +21,7 @@ abstract class FirAbstractCallableMember(
psi: PsiElement?, psi: PsiElement?,
name: Name, name: Name,
visibility: Visibility, visibility: Visibility,
modality: Modality, modality: Modality?,
final override val isOverride: Boolean, final override val isOverride: Boolean,
final override var receiverType: FirType?, final override var receiverType: FirType?,
final override var returnType: FirType final override var returnType: FirType
@@ -18,7 +18,7 @@ abstract class FirAbstractMemberDeclaration(
psi: PsiElement?, psi: PsiElement?,
name: Name, name: Name,
final override val visibility: Visibility, final override val visibility: Visibility,
final override val modality: Modality final override val modality: Modality?
) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirMemberDeclaration { ) : FirAbstractNamedAnnotatedDeclaration(session, psi, name), FirMemberDeclaration {
final override val typeParameters = mutableListOf<FirTypeParameter>() final override val typeParameters = mutableListOf<FirTypeParameter>()
} }
@@ -22,7 +22,7 @@ open class FirClassImpl(
psi: PsiElement?, psi: PsiElement?,
name: Name, name: Name,
visibility: Visibility, visibility: Visibility,
modality: Modality, modality: Modality?,
final override val classKind: ClassKind, final override val classKind: ClassKind,
final override val isInner: Boolean, final override val isInner: Boolean,
final override val isCompanion: Boolean, final override val isCompanion: Boolean,
@@ -23,7 +23,7 @@ class FirMemberFunctionImpl(
psi: PsiElement?, psi: PsiElement?,
name: Name, name: Name,
visibility: Visibility, visibility: Visibility,
modality: Modality, modality: Modality?,
isOverride: Boolean, isOverride: Boolean,
override val isOperator: Boolean, override val isOperator: Boolean,
override val isInfix: Boolean, override val isInfix: Boolean,
@@ -23,7 +23,7 @@ class FirMemberPropertyImpl(
psi: PsiElement?, psi: PsiElement?,
name: Name, name: Name,
visibility: Visibility, visibility: Visibility,
modality: Modality, modality: Modality?,
isOverride: Boolean, isOverride: Boolean,
override val isConst: Boolean, override val isConst: Boolean,
receiverType: FirType?, receiverType: FirType?,
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.fir.declarations.impl package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirBasedDescriptor import org.jetbrains.kotlin.fir.FirBasedDescriptor
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirResolvedClass import org.jetbrains.kotlin.fir.declarations.FirResolvedClass
@@ -17,6 +19,9 @@ class FirResolvedClassImpl(val delegate: FirClass, override val descriptor: FirB
descriptor.bind(this) descriptor.bind(this)
} }
override val modality: Modality
get() = delegate.modality ?: if (classKind == ClassKind.INTERFACE) Modality.ABSTRACT else Modality.FINAL
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R { override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R {
return super<FirResolvedClass>.accept(visitor, data) return super<FirResolvedClass>.accept(visitor, data)
} }
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.declarations.impl package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirBasedDescriptor import org.jetbrains.kotlin.fir.FirBasedDescriptor
import org.jetbrains.kotlin.fir.declarations.FirResolvedTypeAlias import org.jetbrains.kotlin.fir.declarations.FirResolvedTypeAlias
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
@@ -13,6 +14,9 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor
class FirResolvedTypeAliasImpl(val delegate: FirTypeAlias, override val descriptor: FirBasedDescriptor<FirResolvedTypeAlias>) : class FirResolvedTypeAliasImpl(val delegate: FirTypeAlias, override val descriptor: FirBasedDescriptor<FirResolvedTypeAlias>) :
FirResolvedTypeAlias, FirTypeAlias by delegate { FirResolvedTypeAlias, FirTypeAlias by delegate {
override val modality: Modality
get() = delegate.modality ?: Modality.FINAL
init { init {
descriptor.bind(this) descriptor.bind(this)
} }
+1 -1
View File
@@ -1,5 +1,5 @@
FILE: F.kt FILE: F.kt
public? open class A() { public? open class A() {
} }
public? final class B() : A { public? final? class B() : A {
} }
@@ -5,8 +5,8 @@ FILE: NestedOfAliasedType.kt
} }
public? final typealias TA = A public? final typealias TA = A
public? final class B() : TA { public? final? class B() : TA {
public? final class NestedInB() : Nested { public? final? class NestedInB() : Nested {
} }
} }
@@ -7,8 +7,8 @@ FILE: NestedSuperType.kt
} }
} }
public? final class Your() : My { public? final? class Your() : My {
public? final class NestedThree() : NestedOne { public? final? class NestedThree() : NestedOne {
} }
} }
@@ -1,11 +1,11 @@
FILE: complexTypes.kt FILE: complexTypes.kt
<T, out S> public? final class C() { <T, out S> public? final? class C() {
<R, in P> public? final class D(inner) { <R, in P> public? final? class D(inner) {
} }
} }
public? final interface Test() { public? final? interface Test() {
public? final property x(val): a.b.C<out CharSequence, *>.D<in List<*>, *> public? final? property x(val): a.b.C<out CharSequence, *>.D<in List<*>, *>
public? get(): a.b.C<out CharSequence, *>.D<in List<*>, *> public? get(): a.b.C<out CharSequence, *>.D<in List<*>, *>
} }
@@ -3,10 +3,10 @@ FILE: derivedClass.kt
public? constructor(x: T) public? constructor(x: T)
} }
<T : Any> public? final class Derived() : Base<T> { <T : Any> public? final? class Derived() : Base<T> {
public? constructor(x: T)STUB public? constructor(x: T)STUB
} }
<T : Any> public? final function create(x: T): Derived<T> { <T : Any> public? final? function create(x: T): Derived<T> {
STUB STUB
} }
+8 -8
View File
@@ -1,5 +1,5 @@
FILE: enums.kt FILE: enums.kt
public? final enum class Order() { public? final? enum class Order() {
public? final enum entry FIRST() { public? final enum entry FIRST() {
} }
@@ -10,34 +10,34 @@ FILE: enums.kt
} }
} }
public? final enum class Planet() { public? final? enum class Planet() {
public? constructor(m: Double, r: Double) public? constructor(m: Double, r: Double)
public? final enum entry MERCURY() : Planet { public? final enum entry MERCURY() : Planet {
public? final override function sayHello(): <implicit> { public? open? override function sayHello(): <implicit> {
} }
} }
public? final enum entry VENERA() : Planet { public? final enum entry VENERA() : Planet {
public? final override function sayHello(): <implicit> { public? open? override function sayHello(): <implicit> {
} }
} }
public? final enum entry EARTH() : Planet { public? final enum entry EARTH() : Planet {
public? final override function sayHello(): <implicit> { public? open? override function sayHello(): <implicit> {
} }
} }
public? final property g(val): Double = STUB public? final? property g(val): Double = STUB
public? get(): Double public? get(): Double
public? abstract function sayHello(): <implicit> public? abstract function sayHello(): <implicit>
public? final object Companion(companion) { public? final? object Companion(companion) {
public? final const property G(val): <implicit> = STUB public? final? const property G(val): <implicit> = STUB
public? get(): <implicit> public? get(): <implicit>
} }
+6 -6
View File
@@ -1,22 +1,22 @@
FILE: enums2.kt FILE: enums2.kt
public? final interface Some() { public? final? interface Some() {
} }
public? final object O1() : Some { public? final? object O1() : Some {
} }
public? final object O2() : Some { public? final? object O2() : Some {
} }
public? final enum class SomeEnum() { public? final? enum class SomeEnum() {
public? constructor(x: Some) public? constructor(x: Some)
public? final enum entry FIRST() : SomeEnum { public? final enum entry FIRST() : SomeEnum {
public? final override function check(y: Some): Boolean { public? open? override function check(y: Some): Boolean {
STUB STUB
} }
} }
public? final enum entry SECOND() : SomeEnum { public? final enum entry SECOND() : SomeEnum {
public? final override function check(y: Some): Boolean { public? open? override function check(y: Some): Boolean {
STUB STUB
} }
@@ -1,9 +1,9 @@
FILE: functionTypes.kt FILE: functionTypes.kt
<T> public? final function simpleRun(f: ( (<no name provided>: T): Unit )): Unit { <T> public? final? function simpleRun(f: ( (<no name provided>: T): Unit )): Unit {
STUB STUB
} }
<T, R> public? final function simpleMapList<T>.(f: ( (<no name provided>: T): R )): R { <T, R> public? final? function simpleMapList<T>.(f: ( (<no name provided>: T): R )): R {
} }
<T> public? final function simpleWith(t: T, f: ( T.(): Unit )): Unit { <T> public? final? function simpleWith(t: T, f: ( T.(): Unit )): Unit {
STUB STUB
} }
@@ -1,7 +1,7 @@
FILE: genericFunctions.kt FILE: genericFunctions.kt
public? final interface Any() { public? final? interface Any() {
} }
<T : Any> public? final inline function safeAsAny.(): T? { <T : Any> public? final? inline function safeAsAny.(): T? {
STUB STUB
} }
public? abstract class Summator() { public? abstract class Summator() {
@@ -3,13 +3,13 @@ FILE: nestedClass.kt
public? constructor(s: String) public? constructor(s: String)
} }
public? final class Outer() { public? final? class Outer() {
public? final class Derived() : Base { public? final? class Derived() : Base {
public? constructor(s: String)STUB public? constructor(s: String)STUB
} }
public? final object Obj() : Base { public? final? object Obj() : Base {
} }
} }
@@ -1,26 +1,26 @@
FILE: simpleClass.kt FILE: simpleClass.kt
public? final interface SomeInterface() { public? final? interface SomeInterface() {
public? final function foo(x: Int, y: String): String public? final? function foo(x: Int, y: String): String
public? final property bar(val): Boolean public? final? property bar(val): Boolean
public? get(): Boolean public? get(): Boolean
} }
public? final class SomeClass() : SomeInterface { public? final? class SomeClass() : SomeInterface {
private final property baz(val): <implicit> = STUB private final? property baz(val): <implicit> = STUB
public? get(): <implicit> public? get(): <implicit>
public? final override function foo(x: Int, y: String): String { public? open? override function foo(x: Int, y: String): String {
} }
public? final override property bar(var): Boolean public? open? override property bar(var): Boolean
public? get(): <implicit> { public? get(): <implicit> {
STUB STUB
} }
public? set(value: Boolean): <implicit> { public? set(value: Boolean): <implicit> {
} }
public? final property fau(var): Double public? final? property fau(var): Double
public? get(): Double public? get(): Double
public? set(value: Double): R/kotlin.Unit/ public? set(value: Double): R/kotlin.Unit/
@@ -1,3 +1,3 @@
FILE: simpleFun.kt FILE: simpleFun.kt
public? final function foo(): <implicit> { public? final? function foo(): <implicit> {
} }
@@ -1,6 +1,6 @@
FILE: simpleTypeAlias.kt FILE: simpleTypeAlias.kt
public? final interface B() { public? final? interface B() {
} }
public? final typealias C = B public? final typealias C = B
public? final class D() : C { public? final? class D() : C {
} }
@@ -1,8 +1,8 @@
FILE: typeAliasWithGeneric.kt FILE: typeAliasWithGeneric.kt
public? open class A() { public? open class A() {
} }
<S, T : A> public? final interface B() { <S, T : A> public? final? interface B() {
} }
public? final typealias C = B<T, A> public? final typealias C = B<T, A>
public? final class D() : C<A> { public? final? class D() : C<A> {
} }
@@ -1,8 +1,8 @@
FILE: typeParameterVsNested.kt FILE: typeParameterVsNested.kt
public? final interface Some() { public? final? interface Some() {
} }
<T : Some> public? abstract class My() { <T : Some> public? abstract class My() {
public? final class T(inner) { public? final? class T(inner) {
} }
public? abstract property x(val): T public? abstract property x(val): T
@@ -16,7 +16,7 @@ FILE: typeParameterVsNested.kt
public? abstract property z(val): test.My.T public? abstract property z(val): test.My.T
public? get(): test.My.T public? get(): test.My.T
public? final class Some() : T { public? final? class Some() : T {
} }
} }
@@ -1,20 +1,20 @@
FILE: typeParameters.kt FILE: typeParameters.kt
<out T : Any> public? final interface List() { <out T : Any> public? final? interface List() {
public? final operator function get(index: Int): T public? final? operator function get(index: Int): T
public? final infix function concat(other: List<T>): List<T> public? final? infix function concat(other: List<T>): List<T>
} }
public? final typealias StringList = List<out String> public? final typealias StringList = List<out String>
public? final typealias AnyList = List<*> public? final typealias AnyList = List<*>
<out T : Any> public? abstract class AbstractList() : List<T> { <out T : Any> public? abstract class AbstractList() : List<T> {
} }
public? final class SomeList() : AbstractList<Int> { public? final? class SomeList() : AbstractList<Int> {
public? final override function get(index: Int): Int { public? open? override function get(index: Int): Int {
STUB STUB
} }
public? final override function concat(other: List<Int>): List<Int> { public? open? override function concat(other: List<Int>): List<Int> {
STUB STUB
} }
+1 -1
View File
@@ -6,7 +6,7 @@ FILE: NestedOfAliasedType.kt
} }
(resolved) public? final typealias TA = R/<root>.A/ (resolved) public? final typealias TA = R/<root>.A/
(resolved) public? final class B() : R/<root>.TA = <root>.A/ { (resolved) public? final class B() : R/<root>.TA = <root>.A/ {
public? final class NestedInB() : R/<root>.A.Nested/ { public? final? class NestedInB() : R/<root>.A.Nested/ {
} }
} }
+1 -1
View File
@@ -8,7 +8,7 @@ FILE: NestedSuperType.kt
} }
(resolved) public? final class Your() : R/p.My/ { (resolved) public? final class Your() : R/p.My/ {
public? final class NestedThree() : R/p.My.NestedOne/ { public? final? class NestedThree() : R/p.My.NestedOne/ {
} }
} }
@@ -1,9 +1,9 @@
FILE: NestedSuperType.kt FILE: NestedSuperType.kt
(resolved) public? final class A() : R/b.B/ { (resolved) public? final class A() : R/b.B/ {
public? final class NestedInA1() : R/b.B.NestedInB/ { public? final? class NestedInA1() : R/b.B.NestedInB/ {
} }
public? final class NestedInA2() : R/c.C.NestedInC/ { public? final? class NestedInA2() : R/c.C.NestedInC/ {
} }
} }
+7 -7
View File
@@ -1,26 +1,26 @@
FILE: simpleClass.kt FILE: simpleClass.kt
(resolved) public? final interface SomeInterface() { (resolved) public? abstract interface SomeInterface() {
public? final function foo(x: R/error: Failed to resolve qualified type/, y: R/error: Failed to resolve qualified type/): R/error: Failed to resolve qualified type/ public? final? function foo(x: R/error: Failed to resolve qualified type/, y: R/error: Failed to resolve qualified type/): R/error: Failed to resolve qualified type/
public? final property bar(val): R/error: Failed to resolve qualified type/ public? final? property bar(val): R/error: Failed to resolve qualified type/
public? get(): R/error: Failed to resolve qualified type/ public? get(): R/error: Failed to resolve qualified type/
} }
(resolved) public? final class SomeClass() : R/<root>.SomeInterface/ { (resolved) public? final class SomeClass() : R/<root>.SomeInterface/ {
private final property baz(val): R/error: Not supported: FirImplicitTypeImpl/ = STUB private final? property baz(val): R/error: Not supported: FirImplicitTypeImpl/ = STUB
public? get(): R/error: Not supported: FirImplicitTypeImpl/ public? get(): R/error: Not supported: FirImplicitTypeImpl/
public? final override function foo(x: R/error: Failed to resolve qualified type/, y: R/error: Failed to resolve qualified type/): R/error: Failed to resolve qualified type/ { public? open? override function foo(x: R/error: Failed to resolve qualified type/, y: R/error: Failed to resolve qualified type/): R/error: Failed to resolve qualified type/ {
} }
public? final override property bar(var): R/error: Failed to resolve qualified type/ public? open? override property bar(var): R/error: Failed to resolve qualified type/
public? get(): R/error: Not supported: FirImplicitTypeImpl/ { public? get(): R/error: Not supported: FirImplicitTypeImpl/ {
STUB STUB
} }
public? set(value: R/error: Failed to resolve qualified type/): R/error: Not supported: FirImplicitTypeImpl/ { public? set(value: R/error: Failed to resolve qualified type/): R/error: Not supported: FirImplicitTypeImpl/ {
} }
public? final property fau(var): R/error: Failed to resolve qualified type/ public? final? property fau(var): R/error: Failed to resolve qualified type/
public? get(): R/error: Failed to resolve qualified type/ public? get(): R/error: Failed to resolve qualified type/
public? set(value: R/error: Failed to resolve qualified type/): R/kotlin.Unit/ public? set(value: R/error: Failed to resolve qualified type/): R/kotlin.Unit/
+1 -1
View File
@@ -1,5 +1,5 @@
FILE: simpleTypeAlias.kt FILE: simpleTypeAlias.kt
(resolved) public? final interface B() { (resolved) public? abstract interface B() {
} }
(resolved) public? final typealias C = R/<root>.B/ (resolved) public? final typealias C = R/<root>.B/
(resolved) public? final class D() : R/<root>.C = <root>.B/ { (resolved) public? final class D() : R/<root>.C = <root>.B/ {