Improve error reporting in fir benchmark function

This commit is contained in:
Simon Ogorodnik
2019-03-20 20:04:50 +03:00
committed by Mikhail Glukhikh
parent a5ca8ffe69
commit f453e7df27
@@ -32,35 +32,43 @@ fun doFirResolveTestBench(
val timePerTransformer = mutableMapOf<KClass<*>, Long>() val timePerTransformer = mutableMapOf<KClass<*>, Long>()
val counterPerTransformer = mutableMapOf<KClass<*>, Long>() val counterPerTransformer = mutableMapOf<KClass<*>, Long>()
val totalLength = 0
var resolvedTypes = 0 var resolvedTypes = 0
var errorTypes = 0 var errorTypes = 0
var unresolvedTypes = 0 var unresolvedTypes = 0
val fails = mutableListOf<Pair<KClass<*>, Throwable>>()
try { try {
for ((stage, transformer) in transformers.withIndex()) { for ((stage, transformer) in transformers.withIndex()) {
println("Starting stage #$stage. $transformer") println("Starting stage #$stage. $transformer")
val firFileSequence = if (withProgress) firFiles.progress(" ~ ") else firFiles.asSequence() val firFileSequence = if (withProgress) firFiles.progress(" ~ ") else firFiles.asSequence()
for (firFile in firFileSequence) { for (firFile in firFileSequence) {
var fail = false
val time = measureNanoTime { val time = measureNanoTime {
try { try {
transformer.transformFile(firFile, null) transformer.transformFile(firFile, null)
} catch (e: Throwable) { } catch (e: Throwable) {
val ktFile = firFile.psi as KtFile val ktFile = firFile.psi as KtFile
println("Fail in file: ${ktFile.virtualFilePath}") println("Fail in file: ${ktFile.virtualFilePath}")
println(ktFile.text) fail = true
throw e fails += transformer::class to e
//println(ktFile.text)
//throw e
} }
} }
timePerTransformer.merge(transformer::class, time) { a, b -> a + b } if (!fail) {
counterPerTransformer.merge(transformer::class, 1) { a, b -> a + b } timePerTransformer.merge(transformer::class, time) { a, b -> a + b }
counterPerTransformer.merge(transformer::class, 1) { a, b -> a + b }
}
//totalLength += StringBuilder().apply { FirRenderer(this).visitFile(firFile) }.length //totalLength += StringBuilder().apply { FirRenderer(this).visitFile(firFile) }.length
} }
} }
if (fails.none()) {
println("SUCCESS!") println("SUCCESS!")
} else {
println("ERROR!")
}
} finally { } finally {
var implicitTypes = 0 var implicitTypes = 0
@@ -81,9 +89,10 @@ fun doFirResolveTestBench(
} }
val line = (document?.getLineNumber(psi.startOffset) ?: 0) val line = (document?.getLineNumber(psi.startOffset) ?: 0)
val char = psi.startOffset - (document?.getLineStartOffset(line) ?: 0) val char = psi.startOffset - (document?.getLineStartOffset(line) ?: 0)
val report = "u: ${psi.containingFile?.virtualFile?.path}: (${line + 1}:$char): $problem" val report = "e: ${psi.containingFile?.virtualFile?.path}: (${line + 1}:$char): $problem"
errorTypesReports[problem] = report errorTypesReports[problem] = report
} }
override fun visitElement(element: FirElement) { override fun visitElement(element: FirElement) {
element.acceptChildren(this) element.acceptChildren(this)
} }
@@ -93,7 +102,7 @@ fun doFirResolveTestBench(
if (typeRef.psi != null) { if (typeRef.psi != null) {
val psi = typeRef.psi!! val psi = typeRef.psi!!
val problem = typeRef.renderWithType() val problem = "${typeRef::class.simpleName}: ${typeRef.render()}"
reportProblem(problem, psi) reportProblem(problem, psi)
} }
} }
@@ -105,8 +114,9 @@ fun doFirResolveTestBench(
if (resolvedTypeRef.psi == null) { if (resolvedTypeRef.psi == null) {
implicitTypes++ implicitTypes++
} else { } else {
errorTypes++
val psi = resolvedTypeRef.psi!! val psi = resolvedTypeRef.psi!!
val problem = "$type with psi `${psi.text}`" val problem = "${resolvedTypeRef::class.simpleName} -> ${type::class.simpleName}: ${type.render()}"
reportProblem(problem, psi) reportProblem(problem, psi)
} }
} }
@@ -118,8 +128,6 @@ fun doFirResolveTestBench(
println(it.value) println(it.value)
} }
println("TOTAL LENGTH: $totalLength")
println("UNRESOLVED TYPES: $unresolvedTypes") println("UNRESOLVED TYPES: $unresolvedTypes")
println("RESOLVED TYPES: $resolvedTypes") println("RESOLVED TYPES: $resolvedTypes")
println("GOOD TYPES: ${resolvedTypes - errorTypes}") println("GOOD TYPES: ${resolvedTypes - errorTypes}")
@@ -131,7 +139,12 @@ fun doFirResolveTestBench(
timePerTransformer.forEach { (transformer, time) -> timePerTransformer.forEach { (transformer, time) ->
val counter = counterPerTransformer[transformer]!! val counter = counterPerTransformer[transformer]!!
println("${transformer.simpleName}, TIME: ${time * 1e-6} ms, TIME PER FILE: ${(time / counter) * 1e-6} ms, FILES: $counter") println("${transformer.simpleName}, TIME: ${time * 1e-6} ms, TIME PER FILE: ${(time / counter) * 1e-6} ms, FILES: OK/E/T $counter/${firFiles.size - counter}/${firFiles.size}")
}
if (fails.any()) {
val (transformerClass, failure) = fails.first()
throw AssertionError("Failures detected in ${transformerClass.simpleName}", failure)
} }
} }
} }