From ddc3ef1121e79dd0a351e14667a08e115577e25f Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 9 Jul 2021 14:21:47 +0300 Subject: [PATCH] Fix all illegal usages of `safeAs` function Call of `safeAs` without specifying explicit type argument is hardly readable and may leads to hardly detectable errors --- .../jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt | 2 +- .../FirCommonConstructorDelegationIssuesChecker.kt | 2 +- .../fir/analysis/checkers/declaration/FirOverrideChecker.kt | 4 ++-- .../expression/FirUpperBoundViolatedExpressionChecker.kt | 6 +++--- .../analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt | 2 +- .../jetbrains/kotlin/fir/declarations/deprecationUtils.kt | 2 +- .../resolve/calls/DiagnosticReporterByTrackingStrategy.kt | 4 +++- .../resolve/calls/tower/KotlinResolutionCallbacksImpl.kt | 2 +- .../psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt | 6 +++--- 9 files changed, 16 insertions(+), 14 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index e7333fdeec8..44a1cbfbc9d 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt @@ -127,7 +127,7 @@ fun FirTypeRef.toRegularClass(session: FirSession): FirRegularClass? { inline fun FirQualifiedAccessExpression.getDeclaration(): T? { return this.calleeReference.safeAs() ?.resolvedSymbol - ?.fir.safeAs() + ?.fir as? T } /** diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirCommonConstructorDelegationIssuesChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirCommonConstructorDelegationIssuesChecker.kt index 29196d6b2d5..066597349dc 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirCommonConstructorDelegationIssuesChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirCommonConstructorDelegationIssuesChecker.kt @@ -94,5 +94,5 @@ object FirCommonConstructorDelegationIssuesChecker : FirRegularClassChecker() { private fun FirConstructor.getDelegated(): FirConstructor? = delegatedConstructor ?.calleeReference.safeAs() ?.resolvedSymbol - ?.fir.safeAs() + ?.fir as? FirConstructor? } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt index 858fc4fa5a1..8a816aa78da 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt @@ -108,7 +108,7 @@ object FirOverrideChecker : FirClassChecker() { overriddenSymbols: List>, ): FirMemberDeclaration? { if (isVar) return null - return overriddenSymbols.find { (it.fir as? FirProperty)?.isVar == true }?.fir?.safeAs() + return overriddenSymbols.find { (it.fir as? FirProperty)?.isVar == true }?.fir as? FirMemberDeclaration? } private fun FirCallableMemberDeclaration.checkVisibility( @@ -178,7 +178,7 @@ object FirOverrideChecker : FirClassChecker() { AbstractTypeChecker.isSubtypeOf(typeCheckerContext, overridingReturnType, overriddenReturnType) if (!isReturnTypeOkForOverride) { - return overriddenDeclaration.safeAs() + return overriddenDeclaration as? FirMemberDeclaration } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUpperBoundViolatedExpressionChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUpperBoundViolatedExpressionChecker.kt index a46b6be897e..6e8ffc614d8 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUpperBoundViolatedExpressionChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUpperBoundViolatedExpressionChecker.kt @@ -29,7 +29,7 @@ object FirUpperBoundViolatedExpressionChecker : FirQualifiedAccessExpressionChec val calleReference = expression.calleeReference var calleeFir: FirTypeParameterRefsOwner? = null if (calleReference is FirResolvedNamedReference) { - calleeFir = calleReference.safeAs()?.resolvedSymbol?.fir.safeAs() + calleeFir = calleReference.safeAs()?.resolvedSymbol?.fir as? FirTypeParameterRefsOwner } else if (calleReference is FirErrorNamedReference) { val diagnostic = calleReference.diagnostic if (diagnostic is ConeInapplicableCandidateError && @@ -37,7 +37,7 @@ object FirUpperBoundViolatedExpressionChecker : FirQualifiedAccessExpressionChec ) { return } - calleeFir = calleReference.candidateSymbol?.fir.safeAs() + calleeFir = calleReference.candidateSymbol?.fir as? FirTypeParameterRefsOwner } var typeArguments: List? = null @@ -61,4 +61,4 @@ object FirUpperBoundViolatedExpressionChecker : FirQualifiedAccessExpressionChec typeArgumentRefsAndSources ) } -} \ No newline at end of file +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt index ede1afd9e39..9f4749f0c63 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt @@ -66,7 +66,7 @@ private fun ConeDiagnostic.toFirDiagnostic( is FirBackingFieldSymbol -> FirErrors.VAL_REASSIGNMENT_VIA_BACKING_FIELD_ERROR.createOn(source, symbol.fir.symbol) else -> FirErrors.VAL_REASSIGNMENT.createOn(source, symbol) } - is ConeUnexpectedTypeArgumentsError -> FirErrors.TYPE_ARGUMENTS_NOT_ALLOWED.createOn(this.source.safeAs() ?: source) + is ConeUnexpectedTypeArgumentsError -> FirErrors.TYPE_ARGUMENTS_NOT_ALLOWED.createOn(this.source as? FirSourceElement ?: source) is ConeIllegalAnnotationError -> FirErrors.NOT_AN_ANNOTATION_CLASS.createOn(source, this.name.asString()) is ConeWrongNumberOfTypeArgumentsError -> FirErrors.WRONG_NUMBER_OF_TYPE_ARGUMENTS.createOn(qualifiedAccessSource ?: source, this.desiredCount, this.type) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt index 0189231dca6..b59b8a6c599 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt @@ -88,7 +88,7 @@ private fun T.getDeprecationForCallSite( private fun FirAnnotationCall.getStringArgument(name: Name): String? = findArgumentByName(name)?.let { expression -> - expression.safeAs>()?.value.safeAs() + expression.safeAs>()?.value as? String } private fun FirAnnotationCall.getVersionFromArgument(name: Name): ApiVersion? = diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt index 1f4948a86ed..968ce9fd337 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt @@ -435,7 +435,9 @@ class DiagnosticReporterByTrackingStrategy( error as CapturedTypeFromSubtyping val position = error.position val argumentPosition: ArgumentConstraintPositionImpl? = - position.safeAs() ?: position.safeAs()?.from.safeAs() + position.safeAs() + ?: position.safeAs() + ?.from.safeAs() argumentPosition?.let { val expression = it.argument.psiExpression ?: return diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionCallbacksImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionCallbacksImpl.kt index 38889cd1546..f6a212d2efc 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionCallbacksImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionCallbacksImpl.kt @@ -281,7 +281,7 @@ class KotlinResolutionCallbacksImpl( private fun findCommonParent(callElement: KtExpression, receiver: ReceiverKotlinCallArgument?): KtExpression { if (receiver == null) return callElement - return PsiTreeUtil.findCommonParent(callElement, receiver.psiExpression)?.safeAs() ?: callElement + return PsiTreeUtil.findCommonParent(callElement, receiver.psiExpression) as? KtExpression? ?: callElement } override fun getExpectedTypeFromAsExpressionAndRecordItInTrace(resolvedAtom: ResolvedCallAtom): UnwrappedType? { diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt index e8ba59dbb81..d21f689039b 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt @@ -684,8 +684,8 @@ fun KtExpression.getBinaryWithTypeParent(): KtBinaryExpressionWithTypeRHS? { fun KtExpression.topParenthesizedParentOrMe(): KtExpression { var result: KtExpression = this - while (KtPsiUtil.deparenthesizeOnce(result.parent.safeAs()) == result) { - result = result.parent.safeAs() ?: break + while (KtPsiUtil.deparenthesizeOnce(result.parent as? KtExpression) == result) { + result = result.parent as? KtExpression ?: break } return result } @@ -711,4 +711,4 @@ tailrec fun KtTypeElement.unwrapNullability(): KtTypeElement? { is KtDefinitelyNotNullType -> this.innerType?.unwrapNullability() else -> this } -} \ No newline at end of file +}