[FIR] Report package usages as a LHS
#KT-59972
This commit is contained in:
committed by
Space Team
parent
e999e289ee
commit
70d1a2ea8c
+1
@@ -162,6 +162,7 @@ object CommonExpressionCheckers : ExpressionCheckers() {
|
|||||||
override val resolvedQualifierCheckers: Set<FirResolvedQualifierChecker>
|
override val resolvedQualifierCheckers: Set<FirResolvedQualifierChecker>
|
||||||
get() = setOf(
|
get() = setOf(
|
||||||
FirStandaloneQualifierChecker,
|
FirStandaloneQualifierChecker,
|
||||||
|
FirPackageOnLhsQualifierChecker,
|
||||||
FirOptInUsageQualifierChecker,
|
FirOptInUsageQualifierChecker,
|
||||||
FirDeprecatedQualifierChecker,
|
FirDeprecatedQualifierChecker,
|
||||||
FirVisibilityQualifierChecker,
|
FirVisibilityQualifierChecker,
|
||||||
|
|||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* 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.diagnostics.DiagnosticReporter
|
||||||
|
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.expressions.FirCallableReferenceAccess
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
||||||
|
|
||||||
|
object FirPackageOnLhsQualifierChecker : FirResolvedQualifierChecker() {
|
||||||
|
override fun check(expression: FirResolvedQualifier, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
|
// Check that the expression is a package qualifier
|
||||||
|
if (expression.symbol != null) return
|
||||||
|
|
||||||
|
// Left-Hand Side check
|
||||||
|
val lastCallableReferenceAccess = context.callsOrAssignments.lastOrNull() as? FirCallableReferenceAccess
|
||||||
|
val lastGetClass = context.getClassCalls.lastOrNull()
|
||||||
|
if (lastCallableReferenceAccess?.explicitReceiver !== expression && lastGetClass?.argument !== expression) return
|
||||||
|
|
||||||
|
reporter.reportOn(expression.source, FirErrors.EXPRESSION_EXPECTED_PACKAGE_FOUND, context)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,7 +4,8 @@
|
|||||||
package foo
|
package foo
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
foo::test
|
<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>foo<!>::test
|
||||||
|
<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>foo<!>::class
|
||||||
}
|
}
|
||||||
|
|
||||||
// FILE: qualifiedName.kt
|
// FILE: qualifiedName.kt
|
||||||
@@ -12,5 +13,6 @@ fun test() {
|
|||||||
package foo.bar
|
package foo.bar
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
foo.bar::test
|
foo.<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>bar<!>::test
|
||||||
|
foo.<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>bar<!>::class
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ package foo
|
|||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>foo<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>test<!>
|
<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>foo<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>test<!>
|
||||||
|
<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>foo<!>::class
|
||||||
}
|
}
|
||||||
|
|
||||||
// FILE: qualifiedName.kt
|
// FILE: qualifiedName.kt
|
||||||
@@ -13,4 +14,5 @@ package foo.bar
|
|||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
foo.<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>bar<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>test<!>
|
foo.<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>bar<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>test<!>
|
||||||
|
foo.<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>bar<!>::class
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user