Analysis API: add test for annotations on types

This commit is contained in:
Ilya Kirillov
2021-11-18 19:23:50 +01:00
parent 193df3e3c4
commit a084ad59de
23 changed files with 300 additions and 1 deletions
@@ -0,0 +1,12 @@
/*
* 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.analysis.api.descriptors.test.annotations
import org.jetbrains.kotlin.analysis.api.descriptors.test.KtFe10FrontendApiTestConfiguratorService
import org.jetbrains.kotlin.analysis.api.impl.base.test.annotations.AbstractAnalysisApiAnnotationsOnTypesTest
abstract class AbstractAnalysisApiFe10AnnotationsOnTypesTest :
AbstractAnalysisApiAnnotationsOnTypesTest(KtFe10FrontendApiTestConfiguratorService)
@@ -0,0 +1,68 @@
/*
* 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.analysis.api.descriptors.test.annotations;
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 GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("analysis/analysis-api/testData/annotations/annotationsOnTypes")
@TestDataPath("$PROJECT_ROOT")
public class AnalysisApiFe10AnnotationsOnTypesTestGenerated extends AbstractAnalysisApiFe10AnnotationsOnTypesTest {
@Test
public void testAllFilesPresentInAnnotationsOnTypes() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/annotations/annotationsOnTypes"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("annotaionOnType.kt")
public void testAnnotaionOnType() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnTypes/annotaionOnType.kt");
}
@Test
@TestMetadata("annotaionOnTypeArgument.kt")
public void testAnnotaionOnTypeArgument() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnTypes/annotaionOnTypeArgument.kt");
}
@Test
@TestMetadata("annotaionOnTypeArgumentOfTypeArgument.kt")
public void testAnnotaionOnTypeArgumentOfTypeArgument() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnTypes/annotaionOnTypeArgumentOfTypeArgument.kt");
}
@Test
@TestMetadata("annotaionWithComplexArgumentOnType.kt")
public void testAnnotaionWithComplexArgumentOnType() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnTypes/annotaionWithComplexArgumentOnType.kt");
}
@Test
@TestMetadata("annotaionWithComplexArgumentOnTypeArgument.kt")
public void testAnnotaionWithComplexArgumentOnTypeArgument() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnTypes/annotaionWithComplexArgumentOnTypeArgument.kt");
}
@Test
@TestMetadata("annotaionWithLiteralArgumentOnType.kt")
public void testAnnotaionWithLiteralArgumentOnType() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnTypes/annotaionWithLiteralArgumentOnType.kt");
}
@Test
@TestMetadata("annotaionWithLiteralArgumentOnTypeArgument.kt")
public void testAnnotaionWithLiteralArgumentOnTypeArgument() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnTypes/annotaionWithLiteralArgumentOnTypeArgument.kt");
}
}
@@ -0,0 +1,12 @@
/*
* 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.analysis.api.fir.annotations
import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService
import org.jetbrains.kotlin.analysis.api.impl.base.test.annotations.AbstractAnalysisApiAnnotationsOnTypesTest
abstract class AbstractAnalysisApiFirAnnotationsOnTypesTest :
AbstractAnalysisApiAnnotationsOnTypesTest(FirFrontendApiTestConfiguratorService)
@@ -0,0 +1,68 @@
/*
* 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.analysis.api.fir.annotations;
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 GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("analysis/analysis-api/testData/annotations/annotationsOnTypes")
@TestDataPath("$PROJECT_ROOT")
public class AnalysisApiFirAnnotationsOnTypesTestGenerated extends AbstractAnalysisApiFirAnnotationsOnTypesTest {
@Test
public void testAllFilesPresentInAnnotationsOnTypes() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/annotations/annotationsOnTypes"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("annotaionOnType.kt")
public void testAnnotaionOnType() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnTypes/annotaionOnType.kt");
}
@Test
@TestMetadata("annotaionOnTypeArgument.kt")
public void testAnnotaionOnTypeArgument() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnTypes/annotaionOnTypeArgument.kt");
}
@Test
@TestMetadata("annotaionOnTypeArgumentOfTypeArgument.kt")
public void testAnnotaionOnTypeArgumentOfTypeArgument() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnTypes/annotaionOnTypeArgumentOfTypeArgument.kt");
}
@Test
@TestMetadata("annotaionWithComplexArgumentOnType.kt")
public void testAnnotaionWithComplexArgumentOnType() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnTypes/annotaionWithComplexArgumentOnType.kt");
}
@Test
@TestMetadata("annotaionWithComplexArgumentOnTypeArgument.kt")
public void testAnnotaionWithComplexArgumentOnTypeArgument() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnTypes/annotaionWithComplexArgumentOnTypeArgument.kt");
}
@Test
@TestMetadata("annotaionWithLiteralArgumentOnType.kt")
public void testAnnotaionWithLiteralArgumentOnType() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnTypes/annotaionWithLiteralArgumentOnType.kt");
}
@Test
@TestMetadata("annotaionWithLiteralArgumentOnTypeArgument.kt")
public void testAnnotaionWithLiteralArgumentOnTypeArgument() throws Exception {
runTest("analysis/analysis-api/testData/annotations/annotationsOnTypes/annotaionWithLiteralArgumentOnTypeArgument.kt");
}
}
@@ -0,0 +1,43 @@
/*
* 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.analysis.api.impl.base.test.annotations
import org.jetbrains.kotlin.analysis.api.annotations.annotations
import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService
import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider
import org.jetbrains.kotlin.analysis.api.impl.base.test.indented
import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleFileTest
import org.jetbrains.kotlin.analysis.api.symbols.DebugSymbolRenderer
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtTypeReference
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.assertions
abstract class AbstractAnalysisApiAnnotationsOnTypesTest(
configurator: FrontendApiTestConfiguratorService
) : AbstractHLApiSingleFileTest(configurator) {
override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) {
val ktTypeReference = testServices.expressionMarkerProvider
.getElementOfTypAtCaret<KtTypeReference>(ktFile)
val actual = analyseForTest(ktFile) {
val ktType = ktTypeReference.getKtType()
val annotations = ktType.annotations
buildString {
appendLine("KtTypeReference: ${ktTypeReference.text}")
appendLine("annotations: [")
for (annotation in annotations) {
appendLine(DebugSymbolRenderer.renderAnnotationApplication(annotation).indented(indent = 2))
}
appendLine("]")
}
}
testServices.assertions.assertEqualsToTestDataFileSibling(actual)
}
}
@@ -40,4 +40,9 @@ fun KtSymbol.getNameWithPositionString(): String {
null -> "null"
else -> psi::class.simpleName
} + "@" + psi.position()
}
fun String.indented(indent: Int): String {
val indentString = " ".repeat(indent)
return indentString + replace("\n", "\n$indentString")
}
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.test.services.TestServices
abstract class AbstractHLApiSingleFileTest(configurator: FrontendApiTestConfiguratorService) : AbstractHLApiSingleModuleTest(configurator) {
final override fun doTestByFileStructure(ktFiles: List<KtFile>, module: TestModule, testServices: TestServices) {
val singleFile = ktFiles.single()
val singleFile = ktFiles.singleOrNull() ?: ktFiles.first { it.name == "main.kt" }
doTestByFileStructure(singleFile, module, testServices)
}
@@ -27,6 +27,9 @@ import kotlin.reflect.full.extensionReceiverParameter
public object DebugSymbolRenderer {
public fun render(symbol: KtSymbol): String = Block().apply { renderSymbol(symbol) }.toString()
public fun renderAnnotationApplication(application: KtAnnotationApplication): String =
Block().apply { renderAnnotationApplication(application) }.toString()
public fun renderType(type: KtType): String = Block().apply { renderType(type) }.toString()
public fun KtAnalysisSession.renderExtra(symbol: KtSymbol): String = Block().apply {
@@ -0,0 +1,6 @@
@Target(AnnotationTarget.TYPE)
annotation class TypeAnnotation
fun x(): @TypeAnnotation Li<caret>st<Int> {
TODO()
}
@@ -0,0 +1,5 @@
KtTypeReference: @TypeAnnotation List<Int>
annotations: [
TypeAnnotation()
psi: KtAnnotationEntry
]
@@ -0,0 +1,6 @@
@Target(AnnotationTarget.TYPE)
annotation class TypeAnnotation
fun x(): List<@TypeAnnotation In<caret>t> {
TODO()
}
@@ -0,0 +1,5 @@
KtTypeReference: @TypeAnnotation Int
annotations: [
TypeAnnotation()
psi: KtAnnotationEntry
]
@@ -0,0 +1,6 @@
@Target(AnnotationTarget.TYPE)
annotation class TypeAnnotation
fun x(): List<MutableList<@TypeAnnotation I<caret>nt>> {
TODO()
}
@@ -0,0 +1,5 @@
KtTypeReference: @TypeAnnotation Int
annotations: [
TypeAnnotation()
psi: KtAnnotationEntry
]
@@ -0,0 +1,6 @@
@Target(AnnotationTarget.TYPE)
annotation class TypeAnnotation(val value: Int)
fun x(): @TypeAnnotation(1 + 1) Li<caret>st<Int> {
TODO()
}
@@ -0,0 +1,5 @@
KtTypeReference: @TypeAnnotation(1 + 1) List<Int>
annotations: [
TypeAnnotation(value = 2)
psi: KtAnnotationEntry
]
@@ -0,0 +1,6 @@
@Target(AnnotationTarget.TYPE)
annotation class TypeAnnotation(val value: Int)
fun x(): MutableList<@TypeAnnotation(1 + 1) L<caret>ist<Int>> {
TODO()
}
@@ -0,0 +1,5 @@
KtTypeReference: @TypeAnnotation(1 + 1) List<Int>
annotations: [
TypeAnnotation(value = 2)
psi: KtAnnotationEntry
]
@@ -0,0 +1,6 @@
@Target(AnnotationTarget.TYPE)
annotation class TypeAnnotation(val value: Int)
fun x(): @TypeAnnotation(1) Li<caret>st<Int> {
TODO()
}
@@ -0,0 +1,5 @@
KtTypeReference: @TypeAnnotation(1) List<Int>
annotations: [
TypeAnnotation(value = 1)
psi: KtAnnotationEntry
]
@@ -0,0 +1,6 @@
@Target(AnnotationTarget.TYPE)
annotation class TypeAnnotation(val value: Int)
fun x(): List<@TypeAnnotation(1) I<caret>nt> {
TODO()
}
@@ -0,0 +1,5 @@
KtTypeReference: @TypeAnnotation(1) Int
annotations: [
TypeAnnotation(value = 1)
psi: KtAnnotationEntry
]
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.generators.tests.analysis.api
import org.jetbrains.kotlin.analysis.api.descriptors.test.annotations.AbstractAnalysisApiFe10AnnotationsOnTypesTest
import org.jetbrains.kotlin.analysis.api.descriptors.test.components.callResolver.AbstractKtFe10ResolveCallTest
import org.jetbrains.kotlin.analysis.api.descriptors.test.components.compileTimeConstantProvider.AbstractKtFe10CompileTimeConstantEvaluatorTest
import org.jetbrains.kotlin.analysis.api.descriptors.test.components.expressionInfoProvider.AbstractKtFe10ReturnTargetSymbolTest
@@ -20,6 +21,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.test.symbols.AbstractKtFe10
import org.jetbrains.kotlin.analysis.api.descriptors.test.symbols.AbstractKtFe10SymbolByPsiTest
import org.jetbrains.kotlin.analysis.api.descriptors.test.symbols.AbstractKtFe10SymbolByReferenceTest
import org.jetbrains.kotlin.analysis.api.fir.AbstractFirReferenceResolveTest
import org.jetbrains.kotlin.analysis.api.fir.annotations.AbstractAnalysisApiFirAnnotationsOnTypesTest
import org.jetbrains.kotlin.analysis.api.fir.components.callResolver.AbstractFirResolveCallTest
import org.jetbrains.kotlin.analysis.api.fir.components.compileTimeConstantProvider.AbstractFirCompileTimeConstantEvaluatorTest
import org.jetbrains.kotlin.analysis.api.fir.components.expressionInfoProvider.AbstractFirReturnTargetSymbolTest
@@ -102,6 +104,15 @@ private fun TestGroupSuite.generateAnalysisApiNonComponentsTests() {
model("symbolByReference")
}
}
group("annotations") {
test(
fir = AbstractAnalysisApiFirAnnotationsOnTypesTest::class,
fe10 = AbstractAnalysisApiFe10AnnotationsOnTypesTest::class
) {
model("annotationsOnTypes")
}
}
}