Introduce performance test for light classes building (top-level)
So #KT-24085 In Progress
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. 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.idea.perf
|
||||
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import org.jetbrains.kotlin.asJava.toLightClass
|
||||
import org.jetbrains.kotlin.cfg.pseudocode.containingDeclarationForPseudocode
|
||||
import org.jetbrains.kotlin.idea.refactoring.toPsiFile
|
||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||
import org.jetbrains.kotlin.psi.KtVisitorVoid
|
||||
import kotlin.system.measureNanoTime
|
||||
|
||||
class AllKotlinLightClassTest : WholeProjectPerformanceTest(), WholeProjectKotlinFileProvider {
|
||||
|
||||
override fun doTest(file: VirtualFile): PerFileTestResult {
|
||||
val results = mutableMapOf<String, Long>()
|
||||
var totalNs = 0L
|
||||
|
||||
val psiFile = file.toPsiFile(project) ?: run {
|
||||
return PerFileTestResult(results, totalNs, listOf(AssertionError("PsiFile not found for $file")))
|
||||
}
|
||||
|
||||
val errors = mutableListOf<Throwable>()
|
||||
|
||||
val result = measureNanoTime {
|
||||
try {
|
||||
// Build light class by PsiFile
|
||||
psiFile.acceptRecursively(object : KtVisitorVoid() {
|
||||
override fun visitClassOrObject(classOrObject: KtClassOrObject) {
|
||||
if (classOrObject.containingDeclarationForPseudocode != null) return
|
||||
val lightClass = classOrObject.toLightClass() ?: return
|
||||
lightClass.hashCode()
|
||||
}
|
||||
})
|
||||
|
||||
} catch (t: Throwable) {
|
||||
t.printStackTrace()
|
||||
errors += t
|
||||
}
|
||||
}
|
||||
results["LightClasses_Top"] = result
|
||||
totalNs += result
|
||||
|
||||
return PerFileTestResult(results, totalNs, errors)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. 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.idea.perf
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
|
||||
interface WholeProjectFileProvider {
|
||||
fun provideFiles(project: Project): Collection<VirtualFile>
|
||||
}
|
||||
@@ -19,8 +19,6 @@ import kotlin.system.measureNanoTime
|
||||
|
||||
abstract class WholeProjectInspectionTest : WholeProjectPerformanceTest() {
|
||||
|
||||
abstract override fun provideFiles(): Collection<VirtualFile>
|
||||
|
||||
class ExceptionWhileInspection(inspectionId: String, cause: Throwable) : RuntimeException(inspectionId, cause)
|
||||
|
||||
private lateinit var profileTools: List<Tools>
|
||||
|
||||
+2
-1
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.perf
|
||||
import com.intellij.codeInspection.ex.Tools
|
||||
import com.intellij.ide.highlighter.JavaFileType
|
||||
import com.intellij.lang.java.JavaLanguage
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.roots.ProjectFileIndex
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.intellij.psi.search.DelegatingGlobalSearchScope
|
||||
@@ -17,7 +18,7 @@ import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
|
||||
|
||||
class WholeProjectJavaInspectionTest : WholeProjectInspectionTest() {
|
||||
|
||||
override fun provideFiles(): Collection<VirtualFile> {
|
||||
override fun provideFiles(project: Project): Collection<VirtualFile> {
|
||||
val scope = object : DelegatingGlobalSearchScope(ProjectScope.getContentScope(project)) {
|
||||
val index = ProjectFileIndex.getInstance(myProject)
|
||||
override fun contains(file: VirtualFile): Boolean {
|
||||
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. 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.idea.perf
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.intellij.psi.search.FileTypeIndex
|
||||
import com.intellij.psi.search.ProjectScope
|
||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||
import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope
|
||||
|
||||
interface WholeProjectKotlinFileProvider : WholeProjectFileProvider {
|
||||
override fun provideFiles(project: Project): Collection<VirtualFile> {
|
||||
val scope = KotlinSourceFilterScope.projectSources(ProjectScope.getContentScope(project), project)
|
||||
return FileTypeIndex.getFiles(KotlinFileType.INSTANCE, scope)
|
||||
}
|
||||
}
|
||||
+1
-11
@@ -6,17 +6,7 @@
|
||||
package org.jetbrains.kotlin.idea.perf
|
||||
|
||||
import com.intellij.codeInspection.ex.Tools
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.intellij.psi.search.FileTypeIndex
|
||||
import com.intellij.psi.search.ProjectScope
|
||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||
import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope
|
||||
|
||||
class WholeProjectKotlinInspectionTest : WholeProjectInspectionTest() {
|
||||
override fun provideFiles(): Collection<VirtualFile> {
|
||||
val scope = KotlinSourceFilterScope.projectSources(ProjectScope.getContentScope(project), project)
|
||||
return FileTypeIndex.getFiles(KotlinFileType.INSTANCE, scope)
|
||||
}
|
||||
|
||||
class WholeProjectKotlinInspectionTest : WholeProjectInspectionTest(), WholeProjectKotlinFileProvider {
|
||||
override fun isEnabledInspection(tools: Tools) = tools.tool.language in setOf(null, "kotlin", "UAST")
|
||||
}
|
||||
+2
-11
@@ -9,21 +9,14 @@ import com.intellij.codeInsight.daemon.DaemonAnalyzerTestCase
|
||||
import com.intellij.ide.impl.ProjectUtil
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.application.ex.ApplicationEx
|
||||
import com.intellij.openapi.vfs.VfsUtil
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiElementVisitor
|
||||
import com.intellij.psi.PsiFile
|
||||
import com.intellij.psi.PsiManager
|
||||
import com.intellij.psi.search.FileTypeIndex
|
||||
import com.intellij.psi.search.ProjectScope
|
||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||
import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope
|
||||
import java.io.File
|
||||
import java.io.PrintWriter
|
||||
import java.io.StringWriter
|
||||
|
||||
abstract class WholeProjectPerformanceTest : DaemonAnalyzerTestCase() {
|
||||
abstract class WholeProjectPerformanceTest : DaemonAnalyzerTestCase(), WholeProjectFileProvider {
|
||||
|
||||
private val rootProjectFile: File = File("../perfTestProject").absoluteFile
|
||||
private val statsFile: File = File("build/stats.csv").absoluteFile
|
||||
@@ -43,8 +36,6 @@ abstract class WholeProjectPerformanceTest : DaemonAnalyzerTestCase() {
|
||||
|
||||
protected abstract fun doTest(file: VirtualFile): PerFileTestResult
|
||||
|
||||
abstract fun provideFiles(): Collection<VirtualFile>
|
||||
|
||||
fun testWholeProjectPerformance() {
|
||||
|
||||
tcSuite(this::class.simpleName ?: "Unknown") {
|
||||
@@ -67,7 +58,7 @@ abstract class WholeProjectPerformanceTest : DaemonAnalyzerTestCase() {
|
||||
}
|
||||
|
||||
tcSuite("TotalPerFile") {
|
||||
val files = provideFiles()
|
||||
val files = provideFiles(project)
|
||||
|
||||
files.forEach {
|
||||
val filePath = File(it.path).relativeTo(tmp).path.replace(File.separatorChar, '/')
|
||||
|
||||
Reference in New Issue
Block a user