FIR: report VARARG_OUTSIDE_PARENTHESES

This commit is contained in:
Tianyu Geng
2021-03-01 17:54:55 -08:00
committed by TeamCityServer
parent 20aef57677
commit 89ce629352
9 changed files with 49 additions and 19 deletions
@@ -166,6 +166,8 @@ object DIAGNOSTICS_LIST : DiagnosticList() {
val INAPPLICABLE_LATEINIT_MODIFIER by error<FirSourceElement, KtModifierListOwner>(PositioningStrategy.LATEINIT_MODIFIER) { val INAPPLICABLE_LATEINIT_MODIFIER by error<FirSourceElement, KtModifierListOwner>(PositioningStrategy.LATEINIT_MODIFIER) {
parameter<String>("reason") parameter<String>("reason")
} }
val VARARG_OUTSIDE_PARENTHESES by error<FirSourceElement, KtExpression>()
} }
val AMBIGUITY by object : DiagnosticGroup("Ambiguity") { val AMBIGUITY by object : DiagnosticGroup("Ambiguity") {
@@ -145,6 +145,7 @@ object FirErrors {
val NONE_APPLICABLE by error1<FirSourceElement, PsiElement, Collection<AbstractFirBasedSymbol<*>>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) val NONE_APPLICABLE by error1<FirSourceElement, PsiElement, Collection<AbstractFirBasedSymbol<*>>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
val INAPPLICABLE_CANDIDATE by error1<FirSourceElement, PsiElement, AbstractFirBasedSymbol<*>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) val INAPPLICABLE_CANDIDATE by error1<FirSourceElement, PsiElement, AbstractFirBasedSymbol<*>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
val INAPPLICABLE_LATEINIT_MODIFIER by error1<FirSourceElement, KtModifierListOwner, String>(SourceElementPositioningStrategies.LATEINIT_MODIFIER) val INAPPLICABLE_LATEINIT_MODIFIER by error1<FirSourceElement, KtModifierListOwner, String>(SourceElementPositioningStrategies.LATEINIT_MODIFIER)
val VARARG_OUTSIDE_PARENTHESES by error0<FirSourceElement, KtExpression>()
// Ambiguity // Ambiguity
val AMBIGUITY by error1<FirSourceElement, PsiElement, Collection<AbstractFirBasedSymbol<*>>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) val AMBIGUITY by error1<FirSourceElement, PsiElement, Collection<AbstractFirBasedSymbol<*>>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
@@ -173,6 +173,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UPPER_BOUND_VIOLA
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.USELESS_VARARG_ON_PARAMETER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.USELESS_VARARG_ON_PARAMETER
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VAL_REASSIGNMENT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VAL_REASSIGNMENT
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VAL_WITH_SETTER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VAL_WITH_SETTER
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARARG_OUTSIDE_PARENTHESES
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARIABLE_EXPECTED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARIABLE_EXPECTED
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARIABLE_INITIALIZER_IS_REDUNDANT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARIABLE_INITIALIZER_IS_REDUNDANT
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARIABLE_NEVER_READ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.VARIABLE_NEVER_READ
@@ -323,6 +324,7 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension {
map.put(NONE_APPLICABLE, "None of the following functions are applicable: {0}", SYMBOLS) map.put(NONE_APPLICABLE, "None of the following functions are applicable: {0}", SYMBOLS)
map.put(INAPPLICABLE_CANDIDATE, "Inapplicable candidate(s): {0}", SYMBOL) map.put(INAPPLICABLE_CANDIDATE, "Inapplicable candidate(s): {0}", SYMBOL)
map.put(INAPPLICABLE_LATEINIT_MODIFIER, "''lateinit'' modifier {0}", TO_STRING) map.put(INAPPLICABLE_LATEINIT_MODIFIER, "''lateinit'' modifier {0}", TO_STRING)
map.put(VARARG_OUTSIDE_PARENTHESES, "Passing value as a vararg is only allowed inside a parenthesized argument list")
// Ambiguity // Ambiguity
map.put(AMBIGUITY, "Ambiguity between candidates: {0}", SYMBOLS) map.put(AMBIGUITY, "Ambiguity between candidates: {0}", SYMBOLS)
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.isInfix
import org.jetbrains.kotlin.fir.declarations.isOperator import org.jetbrains.kotlin.fir.declarations.isOperator
import org.jetbrains.kotlin.fir.diagnostics.* import org.jetbrains.kotlin.fir.diagnostics.*
import org.jetbrains.kotlin.fir.resolve.calls.InapplicableWrongReceiver import org.jetbrains.kotlin.fir.resolve.calls.InapplicableWrongReceiver
import org.jetbrains.kotlin.fir.resolve.calls.VarargArgumentOutsideParentheses
import org.jetbrains.kotlin.fir.resolve.diagnostics.* import org.jetbrains.kotlin.fir.resolve.diagnostics.*
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
@@ -95,7 +96,11 @@ private fun mapInapplicableCandidateError(
return FirErrors.UNSAFE_CALL.on(source, rootCause.actualType!!) return FirErrors.UNSAFE_CALL.on(source, rootCause.actualType!!)
} }
return FirErrors.INAPPLICABLE_CANDIDATE.on(source, diagnostic.candidate.symbol)
return when (rootCause) {
is VarargArgumentOutsideParentheses -> FirErrors.VARARG_OUTSIDE_PARENTHESES.on(rootCause.argument.source ?: source)
else -> FirErrors.INAPPLICABLE_CANDIDATE.on(source, diagnostic.candidate.symbol)
}
} }
private fun ConeSimpleDiagnostic.getFactory(): FirDiagnosticFactory0<FirSourceElement, *> { private fun ConeSimpleDiagnostic.getFactory(): FirDiagnosticFactory0<FirSourceElement, *> {
+2 -2
View File
@@ -12,6 +12,6 @@ fun test() {
v1({}, {}) v1({}, {})
<!INAPPLICABLE_CANDIDATE!>v1<!>({}, 1, {}) <!INAPPLICABLE_CANDIDATE!>v1<!>({}, 1, {})
v1({}, {}, {it}) v1({}, {}, {it})
<!INAPPLICABLE_CANDIDATE!>v1<!>({}) {} v1({}) <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
<!INAPPLICABLE_CANDIDATE!>v1<!> {} v1 <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
} }
@@ -69,23 +69,23 @@ fun testLambdaArg() {
fun testVararg() { fun testVararg() {
varargFn(1,2,3) varargFn(1,2,3)
<!INAPPLICABLE_CANDIDATE!>varargFn<!> {} varargFn <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
<!INAPPLICABLE_CANDIDATE!>varargFn<!>(1,2,3) {} varargFn(1,2,3) <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
varargFn(1,2,3) // {} varargFn(1,2,3) // {}
<!INAPPLICABLE_CANDIDATE!>varargFn<!>(1,2,3) /* */ {} varargFn(1,2,3) /* */ <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
<!INAPPLICABLE_CANDIDATE!>varargFn<!>(1,2,3) /* varargFn(1,2,3) /*
block comment, no new line block comment, no new line
*/ {} */ <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
<!INAPPLICABLE_CANDIDATE!>varargFn<!>(1,2,3) varargFn(1,2,3)
/* /*
block comment with new line block comment with new line
*/ {} */ <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
<!INAPPLICABLE_CANDIDATE!>varargFn<!>(1,2,3) // comment varargFn(1,2,3) // comment
// comment // comment
{} <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
<!INAPPLICABLE_CANDIDATE!>varargFn<!>(1,2,3) {} {} varargFn(1,2,3) {} <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
<!INAPPLICABLE_CANDIDATE!>varargFn<!>(1,2,3) {} varargFn(1,2,3) {}
{} <!VARARG_OUTSIDE_PARENTHESES!>{}<!>
} }
fun testTwoLambdas() { fun testTwoLambdas() {
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.psi.KtIfExpression import org.jetbrains.kotlin.psi.KtIfExpression
import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.psi.KtModifierListOwner
import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.KtObjectDeclaration
import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtParameter
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtPropertyAccessor
@@ -539,6 +540,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token, token,
) )
} }
add(FirErrors.VARARG_OUTSIDE_PARENTHESES) { firDiagnostic ->
VarargOutsideParenthesesImpl(
firDiagnostic as FirPsiDiagnostic<*>,
token,
)
}
add(FirErrors.AMBIGUITY) { firDiagnostic -> add(FirErrors.AMBIGUITY) { firDiagnostic ->
AmbiguityImpl( AmbiguityImpl(
firDiagnostic.a.map { abstractFirBasedSymbol -> firDiagnostic.a.map { abstractFirBasedSymbol ->
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.psi.KtIfExpression import org.jetbrains.kotlin.psi.KtIfExpression
import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.psi.KtModifierListOwner
import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.KtObjectDeclaration
import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtParameter
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtPropertyAccessor
@@ -389,6 +390,10 @@ sealed class KtFirDiagnostic<PSI: PsiElement> : KtDiagnosticWithPsi<PSI> {
abstract val reason: String abstract val reason: String
} }
abstract class VarargOutsideParentheses : KtFirDiagnostic<KtExpression>() {
override val diagnosticClass get() = VarargOutsideParentheses::class
}
abstract class Ambiguity : KtFirDiagnostic<PsiElement>() { abstract class Ambiguity : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = Ambiguity::class override val diagnosticClass get() = Ambiguity::class
abstract val candidates: List<KtSymbol> abstract val candidates: List<KtSymbol>
@@ -535,7 +540,7 @@ sealed class KtFirDiagnostic<PSI: PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = NonFinalMemberInObject::class override val diagnosticClass get() = NonFinalMemberInObject::class
} }
abstract class ManyCompanionObjects : KtFirDiagnostic<PsiElement>() { abstract class ManyCompanionObjects : KtFirDiagnostic<KtObjectDeclaration>() {
override val diagnosticClass get() = ManyCompanionObjects::class override val diagnosticClass get() = ManyCompanionObjects::class
} }
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.psi.KtIfExpression import org.jetbrains.kotlin.psi.KtIfExpression
import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.psi.KtModifierListOwner
import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.KtObjectDeclaration
import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtParameter
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtPropertyAccessor
@@ -618,6 +619,13 @@ internal class InapplicableLateinitModifierImpl(
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
} }
internal class VarargOutsideParenthesesImpl(
firDiagnostic: FirPsiDiagnostic<*>,
override val token: ValidityToken,
) : KtFirDiagnostic.VarargOutsideParentheses(), KtAbstractFirDiagnostic<KtExpression> {
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
}
internal class AmbiguityImpl( internal class AmbiguityImpl(
override val candidates: List<KtSymbol>, override val candidates: List<KtSymbol>,
firDiagnostic: FirPsiDiagnostic<*>, firDiagnostic: FirPsiDiagnostic<*>,
@@ -857,7 +865,7 @@ internal class NonFinalMemberInObjectImpl(
internal class ManyCompanionObjectsImpl( internal class ManyCompanionObjectsImpl(
firDiagnostic: FirPsiDiagnostic<*>, firDiagnostic: FirPsiDiagnostic<*>,
override val token: ValidityToken, override val token: ValidityToken,
) : KtFirDiagnostic.ManyCompanionObjects(), KtAbstractFirDiagnostic<PsiElement> { ) : KtFirDiagnostic.ManyCompanionObjects(), KtAbstractFirDiagnostic<KtObjectDeclaration> {
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
} }