[FIR] Report deprecations in qualified expressions
This commit is contained in:
committed by
TeamCityServer
parent
98bd6f5d3e
commit
8a0941a85a
+1
@@ -121,6 +121,7 @@ object CommonExpressionCheckers : ExpressionCheckers() {
|
|||||||
get() = setOf(
|
get() = setOf(
|
||||||
FirStandaloneQualifierChecker,
|
FirStandaloneQualifierChecker,
|
||||||
FirOptInUsageQualifierChecker,
|
FirOptInUsageQualifierChecker,
|
||||||
|
FirDeprecatedQualifierChecker,
|
||||||
)
|
)
|
||||||
|
|
||||||
override val equalityOperatorCallCheckers: Set<FirEqualityOperatorCallChecker>
|
override val equalityOperatorCallCheckers: Set<FirEqualityOperatorCallChecker>
|
||||||
|
|||||||
+10
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.collectEnumEntries
|
import org.jetbrains.kotlin.fir.analysis.checkers.collectEnumEntries
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirDeprecationChecker
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.fullyExpandedClass
|
import org.jetbrains.kotlin.fir.analysis.checkers.fullyExpandedClass
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
@@ -37,6 +38,7 @@ object FirImportsChecker : FirFileChecker() {
|
|||||||
checkOperatorRename(import, context, reporter)
|
checkOperatorRename(import, context, reporter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
checkDeprecatedImport(import, context, reporter)
|
||||||
}
|
}
|
||||||
checkConflictingImports(declaration.imports, context, reporter)
|
checkConflictingImports(declaration.imports, context, reporter)
|
||||||
}
|
}
|
||||||
@@ -175,4 +177,12 @@ object FirImportsChecker : FirFileChecker() {
|
|||||||
|
|
||||||
return hasStatic || !hasIllegal
|
return hasStatic || !hasIllegal
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun checkDeprecatedImport(import: FirImport, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
|
val importedFqName = import.importedFqName ?: return
|
||||||
|
if (importedFqName.isRoot || importedFqName.shortName().asString().isEmpty()) return
|
||||||
|
val classId = (import as? FirResolvedImport)?.resolvedClassId ?: ClassId.topLevel(importedFqName)
|
||||||
|
val classLike: FirRegularClassSymbol = classId.resolveToClass(context) ?: return
|
||||||
|
FirDeprecationChecker.reportDeprecationIfNeeded(import.source, classLike, null, context, reporter)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* 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.fir.analysis.checkers.expression
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeDeprecated
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||||
|
|
||||||
|
object FirDeprecatedQualifierChecker : FirResolvedQualifierChecker() {
|
||||||
|
override fun check(expression: FirResolvedQualifier, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
|
expression.nonFatalDiagnostics.filterIsInstance<ConeDeprecated>().forEach { diagnostic ->
|
||||||
|
FirDeprecationChecker.reportDeprecation(diagnostic.source, diagnostic.symbol, diagnostic.deprecation, reporter, context)
|
||||||
|
}
|
||||||
|
if (expression.resolvedToCompanionObject) {
|
||||||
|
val companionSymbol = (expression.symbol as? FirRegularClassSymbol)?.companionObjectSymbol ?: return
|
||||||
|
FirDeprecationChecker.reportDeprecationIfNeeded(expression.source, companionSymbol, null, context, reporter)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+11
-3
@@ -17,9 +17,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
|
|||||||
import org.jetbrains.kotlin.fir.declarations.Deprecation
|
import org.jetbrains.kotlin.fir.declarations.Deprecation
|
||||||
import org.jetbrains.kotlin.fir.declarations.DeprecationLevelValue
|
import org.jetbrains.kotlin.fir.declarations.DeprecationLevelValue
|
||||||
import org.jetbrains.kotlin.fir.declarations.getDeprecation
|
import org.jetbrains.kotlin.fir.declarations.getDeprecation
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirResolvable
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
|
||||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||||
@@ -50,6 +48,16 @@ object FirDeprecationChecker : FirBasicExpressionChecker() {
|
|||||||
reporter: DiagnosticReporter
|
reporter: DiagnosticReporter
|
||||||
) {
|
) {
|
||||||
val deprecation = getWorstDeprecation(callSite, referencedSymbol, context) ?: return
|
val deprecation = getWorstDeprecation(callSite, referencedSymbol, context) ?: return
|
||||||
|
reportDeprecation(source, referencedSymbol, deprecation, reporter, context)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun reportDeprecation(
|
||||||
|
source: FirSourceElement?,
|
||||||
|
referencedSymbol: FirBasedSymbol<*>,
|
||||||
|
deprecation: Deprecation,
|
||||||
|
reporter: DiagnosticReporter,
|
||||||
|
context: CheckerContext
|
||||||
|
) {
|
||||||
val diagnostic = when (deprecation.level) {
|
val diagnostic = when (deprecation.level) {
|
||||||
DeprecationLevelValue.ERROR, DeprecationLevelValue.HIDDEN -> FirErrors.DEPRECATION_ERROR
|
DeprecationLevelValue.ERROR, DeprecationLevelValue.HIDDEN -> FirErrors.DEPRECATION_ERROR
|
||||||
DeprecationLevelValue.WARNING -> FirErrors.DEPRECATION
|
DeprecationLevelValue.WARNING -> FirErrors.DEPRECATION
|
||||||
|
|||||||
+36
-30
@@ -527,36 +527,42 @@ object LightTreePositioningStrategies {
|
|||||||
endOffset: Int,
|
endOffset: Int,
|
||||||
tree: FlyweightCapableTreeStructure<LighterASTNode>
|
tree: FlyweightCapableTreeStructure<LighterASTNode>
|
||||||
): List<TextRange> {
|
): List<TextRange> {
|
||||||
if (node.tokenType == KtNodeTypes.CALL_EXPRESSION || node.tokenType == KtNodeTypes.CONSTRUCTOR_DELEGATION_CALL) {
|
when {
|
||||||
return markElement(tree.referenceExpression(node, locateReferencedName) ?: node, startOffset, endOffset, tree, node)
|
node.tokenType == KtNodeTypes.CALL_EXPRESSION || node.tokenType == KtNodeTypes.CONSTRUCTOR_DELEGATION_CALL -> {
|
||||||
}
|
return markElement(tree.referenceExpression(node, locateReferencedName) ?: node, startOffset, endOffset, tree, node)
|
||||||
if (node.tokenType == KtNodeTypes.PROPERTY_DELEGATE) {
|
}
|
||||||
return markElement(tree.findExpressionDeep(node) ?: node, startOffset, endOffset, tree, node)
|
node.tokenType == KtNodeTypes.PROPERTY_DELEGATE -> {
|
||||||
}
|
return markElement(tree.findExpressionDeep(node) ?: node, startOffset, endOffset, tree, node)
|
||||||
if (node.tokenType == KtNodeTypes.ANNOTATION_ENTRY) {
|
}
|
||||||
return markElement(
|
node.tokenType == KtNodeTypes.ANNOTATION_ENTRY -> {
|
||||||
tree.findDescendantByType(node, KtNodeTypes.CONSTRUCTOR_CALLEE) ?: node,
|
return markElement(
|
||||||
startOffset,
|
tree.findDescendantByType(node, KtNodeTypes.CONSTRUCTOR_CALLEE) ?: node,
|
||||||
endOffset,
|
startOffset,
|
||||||
tree,
|
endOffset,
|
||||||
node
|
tree,
|
||||||
)
|
node
|
||||||
}
|
)
|
||||||
if (node.tokenType in nodeTypesWithOperation) {
|
}
|
||||||
return markElement(tree.operationReference(node) ?: node, startOffset, endOffset, tree, node)
|
node.tokenType in nodeTypesWithOperation -> {
|
||||||
}
|
return markElement(tree.operationReference(node) ?: node, startOffset, endOffset, tree, node)
|
||||||
if (node.tokenType == KtNodeTypes.TYPE_REFERENCE) {
|
}
|
||||||
val nodeToMark =
|
node.tokenType == KtNodeTypes.TYPE_REFERENCE -> {
|
||||||
tree.findChildByType(node, KtNodeTypes.NULLABLE_TYPE)
|
val nodeToMark =
|
||||||
?.let { tree.findChildByType(it, KtNodeTypes.USER_TYPE) }
|
tree.findChildByType(node, KtNodeTypes.NULLABLE_TYPE)
|
||||||
?: node
|
?.let { tree.findChildByType(it, KtNodeTypes.USER_TYPE) }
|
||||||
return markElement(nodeToMark, startOffset, endOffset, tree, node)
|
?: node
|
||||||
}
|
return markElement(nodeToMark, startOffset, endOffset, tree, node)
|
||||||
if (node.tokenType != KtNodeTypes.DOT_QUALIFIED_EXPRESSION &&
|
}
|
||||||
node.tokenType != KtNodeTypes.SAFE_ACCESS_EXPRESSION &&
|
node.tokenType == KtNodeTypes.IMPORT_DIRECTIVE -> {
|
||||||
node.tokenType != KtNodeTypes.CALLABLE_REFERENCE_EXPRESSION
|
val nodeToMark = tree.findChildByType(node, KtStubElementTypes.INSIDE_DIRECTIVE_EXPRESSIONS) ?: node
|
||||||
) {
|
return markElement(nodeToMark, startOffset, endOffset, tree, node)
|
||||||
return super.mark(node, startOffset, endOffset, tree)
|
}
|
||||||
|
node.tokenType != KtNodeTypes.DOT_QUALIFIED_EXPRESSION &&
|
||||||
|
node.tokenType != KtNodeTypes.SAFE_ACCESS_EXPRESSION &&
|
||||||
|
node.tokenType != KtNodeTypes.CALLABLE_REFERENCE_EXPRESSION
|
||||||
|
-> {
|
||||||
|
return super.mark(node, startOffset, endOffset, tree)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
val selector = tree.selector(node)
|
val selector = tree.selector(node)
|
||||||
if (selector != null) {
|
if (selector != null) {
|
||||||
|
|||||||
@@ -254,7 +254,12 @@ class FirCallResolver(
|
|||||||
referencedSymbol,
|
referencedSymbol,
|
||||||
nameReference.source,
|
nameReference.source,
|
||||||
qualifiedAccess.typeArguments,
|
qualifiedAccess.typeArguments,
|
||||||
diagnostic
|
diagnostic,
|
||||||
|
nonFatalDiagnostics = extractNonFatalDiagnostics(
|
||||||
|
nameReference.source,
|
||||||
|
qualifiedAccess.explicitReceiver,
|
||||||
|
referencedSymbol
|
||||||
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
referencedSymbol is FirTypeParameterSymbol && referencedSymbol.fir.isReified -> {
|
referencedSymbol is FirTypeParameterSymbol && referencedSymbol.fir.isReified -> {
|
||||||
@@ -276,6 +281,17 @@ class FirCallResolver(
|
|||||||
return resultExpression
|
return resultExpression
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun extractNonFatalDiagnostics(
|
||||||
|
source: FirSourceElement?,
|
||||||
|
explicitReceiver: FirExpression?,
|
||||||
|
symbol: FirClassLikeSymbol<*>
|
||||||
|
): List<ConeDiagnostic> {
|
||||||
|
val prevDiagnostics = (explicitReceiver as? FirResolvedQualifier)?.nonFatalDiagnostics ?: emptyList()
|
||||||
|
return symbol.fir.deprecation?.forUseSite()?.let {
|
||||||
|
prevDiagnostics + ConeDeprecated(source, symbol, it)
|
||||||
|
} ?: prevDiagnostics
|
||||||
|
}
|
||||||
|
|
||||||
fun resolveCallableReference(
|
fun resolveCallableReference(
|
||||||
constraintSystemBuilder: ConstraintSystemBuilder,
|
constraintSystemBuilder: ConstraintSystemBuilder,
|
||||||
resolvedCallableReferenceAtom: ResolvedCallableReferenceAtom,
|
resolvedCallableReferenceAtom: ResolvedCallableReferenceAtom,
|
||||||
|
|||||||
@@ -114,7 +114,8 @@ fun BodyResolveComponents.buildResolvedQualifierForClass(
|
|||||||
sourceElement: FirSourceElement? = null,
|
sourceElement: FirSourceElement? = null,
|
||||||
// TODO: Clarify if we actually need type arguments for qualifier?
|
// TODO: Clarify if we actually need type arguments for qualifier?
|
||||||
typeArgumentsForQualifier: List<FirTypeProjection> = emptyList(),
|
typeArgumentsForQualifier: List<FirTypeProjection> = emptyList(),
|
||||||
diagnostic: ConeDiagnostic? = null
|
diagnostic: ConeDiagnostic? = null,
|
||||||
|
nonFatalDiagnostics: List<ConeDiagnostic> = emptyList()
|
||||||
): FirResolvedQualifier {
|
): FirResolvedQualifier {
|
||||||
val classId = regularClass.classId
|
val classId = regularClass.classId
|
||||||
|
|
||||||
@@ -130,6 +131,7 @@ fun BodyResolveComponents.buildResolvedQualifierForClass(
|
|||||||
relativeClassFqName = classId.relativeClassName
|
relativeClassFqName = classId.relativeClassName
|
||||||
typeArguments.addAll(typeArgumentsForQualifier)
|
typeArguments.addAll(typeArgumentsForQualifier)
|
||||||
symbol = regularClass
|
symbol = regularClass
|
||||||
|
this.nonFatalDiagnostics.addAll(nonFatalDiagnostics)
|
||||||
}.build().apply {
|
}.build().apply {
|
||||||
resultType = if (classId.isLocal) {
|
resultType = if (classId.isLocal) {
|
||||||
typeForQualifierByDeclaration(regularClass.fir, resultType, session)
|
typeForQualifierByDeclaration(regularClass.fir, resultType, session)
|
||||||
|
|||||||
+5
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.diagnostics
|
|||||||
|
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.Deprecation
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||||
@@ -147,6 +148,10 @@ class ConeUnsupportedDynamicType() : ConeDiagnostic() {
|
|||||||
override val reason: String get() = "Dynamic types are not supported in this context"
|
override val reason: String get() = "Dynamic types are not supported in this context"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ConeDeprecated(val source: FirSourceElement?, val symbol: FirBasedSymbol<*>, val deprecation: Deprecation) : ConeDiagnostic() {
|
||||||
|
override val reason: String get() = "Deprecated: ${deprecation.message}"
|
||||||
|
}
|
||||||
|
|
||||||
private fun describeSymbol(symbol: FirBasedSymbol<*>): String {
|
private fun describeSymbol(symbol: FirBasedSymbol<*>): String {
|
||||||
return when (symbol) {
|
return when (symbol) {
|
||||||
is FirClassLikeSymbol<*> -> symbol.classId.asString()
|
is FirClassLikeSymbol<*> -> symbol.classId.asString()
|
||||||
|
|||||||
+1
@@ -31,6 +31,7 @@ abstract class FirErrorResolvedQualifier : FirResolvedQualifier(), FirDiagnostic
|
|||||||
abstract override val symbol: FirClassLikeSymbol<*>?
|
abstract override val symbol: FirClassLikeSymbol<*>?
|
||||||
abstract override val isNullableLHSForCallableReference: Boolean
|
abstract override val isNullableLHSForCallableReference: Boolean
|
||||||
abstract override val resolvedToCompanionObject: Boolean
|
abstract override val resolvedToCompanionObject: Boolean
|
||||||
|
abstract override val nonFatalDiagnostics: List<ConeDiagnostic>
|
||||||
abstract override val typeArguments: List<FirTypeProjection>
|
abstract override val typeArguments: List<FirTypeProjection>
|
||||||
abstract override val diagnostic: ConeDiagnostic
|
abstract override val diagnostic: ConeDiagnostic
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
|
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
||||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
@@ -29,6 +30,7 @@ abstract class FirResolvedQualifier : FirExpression() {
|
|||||||
abstract val symbol: FirClassLikeSymbol<*>?
|
abstract val symbol: FirClassLikeSymbol<*>?
|
||||||
abstract val isNullableLHSForCallableReference: Boolean
|
abstract val isNullableLHSForCallableReference: Boolean
|
||||||
abstract val resolvedToCompanionObject: Boolean
|
abstract val resolvedToCompanionObject: Boolean
|
||||||
|
abstract val nonFatalDiagnostics: List<ConeDiagnostic>
|
||||||
abstract val typeArguments: List<FirTypeProjection>
|
abstract val typeArguments: List<FirTypeProjection>
|
||||||
|
|
||||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitResolvedQualifier(this, data)
|
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitResolvedQualifier(this, data)
|
||||||
|
|||||||
+2
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions.builder
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
|
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||||
@@ -32,6 +33,7 @@ interface FirAbstractResolvedQualifierBuilder {
|
|||||||
abstract var symbol: FirClassLikeSymbol<*>?
|
abstract var symbol: FirClassLikeSymbol<*>?
|
||||||
abstract var isNullableLHSForCallableReference: Boolean
|
abstract var isNullableLHSForCallableReference: Boolean
|
||||||
abstract var resolvedToCompanionObject: Boolean
|
abstract var resolvedToCompanionObject: Boolean
|
||||||
|
abstract val nonFatalDiagnostics: MutableList<ConeDiagnostic>
|
||||||
abstract val typeArguments: MutableList<FirTypeProjection>
|
abstract val typeArguments: MutableList<FirTypeProjection>
|
||||||
|
|
||||||
fun build(): FirResolvedQualifier
|
fun build(): FirResolvedQualifier
|
||||||
|
|||||||
+2
@@ -37,6 +37,7 @@ class FirErrorResolvedQualifierBuilder : FirAbstractResolvedQualifierBuilder, Fi
|
|||||||
override var classId: ClassId? = null
|
override var classId: ClassId? = null
|
||||||
override var symbol: FirClassLikeSymbol<*>? = null
|
override var symbol: FirClassLikeSymbol<*>? = null
|
||||||
override var isNullableLHSForCallableReference: Boolean = false
|
override var isNullableLHSForCallableReference: Boolean = false
|
||||||
|
override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
|
||||||
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
|
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
|
||||||
lateinit var diagnostic: ConeDiagnostic
|
lateinit var diagnostic: ConeDiagnostic
|
||||||
|
|
||||||
@@ -49,6 +50,7 @@ class FirErrorResolvedQualifierBuilder : FirAbstractResolvedQualifierBuilder, Fi
|
|||||||
classId,
|
classId,
|
||||||
symbol,
|
symbol,
|
||||||
isNullableLHSForCallableReference,
|
isNullableLHSForCallableReference,
|
||||||
|
nonFatalDiagnostics,
|
||||||
typeArguments,
|
typeArguments,
|
||||||
diagnostic,
|
diagnostic,
|
||||||
)
|
)
|
||||||
|
|||||||
+3
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSourceElement
|
|||||||
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
|
||||||
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
|
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
||||||
import org.jetbrains.kotlin.fir.expressions.builder.FirAbstractResolvedQualifierBuilder
|
import org.jetbrains.kotlin.fir.expressions.builder.FirAbstractResolvedQualifierBuilder
|
||||||
@@ -37,6 +38,7 @@ class FirResolvedQualifierBuilder : FirAbstractResolvedQualifierBuilder, FirAnno
|
|||||||
override var relativeClassFqName: FqName? = null
|
override var relativeClassFqName: FqName? = null
|
||||||
override var symbol: FirClassLikeSymbol<*>? = null
|
override var symbol: FirClassLikeSymbol<*>? = null
|
||||||
override var isNullableLHSForCallableReference: Boolean = false
|
override var isNullableLHSForCallableReference: Boolean = false
|
||||||
|
override val nonFatalDiagnostics: MutableList<ConeDiagnostic> = mutableListOf()
|
||||||
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
|
override val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
|
||||||
|
|
||||||
override fun build(): FirResolvedQualifier {
|
override fun build(): FirResolvedQualifier {
|
||||||
@@ -48,6 +50,7 @@ class FirResolvedQualifierBuilder : FirAbstractResolvedQualifierBuilder, FirAnno
|
|||||||
relativeClassFqName,
|
relativeClassFqName,
|
||||||
symbol,
|
symbol,
|
||||||
isNullableLHSForCallableReference,
|
isNullableLHSForCallableReference,
|
||||||
|
nonFatalDiagnostics,
|
||||||
typeArguments,
|
typeArguments,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
@@ -30,6 +30,7 @@ internal class FirErrorResolvedQualifierImpl(
|
|||||||
override val classId: ClassId?,
|
override val classId: ClassId?,
|
||||||
override val symbol: FirClassLikeSymbol<*>?,
|
override val symbol: FirClassLikeSymbol<*>?,
|
||||||
override var isNullableLHSForCallableReference: Boolean,
|
override var isNullableLHSForCallableReference: Boolean,
|
||||||
|
override val nonFatalDiagnostics: MutableList<ConeDiagnostic>,
|
||||||
override val typeArguments: MutableList<FirTypeProjection>,
|
override val typeArguments: MutableList<FirTypeProjection>,
|
||||||
override val diagnostic: ConeDiagnostic,
|
override val diagnostic: ConeDiagnostic,
|
||||||
) : FirErrorResolvedQualifier() {
|
) : FirErrorResolvedQualifier() {
|
||||||
|
|||||||
+2
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.expressions.impl
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
|
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||||
@@ -29,6 +30,7 @@ internal class FirResolvedQualifierImpl(
|
|||||||
override var relativeClassFqName: FqName?,
|
override var relativeClassFqName: FqName?,
|
||||||
override val symbol: FirClassLikeSymbol<*>?,
|
override val symbol: FirClassLikeSymbol<*>?,
|
||||||
override var isNullableLHSForCallableReference: Boolean,
|
override var isNullableLHSForCallableReference: Boolean,
|
||||||
|
override val nonFatalDiagnostics: MutableList<ConeDiagnostic>,
|
||||||
override val typeArguments: MutableList<FirTypeProjection>,
|
override val typeArguments: MutableList<FirTypeProjection>,
|
||||||
) : FirResolvedQualifier() {
|
) : FirResolvedQualifier() {
|
||||||
override val classId: ClassId? get() = relativeClassFqName?.let {
|
override val classId: ClassId? get() = relativeClassFqName?.let {
|
||||||
|
|||||||
+1
@@ -503,6 +503,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
|
|||||||
+field("symbol", classLikeSymbolType, nullable = true)
|
+field("symbol", classLikeSymbolType, nullable = true)
|
||||||
+booleanField("isNullableLHSForCallableReference", withReplace = true)
|
+booleanField("isNullableLHSForCallableReference", withReplace = true)
|
||||||
+booleanField("resolvedToCompanionObject", withReplace = true)
|
+booleanField("resolvedToCompanionObject", withReplace = true)
|
||||||
|
+fieldList("nonFatalDiagnostics", coneDiagnosticType)
|
||||||
+typeArguments.withTransform()
|
+typeArguments.withTransform()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -978,6 +978,7 @@ object PositioningStrategies {
|
|||||||
is KtWhenConditionInRange -> element.operationReference
|
is KtWhenConditionInRange -> element.operationReference
|
||||||
is KtAnnotationEntry -> element.calleeExpression ?: element
|
is KtAnnotationEntry -> element.calleeExpression ?: element
|
||||||
is KtTypeReference -> (element.typeElement as? KtNullableType)?.innerType ?: element
|
is KtTypeReference -> (element.typeElement as? KtNullableType)?.innerType ?: element
|
||||||
|
is KtImportDirective -> element.importedReference ?: element
|
||||||
else -> element
|
else -> element
|
||||||
}
|
}
|
||||||
while (locateReferencedName && result is KtParenthesizedExpression) {
|
while (locateReferencedName && result is KtParenthesizedExpression) {
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
class Another {
|
|
||||||
@Deprecated("Object")
|
|
||||||
companion object {
|
|
||||||
fun use() {}
|
|
||||||
const val USE = 42
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun first() {
|
|
||||||
Another.use()
|
|
||||||
Another.Companion.USE
|
|
||||||
Another.USE
|
|
||||||
}
|
|
||||||
|
|
||||||
fun useCompanion() {
|
|
||||||
val d = Another
|
|
||||||
val x = Another.Companion
|
|
||||||
Another.Companion.use()
|
|
||||||
Another.use()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated("Some")
|
|
||||||
class Some {
|
|
||||||
companion object {
|
|
||||||
fun use() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun some() {
|
|
||||||
Some.use()
|
|
||||||
Some.Companion.use()
|
|
||||||
}
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
class Another {
|
class Another {
|
||||||
@Deprecated("Object")
|
@Deprecated("Object")
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
+1
-1
@@ -10,4 +10,4 @@ public interface J {
|
|||||||
|
|
||||||
// FILE: K.kt
|
// FILE: K.kt
|
||||||
|
|
||||||
import test.J
|
import <!DEPRECATION!>test.J<!>
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
import C as C2
|
|
||||||
|
|
||||||
@Deprecated("obsolete")
|
|
||||||
class C {
|
|
||||||
fun use() {}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun useAlias(c : <!DEPRECATION!>C2<!>) { c.use() }
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
import <!DEPRECATION!>C<!> as C2
|
import <!DEPRECATION!>C<!> as C2
|
||||||
|
|
||||||
@Deprecated("obsolete")
|
@Deprecated("obsolete")
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
class TopLevel {
|
|
||||||
@Deprecated("Nested")
|
|
||||||
class Nested {
|
|
||||||
companion object {
|
|
||||||
fun use() {}
|
|
||||||
|
|
||||||
class CompanionNested2
|
|
||||||
}
|
|
||||||
|
|
||||||
class Nested2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun useNested() {
|
|
||||||
val d = TopLevel.Nested.use()
|
|
||||||
TopLevel.Nested.Nested2()
|
|
||||||
TopLevel.Nested.<!UNRESOLVED_REFERENCE!>CompanionNested2<!>()
|
|
||||||
}
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
class TopLevel {
|
class TopLevel {
|
||||||
@Deprecated("Nested")
|
@Deprecated("Nested")
|
||||||
class Nested {
|
class Nested {
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
@Deprecated("Object")
|
|
||||||
object Obsolete {
|
|
||||||
fun use() {}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun useObject() {
|
|
||||||
Obsolete.use()
|
|
||||||
val x = Obsolete
|
|
||||||
}
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
@Deprecated("Object")
|
@Deprecated("Object")
|
||||||
object Obsolete {
|
object Obsolete {
|
||||||
fun use() {}
|
fun use() {}
|
||||||
|
|||||||
-12
@@ -1,12 +0,0 @@
|
|||||||
class Relevant {
|
|
||||||
companion object {
|
|
||||||
val value = ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated("Use Relevant")
|
|
||||||
typealias Obsolete = Relevant
|
|
||||||
|
|
||||||
fun test1() = Obsolete
|
|
||||||
fun test2() = Obsolete.value
|
|
||||||
fun test3() = Obsolete.toString()
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
class Relevant {
|
class Relevant {
|
||||||
companion object {
|
companion object {
|
||||||
val value = ""
|
val value = ""
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ fun test1a(x: List<<!DEPRECATION!>Obsolete<!>>) = x
|
|||||||
|
|
||||||
val test2 = Obsolete()
|
val test2 = Obsolete()
|
||||||
|
|
||||||
val test3 = Obsolete
|
val test3 = <!DEPRECATION!>Obsolete<!>
|
||||||
|
|
||||||
class Test4: <!DEPRECATION!>Obsolete<!>()
|
class Test4: <!DEPRECATION!>Obsolete<!>()
|
||||||
class Test4a: <!DEPRECATION!>IObsolete<!>
|
class Test4a: <!DEPRECATION!>IObsolete<!>
|
||||||
|
|||||||
@@ -7,4 +7,4 @@ interface A
|
|||||||
|
|
||||||
// FILE: B.kt
|
// FILE: B.kt
|
||||||
|
|
||||||
import test.A
|
import <!DEPRECATION!>test.A<!>
|
||||||
|
|||||||
Vendored
+1
-1
@@ -28,7 +28,7 @@ fun test(a: <!UNRESOLVED_REFERENCE!>A<!>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FILE: explicitlyImportP1.kt
|
// FILE: explicitlyImportP1.kt
|
||||||
import p1.A
|
import <!DEPRECATION_ERROR!>p1.A<!>
|
||||||
import p2.*
|
import p2.*
|
||||||
|
|
||||||
fun test(a: <!DEPRECATION_ERROR!>A<!>) {
|
fun test(a: <!DEPRECATION_ERROR!>A<!>) {
|
||||||
|
|||||||
Vendored
+1
-1
@@ -25,7 +25,7 @@ class A(val v3: Unit)
|
|||||||
// MODULE: m4(m1, m2, m3)
|
// MODULE: m4(m1, m2, m3)
|
||||||
// FILE: oneExplicitImportOtherStars.kt
|
// FILE: oneExplicitImportOtherStars.kt
|
||||||
import p1.*
|
import p1.*
|
||||||
import p2.A
|
import <!DEPRECATION_ERROR!>p2.A<!>
|
||||||
import p3.*
|
import p3.*
|
||||||
|
|
||||||
fun test(a: <!DEPRECATION_ERROR!>A<!>) {
|
fun test(a: <!DEPRECATION_ERROR!>A<!>) {
|
||||||
|
|||||||
Reference in New Issue
Block a user