FIR: report VARARG_OUTSIDE_PARENTHESES
This commit is contained in:
committed by
TeamCityServer
parent
20aef57677
commit
89ce629352
+2
@@ -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)
|
||||||
|
|||||||
+2
@@ -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)
|
||||||
|
|||||||
+7
-2
@@ -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, *> {
|
||||||
@@ -126,4 +131,4 @@ private fun ConeSimpleDiagnostic.getFactory(): FirDiagnosticFactory0<FirSourceEl
|
|||||||
DiagnosticKind.Other -> FirErrors.OTHER_ERROR
|
DiagnosticKind.Other -> FirErrors.OTHER_ERROR
|
||||||
else -> throw IllegalArgumentException("Unsupported diagnostic kind: $kind at $javaClass")
|
else -> throw IllegalArgumentException("Unsupported diagnostic kind: $kind at $javaClass")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -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() {
|
||||||
|
|||||||
+7
@@ -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 ->
|
||||||
|
|||||||
+6
-1
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+9
-1
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user