[FIR] KT-46483: Forbid annotations in where Clauses
Merge-request: KT-MR-7208 Merged-by: Nikolay Lunyak <lunyak.kolya@mail.ru>
This commit is contained in:
+6
@@ -955,6 +955,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
|||||||
token,
|
token,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
add(FirErrors.ANNOTATION_IN_WHERE_CLAUSE_ERROR) { firDiagnostic ->
|
||||||
|
AnnotationInWhereClauseErrorImpl(
|
||||||
|
firDiagnostic as KtPsiDiagnostic,
|
||||||
|
token,
|
||||||
|
)
|
||||||
|
}
|
||||||
add(FirErrors.OPT_IN_USAGE) { firDiagnostic ->
|
add(FirErrors.OPT_IN_USAGE) { firDiagnostic ->
|
||||||
OptInUsageImpl(
|
OptInUsageImpl(
|
||||||
firDiagnostic.a,
|
firDiagnostic.a,
|
||||||
|
|||||||
+4
@@ -689,6 +689,10 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
|
|||||||
override val diagnosticClass get() = WrongExtensionFunctionTypeWarning::class
|
override val diagnosticClass get() = WrongExtensionFunctionTypeWarning::class
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract class AnnotationInWhereClauseError : KtFirDiagnostic<KtAnnotationEntry>() {
|
||||||
|
override val diagnosticClass get() = AnnotationInWhereClauseError::class
|
||||||
|
}
|
||||||
|
|
||||||
abstract class OptInUsage : KtFirDiagnostic<PsiElement>() {
|
abstract class OptInUsage : KtFirDiagnostic<PsiElement>() {
|
||||||
override val diagnosticClass get() = OptInUsage::class
|
override val diagnosticClass get() = OptInUsage::class
|
||||||
abstract val optInMarkerFqName: FqName
|
abstract val optInMarkerFqName: FqName
|
||||||
|
|||||||
+5
@@ -827,6 +827,11 @@ internal class WrongExtensionFunctionTypeWarningImpl(
|
|||||||
override val token: KtLifetimeToken,
|
override val token: KtLifetimeToken,
|
||||||
) : KtFirDiagnostic.WrongExtensionFunctionTypeWarning(), KtAbstractFirDiagnostic<KtAnnotationEntry>
|
) : KtFirDiagnostic.WrongExtensionFunctionTypeWarning(), KtAbstractFirDiagnostic<KtAnnotationEntry>
|
||||||
|
|
||||||
|
internal class AnnotationInWhereClauseErrorImpl(
|
||||||
|
override val firDiagnostic: KtPsiDiagnostic,
|
||||||
|
override val token: KtLifetimeToken,
|
||||||
|
) : KtFirDiagnostic.AnnotationInWhereClauseError(), KtAbstractFirDiagnostic<KtAnnotationEntry>
|
||||||
|
|
||||||
internal class OptInUsageImpl(
|
internal class OptInUsageImpl(
|
||||||
override val optInMarkerFqName: FqName,
|
override val optInMarkerFqName: FqName,
|
||||||
override val message: String,
|
override val message: String,
|
||||||
|
|||||||
+6
@@ -423,6 +423,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
|
|||||||
runTest("compiler/testData/diagnostics/tests/kt435.kt");
|
runTest("compiler/testData/diagnostics/tests/kt435.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt46483.kt")
|
||||||
|
public void testKt46483() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/kt46483.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt49438.kt")
|
@TestMetadata("kt49438.kt")
|
||||||
public void testKt49438() throws Exception {
|
public void testKt49438() throws Exception {
|
||||||
|
|||||||
+6
@@ -423,6 +423,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
|
|||||||
runTest("compiler/testData/diagnostics/tests/kt435.kt");
|
runTest("compiler/testData/diagnostics/tests/kt435.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt46483.kt")
|
||||||
|
public void testKt46483() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/kt46483.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt49438.kt")
|
@TestMetadata("kt49438.kt")
|
||||||
public void testKt49438() throws Exception {
|
public void testKt49438() throws Exception {
|
||||||
|
|||||||
+6
@@ -423,6 +423,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
|
|||||||
runTest("compiler/testData/diagnostics/tests/kt435.kt");
|
runTest("compiler/testData/diagnostics/tests/kt435.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt46483.kt")
|
||||||
|
public void testKt46483() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/kt46483.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt49438.kt")
|
@TestMetadata("kt49438.kt")
|
||||||
public void testKt49438() throws Exception {
|
public void testKt49438() throws Exception {
|
||||||
|
|||||||
+1
@@ -291,6 +291,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
|||||||
val NOT_A_CLASS by error<PsiElement>()
|
val NOT_A_CLASS by error<PsiElement>()
|
||||||
val WRONG_EXTENSION_FUNCTION_TYPE by error<KtAnnotationEntry>()
|
val WRONG_EXTENSION_FUNCTION_TYPE by error<KtAnnotationEntry>()
|
||||||
val WRONG_EXTENSION_FUNCTION_TYPE_WARNING by warning<KtAnnotationEntry>()
|
val WRONG_EXTENSION_FUNCTION_TYPE_WARNING by warning<KtAnnotationEntry>()
|
||||||
|
val ANNOTATION_IN_WHERE_CLAUSE_ERROR by error<KtAnnotationEntry>()
|
||||||
}
|
}
|
||||||
|
|
||||||
val OPT_IN by object : DiagnosticGroup("OptIn") {
|
val OPT_IN by object : DiagnosticGroup("OptIn") {
|
||||||
|
|||||||
@@ -256,6 +256,7 @@ object FirErrors {
|
|||||||
val NOT_A_CLASS by error0<PsiElement>()
|
val NOT_A_CLASS by error0<PsiElement>()
|
||||||
val WRONG_EXTENSION_FUNCTION_TYPE by error0<KtAnnotationEntry>()
|
val WRONG_EXTENSION_FUNCTION_TYPE by error0<KtAnnotationEntry>()
|
||||||
val WRONG_EXTENSION_FUNCTION_TYPE_WARNING by warning0<KtAnnotationEntry>()
|
val WRONG_EXTENSION_FUNCTION_TYPE_WARNING by warning0<KtAnnotationEntry>()
|
||||||
|
val ANNOTATION_IN_WHERE_CLAUSE_ERROR by error0<KtAnnotationEntry>()
|
||||||
|
|
||||||
// OptIn
|
// OptIn
|
||||||
val OPT_IN_USAGE by warning2<PsiElement, FqName, String>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
|
val OPT_IN_USAGE by warning2<PsiElement, FqName, String>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
|
||||||
|
|||||||
+5
@@ -46,6 +46,11 @@ class ErrorNodeDiagnosticCollectorComponent(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitErrorAnnotationCall(errorAnnotationCall: FirErrorAnnotationCall, data: CheckerContext) {
|
||||||
|
val source = errorAnnotationCall.source ?: return
|
||||||
|
reportFirDiagnostic(errorAnnotationCall.diagnostic, source, data)
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitErrorNamedReference(errorNamedReference: FirErrorNamedReference, data: CheckerContext) {
|
override fun visitErrorNamedReference(errorNamedReference: FirErrorNamedReference, data: CheckerContext) {
|
||||||
val source = errorNamedReference.source ?: return
|
val source = errorNamedReference.source ?: return
|
||||||
val qualifiedAccessOrAnnotationCall = data.qualifiedAccessOrAnnotationCalls.lastOrNull()?.takeIf {
|
val qualifiedAccessOrAnnotationCall = data.qualifiedAccessOrAnnotationCalls.lastOrNull()?.takeIf {
|
||||||
|
|||||||
+5
@@ -67,6 +67,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_ARGUME
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_CLASS_CONSTRUCTOR_CALL
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_CLASS_CONSTRUCTOR_CALL
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_CLASS_MEMBER
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_CLASS_MEMBER
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_IN_WHERE_CLAUSE_ERROR
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_ON_SUPERCLASS
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_ON_SUPERCLASS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_USED_AS_ANNOTATION_ARGUMENT
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_USED_AS_ANNOTATION_ARGUMENT
|
||||||
@@ -887,6 +888,10 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
|
|||||||
WRONG_EXTENSION_FUNCTION_TYPE_WARNING,
|
WRONG_EXTENSION_FUNCTION_TYPE_WARNING,
|
||||||
"ExtensionFunctionType makes no sense on a non-function type. It will be an error in a future release. See https://youtrack.jetbrains.com/issue/KT-43527"
|
"ExtensionFunctionType makes no sense on a non-function type. It will be an error in a future release. See https://youtrack.jetbrains.com/issue/KT-43527"
|
||||||
)
|
)
|
||||||
|
map.put(
|
||||||
|
ANNOTATION_IN_WHERE_CLAUSE_ERROR,
|
||||||
|
"Type parameter annotations are not allowed inside where clauses. You should probably move annotations to the type parameter declaration",
|
||||||
|
)
|
||||||
|
|
||||||
// Exposed visibility group // #
|
// Exposed visibility group // #
|
||||||
map.put(
|
map.put(
|
||||||
|
|||||||
+1
@@ -512,6 +512,7 @@ private fun ConeSimpleDiagnostic.getFactory(source: KtSourceElement): KtDiagnost
|
|||||||
DiagnosticKind.EnumEntryAsType -> FirErrors.ENUM_ENTRY_AS_TYPE
|
DiagnosticKind.EnumEntryAsType -> FirErrors.ENUM_ENTRY_AS_TYPE
|
||||||
DiagnosticKind.NotASupertype -> FirErrors.NOT_A_SUPERTYPE
|
DiagnosticKind.NotASupertype -> FirErrors.NOT_A_SUPERTYPE
|
||||||
DiagnosticKind.SuperNotAvailable -> FirErrors.SUPER_NOT_AVAILABLE
|
DiagnosticKind.SuperNotAvailable -> FirErrors.SUPER_NOT_AVAILABLE
|
||||||
|
DiagnosticKind.AnnotationNotAllowed -> FirErrors.ANNOTATION_IN_WHERE_CLAUSE_ERROR
|
||||||
DiagnosticKind.UnresolvedSupertype,
|
DiagnosticKind.UnresolvedSupertype,
|
||||||
DiagnosticKind.UnresolvedExpandedType,
|
DiagnosticKind.UnresolvedExpandedType,
|
||||||
DiagnosticKind.Other -> FirErrors.OTHER_ERROR
|
DiagnosticKind.Other -> FirErrors.OTHER_ERROR
|
||||||
|
|||||||
+37
-17
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.*
|
|||||||
import org.jetbrains.kotlin.ElementTypeUtils.isExpression
|
import org.jetbrains.kotlin.ElementTypeUtils.isExpression
|
||||||
import org.jetbrains.kotlin.KtNodeTypes.*
|
import org.jetbrains.kotlin.KtNodeTypes.*
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
@@ -29,6 +30,7 @@ import org.jetbrains.kotlin.fir.declarations.*
|
|||||||
import org.jetbrains.kotlin.fir.declarations.builder.*
|
import org.jetbrains.kotlin.fir.declarations.builder.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.*
|
import org.jetbrains.kotlin.fir.declarations.impl.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||||
|
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
@@ -367,7 +369,8 @@ class DeclarationsConverter(
|
|||||||
*/
|
*/
|
||||||
fun convertAnnotationEntry(
|
fun convertAnnotationEntry(
|
||||||
unescapedAnnotation: LighterASTNode,
|
unescapedAnnotation: LighterASTNode,
|
||||||
defaultAnnotationUseSiteTarget: AnnotationUseSiteTarget? = null
|
defaultAnnotationUseSiteTarget: AnnotationUseSiteTarget? = null,
|
||||||
|
diagnostic: ConeDiagnostic? = null,
|
||||||
): FirAnnotationCall {
|
): FirAnnotationCall {
|
||||||
var annotationUseSiteTarget: AnnotationUseSiteTarget? = null
|
var annotationUseSiteTarget: AnnotationUseSiteTarget? = null
|
||||||
lateinit var constructorCalleePair: Pair<FirTypeRef, List<FirExpression>>
|
lateinit var constructorCalleePair: Pair<FirTypeRef, List<FirExpression>>
|
||||||
@@ -379,21 +382,34 @@ class DeclarationsConverter(
|
|||||||
}
|
}
|
||||||
val qualifier = (constructorCalleePair.first as? FirUserTypeRef)?.qualifier?.last()
|
val qualifier = (constructorCalleePair.first as? FirUserTypeRef)?.qualifier?.last()
|
||||||
val name = qualifier?.name ?: Name.special("<no-annotation-name>")
|
val name = qualifier?.name ?: Name.special("<no-annotation-name>")
|
||||||
return buildAnnotationCall {
|
val theCalleeReference = buildSimpleNamedReference {
|
||||||
source = unescapedAnnotation.toFirSourceElement()
|
source = unescapedAnnotation
|
||||||
useSiteTarget = annotationUseSiteTarget ?: defaultAnnotationUseSiteTarget
|
.getChildNodeByType(CONSTRUCTOR_CALLEE)
|
||||||
annotationTypeRef = constructorCalleePair.first
|
?.getChildNodeByType(TYPE_REFERENCE)
|
||||||
calleeReference = buildSimpleNamedReference {
|
?.getChildNodeByType(USER_TYPE)
|
||||||
source = unescapedAnnotation
|
?.getChildNodeByType(REFERENCE_EXPRESSION)
|
||||||
.getChildNodeByType(CONSTRUCTOR_CALLEE)
|
?.toFirSourceElement()
|
||||||
?.getChildNodeByType(TYPE_REFERENCE)
|
this.name = name
|
||||||
?.getChildNodeByType(USER_TYPE)
|
}
|
||||||
?.getChildNodeByType(REFERENCE_EXPRESSION)
|
return if (diagnostic == null) {
|
||||||
?.toFirSourceElement()
|
buildAnnotationCall {
|
||||||
this.name = name
|
source = unescapedAnnotation.toFirSourceElement()
|
||||||
|
useSiteTarget = annotationUseSiteTarget ?: defaultAnnotationUseSiteTarget
|
||||||
|
annotationTypeRef = constructorCalleePair.first
|
||||||
|
calleeReference = theCalleeReference
|
||||||
|
extractArgumentsFrom(constructorCalleePair.second)
|
||||||
|
typeArguments += qualifier?.typeArgumentList?.typeArguments ?: listOf()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
buildErrorAnnotationCall {
|
||||||
|
source = unescapedAnnotation.toFirSourceElement()
|
||||||
|
useSiteTarget = annotationUseSiteTarget ?: defaultAnnotationUseSiteTarget
|
||||||
|
annotationTypeRef = constructorCalleePair.first
|
||||||
|
this.diagnostic = diagnostic
|
||||||
|
calleeReference = theCalleeReference
|
||||||
|
extractArgumentsFrom(constructorCalleePair.second)
|
||||||
|
typeArguments += qualifier?.typeArgumentList?.typeArguments ?: listOf()
|
||||||
}
|
}
|
||||||
extractArgumentsFrom(constructorCalleePair.second)
|
|
||||||
typeArguments += qualifier?.typeArgumentList?.typeArguments ?: listOf()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1875,11 +1891,15 @@ class DeclarationsConverter(
|
|||||||
lateinit var identifier: String
|
lateinit var identifier: String
|
||||||
lateinit var firType: FirTypeRef
|
lateinit var firType: FirTypeRef
|
||||||
lateinit var referenceExpression: LighterASTNode
|
lateinit var referenceExpression: LighterASTNode
|
||||||
|
|
||||||
|
val diagnostic = ConeSimpleDiagnostic(
|
||||||
|
"Type parameter annotations are not allowed inside where clauses", DiagnosticKind.AnnotationNotAllowed,
|
||||||
|
)
|
||||||
|
|
||||||
val annotations = mutableListOf<FirAnnotation>()
|
val annotations = mutableListOf<FirAnnotation>()
|
||||||
typeConstraint.forEachChildren {
|
typeConstraint.forEachChildren {
|
||||||
when (it.tokenType) {
|
when (it.tokenType) {
|
||||||
//annotations will be saved later, on mapping stage with type parameters
|
ANNOTATION_ENTRY -> annotations += convertAnnotationEntry(it, diagnostic = diagnostic)
|
||||||
ANNOTATION, ANNOTATION_ENTRY -> annotations += convertAnnotation(it)
|
|
||||||
REFERENCE_EXPRESSION -> {
|
REFERENCE_EXPRESSION -> {
|
||||||
identifier = it.asText
|
identifier = it.asText
|
||||||
referenceExpression = it
|
referenceExpression = it
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import com.intellij.psi.PsiElement
|
|||||||
import com.intellij.psi.tree.IElementType
|
import com.intellij.psi.tree.IElementType
|
||||||
import org.jetbrains.kotlin.*
|
import org.jetbrains.kotlin.*
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames.BACKING_FIELD
|
import org.jetbrains.kotlin.builtins.StandardNames.BACKING_FIELD
|
||||||
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
@@ -702,9 +703,29 @@ open class RawFirBuilder(
|
|||||||
val owner = parameter.getStrictParentOfType<KtTypeParameterListOwner>() ?: return@buildTypeParameter
|
val owner = parameter.getStrictParentOfType<KtTypeParameterListOwner>() ?: return@buildTypeParameter
|
||||||
for (typeConstraint in owner.typeConstraints) {
|
for (typeConstraint in owner.typeConstraints) {
|
||||||
val subjectName = typeConstraint.subjectTypeParameterName?.getReferencedNameAsName()
|
val subjectName = typeConstraint.subjectTypeParameterName?.getReferencedNameAsName()
|
||||||
|
|
||||||
if (subjectName == parameterName) {
|
if (subjectName == parameterName) {
|
||||||
bounds += typeConstraint.boundTypeReference.toFirOrErrorType()
|
bounds += typeConstraint.boundTypeReference.toFirOrErrorType()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (entry in typeConstraint.annotationEntries) {
|
||||||
|
annotations += buildErrorAnnotationCall {
|
||||||
|
source = entry.toFirSourceElement()
|
||||||
|
useSiteTarget = entry.useSiteTarget?.getAnnotationUseSiteTarget()
|
||||||
|
annotationTypeRef = entry.typeReference.toFirOrErrorType()
|
||||||
|
diagnostic = ConeSimpleDiagnostic(
|
||||||
|
"Type parameter annotations are not allowed inside where clauses", DiagnosticKind.AnnotationNotAllowed,
|
||||||
|
)
|
||||||
|
val name = (annotationTypeRef as? FirUserTypeRef)?.qualifier?.last()?.name
|
||||||
|
?: Name.special("<no-annotation-name>")
|
||||||
|
calleeReference = buildSimpleNamedReference {
|
||||||
|
source = (entry.typeReference?.typeElement as? KtUserType)?.referenceExpression?.toFirSourceElement()
|
||||||
|
this.name = name
|
||||||
|
}
|
||||||
|
entry.extractArgumentsTo(this)
|
||||||
|
typeArguments.appendTypeArguments(entry.typeArguments)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
addDefaultBoundIfNecessary()
|
addDefaultBoundIfNecessary()
|
||||||
}
|
}
|
||||||
|
|||||||
+4
@@ -219,6 +219,10 @@ open class FirBodyResolveTransformer(
|
|||||||
return expressionsTransformer.transformAnnotationCall(annotationCall, data)
|
return expressionsTransformer.transformAnnotationCall(annotationCall, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun transformErrorAnnotationCall(errorAnnotationCall: FirErrorAnnotationCall, data: ResolutionMode): FirStatement {
|
||||||
|
return transformAnnotationCall(errorAnnotationCall, data)
|
||||||
|
}
|
||||||
|
|
||||||
override fun transformDelegatedConstructorCall(
|
override fun transformDelegatedConstructorCall(
|
||||||
delegatedConstructorCall: FirDelegatedConstructorCall,
|
delegatedConstructorCall: FirDelegatedConstructorCall,
|
||||||
data: ResolutionMode
|
data: ResolutionMode
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* 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.fir.expressions
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.KtSourceElement
|
||||||
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||||
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
|
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirReference
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
abstract class FirErrorAnnotationCall : FirAnnotationCall(), FirDiagnosticHolder {
|
||||||
|
abstract override val source: KtSourceElement?
|
||||||
|
abstract override val typeRef: FirTypeRef
|
||||||
|
abstract override val annotations: List<FirAnnotation>
|
||||||
|
abstract override val useSiteTarget: AnnotationUseSiteTarget?
|
||||||
|
abstract override val annotationTypeRef: FirTypeRef
|
||||||
|
abstract override val typeArguments: List<FirTypeProjection>
|
||||||
|
abstract override val argumentList: FirArgumentList
|
||||||
|
abstract override val calleeReference: FirReference
|
||||||
|
abstract override val diagnostic: ConeDiagnostic
|
||||||
|
abstract override val argumentMapping: FirAnnotationArgumentMapping
|
||||||
|
|
||||||
|
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitErrorAnnotationCall(this, data)
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
override fun <E: FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
|
||||||
|
transformer.transformErrorAnnotationCall(this, data) as E
|
||||||
|
|
||||||
|
abstract override fun replaceTypeRef(newTypeRef: FirTypeRef)
|
||||||
|
|
||||||
|
abstract override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>)
|
||||||
|
|
||||||
|
abstract override fun replaceArgumentList(newArgumentList: FirArgumentList)
|
||||||
|
|
||||||
|
abstract override fun replaceCalleeReference(newCalleeReference: FirReference)
|
||||||
|
|
||||||
|
abstract override fun replaceArgumentMapping(newArgumentMapping: FirAnnotationArgumentMapping)
|
||||||
|
|
||||||
|
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirErrorAnnotationCall
|
||||||
|
|
||||||
|
abstract override fun <D> transformAnnotationTypeRef(transformer: FirTransformer<D>, data: D): FirErrorAnnotationCall
|
||||||
|
|
||||||
|
abstract override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirErrorAnnotationCall
|
||||||
|
|
||||||
|
abstract override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirErrorAnnotationCall
|
||||||
|
}
|
||||||
+78
@@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@file:Suppress("DuplicatedCode")
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.expressions.builder
|
||||||
|
|
||||||
|
import kotlin.contracts.*
|
||||||
|
import org.jetbrains.kotlin.KtSourceElement
|
||||||
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirEmptyArgumentList
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirErrorAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.builder.FirCallBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.builder.FirExpressionBuilder
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyAnnotationArgumentMapping
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.impl.FirErrorAnnotationCallImpl
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirReference
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
@FirBuilderDsl
|
||||||
|
class FirErrorAnnotationCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder, FirExpressionBuilder {
|
||||||
|
override var source: KtSourceElement? = null
|
||||||
|
var useSiteTarget: AnnotationUseSiteTarget? = null
|
||||||
|
var annotationTypeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
|
||||||
|
val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
|
||||||
|
override var argumentList: FirArgumentList = FirEmptyArgumentList
|
||||||
|
lateinit var calleeReference: FirReference
|
||||||
|
lateinit var diagnostic: ConeDiagnostic
|
||||||
|
var argumentMapping: FirAnnotationArgumentMapping = FirEmptyAnnotationArgumentMapping
|
||||||
|
|
||||||
|
override fun build(): FirErrorAnnotationCall {
|
||||||
|
return FirErrorAnnotationCallImpl(
|
||||||
|
source,
|
||||||
|
useSiteTarget,
|
||||||
|
annotationTypeRef,
|
||||||
|
typeArguments,
|
||||||
|
argumentList,
|
||||||
|
calleeReference,
|
||||||
|
diagnostic,
|
||||||
|
argumentMapping,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Deprecated("Modification of 'typeRef' has no impact for FirErrorAnnotationCallBuilder", level = DeprecationLevel.HIDDEN)
|
||||||
|
override var typeRef: FirTypeRef
|
||||||
|
get() = throw IllegalStateException()
|
||||||
|
set(_) {
|
||||||
|
throw IllegalStateException()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated("Modification of 'annotations' has no impact for FirErrorAnnotationCallBuilder", level = DeprecationLevel.HIDDEN)
|
||||||
|
override val annotations: MutableList<FirAnnotation> = mutableListOf()
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalContracts::class)
|
||||||
|
inline fun buildErrorAnnotationCall(init: FirErrorAnnotationCallBuilder.() -> Unit): FirErrorAnnotationCall {
|
||||||
|
contract {
|
||||||
|
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
return FirErrorAnnotationCallBuilder().apply(init).build()
|
||||||
|
}
|
||||||
+92
@@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@file:Suppress("DuplicatedCode")
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir.expressions.impl
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.KtSourceElement
|
||||||
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||||
|
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirErrorAnnotationCall
|
||||||
|
import org.jetbrains.kotlin.fir.references.FirReference
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
||||||
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
|
import org.jetbrains.kotlin.fir.visitors.*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was generated automatically
|
||||||
|
* DO NOT MODIFY IT MANUALLY
|
||||||
|
*/
|
||||||
|
|
||||||
|
internal class FirErrorAnnotationCallImpl(
|
||||||
|
override val source: KtSourceElement?,
|
||||||
|
override val useSiteTarget: AnnotationUseSiteTarget?,
|
||||||
|
override var annotationTypeRef: FirTypeRef,
|
||||||
|
override val typeArguments: MutableList<FirTypeProjection>,
|
||||||
|
override var argumentList: FirArgumentList,
|
||||||
|
override var calleeReference: FirReference,
|
||||||
|
override val diagnostic: ConeDiagnostic,
|
||||||
|
override var argumentMapping: FirAnnotationArgumentMapping,
|
||||||
|
) : FirErrorAnnotationCall() {
|
||||||
|
override val typeRef: FirTypeRef get() = annotationTypeRef
|
||||||
|
override val annotations: List<FirAnnotation> get() = emptyList()
|
||||||
|
|
||||||
|
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
||||||
|
annotationTypeRef.accept(visitor, data)
|
||||||
|
typeArguments.forEach { it.accept(visitor, data) }
|
||||||
|
argumentList.accept(visitor, data)
|
||||||
|
calleeReference.accept(visitor, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirErrorAnnotationCallImpl {
|
||||||
|
transformAnnotationTypeRef(transformer, data)
|
||||||
|
transformTypeArguments(transformer, data)
|
||||||
|
argumentList = argumentList.transform(transformer, data)
|
||||||
|
transformCalleeReference(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirErrorAnnotationCallImpl {
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformAnnotationTypeRef(transformer: FirTransformer<D>, data: D): FirErrorAnnotationCallImpl {
|
||||||
|
annotationTypeRef = annotationTypeRef.transform(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformTypeArguments(transformer: FirTransformer<D>, data: D): FirErrorAnnotationCallImpl {
|
||||||
|
typeArguments.transformInplace(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirErrorAnnotationCallImpl {
|
||||||
|
calleeReference = calleeReference.transform(transformer, data)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceTypeRef(newTypeRef: FirTypeRef) {}
|
||||||
|
|
||||||
|
override fun replaceTypeArguments(newTypeArguments: List<FirTypeProjection>) {
|
||||||
|
typeArguments.clear()
|
||||||
|
typeArguments.addAll(newTypeArguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceArgumentList(newArgumentList: FirArgumentList) {
|
||||||
|
argumentList = newArgumentList
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceCalleeReference(newCalleeReference: FirReference) {
|
||||||
|
calleeReference = newCalleeReference
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun replaceArgumentMapping(newArgumentMapping: FirAnnotationArgumentMapping) {
|
||||||
|
argumentMapping = newArgumentMapping
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -73,6 +73,7 @@ import org.jetbrains.kotlin.fir.expressions.FirCall
|
|||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirErrorAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression
|
import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall
|
import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAssignmentOperatorStatement
|
import org.jetbrains.kotlin.fir.expressions.FirAssignmentOperatorStatement
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ import org.jetbrains.kotlin.fir.expressions.FirCall
|
|||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirErrorAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression
|
import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall
|
import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAssignmentOperatorStatement
|
import org.jetbrains.kotlin.fir.expressions.FirAssignmentOperatorStatement
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ import org.jetbrains.kotlin.fir.expressions.FirCall
|
|||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirErrorAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression
|
import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall
|
import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAssignmentOperatorStatement
|
import org.jetbrains.kotlin.fir.expressions.FirAssignmentOperatorStatement
|
||||||
@@ -417,6 +418,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
|
|||||||
return transformElement(annotationArgumentMapping, data)
|
return transformElement(annotationArgumentMapping, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open fun transformErrorAnnotationCall(errorAnnotationCall: FirErrorAnnotationCall, data: D): FirStatement {
|
||||||
|
return transformElement(errorAnnotationCall, data)
|
||||||
|
}
|
||||||
|
|
||||||
open fun transformComparisonExpression(comparisonExpression: FirComparisonExpression, data: D): FirStatement {
|
open fun transformComparisonExpression(comparisonExpression: FirComparisonExpression, data: D): FirStatement {
|
||||||
return transformElement(comparisonExpression, data)
|
return transformElement(comparisonExpression, data)
|
||||||
}
|
}
|
||||||
@@ -953,6 +958,10 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
|
|||||||
return transformAnnotationArgumentMapping(annotationArgumentMapping, data)
|
return transformAnnotationArgumentMapping(annotationArgumentMapping, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final override fun visitErrorAnnotationCall(errorAnnotationCall: FirErrorAnnotationCall, data: D): FirStatement {
|
||||||
|
return transformErrorAnnotationCall(errorAnnotationCall, data)
|
||||||
|
}
|
||||||
|
|
||||||
final override fun visitComparisonExpression(comparisonExpression: FirComparisonExpression, data: D): FirStatement {
|
final override fun visitComparisonExpression(comparisonExpression: FirComparisonExpression, data: D): FirStatement {
|
||||||
return transformComparisonExpression(comparisonExpression, data)
|
return transformComparisonExpression(comparisonExpression, data)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ import org.jetbrains.kotlin.fir.expressions.FirCall
|
|||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirErrorAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression
|
import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall
|
import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAssignmentOperatorStatement
|
import org.jetbrains.kotlin.fir.expressions.FirAssignmentOperatorStatement
|
||||||
@@ -282,6 +283,8 @@ abstract class FirVisitor<out R, in D> {
|
|||||||
|
|
||||||
open fun visitAnnotationArgumentMapping(annotationArgumentMapping: FirAnnotationArgumentMapping, data: D): R = visitElement(annotationArgumentMapping, data)
|
open fun visitAnnotationArgumentMapping(annotationArgumentMapping: FirAnnotationArgumentMapping, data: D): R = visitElement(annotationArgumentMapping, data)
|
||||||
|
|
||||||
|
open fun visitErrorAnnotationCall(errorAnnotationCall: FirErrorAnnotationCall, data: D): R = visitElement(errorAnnotationCall, data)
|
||||||
|
|
||||||
open fun visitComparisonExpression(comparisonExpression: FirComparisonExpression, data: D): R = visitElement(comparisonExpression, data)
|
open fun visitComparisonExpression(comparisonExpression: FirComparisonExpression, data: D): R = visitElement(comparisonExpression, data)
|
||||||
|
|
||||||
open fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: D): R = visitElement(typeOperatorCall, data)
|
open fun visitTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: D): R = visitElement(typeOperatorCall, data)
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ import org.jetbrains.kotlin.fir.expressions.FirCall
|
|||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationArgumentMapping
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirErrorAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression
|
import org.jetbrains.kotlin.fir.expressions.FirComparisonExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall
|
import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAssignmentOperatorStatement
|
import org.jetbrains.kotlin.fir.expressions.FirAssignmentOperatorStatement
|
||||||
@@ -416,6 +417,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
|
|||||||
visitElement(annotationArgumentMapping)
|
visitElement(annotationArgumentMapping)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open fun visitErrorAnnotationCall(errorAnnotationCall: FirErrorAnnotationCall) {
|
||||||
|
visitElement(errorAnnotationCall)
|
||||||
|
}
|
||||||
|
|
||||||
open fun visitComparisonExpression(comparisonExpression: FirComparisonExpression) {
|
open fun visitComparisonExpression(comparisonExpression: FirComparisonExpression) {
|
||||||
visitElement(comparisonExpression)
|
visitElement(comparisonExpression)
|
||||||
}
|
}
|
||||||
@@ -952,6 +957,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
|
|||||||
visitAnnotationArgumentMapping(annotationArgumentMapping)
|
visitAnnotationArgumentMapping(annotationArgumentMapping)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final override fun visitErrorAnnotationCall(errorAnnotationCall: FirErrorAnnotationCall, data: Nothing?) {
|
||||||
|
visitErrorAnnotationCall(errorAnnotationCall)
|
||||||
|
}
|
||||||
|
|
||||||
final override fun visitComparisonExpression(comparisonExpression: FirComparisonExpression, data: Nothing?) {
|
final override fun visitComparisonExpression(comparisonExpression: FirComparisonExpression, data: Nothing?) {
|
||||||
visitComparisonExpression(comparisonExpression)
|
visitComparisonExpression(comparisonExpression)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ enum class DiagnosticKind {
|
|||||||
MissingStdlibClass,
|
MissingStdlibClass,
|
||||||
NotASupertype,
|
NotASupertype,
|
||||||
SuperNotAvailable,
|
SuperNotAvailable,
|
||||||
|
AnnotationNotAllowed,
|
||||||
|
|
||||||
LoopInSupertype,
|
LoopInSupertype,
|
||||||
RecursiveTypealiasExpansion,
|
RecursiveTypealiasExpansion,
|
||||||
|
|||||||
+8
@@ -122,6 +122,14 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
|
|||||||
useTypes(emptyArgumentListType, emptyAnnotationArgumentMappingType, implicitTypeRefType)
|
useTypes(emptyArgumentListType, emptyAnnotationArgumentMappingType, implicitTypeRefType)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
builder(errorAnnotationCall) {
|
||||||
|
parents += callBuilder
|
||||||
|
default("argumentList", "FirEmptyArgumentList")
|
||||||
|
default("argumentMapping", "FirEmptyAnnotationArgumentMapping")
|
||||||
|
default("annotationTypeRef", "FirImplicitTypeRefImpl(null)")
|
||||||
|
useTypes(emptyArgumentListType, emptyAnnotationArgumentMappingType, implicitTypeRefType)
|
||||||
|
}
|
||||||
|
|
||||||
builder(arrayOfCall) {
|
builder(arrayOfCall) {
|
||||||
parents += callBuilder
|
parents += callBuilder
|
||||||
}
|
}
|
||||||
|
|||||||
+1
@@ -94,6 +94,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
|
|||||||
val annotation by element(Expression, expression)
|
val annotation by element(Expression, expression)
|
||||||
val annotationCall by element(Expression, annotation, call, resolvable)
|
val annotationCall by element(Expression, annotation, call, resolvable)
|
||||||
val annotationArgumentMapping by element(Expression)
|
val annotationArgumentMapping by element(Expression)
|
||||||
|
val errorAnnotationCall by element(Expression, annotationCall, diagnosticHolder)
|
||||||
val comparisonExpression by element(Expression, expression)
|
val comparisonExpression by element(Expression, expression)
|
||||||
val typeOperatorCall by element(Expression, expression, call)
|
val typeOperatorCall by element(Expression, expression, call)
|
||||||
val assignmentOperatorStatement by element(Expression, statement)
|
val assignmentOperatorStatement by element(Expression, statement)
|
||||||
|
|||||||
+7
@@ -96,6 +96,13 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl(errorAnnotationCall) {
|
||||||
|
commonAnnotationConfig()
|
||||||
|
default("argumentMapping") {
|
||||||
|
needAcceptAndTransform = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl(arrayOfCall)
|
impl(arrayOfCall)
|
||||||
|
|
||||||
impl(callableReferenceAccess)
|
impl(callableReferenceAccess)
|
||||||
|
|||||||
+4
@@ -469,6 +469,10 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
|
|||||||
+field("argumentMapping", annotationArgumentMapping, withReplace = true)
|
+field("argumentMapping", annotationArgumentMapping, withReplace = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
errorAnnotationCall.configure {
|
||||||
|
+field("argumentMapping", annotationArgumentMapping, withReplace = true)
|
||||||
|
}
|
||||||
|
|
||||||
annotationArgumentMapping.configure {
|
annotationArgumentMapping.configure {
|
||||||
+field("mapping", type("Map") to listOf(nameType, expression))
|
+field("mapping", type("Map") to listOf(nameType, expression))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -343,6 +343,8 @@ public interface Errors {
|
|||||||
|
|
||||||
DiagnosticFactory0<PsiElement> NON_PARENTHESIZED_ANNOTATIONS_ON_FUNCTIONAL_TYPES = DiagnosticFactory0.create(ERROR);
|
DiagnosticFactory0<PsiElement> NON_PARENTHESIZED_ANNOTATIONS_ON_FUNCTIONAL_TYPES = DiagnosticFactory0.create(ERROR);
|
||||||
|
|
||||||
|
DiagnosticFactory0<KtAnnotationEntry> ANNOTATION_IN_WHERE_CLAUSE_WARNING = DiagnosticFactory0.create(WARNING);
|
||||||
|
|
||||||
// Const
|
// Const
|
||||||
DiagnosticFactory0<PsiElement> CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT = DiagnosticFactory0.create(ERROR);
|
DiagnosticFactory0<PsiElement> CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT = DiagnosticFactory0.create(ERROR);
|
||||||
DiagnosticFactory0<PsiElement> CONST_VAL_WITH_GETTER = DiagnosticFactory0.create(ERROR);
|
DiagnosticFactory0<PsiElement> CONST_VAL_WITH_GETTER = DiagnosticFactory0.create(ERROR);
|
||||||
|
|||||||
+2
@@ -187,6 +187,8 @@ public class DefaultErrorMessages {
|
|||||||
|
|
||||||
MAP.put(NON_PARENTHESIZED_ANNOTATIONS_ON_FUNCTIONAL_TYPES, "Non-parenthesized annotations on function types without receiver aren't yet supported (see KT-31734 for details)");
|
MAP.put(NON_PARENTHESIZED_ANNOTATIONS_ON_FUNCTIONAL_TYPES, "Non-parenthesized annotations on function types without receiver aren't yet supported (see KT-31734 for details)");
|
||||||
|
|
||||||
|
MAP.put(ANNOTATION_IN_WHERE_CLAUSE_WARNING, "Type parameter annotations will not be allowed inside where clauses in future releases. You should probably move annotations to the type parameter declaration");
|
||||||
|
|
||||||
MAP.put(REDUNDANT_MODIFIER, "Modifier ''{0}'' is redundant because ''{1}'' is present", TO_STRING, TO_STRING);
|
MAP.put(REDUNDANT_MODIFIER, "Modifier ''{0}'' is redundant because ''{1}'' is present", TO_STRING, TO_STRING);
|
||||||
MAP.put(REDUNDANT_OPEN_IN_INTERFACE, "Modifier 'open' is redundant for abstract interface members");
|
MAP.put(REDUNDANT_OPEN_IN_INTERFACE, "Modifier 'open' is redundant for abstract interface members");
|
||||||
MAP.put(REDUNDANT_MODIFIER_IN_GETTER, "Visibility modifiers are redundant in getter");
|
MAP.put(REDUNDANT_MODIFIER_IN_GETTER, "Visibility modifiers are redundant in getter");
|
||||||
|
|||||||
@@ -537,6 +537,12 @@ class DeclarationsChecker(
|
|||||||
checkSupertypesForConsistency(typeParameterDescriptor, typeParameter)
|
checkSupertypesForConsistency(typeParameterDescriptor, typeParameter)
|
||||||
checkOnlyOneTypeParameterBound(typeParameterDescriptor, typeParameter, typeParameterListOwner)
|
checkOnlyOneTypeParameterBound(typeParameterDescriptor, typeParameter, typeParameterListOwner)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (constraint in constraints) {
|
||||||
|
constraint.annotationEntries.forEach {
|
||||||
|
trace.report(ANNOTATION_IN_WHERE_CLAUSE_WARNING.on(it))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkConstructorInInterface(klass: KtClass) {
|
private fun checkConstructorInInterface(klass: KtClass) {
|
||||||
|
|||||||
@@ -19,10 +19,15 @@ package org.jetbrains.kotlin.psi;
|
|||||||
import com.intellij.lang.ASTNode;
|
import com.intellij.lang.ASTNode;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.kotlin.KtNodeTypes;
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.KtPsiUtilKt;
|
||||||
import org.jetbrains.kotlin.psi.stubs.KotlinPlaceHolderStub;
|
import org.jetbrains.kotlin.psi.stubs.KotlinPlaceHolderStub;
|
||||||
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes;
|
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes;
|
||||||
|
|
||||||
public class KtTypeConstraint extends KtElementImplStub<KotlinPlaceHolderStub<KtTypeConstraint>> {
|
import java.util.List;
|
||||||
|
|
||||||
|
public class KtTypeConstraint extends KtElementImplStub<KotlinPlaceHolderStub<KtTypeConstraint>>
|
||||||
|
implements KtAnnotated, KtAnnotationsContainer {
|
||||||
public KtTypeConstraint(@NotNull ASTNode node) {
|
public KtTypeConstraint(@NotNull ASTNode node) {
|
||||||
super(node);
|
super(node);
|
||||||
}
|
}
|
||||||
@@ -45,4 +50,16 @@ public class KtTypeConstraint extends KtElementImplStub<KotlinPlaceHolderStub<Kt
|
|||||||
public KtTypeReference getBoundTypeReference() {
|
public KtTypeReference getBoundTypeReference() {
|
||||||
return getStubOrPsiChild(KtStubElementTypes.TYPE_REFERENCE);
|
return getStubOrPsiChild(KtStubElementTypes.TYPE_REFERENCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NotNull
|
||||||
|
public List<KtAnnotation> getAnnotations() {
|
||||||
|
return findChildrenByType(KtNodeTypes.ANNOTATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NotNull
|
||||||
|
public List<KtAnnotationEntry> getAnnotationEntries() {
|
||||||
|
return KtPsiUtilKt.collectAnnotationEntriesFromStubOrPsi(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
@Repeatable
|
||||||
|
@Target( AnnotationTarget.TYPE_PARAMETER)
|
||||||
|
annotation class TypeParameterAnn(val name: String)
|
||||||
|
|
||||||
|
interface Generic<Z>
|
||||||
|
|
||||||
|
fun <<!MISPLACED_TYPE_PARAMETER_CONSTRAINTS!>@TypeParameterAnn("T") T: Any<!>> whereClauseWithAnnotation() where <!ANNOTATION_IN_WHERE_CLAUSE_ERROR!>@TypeParameterAnn("Prohibit me!!!")<!> T : Generic<String> {
|
||||||
|
}
|
||||||
|
|
||||||
|
class Foo<<!MISPLACED_TYPE_PARAMETER_CONSTRAINTS!>@TypeParameterAnn("T") T: Any<!>> () where <!ANNOTATION_IN_WHERE_CLAUSE_ERROR!>@TypeParameterAnn("Prohibit me!!!")<!> T : Generic<String> {
|
||||||
|
}
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
@Repeatable
|
||||||
|
@Target( AnnotationTarget.TYPE_PARAMETER)
|
||||||
|
annotation class TypeParameterAnn(val name: String)
|
||||||
|
|
||||||
|
interface Generic<Z>
|
||||||
|
|
||||||
|
fun <<!MISPLACED_TYPE_PARAMETER_CONSTRAINTS!>@TypeParameterAnn("T") T: Any<!>> whereClauseWithAnnotation() where <!ANNOTATION_IN_WHERE_CLAUSE_WARNING!>@<!DEBUG_INFO_MISSING_UNRESOLVED!>TypeParameterAnn<!>("Prohibit me!!!")<!> T : Generic<String> {
|
||||||
|
}
|
||||||
|
|
||||||
|
class Foo<<!MISPLACED_TYPE_PARAMETER_CONSTRAINTS!>@TypeParameterAnn("T") T: Any<!>> () where <!ANNOTATION_IN_WHERE_CLAUSE_WARNING!>@<!DEBUG_INFO_MISSING_UNRESOLVED!>TypeParameterAnn<!>("Prohibit me!!!")<!> T : Generic<String> {
|
||||||
|
}
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun </*0*/ @TypeParameterAnn(name = "T") T : kotlin.Any> whereClauseWithAnnotation(): kotlin.Unit where T : Generic<kotlin.String>
|
||||||
|
|
||||||
|
public final class Foo</*0*/ @TypeParameterAnn(name = "T") T : kotlin.Any> where T : Generic<kotlin.String> {
|
||||||
|
public constructor Foo</*0*/ @TypeParameterAnn(name = "T") T : kotlin.Any>() where T : Generic<kotlin.String>
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface Generic</*0*/ Z> {
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
@kotlin.annotation.Repeatable @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE_PARAMETER}) public final annotation class TypeParameterAnn : kotlin.Annotation {
|
||||||
|
public constructor TypeParameterAnn(/*0*/ name: kotlin.String)
|
||||||
|
public final val name: kotlin.String
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
Generated
+6
@@ -423,6 +423,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/kt435.kt");
|
runTest("compiler/testData/diagnostics/tests/kt435.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt46483.kt")
|
||||||
|
public void testKt46483() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/kt46483.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt49438.kt")
|
@TestMetadata("kt49438.kt")
|
||||||
public void testKt49438() throws Exception {
|
public void testKt49438() throws Exception {
|
||||||
|
|||||||
Vendored
+1
-1
@@ -9,4 +9,4 @@ abstract class Bar<T : @Ann(<!UNRESOLVED_REFERENCE!>unresolved_reference<!>) Any
|
|||||||
* TESTCASE NUMBER: 2
|
* TESTCASE NUMBER: 2
|
||||||
* UNEXPECTED BEHAVIOUR
|
* UNEXPECTED BEHAVIOUR
|
||||||
*/
|
*/
|
||||||
class B<T> where @Ann(unresolved_reference) T : Number
|
class B<T> where <!ANNOTATION_IN_WHERE_CLAUSE_ERROR, WRONG_ANNOTATION_TARGET!>@Ann(<!UNRESOLVED_REFERENCE!>unresolved_reference<!>)<!> T : Number
|
||||||
|
|||||||
+1
-1
@@ -18,4 +18,4 @@ abstract class Bar<T : @Ann(<!UNRESOLVED_REFERENCE!>unresolved_reference<!>) Any
|
|||||||
* TESTCASE NUMBER: 2
|
* TESTCASE NUMBER: 2
|
||||||
* UNEXPECTED BEHAVIOUR
|
* UNEXPECTED BEHAVIOUR
|
||||||
*/
|
*/
|
||||||
class B<T> where @<!DEBUG_INFO_MISSING_UNRESOLVED!>Ann<!>(<!DEBUG_INFO_MISSING_UNRESOLVED!>unresolved_reference<!>) T : Number
|
class B<T> where <!ANNOTATION_IN_WHERE_CLAUSE_WARNING!>@<!DEBUG_INFO_MISSING_UNRESOLVED!>Ann<!>(<!DEBUG_INFO_MISSING_UNRESOLVED!>unresolved_reference<!>)<!> T : Number
|
||||||
|
|||||||
Reference in New Issue
Block a user