Raw FIR: support a bunch of new elements + some fixes

Support: calls, constructor calls, annotation calls, arguments
Support: enums, primary constructors, const modifier
Support: inner modifier, qualified types
Add: some base transformed types
Fix: acceptChildren etc.
Progress: #KT-24013
This commit is contained in:
Simon Ogorodnik
2018-03-20 01:14:31 +03:00
committed by Mikhail Glukhikh
parent 2ddf52123a
commit 3e06f426d0
84 changed files with 914 additions and 176 deletions
@@ -16,11 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirBody
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirAnnotationCallImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirBlockBodyImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionBodyImpl
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub
import org.jetbrains.kotlin.fir.types.FirUserType
import org.jetbrains.kotlin.fir.expressions.impl.*
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.impl.*
@@ -70,14 +66,17 @@ class RawFirBuilder(val session: FirSession) {
this.accept(this@Visitor, Unit) as R
private fun KtTypeReference?.toFirOrImplicitType(): FirType =
convertSafe<FirUserType>() ?: FirImplicitTypeImpl(session, this)
convertSafe() ?: FirImplicitTypeImpl(session, this)
private fun KtTypeReference?.toFirOrErrorType(): FirType =
convertSafe<FirUserType>() ?: FirErrorTypeImpl(session, this, false)
convertSafe() ?: FirErrorTypeImpl(session, this, false, if (this == null) "Incomplete code" else "Conversion failed")
private fun KtExpression?.toFirBody(): FirBody? =
convertSafe<FirExpression>()?.let { it as? FirBody ?: FirExpressionBodyImpl(session, it) }
private fun KtExpression?.toFirExpression(): FirExpression =
convertSafe() ?: FirErrorExpressionImpl(session, this)
private fun KtPropertyAccessor?.toFirPropertyAccessor(
property: KtProperty,
propertyType: FirType,
@@ -143,6 +142,59 @@ class RawFirBuilder(val session: FirSession) {
}
}
private fun KtCallElement.extractArgumentsTo(container: FirAbstractCall) {
for (argument in this.valueArguments) {
container.arguments += argument.getArgumentExpression().toFirExpression()
}
}
private fun KtClassOrObject.extractSuperTypeListEntriesTo(container: FirClassImpl) {
var superTypeCallEntry: KtSuperTypeCallEntry? = null
for (superTypeListEntry in superTypeListEntries) {
when (superTypeListEntry) {
is KtSuperTypeEntry -> {
container.superTypes += superTypeListEntry.typeReference.toFirOrErrorType()
}
is KtSuperTypeCallEntry -> {
container.superTypes += superTypeListEntry.calleeExpression.typeReference.toFirOrErrorType()
superTypeCallEntry = superTypeListEntry
}
is KtDelegatedSuperTypeEntry -> {
val type = superTypeListEntry.typeReference.toFirOrErrorType()
container.superTypes += FirDelegatedTypeImpl(
type,
superTypeListEntry.delegateExpression.convertSafe()
)
}
}
}
val firPrimaryConstructor = primaryConstructor?.toFirConstructor(superTypeCallEntry) ?: return
container.declarations += firPrimaryConstructor
}
private fun KtPrimaryConstructor.toFirConstructor(superTypeCallEntry: KtSuperTypeCallEntry?): FirConstructor {
val constructorCallee = superTypeCallEntry?.calleeExpression
val firDelegatedCall = constructorCallee?.let {
FirDelegatedConstructorCallImpl(
session,
constructorCallee,
FirErrorTypeImpl(session, constructorCallee, false, "Not implemented yet"),
isThis = false
).apply {
superTypeCallEntry.extractArgumentsTo(this)
}
}
val firConstructor = FirPrimaryConstructorImpl(
session,
this,
visibility,
firDelegatedCall
)
extractAnnotationsTo(firConstructor)
extractValueParametersTo(firConstructor)
return firConstructor
}
override fun visitKtFile(file: KtFile, data: Unit): FirElement {
val firFile = FirFileImpl(session, file, file.name, file.packageFqName)
for (annotationEntry in file.annotationEntries) {
@@ -163,6 +215,20 @@ class RawFirBuilder(val session: FirSession) {
return firFile
}
override fun visitEnumEntry(enumEntry: KtEnumEntry, data: Unit): FirElement {
val firEnumEntry = FirEnumEntryImpl(
session,
enumEntry,
enumEntry.nameAsSafeName
)
enumEntry.extractAnnotationsTo(firEnumEntry)
enumEntry.extractSuperTypeListEntriesTo(firEnumEntry)
for (declaration in enumEntry.declarations) {
firEnumEntry.declarations += declaration.convert<FirDeclaration>()
}
return firEnumEntry
}
override fun visitClassOrObject(classOrObject: KtClassOrObject, data: Unit): FirElement {
val classKind = when (classOrObject) {
is KtObjectDeclaration -> ClassKind.OBJECT
@@ -181,29 +247,13 @@ class RawFirBuilder(val session: FirSession) {
classOrObject.visibility,
classOrObject.modality,
classKind,
isInner = classOrObject.hasModifier(KtTokens.INNER_KEYWORD),
isCompanion = (classOrObject as? KtObjectDeclaration)?.isCompanion() == true,
isData = (classOrObject as? KtClass)?.isData() == true
)
classOrObject.extractAnnotationsTo(firClass)
classOrObject.extractTypeParametersTo(firClass)
for (superTypeListEntry in classOrObject.superTypeListEntries) {
when (superTypeListEntry) {
is KtSuperTypeEntry -> {
firClass.superTypes += superTypeListEntry.typeReference.toFirOrErrorType()
}
is KtSuperTypeCallEntry -> {
firClass.superTypes += superTypeListEntry.calleeExpression.typeReference.toFirOrErrorType()
// TODO: primary constructor!
}
is KtDelegatedSuperTypeEntry -> {
val type = superTypeListEntry.typeReference.toFirOrErrorType()
firClass.superTypes += FirDelegatedTypeImpl(
type,
superTypeListEntry.delegateExpression.convertSafe()
)
}
}
}
classOrObject.extractSuperTypeListEntriesTo(firClass)
for (declaration in classOrObject.declarations) {
firClass.declarations += declaration.convert<FirDeclaration>()
}
@@ -223,6 +273,11 @@ class RawFirBuilder(val session: FirSession) {
}
override fun visitNamedFunction(function: KtNamedFunction, data: Unit): FirElement {
if (function.name == null) {
// TODO: return anonymous function here
// TODO: what if name is not null but we're in expression position?
return FirExpressionStub(session, function)
}
val firFunction = FirMemberFunctionImpl(
session,
function,
@@ -246,15 +301,27 @@ class RawFirBuilder(val session: FirSession) {
}
override fun visitSecondaryConstructor(constructor: KtSecondaryConstructor, data: Unit): FirElement {
val firConstructor = FirSecondaryConstructorImpl(
val firConstructor = FirConstructorImpl(
session,
constructor,
constructor.visibility,
constructor.getDelegationCall().convert(),
constructor.bodyExpression.toFirBody()
)
constructor.extractAnnotationsTo(firConstructor)
constructor.extractValueParametersTo(firConstructor)
return super.visitSecondaryConstructor(constructor, data)
return firConstructor
}
override fun visitConstructorDelegationCall(call: KtConstructorDelegationCall, data: Unit): FirElement {
val firConstructorCall = FirDelegatedConstructorCallImpl(
session,
call,
FirErrorTypeImpl(session, call, false, "Not implemented yet"),
call.isCallToThis || call.isImplicit
)
call.extractArgumentsTo(firConstructorCall)
return firConstructorCall
}
override fun visitAnonymousInitializer(initializer: KtAnonymousInitializer, data: Unit): FirElement {
@@ -274,6 +341,7 @@ class RawFirBuilder(val session: FirSession) {
property.visibility,
property.modality,
property.hasModifier(KtTokens.OVERRIDE_KEYWORD),
property.hasModifier(KtTokens.CONST_KEYWORD),
property.receiverTypeReference.convertSafe(),
propertyType,
property.isVar,
@@ -298,18 +366,25 @@ class RawFirBuilder(val session: FirSession) {
val firType = when (unwrappedElement) {
is KtDynamicType -> FirDynamicTypeImpl(session, typeReference, isNullable)
is KtUserType -> {
val referenceExpression = unwrappedElement.referenceExpression
var referenceExpression = unwrappedElement.referenceExpression
if (referenceExpression != null) {
val userType = FirUserTypeImpl(
session, typeReference, isNullable,
referenceExpression.getReferencedNameAsName()
session, typeReference, isNullable
)
for (typeArgument in unwrappedElement.typeArguments) {
userType.arguments += typeArgument.convert<FirTypeProjection>()
}
var qualifier: KtUserType? = unwrappedElement
do {
val firQualifier = FirQualifierPartImpl(referenceExpression!!.getReferencedNameAsName())
for (typeArgument in qualifier!!.typeArguments) {
firQualifier.typeArguments += typeArgument.convert<FirTypeProjection>()
}
userType.qualifier.add(0, firQualifier)
qualifier = qualifier.qualifier
referenceExpression = qualifier?.referenceExpression
} while (referenceExpression != null)
userType
} else {
FirErrorTypeImpl(session, typeReference, isNullable)
FirErrorTypeImpl(session, typeReference, isNullable, "Incomplete user type")
}
}
is KtFunctionType -> {
@@ -325,7 +400,7 @@ class RawFirBuilder(val session: FirSession) {
}
functionType
}
null -> FirErrorTypeImpl(session, typeReference, isNullable)
null -> FirErrorTypeImpl(session, typeReference, isNullable, "Unwrapped type is null")
else -> throw AssertionError("Unexpected type element: ${unwrappedElement.text}")
}
@@ -336,12 +411,14 @@ class RawFirBuilder(val session: FirSession) {
}
override fun visitAnnotationEntry(annotationEntry: KtAnnotationEntry, data: Unit): FirElement {
return FirAnnotationCallImpl(
val firAnnotationCall = FirAnnotationCallImpl(
session,
annotationEntry,
annotationEntry.useSiteTarget?.getAnnotationUseSiteTarget(),
annotationEntry.typeReference.toFirOrErrorType()
)
annotationEntry.extractArgumentsTo(firAnnotationCall)
return firAnnotationCall
}
override fun visitTypeParameter(parameter: KtTypeParameter, data: Unit): FirElement {
@@ -22,11 +22,13 @@ interface FirElement {
fun accept(visitor: FirVisitorVoid) =
accept(visitor, null)
fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {}
fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
fun acceptChildren(visitor: FirVisitorVoid) =
acceptChildren(visitor, null)
fun <E : FirElement, D> transform(visitor: FirTransformer<D>, data: D): CompositeTransformResult<E> =
accept(visitor, data) as CompositeTransformResult<E>
CompositeTransformResult(accept(visitor, data))
fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement = this
}
@@ -118,7 +118,12 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
if (memberDeclaration.isInline) {
print("inline ")
}
} else if (memberDeclaration is FirProperty) {
if (memberDeclaration.isConst) {
print("const ")
}
}
visitNamedDeclaration(memberDeclaration)
}
@@ -130,7 +135,7 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
override fun visitDeclaration(declaration: FirDeclaration) {
print(
when (declaration) {
is FirClass -> "class"
is FirClass -> declaration.classKind.name.toLowerCase().replace("_", " ")
is FirTypeAlias -> "typealias"
is FirNamedFunction -> "function"
is FirProperty -> "property"
@@ -146,6 +151,7 @@ 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 }
)
@@ -203,6 +209,9 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
constructor.valueParameters.renderParameters()
constructor.delegatedConstructor?.accept(this)
constructor.body?.accept(this)
if (constructor.body == null) {
println()
}
}
override fun visitPropertyAccessor(propertyAccessor: FirPropertyAccessor) {
@@ -306,8 +315,8 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
visitCall(annotationCall)
}
override fun visitConstructorCall(constructorCall: FirConstructorCall) {
visitCall(constructorCall)
override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) {
visitCall(delegatedConstructorCall)
}
override fun visitType(type: FirType) {
@@ -365,11 +374,16 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
override fun visitUserType(userType: FirUserType) {
userType.annotations.renderAnnotations()
print(userType.name)
if (userType.arguments.isNotEmpty()) {
print("<")
userType.arguments.renderSeparated()
print(">")
for ((index, qualifier) in userType.qualifier.withIndex()) {
if (index != 0) {
print(".")
}
print(qualifier.name)
if (qualifier.typeArguments.isNotEmpty()) {
print("<")
qualifier.typeArguments.renderSeparated()
print(">")
}
}
visitTypeWithNullability(userType)
}
@@ -0,0 +1,30 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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
import org.jetbrains.kotlin.fir.visitors.FirTransformer
fun <T : FirElement, D> MutableList<T>.transformInplace(transformer: FirTransformer<D>, data: D) {
val iterator = this.listIterator()
while (iterator.hasNext()) {
val next = iterator.next()
val result = next.transform<T, D>(transformer, data)
if (result.isSingle) {
iterator.set(result.single)
} else {
val resultIterator = result.list.listIterator()
if (!resultIterator.hasNext()) {
iterator.remove()
} else {
iterator.set(resultIterator.next())
}
while (resultIterator.hasNext()) {
iterator.add(resultIterator.next())
}
}
}
}
@@ -18,7 +18,7 @@ interface FirCallableMember : @VisitedSupertype FirDeclaration, FirMemberDeclara
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitCallableMember(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
receiverType?.accept(visitor, data)
super<FirMemberDeclaration>.acceptChildren(visitor, data)
returnType.accept(visitor, data)
@@ -6,17 +6,21 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirVisitor
// May be all containers should be properties and not base classes
// About descriptors: introduce something like FirDescriptor which is FirUnresolved at the beginning and FirSymbol(descriptor) at the end
@BaseTransformedType
interface FirClass : FirDeclarationContainer, FirMemberDeclaration {
// including delegated types
val superTypes: List<FirType>
val classKind: ClassKind
val isInner: Boolean
val isCompanion: Boolean
val isData: Boolean
@@ -24,7 +28,7 @@ interface FirClass : FirDeclarationContainer, FirMemberDeclaration {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitClass(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super.acceptChildren(visitor, data)
for (superType in superTypes) {
superType.accept(visitor, data)
@@ -6,21 +6,26 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.expressions.FirAnnotationContainer
import org.jetbrains.kotlin.fir.expressions.FirConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirConstructor : FirFunction, FirAnnotationContainer {
val delegatedConstructor: FirConstructorCall?
val delegatedConstructor: FirDelegatedConstructorCall?
val visibility: Visibility
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitConstructor(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
acceptAnnotations(visitor, data)
delegatedConstructor?.accept(visitor, data)
super.acceptChildren(visitor, data)
for (parameter in valueParameters) {
parameter.accept(visitor, data)
}
body?.accept(visitor, data)
}
}
@@ -14,7 +14,7 @@ interface FirDeclarationWithBody : FirDeclaration {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitDeclarationWithBody(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
body?.accept(visitor, data)
super.acceptChildren(visitor, data)
}
@@ -5,19 +5,20 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.expressions.FirCall
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirEnumEntry : FirClass {
val arguments: List<FirExpression>
@BaseTransformedType
interface FirEnumEntry : @VisitedSupertype FirClass, FirCall {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitEnumEntry(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
for (argument in arguments) {
argument.accept(visitor, data)
}
super.acceptChildren(visitor, data)
super<FirClass>.acceptChildren(visitor, data)
}
}
@@ -5,11 +5,13 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.expressions.FirAnnotationContainer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.name.FqName
@BaseTransformedType
interface FirFile : @VisitedSupertype FirPackageFragment, FirDeclaration, FirAnnotationContainer {
val name: String
@@ -20,7 +22,7 @@ interface FirFile : @VisitedSupertype FirPackageFragment, FirDeclaration, FirAnn
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitFile(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
acceptAnnotations(visitor, data)
for (import in imports) {
import.accept(visitor, data)
@@ -15,7 +15,7 @@ interface FirFunction : FirDeclarationWithBody, FirAnnotationContainer {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitFunction(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
acceptAnnotations(visitor, data)
for (parameter in valueParameters) {
parameter.accept(visitor, data)
@@ -18,7 +18,7 @@ interface FirMemberDeclaration : FirTypeParameterContainer, FirNamedDeclaration,
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitMemberDeclaration(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
acceptAnnotations(visitor, data)
for (typeParameter in typeParameters) {
typeParameter.accept(visitor, data)
@@ -5,9 +5,11 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirNamedFunction : @VisitedSupertype FirFunction, FirCallableMember {
val isOperator: Boolean
@@ -18,8 +20,11 @@ interface FirNamedFunction : @VisitedSupertype FirFunction, FirCallableMember {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitNamedFunction(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super<FirCallableMember>.acceptChildren(visitor, data)
super<FirFunction>.acceptChildren(visitor, data)
for (parameter in valueParameters) {
parameter.accept(visitor, data)
}
body?.accept(visitor, data)
}
}
@@ -12,7 +12,7 @@ interface FirPackageFragment : FirElement, FirDeclarationContainer {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitPackageFragment(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
for (declaration in declarations) {
declaration.accept(visitor, data)
}
@@ -5,13 +5,17 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirVariable
import org.jetbrains.kotlin.fir.visitors.FirVisitor
// May be should not inherit FirVariable
@BaseTransformedType
interface FirProperty : @VisitedSupertype FirDeclaration, FirCallableMember, FirVariable {
val isConst: Boolean
// Should it be nullable or have some default?
val getter: FirPropertyAccessor
@@ -22,7 +26,7 @@ interface FirProperty : @VisitedSupertype FirDeclaration, FirCallableMember, Fir
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitProperty(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super<FirCallableMember>.acceptChildren(visitor, data)
initializer?.accept(visitor, data)
delegate?.accept(visitor, data)
@@ -19,8 +19,11 @@ interface FirPropertyAccessor : @VisitedSupertype FirFunction, FirTypedDeclarati
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitPropertyAccessor(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super<FirTypedDeclaration>.acceptChildren(visitor, data)
super<FirFunction>.acceptChildren(visitor, data)
for (parameter in valueParameters) {
parameter.accept(visitor, data)
}
body?.accept(visitor, data)
}
}
@@ -5,18 +5,16 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.expressions.FirAnnotationContainer
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirTypeAlias : FirMemberDeclaration, FirAnnotationContainer {
interface FirTypeAlias : FirMemberDeclaration {
val abbreviatedType: FirType
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitTypeAlias(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
acceptAnnotations(visitor, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super.acceptChildren(visitor, data)
abbreviatedType.accept(visitor, data)
}
@@ -5,11 +5,13 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.expressions.FirAnnotationContainer
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.types.Variance
@BaseTransformedType
interface FirTypeParameter : FirNamedDeclaration, FirAnnotationContainer {
val variance: Variance
@@ -18,7 +20,7 @@ interface FirTypeParameter : FirNamedDeclaration, FirAnnotationContainer {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitTypeParameter(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
acceptAnnotations(visitor, data)
super.acceptChildren(visitor, data)
for (bound in bounds) {
@@ -15,7 +15,7 @@ interface FirTypedDeclaration : FirDeclaration, FirAnnotationContainer {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitTypedDeclaration(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
acceptAnnotations(visitor, data)
super.acceptChildren(visitor, data)
returnType.accept(visitor, data)
@@ -5,10 +5,12 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.VisitedSupertype
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirValueParameter : @VisitedSupertype FirDeclaration, FirTypedDeclaration, FirNamedDeclaration {
val isCrossinline: Boolean
@@ -21,7 +23,7 @@ interface FirValueParameter : @VisitedSupertype FirDeclaration, FirTypedDeclarat
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitValueParameter(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super<FirTypedDeclaration>.acceptChildren(visitor, data)
defaultValue?.accept(visitor, data)
}
@@ -12,20 +12,32 @@ import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirClassImpl(
open class FirClassImpl(
session: FirSession,
psi: PsiElement?,
name: Name,
visibility: Visibility,
modality: Modality,
override val classKind: ClassKind,
override val isCompanion: Boolean,
override val isData: Boolean
final override val classKind: ClassKind,
final override val isInner: Boolean,
final override val isCompanion: Boolean,
final override val isData: Boolean
) : FirAbstractMemberDeclaration(session, psi, name, visibility, modality), FirClass {
override val superTypes = mutableListOf<FirType>()
override val declarations = mutableListOf<FirDeclaration>()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirClass {
typeParameters.transformInplace(transformer, data)
superTypes.transformInplace(transformer, data)
declarations.transformInplace(transformer, data)
return this
}
}
@@ -10,12 +10,12 @@ import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.expressions.FirBody
import org.jetbrains.kotlin.fir.expressions.FirConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
class FirSecondaryConstructorImpl(
open class FirConstructorImpl(
session: FirSession,
psi: PsiElement?,
override val visibility: Visibility,
override val delegatedConstructor: FirConstructorCall?,
final override val visibility: Visibility,
final override val delegatedConstructor: FirDelegatedConstructorCall?,
body: FirBody?
) : FirAbstractFunction(session, psi, body), FirConstructor
@@ -0,0 +1,33 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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.declarations.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.name.Name
class FirEnumEntryImpl(
session: FirSession,
psi: PsiElement?,
name: Name
) : FirClassImpl(
session,
psi,
name,
visibility = Visibilities.UNKNOWN,
modality = Modality.FINAL,
classKind = ClassKind.ENUM_ENTRY,
isInner = false,
isCompanion = false,
isData = false
), FirEnumEntry {
override val arguments = mutableListOf<FirExpression>()
}
@@ -6,11 +6,14 @@
package org.jetbrains.kotlin.fir.declarations.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirImport
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.fir.transformInplace
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirFileImpl(
session: FirSession,
@@ -21,4 +24,10 @@ class FirFileImpl(
override val imports = mutableListOf<FirImport>()
override val declarations = mutableListOf<FirDeclaration>()
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
imports.transformInplace(transformer, data)
declarations.transformInplace(transformer, data)
return this
}
}
@@ -22,6 +22,7 @@ class FirMemberPropertyImpl(
visibility: Visibility,
modality: Modality,
isOverride: Boolean,
override val isConst: Boolean,
receiverType: FirType?,
returnType: FirType,
override val isVar: Boolean,
@@ -0,0 +1,18 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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.declarations.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
class FirPrimaryConstructorImpl(
session: FirSession,
psi: PsiElement?,
visibility: Visibility,
delegatedConstructor: FirDelegatedConstructorCall?
) : FirConstructorImpl(session, psi, visibility, delegatedConstructor, body = null)
@@ -6,9 +6,11 @@
package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirAnnotationCall : FirCall {
val annotationType: FirType
@@ -18,7 +20,7 @@ interface FirAnnotationCall : FirCall {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitAnnotationCall(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
annotationType.accept(visitor, data)
super.acceptChildren(visitor, data)
}
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirAnnotationContainer {
val annotations: List<FirAnnotationCall>
fun <D> acceptAnnotations(visitor: FirVisitor<Unit, D>, data: D) {
fun <R, D> acceptAnnotations(visitor: FirVisitor<R, D>, data: D) {
for (annotation in annotations) {
annotation.accept(visitor, data)
}
@@ -15,7 +15,7 @@ interface FirBody : FirExpression {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitBody(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
for (statement in statements) {
statement.accept(visitor, data)
}
@@ -5,15 +5,17 @@
package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirCall : FirExpression {
val arguments: List<FirExpression>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitCall(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
for (argument in arguments) {
argument.accept(visitor, data)
}
@@ -6,15 +6,22 @@
package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.types.FirTypeProjectionContainer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirConstructorCall : FirCall {
interface FirDelegatedConstructorCall : FirCall, FirTypeProjectionContainer {
// Do we need 'constructedType: FirType' here?
val constructedType: FirType
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitConstructorCall(this, data)
val isThis: Boolean
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
val isSuper: Boolean
get() = !isThis
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitDelegatedConstructorCall(this, data)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
constructedType.accept(visitor, data)
super.acceptChildren(visitor, data)
}
@@ -0,0 +1,8 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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.expressions
interface FirErrorExpression : FirExpression
@@ -5,9 +5,11 @@
package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirStatement : FirElement {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitStatement(this, data)
@@ -22,7 +22,7 @@ interface FirVariable : @VisitedSupertype FirDeclaration, FirTypedDeclaration, F
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitVariable(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
initializer?.accept(visitor, data)
super<FirTypedDeclaration>.acceptChildren(visitor, data)
}
@@ -0,0 +1,18 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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.expressions.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
abstract class FirAbstractCall(
final override val session: FirSession,
final override val psi: PsiElement?
) : FirCall {
final override val arguments = mutableListOf<FirExpression>()
}
@@ -13,10 +13,8 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.types.FirType
class FirAnnotationCallImpl(
override val session: FirSession,
override val psi: PsiElement?,
session: FirSession,
psi: PsiElement?,
override val useSiteTarget: AnnotationUseSiteTarget?,
override val annotationType: FirType
) : FirAnnotationCall {
override val arguments = mutableListOf<FirExpression>()
}
) : FirAbstractCall(session, psi), FirAnnotationCall
@@ -0,0 +1,21 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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.expressions.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.types.FirType
import org.jetbrains.kotlin.fir.types.FirTypeProjection
class FirDelegatedConstructorCallImpl(
session: FirSession,
psi: PsiElement?,
override val constructedType: FirType,
override val isThis: Boolean
) : FirAbstractCall(session, psi), FirDelegatedConstructorCall {
override val typeArguments = mutableListOf<FirTypeProjection>()
}
@@ -0,0 +1,15 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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.expressions.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirErrorExpression
class FirErrorExpressionImpl(
override val session: FirSession,
override val psi: PsiElement?
) : FirErrorExpression
@@ -16,7 +16,7 @@ interface FirDelegatedType : FirType {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitDelegatedType(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super.acceptChildren(visitor, data)
delegate?.accept(visitor, data)
}
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirErrorType : FirType {
val reason: String
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitErrorType(this, data)
}
@@ -19,7 +19,7 @@ interface FirFunctionType : FirTypeWithNullability {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitFunctionType(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
receiverType?.accept(visitor, data)
super.acceptChildren(visitor, data)
for (parameter in valueParameters) {
@@ -5,15 +5,17 @@
package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotationContainer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirType : FirElement, FirAnnotationContainer {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitType(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
acceptAnnotations(visitor, data)
super.acceptChildren(visitor, data)
}
@@ -5,9 +5,11 @@
package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.fir.BaseTransformedType
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.visitors.FirVisitor
@BaseTransformedType
interface FirTypeProjection : FirElement {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitTypeProjection(this, data)
@@ -6,5 +6,5 @@
package org.jetbrains.kotlin.fir.types
interface FirTypeProjectionContainer {
val arguments: List<FirTypeProjection>
val typeArguments: List<FirTypeProjection>
}
@@ -16,7 +16,7 @@ interface FirTypeProjectionWithVariance : FirTypeProjection {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitTypeProjectionWithVariance(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
type.accept(visitor, data)
super.acceptChildren(visitor, data)
}
@@ -8,16 +8,22 @@ package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.name.Name
interface FirUserType : FirTypeWithNullability, FirTypeProjectionContainer {
interface FirQualifierPart : FirTypeProjectionContainer {
val name: Name
}
interface FirUserType : FirTypeWithNullability {
val qualifier: List<FirQualifierPart>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitUserType(this, data)
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
super.acceptChildren(visitor, data)
for (argument in arguments) {
argument.accept(visitor, data)
for (qualifier in qualifier.reversed()) {
for (argument in qualifier.typeArguments) {
argument.accept(visitor, data)
}
}
}
}
@@ -18,7 +18,7 @@ class FirDelegatedTypeImpl(
return super<FirDelegatedType>.accept(visitor, data)
}
override fun <D> acceptChildren(visitor: FirVisitor<Unit, D>, data: D) {
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
type.acceptChildren(visitor, data)
delegate?.accept(visitor, data)
}
@@ -13,7 +13,8 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor
class FirErrorTypeImpl(
session: FirSession,
psi: PsiElement?,
isNullable: Boolean
isNullable: Boolean,
override val reason: String
) : FirAbstractAnnotatedType(session, psi, isNullable), FirErrorType {
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R {
return super<FirErrorType>.accept(visitor, data)
@@ -0,0 +1,14 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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.types.impl
import org.jetbrains.kotlin.fir.types.FirQualifierPart
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.name.Name
class FirQualifierPartImpl(override val name: Name) : FirQualifierPart {
override val typeArguments = mutableListOf<FirTypeProjection>()
}
@@ -7,15 +7,14 @@ package org.jetbrains.kotlin.fir.types.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.types.FirQualifierPart
import org.jetbrains.kotlin.fir.types.FirUserType
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.name.Name
import java.util.*
class FirUserTypeImpl(
session: FirSession,
psi: PsiElement?,
isNullable: Boolean,
override val name: Name
isNullable: Boolean
) : FirAbstractAnnotatedType(session, psi, isNullable), FirUserType {
override val arguments = mutableListOf<FirTypeProjection>()
override val qualifier = LinkedList<FirQualifierPart>()
}
@@ -32,4 +32,5 @@ inline class CompositeTransformResult<out T : Any>(val a: Any) {
}
}
inline fun <reified T : FirElement> T.compose() = CompositeTransformResult.single(this)
@Suppress("NOTHING_TO_INLINE")
inline fun <T : FirElement> T.compose() = CompositeTransformResult.single(this)
@@ -1,10 +1,10 @@
/*
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* Copyright 2010-2018 JetBrains s.r.o. 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.visitors
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.types.*
@@ -26,10 +26,7 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformDeclaration(declarationWithBody, data)
}
open fun transformAnonymousInitializer(
anonymousInitializer: FirAnonymousInitializer,
data: D
): CompositeTransformResult<FirDeclaration> {
open fun transformAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer, data: D): CompositeTransformResult<FirDeclaration> {
return transformDeclarationWithBody(anonymousInitializer, data)
}
@@ -101,82 +98,83 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformElement(packageFragment, data)
}
open fun <E : FirPackageFragment> transformFile(file: E, data: D): CompositeTransformResult<E> {
open fun transformFile(file: FirFile, data: D): CompositeTransformResult<FirFile> {
return transformPackageFragment(file, data)
}
open fun <E : FirElement> transformStatement(statement: E, data: D): CompositeTransformResult<E> {
open fun transformStatement(statement: FirStatement, data: D): CompositeTransformResult<FirStatement> {
return transformElement(statement, data)
}
open fun <E : FirStatement> transformExpression(expression: E, data: D): CompositeTransformResult<E> {
open fun transformExpression(expression: FirExpression, data: D): CompositeTransformResult<FirStatement> {
return transformStatement(expression, data)
}
open fun <E : FirExpression> transformBody(body: E, data: D): CompositeTransformResult<E> {
open fun transformBody(body: FirBody, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(body, data)
}
open fun <E : FirExpression> transformCall(call: E, data: D): CompositeTransformResult<E> {
open fun transformCall(call: FirCall, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(call, data)
}
open fun <E : FirCall> transformAnnotationCall(annotationCall: E, data: D): CompositeTransformResult<E> {
open fun transformAnnotationCall(annotationCall: FirAnnotationCall, data: D): CompositeTransformResult<FirStatement> {
return transformCall(annotationCall, data)
}
open fun <E : FirCall> transformConstructorCall(constructorCall: E, data: D): CompositeTransformResult<E> {
return transformCall(constructorCall, data)
open fun transformDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): CompositeTransformResult<FirStatement> {
return transformCall(delegatedConstructorCall, data)
}
open fun <E : FirElement> transformType(type: E, data: D): CompositeTransformResult<E> {
open fun transformErrorExpression(errorExpression: FirErrorExpression, data: D): CompositeTransformResult<FirStatement> {
return transformExpression(errorExpression, data)
}
open fun transformType(type: FirType, data: D): CompositeTransformResult<FirType> {
return transformElement(type, data)
}
open fun <E : FirType> transformDelegatedType(delegatedType: E, data: D): CompositeTransformResult<E> {
open fun transformDelegatedType(delegatedType: FirDelegatedType, data: D): CompositeTransformResult<FirType> {
return transformType(delegatedType, data)
}
open fun <E : FirType> transformErrorType(errorType: E, data: D): CompositeTransformResult<E> {
open fun transformErrorType(errorType: FirErrorType, data: D): CompositeTransformResult<FirType> {
return transformType(errorType, data)
}
open fun <E : FirType> transformImplicitType(implicitType: E, data: D): CompositeTransformResult<E> {
open fun transformImplicitType(implicitType: FirImplicitType, data: D): CompositeTransformResult<FirType> {
return transformType(implicitType, data)
}
open fun <E : FirType> transformTypeWithNullability(typeWithNullability: E, data: D): CompositeTransformResult<E> {
open fun transformTypeWithNullability(typeWithNullability: FirTypeWithNullability, data: D): CompositeTransformResult<FirType> {
return transformType(typeWithNullability, data)
}
open fun <E : FirTypeWithNullability> transformDynamicType(dynamicType: E, data: D): CompositeTransformResult<E> {
open fun transformDynamicType(dynamicType: FirDynamicType, data: D): CompositeTransformResult<FirType> {
return transformTypeWithNullability(dynamicType, data)
}
open fun <E : FirTypeWithNullability> transformFunctionType(functionType: E, data: D): CompositeTransformResult<E> {
open fun transformFunctionType(functionType: FirFunctionType, data: D): CompositeTransformResult<FirType> {
return transformTypeWithNullability(functionType, data)
}
open fun <E : FirTypeWithNullability> transformResolvedType(resolvedType: E, data: D): CompositeTransformResult<E> {
open fun transformResolvedType(resolvedType: FirResolvedType, data: D): CompositeTransformResult<FirType> {
return transformTypeWithNullability(resolvedType, data)
}
open fun <E : FirTypeWithNullability> transformUserType(userType: E, data: D): CompositeTransformResult<E> {
open fun transformUserType(userType: FirUserType, data: D): CompositeTransformResult<FirType> {
return transformTypeWithNullability(userType, data)
}
open fun <E : FirElement> transformTypeProjection(typeProjection: E, data: D): CompositeTransformResult<E> {
open fun transformTypeProjection(typeProjection: FirTypeProjection, data: D): CompositeTransformResult<FirTypeProjection> {
return transformElement(typeProjection, data)
}
open fun <E : FirTypeProjection> transformStarProjection(starProjection: E, data: D): CompositeTransformResult<E> {
open fun transformStarProjection(starProjection: FirStarProjection, data: D): CompositeTransformResult<FirTypeProjection> {
return transformTypeProjection(starProjection, data)
}
open fun <E : FirTypeProjection> transformTypeProjectionWithVariance(
typeProjectionWithVariance: E,
data: D
): CompositeTransformResult<E> {
open fun transformTypeProjectionWithVariance(typeProjectionWithVariance: FirTypeProjectionWithVariance, data: D): CompositeTransformResult<FirTypeProjection> {
return transformTypeProjection(typeProjectionWithVariance, data)
}
@@ -192,10 +190,7 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformDeclaration(declaration, data)
}
final override fun visitDeclarationWithBody(
declarationWithBody: FirDeclarationWithBody,
data: D
): CompositeTransformResult<FirElement> {
final override fun visitDeclarationWithBody(declarationWithBody: FirDeclarationWithBody, data: D): CompositeTransformResult<FirElement> {
return transformDeclarationWithBody(declarationWithBody, data)
}
@@ -235,10 +230,7 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformTypeProjection(typeProjection, data)
}
final override fun visitTypeWithNullability(
typeWithNullability: FirTypeWithNullability,
data: D
): CompositeTransformResult<FirElement> {
final override fun visitTypeWithNullability(typeWithNullability: FirTypeWithNullability, data: D): CompositeTransformResult<FirElement> {
return transformTypeWithNullability(typeWithNullability, data)
}
@@ -246,8 +238,8 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformAnnotationCall(annotationCall, data)
}
final override fun visitConstructorCall(constructorCall: FirConstructorCall, data: D): CompositeTransformResult<FirElement> {
return transformConstructorCall(constructorCall, data)
final override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): CompositeTransformResult<FirElement> {
return transformDelegatedConstructorCall(delegatedConstructorCall, data)
}
final override fun visitEnumEntry(enumEntry: FirEnumEntry, data: D): CompositeTransformResult<FirElement> {
@@ -278,10 +270,7 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformVariable(variable, data)
}
final override fun visitAnonymousInitializer(
anonymousInitializer: FirAnonymousInitializer,
data: D
): CompositeTransformResult<FirElement> {
final override fun visitAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer, data: D): CompositeTransformResult<FirElement> {
return transformAnonymousInitializer(anonymousInitializer, data)
}
@@ -293,6 +282,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformBody(body, data)
}
final override fun visitErrorExpression(errorExpression: FirErrorExpression, data: D): CompositeTransformResult<FirElement> {
return transformErrorExpression(errorExpression, data)
}
final override fun visitConstructor(constructor: FirConstructor, data: D): CompositeTransformResult<FirElement> {
return transformConstructor(constructor, data)
}
@@ -333,10 +326,7 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformStarProjection(starProjection, data)
}
final override fun visitTypeProjectionWithVariance(
typeProjectionWithVariance: FirTypeProjectionWithVariance,
data: D
): CompositeTransformResult<FirElement> {
final override fun visitTypeProjectionWithVariance(typeProjectionWithVariance: FirTypeProjectionWithVariance, data: D): CompositeTransformResult<FirElement> {
return transformTypeProjectionWithVariance(typeProjectionWithVariance, data)
}
@@ -122,8 +122,12 @@ abstract class FirVisitor<out R, in D> {
return visitCall(annotationCall, data)
}
open fun visitConstructorCall(constructorCall: FirConstructorCall, data: D): R {
return visitCall(constructorCall, data)
open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): R {
return visitCall(delegatedConstructorCall, data)
}
open fun visitErrorExpression(errorExpression: FirErrorExpression, data: D): R {
return visitExpression(errorExpression, data)
}
open fun visitType(type: FirType, data: D): R {
@@ -122,8 +122,12 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitCall(annotationCall, null)
}
open fun visitConstructorCall(constructorCall: FirConstructorCall) {
visitCall(constructorCall, null)
open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) {
visitCall(delegatedConstructorCall, null)
}
open fun visitErrorExpression(errorExpression: FirErrorExpression) {
visitExpression(errorExpression, null)
}
open fun visitType(type: FirType) {
@@ -234,8 +238,8 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitAnnotationCall(annotationCall)
}
final override fun visitConstructorCall(constructorCall: FirConstructorCall, data: Nothing?) {
visitConstructorCall(constructorCall)
final override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: Nothing?) {
visitDelegatedConstructorCall(delegatedConstructorCall)
}
final override fun visitEnumEntry(enumEntry: FirEnumEntry, data: Nothing?) {
@@ -278,6 +282,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitBody(body)
}
final override fun visitErrorExpression(errorExpression: FirErrorExpression, data: Nothing?) {
visitErrorExpression(errorExpression)
}
final override fun visitConstructor(constructor: FirConstructor, data: Nothing?) {
visitConstructor(constructor)
}
+4
View File
@@ -0,0 +1,4 @@
open class A
class B : A
+5
View File
@@ -0,0 +1,5 @@
FILE: F.kt
unknown open class A() {
}
unknown final class B() : A {
}
@@ -0,0 +1,9 @@
abstract class A {
abstract class Nested
}
typealias TA = A
class B : TA() {
class NestedInB : Nested()
}
@@ -0,0 +1,12 @@
FILE: NestedOfAliasedType.kt
unknown abstract class A() {
unknown abstract class Nested() {
}
}
unknown final typealias TA = A
unknown final class B() : TA {
unknown final class NestedInB() : Nested {
}
}
@@ -0,0 +1,13 @@
package p
abstract class My {
abstract class NestedOne : My() {
abstract class NestedTwo : NestedOne() {
}
}
}
class Your : My() {
class NestedThree : NestedOne()
}
@@ -0,0 +1,14 @@
FILE: NestedSuperType.kt
unknown abstract class My() {
unknown abstract class NestedOne() : My {
unknown abstract class NestedTwo() : NestedOne {
}
}
}
unknown final class Your() : My {
unknown final class NestedThree() : NestedOne {
}
}
@@ -0,0 +1,11 @@
package a.b
class C<T, out S> {
inner class D<R, in P> {
}
}
interface Test {
val x: a.b.C<out CharSequence, *>.D<in List<*>, *>
}
@@ -0,0 +1,11 @@
FILE: complexTypes.kt
<T, out S> unknown final class C() {
<R, in P> unknown final class D(inner) {
}
}
unknown final interface Test() {
unknown final property x(val): a.b.C<out CharSequence, *>.D<in List<*>, *>
unknown get(): a.b.C<out CharSequence, *>.D<in List<*>, *>
}
@@ -0,0 +1,5 @@
open class Base<T>(val x: T)
class Derived<T : Any>(x: T) : Base<T>(x)
fun <T : Any> create(x: T): Derived<T> = Derived(x)
@@ -0,0 +1,12 @@
FILE: derivedClass.kt
<T> unknown open class Base() {
unknown constructor(x: T)
}
<T : Any> unknown final class Derived() : Base<T> {
unknown constructor(x: T)STUB
}
<T : Any> unknown final function create(x: T): Derived<T> {
STUB
}
+33
View File
@@ -0,0 +1,33 @@
import my.println
enum class Order {
FIRST,
SECOND,
THIRD
}
enum class Planet(val m: Double, internal val r: Double) {
MERCURY(1.0, 2.0) {
override fun sayHello() {
println("Hello!!!")
}
},
VENERA(3.0, 4.0) {
override fun sayHello() {
println("Ola!!!")
}
},
EARTH(5.0, 6.0) {
override fun sayHello() {
println("Privet!!!")
}
};
val g: Double = G * m / (r * r)
abstract fun sayHello()
companion object {
const val G = 6.67e-11
}
}
+45
View File
@@ -0,0 +1,45 @@
FILE: enums.kt
unknown final enum class Order() {
unknown final enum entry FIRST() {
}
unknown final enum entry SECOND() {
}
unknown final enum entry THIRD() {
}
}
unknown final enum class Planet() {
unknown constructor(m: Double, r: Double)
unknown final enum entry MERCURY() : Planet {
unknown final override function sayHello(): <implicit> {
}
}
unknown final enum entry VENERA() : Planet {
unknown final override function sayHello(): <implicit> {
}
}
unknown final enum entry EARTH() : Planet {
unknown final override function sayHello(): <implicit> {
}
}
unknown final property g(val): Double = STUB
unknown get(): Double
unknown abstract function sayHello(): <implicit>
unknown final object Companion(companion) {
unknown final const property G(val): <implicit> = STUB
unknown get(): <implicit>
}
}
+16
View File
@@ -0,0 +1,16 @@
interface Some
object O1 : Some
object O2 : Some
enum class SomeEnum(val x: Some) {
FIRST(O1) {
override fun check(y: Some): Boolean = true
},
SECOND(O2) {
override fun check(y: Some): Boolean = y == O2
};
abstract fun check(y: Some): Boolean
}
@@ -0,0 +1,27 @@
FILE: enums2.kt
unknown final interface Some() {
}
unknown final object O1() : Some {
}
unknown final object O2() : Some {
}
unknown final enum class SomeEnum() {
unknown constructor(x: Some)
unknown final enum entry FIRST() : SomeEnum {
unknown final override function check(y: Some): Boolean {
STUB
}
}
unknown final enum entry SECOND() : SomeEnum {
unknown final override function check(y: Some): Boolean {
STUB
}
}
unknown abstract function check(y: Some): Boolean
}
@@ -0,0 +1,8 @@
fun <T> simpleRun(f: (T) -> Unit): Unit = f()
fun <T, R> List<T>.simpleMap(f: (T) -> R): R {
}
fun <T> simpleWith(t: T, f: T.() -> Unit): Unit = t.f()
@@ -0,0 +1,9 @@
FILE: functionTypes.kt
<T> unknown final function simpleRun(f: ( (<no name provided>: T): Unit )): Unit {
STUB
}
<T, R> unknown final function simpleMapList<T>.(f: ( (<no name provided>: T): R )): R {
}
<T> unknown final function simpleWith(t: T, f: ( T.(): Unit )): Unit {
STUB
}
@@ -0,0 +1,7 @@
interface Any
inline fun <reified T : Any> Any.safeAs(): T? = this as? T
abstract class Summator {
abstract fun <T> plus(first: T, second: T): T
}
@@ -0,0 +1,10 @@
FILE: genericFunctions.kt
unknown final interface Any() {
}
<T : Any> unknown final inline function safeAsAny.(): T? {
STUB
}
unknown abstract class Summator() {
<T> unknown abstract function plus(first: T, second: T): T
}
@@ -0,0 +1,7 @@
abstract class Base(val s: String)
class Outer {
class Derived(s: String) : Base(s)
object Obj : Base("")
}
@@ -0,0 +1,15 @@
FILE: nestedClass.kt
unknown abstract class Base() {
unknown constructor(s: String)
}
unknown final class Outer() {
unknown final class Derived() : Base {
unknown constructor(s: String)STUB
}
unknown final object Obj() : Base {
}
}
@@ -14,4 +14,6 @@ class SomeClass : SomeInterface {
override var bar: Boolean
get() = true
set(value) {}
var fau: Double
}
@@ -1,5 +1,5 @@
FILE: simpleClass.kt
unknown final class SomeInterface() {
unknown final interface SomeInterface() {
unknown final function foo(x: Int, y: String): String
unknown final property bar(val): Boolean
@@ -20,4 +20,8 @@ FILE: simpleClass.kt
unknown set(value: Boolean): <implicit> {
}
unknown final property fau(var): Double
unknown get(): Double
unknown set(value: Double): R/Unit/
}
@@ -0,0 +1,5 @@
interface B
typealias C = B
class D : C
@@ -0,0 +1,6 @@
FILE: simpleTypeAlias.kt
unknown final interface B() {
}
unknown final typealias C = B
unknown final class D() : C {
}
@@ -0,0 +1,7 @@
open class A
interface B<S, T : A>
typealias C<T> = B<T, A>
class D : C<A>
@@ -0,0 +1,8 @@
FILE: typeAliasWithGeneric.kt
unknown open class A() {
}
<S, T : A> unknown final interface B() {
}
unknown final typealias C = B<T, A>
unknown final class D() : C<A> {
}
@@ -0,0 +1,17 @@
package test
interface Some
abstract class My<T : Some> {
inner class T
abstract val x: T
abstract fun foo(arg: T)
abstract val y: My.T
abstract val z: test.My.T
class Some : T()
}
@@ -0,0 +1,22 @@
FILE: typeParameterVsNested.kt
unknown final interface Some() {
}
<T : Some> unknown abstract class My() {
unknown final class T(inner) {
}
unknown abstract property x(val): T
unknown get(): T
unknown abstract function foo(arg: T): <implicit>
unknown abstract property y(val): My.T
unknown get(): My.T
unknown abstract property z(val): test.My.T
unknown get(): test.My.T
unknown final class Some() : T {
}
}
@@ -1,5 +1,5 @@
FILE: typeParameters.kt
<out T : Any> unknown final class List() {
<out T : Any> unknown final interface List() {
unknown final operator function get(index: Int): T
unknown final infix function concat(other: List<T>): List<T>
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
@@ -21,6 +21,10 @@ import java.util.regex.Pattern;
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public class RawFirBuilderTestCaseGenerated extends AbstractRawFirBuilderTestCase {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doRawFirTest, TargetBackend.ANY, testDataFilePath);
}
public void testAllFilesPresentInRawBuilder() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/fir/rawBuilder"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
}
@@ -29,26 +33,92 @@ public class RawFirBuilderTestCaseGenerated extends AbstractRawFirBuilderTestCas
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class Declarations extends AbstractRawFirBuilderTestCase {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doRawFirTest, TargetBackend.ANY, testDataFilePath);
}
public void testAllFilesPresentInDeclarations() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/fir/rawBuilder/declarations"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
}
@TestMetadata("complexTypes.kt")
public void testComplexTypes() throws Exception {
runTest("compiler/testData/fir/rawBuilder/declarations/complexTypes.kt");
}
@TestMetadata("derivedClass.kt")
public void testDerivedClass() throws Exception {
runTest("compiler/testData/fir/rawBuilder/declarations/derivedClass.kt");
}
@TestMetadata("enums.kt")
public void testEnums() throws Exception {
runTest("compiler/testData/fir/rawBuilder/declarations/enums.kt");
}
@TestMetadata("enums2.kt")
public void testEnums2() throws Exception {
runTest("compiler/testData/fir/rawBuilder/declarations/enums2.kt");
}
@TestMetadata("F.kt")
public void testF() throws Exception {
runTest("compiler/testData/fir/rawBuilder/declarations/F.kt");
}
@TestMetadata("functionTypes.kt")
public void testFunctionTypes() throws Exception {
runTest("compiler/testData/fir/rawBuilder/declarations/functionTypes.kt");
}
@TestMetadata("genericFunctions.kt")
public void testGenericFunctions() throws Exception {
runTest("compiler/testData/fir/rawBuilder/declarations/genericFunctions.kt");
}
@TestMetadata("nestedClass.kt")
public void testNestedClass() throws Exception {
runTest("compiler/testData/fir/rawBuilder/declarations/nestedClass.kt");
}
@TestMetadata("NestedOfAliasedType.kt")
public void testNestedOfAliasedType() throws Exception {
runTest("compiler/testData/fir/rawBuilder/declarations/NestedOfAliasedType.kt");
}
@TestMetadata("NestedSuperType.kt")
public void testNestedSuperType() throws Exception {
runTest("compiler/testData/fir/rawBuilder/declarations/NestedSuperType.kt");
}
@TestMetadata("simpleClass.kt")
public void testSimpleClass() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/rawBuilder/declarations/simpleClass.kt");
doRawFirTest(fileName);
runTest("compiler/testData/fir/rawBuilder/declarations/simpleClass.kt");
}
@TestMetadata("simpleFun.kt")
public void testSimpleFun() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/rawBuilder/declarations/simpleFun.kt");
doRawFirTest(fileName);
runTest("compiler/testData/fir/rawBuilder/declarations/simpleFun.kt");
}
@TestMetadata("simpleTypeAlias.kt")
public void testSimpleTypeAlias() throws Exception {
runTest("compiler/testData/fir/rawBuilder/declarations/simpleTypeAlias.kt");
}
@TestMetadata("typeAliasWithGeneric.kt")
public void testTypeAliasWithGeneric() throws Exception {
runTest("compiler/testData/fir/rawBuilder/declarations/typeAliasWithGeneric.kt");
}
@TestMetadata("typeParameterVsNested.kt")
public void testTypeParameterVsNested() throws Exception {
runTest("compiler/testData/fir/rawBuilder/declarations/typeParameterVsNested.kt");
}
@TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/rawBuilder/declarations/typeParameters.kt");
doRawFirTest(fileName);
runTest("compiler/testData/fir/rawBuilder/declarations/typeParameters.kt");
}
}
}