[FIR] Drop visualizer module

This module was created to compare type resolve in K1 and K2. But
overall, these tests contain a lot of bugs, and it is quite hard
to use it.
This commit is contained in:
Ivan Kylchik
2023-09-12 12:18:31 +02:00
committed by Space Team
parent 2cd504b675
commit 1843eeb16b
107 changed files with 0 additions and 6126 deletions
-1
View File
@@ -207,7 +207,6 @@
/compiler/util-klib/ "Kotlin Native"
/compiler/util-klib-abi/ "Kotlin Native"
/compiler/util-klib-metadata/ "Kotlin Native"
/compiler/visualizer/ "Kotlin Compiler Core"
/core/builtins/ "Kotlin Compiler Core"
/core/compiler.common/ "Kotlin Compiler Core"
-4
View File
@@ -702,10 +702,6 @@ tasks {
dependsOn(":compiler:fir:fir2ir:nightlyTests")
}
register("compilerFrontendVisualizerTest") {
dependsOn("compiler:visualizer:test")
}
register("scriptingJvmTest") {
dependsOn("dist")
dependsOn(":kotlin-scripting-compiler:test")
@@ -17,7 +17,6 @@ dependencies {
testImplementation(projectTests(":compiler:fir:raw-fir:light-tree2fir"))
testImplementation(projectTests(":compiler:fir:fir2ir"))
testImplementation(projectTests(":compiler:fir:analysis-tests:legacy-fir-tests"))
testImplementation(projectTests(":compiler:visualizer"))
testImplementation(projectTests(":js:js.tests"))
testImplementation(projectTests(":generators:test-generator"))
}
@@ -14,8 +14,6 @@ import org.jetbrains.kotlin.test.runners.ir.*
import org.jetbrains.kotlin.test.runners.ir.interpreter.AbstractJvmIrInterpreterAfterFirPsi2IrTest
import org.jetbrains.kotlin.test.runners.ir.interpreter.AbstractJvmIrInterpreterAfterPsi2IrTest
import org.jetbrains.kotlin.test.utils.CUSTOM_TEST_DATA_EXTENSION_PATTERN
import org.jetbrains.kotlin.visualizer.fir.AbstractFirVisualizerTest
import org.jetbrains.kotlin.visualizer.psi.AbstractPsiVisualizerTest
fun generateJUnit5CompilerTests(args: Array<String>, mainClassName: String?) {
val excludedCustomTestdataPattern = CUSTOM_TEST_DATA_EXTENSION_PATTERN
@@ -385,25 +383,5 @@ fun generateJUnit5CompilerTests(args: Array<String>, mainClassName: String?) {
model("codegen/bytecodeText")
}
}
testGroup("compiler/visualizer/tests-gen", "compiler/fir/raw-fir/psi2fir/testData") {
testClass<AbstractPsiVisualizerTest>("PsiVisualizerForRawFirDataGenerated") {
model("rawBuilder")
}
testClass<AbstractFirVisualizerTest>("FirVisualizerForRawFirDataGenerated") {
model("rawBuilder")
}
}
testGroup("compiler/visualizer/tests-gen", "compiler/visualizer/testData") {
testClass<AbstractPsiVisualizerTest>("PsiVisualizerForUncommonCasesGenerated") {
model("uncommonCases/testFiles")
}
testClass<AbstractFirVisualizerTest>("FirVisualizerForUncommonCasesGenerated") {
model("uncommonCases/testFiles")
}
}
}
}
-53
View File
@@ -1,53 +0,0 @@
import org.jetbrains.kotlin.ideaExt.idea
plugins {
kotlin("jvm")
id("jps-compatible")
}
dependencies {
testCompileOnly(project(":compiler:fir:raw-fir:psi2fir"))
testImplementation(project(":compiler:visualizer:render-psi"))
testImplementation(project(":compiler:visualizer:render-fir"))
testApi(platform(libs.junit.bom))
testImplementation(libs.junit.jupiter.api)
testRuntimeOnly(libs.junit.jupiter.engine)
testApi(projectTests(":compiler:tests-compiler-utils"))
testApi(projectTests(":compiler:tests-common-new"))
testApi(projectTests(":compiler:test-infrastructure"))
testApi(projectTests(":compiler:fir:analysis-tests:legacy-fir-tests"))
testImplementation(projectTests(":generators:test-generator"))
testRuntimeOnly(commonDependency("org.jetbrains.intellij.deps.fastutil:intellij-deps-fastutil"))
testRuntimeOnly(commonDependency("org.jetbrains.intellij.deps.jna:jna"))
}
val generationRoot = projectDir.resolve("tests-gen")
sourceSets {
"main" { projectDefault() }
"test" {
projectDefault()
this.java.srcDir(generationRoot.name)
}
}
if (kotlinBuildProperties.isInJpsBuildIdeaSync) {
apply(plugin = "idea")
idea {
this.module.generatedSourceDirs.add(generationRoot)
}
}
projectTest(parallel = true, jUnitMode = JUnitMode.JUnit5) {
workingDir = rootDir
useJUnitPlatform()
}
testsJar()
val generateVisualizerTests by generator("org.jetbrains.kotlin.visualizer.GenerateVisualizerTestsKt")
@@ -1,14 +0,0 @@
plugins {
kotlin("jvm")
id("jps-compatible")
}
dependencies {
api(project(":compiler:frontend"))
compileOnly(intellijCore())
}
sourceSets {
"main" { projectDefault() }
"test" { }
}
@@ -1,65 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.compiler.visualizer
import com.intellij.openapi.util.TextRange
import kotlin.math.max
object Annotator {
private const val verticalLine = ""
private const val comment = "//"
data class AnnotationInfo(val text: String, val range: TextRange)
private fun putAnnotationToLines(annotations: List<AnnotationInfo>, lineStart: Int, lineSize: Int): List<String> {
val annotationLines = mutableListOf(StringBuilder(comment + " ".repeat(lineSize - comment.length)))
val levelToOffset = mutableMapOf(0 to 0)
for (ann in annotations) {
val lastLevel = levelToOffset.values.takeWhile { ann.range.startOffset + ann.text.length >= it }.size
if (annotationLines.size <= lastLevel) {
annotationLines.add(StringBuilder(comment + " ".repeat(lineSize - comment.length)))
}
val startReplace = max(comment.length, ann.range.startOffset - lineStart)
annotationLines[lastLevel].replace(startReplace, startReplace + ann.text.length, ann.text)
for (i in 0 until lastLevel) {
if (annotationLines[i].getOrNull(startReplace) == ' ') { //to avoid char replacement for a multilevel annotation
annotationLines[i].replace(startReplace, startReplace + 1, verticalLine)
}
}
for (i in 1..lastLevel) {
levelToOffset[i] = ann.range.startOffset
}
}
return annotationLines.map { it.trim().toString() }
}
fun annotate(text: String, annotation: Set<AnnotationInfo>): List<String> {
val lines = text.lines()
val resultLines = mutableListOf<String>()
var lineStartOffset = 0
for (line in lines) {
val lineEndOffset = lineStartOffset + line.length
val annotations = annotation
.filter { it.range.startOffset in lineStartOffset until lineEndOffset }
.sortedByDescending { it.range.startOffset }
if (annotations.isNotEmpty()) {
val annotationLines = putAnnotationToLines(annotations, lineStartOffset, line.length)
resultLines += annotationLines.asReversed()
}
resultLines.add(line)
lineStartOffset = lineEndOffset + 1
}
return resultLines
}
}
@@ -1,34 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.compiler.visualizer
import com.intellij.psi.PsiElement
abstract class BaseRenderer {
private val annotations = mutableSetOf<Annotator.AnnotationInfo>()
private val unnecessaryData = mapOf(
"kotlin/" to ""
)
open fun addAnnotation(annotationText: String, element: PsiElement?, deleteDuplicate: Boolean = true) {
if (element == null) return
annotations.removeIf { it.range.startOffset == element.textRange.startOffset && deleteDuplicate }
var textWithOutUnnecessaryData = annotationText
for ((key, value) in unnecessaryData) {
textWithOutUnnecessaryData = textWithOutUnnecessaryData.replace(key, value)
}
if (textWithOutUnnecessaryData != element.text && textWithOutUnnecessaryData.isNotEmpty()) {
annotations.add(Annotator.AnnotationInfo(textWithOutUnnecessaryData, element.textRange))
}
}
protected fun getAnnotations(): Set<Annotator.AnnotationInfo> {
return annotations
}
abstract fun render(): String
}
@@ -1,22 +0,0 @@
plugins {
kotlin("jvm")
id("jps-compatible")
}
dependencies {
api(project(":compiler:fir:raw-fir:psi2fir"))
api(project(":compiler:fir:resolve"))
api(project(":compiler:visualizer:common"))
compileOnly(intellijCore())
}
sourceSets {
"main" { projectDefault() }
"test" { }
}
tasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinCompile<*>> {
kotlinOptions {
freeCompilerArgs += "-opt-in=org.jetbrains.kotlin.fir.symbols.SymbolInternals"
}
}
@@ -1,904 +0,0 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.compiler.visualizer
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.renderer.ConeTypeRendererForDebugging
import org.jetbrains.kotlin.fir.resolve.defaultType
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getChildOfType
import org.jetbrains.kotlin.psi.psiUtil.getChildrenOfType
import org.jetbrains.kotlin.renderer.replacePrefixesInTypeRepresentations
import org.jetbrains.kotlin.types.AbstractStrictEqualityTypeChecker
import org.jetbrains.kotlin.types.ConstantValueKind
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
private const val ANONYMOUS_NAME = "<anonymous>"
private typealias Stack = MutableList<Pair<String, MutableList<String>>>
class FirVisualizer(private val firFile: FirFile) : BaseRenderer() {
private val implicitReceivers = mutableListOf<ConeKotlinType>()
private fun FirElement.render(): String = buildString { this@render.accept(FirRendererForVisualizer(), this) }
private val stack = mutableListOf("" to mutableListOf<String>())
private fun Stack.push(
levelName: String,
defaultValues: MutableList<String> = mutableListOf(),
) = this.add(levelName to defaultValues)
private fun Stack.pop() = this.removeAt(this.size - 1)
private fun Stack.addName(name: String) = this.last().second.add(name)
private fun Stack.addName(name: Name) = this.addName(name.asString())
private fun Stack.getPathByName(name: String): String {
if (name == ANONYMOUS_NAME) return ""
for ((reversedIndex, names) in this.asReversed().map { it.second }.withIndex()) {
if (names.contains(name)) {
return this.filterIndexed { index, _ -> index < this.size - reversedIndex && index > 0 }
.joinToString(separator = ".", postfix = ".") { it.first }
}
}
if (name == "it") {
return this.subList(1, this.size)
.joinToString(separator = ".", postfix = ".") { it.first }
}
return "[NOT FOUND]."
}
override fun addAnnotation(annotationText: String, element: PsiElement?, deleteDuplicate: Boolean) {
super.addAnnotation(annotationText, element, false)
}
override fun render(): String {
val map = mutableMapOf<PsiElement, MutableList<FirElement>>().apply { Psi2FirMapper(this).visitFile(firFile) }
map.keys.firstOrNull { it is KtFile }?.accept(PsiVisitor(map))
return Annotator.annotate(firFile.psi!!.text, getAnnotations()).joinToString("\n")
}
inner class PsiVisitor(private val map: Map<PsiElement, MutableList<FirElement>>) : KtVisitorVoid() {
private var lastCallWithLambda: String? = null
private inline fun <reified T> KtElement.firstOfType(): T? {
val firList = map[this]
return firList?.filterIsInstance<T>()?.firstOrNull()
}
/**
* @return rendered element or null if there is no such type
*/
private inline fun <reified T : FirElement> KtElement.firstOfTypeWithRender(
psi: PsiElement? = this,
getRendererElement: T.() -> FirElement = { this }
): FirElement? {
return firstOfType<T>()?.also { addAnnotation(it.getRendererElement().render(), psi) }
}
/**
* @return rendered element or null if there is no such type
*/
private inline fun <reified T : FirElement> KtElement.firstOfTypeWithLocalReplace(
psi: PsiElement? = this,
getName: T.() -> String
): FirElement? {
return firstOfType<T>()?.also { addAnnotation(it.render().replace("<local>/", stack.getPathByName(it.getName())), psi) }
}
/**
* @return first rendered element or null if there is no such type
*/
private inline fun <reified T : FirElement> KtElement.allOfTypeWithLocalReplace(
psi: PsiElement? = this,
getName: T.() -> String
): FirElement? {
val firList = map[this]
val firElements = firList?.filterIsInstance<T>()
if (firElements == null || firElements.isEmpty()) return null
firElements.forEach { addAnnotation(it.render().replace("<local>/", stack.getPathByName(it.getName())), psi) }
return firElements.first()
}
override fun visitElement(element: PsiElement) {
element.acceptChildren(this)
}
override fun visitKtElement(element: KtElement) {
when (element) {
is KtClassInitializer, is KtSecondaryConstructor, is KtPrimaryConstructor, is KtSuperTypeCallEntry, is KtDelegatedSuperTypeEntry -> {
val valueParameters = element.getChildrenOfType<KtParameterList>()
valueParameters.flatMap { it.parameters }.forEach { stack.addName(it.nameAsSafeName) }
//add to init values from last block
//because when we are out of primary constructor information about properties will be removed
//is used in ClassInitializer block and in SuperTypeCallEntry
stack.push("<init>", stack.last().second)
element.acceptChildren(this)
stack.pop()
}
is KtClassOrObject -> {
if (element.isLocal) stack.addName((element.name ?: ANONYMOUS_NAME))
stack.push((element.name ?: ANONYMOUS_NAME))
element.acceptChildren(this)
stack.pop()
}
else -> element.acceptChildren(this)
}
}
override fun visitPackageDirective(directive: KtPackageDirective) {
//don't resolve package names
}
override fun visitSuperExpression(expression: KtSuperExpression) {
//don't resolve super expression
}
override fun visitThisExpression(expression: KtThisExpression) {
//don't resolve this expression
}
override fun visitNamedFunction(function: KtNamedFunction) {
if (function.isLocal) stack.addName(function.name ?: ANONYMOUS_NAME)
stack.push((function.name ?: ANONYMOUS_NAME))
if (function.equalsToken != null) {
function.bodyExpression!!.firstOfTypeWithRender<FirReturnExpression>(function.equalsToken) { this.result.resolvedType.toFirResolvedTypeRef() }
?: function.firstOfTypeWithRender<FirCallableDeclaration>(function.equalsToken) { this.returnTypeRef }
}
super.visitNamedFunction(function)
stack.pop()
}
private fun renderVariableType(variable: KtVariableDeclaration) {
stack.addName(variable.nameAsSafeName)
variable.firstOfTypeWithRender<FirVariable>(variable.nameIdentifier)
variable.acceptChildren(this)
}
override fun visitProperty(property: KtProperty) =
renderVariableType(property)
override fun visitDestructuringDeclarationEntry(multiDeclarationEntry: KtDestructuringDeclarationEntry) =
renderVariableType(multiDeclarationEntry)
override fun visitAnnotationEntry(annotationEntry: KtAnnotationEntry) {
annotationEntry.firstOfTypeWithRender<FirAnnotation>(annotationEntry.getChildOfType<KtConstructorCalleeExpression>())
super.visitAnnotationEntry(annotationEntry)
}
override fun visitConstructorCalleeExpression(constructorCalleeExpression: KtConstructorCalleeExpression) {
constructorCalleeExpression.firstOfTypeWithRender<FirDelegatedConstructorCall>()
}
override fun visitParameter(parameter: KtParameter) {
stack.addName(parameter.nameAsSafeName)
if ((parameter.isLoopParameter && parameter.destructuringDeclaration == null) || parameter.ownerFunction is KtPropertyAccessor) {
parameter.firstOfTypeWithRender<FirVariable>(parameter.nameIdentifier)
}
super.visitParameter(parameter)
}
override fun visitTypeReference(typeReference: KtTypeReference) {
typeReference.firstOfTypeWithRender<FirTypeRef>()
super.visitTypeReference(typeReference)
}
override fun visitConstantExpression(expression: KtConstantExpression) {
expression.firstOfTypeWithRender<FirConstExpression<*>>()
}
override fun visitReferenceExpression(expression: KtReferenceExpression) {
if (expression is KtOperationReferenceExpression) return
expression.firstOfTypeWithLocalReplace<FirResolvedNamedReference> { this.name.asString() }
?: expression.firstOfTypeWithLocalReplace<FirResolvedCallableReference> { this.name.asString() }
?: expression.firstOfTypeWithRender<FirResolvedQualifier>()
?: expression.firstOfTypeWithRender<FirElement>() //fallback for errors
super.visitReferenceExpression(expression)
}
override fun visitUnaryExpression(expression: KtUnaryExpression) {
if (expression.operationReference.getReferencedName() == "!!") {
expression.baseExpression?.accept(this)
return
}
expression.allOfTypeWithLocalReplace<FirFunctionCall>(expression.operationReference) { this.calleeReference.name.asString() }
super.visitUnaryExpression(expression)
}
override fun visitBinaryExpression(expression: KtBinaryExpression) {
val operation = expression.operationReference
when {
operation.getReferencedName() == "?:" -> {
expression.left?.accept(this)
expression.right?.accept(this)
}
operation.getReferencedName() in setOf("==", "!=") -> {
expression.left?.accept(this)
expression.firstOfTypeWithRender<FirEqualityOperatorCall>(operation)
expression.right?.accept(this)
}
else -> {
expression.allOfTypeWithLocalReplace<FirFunctionCall>(operation) { this.calleeReference.name.asString() }
?: expression.firstOfTypeWithLocalReplace<FirVariableAssignment>(operation) { this.calleeReference.toString() }
super.visitBinaryExpression(expression)
}
}
}
override fun visitIfExpression(expression: KtIfExpression) {
expression.firstOfTypeWithRender<FirWhenExpression> { this.resolvedType.toFirResolvedTypeRef() }
super.visitIfExpression(expression)
}
override fun visitWhenExpression(expression: KtWhenExpression) {
expression.firstOfTypeWithRender<FirWhenExpression> { this.resolvedType.toFirResolvedTypeRef() }
super.visitWhenExpression(expression)
}
override fun visitDotQualifiedExpression(expression: KtDotQualifiedExpression) {
expression.firstOfTypeWithLocalReplace<FirFunctionCall>(expression.selectorExpression) { this.calleeReference.name.asString() }
super.visitDotQualifiedExpression(expression)
}
override fun visitCallExpression(expression: KtCallExpression) {
expression.firstOfTypeWithLocalReplace<FirFunctionCall> { this.calleeReference.name.asString() }
?: expression.firstOfTypeWithRender<FirArrayLiteral>()
expression.children.filter { it.node.elementType != KtNodeTypes.REFERENCE_EXPRESSION }.forEach { psi ->
when (psi) {
is KtLambdaArgument -> {
val firLambda = (psi.firstOfType<FirLambdaArgumentExpression>()?.expression as? FirAnonymousFunctionExpression)?.anonymousFunction
firLambda?.receiverParameter?.typeRef?.let {
lastCallWithLambda = psi.getLambdaExpression()?.firstOfType<FirLabel>()?.name
implicitReceivers += it.coneType
psi.accept(this)
implicitReceivers -= it.coneType
lastCallWithLambda = null
} ?: psi.accept(this)
}
else -> psi.accept(this)
}
}
}
override fun visitLambdaExpression(lambdaExpression: KtLambdaExpression) {
stack.push(ANONYMOUS_NAME)
lastCallWithLambda?.let { addAnnotation("$it@${implicitReceivers.size - 1}", lambdaExpression) }
super.visitLambdaExpression(lambdaExpression)
stack.pop()
}
override fun visitArrayAccessExpression(expression: KtArrayAccessExpression) {
//this method explicitly accept children and prevent default fallback to other fir element
expression.acceptChildren(this)
}
override fun visitPropertyAccessor(accessor: KtPropertyAccessor) {
if (accessor.isSetter) {
stack.push("<set-${accessor.property.nameAsSafeName}>", mutableListOf("field"))
super.visitPropertyAccessor(accessor)
stack.pop()
} else {
super.visitPropertyAccessor(accessor)
}
}
override fun visitWhenEntry(ktWhenEntry: KtWhenEntry) {
ktWhenEntry.firstOfTypeWithRender<FirWhenBranch>(ktWhenEntry.expression) { this.result.resolvedType.toFirResolvedTypeRef() }
super.visitWhenEntry(ktWhenEntry)
}
override fun visitClassLiteralExpression(expression: KtClassLiteralExpression) {
expression.firstOfTypeWithRender<FirGetClassCall>()
}
override fun visitPrefixExpression(expression: KtPrefixExpression) {
expression.firstOfTypeWithRender<FirConstExpression<*>>(expression.baseExpression) ?: super.visitPrefixExpression(expression)
}
}
inner class FirRendererForVisualizer : FirVisitor<Unit, StringBuilder>() {
private val session = firFile.moduleData.session
private val filePackage = firFile.packageFqName.toString()
private val filePackageWithSlash = filePackage.replace(".", "/")
private fun ConeTypeProjection.tryToRenderConeAsFunctionTypeString(): String {
return buildString {
tryToRenderConeAsFunctionType(this@buildString)
}
}
private fun ConeTypeProjection.tryToRenderConeAsFunctionType(builder: StringBuilder) {
if (this !is ConeKotlinType) {
localTypeProjectionRenderer(builder)
return
}
val projectionBuilder = StringBuilder()
ConeTypeRendererForDebugging(projectionBuilder).renderAsPossibleFunctionType(
this,
{ it.functionTypeKind(session) }
) {
localTypeProjectionRenderer(projectionBuilder)
}
builder.append(projectionBuilder.toString().removeCurrentFilePackage())
}
private fun tryToSquashFlexibleType(lowerRendered: String, upperRendered: String): String? {
val simpleCollection = replacePrefixesInTypeRepresentations(
lowerRendered,
"kotlin/collections/Mutable",
upperRendered,
"kotlin/collections/",
"kotlin/collections/(Mutable)"
)
if (simpleCollection != null) return simpleCollection
val mutableEntry = replacePrefixesInTypeRepresentations(
lowerRendered,
"kotlin/collections/MutableMap.MutableEntry",
upperRendered,
"kotlin/collections/Map.Entry",
"kotlin/collections/(Mutable)Map.(Mutable)Entry"
)
if (mutableEntry != null) return mutableEntry
val array = replacePrefixesInTypeRepresentations(
lowerRendered,
"kotlin/Array<",
upperRendered,
"kotlin/Array<out ",
"kotlin/Array<(out) "
)
if (array != null) return array
return null
}
private fun ConeTypeProjection.localTypeProjectionRenderer(builder: StringBuilder) {
val nullabilitySuffix = when {
this is ConeKotlinType && this !is ConeErrorType -> nullability.suffix
else -> ""
}
when (this) {
is ConeKotlinTypeProjectionIn -> {
builder.append("in ")
type.tryToRenderConeAsFunctionType(builder)
}
is ConeKotlinTypeProjectionOut -> {
builder.append("out ")
type.tryToRenderConeAsFunctionType(builder)
}
is ConeStarProjection -> builder.append("*")
is ConeClassLikeType -> {
val type = this.fullyExpandedType(session)
if (type != this) {
type.tryToRenderConeAsFunctionType(builder)
return
}
val classId = type.lookupTag.classId
when {
classId.isLocal -> builder.append(classId.shortClassName.asString().let { stack.getPathByName(it) + it })
else -> builder.append(classId.asString())
}
if (type.typeArguments.isNotEmpty()) {
builder.append("<")
for ((index, typeArgument) in type.typeArguments.withIndex()) {
if (index != 0) {
builder.append(", ")
}
typeArgument.tryToRenderConeAsFunctionType(builder)
}
builder.append(">")
}
builder.append(nullabilitySuffix)
}
is ConeLookupTagBasedType -> builder.append(lookupTag.name.asString() + nullabilitySuffix)
is ConeFlexibleType -> {
val lowerBuilder = StringBuilder()
lowerBound.tryToRenderConeAsFunctionType(lowerBuilder)
if (lowerBound.nullability == ConeNullability.NOT_NULL && upperBound.nullability == ConeNullability.NULLABLE &&
AbstractStrictEqualityTypeChecker
.strictEqualTypes(
session.typeContext,
lowerBound,
upperBound.withNullability(ConeNullability.NOT_NULL, session.typeContext)
)
) {
builder.append(lowerBuilder)
} else {
val upperBuilder = StringBuilder()
upperBound.tryToRenderConeAsFunctionType(upperBuilder)
builder.append(
tryToSquashFlexibleType(lowerBuilder.toString(), upperBuilder.toString()) ?: "$lowerBuilder..$upperBuilder"
)
}
}
is ConeIntersectionType -> {
intersectedTypes.map { it.renderForDebugging().replace("/", ".").replace("kotlin.", "") }.sorted()
.joinToString(separator = " & ", prefix = "{", postfix = "}")
}
else -> builder.append((this as ConeKotlinType).renderForDebugging())
}
}
private fun String.removeCurrentFilePackage(): String {
val withoutPackage = this.replaceFirst("$filePackage.", "").replaceFirst("$filePackageWithSlash/", "")
return withoutPackage.let { if (it.startsWith("/")) it.substring(1) else it }
}
private fun ClassId.getWithoutCurrentPackage() = this.asString().removeCurrentFilePackage()
private fun <T : FirElement> renderListInTriangles(list: List<T>, data: StringBuilder, withSpace: Boolean = false) {
if (list.isNotEmpty()) {
list.joinTo(data, separator = ", ", prefix = "<", postfix = ">") {
it.render()
}
if (withSpace) data.append(" ")
}
}
private fun renderImplicitReceiver(symbol: FirBasedSymbol<*>, psi: PsiElement?) {
val receiverType = (symbol.fir as? FirCallableDeclaration)?.dispatchReceiverType ?: return
val implicitReceiverIndex = implicitReceivers.indexOf(receiverType)
if (implicitReceiverIndex != -1) addAnnotation("this@$implicitReceiverIndex", psi)
}
private fun renderConstructorSymbol(symbol: FirConstructorSymbol, data: StringBuilder) {
data.append("constructor ")
data.append(getSymbolId(symbol))
renderListInTriangles(symbol.fir.typeParameters, data)
}
private fun renderField(field: FirField, data: StringBuilder) {
val original = field.unwrapFakeOverridesOrDelegated()
if (original.isVal) data.append("val ") else if (original.isVar) data.append("var ")
data.append("(")
original.dispatchReceiverType?.tryToRenderConeAsFunctionType(data)
data.append(").")
.append(original.name)
.append(": ")
original.returnTypeRef.coneType.tryToRenderConeAsFunctionType(data)
}
private fun renderVariable(variable: FirVariable, data: StringBuilder) {
when {
variable is FirEnumEntry -> {
data.append("enum entry ")
variable.returnTypeRef.accept(this, data)
data.append(".${variable.name}")
return
}
variable !is FirValueParameter || variable.name.asString() == "e" /* hack to match render with psi */ -> when {
variable.isVar -> data.append("var ")
variable.isVal -> data.append("val ")
}
}
val returnType = if ((variable as? FirValueParameter)?.isVararg == true) {
data.append("vararg ")
variable.returnTypeRef.coneType.arrayElementType()
} else {
variable.returnTypeRef.coneType
}
val receiver = when (variable) {
is FirField -> variable.dispatchReceiverType?.tryToRenderConeAsFunctionTypeString()
else -> getSymbolId(variable.symbol)
}
data.append(receiver)
.append(variable.symbol.callableId.callableName)
.append(": ")
returnType?.tryToRenderConeAsFunctionType(data)
data.append((variable as? FirValueParameter)?.defaultValue?.let { " = ..." } ?: "")
}
private fun renderPropertySymbol(symbol: FirPropertySymbol, data: StringBuilder) {
val fir = symbol.fir.unwrapFakeOverridesOrDelegated()
data.append(if (fir.isVar) "var" else "val").append(" ")
renderListInTriangles(fir.typeParameters, data, withSpace = true)
val receiver = fir.receiverParameter?.typeRef?.render()
when {
receiver != null -> data.append(receiver).append(".").append(symbol.callableId.callableName)
fir.dispatchReceiverType != null -> {
val dispatchReceiver = fir.dispatchReceiverType?.tryToRenderConeAsFunctionTypeString()
data.append("($dispatchReceiver)").append(".").append(symbol.callableId.callableName)
}
else -> {
val name = symbol.callableId.let { if (it.packageName.asString().isEmpty()) it.callableName else it }
data.append(name.toString().removeCurrentFilePackage())
}
}
data.append(": ").append(fir.returnTypeRef.render())
}
private fun renderFunctionSymbol(symbol: FirNamedFunctionSymbol, data: StringBuilder, call: FirFunctionCall? = null) {
data.append("fun ")
val fir = symbol.fir.unwrapFakeOverridesOrDelegated()
renderListInTriangles(fir.typeParameters, data, true)
val id = getSymbolId(symbol)
val callableName = symbol.callableId.callableName
val receiverParameterType = fir.receiverParameter?.typeRef
if (call == null) {
// call is null for callable reference
if (receiverParameterType == null) {
symbol.callableId.className?.let { data.append("($it).$callableName") } ?: data.append(callableName)
} else {
data.append("${receiverParameterType.render()}.$callableName")
}
return
}
var withExtensionFunctionType = false
val extensionReceiver = call.extensionReceiver
val dispatchReceiver = call.dispatchReceiver
when {
extensionReceiver != null -> {
// render type from symbol because this way it will be consistent with psi render
fir.receiverParameter?.accept(this, data)
data.append(".").append(callableName)
}
dispatchReceiver?.resolvedType?.isExtensionFunctionType == true-> {
withExtensionFunctionType = true
fir.valueParameters.first().returnTypeRef.accept(this, data)
data.append(".").append(callableName)
}
dispatchReceiver != null -> {
data.append("(")
val dispatch = fir.dispatchReceiverType!!.tryToRenderConeAsFunctionTypeString()
.let { if (it.endsWith("!")) it.dropLast(1) else it } // this hack drop flexible annotation for receiver
data.append(dispatch).append(").").append(callableName)
}
else -> {
data.append(id)
if (symbol.callableId.className != null) data.append(".")
data.append(callableName)
}
}
renderListInTriangles(call.typeArguments, data)
val valueParameters = fir.valueParameters.let { if (withExtensionFunctionType) it.drop(1) else it }
visitValueParameters(valueParameters, data)
data.append(": ")
fir.returnTypeRef.accept(this, data)
}
override fun visitElement(element: FirElement, data: StringBuilder) {
element.acceptChildren(this, data)
}
override fun visitErrorNamedReference(errorNamedReference: FirErrorNamedReference, data: StringBuilder) {
data.append(errorNamedReference.name)
}
private fun visitConstructor(call: FirResolvable, data: StringBuilder) {
when (val calleeReference = call.calleeReference) {
!is FirResolvedNamedReference -> data.append("[ERROR: Unresolved]")
else -> visitConstructor(calleeReference.resolvedSymbol.fir as FirConstructor, data)
}
}
override fun visitConstructor(constructor: FirConstructor, data: StringBuilder) {
renderConstructorSymbol(constructor.symbol, data)
visitValueParameters(constructor.unwrapFakeOverridesOrDelegated().valueParameters, data)
}
override fun visitTypeParameterRef(typeParameterRef: FirTypeParameterRef, data: StringBuilder) {
visitTypeParameter(typeParameterRef.symbol.fir, data)
}
override fun visitOuterClassTypeParameterRef(outerClassTypeParameterRef: FirOuterClassTypeParameterRef, data: StringBuilder) {
visitTypeParameterRef(outerClassTypeParameterRef, data)
}
override fun visitConstructedClassTypeParameterRef(constructedClassTypeParameterRef: FirConstructedClassTypeParameterRef, data: StringBuilder
) {
visitTypeParameterRef(constructedClassTypeParameterRef, data)
}
override fun visitTypeParameter(typeParameter: FirTypeParameter, data: StringBuilder) {
data.append(typeParameter.name)
val bounds = typeParameter.bounds.filterNot { it.render() == "kotlin/Any?" }
if (bounds.isNotEmpty()) {
data.append(" : ")
bounds.joinTo(data, separator = ", ") { it.render() }
}
}
override fun visitBackingFieldReference(backingFieldReference: FirBackingFieldReference, data: StringBuilder) {
val firProperty = backingFieldReference.resolvedSymbol.fir
data.append(if (firProperty.isVar) "var " else "val ")
.append(stack.getPathByName("field"))
.append("field: ")
.append(firProperty.returnTypeRef.render())
}
override fun visitProperty(property: FirProperty, data: StringBuilder) {
if (property.isLocal) {
visitVariable(property, data)
return
}
data.append(property.returnTypeRef.render())
}
private fun visitValueParameters(valueParameters: List<FirValueParameter>, data: StringBuilder) {
valueParameters.joinTo(data, separator = ", ", prefix = "(", postfix = ")") {
it.render()
}
}
override fun visitValueParameter(valueParameter: FirValueParameter, data: StringBuilder) {
if (valueParameter.isVararg) {
data.append("vararg ")
valueParameter.returnTypeRef.coneType.arrayElementType()?.localTypeProjectionRenderer(data)
} else {
valueParameter.returnTypeRef.accept(this, data)
}
valueParameter.defaultValue?.let { data.append(" = ...") }
}
override fun visitVariable(variable: FirVariable, data: StringBuilder) {
data.append(variable.returnTypeRef.render())
}
override fun visitNamedReference(namedReference: FirNamedReference, data: StringBuilder) {
if (namedReference is FirErrorNamedReference) {
data.append(namedReference.diagnostic.dump())
return
}
visitElement(namedReference, data)
}
private fun ConeDiagnostic.dump(): String {
return "[ERROR : ${reason}]"
}
override fun visitResolvedNamedReference(resolvedNamedReference: FirResolvedNamedReference, data: StringBuilder) {
val symbol = resolvedNamedReference.resolvedSymbol
renderImplicitReceiver(symbol, resolvedNamedReference.source.psi)
when {
symbol is FirPropertySymbol && !symbol.fir.isLocal -> renderPropertySymbol(symbol, data)
symbol is FirNamedFunctionSymbol -> {
val fir = symbol.fir
data.append(stack.getPathByName(resolvedNamedReference.name.asString()))
.append(resolvedNamedReference.name)
.append(": ")
fir.dispatchReceiverType?.tryToRenderConeAsFunctionType(data)
}
symbol is FirFieldSymbol -> renderField(symbol.fir, data)
else -> (symbol.fir as? FirVariable)?.let { renderVariable(it, data) }
}
}
override fun visitResolvedErrorReference(resolvedErrorReference: FirResolvedErrorReference, data: StringBuilder) {
visitResolvedNamedReference(resolvedErrorReference, data)
data.append(resolvedErrorReference.diagnostic.dump())
}
override fun visitResolvedCallableReference(resolvedCallableReference: FirResolvedCallableReference, data: StringBuilder) {
when (val symbol = resolvedCallableReference.resolvedSymbol) {
is FirPropertySymbol -> renderPropertySymbol(symbol, data)
is FirFieldSymbol -> renderField(symbol.fir, data)
is FirConstructorSymbol -> visitConstructor(symbol.fir, data)
is FirNamedFunctionSymbol -> {
renderFunctionSymbol(symbol, data)
val fir = symbol.fir
visitValueParameters(fir.valueParameters, data)
data.append(": ")
fir.returnTypeRef.accept(this, data)
}
}
}
override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: StringBuilder) {
visitConstructor(annotationCall, data)
}
override fun visitAnnotation(annotation: FirAnnotation, data: StringBuilder) {}
override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: StringBuilder) {
val coneClassType = delegatedConstructorCall.constructedTypeRef.coneTypeSafe<ConeClassLikeType>()
if (coneClassType != null) {
visitConstructor(delegatedConstructorCall, data)
} else {
data.append("[ERROR : ${delegatedConstructorCall.constructedTypeRef.render()}]")
}
}
override fun visitComparisonExpression(comparisonExpression: FirComparisonExpression, data: StringBuilder) {
data.append("CMP(${comparisonExpression.operation.operator}, ")
comparisonExpression.compareToCall.accept(this, data)
data.append(")")
}
override fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: StringBuilder) {
//skip rendering for as/as?/is/!is
}
override fun visitAssignmentOperatorStatement(assignmentOperatorStatement: FirAssignmentOperatorStatement, data: StringBuilder) {
data.append("assignment operator statement ${assignmentOperatorStatement.operation}")
}
override fun visitEqualityOperatorCall(equalityOperatorCall: FirEqualityOperatorCall, data: StringBuilder) {
data.append("EQ operator call")
}
override fun visitSafeCallExpression(safeCallExpression: FirSafeCallExpression, data: StringBuilder) {
safeCallExpression.receiver.accept(this, data)
data.append("?.{ ")
safeCallExpression.selector.accept(this, data)
data.append(" }")
}
override fun visitCheckedSafeCallSubject(checkedSafeCallSubject: FirCheckedSafeCallSubject, data: StringBuilder) {
data.append("\$subj\$")
}
override fun visitImplicitInvokeCall(implicitInvokeCall: FirImplicitInvokeCall, data: StringBuilder) {
visitFunctionCall(implicitInvokeCall, data)
}
override fun visitFunctionCall(functionCall: FirFunctionCall, data: StringBuilder) {
when (val callee = functionCall.calleeReference) {
is FirResolvedNamedReference -> {
if (functionCall.explicitReceiver == null) {
renderImplicitReceiver(callee.resolvedSymbol, functionCall.source.psi)
}
when (callee.resolvedSymbol) {
is FirConstructorSymbol -> visitConstructor(callee.resolvedSymbol.fir as FirConstructor, data)
else -> renderFunctionSymbol(callee.resolvedSymbol as FirNamedFunctionSymbol, data, functionCall)
}
if (callee is FirResolvedErrorReference) {
data.append(callee.diagnostic.dump())
}
}
is FirErrorNamedReference -> data.append(callee.diagnostic.dump())
}
}
override fun <T> visitConstExpression(constExpression: FirConstExpression<T>, data: StringBuilder) {
when (constExpression.kind) {
ConstantValueKind.String -> return
ConstantValueKind.Null -> constExpression.resolvedType.tryToRenderConeAsFunctionType(data)
else -> data.append(constExpression.kind)
}
}
override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier, data: StringBuilder) {
val fir = resolvedQualifier.symbol?.fir
when {
fir is FirRegularClass && fir.classKind != ClassKind.ENUM_CLASS && fir.companionObjectSymbol?.defaultType() == resolvedQualifier.coneTypeSafe() -> {
data.append("companion object ")
data.append(resolvedQualifier.resolvedType.toFirResolvedTypeRef().render()).append(": ")
data.append(fir.symbol.classId.asString().removeCurrentFilePackage())
}
fir is FirClass -> {
data.append(fir.classKind.name.toLowerCaseAsciiOnly().replace("_", " ")).append(" ")
data.append(fir.symbol.classId.asString().removeCurrentFilePackage())
renderListInTriangles(fir.typeParameters, data)
val superTypes = fir.superTypeRefs
.map { it.render() }
.filter { it != "kotlin/Any" }
.sorted()
if (superTypes.isNotEmpty()) superTypes.joinTo(data, prefix = ": ", separator = ", ")
}
}
}
override fun visitVariableAssignment(variableAssignment: FirVariableAssignment, data: StringBuilder) {
//data.append("variable assignment")
}
override fun visitStarProjection(starProjection: FirStarProjection, data: StringBuilder) {
data.append("*")
}
override fun visitTypeProjectionWithVariance(typeProjectionWithVariance: FirTypeProjectionWithVariance, data: StringBuilder) {
val variance = typeProjectionWithVariance.variance.label
if (variance.isNotEmpty()) data.append("$variance ")
typeProjectionWithVariance.typeRef.accept(this, data)
}
override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: StringBuilder) {
resolvedTypeRef.type.tryToRenderConeAsFunctionType(data)
}
override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: StringBuilder) {
data.append("[ERROR : ${errorTypeRef.diagnostic.reason}]")
}
override fun visitTypeRefWithNullability(typeRefWithNullability: FirTypeRefWithNullability, data: StringBuilder) {
if (typeRefWithNullability.isMarkedNullable) {
data.append("?")
}
}
override fun visitGetClassCall(getClassCall: FirGetClassCall, data: StringBuilder) {
getClassCall.argument.accept(this, data)
}
override fun visitArrayLiteral(arrayLiteral: FirArrayLiteral, data: StringBuilder) {
val name = arrayLiteral.resolvedType.classId!!.shortClassName.asString()
val typeArguments = arrayLiteral.resolvedType.typeArguments
val typeParameters = if (typeArguments.isEmpty()) "" else " <T>"
data.append("fun$typeParameters ${name.replaceFirstChar(Char::lowercaseChar)}Of")
typeArguments.firstOrNull()?.let {
data.append("<")
it.tryToRenderConeAsFunctionType(data)
data.append(">")
}
val valueParameter = name.replace("Array", "").takeIf { it.isNotEmpty() } ?: "T"
data.append("(vararg $valueParameter): $name${typeParameters.trim()}") // TODO change "T" to concrete type is array is primitive
}
private fun FirBasedSymbol<*>.isLocalDeclaration(): Boolean {
return when (val fir = this.fir) {
is FirConstructor -> fir.returnTypeRef.coneType.isLocal()
is FirCallableDeclaration -> {
fir.dispatchReceiverClassLookupTagOrNull()?.toFirRegularClassSymbol(session)?.isLocal ?: false
}
else -> false
}
}
private fun ConeKotlinType.isLocal(): Boolean {
if (this !is ConeClassLikeType) return false
return this.lookupTag.toFirRegularClassSymbol(session)?.isLocal == true
}
// id == packageName + className
private fun getSymbolId(symbol: FirBasedSymbol<*>?): String {
return when (symbol) {
is FirCallableSymbol<*> -> {
if (symbol.isLocalDeclaration()) {
val callableName = symbol.callableId.callableName.asString()
stack.getPathByName(callableName) + callableName
} else {
symbol.callableId.withoutName().removeCurrentFilePackage()
}
}
is FirClassLikeSymbol<*> -> symbol.classId.getWithoutCurrentPackage()
else -> ""
}
}
private fun CallableId.withoutName(): String {
return buildString {
append(packageName.asString().replace('.', '/'))
append("/")
if (className != null) {
append(className)
}
}
}
}
}
@@ -1,38 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.compiler.visualizer
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.psi
import org.jetbrains.kotlin.psi.KtCallableReferenceExpression
class Psi2FirMapper(val map: MutableMap<PsiElement, MutableList<FirElement>>) : FirVisitorVoid() {
override fun visitElement(element: FirElement) {
val psi = element.psi
if (psi != null) {
if (map.putIfAbsent(psi, mutableListOf(element)) != null) {
map[psi]?.add(element)
}
}
element.acceptChildren(this)
}
override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess) {
callableReferenceAccess.extensionReceiver?.let { visitElement(it) }
callableReferenceAccess.dispatchReceiver?.let { visitElement(it) }
callableReferenceAccess.explicitReceiver?.let { visitElement(it) }
val psi = (callableReferenceAccess.calleeReference.psi as? KtCallableReferenceExpression)?.children?.last()
?: return callableReferenceAccess.calleeReference.accept(this)
if (map.putIfAbsent(psi, mutableListOf(callableReferenceAccess.calleeReference)) != null) {
map[psi]?.add(callableReferenceAccess.calleeReference)
}
}
}
@@ -1,14 +0,0 @@
plugins {
kotlin("jvm")
id("jps-compatible")
}
dependencies {
api(project(":compiler:visualizer:common"))
compileOnly(intellijCore())
}
sourceSets {
"main" { projectDefault() }
"test" { }
}
@@ -1,596 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.compiler.visualizer
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.compiler.visualizer.Annotator.annotate
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getChildOfType
import org.jetbrains.kotlin.renderer.ClassifierNamePolicy
import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy
import org.jetbrains.kotlin.renderer.render
import org.jetbrains.kotlin.resolve.BindingContext.*
import org.jetbrains.kotlin.resolve.bindingContextUtil.getAbbreviatedTypeOrType
import org.jetbrains.kotlin.resolve.calls.util.getCall
import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
import org.jetbrains.kotlin.resolve.calls.util.getType
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
import org.jetbrains.kotlin.resolve.calls.util.isSingleUnderscore
import org.jetbrains.kotlin.resolve.descriptorUtil.declaresOrInheritsDefaultValue
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.expressions.DoubleColonLHS
import java.util.*
class PsiVisualizer(private val file: KtFile, analysisResult: AnalysisResult) : BaseRenderer() {
private val bindingContext = analysisResult.bindingContext
private val filePackage = file.packageFqName.toString().replace(".", "/")
private val argumentsLabel = "<PLACE-FOR-ARGUMENTS>"
val descriptorRenderer = PsiDescriptorRenderer()
override fun render(): String {
file.accept(Renderer())
return annotate(file.text, getAnnotations()).joinToString("\n")
}
inner class Renderer : KtVisitorVoid() {
private val implicitReceivers = mutableListOf<ReceiverValue>()
private var lastCallWithLambda = ""
private fun renderType(type: KotlinType?): String {
return type?.let { descriptorRenderer.renderType(it) } ?: "[ERROR: unknown type]"
}
private fun renderType(descriptor: CallableDescriptor?): String {
return renderType(descriptor?.returnType)
}
private fun renderType(expression: KtExpression?): String {
return renderType(expression?.let { bindingContext.getType(it) })
}
override fun visitElement(element: PsiElement) {
element.acceptChildren(this)
}
override fun visitKtElement(element: KtElement) {
element.acceptChildren(this)
}
override fun visitPackageDirective(directive: KtPackageDirective) {
//don't resolve package names
}
override fun visitSuperExpression(expression: KtSuperExpression) {
//don't resolve super expression
}
override fun visitThisExpression(expression: KtThisExpression) {
//don't resolve this expression
}
override fun visitNamedFunction(function: KtNamedFunction) {
if (function.bodyExpression != null && function.equalsToken != null) {
addAnnotation(renderType(function.bodyExpression!!.getType(bindingContext)), function.equalsToken!!)
}
super.visitNamedFunction(function)
}
private fun renderVariableType(variable: KtVariableDeclaration) {
val descriptor = bindingContext[VARIABLE, variable]
if (variable.isSingleUnderscore) return
addAnnotation(renderType(descriptor), variable.nameIdentifier!!)
variable.acceptChildren(this)
}
override fun visitProperty(property: KtProperty) =
renderVariableType(property)
override fun visitDestructuringDeclarationEntry(multiDeclarationEntry: KtDestructuringDeclarationEntry) =
renderVariableType(multiDeclarationEntry)
override fun visitParameter(parameter: KtParameter) {
if ((parameter.isLoopParameter && parameter.destructuringDeclaration == null) || parameter.ownerFunction is KtPropertyAccessor) {
addAnnotation(renderType(bindingContext[VALUE_PARAMETER, parameter]?.returnType), parameter.nameIdentifier!!)
}
super.visitParameter(parameter)
}
override fun visitTypeReference(typeReference: KtTypeReference) {
if (typeReference.text.isEmpty()) {
return super.visitTypeReference(typeReference)
}
val hasResolvedCall = with(object : KtVisitorVoid() {
var hasCall: Boolean = false
override fun visitKtElement(element: KtElement) {
if (!hasCall) {
element.getResolvedCall(bindingContext)?.let {
hasCall = true
element.accept(this@Renderer)
} ?: element.acceptChildren(this)
}
}
}) {
typeReference.accept(this)
this.hasCall
}
if (!hasResolvedCall) {
val type = typeReference.getAbbreviatedTypeOrType(bindingContext)
addAnnotation(renderType(type), typeReference)
}
}
override fun visitConstantExpression(expression: KtConstantExpression) {
addAnnotation(renderType(expression), expression)
}
override fun visitConstructorCalleeExpression(constructorCalleeExpression: KtConstructorCalleeExpression) {
// this is hack for JvmField annotation, for some reason it is not represented as KtAnnotationEntry
if (constructorCalleeExpression.text == "JvmField") {
return addAnnotation("constructor jvm/JvmField()", constructorCalleeExpression)
}
super.visitConstructorCalleeExpression(constructorCalleeExpression)
}
private fun renderCall(expression: KtExpression, renderOn: PsiElement = expression): ResolvedCall<out CallableDescriptor>? {
val call = expression.getCall(bindingContext)
val resolvedCall = expression.getResolvedCall(bindingContext)
if (call == null) {
return null
} else if (resolvedCall == null) {
addAnnotation("[ERROR: not resolved]", expression)
return null
}
fun addReceiverAnnotation(receiver: ReceiverValue?, receiverKind: ExplicitReceiverKind) {
if (receiver != null && resolvedCall.explicitReceiverKind != receiverKind) {
val index = implicitReceivers.indexOf(receiver)
if (index != -1) {
addAnnotation("this@$index", expression, deleteDuplicate = false)
}
}
}
addReceiverAnnotation(resolvedCall.extensionReceiver, ExplicitReceiverKind.EXTENSION_RECEIVER)
addReceiverAnnotation(resolvedCall.dispatchReceiver, ExplicitReceiverKind.DISPATCH_RECEIVER)
val descriptor = resolvedCall.candidateDescriptor.let {
if (it is TypeAliasConstructorDescriptor) it.underlyingConstructorDescriptor else it
}
val typeArguments = resolvedCall.typeArguments
.takeIf { it.isNotEmpty() }
?.values?.joinToString(", ", "<", ">") { renderType(it) } ?: ""
val annotation = descriptorRenderer.render(descriptor).replace(argumentsLabel, typeArguments)
addAnnotation(annotation, renderOn, deleteDuplicate = false)
return resolvedCall
}
override fun visitDotQualifiedExpression(expression: KtDotQualifiedExpression) {
val descriptor = bindingContext[QUALIFIER, expression]?.descriptor
if (descriptor is ClassDescriptor && descriptor.kind == ClassKind.ENUM_ENTRY) {
// if not here, enum entry will be processed as KtSimpleNameExpression
// at this point it is easier to get corresponding qualifier
addAnnotation(descriptorRenderer.render(descriptor), expression.selectorExpression)
}
super.visitDotQualifiedExpression(expression)
}
override fun visitSimpleNameExpression(expression: KtSimpleNameExpression) {
val descriptor = bindingContext[QUALIFIER, expression]?.descriptor
if (descriptor != null) {
addAnnotation(descriptorRenderer.render(descriptor), expression)
} else {
renderCall(expression)
}
}
override fun visitBinaryExpression(expression: KtBinaryExpression) {
val opName = expression.operationReference.getReferencedName()
if (opName == "==" || opName == "!=") {
addAnnotation("EQ operator call", expression.operationReference)
expression.left?.accept(this)
expression.right?.accept(this)
return
}
expression.left?.takeIf { it.node.elementType == KtNodeTypes.ARRAY_ACCESS_EXPRESSION && opName == "=" }?.let {
renderCall(it, expression.operationReference)
}
super.visitBinaryExpression(expression)
}
override fun visitIfExpression(expression: KtIfExpression) {
addAnnotation(renderType(expression), expression.ifKeyword)
super.visitIfExpression(expression)
}
override fun visitWhenExpression(expression: KtWhenExpression) {
addAnnotation(renderType(expression), expression.whenKeyword)
super.visitWhenExpression(expression)
}
override fun visitWhenEntry(ktWhenEntry: KtWhenEntry) {
addAnnotation(renderType(ktWhenEntry.expression), ktWhenEntry.expression!!)
super.visitWhenEntry(ktWhenEntry)
}
override fun visitLambdaExpression(lambdaExpression: KtLambdaExpression) {
val descriptor = bindingContext[DECLARATION_TO_DESCRIPTOR, lambdaExpression.functionLiteral] as AnonymousFunctionDescriptor
val extensionReceiver = descriptor.extensionReceiverParameter ?: return super.visitLambdaExpression(lambdaExpression)
addAnnotation("$lastCallWithLambda@${implicitReceivers.size}", lambdaExpression)
implicitReceivers += extensionReceiver.value
super.visitLambdaExpression(lambdaExpression)
implicitReceivers -= extensionReceiver.value
}
override fun visitCallExpression(expression: KtCallExpression) {
val resolvedCall = renderCall(expression) ?: return super.visitCallExpression(expression)
if (expression.getChildOfType<KtLambdaArgument>() != null) {
lastCallWithLambda = resolvedCall.resultingDescriptor.name.asString()
}
for (child in expression.children) {
if (child.node.elementType != KtNodeTypes.REFERENCE_EXPRESSION) {
child.accept(this)
}
}
}
override fun visitClassLiteralExpression(expression: KtClassLiteralExpression) {
val doubleColonLhs = bindingContext[DOUBLE_COLON_LHS, expression.receiverExpression]
doubleColonLhs?.takeIf { it is DoubleColonLHS.Type }?.let {
addAnnotation(descriptorRenderer.render(it.type.constructor.declarationDescriptor!!), expression)
} ?: super.visitClassLiteralExpression(expression)
}
override fun visitPrefixExpression(expression: KtPrefixExpression) {
val opName = expression.operationReference.getReferencedName()
if (expression.baseExpression?.node?.elementType == KtNodeTypes.INTEGER_CONSTANT && opName == "-") {
return expression.baseExpression!!.accept(this)
}
super.visitPrefixExpression(expression)
}
}
inner class PsiDescriptorRenderer(
private val needToRenderSpecialFun: Boolean = false
) : DeclarationDescriptorVisitor<Unit, StringBuilder> {
private val typeRenderer: DescriptorRenderer = DescriptorRenderer.withOptions {
withDefinedIn = false
modifiers = emptySet()
classifierNamePolicy = object : ClassifierNamePolicy {
override fun renderClassifier(classifier: ClassifierDescriptor, renderer: DescriptorRenderer): String {
if (classifier.name == SpecialNames.NO_NAME_PROVIDED) return "<anonymous>"
return renderFqName(classifier)
}
}
includeAdditionalModifiers = false
parameterNameRenderingPolicy = ParameterNameRenderingPolicy.NONE
parameterNamesInFunctionalTypes = false
withoutTypeParameters = true
renderUnabbreviatedType = false
renderTypeExpansions = true
}
private fun CallableDescriptor.isSpecial(): Boolean {
return this.name.asString().contains("SPECIAL-FUNCTION")
}
private fun DeclarationDescriptor.resolveFakeOverride(): DeclarationDescriptor {
fun CallableMemberDescriptor.isFakeOverrideOrDelegate(): Boolean {
return kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE || kind == CallableMemberDescriptor.Kind.DELEGATION
}
var current = this as? CallableMemberDescriptor
while (current != null && current.isFakeOverrideOrDelegate()) {
current = current.overriddenDescriptors.singleOrNull { !it.isFakeOverrideOrDelegate() }
?: current.overriddenDescriptors.firstOrNull()
}
return current ?: this
}
fun render(declarationDescriptor: DeclarationDescriptor): String {
if (declarationDescriptor is CallableDescriptor && declarationDescriptor.isSpecial()) {
return if (needToRenderSpecialFun) this.renderSpecialFunction(declarationDescriptor) else ""
}
return buildString {
declarationDescriptor.resolveFakeOverride().original.accept(this@PsiDescriptorRenderer, this)
}
}
fun renderType(type: KotlinType): String {
return typeRenderer.renderType(type)
}
private fun renderName(descriptor: DeclarationDescriptor, hasReceiver: Boolean = false): String {
return if (hasReceiver) {
descriptor.name.asString()
} else {
renderFqName(descriptor)
}
}
private fun renderFqName(descriptor: DeclarationDescriptor, removeCurrentPackage: Boolean = true): String {
if (descriptor is TypeParameterDescriptor) return descriptor.name.render()
val fqName = qualifierNameCombine(descriptor)
return if (removeCurrentPackage) removeCurrentFilePackage(fqName) else fqName
}
private fun qualifierNameCombine(descriptor: DeclarationDescriptor): String {
val nameString = descriptor.name.render().let { if (it == SpecialNames.NO_NAME_PROVIDED.asString()) "<anonymous>" else it }
if (nameString == FqName.ROOT.toString()) return ""
val containingDeclaration = descriptor.containingDeclaration
val qualifier = qualifierName(containingDeclaration)
val separator =
if (containingDeclaration is PackageFragmentDescriptor || containingDeclaration is PackageViewDescriptor) "/" else "."
return if (qualifier != "") qualifier + separator + nameString else nameString
}
private fun qualifierName(descriptor: DeclarationDescriptor?): String = when (descriptor) {
is ModuleDescriptor, null -> ""
is PackageFragmentDescriptor, is PackageViewDescriptor -> descriptor.fqNameUnsafe.render().replace(".", "/")
else -> qualifierNameCombine(descriptor)
}
private fun removeCurrentFilePackage(fqName: String): String {
return if (fqName.startsWith(filePackage) && !fqName.substring(filePackage.length + 1).contains("/")) {
fqName.replaceFirst("$filePackage/", "")
} else {
fqName
}
}
private fun renderReceiver(descriptor: CallableDescriptor, data: StringBuilder): ReceiverParameterDescriptor? {
return descriptor.extensionReceiverParameter?.also {
visitReceiverParameterDescriptor(it, data)
data.append(".")
} ?: descriptor.dispatchReceiverParameter?.also {
data.append("(")
visitReceiverParameterDescriptor(it, data)
data.append(").")
}
}
private fun renderSuperTypes(klass: ClassDescriptor, builder: StringBuilder) {
if (KotlinBuiltIns.isNothing(klass.defaultType)) return
val supertypes = klass.typeConstructor.supertypes
.filter { !KotlinBuiltIns.isAnyOrNullableAny(it) }
.map { renderType(it) }
.sorted()
if (supertypes.isEmpty()) return
supertypes.joinTo(builder, prefix = ": ", separator = ", ")
}
private fun renderValueParameter(
parameter: ValueParameterDescriptor, includeNames: Boolean, data: StringBuilder, topLevel: Boolean
) {
renderVariable(parameter, includeNames, data, topLevel)
if (parameter.declaresOrInheritsDefaultValue()) {
data.append(" = ...")
}
}
private fun renderVariable(variable: VariableDescriptor, includeName: Boolean, data: StringBuilder, topLevel: Boolean) {
val realType = variable.type
val varargElementType = (variable as? ValueParameterDescriptor)?.varargElementType
val typeToRender = varargElementType ?: realType
if (varargElementType != null) data.append("vararg ")
if (topLevel && variable !is ValueParameterDescriptor) data.append(if (variable.isVar) "var" else "val").append(" ")
if (includeName) {
data.append(renderName(variable)).append(": ")
}
data.append(renderType(typeToRender))
}
private fun renderSpecialFunction(descriptor: CallableDescriptor): String {
val descriptorName = descriptor.name.asString()
val name = when {
descriptorName.contains("ELVIS") -> "?:"
descriptorName.contains("EXCLEXCL") -> "!!"
else -> "UNKNOWN"
}
val valueParameters = buildString { visitValueParameters(descriptor.valueParameters, this) }
val returnType = descriptor.returnType?.let { renderType(it) } ?: "[ERROR: unknown type]"
return "fun $name $valueParameters: $returnType"
}
override fun visitPackageFragmentDescriptor(descriptor: PackageFragmentDescriptor, data: StringBuilder) {
//data.append("package-fragment ${renderFqName(descriptor, removeCurrentPackage = false)}")
}
override fun visitPackageViewDescriptor(descriptor: PackageViewDescriptor, data: StringBuilder) {
// don't render package because support the same logic in fir is very hard
//data.append("package ${renderFqName(descriptor, removeCurrentPackage = false)}")
}
override fun visitVariableDescriptor(variable: VariableDescriptor, data: StringBuilder) {
renderVariable(variable, true, data, true)
}
override fun visitFunctionDescriptor(function: FunctionDescriptor, data: StringBuilder) {
data.append("fun ")
visitTypeParameters(function.typeParameters, data)
if (function.typeParameters.isNotEmpty()) data.append(" ")
//render receiver
val receiver = renderReceiver(function, data)
//render name
data.append(renderName(function, receiver != null))
//render type arguments
data.append(argumentsLabel)
//render value parameters
visitValueParameters(function.valueParameters, data)
//render return type
val returnType = function.returnType
data.append(": ").append(if (returnType == null) "[NULL]" else renderType(returnType))
renderWhereSuffix(function.typeParameters, data)
}
private fun renderWhereSuffix(typeParameters: List<TypeParameterDescriptor>, data: StringBuilder) {
val upperBoundStrings = ArrayList<String>(0)
for (typeParameter in typeParameters) {
typeParameter.upperBounds
.drop(1) // first parameter is rendered by renderTypeParameter
.mapTo(upperBoundStrings) { renderName(typeParameter) + " : " + renderType(it) }
}
if (upperBoundStrings.isNotEmpty()) {
data.append(" where ")
upperBoundStrings.joinTo(data, ", ")
}
}
private fun visitTypeParameters(typeParameters: List<TypeParameterDescriptor>, data: StringBuilder) {
if (typeParameters.isNotEmpty()) {
data.append("<")
val iterator = typeParameters.iterator()
while (iterator.hasNext()) {
val typeParameterDescriptor = iterator.next()
visitTypeParameterDescriptor(typeParameterDescriptor, data)
if (iterator.hasNext()) {
data.append(", ")
}
}
data.append(">")
}
}
override fun visitTypeParameterDescriptor(typeParameter: TypeParameterDescriptor, data: StringBuilder) {
data.append(renderName(typeParameter, true))
val upperBoundsCount = typeParameter.upperBounds.size
if (upperBoundsCount >= 1) {
val upperBound = typeParameter.upperBounds.iterator().next()
if (!KotlinBuiltIns.isDefaultBound(upperBound)) {
data.append(" : ").append(renderType(upperBound))
}
}
}
override fun visitClassDescriptor(klass: ClassDescriptor, data: StringBuilder) {
data.append(DescriptorRenderer.getClassifierKindPrefix(klass)).append(" ")
//render name
data.append(renderName(klass))
if (klass.kind == ClassKind.ENUM_ENTRY) return
visitTypeParameters(klass.declaredTypeParameters, data)
renderSuperTypes(klass, data)
renderWhereSuffix(klass.declaredTypeParameters, data)
}
override fun visitTypeAliasDescriptor(typeAlias: TypeAliasDescriptor, data: StringBuilder) {
data.append("typealias").append(" ")
data.append(renderName(typeAlias))
visitTypeParameters(typeAlias.declaredTypeParameters, data)
data.append(" = ").append(renderType(typeAlias.underlyingType))
}
override fun visitModuleDeclaration(descriptor: ModuleDescriptor, data: StringBuilder) {
data.append(renderName(descriptor))
}
override fun visitConstructorDescriptor(constructor: ConstructorDescriptor, data: StringBuilder) {
data.append("constructor").append(" ")
val classDescriptor = constructor.containingDeclaration
data.append(renderName(classDescriptor))
visitTypeParameters(constructor.typeParameters, data)
visitValueParameters(constructor.valueParameters, data)
renderWhereSuffix(constructor.typeParameters, data)
}
override fun visitScriptDescriptor(scriptDescriptor: ScriptDescriptor, data: StringBuilder) {
visitClassDescriptor(scriptDescriptor, data)
}
override fun visitPropertyDescriptor(property: PropertyDescriptor, data: StringBuilder) {
data.append(if (property.isVar) "var" else "val").append(" ")
if (property !is SyntheticPropertyDescriptor) {
visitTypeParameters(property.typeParameters, data)
if (property.typeParameters.isNotEmpty()) data.append(" ")
}
//render receiver
val receiver = when (property) {
is SyntheticPropertyDescriptor -> renderReceiver(property.getMethod, data)
else -> renderReceiver(property, data)
}
//render name
data.append(renderName(property, receiver != null))
//render return type
data.append(": ").append(renderType(property.type))
renderWhereSuffix(property.typeParameters, data)
}
private fun visitValueParameters(parameters: List<ValueParameterDescriptor>, data: StringBuilder) {
data.append("(")
for ((index, parameter) in parameters.withIndex()) {
renderValueParameter(parameter, false, data, false)
if (index != parameters.size - 1) {
data.append(", ")
}
}
data.append(")")
}
override fun visitValueParameterDescriptor(parameter: ValueParameterDescriptor, data: StringBuilder) {
renderValueParameter(parameter, true, data, true)
}
override fun visitPropertyGetterDescriptor(descriptor: PropertyGetterDescriptor, data: StringBuilder) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun visitPropertySetterDescriptor(descriptor: PropertySetterDescriptor, data: StringBuilder) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun visitReceiverParameterDescriptor(descriptor: ReceiverParameterDescriptor, data: StringBuilder) {
data.append(renderType(descriptor.type))
}
}
}
@@ -1,4 +0,0 @@
open class A
class B : A
@@ -1,13 +0,0 @@
abstract class A {
abstract class Nested
}
typealias TA = A
// constructor A()
// │
class B : TA() {
// constructor A.Nested()
// │
class NestedInB : Nested()
}
@@ -1,21 +0,0 @@
package p
abstract class My {
// constructor My()
// │
abstract class NestedOne : My() {
// constructor My.NestedOne()
// │
abstract class NestedTwo : NestedOne() {
}
}
}
// constructor My()
// │
class Your : My() {
// constructor My.NestedOne()
// │
class NestedThree : NestedOne()
}
@@ -1,85 +0,0 @@
// FIR_IGNORE
//constructor annotation/Target(vararg annotation/AnnotationTarget)
//│
@Target(
// enum class annotation/AnnotationTarget: Enum<annotation/AnnotationTarget>
// │ enum entry annotation/AnnotationTarget.CLASS
// │ │
AnnotationTarget.CLASS,
// enum class annotation/AnnotationTarget: Enum<annotation/AnnotationTarget>
// │ enum entry annotation/AnnotationTarget.PROPERTY
// │ │
AnnotationTarget.PROPERTY,
// enum class annotation/AnnotationTarget: Enum<annotation/AnnotationTarget>
// │ enum entry annotation/AnnotationTarget.LOCAL_VARIABLE
// │ │
AnnotationTarget.LOCAL_VARIABLE,
// enum class annotation/AnnotationTarget: Enum<annotation/AnnotationTarget>
// │ enum entry annotation/AnnotationTarget.VALUE_PARAMETER
// │ │
AnnotationTarget.VALUE_PARAMETER,
// enum class annotation/AnnotationTarget: Enum<annotation/AnnotationTarget>
// │ enum entry annotation/AnnotationTarget.CONSTRUCTOR
// │ │
AnnotationTarget.CONSTRUCTOR,
// enum class annotation/AnnotationTarget: Enum<annotation/AnnotationTarget>
// │ enum entry annotation/AnnotationTarget.FUNCTION
// │ │
AnnotationTarget.FUNCTION,
// enum class annotation/AnnotationTarget: Enum<annotation/AnnotationTarget>
// │ enum entry annotation/AnnotationTarget.TYPE
// │ │
AnnotationTarget.TYPE
) annotation class base
//constructor base()
//│
@base annotation class derived
//constructor base() constructor base()
//│ │
@base class correct(@base val x: Int) {
// constructor base() Int
// │ │
@base constructor(): this(0)
}
//constructor base()
//│
@base enum class My {
// constructor base()
// │
@base FIRST,
// constructor base()
// │
@base SECOND
}
//constructor base()
//│ constructor base()
//│ │ constructor base()
//│ │ │
@base fun foo(@base y: @base Int): Int {
// constructor base()
// │ constructor base()
// │ │ constructor base()
// │ │ │ Int
// │ │ │ │ foo.bar.z: Int
// │ │ │ │ │ fun (Int).plus(Int): Int
// │ │ │ │ │ │ Int
// │ │ │ │ │ │ │
@base fun bar(@base z: @base Int) = z + 1
// constructor base()
// │ fun foo.bar(Int): Int
// │ Int │ foo.y: Int
// │ │ │ │
@base val local = bar(y)
// val foo.local: Int
// │
return local
}
//constructor base()
//│ Int Int
//│ │ │
@base val z = 0
@@ -1,15 +0,0 @@
// FIR_IGNORE
package a.b
class C<T, out S> {
inner class D<R, in P> {
}
}
interface Test {
// C<out CharSequence, *>.D<in collections/List<*>, *>
// │ C<out CharSequence, *>.D<in collections/List<*>, *>
// │ │
val x: a.b.C<out CharSequence, *>.D<in List<*>, *>
}
@@ -1,24 +0,0 @@
object A {
constructor()
init {}
}
enum class B {
// constructor B()
// │
X() {
constructor()
}
}
class C {
companion object {
constructor()
}
}
// Any
// │
val anonObject = object {
constructor()
}
@@ -1,30 +0,0 @@
// FIR_IGNORE
private fun resolveAccessorCall(
// [ERROR : PropertyDescriptor]
// │
suspendPropertyDescriptor: PropertyDescriptor,
// [ERROR : TranslationContext]
// │
context: TranslationContext
// [ERROR : ResolvedCall<PropertyDescriptor>]<[ERROR : PropertyDescriptor]>
// │
): ResolvedCall<PropertyDescriptor> {
// [ERROR : ResolvedCall<PropertyDescriptor>]<[ERROR : PropertyDescriptor]>
// │
return object : ResolvedCall<PropertyDescriptor> {
// [ERROR : <ERROR PROPERTY TYPE>]
// │ [ERROR: not resolved]
// │ │ [ERROR: not resolved]
// │ │ │
override fun getStatus() = ResolutionStatus.SUCCESS
// [ERROR : PropertyDescriptor]
// │ resolveAccessorCall.suspendPropertyDescriptor: [ERROR : PropertyDescriptor]
// │ │
override fun getCandidateDescriptor() = suspendPropertyDescriptor
// [ERROR : PropertyDescriptor]
// │ resolveAccessorCall.suspendPropertyDescriptor: [ERROR : PropertyDescriptor]
// │ │
override fun getResultingDescriptor() = suspendPropertyDescriptor
}
}
@@ -1,17 +0,0 @@
// FIR_IGNORE
fun test1(s: String?) contract [returnsNotNull()] {
// [ERROR: not resolved]
// │
contract {
// [ERROR: not resolved]
// │ [ERROR: not resolved]
// │ │ test1.s: String?
// │ │ │ EQ operator call
// │ │ │ │ Nothing?
// │ │ │ │ │
returns() implies (s != null)
}
// fun test1(String?): Unit
// │
test1()
}
@@ -1,60 +0,0 @@
// new contracts syntax for property accessors
class MyClass {
// Int Int
// │ │
var myInt: Int = 0
// Int
// │
get() contract [returnsNotNull()] = 1
// Int
// │
set(value) {
// var MyClass.<set-myInt>.field: Int
// │ MyClass.<set-myInt>.value: Int
// │ │ fun (Int).times(Int): Int
// │ │ │ Int
// │ │ │ │
field = value * 10
}
}
class AnotherClass(multiplier: Int) {
// Int Int
// │ │
var anotherInt: Int = 0
// Int
// │
get() contract [returnsNotNull()] = 1
// Int
// │
set(value) contract [returns()] {
// var AnotherClass.<set-anotherInt>.field: Int
// │ AnotherClass.<set-anotherInt>.value: Int
// │ │ [ERROR: not resolved]
// │ │ │ [ERROR: not resolved]
// │ │ │ │
field = value * multiplier
}
}
class SomeClass(multiplier: Int?) {
// Int Int
// │ │
var someInt: Int = 0
// Int
// │
get() contract [returnsNotNull()] = 1
// EQ operator call
// Int │ [ERROR: unknown type]
// │ │ │
set(value) contract [returns() implies (value != null)] {
// SomeClass.<set-someInt>.value: Int
// │ [ERROR: not resolved]
// │ │
value ?: throw NullArgumentException()
// var SomeClass.<set-someInt>.field: Int
// │ SomeClass.<set-someInt>.value: Int
// │ │
field = value
}
}
@@ -1,16 +0,0 @@
// FIR_IGNORE
// new contracts syntax for simple functions
// EQ operator call
// [ERROR : MyClass]? │ [ERROR: unknown type] [ERROR: unknown type]
// │ │ │ │
fun test1(s: MyClass?) contract [returns() implies (s != null), returns() implies (s is MySubClass)] {
// [ERROR: not resolved]
// │
test_1()
}
fun test2() contract [returnsNotNull()] {
// fun test2(): Unit
// │
test2()
}
@@ -1,126 +0,0 @@
// FIR_IGNORE
// Should have raw description
fun test_1() {
// [ERROR: not resolved]
// │
contract {
// [ERROR: not resolved]
// │
callsInPlace()
}
// fun test_1(): Unit
// │
test_1()
}
fun test_2() {
// fun contracts/contract(contracts/ContractBuilder.() -> Unit): Unit
// │ contract@0
// │ │
kotlin.contracts.contract {
// fun <R> (contracts/ContractBuilder).callsInPlace<???>(Function<R>, contracts/InvocationKind = ...): contracts/CallsInPlace
// this@0
// │
callsInPlace()
// fun <R> (contracts/ContractBuilder).callsInPlace<???>(Function<R>, contracts/InvocationKind = ...): contracts/CallsInPlace
// this@0
// │
callsInPlace()
}
// fun test_2(): Unit
// │
test_2()
}
// Int Int
// │ │
var test_3: Int = 1
get() {
// [ERROR: not resolved]
// │
contract {
// [ERROR: not resolved]
// │
callsInPlace()
}
// Int
// │
return 1
}
// Int
// │
set(value) {
// fun contracts/contract(contracts/ContractBuilder.() -> Unit): Unit
// │ contract@0
// │ │
kotlin.contracts.contract {
// fun <R> (contracts/ContractBuilder).callsInPlace<???>(Function<R>, contracts/InvocationKind = ...): contracts/CallsInPlace
// this@0
// │
callsInPlace()
// fun <R> (contracts/ContractBuilder).callsInPlace<???>(Function<R>, contracts/InvocationKind = ...): contracts/CallsInPlace
// this@0
// │
callsInPlace()
}
}
fun test_4() {
// [ERROR: not resolved]
// │
contract()
// fun test_4(): Unit
// │
test_4()
}
// should not have raw description
fun test_5() {
// fun test_5(): Unit
// │
test_5()
// [ERROR: not resolved]
// │
contract()
}
fun test_6() {
// [ERROR: not resolved]
// │ [ERROR: not resolved]
// │ │ [ERROR: not resolved]
// │ │ │ [ERROR: not resolved]
// │ │ │ │
aaa.bbb.ccc.contract {
}
// fun test_6(): Unit
// │
test_6()
}
fun test_7() {
// [ERROR: not resolved]
// │ [ERROR: not resolved]
// │ │
contracts.contract {
}
// fun test_7(): Unit
// │
test_7()
}
fun test_8() {
// [ERROR: not resolved]
// │ [ERROR: not resolved]
// │ │ [ERROR: not resolved]
// │ │ │ [ERROR: not resolved]
// │ │ │ │
aaa.kotlin.contracts.contract {
}
// fun test_8(): Unit
// │
test_8()
}
@@ -1,31 +0,0 @@
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
// fun <T> lazy<Int>(() -> T): Lazy<T>
// │ Int
// │ │ fun (Int).plus(Int): Int
// Int │ │ │ Int
// │ │ │ │ │
val x: Int by lazy { 1 + 2 }
// properties/ReadWriteProperty<Any?, Int>
// │ properties/ReadWriteProperty<Any?, Int>
// │ │
val delegate = object: ReadWriteProperty<Any?, Int> {
// reflect/KProperty<*>
// │ Int
// │ │ Int
// │ │ │
override fun getValue(thisRef: Any?, property: KProperty<*>): Int = 1
// reflect/KProperty<*>
// │
override fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {}
}
// Int val delegate: properties/ReadWriteProperty<Any?, Int>
// │ │
val value by delegate
// Int val delegate: properties/ReadWriteProperty<Any?, Int>
// │ │
var variable by delegate
@@ -1,12 +0,0 @@
open class Base<T>(val x: T)
// constructor Base<T>(T)
// │ Derived.<init>.x: T
// │ │
class Derived<T : Any>(x: T) : Base<T>(x)
// Derived<T>
// │ constructor Derived<T : Any>(T)
// │ │ create.x: T
// │ │ │
fun <T : Any> create(x: T): Derived<T> = Derived(x)
@@ -1,5 +0,0 @@
fun test() {
// <anonymous>
// │
val x = object {}
}
@@ -1,81 +0,0 @@
import my.println
enum class Order {
FIRST,
SECOND,
THIRD
}
enum class Planet(val m: Double, internal val r: Double) {
// constructor Planet(Double, Double)
// │Double
// ││ Double
// ││ │
MERCURY(1.0, 2.0) {
override fun sayHello() {
// fun io/println(Any?): Unit
// │
println("Hello!!!")
}
},
// constructor Planet(Double, Double)
// │Double
// ││ Double
// ││ │
VENERA(3.0, 4.0) {
override fun sayHello() {
// fun io/println(Any?): Unit
// │
println("Ola!!!")
}
},
// constructor Planet(Double, Double)
// │Double
// ││ Double
// ││ │
EARTH(5.0, 6.0) {
override fun sayHello() {
// fun io/println(Any?): Unit
// │
println("Privet!!!")
}
};
// val (Planet.Companion).G: Double
// │ fun (Double).times(Double): Double
// │ │ val (Planet).m: Double
// │ │ │ fun (Double).div(Double): Double
// │ │ │ │ val (Planet).r: Double
// │ │ │ │ │ fun (Double).times(Double): Double
// Double │ │ │ │ │ │ val (Planet).r: Double
// │ │ │ │ │ │ │ │
val g: Double = G * m / (r * r)
abstract fun sayHello()
companion object {
// Double
// │ Double
// │ │
const val G = 6.67e-11
}
}
enum class PseudoInsn(val signature: String = "()V") {
FIX_STACK_BEFORE_JUMP,
// constructor PseudoInsn(String = ...)
// │
FAKE_ALWAYS_TRUE_IFEQ("()I"),
// constructor PseudoInsn(String = ...)
// │
FAKE_ALWAYS_FALSE_IFEQ("()I"),
SAVE_STACK_BEFORE_TRY,
RESTORE_STACK_IN_TRY_CATCH,
STORE_NOT_NULL,
// constructor PseudoInsn(String = ...)
// │
AS_NOT_NULL("(Ljava/lang/Object;)Ljava/lang/Object;")
;
fun emit() {}
}
@@ -1,30 +0,0 @@
interface Some
object O1 : Some
object O2 : Some
enum class SomeEnum(val x: Some) {
// constructor SomeEnum(Some)
// │object O1: Some
// ││
FIRST(O1) {
// Boolean
// │ Boolean
// │ │
override fun check(y: Some): Boolean = true
},
// constructor SomeEnum(Some)
// │object O2: Some
// ││
SECOND(O2) {
// Boolean
// │ SomeEnum.SECOND.check.y: Some
// │ │ EQ operator call
// │ │ │ object O2: Some
// │ │ │ │
override fun check(y: Some): Boolean = y == O2
};
abstract fun check(y: Some): Boolean
}
@@ -1,17 +0,0 @@
expect class MyClass
expect fun foo(): String
// Int
// │
expect val x: Int
actual class MyClass
// String
// │
actual fun foo() = "Hello"
// Int Int
// │ │
actual val x = 42
@@ -1,24 +0,0 @@
external class External
external fun foo(): String
// Int
// │
external val x: Int
class NotExternal {
external fun bar(): String
// Int
// │
var y: Int
external get
// Int
// │
set(value) {}
}
// Int
// │
var z: Int
external get
external set
@@ -1,15 +0,0 @@
// T fun (() -> R).invoke(): R
// │ │
fun <T> simpleRun(f: () -> T): T = f()
// collections/List<T>
// │
fun <T, R> List<T>.simpleMap(f: (T) -> R): R {
}
// Unit
// │ simpleWith.t: T
// │ │ fun P1.invoke(): R
// │ │ │
fun <T> simpleWith(t: T, f: T.() -> Unit): Unit = t.f()
@@ -1,10 +0,0 @@
// FIR_IGNORE
interface Any
// T?
// │
inline fun <reified T : Any> Any.safeAs(): T? = this as? T
abstract class Summator {
abstract fun <T> plus(first: T, second: T): T
}
@@ -1,8 +0,0 @@
// Nothing
// │ fun TODO(): Nothing
// │ │
fun <T> genericFoo(): T = TODO()
// T fun <T> genericFoo<T>(): T
// │ │
val <T> T.generic: T get() = genericFoo()
@@ -1,12 +0,0 @@
abstract class Base(val s: String)
class Outer {
// constructor Base(String)
// │ Outer.Derived.<init>.s: String
// │ │
class Derived(s: String) : Base(s)
// constructor Base(String)
// │
object Obj : Base("")
}
@@ -1,14 +0,0 @@
class NoPrimary {
// String
// │
val x: String
constructor(x: String) {
// val (NoPrimary).x: String
// │ NoPrimary.<init>.x: String
// │ │
this.x = x
}
constructor(): this("")
}
@@ -1,39 +0,0 @@
interface SomeInterface {
fun foo(x: Int, y: String): String
// Boolean
// │
val bar: Boolean
}
class SomeClass : SomeInterface {
// Int Int
// │ │
private val baz = 42
override fun foo(x: Int, y: String): String {
// SomeClass.foo.y: String
// │ fun (String).plus(Any?): String
// │ │ SomeClass.foo.x: Int
// │ │ │ fun (String).plus(Any?): String
// │ │ │ │ val (SomeClass).baz: Int
// │ │ │ │ │
return y + x + baz
}
// Boolean
// │
override var bar: Boolean
// Boolean
// │
get() = true
// Boolean
// │
set(value) {}
// Double
// │
lateinit var fau: Double
}
inline class InlineClass
@@ -1,3 +0,0 @@
fun foo() {}
suspend fun bar() {}
@@ -1,7 +0,0 @@
interface B
typealias C = B
// B
// │
class D : C
@@ -1,9 +0,0 @@
open class A
interface B<S, T : A>
typealias C<T> = B<T, A>
// B<A, A>
// │
class D : C<A>
@@ -1,28 +0,0 @@
// FIR_IGNORE
package test
interface Some
abstract class My<T : Some> {
inner class T
// T
// │
abstract val x: T
abstract fun foo(arg: T)
// [ERROR : T]
// │ [ERROR : T]
// │ │
abstract val y: My.T
// [ERROR : T]
// │ [ERROR : T]
// │ │
abstract val z: test.My.T
// [ERROR : T]
// │
class Some : T()
}
@@ -1,23 +0,0 @@
interface List<out T : Any> {
operator fun get(index: Int): T
infix fun concat(other: List<T>): List<T>
}
typealias StringList = List<out String>
typealias AnyList = List<*>
abstract class AbstractList<out T : Any> : List<T>
// constructor AbstractList<T : Any>()
// │
class SomeList : AbstractList<Int>() {
// Int
// │ Int
// │ │
override fun get(index: Int): Int = 42
// SomeList
// │
override fun concat(other: List<Int>): List<Int> = this
}
@@ -1,6 +0,0 @@
interface A
interface B
class C<T> where T : A, T : B {
}
@@ -1,52 +0,0 @@
//constructor annotation/Target(vararg annotation/AnnotationTarget)
//│ enum class annotation/AnnotationTarget: Enum<annotation/AnnotationTarget>
//│ │ enum entry annotation/AnnotationTarget.EXPRESSION
//│ │ │ enum class annotation/AnnotationTarget: Enum<annotation/AnnotationTarget>
//│ │ │ │ enum entry annotation/AnnotationTarget.LOCAL_VARIABLE
//│ │ │ │ │
@Target(AnnotationTarget.EXPRESSION, AnnotationTarget.LOCAL_VARIABLE)
//constructor annotation/Retention(annotation/AnnotationRetention = ...)
//│ enum class annotation/AnnotationRetention: Enum<annotation/AnnotationRetention>
//│ │ enum entry annotation/AnnotationRetention.SOURCE
//│ │ │
@Retention(AnnotationRetention.SOURCE)
annotation class Ann
fun foo(arg: Int): Int {
// constructor Ann()
// │ foo.arg: Int
// │ │ EQ operator call
// Unit │ │ │ Int
// │ │ │ │ │
if (@Ann arg == 0) {
// constructor Ann()
// │ Int
// │ │
@Ann return 1
}
// constructor Ann()
// │ Unit
// │ │ foo.arg: Int
// │ │ │ EQ operator call
// │ │ │ │ Int
// │ │ │ │ │
@Ann if (arg == 1) {
// constructor Ann()
// │ Int
// │ │
return (@Ann 1)
}
// Int
// │
return 42
}
data class Two(val x: Int, val y: Int)
fun bar(two: Two) {
// constructor Ann()
// │ constructor Ann()
// │ Int │ Int bar.two: Two
// │ │ │ │ │
val (@Ann x, @Ann y) = two
}
@@ -1,25 +0,0 @@
// Int Int
// │ │
val p = 0
// Int
// │ Int
// │ │
fun foo() = 1
class Wrapper(val v: IntArray)
// Int
// │ test.a: IntArray
// │ │ Int
// │ │ │ fun (Int).plus(Int): Int
// │ │ │ │ test.a: IntArray
// │ │ │ │ │ val p: Int
// │ │ │ │ │ │ fun (Int).plus(Int): Int
// │ │ │ │ │ │ │ test.a: IntArray
// │ │ │ │ │ │ │ │ fun foo(): Int
// │ │ │ │ │ │ │ │ │ fun (Int).plus(Int): Int
// │ │ │ │ │ │ │ │ │ │ test.w: Wrapper
// │ │ │ │ │ │ │ │ │ │ │ val (Wrapper).v: IntArray
// │ │ │ │ │ │ │ │ │ │ │ │ Int
// │ │ │ │ │ │ │ │ │ │ │ │ │
fun test(a: IntArray, w: Wrapper) = a[0] + a[p] + a[foo()] + w.v[0]
@@ -1,32 +0,0 @@
fun test() {
// IntArray
// │ fun intArrayOf(vararg Int): IntArray
// │ │ Int
// │ │ │ Int
// │ │ │ │ Int
// │ │ │ │ │
val x = intArrayOf(1, 2, 3)
// val test.x: IntArray
// │ Int
// │ │ fun (IntArray).set(Int, Int): Unit
// │ │ │ Int
// │ │ │ │
x[1] = 0
}
// Int
// │ Int
// │ │
fun foo() = 1
fun test2() {
// fun intArrayOf(vararg Int): IntArray
// │ Int
// │ │ Int
// │ │ │ Int
// │ │ │ │ fun foo(): Int
// │ │ │ │ │ fun (IntArray).set(Int, Int): Unit
// │ │ │ │ │ │ Int
// │ │ │ │ │ │ │
intArrayOf(1, 2, 3)[foo()] = 1
}
@@ -1,92 +0,0 @@
// FIR_IGNORE
// WITH_STDLIB
// foo.a: Int
// │ fun (Int).compareTo(Int): Int
// │ │ foo.b: Int
// Int │ │ │ foo.a: Int
// │ Int │ │ │ │ foo.b: Int
// │ │ │ │ │ │ │
fun foo(a: Int, b: Int) = if (a > b) a else b
fun bar(a: Double, b: Double): Double {
// Nothing
// │ bar.a: Double
// │ │ fun (Double).compareTo(Double): Int
// │ │ │ bar.b: Double
// │ │ │ │
if (a > b) {
// fun io/println(Double): Unit
// │ bar.a: Double
// │ │
println(a)
// bar.a: Double
// │
return a
} else {
// fun io/println(Double): Unit
// │ bar.b: Double
// │ │
println(b)
// bar.b: Double
// │
return b
}
}
fun baz(a: Long, b: Long): Long {
// Nothing
// │
when {
// baz.a: Long
// │ fun (Long).compareTo(Long): Int
// │ │ baz.b: Long
// │ │ │ Nothing
// │ │ │ │
a > b -> {
// fun io/println(Long): Unit
// │ baz.a: Long
// │ │
println(a)
// baz.a: Long
// │
return a
}
// Nothing
// │ baz.b: Long
// │ │
else -> return b
}
}
fun grade(g: Int): String {
// String
// │ grade.g: Int
// │ │
return when (g) {
// Int
// │ Int String
// │ │ │
6, 7 -> "Outstanding"
// Int String
// │ │
5 -> "Excellent"
// Int String
// │ │
4 -> "Good"
// Int String
// │ │
3 -> "Mediocre"
// fun (ranges/IntRange).contains(Int): Boolean
// │ Int
// │ │fun (Int).rangeTo(Int): ranges/IntRange
// │ ││ Int String
// │ ││ │ │
in 1..2 -> "Fail"
// String
// │
is Number -> "Number"
// String
// │
else -> "Unknown"
}
}
@@ -1,58 +0,0 @@
// FIR_IGNORE
class A {
fun foo() {}
// Int Int
// │ │
val bar = 0
}
fun A.qux() {}
fun baz() {}
// reflect/KFunction0<Unit>
// │ constructor A()
// │ │ fun (A).foo(): Unit
// │ │ │
val test1 = A()::foo
// reflect/KProperty0<Int>
// │ constructor A()
// │ │ val (A).bar: Int
// │ │ │
val test2 = A()::bar
// reflect/KFunction0<Unit>
// │ constructor A()
// │ │ fun A.qux(): Unit
// │ │ │
val test3 = A()::qux
// reflect/KFunction1<A, Unit>
// │ class A
// │ │ fun (A).foo(): Unit
// │ │ │
val test4 = A::foo
// reflect/KProperty1<A, Int>
// │ class A
// │ │ val (A).bar: Int
// │ │ │
val test5 = A::bar
// reflect/KFunction1<A, Unit>
// │ class A
// │ │ fun A.qux(): Unit
// │ │ │
val test6 = A::qux
// reflect/KFunction0<Unit>
// │ fun baz(): Unit
// │ │
val test7 = ::baz
// reflect/KFunction1<A?, Unit>
// │ class A
// │ │ fun (A).foo(): Unit
// │ │ │
val test8 = A?::foo
@@ -1,72 +0,0 @@
// WITH_STDLIB
// fun (Int).plus(Int): Int
// Int │ distance.y: Int
// │ │ │
infix fun Int.distance(y: Int) = this + y
// Int
// │ Int
// │ │ fun Int.distance(Int): Int
// │ │ │ Int
// │ │ │ │
fun test(): Int = 3 distance 4
// Int
// │ Int
// │ │ fun Int.distance(Int): Int
// │ │ │ Int
// │ │ │ │
fun testRegular(): Int = 3.distance(4)
class My(var x: Int) {
// Int
// │ var (My).x: Int
// │ │
operator fun invoke() = x
fun foo() {}
// My
// │ constructor My(Int)
// │ │ var (My).x: Int
// │ │ │
fun copy() = My(x)
}
// Int
// │ constructor My(Int)
// │ fun (My).invoke(): Int
// │ │ Int
// │ │ │
fun testInvoke(): Int = My(13)()
fun testQualified(first: My, second: My?) {
// fun io/println(Int): Unit
// │ testQualified.first: My
// │ │ var (My).x: Int
// │ │ │
println(first.x)
// fun io/println(Any?): Unit
// │ testQualified.second: My?
// │ │ var (My).x: Int
// │ │ │
println(second?.x)
// testQualified.first: My
// │ fun (My).foo(): Unit
// │ │
first.foo()
// testQualified.second: My?
// │ fun (My).foo(): Unit
// │ │
second?.foo()
// testQualified.first: My
// │ fun (My).copy(): My
// │ │ fun (My).foo(): Unit
// │ │ │
first.copy().foo()
// testQualified.first: My
// │ var (My).x: Int
// │ │ Int
// │ │ │
first.x = 42
}
@@ -1,27 +0,0 @@
// WITH_STDLIB
package test
class A
fun test() {
// class A
// │
A::class
// class A
// │
test.A::class
// constructor A()
// │
A()::class
// class A val <T> reflect/KClass<T>.java: java/lang/Class<T>
// │ │
A::class.java
// class A val <T> reflect/KClass<T>.java: java/lang/Class<T>
// │ │
test.A::class.java
// constructor A()
// │ val <T> reflect/KClass<T>.java: java/lang/Class<T>
// │ │
A()::class.java
}
@@ -1,34 +0,0 @@
annotation class Ann1(val arr: IntArray)
annotation class Ann2(val arr: DoubleArray)
annotation class Ann3(val arr: Array<String>)
//constructor Ann1(IntArray)
//│
@Ann1([])
//constructor Ann2(DoubleArray)
//│
@Ann2([])
//constructor Ann3(Array<String>)
//│
@Ann3([])
class Zero
//constructor Ann1(IntArray)
//│ Int
//│ │ Int
//│ │ │
@Ann1([1, 2])
class First
//constructor Ann2(DoubleArray)
//│ Double
//│ │
@Ann2([3.14])
class Second
//constructor Ann3(Array<String>)
//│
@Ann3(["Alpha", "Omega"])
class Third
@@ -1,28 +0,0 @@
data class Some(val first: Int, val second: Double, val third: String)
fun foo(some: Some) {
// Int
// │ Double
// │ │ String foo.some: Some
// │ │ │ │
var (x, y, z: String) = some
// var foo.x: Int
// │fun (Int).inc(): Int
// ││
x++
// var foo.y: Double
// │ fun (Double).times(Double): Double
// │ │ Double
// │ │ │
y *= 2.0
// var foo.z: String
// │
z = ""
}
fun bar(some: Some) {
// Int String bar.some: Some
// │ │ │
val (a, _, `_`) = some
}
@@ -1,89 +0,0 @@
fun foo() {
// Int
// │fun (Int).rangeTo(Int): ranges/IntRange
// Int ││ Int
// │ ││ │
for (i in 1..10) {
// fun io/println(Int): Unit
// │ val foo.i: Int
// │ │
println(i)
}
}
fun fooLabeled() {
// fun io/println(Any?): Unit
// │
println("!!!")
// Int
// │fun (Int).rangeTo(Int): ranges/IntRange
// Int ││ Int
// │ ││ │
label@ for (i in 1..10) {
// Unit
// │ val fooLabeled.i: Int
// │ │ EQ operator call
// │ │ │ Int
// │ │ │ │
if (i == 5) continue@label
// fun io/println(Int): Unit
// │ val fooLabeled.i: Int
// │ │
println(i)
}
// fun io/println(Any?): Unit
// │
println("!!!")
}
// collections/List<String>
// │
fun bar(list: List<String>) {
// bar.list: collections/List<String>
// │ fun (collections/List<E>).subList(Int, Int): collections/List<E>
// │ │ Int
// String │ │ │ Int
// │ │ │ │ │
for (element in list.subList(0, 10)) {
// fun io/println(Any?): Unit
// │ val bar.element: String
// │ │
println(element)
}
// bar.list: collections/List<String>
// │ fun (collections/List<E>).subList(Int, Int): collections/List<E>
// │ │ fun io/println(Any?): Unit
// String │ │ Int Int │ val bar.element: String
// │ │ │ │ │ │ │
for (element in list.subList(10, 20)) println(element)
}
data class Some(val x: Int, val y: Int)
// collections/Set<Some>
// │
fun baz(set: Set<Some>) {
// Int
// │ Int baz.set: collections/Set<Some>
// │ │ │
for ((x, y) in set) {
// fun io/println(Any?): Unit
// │ val baz.x: Int
// │ │ val baz.y: Int
// │ │ │
println("x = $x y = $y")
}
}
// collections/List<Some>
// │
fun withParameter(list: List<Some>) {
// Some withParameter.list: collections/List<Some>
// │ │
for (s: Some in list) {
// fun io/println(Any?): Unit
// │ val withParameter.s: Some
// │ │
println(s)
}
}
@@ -1,19 +0,0 @@
// Nothing?
// │ Nothing?
// │ │
fun <T> nullableValue(): T? = null
fun test() {
// Int?
// │ fun <T> nullableValue<Int>(): T?
// │ │
val n = nullableValue<Int>()
// Double?
// │ fun <T> nullableValue<Double>(): T?
// │ │
val x = nullableValue<Double>()
// String?
// │ fun <T> nullableValue<String>(): T?
// │ │
val s = nullableValue<String>()
}
@@ -1,13 +0,0 @@
// FIR_IGNORE
// collections/Collection<Int>
// │ Boolean
// │ │
fun foo(x: Int, y: Int, c: Collection<Int>) =
// foo.x: Int
// │ fun (collections/Collection<E>).contains(E): Boolean
// │ │ foo.c: collections/Collection<Int>
// │ │ │ foo.y: Int
// │ │ │ │ fun (collections/Collection<E>).contains(E): Boolean
// │ │ │ │ │ foo.c: collections/Collection<Int>
// │ │ │ │ │ │
x in c && y !in c
@@ -1,14 +0,0 @@
// FIR_IGNORE
fun test(e: Int.() -> String) {
// String
// │ Int
// │ │ fun P1.invoke(): R
// │ │ │
val s = 3.e()
// String
// │ Int
// │ │ fun P1.invoke(): R
// │ │ │test.e: Int.() -> String
// │ │ ││
val ss = 3.(e)()
}
@@ -1,12 +0,0 @@
class WithInit(x: Int) {
// Int
// │
val x: Int
init {
// val (WithInit).x: Int
// │ WithInit.<init>.x: Int
// │ │
this.x = x
}
}
@@ -1,8 +0,0 @@
// FIR_IGNORE
fun main() {
// [ERROR: not resolved]
// │ [ERROR: not resolved]
// │ │ [ERROR: not resolved]
// │ │ │
{ length } foo { bar() }
}
@@ -1,97 +0,0 @@
// FIR_IGNORE
// WITH_STDLIB
data class Tuple(val x: Int, val y: Int)
// Int
// │ fun ((P1) -> R).invoke(P1): R
// │ │ constructor Tuple(Int, Int)
// │ │ │ Int
// │ │ │ │ Int
// │ │ │ │ │
inline fun use(f: (Tuple) -> Int) = f(Tuple(1, 2))
fun foo(): Int {
// (Tuple) -> Int
// │
val l1 = { t: Tuple ->
// foo.<anonymous>.t: Tuple
// Int │ val (Tuple).x: Int
// │ │ │
val x = t.x
// foo.<anonymous>.t: Tuple
// Int │ val (Tuple).y: Int
// │ │ │
val y = t.y
// val foo.<anonymous>.x: Int
// │ fun (Int).plus(Int): Int
// │ │ val foo.<anonymous>.y: Int
// │ │ │
x + y
}
// fun use((Tuple) -> Int): Int
// │ val foo.<anonymous>.x: Int
// │ Int │ fun (Int).plus(Int): Int
// │ │ Int │ │ val foo.<anonymous>.y: Int
// │ │ │ │ │ │
use { (x, y) -> x + y }
// fun use((Tuple) -> Int): Int
// │
return use {
// Unit
// │ foo.<anonymous>.it: Tuple
// │ │ val (Tuple).x: Int
// │ │ │ EQ operator call
// │ │ │ │ Int Int
// │ │ │ │ │ │
if (it.x == 0) return@foo 0
// foo.<anonymous>.it: Tuple
// │ val (Tuple).y: Int
// │ │
return@use it.y
}
}
fun bar(): Int {
// fun use((Tuple) -> Int): Int
// │
return use lambda@{
// Unit
// │ bar.<anonymous>.it: Tuple
// │ │ val (Tuple).x: Int
// │ │ │ EQ operator call
// │ │ │ │ Int Int
// │ │ │ │ │ │
if (it.x == 0) return@bar 0
// bar.<anonymous>.it: Tuple
// │ val (Tuple).y: Int
// │ │
return@lambda it.y
}
}
// collections/List<Int>
// │
fun test(list: List<Int>) {
// collections/MutableMap<Int, String>
// │ fun <K, V> collections/mutableMapOf<Int, String>(): collections/MutableMap<K, V>
// │ │
val map = mutableMapOf<Int, String>()
// test.list: collections/List<Int>
// │ fun <T> collections/Iterable<T>.forEach<Int>((T) -> Unit): Unit
// │ │ val test.map: collections/MutableMap<Int, String>
// │ │ │ fun <K, V> collections/MutableMap<K, V>.getOrPut<Int, String>(K, () -> V): V
// │ │ │ │ test.<anonymous>.it: Int
// │ │ │ │ │ fun <T> collections/mutableListOf<???>(): collections/MutableList<T>
// │ │ │ │ │ │ fun (String).plus(Any?): String
// │ │ │ │ │ │ │
list.forEach { map.getOrPut(it, { mutableListOf() }) += "" }
}
// () -> Unit
// │
val simple = { }
// () -> Int Int
// │ │
val another = { 42 }
@@ -1,20 +0,0 @@
// FIR_IGNORE
// T fun (() -> R).invoke(): R
// │ │
fun <T> run(block: () -> T): T = block()
fun test_1() {
// fun <T> run<Unit>(() -> T): T
// │
run { return@run }
// fun <T> run<???>(() -> T): T
// │
run { return }
}
fun test_2() {
// fun <T> run<Int>(() -> T): T
// │ Int
// │ │
run(fun (): Int { return 1 })
}
@@ -1,48 +0,0 @@
fun withLocals(p: Int): Int {
class Local(val pp: Int) {
// Int
// │ val (withLocals.Local).pp: Int
// │ │ fun (Int).minus(Int): Int
// │ │ │ withLocals.p: Int
// │ │ │ │
fun diff() = pp - p
}
// constructor withLocals.Local(Int)
// Int │ Int fun (withLocals.Local).diff(): Int
// │ │ │ │
val x = Local(42).diff()
fun sum(y: Int, z: Int, f: (Int, Int) -> Int): Int {
// val withLocals.x: Int
// │ fun (Int).plus(Int): Int
// │ │ fun ((P1, P2) -> R).invoke(P1, P2): R
// │ │ │ withLocals.sum.y: Int
// │ │ │ │ withLocals.sum.z: Int
// │ │ │ │ │
return x + f(y, z)
}
// Int constructor Any()
// │ │
val code = (object : Any() {
// Int
// │ fun (Any).hashCode(): Int
// │ │
fun foo() = hashCode()
// fun (<anonymous>).foo(): Int
// │
}).foo()
// fun withLocals.sum(Int, Int, (Int, Int) -> Int): Int
// │ val withLocals.code: Int
// │ │ constructor withLocals.Local(Int)
// │ │ │ Int
// │ │ │ │ fun (withLocals.Local).diff(): Int
// │ │ │ │ │ Int
// │ │ │ │ │ │ withLocals.<anonymous>.x: Int
// │ │ │ │ │ │ │ fun (Int).plus(Int): Int
// │ │ │ │ │ │ │ │ withLocals.<anonymous>.y: Int
// │ │ │ │ │ │ │ │ │
return sum(code, Local(1).diff(), fun(x: Int, y: Int) = x + y)
}
@@ -1,45 +0,0 @@
// WITH_STDLIB
fun simple() {
// Int Int
// │ │
var x = 10
// var simple.x: Int
// │ fun (Int).plus(Int): Int
// │ │ Int
// │ │ │
x += 20
// var simple.x: Int
// │ fun (Int).minus(Int): Int
// │ │ Int
// │ │ │
x -= 5
// var simple.x: Int
// │ fun (Int).div(Int): Int
// │ │ Int
// │ │ │
x /= 5
// var simple.x: Int
// │ fun (Int).times(Int): Int
// │ │ Int
// │ │ │
x *= 10
}
// collections/List<String>
// │
fun List<String>.modify() {
// fun <T> collections/Collection<T>.plus<String>(T): collections/List<T>
// │
this += "Alpha"
// fun <T> collections/Collection<T>.plus<String>(T): collections/List<T>
// │
this += "Omega"
}
fun Any.modify() {
// collections/List<Int>
// │ fun <T> collections/Collection<T>.plus<Int>(T): collections/List<T>
// │ │ Int
// │ │ │
(this as List<Int>) += 42
}
@@ -1,26 +0,0 @@
// Boolean Double
// │ │
fun foo(first: String = "", second: Boolean = true, third: Double = 3.1415) {}
fun test() {
// fun foo(String = ..., Boolean = ..., Double = ...): Unit
// │
foo()
// fun foo(String = ..., Boolean = ..., Double = ...): Unit
// │ Boolean
// │ │ Double
// │ │ │
foo("Alpha", false, 2.71)
// fun foo(String = ..., Boolean = ..., Double = ...): Unit
// │ Boolean
// │ │
foo(first = "Hello", second = true)
// fun foo(String = ..., Boolean = ..., Double = ...): Unit
// │ fun (Double).unaryMinus(): Double
// │ │Double
// │ ││
foo(third = -1.0, first = "123")
// fun foo(String = ..., Boolean = ..., Double = ...): Unit
// │
foo(= "")
}
@@ -1,10 +0,0 @@
// Int
// │ orFourtyTwo.arg: Int?
// │ │ Int
// │ │ │
fun orFourtyTwo(arg: Int?) = arg ?: 42
// Int
// │ bang.arg: Int?
// │ │
fun bang(arg: Int?) = arg!!
@@ -1,5 +0,0 @@
fun test() {
// class Array<T>: java/io/Serializable, Cloneable
// │
Array<String>::class
}
@@ -1,7 +0,0 @@
fun foo() {
return
}
fun bar(): String {
return "Hello"
}
@@ -1,25 +0,0 @@
interface A {
fun foo() {}
}
interface B {
fun foo() {}
fun bar() {}
}
class C : A, B {
override fun bar() {
// fun (B).bar(): Unit
// │
super.bar()
}
override fun foo() {
// fun (A).foo(): Unit
// │
super<A>.foo()
// fun (B).foo(): Unit
// │
super<B>.foo()
}
}
@@ -1,43 +0,0 @@
class Some {
// Int
// │ Int
// │ │
fun foo(): Int = 1
fun bar(): Int {
// fun (Some).foo(): Int
// │
return this.foo()
}
// Some
// │
val instance: Some
get() = this@Some
fun String.extension(): Int {
// fun (Some).bar(): Int
// │ fun (Int).plus(Int): Int
// │ │ val (String).length: Int
// │ │ │
return this@Some.bar() + this.length
}
}
// Int fun (Some).bar(): Int
// │ │
fun Some.extension() = this.bar()
fun test(some: Some): Int {
// fun <T, R> with<Some, Int>(T, T.() -> R): R
// │ test.some: Some
// │ │ with@0
// │ │ │
return with(some) {
// fun (Some).foo(): Int
// │ fun (Int).plus(Int): Int
// │ │ fun Some.extension(): Int
// │ │ │
this.foo() + this@with.extension()
}
}
@@ -1,24 +0,0 @@
// WITH_STDLIB
fun some() {
try {
// constructor KotlinNullPointerException()
// │
throw KotlinNullPointerException()
// java/lang/RuntimeException
// │
} catch (e: RuntimeException) {
// fun io/println(Any?): Unit
// │
println("Runtime exception")
// java/lang/Exception
// │
} catch (e: Exception) {
// fun io/println(Any?): Unit
// │
println("Some exception")
} finally {
// fun io/println(Any?): Unit
// │
println("finally")
}
}
@@ -1,19 +0,0 @@
// FIR_IGNORE
interface IThing
// Boolean
// │ test1.x: Any
// │ │
fun test1(x: Any) = x is IThing
// Boolean
// │ test2.x: Any
// │ │
fun test2(x: Any) = x !is IThing
// IThing
// │ test3.x: Any
// │ │
fun test3(x: Any) = x as IThing
// IThing?
// │ test4.x: Any
// │ │
fun test4(x: Any) = x as? IThing
@@ -1,79 +0,0 @@
// FIR_IGNORE
// WITH_STDLIB
fun test() {
// Int Int
// │ │
var x = 0
// var test.x: Int
// Int │fun (Int).inc(): Int
// │ ││
val x1 = x++
// fun (Int).inc(): Int
// Int │ var test.x: Int
// │ │ │
val x2 = ++x
// fun (Int).dec(): Int
// Int │ var test.x: Int
// │ │ │
val x3 = --x
// var test.x: Int
// Int │fun (Int).dec(): Int
// │ ││
val x4 = x--
// Unit
// │ fun (Boolean).not(): Boolean
// │ │ var test.x: Int
// │ │ │ EQ operator call
// │ │ │ │ Int
// │ │ │ │ │
if (!(x == 0)) {
// fun io/println(Any?): Unit
// │
println("000")
}
}
class X(val i: Int)
fun test2(x: X) {
// test2.x: X
// │ val (X).i: Int
// Int │ │fun (Int).inc(): Int
// │ │ ││
val x1 = x.i++
// fun (Int).inc(): Int
// │ test2.x: X
// Int │ │ val (X).i: Int
// │ │ │ │
val x2 = ++x.i
}
fun test3(arr: Array<Int>) {
// test3.arr: Array<Int>
// │ Int
// Int │ │ fun (Int).inc(): Int
// │ │ │ │
val x1 = arr[0]++
// fun (Int).inc(): Int
// │ test3.arr: Array<Int>
// Int │ │ Int
// │ │ │ │
val x2 = ++arr[1]
}
class Y(val arr: Array<Int>)
fun test4(y: Y) {
// test4.y: Y
// │ val (Y).arr: Array<Int>
// │ │ Int
// Int │ │ │ fun (Int).inc(): Int
// │ │ │ │ │
val x1 = y.arr[0]++
// fun (Int).inc(): Int
// │ test4.y: Y
// │ │ val (Y).arr: Array<Int>
// Int │ │ │ Int
// │ │ │ │ │
val x2 = ++y.arr[1]
}
@@ -1,29 +0,0 @@
fun foo() {
// Int Int
// │ │
val x = 1
// val foo.x: Int
// │ fun (Int).plus(Int): Int
// Int │ │ Int
// │ │ │ │
var y = x + 1
// var foo.y: Int
// │ fun (Int).times(Int): Int
// Int │ │ Int
// │ │ │ │
val z = y * 2
// var foo.y: Int
// │ var foo.y: Int
// │ │ fun (Int).plus(Int): Int
// │ │ │ val foo.z: Int
// │ │ │ │
y = y + z
// var foo.y: Int
// │ fun (Int).minus(Int): Int
// Int │ │ val foo.x: Int
// │ │ │ │
val w = y - x
// val foo.w: Int
// │
return w
}
@@ -1,62 +0,0 @@
// WITH_STDLIB
fun foo(limit: Int) {
// Int Int
// │ │
var k = 0
// var foo.k: Int
// │ fun (Int).compareTo(Int): Int
// │ │ foo.limit: Int
// │ │ │
some@ while (k < limit) {
// var foo.k: Int
// │fun (Int).inc(): Int
// ││
k++
// fun io/println(Int): Unit
// │ var foo.k: Int
// │ │
println(k)
// var foo.k: Int
// │ EQ operator call
// │ │ Int
// │ │ │
while (k == 13) {
// var foo.k: Int
// │fun (Int).inc(): Int
// ││
k++
// Unit
// │ var foo.k: Int
// │ │ fun (Int).compareTo(Int): Int
// │ │ │ foo.limit: Int
// │ │ │ │
if (k < limit) break@some
// Unit
// │ var foo.k: Int
// │ │ fun (Int).compareTo(Int): Int
// │ │ │ foo.limit: Int
// │ │ │ │
if (k > limit) continue
}
}
}
fun bar(limit: Int) {
// Int bar.limit: Int
// │ │
var k = limit
do {
// var bar.k: Int
// │fun (Int).dec(): Int
// ││
k--
// fun io/println(Int): Unit
// │ var bar.k: Int
// │ │
println(k)
// var bar.k: Int
// │ fun (Int).compareTo(Int): Int
// │ │ Int
// │ │ │
} while (k >= 0)
}
@@ -1,55 +0,0 @@
// FIR_IGNORE
data class Vector(val x: Int, val y: Int) {
// Vector
// │ constructor Vector(Int, Int)
// │ │ val (Vector).x: Int
// │ │ │ fun (Int).plus(Int): Int
// │ │ │ │ Vector.plus.other: Vector
// │ │ │ │ │ val (Vector).x: Int
// │ │ │ │ │ │ val (Vector).y: Int
// │ │ │ │ │ │ │ fun (Int).plus(Int): Int
// │ │ │ │ │ │ │ │ Vector.plus.other: Vector
// │ │ │ │ │ │ │ │ │ val (Vector).y: Int
// │ │ │ │ │ │ │ │ │ │
fun plus(other: Vector): Vector = Vector(x + other.x, y + other.y)
}
fun main() {
// Vector
// │ constructor Vector(Int, Int)
// │ │ Int
// │ │ │ Int
// │ │ │ │
val a = Vector(1, 2)
// Vector
// │ constructor Vector(Int, Int)
// │ │ Int
// │ │ │ Int
// │ │ │ │
val b = Vector(-1, 10)
// fun io/println(Any?): Unit
// │ val main.a: Vector
// │ │ val main.b: Vector
// │ │ │ fun (Vector).toString(): String
// │ │ │ │
println("a = $a, b = ${b.toString()}")
// fun io/println(Any?): Unit
// │ fun (String).plus(Any?): String
// │ │ val main.a: Vector
// │ │ │ fun (Vector).plus(Vector): Vector
// │ │ │ │ val main.b: Vector
// │ │ │ │ │
println("a + b = " + (a + b))
// fun io/println(Any?): Unit
// │ val main.a: Vector
// │ │ fun (Vector).hashCode(): Int
// │ │ │
println("a hash - ${a.hashCode()}")
// val main.a: Vector
// │ fun (Vector).equals(Any?): Boolean
// fun io/println(Any?): Unit │ │ val main.b: Vector
// │ │ │ │
println("a is equal to b ${a.equals(b)}")
}
@@ -1,41 +0,0 @@
interface Base {
fun printMessage()
fun printMessageLine()
}
class BaseImpl(val x: Int) : Base {
// fun io/print(Int): Unit
// │ val (BaseImpl).x: Int
// │ │
override fun printMessage() { print(x) }
// fun io/println(Int): Unit
// │ val (BaseImpl).x: Int
// │ │
override fun printMessageLine() { println(x) }
}
// Derived.<init>.b: Base
// │
class Derived(b: Base) : Base by b {
// fun io/print(Any?): Unit
// │
override fun printMessage() { print("abc") }
}
fun main() {
// BaseImpl
// │ constructor BaseImpl(Int)
// │ │ Int
// │ │ │
val b = BaseImpl(10)
// constructor Derived(Base)
// │ val main.b: BaseImpl
// │ │ fun (Derived).printMessage(): Unit
// │ │ │
Derived(b).printMessage()
// constructor Derived(Base)
// │ val main.b: BaseImpl
// │ │ fun (Base).printMessageLine(): Unit
// │ │ │
Derived(b).printMessageLine()
}
@@ -1,94 +0,0 @@
package p
class A {
// Int Int
// │ │
val aProp = 10
fun call() {}
}
class B {
// Int Int
// │ │
val bProp = 1
}
fun foo(a: Int, b: Int): Int {
// fun <T, R> with<A, Int>(T, T.() -> R): R
// │ constructor A()
// │ │ with@0
// │ │ │
with(A()) {
// val (A).aProp: Int
// this@0
// │
aProp
// fun (A).call(): Unit
// this@0
// │
call()
// fun <T, R> with<B, Int>(T, T.() -> R): R
// │ constructor B()
// │ │ with@1
// │ │ │
with(B()) {
// val (A).aProp: Int
// this@0
// │
aProp
// val (B).bProp: Int
// this@1
// │
bProp
// val (A).aProp: Int
// this@0
// │
aProp
}
}
// fun <T, R> with<A, Int>(T, T.() -> R): R
// │ constructor A()
// │ │ with@0
// │ │ │
with(A()) {
// val (A).aProp: Int
// this@0
// │
aProp
// fun <T, R> with<B, Int>(T, T.() -> R): R
// │ constructor B()
// │ │ with@1
// │ │ │
with(B()) {
// val (A).aProp: Int
// this@0
// │
aProp
// val (B).bProp: Int
// this@1
// │
bProp
}
// fun <T, R> with<B, Int>(T, T.() -> R): R
// │ constructor B()
// │ │ with@1
// │ │ │
with(B()) {
// val (A).aProp: Int
// this@0
// │
aProp
// val (B).bProp: Int
// this@1
// │
bProp
}
}
// foo.a: Int
// │
return a
}
@@ -1,32 +0,0 @@
// FIR_IGNORE
package org.jetbrains.kotlin.test
// collections/List<Int>
// │ fun <T> collections/listOf<Int>(vararg T): collections/List<T>
// │ │ Int
// │ │ │ Int
// │ │ │ │ Int
// │ │ │ │ │
val listOfInt = listOf(1, 2, 3)
// java/util/ArrayList<Int>
// │ constructor java/util/ArrayList<E : Any!>()
// │ │
val javaList = java.util.ArrayList<Int>()
// java/util/ArrayList<Int>
// │
fun move(): java.util.ArrayList<Int> {
// Int val listOfInt: collections/List<Int>
// │ │
for (elem in listOfInt) {
// val javaList: java/util/ArrayList<Int>
// │ fun (java/util/ArrayList<E>).add(E): Boolean
// │ │ val move.elem: Int
// │ │ │
javaList.add(elem)
}
// val javaList: java/util/ArrayList<Int>
// │
return javaList
}
@@ -1,55 +0,0 @@
class A(val a: Int) {
override fun equals(other: Any?): Boolean {
// Unit
// │ A.equals.other: Any?
// │ │ Boolean
// │ │ │
if (other !is A) return false
// val (A).a: Int
// │ EQ operator call
// │ │ A.equals.other: Any?
// │ │ │ val (A).a: Int
// │ │ │ │
return this.a == other.a
}
}
open class B(val b: Int) {
override fun equals(other: Any?): Boolean {
// Unit
// │ B.equals.other: Any?
// │ │ Boolean
// │ │ │
if (other !is B) return false
// val (B).b: Int
// │ EQ operator call
// │ │ B.equals.other: Any?
// │ │ │ val (B).b: Int
// │ │ │ │
return this.b == other.b
}
}
// constructor B(Int)
// │ C.<init>.c: Int
// │ │
class C(c: Int): B(c) {}
// constructor A(Int)
// │ EQ operator call
// │ │ constructor A(Int)
// Boolean │ Int │ │ Int
// │ │ │ │ │ │
val areEqual = A(10) == A(11)
// constructor C(Int)
// │ EQ operator call
// │ │ constructor C(Int)
// Boolean │ Int │ │ Int
// │ │ │ │ │ │
val areEqual2 = C(10) == C(11)
// constructor A(Int)
// │ EQ operator call
// │ │ constructor C(Int)
// Boolean │ Int │ │ Int
// │ │ │ │ │ │
val areEqual3 = A(10) == C(11)
@@ -1,83 +0,0 @@
package org.jetbrains.kotlin.test
// Int Int
// │ │
val p1 = 10
// Double Double
// │ │
val p2: Double = 1.0
// Float Float
// │ │
val p3: Float = 2.5f
// String
// │
val p4 = "some string"
// Double
// │ val p1: Int
// │ │ fun (Int).plus(Double): Double
// │ │ │ val p2: Double
// │ │ │ │
val p5 = p1 + p2
// Double
// │ val p1: Int
// │ │ fun (Int).times(Double): Double
// │ │ │ val p2: Double
// │ │ │ │ fun (Double).plus(Double): Double
// │ │ │ │ │ val p5: Double
// │ │ │ │ │ │ fun (Double).minus(Float): Double
// │ │ │ │ │ │ │ val p3: Float
// │ │ │ │ │ │ │ │
val p6 = p1 * p2 + (p5 - p3)
// Float
// │
val withGetter
// val p1: Int
// │ fun (Int).times(Float): Float
// │ │ val p3: Float
// │ │ │
get() = p1 * p3
// String
// │
var withSetter
// val p4: String
// │
get() = p4
// String <set-withSetter>.value: String
// │ │
set(value) = value
// Boolean
// │
val withGetter2: Boolean
get() {
// Boolean
// │
return true
}
// String
// │
var withSetter2: String
get() = "1"
// String
// │
set(value) {
// var <set-withSetter2>.field: String
// │ <set-withSetter2>.value: String
// │ │ fun (String).plus(Any?): String
// │ │ │
field = value + "!"
}
// String
// │
private val privateGetter: String = "cba"
get
// String
// │
var privateSetter: String = "abc"
private set
@@ -1,27 +0,0 @@
fun Int.addOne(): Int {
// fun (Int).plus(Int): Int
// │ Int
// │ │
return this + 1
}
// Int
// │
val Int.repeat: Int
get() = this
fun main() {
// Int Int
// │ │
val i = 2
// val main.i: Int
// │ fun Int.addOne(): Int
// │ │
i.addOne()
// val main.i: Int
// │ val Int.repeat: Int
// │ │ fun (Int).times(Int): Int
// Int │ │ │ Int
// │ │ │ │ │
val p = i.repeat * 2
}
@@ -1,25 +0,0 @@
package org.jetbrains.kotlin.test
abstract class Base<T>(var x: T) {
abstract fun replace(newValue: T)
}
// constructor Base<T>(T)
// │ Derived.<init>.x: Int
// │ │
class Derived(x: Int): Base<Int>(x) {
override fun replace(newValue: Int) {
// var (Base<T>).x: T
// │ Derived.replace.newValue: Int
// │ │
x = newValue
}
}
fun test() {
// constructor Derived(Int)
// │ fun (Derived).replace(Int): Unit
// │ Int │ Int
// │ │ │ │
Derived(10).replace(20)
}
@@ -1,24 +0,0 @@
interface Source<out T> {
fun nextT(): T
}
fun demo(strs: Source<String>) {
// Source<Any> demo.strs: Source<String>
// │ │
val objects: Source<Any> = strs
}
interface Comparable<in T> {
operator fun compareTo(other: T): Int
}
fun demo(x: Comparable<Number>) {
// demo.x: Comparable<Number>
// │ fun (Comparable<T>).compareTo(T): Int
// │ │ Double
// │ │ │
x.compareTo(1.0)
// Comparable<Double> demo.x: Comparable<Number>
// │ │
val y: Comparable<Double> = x
}
@@ -1,29 +0,0 @@
// FIR_IGNORE
// collections/List<T> collections/List<String>
// │ │
fun <T> copyWhenGreater(list: List<T>, threshold: T): List<String>
where T : CharSequence,
T : Comparable<T> {
// copyWhenGreater.list: collections/List<T>
// │ fun <T> collections/Iterable<T>.filter<T>((T) -> Boolean): collections/List<T>
// │ │ copyWhenGreater.<anonymous>.it: T
// │ │ │ fun (Comparable<T>).compareTo(T): Int
// │ │ │ │ copyWhenGreater.threshold: T
// │ │ │ │ │ fun <T, R> collections/Iterable<T>.map<T, String>((T) -> R): collections/List<R>
// │ │ │ │ │ │ copyWhenGreater.<anonymous>.it: T
// │ │ │ │ │ │ │ fun (Any).toString(): String
// │ │ │ │ │ │ │ │
return list.filter { it > threshold }.map { it.toString() }
}
fun main() {
// collections/List<String>
// │ fun <T> collections/listOf<String>(vararg T): collections/List<T>
// │ │
val list = listOf("1", "2", "3")
// collections/List<String>
// │ fun <T : CharSequence> copyWhenGreater<String>(collections/List<T>, T): collections/List<String> where T : Comparable<T>
// │ │ val main.list: collections/List<String>
// │ │ │
val copy = copyWhenGreater(list, "2")
}
@@ -1,14 +0,0 @@
data class Vector(val x: Int, val y: Int) {
fun plus(other: Vector): Vector = Vector(x + other.x, y + other.y)
}
fun main() {
val a = Vector(1, 2)
val b = Vector(-1, 10)
println("a = $a, b = ${b.toString()}")
println("a + b = " + (a + b))
println("a hash - ${a.hashCode()}")
println("a is equal to b ${a.equals(b)}")
}
@@ -1,19 +0,0 @@
interface Base {
fun printMessage()
fun printMessageLine()
}
class BaseImpl(val x: Int) : Base {
override fun printMessage() { print(x) }
override fun printMessageLine() { println(x) }
}
class Derived(b: Base) : Base by b {
override fun printMessage() { print("abc") }
}
fun main() {
val b = BaseImpl(10)
Derived(b).printMessage()
Derived(b).printMessageLine()
}
@@ -1,38 +0,0 @@
package p
class A {
val aProp = 10
fun call() {}
}
class B {
val bProp = 1
}
fun foo(a: Int, b: Int): Int {
with(A()) {
aProp
call()
with(B()) {
aProp
bProp
aProp
}
}
with(A()) {
aProp
with(B()) {
aProp
bProp
}
with(B()) {
aProp
bProp
}
}
return a
}
@@ -1,12 +0,0 @@
package org.jetbrains.kotlin.test
val listOfInt = listOf(1, 2, 3)
val javaList = java.util.ArrayList<Int>()
fun move(): java.util.ArrayList<Int> {
for (elem in listOfInt) {
javaList.add(elem)
}
return javaList
}
@@ -1,19 +0,0 @@
class A(val a: Int) {
override fun equals(other: Any?): Boolean {
if (other !is A) return false
return this.a == other.a
}
}
open class B(val b: Int) {
override fun equals(other: Any?): Boolean {
if (other !is B) return false
return this.b == other.b
}
}
class C(c: Int): B(c) {}
val areEqual = A(10) == A(11)
val areEqual2 = C(10) == C(11)
val areEqual3 = A(10) == C(11)
@@ -1,34 +0,0 @@
package org.jetbrains.kotlin.test
val p1 = 10
val p2: Double = 1.0
val p3: Float = 2.5f
val p4 = "some string"
val p5 = p1 + p2
val p6 = p1 * p2 + (p5 - p3)
val withGetter
get() = p1 * p3
var withSetter
get() = p4
set(value) = value
val withGetter2: Boolean
get() {
return true
}
var withSetter2: String
get() = "1"
set(value) {
field = value + "!"
}
private val privateGetter: String = "cba"
get
var privateSetter: String = "abc"
private set
@@ -1,12 +0,0 @@
fun Int.addOne(): Int {
return this + 1
}
val Int.repeat: Int
get() = this
fun main() {
val i = 2
i.addOne()
val p = i.repeat * 2
}
@@ -1,15 +0,0 @@
package org.jetbrains.kotlin.test
abstract class Base<T>(var x: T) {
abstract fun replace(newValue: T)
}
class Derived(x: Int): Base<Int>(x) {
override fun replace(newValue: Int) {
x = newValue
}
}
fun test() {
Derived(10).replace(20)
}
@@ -1,16 +0,0 @@
interface Source<out T> {
fun nextT(): T
}
fun demo(strs: Source<String>) {
val objects: Source<Any> = strs
}
interface Comparable<in T> {
operator fun compareTo(other: T): Int
}
fun demo(x: Comparable<Number>) {
x.compareTo(1.0)
val y: Comparable<Double> = x
}
@@ -1,10 +0,0 @@
fun <T> copyWhenGreater(list: List<T>, threshold: T): List<String>
where T : CharSequence,
T : Comparable<T> {
return list.filter { it > threshold }.map { it.toString() }
}
fun main() {
val list = listOf("1", "2", "3")
val copy = copyWhenGreater(list, "2")
}
@@ -1,668 +0,0 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.visualizer.fir;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.test.generators.GenerateCompilerTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/rawBuilder")
@TestDataPath("$PROJECT_ROOT")
public class FirVisualizerForRawFirDataGenerated extends AbstractFirVisualizerTest {
@Test
public void testAllFilesPresentInRawBuilder() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/rawBuilder"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Nested
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations")
@TestDataPath("$PROJECT_ROOT")
public class Declarations {
@Test
public void testAllFilesPresentInDeclarations() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("annotation.kt")
public void testAnnotation() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotation.kt");
}
@Test
@TestMetadata("annotationOnField.kt")
public void testAnnotationOnField() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotationOnField.kt");
}
@Test
@TestMetadata("annotationOnProperty.kt")
public void testAnnotationOnProperty() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotationOnProperty.kt");
}
@Test
@TestMetadata("annotationsOnNullableParenthesizedTypes.kt")
public void testAnnotationsOnNullableParenthesizedTypes() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotationsOnNullableParenthesizedTypes.kt");
}
@Test
@TestMetadata("annotationsOnParenthesizedTypes.kt")
public void testAnnotationsOnParenthesizedTypes() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotationsOnParenthesizedTypes.kt");
}
@Test
@TestMetadata("classWithWrongSuperCall.kt")
public void testClassWithWrongSuperCall() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/classWithWrongSuperCall.kt");
}
@Test
@TestMetadata("complexTypes.kt")
public void testComplexTypes() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/complexTypes.kt");
}
@Test
@TestMetadata("constructorInObject.kt")
public void testConstructorInObject() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/constructorInObject.kt");
}
@Test
@TestMetadata("constructorOfAnonymousObject.kt")
public void testConstructorOfAnonymousObject() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/constructorOfAnonymousObject.kt");
}
@Test
@TestMetadata("contextReceivers.kt")
public void testContextReceivers() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contextReceivers.kt");
}
@Test
@TestMetadata("danglingAnnotationsClassLevel.kt")
public void testDanglingAnnotationsClassLevel() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.kt");
}
@Test
@TestMetadata("danglingAnnotationsFileLevel.kt")
public void testDanglingAnnotationsFileLevel() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.kt");
}
@Test
@TestMetadata("delegates.kt")
public void testDelegates() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/delegates.kt");
}
@Test
@TestMetadata("derivedClass.kt")
public void testDerivedClass() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/derivedClass.kt");
}
@Test
@TestMetadata("emptyAnonymousObject.kt")
public void testEmptyAnonymousObject() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/emptyAnonymousObject.kt");
}
@Test
@TestMetadata("enums.kt")
public void testEnums() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.kt");
}
@Test
@TestMetadata("enums2.kt")
public void testEnums2() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.kt");
}
@Test
@TestMetadata("enums3.kt")
public void testEnums3() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.kt");
}
@Test
@TestMetadata("expectActual.kt")
public void testExpectActual() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectActual.kt");
}
@Test
@TestMetadata("expectClassesAndFunctions.kt")
public void testExpectClassesAndFunctions() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectClassesAndFunctions.kt");
}
@Test
@TestMetadata("expectNestedAnnotationClassWithConstructorParameter.kt")
public void testExpectNestedAnnotationClassWithConstructorParameter() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectNestedAnnotationClassWithConstructorParameter.kt");
}
@Test
@TestMetadata("expectNestedClassMembers.kt")
public void testExpectNestedClassMembers() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectNestedClassMembers.kt");
}
@Test
@TestMetadata("expectNestedEnumClassGeneratedMembers.kt")
public void testExpectNestedEnumClassGeneratedMembers() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectNestedEnumClassGeneratedMembers.kt");
}
@Test
@TestMetadata("external.kt")
public void testExternal() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/external.kt");
}
@Test
@TestMetadata("F.kt")
public void testF() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/F.kt");
}
@Test
@TestMetadata("functionTypes.kt")
public void testFunctionTypes() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/functionTypes.kt");
}
@Test
@TestMetadata("genericFunctions.kt")
public void testGenericFunctions() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/genericFunctions.kt");
}
@Test
@TestMetadata("genericProperty.kt")
public void testGenericProperty() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/genericProperty.kt");
}
@Test
@TestMetadata("initBlockWithDeclarations.kt")
public void testInitBlockWithDeclarations() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/initBlockWithDeclarations.kt");
}
@Test
@TestMetadata("invalidDestructing.kt")
public void testInvalidDestructing() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/invalidDestructing.kt");
}
@Test
@TestMetadata("nestedClass.kt")
public void testNestedClass() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/nestedClass.kt");
}
@Test
@TestMetadata("NestedOfAliasedType.kt")
public void testNestedOfAliasedType() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/NestedOfAliasedType.kt");
}
@Test
@TestMetadata("NestedSuperType.kt")
public void testNestedSuperType() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/NestedSuperType.kt");
}
@Test
@TestMetadata("noPrimaryConstructor.kt")
public void testNoPrimaryConstructor() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noPrimaryConstructor.kt");
}
@Test
@TestMetadata("propertyWithBackingField.kt")
public void testPropertyWithBackingField() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.kt");
}
@Test
@TestMetadata("propertyWithBackingFieldDifferentTypes.kt")
public void testPropertyWithBackingFieldDifferentTypes() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.kt");
}
@Test
@TestMetadata("simpleClass.kt")
public void testSimpleClass() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/simpleClass.kt");
}
@Test
@TestMetadata("simpleFun.kt")
public void testSimpleFun() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/simpleFun.kt");
}
@Test
@TestMetadata("simpleTypeAlias.kt")
public void testSimpleTypeAlias() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/simpleTypeAlias.kt");
}
@Test
@TestMetadata("splitModifierList.kt")
public void testSplitModifierList() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/splitModifierList.kt");
}
@Test
@TestMetadata("suspendFunctionTypes.kt")
public void testSuspendFunctionTypes() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/suspendFunctionTypes.kt");
}
@Test
@TestMetadata("typeAliasWithGeneric.kt")
public void testTypeAliasWithGeneric() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeAliasWithGeneric.kt");
}
@Test
@TestMetadata("typeParameterVsNested.kt")
public void testTypeParameterVsNested() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameterVsNested.kt");
}
@Test
@TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameters.kt");
}
@Test
@TestMetadata("where.kt")
public void testWhere() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/where.kt");
}
@Nested
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts")
@TestDataPath("$PROJECT_ROOT")
public class Contracts {
@Test
public void testAllFilesPresentInContracts() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Nested
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/newSyntax")
@TestDataPath("$PROJECT_ROOT")
public class NewSyntax {
@Test
public void testAllFilesPresentInNewSyntax() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/newSyntax"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("functionWithBothOldAndNewSyntaxContractDescription.kt")
public void testFunctionWithBothOldAndNewSyntaxContractDescription() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/newSyntax/functionWithBothOldAndNewSyntaxContractDescription.kt");
}
@Test
@TestMetadata("propertyAccessorsContractDescription.kt")
public void testPropertyAccessorsContractDescription() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/newSyntax/propertyAccessorsContractDescription.kt");
}
@Test
@TestMetadata("simpleFunctionsContractDescription.kt")
public void testSimpleFunctionsContractDescription() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/newSyntax/simpleFunctionsContractDescription.kt");
}
}
@Nested
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/oldSyntax")
@TestDataPath("$PROJECT_ROOT")
public class OldSyntax {
@Test
public void testAllFilesPresentInOldSyntax() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/oldSyntax"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("contractDescription.kt")
public void testContractDescription() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/oldSyntax/contractDescription.kt");
}
}
}
@Nested
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType")
@TestDataPath("$PROJECT_ROOT")
public class NoParameterType {
@Test
public void testAllFilesPresentInNoParameterType() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("noParameterTypRefInCatch.kt")
public void testNoParameterTypRefInCatch() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInCatch.kt");
}
@Test
@TestMetadata("noParameterTypRefInFuncionalType.kt")
public void testNoParameterTypRefInFuncionalType() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInFuncionalType.kt");
}
@Test
@TestMetadata("noParameterTypRefInFunction.kt")
public void testNoParameterTypRefInFunction() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInFunction.kt");
}
@Test
@TestMetadata("noParameterTypRefInLambda.kt")
public void testNoParameterTypRefInLambda() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInLambda.kt");
}
@Test
@TestMetadata("noParameterTypRefInPrimaryConstructor.kt")
public void testNoParameterTypRefInPrimaryConstructor() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConstructor.kt");
}
@Test
@TestMetadata("noParameterTypRefInPrimaryConstructorWithVararg.kt")
public void testNoParameterTypRefInPrimaryConstructorWithVararg() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConstructorWithVararg.kt");
}
@Test
@TestMetadata("noParameterTypRefInPrimaryConsturctorVal.kt")
public void testNoParameterTypRefInPrimaryConsturctorVal() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConsturctorVal.kt");
}
@Test
@TestMetadata("noParameterTypRefInPrimaryConsturctorValWithVararg.kt")
public void testNoParameterTypRefInPrimaryConsturctorValWithVararg() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConsturctorValWithVararg.kt");
}
@Test
@TestMetadata("noParameterTypRefInSecondaryConstructor.kt")
public void testNoParameterTypRefInSecondaryConstructor() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInSecondaryConstructor.kt");
}
@Test
@TestMetadata("noParameterTypRefInSetter.kt")
public void testNoParameterTypRefInSetter() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInSetter.kt");
}
@Test
@TestMetadata("uncompletedTypRefInPrimaryConstructorWithVararg.kt")
public void testUncompletedTypRefInPrimaryConstructorWithVararg() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConstructorWithVararg.kt");
}
@Test
@TestMetadata("uncompletedTypRefInPrimaryConsturctorValWithVararg.kt")
public void testUncompletedTypRefInPrimaryConsturctorValWithVararg() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConsturctorValWithVararg.kt");
}
}
}
@Nested
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions")
@TestDataPath("$PROJECT_ROOT")
public class Expressions {
@Test
public void testAllFilesPresentInExpressions() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("annotated.kt")
public void testAnnotated() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/annotated.kt");
}
@Test
@TestMetadata("arrayAccess.kt")
public void testArrayAccess() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/arrayAccess.kt");
}
@Test
@TestMetadata("arrayAssignment.kt")
public void testArrayAssignment() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/arrayAssignment.kt");
}
@Test
@TestMetadata("branches.kt")
public void testBranches() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/branches.kt");
}
@Test
@TestMetadata("callableReferences.kt")
public void testCallableReferences() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/callableReferences.kt");
}
@Test
@TestMetadata("calls.kt")
public void testCalls() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/calls.kt");
}
@Test
@TestMetadata("cascadeIf.kt")
public void testCascadeIf() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/cascadeIf.kt");
}
@Test
@TestMetadata("classReference.kt")
public void testClassReference() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/classReference.kt");
}
@Test
@TestMetadata("collectionLiterals.kt")
public void testCollectionLiterals() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/collectionLiterals.kt");
}
@Test
@TestMetadata("destructuring.kt")
public void testDestructuring() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/destructuring.kt");
}
@Test
@TestMetadata("for.kt")
public void testFor() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/for.kt");
}
@Test
@TestMetadata("genericCalls.kt")
public void testGenericCalls() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/genericCalls.kt");
}
@Test
@TestMetadata("in.kt")
public void testIn() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/in.kt");
}
@Test
@TestMetadata("inBrackets.kt")
public void testInBrackets() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/inBrackets.kt");
}
@Test
@TestMetadata("init.kt")
public void testInit() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/init.kt");
}
@Test
@TestMetadata("invalidWhen.kt")
public void testInvalidWhen() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/invalidWhen.kt");
}
@Test
@TestMetadata("labelForInfix.kt")
public void testLabelForInfix() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/labelForInfix.kt");
}
@Test
@TestMetadata("lambda.kt")
public void testLambda() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/lambda.kt");
}
@Test
@TestMetadata("lambdaAndAnonymousFunction.kt")
public void testLambdaAndAnonymousFunction() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/lambdaAndAnonymousFunction.kt");
}
@Test
@TestMetadata("localDeclarationWithExpression.kt")
public void testLocalDeclarationWithExpression() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/localDeclarationWithExpression.kt");
}
@Test
@TestMetadata("locals.kt")
public void testLocals() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/locals.kt");
}
@Test
@TestMetadata("modifications.kt")
public void testModifications() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/modifications.kt");
}
@Test
@TestMetadata("namedArgument.kt")
public void testNamedArgument() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/namedArgument.kt");
}
@Test
@TestMetadata("nullability.kt")
public void testNullability() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/nullability.kt");
}
@Test
@TestMetadata("qualifierWithTypeArguments.kt")
public void testQualifierWithTypeArguments() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/qualifierWithTypeArguments.kt");
}
@Test
@TestMetadata("safeCallsWithAssignment.kt")
public void testSafeCallsWithAssignment() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/safeCallsWithAssignment.kt");
}
@Test
@TestMetadata("safeCallsWithAugmentedAssignment.kt")
public void testSafeCallsWithAugmentedAssignment() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/safeCallsWithAugmentedAssignment.kt");
}
@Test
@TestMetadata("safeCallsWithUnaryOperators.kt")
public void testSafeCallsWithUnaryOperators() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/safeCallsWithUnaryOperators.kt");
}
@Test
@TestMetadata("simpleReturns.kt")
public void testSimpleReturns() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/simpleReturns.kt");
}
@Test
@TestMetadata("super.kt")
public void testSuper() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/super.kt");
}
@Test
@TestMetadata("these.kt")
public void testThese() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/these.kt");
}
@Test
@TestMetadata("try.kt")
public void testTry() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/try.kt");
}
@Test
@TestMetadata("typeOperators.kt")
public void testTypeOperators() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/typeOperators.kt");
}
@Test
@TestMetadata("unary.kt")
public void testUnary() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/unary.kt");
}
@Test
@TestMetadata("variables.kt")
public void testVariables() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/variables.kt");
}
@Test
@TestMetadata("while.kt")
public void testWhile() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/while.kt");
}
}
}
@@ -1,86 +0,0 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.visualizer.fir;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.test.generators.GenerateCompilerTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("compiler/visualizer/testData/uncommonCases/testFiles")
@TestDataPath("$PROJECT_ROOT")
public class FirVisualizerForUncommonCasesGenerated extends AbstractFirVisualizerTest {
@Test
public void testAllFilesPresentInTestFiles() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/visualizer/testData/uncommonCases/testFiles"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("dataClass.kt")
public void testDataClass() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/dataClass.kt");
}
@Test
@TestMetadata("delegation.kt")
public void testDelegation() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/delegation.kt");
}
@Test
@TestMetadata("innerWith.kt")
public void testInnerWith() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/innerWith.kt");
}
@Test
@TestMetadata("lists.kt")
public void testLists() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/lists.kt");
}
@Test
@TestMetadata("overrideEquals.kt")
public void testOverrideEquals() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/overrideEquals.kt");
}
@Test
@TestMetadata("properties.kt")
public void testProperties() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/properties.kt");
}
@Test
@TestMetadata("receiver.kt")
public void testReceiver() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/receiver.kt");
}
@Test
@TestMetadata("superTypes.kt")
public void testSuperTypes() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/superTypes.kt");
}
@Test
@TestMetadata("variance.kt")
public void testVariance() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/variance.kt");
}
@Test
@TestMetadata("where.kt")
public void testWhere() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/where.kt");
}
}
@@ -1,668 +0,0 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.visualizer.psi;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.test.generators.GenerateCompilerTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/rawBuilder")
@TestDataPath("$PROJECT_ROOT")
public class PsiVisualizerForRawFirDataGenerated extends AbstractPsiVisualizerTest {
@Test
public void testAllFilesPresentInRawBuilder() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/rawBuilder"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Nested
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations")
@TestDataPath("$PROJECT_ROOT")
public class Declarations {
@Test
public void testAllFilesPresentInDeclarations() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("annotation.kt")
public void testAnnotation() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotation.kt");
}
@Test
@TestMetadata("annotationOnField.kt")
public void testAnnotationOnField() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotationOnField.kt");
}
@Test
@TestMetadata("annotationOnProperty.kt")
public void testAnnotationOnProperty() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotationOnProperty.kt");
}
@Test
@TestMetadata("annotationsOnNullableParenthesizedTypes.kt")
public void testAnnotationsOnNullableParenthesizedTypes() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotationsOnNullableParenthesizedTypes.kt");
}
@Test
@TestMetadata("annotationsOnParenthesizedTypes.kt")
public void testAnnotationsOnParenthesizedTypes() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/annotationsOnParenthesizedTypes.kt");
}
@Test
@TestMetadata("classWithWrongSuperCall.kt")
public void testClassWithWrongSuperCall() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/classWithWrongSuperCall.kt");
}
@Test
@TestMetadata("complexTypes.kt")
public void testComplexTypes() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/complexTypes.kt");
}
@Test
@TestMetadata("constructorInObject.kt")
public void testConstructorInObject() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/constructorInObject.kt");
}
@Test
@TestMetadata("constructorOfAnonymousObject.kt")
public void testConstructorOfAnonymousObject() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/constructorOfAnonymousObject.kt");
}
@Test
@TestMetadata("contextReceivers.kt")
public void testContextReceivers() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contextReceivers.kt");
}
@Test
@TestMetadata("danglingAnnotationsClassLevel.kt")
public void testDanglingAnnotationsClassLevel() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsClassLevel.kt");
}
@Test
@TestMetadata("danglingAnnotationsFileLevel.kt")
public void testDanglingAnnotationsFileLevel() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/danglingAnnotationsFileLevel.kt");
}
@Test
@TestMetadata("delegates.kt")
public void testDelegates() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/delegates.kt");
}
@Test
@TestMetadata("derivedClass.kt")
public void testDerivedClass() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/derivedClass.kt");
}
@Test
@TestMetadata("emptyAnonymousObject.kt")
public void testEmptyAnonymousObject() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/emptyAnonymousObject.kt");
}
@Test
@TestMetadata("enums.kt")
public void testEnums() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.kt");
}
@Test
@TestMetadata("enums2.kt")
public void testEnums2() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.kt");
}
@Test
@TestMetadata("enums3.kt")
public void testEnums3() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums3.kt");
}
@Test
@TestMetadata("expectActual.kt")
public void testExpectActual() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectActual.kt");
}
@Test
@TestMetadata("expectClassesAndFunctions.kt")
public void testExpectClassesAndFunctions() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectClassesAndFunctions.kt");
}
@Test
@TestMetadata("expectNestedAnnotationClassWithConstructorParameter.kt")
public void testExpectNestedAnnotationClassWithConstructorParameter() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectNestedAnnotationClassWithConstructorParameter.kt");
}
@Test
@TestMetadata("expectNestedClassMembers.kt")
public void testExpectNestedClassMembers() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectNestedClassMembers.kt");
}
@Test
@TestMetadata("expectNestedEnumClassGeneratedMembers.kt")
public void testExpectNestedEnumClassGeneratedMembers() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/expectNestedEnumClassGeneratedMembers.kt");
}
@Test
@TestMetadata("external.kt")
public void testExternal() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/external.kt");
}
@Test
@TestMetadata("F.kt")
public void testF() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/F.kt");
}
@Test
@TestMetadata("functionTypes.kt")
public void testFunctionTypes() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/functionTypes.kt");
}
@Test
@TestMetadata("genericFunctions.kt")
public void testGenericFunctions() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/genericFunctions.kt");
}
@Test
@TestMetadata("genericProperty.kt")
public void testGenericProperty() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/genericProperty.kt");
}
@Test
@TestMetadata("initBlockWithDeclarations.kt")
public void testInitBlockWithDeclarations() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/initBlockWithDeclarations.kt");
}
@Test
@TestMetadata("invalidDestructing.kt")
public void testInvalidDestructing() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/invalidDestructing.kt");
}
@Test
@TestMetadata("nestedClass.kt")
public void testNestedClass() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/nestedClass.kt");
}
@Test
@TestMetadata("NestedOfAliasedType.kt")
public void testNestedOfAliasedType() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/NestedOfAliasedType.kt");
}
@Test
@TestMetadata("NestedSuperType.kt")
public void testNestedSuperType() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/NestedSuperType.kt");
}
@Test
@TestMetadata("noPrimaryConstructor.kt")
public void testNoPrimaryConstructor() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noPrimaryConstructor.kt");
}
@Test
@TestMetadata("propertyWithBackingField.kt")
public void testPropertyWithBackingField() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingField.kt");
}
@Test
@TestMetadata("propertyWithBackingFieldDifferentTypes.kt")
public void testPropertyWithBackingFieldDifferentTypes() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/propertyWithBackingFieldDifferentTypes.kt");
}
@Test
@TestMetadata("simpleClass.kt")
public void testSimpleClass() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/simpleClass.kt");
}
@Test
@TestMetadata("simpleFun.kt")
public void testSimpleFun() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/simpleFun.kt");
}
@Test
@TestMetadata("simpleTypeAlias.kt")
public void testSimpleTypeAlias() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/simpleTypeAlias.kt");
}
@Test
@TestMetadata("splitModifierList.kt")
public void testSplitModifierList() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/splitModifierList.kt");
}
@Test
@TestMetadata("suspendFunctionTypes.kt")
public void testSuspendFunctionTypes() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/suspendFunctionTypes.kt");
}
@Test
@TestMetadata("typeAliasWithGeneric.kt")
public void testTypeAliasWithGeneric() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeAliasWithGeneric.kt");
}
@Test
@TestMetadata("typeParameterVsNested.kt")
public void testTypeParameterVsNested() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameterVsNested.kt");
}
@Test
@TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameters.kt");
}
@Test
@TestMetadata("where.kt")
public void testWhere() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/where.kt");
}
@Nested
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts")
@TestDataPath("$PROJECT_ROOT")
public class Contracts {
@Test
public void testAllFilesPresentInContracts() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Nested
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/newSyntax")
@TestDataPath("$PROJECT_ROOT")
public class NewSyntax {
@Test
public void testAllFilesPresentInNewSyntax() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/newSyntax"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("functionWithBothOldAndNewSyntaxContractDescription.kt")
public void testFunctionWithBothOldAndNewSyntaxContractDescription() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/newSyntax/functionWithBothOldAndNewSyntaxContractDescription.kt");
}
@Test
@TestMetadata("propertyAccessorsContractDescription.kt")
public void testPropertyAccessorsContractDescription() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/newSyntax/propertyAccessorsContractDescription.kt");
}
@Test
@TestMetadata("simpleFunctionsContractDescription.kt")
public void testSimpleFunctionsContractDescription() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/newSyntax/simpleFunctionsContractDescription.kt");
}
}
@Nested
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/oldSyntax")
@TestDataPath("$PROJECT_ROOT")
public class OldSyntax {
@Test
public void testAllFilesPresentInOldSyntax() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/oldSyntax"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("contractDescription.kt")
public void testContractDescription() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/contracts/oldSyntax/contractDescription.kt");
}
}
}
@Nested
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType")
@TestDataPath("$PROJECT_ROOT")
public class NoParameterType {
@Test
public void testAllFilesPresentInNoParameterType() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("noParameterTypRefInCatch.kt")
public void testNoParameterTypRefInCatch() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInCatch.kt");
}
@Test
@TestMetadata("noParameterTypRefInFuncionalType.kt")
public void testNoParameterTypRefInFuncionalType() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInFuncionalType.kt");
}
@Test
@TestMetadata("noParameterTypRefInFunction.kt")
public void testNoParameterTypRefInFunction() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInFunction.kt");
}
@Test
@TestMetadata("noParameterTypRefInLambda.kt")
public void testNoParameterTypRefInLambda() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInLambda.kt");
}
@Test
@TestMetadata("noParameterTypRefInPrimaryConstructor.kt")
public void testNoParameterTypRefInPrimaryConstructor() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConstructor.kt");
}
@Test
@TestMetadata("noParameterTypRefInPrimaryConstructorWithVararg.kt")
public void testNoParameterTypRefInPrimaryConstructorWithVararg() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConstructorWithVararg.kt");
}
@Test
@TestMetadata("noParameterTypRefInPrimaryConsturctorVal.kt")
public void testNoParameterTypRefInPrimaryConsturctorVal() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConsturctorVal.kt");
}
@Test
@TestMetadata("noParameterTypRefInPrimaryConsturctorValWithVararg.kt")
public void testNoParameterTypRefInPrimaryConsturctorValWithVararg() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInPrimaryConsturctorValWithVararg.kt");
}
@Test
@TestMetadata("noParameterTypRefInSecondaryConstructor.kt")
public void testNoParameterTypRefInSecondaryConstructor() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInSecondaryConstructor.kt");
}
@Test
@TestMetadata("noParameterTypRefInSetter.kt")
public void testNoParameterTypRefInSetter() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/noParameterTypRefInSetter.kt");
}
@Test
@TestMetadata("uncompletedTypRefInPrimaryConstructorWithVararg.kt")
public void testUncompletedTypRefInPrimaryConstructorWithVararg() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConstructorWithVararg.kt");
}
@Test
@TestMetadata("uncompletedTypRefInPrimaryConsturctorValWithVararg.kt")
public void testUncompletedTypRefInPrimaryConsturctorValWithVararg() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/noParameterType/uncompletedTypRefInPrimaryConsturctorValWithVararg.kt");
}
}
}
@Nested
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions")
@TestDataPath("$PROJECT_ROOT")
public class Expressions {
@Test
public void testAllFilesPresentInExpressions() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("annotated.kt")
public void testAnnotated() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/annotated.kt");
}
@Test
@TestMetadata("arrayAccess.kt")
public void testArrayAccess() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/arrayAccess.kt");
}
@Test
@TestMetadata("arrayAssignment.kt")
public void testArrayAssignment() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/arrayAssignment.kt");
}
@Test
@TestMetadata("branches.kt")
public void testBranches() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/branches.kt");
}
@Test
@TestMetadata("callableReferences.kt")
public void testCallableReferences() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/callableReferences.kt");
}
@Test
@TestMetadata("calls.kt")
public void testCalls() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/calls.kt");
}
@Test
@TestMetadata("cascadeIf.kt")
public void testCascadeIf() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/cascadeIf.kt");
}
@Test
@TestMetadata("classReference.kt")
public void testClassReference() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/classReference.kt");
}
@Test
@TestMetadata("collectionLiterals.kt")
public void testCollectionLiterals() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/collectionLiterals.kt");
}
@Test
@TestMetadata("destructuring.kt")
public void testDestructuring() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/destructuring.kt");
}
@Test
@TestMetadata("for.kt")
public void testFor() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/for.kt");
}
@Test
@TestMetadata("genericCalls.kt")
public void testGenericCalls() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/genericCalls.kt");
}
@Test
@TestMetadata("in.kt")
public void testIn() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/in.kt");
}
@Test
@TestMetadata("inBrackets.kt")
public void testInBrackets() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/inBrackets.kt");
}
@Test
@TestMetadata("init.kt")
public void testInit() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/init.kt");
}
@Test
@TestMetadata("invalidWhen.kt")
public void testInvalidWhen() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/invalidWhen.kt");
}
@Test
@TestMetadata("labelForInfix.kt")
public void testLabelForInfix() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/labelForInfix.kt");
}
@Test
@TestMetadata("lambda.kt")
public void testLambda() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/lambda.kt");
}
@Test
@TestMetadata("lambdaAndAnonymousFunction.kt")
public void testLambdaAndAnonymousFunction() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/lambdaAndAnonymousFunction.kt");
}
@Test
@TestMetadata("localDeclarationWithExpression.kt")
public void testLocalDeclarationWithExpression() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/localDeclarationWithExpression.kt");
}
@Test
@TestMetadata("locals.kt")
public void testLocals() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/locals.kt");
}
@Test
@TestMetadata("modifications.kt")
public void testModifications() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/modifications.kt");
}
@Test
@TestMetadata("namedArgument.kt")
public void testNamedArgument() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/namedArgument.kt");
}
@Test
@TestMetadata("nullability.kt")
public void testNullability() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/nullability.kt");
}
@Test
@TestMetadata("qualifierWithTypeArguments.kt")
public void testQualifierWithTypeArguments() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/qualifierWithTypeArguments.kt");
}
@Test
@TestMetadata("safeCallsWithAssignment.kt")
public void testSafeCallsWithAssignment() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/safeCallsWithAssignment.kt");
}
@Test
@TestMetadata("safeCallsWithAugmentedAssignment.kt")
public void testSafeCallsWithAugmentedAssignment() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/safeCallsWithAugmentedAssignment.kt");
}
@Test
@TestMetadata("safeCallsWithUnaryOperators.kt")
public void testSafeCallsWithUnaryOperators() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/safeCallsWithUnaryOperators.kt");
}
@Test
@TestMetadata("simpleReturns.kt")
public void testSimpleReturns() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/simpleReturns.kt");
}
@Test
@TestMetadata("super.kt")
public void testSuper() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/super.kt");
}
@Test
@TestMetadata("these.kt")
public void testThese() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/these.kt");
}
@Test
@TestMetadata("try.kt")
public void testTry() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/try.kt");
}
@Test
@TestMetadata("typeOperators.kt")
public void testTypeOperators() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/typeOperators.kt");
}
@Test
@TestMetadata("unary.kt")
public void testUnary() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/unary.kt");
}
@Test
@TestMetadata("variables.kt")
public void testVariables() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/variables.kt");
}
@Test
@TestMetadata("while.kt")
public void testWhile() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/while.kt");
}
}
}
@@ -1,86 +0,0 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.visualizer.psi;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.test.generators.GenerateCompilerTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("compiler/visualizer/testData/uncommonCases/testFiles")
@TestDataPath("$PROJECT_ROOT")
public class PsiVisualizerForUncommonCasesGenerated extends AbstractPsiVisualizerTest {
@Test
public void testAllFilesPresentInTestFiles() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/visualizer/testData/uncommonCases/testFiles"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("dataClass.kt")
public void testDataClass() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/dataClass.kt");
}
@Test
@TestMetadata("delegation.kt")
public void testDelegation() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/delegation.kt");
}
@Test
@TestMetadata("innerWith.kt")
public void testInnerWith() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/innerWith.kt");
}
@Test
@TestMetadata("lists.kt")
public void testLists() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/lists.kt");
}
@Test
@TestMetadata("overrideEquals.kt")
public void testOverrideEquals() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/overrideEquals.kt");
}
@Test
@TestMetadata("properties.kt")
public void testProperties() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/properties.kt");
}
@Test
@TestMetadata("receiver.kt")
public void testReceiver() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/receiver.kt");
}
@Test
@TestMetadata("superTypes.kt")
public void testSuperTypes() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/superTypes.kt");
}
@Test
@TestMetadata("variance.kt")
public void testVariance() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/variance.kt");
}
@Test
@TestMetadata("where.kt")
public void testWhere() throws Exception {
runTest("compiler/visualizer/testData/uncommonCases/testFiles/where.kt");
}
}
@@ -1,91 +0,0 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.visualizer
import org.jetbrains.kotlin.compiler.visualizer.FirVisualizer
import org.jetbrains.kotlin.compiler.visualizer.PsiVisualizer
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.test.Constructor
import org.jetbrains.kotlin.test.TestConfiguration
import org.jetbrains.kotlin.test.TestRunner
import org.jetbrains.kotlin.test.builders.testConfiguration
import org.jetbrains.kotlin.test.directives.ConfigurationDirectives
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendFacade
import org.jetbrains.kotlin.test.frontend.fir.FirFrontendFacade
import org.jetbrains.kotlin.test.model.*
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest
import org.jetbrains.kotlin.test.services.*
import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator
import org.jetbrains.kotlin.test.services.configuration.JvmEnvironmentConfigurator
import org.jetbrains.kotlin.test.services.impl.TemporaryDirectoryManagerImpl
import org.jetbrains.kotlin.test.services.sourceProviders.AdditionalDiagnosticsSourceFilesProvider
import org.jetbrains.kotlin.test.services.sourceProviders.CodegenHelpersSourceFilesProvider
import org.jetbrains.kotlin.test.services.sourceProviders.CoroutineHelpersSourceFilesProvider
abstract class AbstractVisualizerBlackBoxTest {
private fun <O : ResultingArtifact.FrontendOutput<O>> createConfiguration(
filePath: String,
frontendKind: FrontendKind<O>,
frontendFacade: Constructor<FrontendFacade<O>>
): TestConfiguration = testConfiguration(filePath) {
assertions = JUnit5Assertions
testInfo = KotlinTestInfo("_undefined_", "_testUndefined_", setOf())
startingArtifactFactory = { ResultingArtifact.Source() }
useAdditionalService<TemporaryDirectoryManager>(::TemporaryDirectoryManagerImpl)
useSourcePreprocessor(*AbstractKotlinCompilerTest.defaultPreprocessors.toTypedArray())
useDirectives(*AbstractKotlinCompilerTest.defaultDirectiveContainers.toTypedArray())
globalDefaults {
targetPlatform = JvmPlatforms.defaultJvmPlatform
dependencyKind = DependencyKind.Source
frontend = frontendKind
}
defaultDirectives {
+ConfigurationDirectives.WITH_STDLIB
}
useConfigurators(
::CommonEnvironmentConfigurator,
::JvmEnvironmentConfigurator,
)
useAdditionalSourceProviders(
::AdditionalDiagnosticsSourceFilesProvider,
::CoroutineHelpersSourceFilesProvider,
::CodegenHelpersSourceFilesProvider
)
facadeStep(frontendFacade)
}
fun runTest(filePath: String) {
lateinit var psiRenderResult: String
lateinit var firRenderResult: String
val psiConfiguration = createConfiguration(filePath, FrontendKinds.ClassicFrontend, ::ClassicFrontendFacade)
TestRunner(psiConfiguration).runTest(filePath) { testConfiguration ->
testConfiguration.testServices.moduleStructure.modules.forEach { psiModule ->
val psiArtifact = testConfiguration.testServices.dependencyProvider.getArtifact(psiModule, FrontendKinds.ClassicFrontend)
val psiRenderer = psiArtifact.ktFiles.values.firstOrNull()?.let { PsiVisualizer(it, psiArtifact.analysisResult) }
psiRenderResult = psiRenderer?.render()?.trim() ?: ""
}
}
val firConfiguration = createConfiguration(filePath, FrontendKinds.FIR, ::FirFrontendFacade)
TestRunner(firConfiguration).runTest(filePath) { testConfiguration ->
testConfiguration.testServices.moduleStructure.modules.forEach { firModule ->
val firArtifact = testConfiguration.testServices.dependencyProvider.getArtifact(firModule, FrontendKinds.FIR)
val firRenderer = firArtifact.mainFirFiles.values.firstOrNull()?.let { FirVisualizer(it) }
firRenderResult = firRenderer?.render()?.trim() ?: ""
}
}
psiConfiguration.testServices.assertions.assertEquals(psiRenderResult, firRenderResult)
}
}
@@ -1,69 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.visualizer
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.test.Constructor
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.directives.ConfigurationDirectives
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendFacade
import org.jetbrains.kotlin.test.frontend.fir.FirFrontendFacade
import org.jetbrains.kotlin.test.model.DependencyKind
import org.jetbrains.kotlin.test.model.FrontendKind
import org.jetbrains.kotlin.test.model.FrontendOutputHandler
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest
import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator
import org.jetbrains.kotlin.test.services.configuration.JvmEnvironmentConfigurator
abstract class AbstractVisualizerTest : AbstractKotlinCompilerTest() {
abstract val handler: Constructor<FrontendOutputHandler<*>>
abstract val frontendKind: FrontendKind<*>
override fun TestConfigurationBuilder.configuration() {
globalDefaults {
frontend = frontendKind
targetPlatform = JvmPlatforms.defaultJvmPlatform
dependencyKind = DependencyKind.Source
}
useConfigurators(
::CommonEnvironmentConfigurator,
::JvmEnvironmentConfigurator,
)
// TODO
// useFrontendFacades(
// ::FirFrontendFacade,
// ::ClassicFrontendFacade
// )
// useFrontendHandlers(handler)
defaultDirectives {
+ConfigurationDirectives.WITH_STDLIB
}
forTestsMatching("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/*") {
defaultDirectives {
VisualizerDirectives.TEST_FILE_PATH with "fir/raw-fir/psi2fir"
VisualizerDirectives.EXPECTED_FILE_PATH with "visualizer"
}
}
forTestsMatching("compiler/fir/raw-fir/psi2fir/testData/rawBuilder/expressions/*") {
defaultDirectives {
VisualizerDirectives.TEST_FILE_PATH with "fir/raw-fir/psi2fir"
VisualizerDirectives.EXPECTED_FILE_PATH with "visualizer"
}
}
forTestsMatching("compiler/visualizer/testData/uncommonCases/*") {
defaultDirectives {
VisualizerDirectives.TEST_FILE_PATH with "uncommonCases/testFiles"
VisualizerDirectives.EXPECTED_FILE_PATH with "uncommonCases/resultFiles"
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More