FIR resolve bench: collect unique problems also from callee, ignore empty problems

This commit is contained in:
Mikhail Glukhikh
2019-11-06 14:03:55 +03:00
parent bd1127cfa3
commit aff9ae2ecf
@@ -8,8 +8,10 @@ import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.diagnostics.FirEmptyDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.impl.FirProviderImpl import org.jetbrains.kotlin.fir.resolve.impl.FirProviderImpl
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -190,10 +192,15 @@ class FirResolveBench(val withProgress: Boolean) {
override fun visitFunctionCall(functionCall: FirFunctionCall) { override fun visitFunctionCall(functionCall: FirFunctionCall) {
val typeRef = functionCall.typeRef val typeRef = functionCall.typeRef
val callee = functionCall.calleeReference
if (typeRef is FirResolvedTypeRef) { if (typeRef is FirResolvedTypeRef) {
val type = typeRef.type val type = typeRef.type
if (type is ConeKotlinErrorType) { if (type is ConeKotlinErrorType) {
errorFunctionCallTypes++ errorFunctionCallTypes++
val psi = callee.psi
if (callee is FirErrorNamedReference && psi != null) {
reportProblem(callee.diagnostic.reason, psi)
}
} }
} }
@@ -202,10 +209,15 @@ class FirResolveBench(val withProgress: Boolean) {
override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression) { override fun visitQualifiedAccessExpression(qualifiedAccessExpression: FirQualifiedAccessExpression) {
val typeRef = qualifiedAccessExpression.typeRef val typeRef = qualifiedAccessExpression.typeRef
val callee = qualifiedAccessExpression.calleeReference
if (typeRef is FirResolvedTypeRef) { if (typeRef is FirResolvedTypeRef) {
val type = typeRef.type val type = typeRef.type
if (type is ConeKotlinErrorType) { if (type is ConeKotlinErrorType) {
errorQualifiedAccessTypes++ errorQualifiedAccessTypes++
val psi = callee.psi
if (callee is FirErrorNamedReference && psi != null) {
reportProblem(callee.diagnostic.reason, psi)
}
} }
} }
@@ -216,6 +228,9 @@ class FirResolveBench(val withProgress: Boolean) {
unresolvedTypes++ unresolvedTypes++
if (typeRef.psi != null) { if (typeRef.psi != null) {
if (typeRef is FirErrorTypeRef && typeRef.diagnostic == FirEmptyDiagnostic) {
return
}
val psi = typeRef.psi!! val psi = typeRef.psi!!
val problem = "${typeRef::class.simpleName}: ${typeRef.render()}" val problem = "${typeRef::class.simpleName}: ${typeRef.render()}"
reportProblem(problem, psi) reportProblem(problem, psi)
@@ -238,6 +253,9 @@ class FirResolveBench(val withProgress: Boolean) {
implicitTypes++ implicitTypes++
} else { } else {
errorTypes++ errorTypes++
if (resolvedTypeRef is FirErrorTypeRef && resolvedTypeRef.diagnostic == FirEmptyDiagnostic) {
return
}
val psi = resolvedTypeRef.psi!! val psi = resolvedTypeRef.psi!!
val problem = "${resolvedTypeRef::class.simpleName} -> ${type::class.simpleName}: ${type.render()}" val problem = "${resolvedTypeRef::class.simpleName} -> ${type::class.simpleName}: ${type.render()}"
reportProblem(problem, psi) reportProblem(problem, psi)