FIR: support inline classes + render class attributes nicer

This commit is contained in:
Mikhail Glukhikh
2018-03-26 19:01:43 +03:00
parent 124c11df08
commit 5c53bdb142
42 changed files with 131 additions and 115 deletions
@@ -291,7 +291,8 @@ class RawFirBuilder(val session: FirSession) {
classKind,
isInner = classOrObject.hasModifier(KtTokens.INNER_KEYWORD),
isCompanion = (classOrObject as? KtObjectDeclaration)?.isCompanion() == true,
isData = (classOrObject as? KtClass)?.isData() == true
isData = (classOrObject as? KtClass)?.isData() == true,
isInline = classOrObject.hasModifier(KtTokens.INLINE_KEYWORD)
)
classOrObject.extractAnnotationsTo(firClass)
classOrObject.extractTypeParametersTo(firClass)
@@ -143,7 +143,20 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
if (memberDeclaration is FirCallableMember && memberDeclaration.isOverride) {
print("override ")
}
if (memberDeclaration is FirNamedFunction) {
if (memberDeclaration is FirClass) {
if (memberDeclaration.isInner) {
print("inner ")
}
if (memberDeclaration.isCompanion) {
print("companion ")
}
if (memberDeclaration.isData) {
print("data ")
}
if (memberDeclaration.isInline) {
print("inline ")
}
} else if (memberDeclaration is FirNamedFunction) {
if (memberDeclaration.isOperator) {
print("operator ")
}
@@ -194,12 +207,6 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
override fun visitClass(klass: FirClass) {
visitMemberDeclaration(klass)
val attributes = listOfNotNull(
"inner".takeIf { klass.isInner },
"companion".takeIf { klass.isCompanion },
"data".takeIf { klass.isData }
)
print(attributes.joinToString(prefix = "(", postfix = ")"))
if (klass.superTypes.isNotEmpty()) {
print(" : ")
klass.superTypes.renderSeparated()
@@ -27,6 +27,8 @@ interface FirClass : FirDeclarationContainer, FirMemberDeclaration, FirSymbolOwn
val isData: Boolean
val isInline: Boolean
override val symbol: FirClassSymbol
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
@@ -30,7 +30,8 @@ open class FirClassImpl(
final override val classKind: ClassKind,
final override val isInner: Boolean,
final override val isCompanion: Boolean,
final override val isData: Boolean
final override val isData: Boolean,
override val isInline: Boolean
) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality, platformStatus), FirClass {
init {
@@ -32,7 +32,8 @@ class FirEnumEntryImpl(
classKind = ClassKind.ENUM_ENTRY,
isInner = false,
isCompanion = false,
isData = false
isData = false,
isInline = false
), FirEnumEntry {
override val arguments = mutableListOf<FirExpression>()
}
+2 -2
View File
@@ -1,5 +1,5 @@
FILE: F.kt
public? open class A() {
public? open class A {
}
public? final class B() : A {
public? final class B : A {
}
@@ -1,12 +1,12 @@
FILE: NestedOfAliasedType.kt
public? abstract class A() {
public? abstract class Nested() {
public? abstract class A {
public? abstract class Nested {
}
}
public? final typealias TA = A
public? final class B() : TA {
public? final class NestedInB() : Nested {
public? final class B : TA {
public? final class NestedInB : Nested {
}
}
@@ -1,14 +1,14 @@
FILE: NestedSuperType.kt
public? abstract class My() {
public? abstract class NestedOne() : My {
public? abstract class NestedTwo() : NestedOne {
public? abstract class My {
public? abstract class NestedOne : My {
public? abstract class NestedTwo : NestedOne {
}
}
}
public? final class Your() : My {
public? final class NestedThree() : NestedOne {
public? final class Your : My {
public? final class NestedThree : NestedOne {
}
}
@@ -1,10 +1,10 @@
FILE: complexTypes.kt
<T, out S> public? final class C() {
<R, in P> public? final class D(inner) {
<T, out S> public? final class C {
<R, in P> public? final inner class D {
}
}
public? abstract interface Test() {
public? abstract interface Test {
public? final? property x(val): a.b.C<out CharSequence, *>.D<in List<*>, *>
public? get(): a.b.C<out CharSequence, *>.D<in List<*>, *>
@@ -1,9 +1,9 @@
FILE: derivedClass.kt
<T> public? open class Base() {
<T> public? open class Base {
public? constructor(x: T)
}
<T : Any> public? final class Derived() : Base<T> {
<T : Any> public? final class Derived : Base<T> {
public? constructor(x: T): super(STUB)
}
+9 -9
View File
@@ -1,31 +1,31 @@
FILE: enums.kt
public? final enum class Order() {
public? final enum entry FIRST() {
public? final enum class Order {
public? final enum entry FIRST {
}
public? final enum entry SECOND() {
public? final enum entry SECOND {
}
public? final enum entry THIRD() {
public? final enum entry THIRD {
}
}
public? final enum class Planet() {
public? final enum class Planet {
public? constructor(m: Double, r: Double)
public? final enum entry MERCURY() : Planet {
public? final enum entry MERCURY : Planet {
public? open? override function sayHello(): <implicit> {
}
}
public? final enum entry VENERA() : Planet {
public? final enum entry VENERA : Planet {
public? open? override function sayHello(): <implicit> {
}
}
public? final enum entry EARTH() : Planet {
public? final enum entry EARTH : Planet {
public? open? override function sayHello(): <implicit> {
}
@@ -36,7 +36,7 @@ FILE: enums.kt
public? abstract function sayHello(): <implicit>
public? final object Companion(companion) {
public? final companion object Companion {
public? final? const property G(val): <implicit> = STUB
public? get(): <implicit>
+6 -6
View File
@@ -1,21 +1,21 @@
FILE: enums2.kt
public? abstract interface Some() {
public? abstract 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? final enum entry FIRST() : SomeEnum {
public? final enum entry FIRST : SomeEnum {
public? open? override function check(y: Some): Boolean {
STUB
}
}
public? final enum entry SECOND() : SomeEnum {
public? final enum entry SECOND : SomeEnum {
public? open? override function check(y: Some): Boolean {
STUB
}
@@ -1,10 +1,10 @@
FILE: expectActual.kt
public? final expect class MyClass() {
public? final expect class MyClass {
}
public? final? expect function foo(): String
public? final? expect property x(val): Int
public? get(): Int
public? final actual class MyClass() {
public? final actual class MyClass {
}
public? final? actual function foo(): <implicit> {
STUB
@@ -1,10 +1,10 @@
FILE: genericFunctions.kt
public? abstract interface Any() {
public? abstract interface Any {
}
<reified T : Any> public? final? inline function safeAs Any.(): T? {
STUB
}
public? abstract class Summator() {
public? abstract class Summator {
<T> public? abstract function plus(first: T, second: T): T
}
@@ -1,15 +1,15 @@
FILE: nestedClass.kt
public? abstract class Base() {
public? abstract class Base {
public? constructor(s: String)
}
public? final class Outer() {
public? final class Derived() : Base {
public? final class Outer {
public? final class Derived : Base {
public? constructor(s: String): super(STUB)
}
public? final object Obj() : Base {
public? final object Obj : Base {
}
}
@@ -16,4 +16,6 @@ class SomeClass : SomeInterface {
set(value) {}
lateinit var fau: Double
}
}
inline class InlineClass
@@ -1,12 +1,12 @@
FILE: simpleClass.kt
public? abstract interface SomeInterface() {
public? abstract interface SomeInterface {
public? final? function foo(x: Int, y: String): String
public? final? property bar(val): Boolean
public? get(): Boolean
}
public? final class SomeClass() : SomeInterface {
public? final class SomeClass : SomeInterface {
private final? property baz(val): <implicit> = STUB
public? get(): <implicit>
@@ -25,3 +25,5 @@ FILE: simpleClass.kt
public? set(value: Double): R|kotlin/Unit|
}
public? final inline class InlineClass {
}
@@ -1,6 +1,6 @@
FILE: simpleTypeAlias.kt
public? abstract interface B() {
public? abstract interface B {
}
public? final typealias C = B
public? final class D() : C {
public? final class D : C {
}
@@ -1,8 +1,8 @@
FILE: typeAliasWithGeneric.kt
public? open class A() {
public? open class A {
}
<S, T : A> public? abstract interface B() {
<S, T : A> public? abstract interface B {
}
<T> 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
public? abstract interface Some() {
public? abstract interface Some {
}
<T : Some> public? abstract class My() {
public? final class T(inner) {
<T : Some> public? abstract class My {
public? final inner class T {
}
public? abstract property x(val): T
@@ -16,7 +16,7 @@ FILE: typeParameterVsNested.kt
public? abstract property z(val): test.My.T
public? get(): test.My.T
public? final class Some() : T {
public? final class Some : T {
}
}
@@ -1,5 +1,5 @@
FILE: typeParameters.kt
<out T : Any> public? abstract interface List() {
<out T : Any> public? abstract interface List {
public? final? operator function get(index: Int): T
public? final? infix function concat(other: List<T>): List<T>
@@ -7,9 +7,9 @@ FILE: typeParameters.kt
}
public? final typealias StringList = List<out String>
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? open? override function get(index: Int): Int {
STUB
}
+2 -2
View File
@@ -1,5 +1,5 @@
FILE: F.kt
public? open class A() {
public? open class A {
}
public? final class B() : R|A| {
public? final class B : R|A| {
}
+4 -4
View File
@@ -1,12 +1,12 @@
FILE: NestedOfAliasedType.kt
public? abstract class A() {
public? abstract class Nested() {
public? abstract class A {
public? abstract class Nested {
}
}
public? final typealias TA = R|A|
public? final class B() : R|TA = A| {
public? final class NestedInB() : R|A.Nested| {
public? final class B : R|TA = A| {
public? final class NestedInB : R|A.Nested| {
}
}
+5 -5
View File
@@ -1,14 +1,14 @@
FILE: NestedSuperType.kt
public? abstract class My() {
public? abstract class NestedOne() : R|p/My| {
public? abstract class NestedTwo() : R|p/My.NestedOne| {
public? abstract class My {
public? abstract class NestedOne : R|p/My| {
public? abstract class NestedTwo : R|p/My.NestedOne| {
}
}
}
public? final class Your() : R|p/My| {
public? final class NestedThree() : R|p/My.NestedOne| {
public? final class Your : R|p/My| {
public? final class NestedThree : R|p/My.NestedOne| {
}
}
@@ -1,5 +1,5 @@
FILE: TwoDeclarationsInSameFile.kt
public? open class A() {
public? open class A {
}
public? final class B() : R|p/A| {
public? final class B : R|p/A| {
}
+2 -2
View File
@@ -1,7 +1,7 @@
FILE: lists.kt
public? abstract class MyStringList() : R|kotlin/collections/List<kotlin/String>| {
public? abstract class MyStringList : R|kotlin/collections/List<kotlin/String>| {
}
public? abstract class MyMutableStringList() : R|kotlin/collections/MutableList<kotlin/String>| {
public? abstract class MyMutableStringList : R|kotlin/collections/MutableList<kotlin/String>| {
}
public? final? function convert R|kotlin/collections/List<kotlin/String>|.(): R|MyStringList| {
STUB
+6 -6
View File
@@ -1,21 +1,21 @@
FILE: enum.kt
public? abstract interface Some() {
public? abstract interface Some {
}
public? final object O1() : R|Some| {
public? final object O1 : R|Some| {
}
public? final object O2() : R|Some| {
public? final object O2 : R|Some| {
}
public? final enum class SomeEnum() {
public? final enum class SomeEnum {
public? constructor(x: R|Some|)
public? final enum entry FIRST() : R|SomeEnum| {
public? final enum entry FIRST : R|SomeEnum| {
public? open? override function check(y: R|Some|): R|kotlin/Boolean| {
STUB
}
}
public? final enum entry SECOND() : R|SomeEnum| {
public? final enum entry SECOND : R|SomeEnum| {
public? open? override function check(y: R|Some|): R|kotlin/Boolean| {
STUB
}
+2 -2
View File
@@ -1,5 +1,5 @@
FILE: ft.kt
<T> public? abstract interface KMutableProperty1() : R|KProperty1<T>| {
<T> public? abstract interface KMutableProperty1 : R|KProperty1<T>| {
}
<T> public? abstract interface KProperty1() : R|(T) -> kotlin/Int| {
<T> public? abstract interface KProperty1 : R|(T) -> kotlin/Int| {
}
+4 -4
View File
@@ -7,11 +7,11 @@ FILE: functionTypes.kt
<T> public? final? function simpleWith(t: R|T|, f: R|T.() -> kotlin/Unit|): R|kotlin/Unit| {
STUB
}
<T, R> public? abstract interface KMutableProperty1() : R|KProperty1<T, R>|, R|KMutableProperty<R>| {
<T, R> public? abstract interface KMutableProperty1 : R|KProperty1<T, R>|, R|KMutableProperty<R>| {
}
<T, out R> public? abstract interface KProperty1() : R|KProperty<R>|, R|(T) -> R| {
<T, out R> public? abstract interface KProperty1 : R|KProperty<R>|, R|(T) -> R| {
}
<out R> public? abstract interface KProperty() {
<out R> public? abstract interface KProperty {
}
<R> public? abstract interface KMutableProperty() {
<R> public? abstract interface KMutableProperty {
}
+2 -2
View File
@@ -1,10 +1,10 @@
FILE: genericFunctions.kt
public? abstract interface Any() {
public? abstract interface Any {
}
<reified T : Any> public? final? inline function safeAs R|Any|.(): R|T| {
STUB
}
public? abstract class Summator() {
public? abstract class Summator {
<T> public? abstract function plus(first: R|T|, second: R|T|): R|T|
}
+2 -2
View File
@@ -1,13 +1,13 @@
FILE: Annotations.kt
@FILE:R|annotations/Simple|()
@R|annotations/WithInt|(STUB) public? abstract class First() {
@R|annotations/WithInt|(STUB) public? abstract class First {
@R|annotations/Simple|() public? abstract function foo(@WithString(STUB) arg: @R|annotations/Simple|() R|kotlin/Double|): R|error: Not supported: FirImplicitTypeImpl|
@R|annotations/Complex|(STUB, STUB) public? abstract property v(val): R|kotlin/String|
public? get(): R|kotlin/String|
}
@R|annotations/WithString|(STUB) public? final class Second() : @R|annotations/WithInt|(STUB) R|test/First| {
@R|annotations/WithString|(STUB) public? final class Second : @R|annotations/WithInt|(STUB) R|test/First| {
public? constructor(y: R|kotlin/Char|): super()
public? open? override function foo(arg: R|kotlin/Double|): R|error: Not supported: FirImplicitTypeImpl| {
@@ -1,9 +1,9 @@
FILE: NestedSuperType.kt
public? final class A() : R|b/B| {
public? final class NestedInA1() : R|b/B.NestedInB| {
public? final class A : R|b/B| {
public? final class NestedInA1 : R|b/B.NestedInB| {
}
public? final class NestedInA2() : R|c/C.NestedInC| {
public? final class NestedInA2 : R|c/C.NestedInC| {
}
}
@@ -1,3 +1,3 @@
FILE: TypeAliasExpansion.kt
public? final class MyClass() : R|b/TA = b/A| {
public? final class MyClass : R|b/TA = b/A| {
}
@@ -1,5 +1,5 @@
FILE: sealedStarImport.kt
public? abstract class Factory() {
public? abstract class Factory {
public? abstract function createTest(): R|error: Symbol not found|
public? abstract function createObj(): R|test/Test.O|
@@ -1,3 +1,3 @@
FILE: simpleAliasedImport.kt
public? final class YourClass() : R|b/MyClass| {
public? final class YourClass : R|b/MyClass| {
}
+1 -1
View File
@@ -1,3 +1,3 @@
FILE: simpleImport.kt
public? final class YourClass() : R|b/MyClass| {
public? final class YourClass : R|b/MyClass| {
}
@@ -1,3 +1,3 @@
FILE: simpleImportNested.kt
public? final class YourClass() : R|a/MyClass.MyNested| {
public? final class YourClass : R|a/MyClass.MyNested| {
}
@@ -1,3 +1,3 @@
FILE: simpleImportOuter.kt
public? final class My() : R|a/Outer.Nested| {
public? final class My : R|a/Outer.Nested| {
}
+2 -2
View File
@@ -1,12 +1,12 @@
FILE: simpleClass.kt
public? abstract interface SomeInterface() {
public? abstract interface SomeInterface {
public? final? function foo(x: R|kotlin/Int|, y: R|kotlin/String|): R|kotlin/String|
public? final? property bar(val): R|kotlin/Boolean|
public? get(): R|kotlin/Boolean|
}
public? final class SomeClass() : R|SomeInterface| {
public? final class SomeClass : R|SomeInterface| {
private final? property baz(val): R|error: Not supported: FirImplicitTypeImpl| = STUB
public? get(): R|error: Not supported: FirImplicitTypeImpl|
+2 -2
View File
@@ -1,6 +1,6 @@
FILE: simpleTypeAlias.kt
public? abstract interface B() {
public? abstract interface B {
}
public? final typealias C = R|B|
public? final class D() : R|C = B| {
public? final class D : R|C = B| {
}
+3 -3
View File
@@ -1,8 +1,8 @@
FILE: typeAliasWithGeneric.kt
public? open class A() {
public? open class A {
}
<S, T : R|A|> public? abstract interface B() {
<S, T : R|A|> public? abstract interface B {
}
public? final class D() : R|C<A> = B<T, A>| {
public? final class D : R|C<A> = B<T, A>| {
}
<T> public? final typealias C = R|B<T, A>|
+4 -4
View File
@@ -1,8 +1,8 @@
FILE: typeParameterVsNested.kt
public? abstract interface Some() {
public? abstract interface Some {
}
<T : R|test/Some|> public? abstract class My() {
public? final class T(inner) {
<T : R|test/Some|> public? abstract class My {
public? final inner class T {
}
public? abstract property x(val): R|T|
@@ -16,7 +16,7 @@ FILE: typeParameterVsNested.kt
public? abstract property z(val): R|test/My.T|
public? get(): R|test/My.T|
public? final class Some() : R|test/My.T| {
public? final class Some : R|test/My.T| {
}
}