[FIR] Rename qualifiedAccessOrAssignmentsOrAnnotationCalls to callsOrAssignments and add delegated constructor calls
This commit is contained in:
committed by
Space Team
parent
6281faa063
commit
6d1d6e48c1
+2
-2
@@ -50,9 +50,9 @@ internal interface KtFirAnalysisSessionComponent {
|
||||
|
||||
fun ConeDiagnostic.asKtDiagnostic(
|
||||
source: KtSourceElement,
|
||||
qualifiedAccessSource: KtSourceElement?,
|
||||
callOrAssignmentSource: KtSourceElement?,
|
||||
): KtDiagnosticWithPsi<*>? {
|
||||
val firDiagnostic = toFirDiagnostics(analysisSession.useSiteSession, source, qualifiedAccessSource).firstOrNull() ?: return null
|
||||
val firDiagnostic = toFirDiagnostics(analysisSession.useSiteSession, source, callOrAssignmentSource).firstOrNull() ?: return null
|
||||
check(firDiagnostic is KtPsiDiagnostic)
|
||||
return firDiagnostic.asKtDiagnostic()
|
||||
}
|
||||
|
||||
+1
-1
@@ -28,7 +28,7 @@ object FirJvmSuspensionPointInsideMutexLockChecker : FirFunctionCallChecker() {
|
||||
if (!symbol.isSuspend) return
|
||||
val closestAnonymousFunction = context.findClosest<FirAnonymousFunction>() ?: return
|
||||
|
||||
for (call in context.qualifiedAccessOrAssignmentsOrAnnotationCalls.asReversed()) {
|
||||
for (call in context.callsOrAssignments.asReversed()) {
|
||||
if (call is FirFunctionCall) {
|
||||
val callableSymbol = call.calleeReference.toResolvedCallableSymbol() ?: continue
|
||||
if (callableSymbol.callableId == synchronizedCallableId) {
|
||||
|
||||
@@ -764,7 +764,7 @@ fun FirBasedSymbol<*>.getAnnotationStringParameter(classId: ClassId, session: Fi
|
||||
|
||||
fun FirElement.isLhsOfAssignment(context: CheckerContext): Boolean {
|
||||
if (this !is FirQualifiedAccessExpression) return false
|
||||
val lastQualified = context.qualifiedAccessOrAssignmentsOrAnnotationCalls.lastOrNull { it != this } ?: return false
|
||||
val lastQualified = context.callsOrAssignments.lastOrNull { it != this } ?: return false
|
||||
return lastQualified is FirVariableAssignment && lastQualified.lValue == this
|
||||
}
|
||||
|
||||
|
||||
+3
-1
@@ -33,7 +33,9 @@ abstract class CheckerContext : DiagnosticContext {
|
||||
// Context
|
||||
abstract val implicitReceiverStack: ImplicitReceiverStack
|
||||
abstract val containingDeclarations: List<FirDeclaration>
|
||||
abstract val qualifiedAccessOrAssignmentsOrAnnotationCalls: List<FirStatement>
|
||||
|
||||
/** Contains qualified access, annotation call, delegated constructor call, and variable assignment. */
|
||||
abstract val callsOrAssignments: List<FirStatement>
|
||||
abstract val getClassCalls: List<FirGetClassCall>
|
||||
abstract val annotationContainers: List<FirAnnotationContainer>
|
||||
abstract val containingElements: List<FirElement>
|
||||
|
||||
+2
-2
@@ -50,9 +50,9 @@ abstract class CheckerContextForProvider(
|
||||
}
|
||||
}
|
||||
|
||||
abstract fun addQualifiedAccessOrAnnotationCall(qualifiedAccessOrAnnotationCall: FirStatement): CheckerContextForProvider
|
||||
abstract fun addCallOrAssignment(qualifiedAccessOrAnnotationCall: FirStatement): CheckerContextForProvider
|
||||
|
||||
abstract fun dropQualifiedAccessOrAnnotationCall()
|
||||
abstract fun dropCallOrAssignment()
|
||||
|
||||
abstract fun addGetClassCall(getClassCall: FirGetClassCall): CheckerContextForProvider
|
||||
|
||||
|
||||
+7
-7
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.name.Name
|
||||
class MutableCheckerContext private constructor(
|
||||
override val implicitReceiverStack: PersistentImplicitReceiverStack,
|
||||
override val containingDeclarations: MutableList<FirDeclaration>,
|
||||
override val qualifiedAccessOrAssignmentsOrAnnotationCalls: MutableList<FirStatement>,
|
||||
override val callsOrAssignments: MutableList<FirStatement>,
|
||||
override val getClassCalls: MutableList<FirGetClassCall>,
|
||||
override val annotationContainers: MutableList<FirAnnotationContainer>,
|
||||
override val containingElements: MutableList<FirElement>,
|
||||
@@ -56,7 +56,7 @@ class MutableCheckerContext private constructor(
|
||||
return MutableCheckerContext(
|
||||
implicitReceiverStack.add(name, value),
|
||||
containingDeclarations,
|
||||
qualifiedAccessOrAssignmentsOrAnnotationCalls,
|
||||
callsOrAssignments,
|
||||
getClassCalls,
|
||||
annotationContainers,
|
||||
containingElements,
|
||||
@@ -80,13 +80,13 @@ class MutableCheckerContext private constructor(
|
||||
containingDeclarations.removeLast()
|
||||
}
|
||||
|
||||
override fun addQualifiedAccessOrAnnotationCall(qualifiedAccessOrAnnotationCall: FirStatement): MutableCheckerContext {
|
||||
qualifiedAccessOrAssignmentsOrAnnotationCalls.add(qualifiedAccessOrAnnotationCall)
|
||||
override fun addCallOrAssignment(qualifiedAccessOrAnnotationCall: FirStatement): MutableCheckerContext {
|
||||
callsOrAssignments.add(qualifiedAccessOrAnnotationCall)
|
||||
return this
|
||||
}
|
||||
|
||||
override fun dropQualifiedAccessOrAnnotationCall() {
|
||||
qualifiedAccessOrAssignmentsOrAnnotationCalls.removeLast()
|
||||
override fun dropCallOrAssignment() {
|
||||
callsOrAssignments.removeLast()
|
||||
}
|
||||
|
||||
override fun addGetClassCall(getClassCall: FirGetClassCall): MutableCheckerContext {
|
||||
@@ -127,7 +127,7 @@ class MutableCheckerContext private constructor(
|
||||
return MutableCheckerContext(
|
||||
implicitReceiverStack,
|
||||
containingDeclarations,
|
||||
qualifiedAccessOrAssignmentsOrAnnotationCalls,
|
||||
callsOrAssignments,
|
||||
getClassCalls,
|
||||
annotationContainers,
|
||||
containingElements,
|
||||
|
||||
+5
-5
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.name.Name
|
||||
class PersistentCheckerContext private constructor(
|
||||
override val implicitReceiverStack: PersistentImplicitReceiverStack,
|
||||
override val containingDeclarations: PersistentList<FirDeclaration>,
|
||||
override val qualifiedAccessOrAssignmentsOrAnnotationCalls: PersistentList<FirStatement>,
|
||||
override val callsOrAssignments: PersistentList<FirStatement>,
|
||||
override val getClassCalls: PersistentList<FirGetClassCall>,
|
||||
override val annotationContainers: PersistentList<FirAnnotationContainer>,
|
||||
override val containingElements: PersistentList<FirElement>,
|
||||
@@ -62,13 +62,13 @@ class PersistentCheckerContext private constructor(
|
||||
|
||||
override fun dropDeclaration() {}
|
||||
|
||||
override fun addQualifiedAccessOrAnnotationCall(qualifiedAccessOrAnnotationCall: FirStatement): PersistentCheckerContext =
|
||||
override fun addCallOrAssignment(qualifiedAccessOrAnnotationCall: FirStatement): PersistentCheckerContext =
|
||||
copy(
|
||||
qualifiedAccessOrAssignmentsOrAnnotationCalls =
|
||||
qualifiedAccessOrAssignmentsOrAnnotationCalls.add(qualifiedAccessOrAnnotationCall)
|
||||
callsOrAssignments.add(qualifiedAccessOrAnnotationCall)
|
||||
)
|
||||
|
||||
override fun dropQualifiedAccessOrAnnotationCall() {}
|
||||
override fun dropCallOrAssignment() {}
|
||||
|
||||
override fun addGetClassCall(getClassCall: FirGetClassCall): PersistentCheckerContext =
|
||||
copy(getClassCalls = getClassCalls.add(getClassCall))
|
||||
@@ -102,7 +102,7 @@ class PersistentCheckerContext private constructor(
|
||||
|
||||
private fun copy(
|
||||
implicitReceiverStack: PersistentImplicitReceiverStack = this.implicitReceiverStack,
|
||||
qualifiedAccessOrAssignmentsOrAnnotationCalls: PersistentList<FirStatement> = this.qualifiedAccessOrAssignmentsOrAnnotationCalls,
|
||||
qualifiedAccessOrAssignmentsOrAnnotationCalls: PersistentList<FirStatement> = this.callsOrAssignments,
|
||||
getClassCalls: PersistentList<FirGetClassCall> = this.getClassCalls,
|
||||
annotationContainers: PersistentList<FirAnnotationContainer> = this.annotationContainers,
|
||||
containingElements: PersistentList<FirElement> = this.containingElements,
|
||||
|
||||
+2
-2
@@ -253,8 +253,8 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
|
||||
|
||||
private fun FirStatement.partOfCall(context: CheckerContext): Boolean {
|
||||
if (this !is FirExpression) return false
|
||||
val containingQualifiedAccess = context.qualifiedAccessOrAssignmentsOrAnnotationCalls.getOrNull(
|
||||
context.qualifiedAccessOrAssignmentsOrAnnotationCalls.size - 2
|
||||
val containingQualifiedAccess = context.callsOrAssignments.getOrNull(
|
||||
context.callsOrAssignments.size - 2
|
||||
) ?: return false
|
||||
if (this == (containingQualifiedAccess as? FirQualifiedAccessExpression)?.explicitReceiver) return true
|
||||
val call = containingQualifiedAccess as? FirCall ?: return false
|
||||
|
||||
+1
-2
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isAbstract
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||
import org.jetbrains.kotlin.fir.references.toResolvedConstructorSymbol
|
||||
@@ -26,7 +25,7 @@ object FirConstructorCallChecker : FirFunctionCallChecker() {
|
||||
|
||||
if (declarationClass != null) {
|
||||
if (declarationClass.classKind == ClassKind.ANNOTATION_CLASS &&
|
||||
context.qualifiedAccessOrAssignmentsOrAnnotationCalls.all { call ->
|
||||
context.callsOrAssignments.all { call ->
|
||||
call !is FirAnnotation
|
||||
} &&
|
||||
context.containingDeclarations.all { klass ->
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||
|
||||
object FirReceiverAccessBeforeSuperCallChecker : FirInaccessibleReceiverChecker() {
|
||||
override fun check(expression: FirInaccessibleReceiverExpression, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
val containingCall = context.qualifiedAccessOrAssignmentsOrAnnotationCalls.last() as FirQualifiedAccessExpression
|
||||
val containingCall = context.callsOrAssignments.last() as FirQualifiedAccessExpression
|
||||
containingCall.run {
|
||||
require(expression == dispatchReceiver || expression == extensionReceiver || expression in contextReceiverArguments)
|
||||
}
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@ object FirReturnSyntaxAndLabelChecker : FirReturnExpressionChecker() {
|
||||
if (targetSymbol is FirAnonymousFunctionSymbol) {
|
||||
val label = targetSymbol.label
|
||||
if (label?.source?.kind !is KtRealSourceElementKind) {
|
||||
val functionCall = context.qualifiedAccessOrAssignmentsOrAnnotationCalls.asReversed().find {
|
||||
val functionCall = context.callsOrAssignments.asReversed().find {
|
||||
it is FirFunctionCall &&
|
||||
(it.calleeReference.toResolvedFunctionSymbol())?.callableId ==
|
||||
FirSuspendCallChecker.KOTLIN_SUSPEND_BUILT_IN_FUNCTION_CALLABLE_ID
|
||||
|
||||
+1
-1
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.types.isUnit
|
||||
|
||||
object FirStandaloneQualifierChecker : FirResolvedQualifierChecker() {
|
||||
override fun check(expression: FirResolvedQualifier, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
val lastQualifiedAccess = context.qualifiedAccessOrAssignmentsOrAnnotationCalls.lastOrNull() as? FirQualifiedAccessExpression
|
||||
val lastQualifiedAccess = context.callsOrAssignments.lastOrNull() as? FirQualifiedAccessExpression
|
||||
// Note: qualifier isn't standalone when it's in receiver (SomeClass.foo) or getClass (SomeClass::class) position
|
||||
if (lastQualifiedAccess?.explicitReceiver === expression || lastQualifiedAccess?.dispatchReceiver === expression) return
|
||||
val lastGetClass = context.getClassCalls.lastOrNull()
|
||||
|
||||
+1
-1
@@ -33,7 +33,7 @@ object FirTypeParameterInQualifiedAccessChecker : FirQualifiedAccessExpressionCh
|
||||
// Make sure the current expression is not the receiver of a qualified access expression.
|
||||
// E.g., for `T::toString`, which is a callable reference (a subtype of qualified access), type parameter T is checked once as an
|
||||
// explicit receiver. When we visit `T` (as a qualified access expression), we should not regard it as an expression here.
|
||||
val secondLast = context.qualifiedAccessOrAssignmentsOrAnnotationCalls.elementAtOrNull(context.qualifiedAccessOrAssignmentsOrAnnotationCalls.size - 2)
|
||||
val secondLast = context.callsOrAssignments.elementAtOrNull(context.callsOrAssignments.size - 2)
|
||||
if (secondLast is FirQualifiedAccessExpression && secondLast.explicitReceiver == expression) return
|
||||
|
||||
val diagnostic = expression.typeRef.coneTypeParameterInQualifiedAccess ?: return
|
||||
|
||||
+2
-2
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.fir.expressions.*
|
||||
object FirUnsupportedArrayLiteralChecker : FirArrayOfCallChecker() {
|
||||
override fun check(expression: FirArrayOfCall, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
if (!isInsideAnnotationCall(expression, context) &&
|
||||
(context.qualifiedAccessOrAssignmentsOrAnnotationCalls.isNotEmpty() || !isInsideAnnotationClass(context))
|
||||
(context.callsOrAssignments.isNotEmpty() || !isInsideAnnotationClass(context))
|
||||
) {
|
||||
reporter.reportOn(
|
||||
expression.source,
|
||||
@@ -32,7 +32,7 @@ object FirUnsupportedArrayLiteralChecker : FirArrayOfCallChecker() {
|
||||
}
|
||||
|
||||
private fun isInsideAnnotationCall(expression: FirArrayOfCall, context: CheckerContext): Boolean {
|
||||
context.qualifiedAccessOrAssignmentsOrAnnotationCalls.lastOrNull()?.let {
|
||||
context.callsOrAssignments.lastOrNull()?.let {
|
||||
val arguments = when (it) {
|
||||
is FirFunctionCall ->
|
||||
if (it.typeRef.toRegularClassSymbol(context.session)?.classKind == ClassKind.ANNOTATION_CLASS) {
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@ object FirOptInUsageTypeRefChecker : FirTypeRefChecker() {
|
||||
val symbol = coneType.lookupTag.toSymbol(context.session) ?: return
|
||||
symbol.lazyResolveToPhase(FirResolvePhase.STATUS)
|
||||
val classId = symbol.classId
|
||||
val lastAnnotationCall = context.qualifiedAccessOrAssignmentsOrAnnotationCalls.lastOrNull() as? FirAnnotation
|
||||
val lastAnnotationCall = context.callsOrAssignments.lastOrNull() as? FirAnnotation
|
||||
if (lastAnnotationCall == null || lastAnnotationCall.annotationTypeRef !== typeRef) {
|
||||
if (classId == OptInNames.REQUIRES_OPT_IN_CLASS_ID || classId == OptInNames.OPT_IN_CLASS_ID) {
|
||||
reporter.reportOn(source, OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION, context)
|
||||
|
||||
+16
-12
@@ -216,23 +216,27 @@ abstract class AbstractDiagnosticCollectorVisitor(
|
||||
}
|
||||
|
||||
override fun visitFunctionCall(functionCall: FirFunctionCall, data: Nothing?) {
|
||||
visitWithQualifiedAccessOrAnnotationCall(functionCall)
|
||||
visitWithCallOrAssignment(functionCall)
|
||||
}
|
||||
|
||||
override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression, data: Nothing?) {
|
||||
visitWithQualifiedAccessOrAnnotationCall(qualifiedAccessExpression)
|
||||
visitWithCallOrAssignment(qualifiedAccessExpression)
|
||||
}
|
||||
|
||||
override fun visitPropertyAccessExpression(propertyAccessExpression: FirPropertyAccessExpression, data: Nothing?) {
|
||||
visitWithQualifiedAccessOrAnnotationCall(propertyAccessExpression)
|
||||
visitWithCallOrAssignment(propertyAccessExpression)
|
||||
}
|
||||
|
||||
override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: Nothing?) {
|
||||
visitWithQualifiedAccessOrAnnotationCall(annotationCall)
|
||||
visitWithCallOrAssignment(annotationCall)
|
||||
}
|
||||
|
||||
override fun visitVariableAssignment(variableAssignment: FirVariableAssignment, data: Nothing?) {
|
||||
visitWithQualifiedAccessOrAnnotationCall(variableAssignment)
|
||||
visitWithCallOrAssignment(variableAssignment)
|
||||
}
|
||||
|
||||
override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: Nothing?) {
|
||||
visitWithCallOrAssignment(delegatedConstructorCall)
|
||||
}
|
||||
|
||||
override fun visitGetClassCall(getClassCall: FirGetClassCall, data: Nothing?) {
|
||||
@@ -273,9 +277,9 @@ abstract class AbstractDiagnosticCollectorVisitor(
|
||||
}
|
||||
}
|
||||
|
||||
private fun visitWithQualifiedAccessOrAnnotationCall(qualifiedAccessOrAnnotationCall: FirStatement) {
|
||||
return withQualifiedAccessOrAnnotationCall(qualifiedAccessOrAnnotationCall) {
|
||||
visitElement(qualifiedAccessOrAnnotationCall, null)
|
||||
private fun visitWithCallOrAssignment(callOrAssignment: FirStatement) {
|
||||
return withCallOrAssignment(callOrAssignment) {
|
||||
visitElement(callOrAssignment, null)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -286,15 +290,15 @@ abstract class AbstractDiagnosticCollectorVisitor(
|
||||
}
|
||||
|
||||
@OptIn(PrivateForInline::class)
|
||||
inline fun <R> withQualifiedAccessOrAnnotationCall(qualifiedAccessOrAnnotationCall: FirStatement, block: () -> R): R {
|
||||
inline fun <R> withCallOrAssignment(callOrAssignment: FirStatement, block: () -> R): R {
|
||||
val existingContext = context
|
||||
context = context.addQualifiedAccessOrAnnotationCall(qualifiedAccessOrAnnotationCall)
|
||||
context = context.addCallOrAssignment(callOrAssignment)
|
||||
try {
|
||||
return whileAnalysing(context.session, qualifiedAccessOrAnnotationCall) {
|
||||
return whileAnalysing(context.session, callOrAssignment) {
|
||||
block()
|
||||
}
|
||||
} finally {
|
||||
existingContext.dropQualifiedAccessOrAnnotationCall()
|
||||
existingContext.dropCallOrAssignment()
|
||||
context = existingContext
|
||||
}
|
||||
}
|
||||
|
||||
+8
-8
@@ -63,7 +63,7 @@ class ErrorNodeDiagnosticCollectorComponent(
|
||||
|
||||
private fun processErrorReference(reference: FirNamedReference, diagnostic: ConeDiagnostic, context: CheckerContext) {
|
||||
var source = reference.source ?: return
|
||||
val qualifiedAccessOrAnnotationCall = context.qualifiedAccessOrAssignmentsOrAnnotationCalls.lastOrNull()?.takeIf {
|
||||
val callOrAssignment = context.callsOrAssignments.lastOrNull()?.takeIf {
|
||||
// Use the source of the enclosing FirQualifiedAccess if it is exactly the call to the erroneous callee.
|
||||
it.calleeReference == reference
|
||||
}
|
||||
@@ -75,10 +75,10 @@ class ErrorNodeDiagnosticCollectorComponent(
|
||||
) return
|
||||
|
||||
// If the receiver cannot be resolved, we skip reporting any further problems for this call.
|
||||
if (qualifiedAccessOrAnnotationCall is FirQualifiedAccessExpression) {
|
||||
if (qualifiedAccessOrAnnotationCall.dispatchReceiver.cannotBeResolved() ||
|
||||
qualifiedAccessOrAnnotationCall.extensionReceiver.cannotBeResolved() ||
|
||||
qualifiedAccessOrAnnotationCall.explicitReceiver.cannotBeResolved()
|
||||
if (callOrAssignment is FirQualifiedAccessExpression) {
|
||||
if (callOrAssignment.dispatchReceiver.cannotBeResolved() ||
|
||||
callOrAssignment.extensionReceiver.cannotBeResolved() ||
|
||||
callOrAssignment.explicitReceiver.cannotBeResolved()
|
||||
) return
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ class ErrorNodeDiagnosticCollectorComponent(
|
||||
source = property.delegate?.source?.fakeElement(KtFakeSourceElementKind.DelegatedPropertyAccessor) ?: return
|
||||
}
|
||||
|
||||
reportFirDiagnostic(diagnostic, source, context, qualifiedAccessOrAnnotationCall?.source)
|
||||
reportFirDiagnostic(diagnostic, source, context, callOrAssignment?.source)
|
||||
}
|
||||
|
||||
private fun FirExpression?.cannotBeResolved(): Boolean {
|
||||
@@ -129,7 +129,7 @@ class ErrorNodeDiagnosticCollectorComponent(
|
||||
diagnostic: ConeDiagnostic,
|
||||
source: KtSourceElement,
|
||||
context: CheckerContext,
|
||||
qualifiedAccessSource: KtSourceElement? = null
|
||||
callOrAssignmentSource: KtSourceElement? = null
|
||||
) {
|
||||
// Will be handled by [FirDestructuringDeclarationChecker]
|
||||
if (source.elementType == KtNodeTypes.DESTRUCTURING_DECLARATION_ENTRY) {
|
||||
@@ -153,7 +153,7 @@ class ErrorNodeDiagnosticCollectorComponent(
|
||||
return
|
||||
}
|
||||
|
||||
for (coneDiagnostic in diagnostic.toFirDiagnostics(session, source, qualifiedAccessSource)) {
|
||||
for (coneDiagnostic in diagnostic.toFirDiagnostics(session, source, callOrAssignmentSource)) {
|
||||
reporter.report(coneDiagnostic, context)
|
||||
}
|
||||
}
|
||||
|
||||
+11
-11
@@ -46,7 +46,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled
|
||||
|
||||
private fun ConeDiagnostic.toKtDiagnostic(
|
||||
source: KtSourceElement,
|
||||
qualifiedAccessSource: KtSourceElement?
|
||||
callOrAssignmentSource: KtSourceElement?
|
||||
): KtDiagnostic? = when (this) {
|
||||
is ConeUnresolvedReferenceError -> FirErrors.UNRESOLVED_REFERENCE.createOn(
|
||||
source,
|
||||
@@ -83,7 +83,7 @@ private fun ConeDiagnostic.toKtDiagnostic(
|
||||
applicability.isSuccess -> FirErrors.OVERLOAD_RESOLUTION_AMBIGUITY.createOn(source, this.candidates.map { it.symbol })
|
||||
applicability == CandidateApplicability.UNSAFE_CALL -> {
|
||||
val (unsafeCall, candidate) = candidates.firstNotNullOf { it.diagnostics.firstIsInstanceOrNull<UnsafeCall>()?.to(it) }
|
||||
mapUnsafeCallError(candidate, unsafeCall, source, qualifiedAccessSource)
|
||||
mapUnsafeCallError(candidate, unsafeCall, source, callOrAssignmentSource)
|
||||
}
|
||||
|
||||
applicability == CandidateApplicability.UNSTABLE_SMARTCAST -> {
|
||||
@@ -109,22 +109,22 @@ private fun ConeDiagnostic.toKtDiagnostic(
|
||||
FirErrors.WRONG_NUMBER_OF_TYPE_ARGUMENTS.createOn(this.source, this.desiredCount, this.symbol)
|
||||
|
||||
is ConeOuterClassArgumentsRequired ->
|
||||
FirErrors.OUTER_CLASS_ARGUMENTS_REQUIRED.createOn(qualifiedAccessSource ?: source, this.symbol)
|
||||
FirErrors.OUTER_CLASS_ARGUMENTS_REQUIRED.createOn(callOrAssignmentSource ?: source, this.symbol)
|
||||
|
||||
is ConeNoTypeArgumentsOnRhsError ->
|
||||
FirErrors.NO_TYPE_ARGUMENTS_ON_RHS.createOn(qualifiedAccessSource ?: source, this.desiredCount, this.symbol)
|
||||
FirErrors.NO_TYPE_ARGUMENTS_ON_RHS.createOn(callOrAssignmentSource ?: source, this.desiredCount, this.symbol)
|
||||
|
||||
is ConeSyntaxDiagnostic -> FirSyntaxErrors.SYNTAX.createOn(qualifiedAccessSource ?: source, reason)
|
||||
is ConeSyntaxDiagnostic -> FirSyntaxErrors.SYNTAX.createOn(callOrAssignmentSource ?: source, reason)
|
||||
|
||||
is ConeSimpleDiagnostic -> when {
|
||||
source.kind is KtFakeSourceElementKind && source.kind != KtFakeSourceElementKind.ReferenceInAtomicQualifiedAccess -> null
|
||||
else -> this.getFactory(source).createOn(qualifiedAccessSource ?: source)
|
||||
else -> this.getFactory(source).createOn(callOrAssignmentSource ?: source)
|
||||
}
|
||||
|
||||
is ConeDestructuringDeclarationsOnTopLevel -> null // TODO Currently a parsing error. Would be better to report here instead KT-58563
|
||||
is ConeCannotInferTypeParameterType -> FirErrors.CANNOT_INFER_PARAMETER_TYPE.createOn(source)
|
||||
is ConeCannotInferValueParameterType -> FirErrors.CANNOT_INFER_PARAMETER_TYPE.createOn(source)
|
||||
is ConeTypeVariableTypeIsNotInferred -> FirErrors.INFERENCE_ERROR.createOn(qualifiedAccessSource ?: source)
|
||||
is ConeTypeVariableTypeIsNotInferred -> FirErrors.INFERENCE_ERROR.createOn(callOrAssignmentSource ?: source)
|
||||
is ConeInstanceAccessBeforeSuperCall -> FirErrors.INSTANCE_ACCESS_BEFORE_SUPER_CALL.createOn(source, this.target)
|
||||
is ConeStubDiagnostic -> null
|
||||
is ConeIntermediateDiagnostic -> null
|
||||
@@ -162,12 +162,12 @@ fun FirBasedSymbol<*>.toInvisibleReferenceDiagnostic(source: KtSourceElement?):
|
||||
fun ConeDiagnostic.toFirDiagnostics(
|
||||
session: FirSession,
|
||||
source: KtSourceElement,
|
||||
qualifiedAccessSource: KtSourceElement?
|
||||
callOrAssignmentSource: KtSourceElement?
|
||||
): List<KtDiagnostic> {
|
||||
return when (this) {
|
||||
is ConeInapplicableCandidateError -> mapInapplicableCandidateError(session, this, source, qualifiedAccessSource)
|
||||
is ConeConstraintSystemHasContradiction -> mapSystemHasContradictionError(session, this, source, qualifiedAccessSource)
|
||||
else -> listOfNotNull(toKtDiagnostic(source, qualifiedAccessSource))
|
||||
is ConeInapplicableCandidateError -> mapInapplicableCandidateError(session, this, source, callOrAssignmentSource)
|
||||
is ConeConstraintSystemHasContradiction -> mapSystemHasContradictionError(session, this, source, callOrAssignmentSource)
|
||||
else -> listOfNotNull(toKtDiagnostic(source, callOrAssignmentSource))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ enum class TestOk(val x: String = "OK") {
|
||||
|
||||
enum class TestErrors(val x: String) {
|
||||
<!NO_VALUE_FOR_PARAMETER!>TEST1,<!>
|
||||
TEST2<!NO_VALUE_FOR_PARAMETER!><!>(),
|
||||
TEST2<!NO_VALUE_FOR_PARAMETER!>()<!>,
|
||||
TEST3("Hello")
|
||||
}
|
||||
|
||||
|
||||
Vendored
+1
-1
@@ -3,7 +3,7 @@ open class B0(x: Int)
|
||||
|
||||
class A0 : B0 {
|
||||
<!EXPLICIT_DELEGATION_CALL_REQUIRED!>constructor()<!>
|
||||
constructor(x: Int) : <!NO_VALUE_FOR_PARAMETER!>super<!>()
|
||||
constructor(x: Int) : <!NO_VALUE_FOR_PARAMETER!>super()<!>
|
||||
}
|
||||
|
||||
// --------------------------
|
||||
|
||||
Vendored
+1
-1
@@ -17,4 +17,4 @@ val test2 = <!NO_VALUE_FOR_PARAMETER!>C2_Alias()<!>
|
||||
|
||||
class Test3 : <!API_NOT_AVAILABLE!>C1_Alias<!>()
|
||||
|
||||
class Test4 : <!NO_VALUE_FOR_PARAMETER!>C2_Alias<!>()
|
||||
class Test4 : <!NO_VALUE_FOR_PARAMETER!>C2_Alias()<!>
|
||||
|
||||
Reference in New Issue
Block a user