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, classKind,
isInner = classOrObject.hasModifier(KtTokens.INNER_KEYWORD), isInner = classOrObject.hasModifier(KtTokens.INNER_KEYWORD),
isCompanion = (classOrObject as? KtObjectDeclaration)?.isCompanion() == true, 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.extractAnnotationsTo(firClass)
classOrObject.extractTypeParametersTo(firClass) classOrObject.extractTypeParametersTo(firClass)
@@ -143,7 +143,20 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
if (memberDeclaration is FirCallableMember && memberDeclaration.isOverride) { if (memberDeclaration is FirCallableMember && memberDeclaration.isOverride) {
print("override ") 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) { if (memberDeclaration.isOperator) {
print("operator ") print("operator ")
} }
@@ -194,12 +207,6 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
override fun visitClass(klass: FirClass) { override fun visitClass(klass: FirClass) {
visitMemberDeclaration(klass) 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()) { if (klass.superTypes.isNotEmpty()) {
print(" : ") print(" : ")
klass.superTypes.renderSeparated() klass.superTypes.renderSeparated()
@@ -27,6 +27,8 @@ interface FirClass : FirDeclarationContainer, FirMemberDeclaration, FirSymbolOwn
val isData: Boolean val isData: Boolean
val isInline: Boolean
override val symbol: FirClassSymbol override val symbol: FirClassSymbol
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = 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 classKind: ClassKind,
final override val isInner: Boolean, final override val isInner: Boolean,
final override val isCompanion: 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 { ) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality, platformStatus), FirClass {
init { init {
@@ -32,7 +32,8 @@ class FirEnumEntryImpl(
classKind = ClassKind.ENUM_ENTRY, classKind = ClassKind.ENUM_ENTRY,
isInner = false, isInner = false,
isCompanion = false, isCompanion = false,
isData = false isData = false,
isInline = false
), FirEnumEntry { ), FirEnumEntry {
override val arguments = mutableListOf<FirExpression>() override val arguments = mutableListOf<FirExpression>()
} }
+2 -2
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 {
} }
@@ -1,12 +1,12 @@
FILE: NestedOfAliasedType.kt FILE: NestedOfAliasedType.kt
public? abstract class A() { public? abstract class A {
public? abstract class Nested() { public? abstract class Nested {
} }
} }
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 {
} }
} }
@@ -1,14 +1,14 @@
FILE: NestedSuperType.kt FILE: NestedSuperType.kt
public? abstract class My() { public? abstract class My {
public? abstract class NestedOne() : My { public? abstract class NestedOne : My {
public? abstract class NestedTwo() : NestedOne { public? abstract class NestedTwo : NestedOne {
} }
} }
} }
public? final class Your() : My { public? final class Your : My {
public? final class NestedThree() : NestedOne { public? final class NestedThree : NestedOne {
} }
} }
@@ -1,10 +1,10 @@
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 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? 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<*>, *>
@@ -1,9 +1,9 @@
FILE: derivedClass.kt FILE: derivedClass.kt
<T> public? open class Base() { <T> public? open class Base {
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): super(STUB) public? constructor(x: T): super(STUB)
} }
+9 -9
View File
@@ -1,31 +1,31 @@
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 {
} }
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? constructor(m: Double, r: Double)
public? final enum entry MERCURY() : Planet { public? final enum entry MERCURY : Planet {
public? open? override function sayHello(): <implicit> { 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? open? override function sayHello(): <implicit> {
} }
} }
public? final enum entry EARTH() : Planet { public? final enum entry EARTH : Planet {
public? open? override function sayHello(): <implicit> { public? open? override function sayHello(): <implicit> {
} }
@@ -36,7 +36,7 @@ FILE: enums.kt
public? abstract function sayHello(): <implicit> public? abstract function sayHello(): <implicit>
public? final object Companion(companion) { public? final companion object 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,21 +1,21 @@
FILE: enums2.kt 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? constructor(x: Some)
public? final enum entry FIRST() : SomeEnum { public? final enum entry FIRST : SomeEnum {
public? open? 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? open? override function check(y: Some): Boolean { public? open? override function check(y: Some): Boolean {
STUB STUB
} }
@@ -1,10 +1,10 @@
FILE: expectActual.kt FILE: expectActual.kt
public? final expect class MyClass() { public? final expect class MyClass {
} }
public? final? expect function foo(): String public? final? expect function foo(): String
public? final? expect property x(val): Int public? final? expect property x(val): Int
public? get(): Int public? get(): Int
public? final actual class MyClass() { public? final actual class MyClass {
} }
public? final? actual function foo(): <implicit> { public? final? actual function foo(): <implicit> {
STUB STUB
@@ -1,10 +1,10 @@
FILE: genericFunctions.kt FILE: genericFunctions.kt
public? abstract interface Any() { public? abstract interface Any {
} }
<reified T : Any> public? final? inline function safeAs Any.(): T? { <reified T : Any> public? final? inline function safeAs Any.(): T? {
STUB STUB
} }
public? abstract class Summator() { public? abstract class Summator {
<T> public? abstract function plus(first: T, second: T): T <T> public? abstract function plus(first: T, second: T): T
} }
@@ -1,15 +1,15 @@
FILE: nestedClass.kt FILE: nestedClass.kt
public? abstract class Base() { public? abstract class Base {
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): super(STUB) 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) {} set(value) {}
lateinit var fau: Double lateinit var fau: Double
} }
inline class InlineClass
@@ -1,12 +1,12 @@
FILE: simpleClass.kt FILE: simpleClass.kt
public? abstract interface SomeInterface() { public? abstract 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>
@@ -25,3 +25,5 @@ FILE: simpleClass.kt
public? set(value: Double): R|kotlin/Unit| public? set(value: Double): R|kotlin/Unit|
} }
public? final inline class InlineClass {
}
@@ -1,6 +1,6 @@
FILE: simpleTypeAlias.kt FILE: simpleTypeAlias.kt
public? abstract interface B() { public? abstract 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? abstract interface B() { <S, T : A> public? abstract interface B {
} }
<T> public? final typealias C = B<T, A> <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 FILE: typeParameterVsNested.kt
public? abstract interface Some() { public? abstract interface Some {
} }
<T : Some> public? abstract class My() { <T : Some> public? abstract class My {
public? final class T(inner) { public? final inner class T {
} }
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,5 +1,5 @@
FILE: typeParameters.kt 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? 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>
@@ -7,9 +7,9 @@ FILE: typeParameters.kt
} }
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? open? override function get(index: Int): Int { public? open? override function get(index: Int): Int {
STUB STUB
} }
+2 -2
View File
@@ -1,5 +1,5 @@
FILE: F.kt 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 FILE: NestedOfAliasedType.kt
public? abstract class A() { public? abstract class A {
public? abstract class Nested() { public? abstract class Nested {
} }
} }
public? final typealias TA = R|A| public? final typealias TA = R|A|
public? final class B() : R|TA = A| { public? final class B : R|TA = A| {
public? final class NestedInB() : R|A.Nested| { public? final class NestedInB : R|A.Nested| {
} }
} }
+5 -5
View File
@@ -1,14 +1,14 @@
FILE: NestedSuperType.kt FILE: NestedSuperType.kt
public? abstract class My() { public? abstract class My {
public? abstract class NestedOne() : R|p/My| { public? abstract class NestedOne : R|p/My| {
public? abstract class NestedTwo() : R|p/My.NestedOne| { public? abstract class NestedTwo : R|p/My.NestedOne| {
} }
} }
} }
public? final class Your() : R|p/My| { public? final class Your : R|p/My| {
public? final class NestedThree() : R|p/My.NestedOne| { public? final class NestedThree : R|p/My.NestedOne| {
} }
} }
@@ -1,5 +1,5 @@
FILE: TwoDeclarationsInSameFile.kt 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 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| { public? final? function convert R|kotlin/collections/List<kotlin/String>|.(): R|MyStringList| {
STUB STUB
+6 -6
View File
@@ -1,21 +1,21 @@
FILE: enum.kt 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? 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| { public? open? override function check(y: R|Some|): R|kotlin/Boolean| {
STUB 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| { public? open? override function check(y: R|Some|): R|kotlin/Boolean| {
STUB STUB
} }
+2 -2
View File
@@ -1,5 +1,5 @@
FILE: ft.kt 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| { <T> public? final? function simpleWith(t: R|T|, f: R|T.() -> kotlin/Unit|): R|kotlin/Unit| {
STUB 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 FILE: genericFunctions.kt
public? abstract interface Any() { public? abstract interface Any {
} }
<reified T : Any> public? final? inline function safeAs R|Any|.(): R|T| { <reified T : Any> public? final? inline function safeAs R|Any|.(): R|T| {
STUB STUB
} }
public? abstract class Summator() { public? abstract class Summator {
<T> public? abstract function plus(first: R|T|, second: R|T|): R|T| <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: Annotations.kt
@FILE:R|annotations/Simple|() @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/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| @R|annotations/Complex|(STUB, STUB) public? abstract property v(val): R|kotlin/String|
public? get(): 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? constructor(y: R|kotlin/Char|): super()
public? open? override function foo(arg: R|kotlin/Double|): R|error: Not supported: FirImplicitTypeImpl| { public? open? override function foo(arg: R|kotlin/Double|): R|error: Not supported: FirImplicitTypeImpl| {
@@ -1,9 +1,9 @@
FILE: NestedSuperType.kt FILE: NestedSuperType.kt
public? final class A() : R|b/B| { 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| {
} }
} }
@@ -1,3 +1,3 @@
FILE: TypeAliasExpansion.kt 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 FILE: sealedStarImport.kt
public? abstract class Factory() { public? abstract class Factory {
public? abstract function createTest(): R|error: Symbol not found| public? abstract function createTest(): R|error: Symbol not found|
public? abstract function createObj(): R|test/Test.O| public? abstract function createObj(): R|test/Test.O|
@@ -1,3 +1,3 @@
FILE: simpleAliasedImport.kt 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 FILE: simpleImport.kt
public? final class YourClass() : R|b/MyClass| { public? final class YourClass : R|b/MyClass| {
} }
@@ -1,3 +1,3 @@
FILE: simpleImportNested.kt 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 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 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? function foo(x: R|kotlin/Int|, y: R|kotlin/String|): R|kotlin/String|
public? final? property bar(val): R|kotlin/Boolean| public? final? property bar(val): R|kotlin/Boolean|
public? get(): 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 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|
+2 -2
View File
@@ -1,6 +1,6 @@
FILE: simpleTypeAlias.kt FILE: simpleTypeAlias.kt
public? abstract interface B() { public? abstract interface B {
} }
public? final typealias C = R|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 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>| <T> public? final typealias C = R|B<T, A>|
+4 -4
View File
@@ -1,8 +1,8 @@
FILE: typeParameterVsNested.kt FILE: typeParameterVsNested.kt
public? abstract interface Some() { public? abstract interface Some {
} }
<T : R|test/Some|> public? abstract class My() { <T : R|test/Some|> public? abstract class My {
public? final class T(inner) { public? final inner class T {
} }
public? abstract property x(val): R|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? abstract property z(val): R|test/My.T|
public? get(): 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| {
} }
} }