Skip to content

Intellij IDEA IU plugin size fix #1422

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Nov 25, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.intellij.lang.javascript.psi.JSFile
import com.intellij.lang.javascript.refactoring.util.JSMemberInfo
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import org.utbot.framework.codegen.TestFramework
import org.utbot.framework.codegen.domain.TestFramework
import org.utbot.intellij.plugin.models.BaseTestsModel
import service.CoverageMode
import settings.JsTestGenerationSettings.defaultTimeout
Expand Down
15 changes: 3 additions & 12 deletions utbot-js/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,8 @@ dependencies {
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.1")
api(project(":utbot-framework"))
implementation(project(":utbot-fuzzers"))
// https://mvnrepository.com/artifact/org.graalvm.js/js
implementation(group = "org.graalvm.js", name = "js", version = "22.1.0.1")

// https://mvnrepository.com/artifact/org.graalvm.js/js-scriptengine
implementation(group = "org.graalvm.js", name = "js-scriptengine", version = "22.1.0.1")

// https://mvnrepository.com/artifact/org.graalvm.truffle/truffle-api
implementation(group = "org.graalvm.truffle", name = "truffle-api", version = "22.1.0.1")

// https://mvnrepository.com/artifact/org.graalvm.sdk/graal-sdk
implementation(group = "org.graalvm.sdk", name = "graal-sdk", version = "22.1.0.1")
// https://mvnrepository.com/artifact/com.google.javascript/closure-compiler
implementation("com.google.javascript:closure-compiler:v20221102")

// https://mvnrepository.com/artifact/org.json/json
implementation(group = "org.json", name = "json", version = "20220320")
Expand All @@ -52,4 +43,4 @@ dependencies {
implementation("org.functionaljava:functionaljava-quickcheck:5.0")
implementation("org.functionaljava:functionaljava-java-core:5.0")
implementation(group = "org.apache.commons", name = "commons-text", version = apacheCommonsTextVersion)
}
}
87 changes: 34 additions & 53 deletions utbot-js/src/main/kotlin/api/JsTestGenerator.kt
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
package api

import codegen.JsCodeGenerator
import com.oracle.js.parser.ErrorManager
import com.oracle.js.parser.Parser
import com.oracle.js.parser.ScriptEnvironment
import com.oracle.js.parser.Source
import com.oracle.js.parser.ir.ClassNode
import com.oracle.js.parser.ir.FunctionNode
import com.google.javascript.jscomp.Compiler
import com.google.javascript.jscomp.SourceFile
import com.google.javascript.rhino.Node
import framework.api.js.JsClassId
import framework.api.js.JsMethodId
import framework.api.js.JsMultipleClassId
import framework.api.js.util.isJsBasic
import framework.api.js.util.jsErrorClassId
import fuzzer.JsFuzzer
import fuzzer.providers.JsObjectModelProvider
import org.graalvm.polyglot.Context
import org.utbot.framework.codegen.model.constructor.CgMethodTestSet
import java.io.File
import org.utbot.framework.codegen.domain.models.CgMethodTestSet
import org.utbot.framework.plugin.api.EnvironmentModels
import org.utbot.framework.plugin.api.ExecutableId
import org.utbot.framework.plugin.api.UtAssembleModel
Expand All @@ -25,10 +22,8 @@ import org.utbot.framework.plugin.api.UtExecutionResult
import org.utbot.framework.plugin.api.UtExecutionSuccess
import org.utbot.framework.plugin.api.UtExplicitlyThrownException
import org.utbot.framework.plugin.api.UtModel
import org.utbot.framework.plugin.api.util.UtContext
import org.utbot.framework.plugin.api.util.isStatic
import org.utbot.framework.plugin.api.util.voidClassId
import org.utbot.framework.plugin.api.util.withUtContext
import org.utbot.fuzzer.FuzzedConcreteValue
import org.utbot.fuzzer.FuzzedMethodDescription
import org.utbot.fuzzer.FuzzedValue
Expand All @@ -37,6 +32,11 @@ import parser.JsClassAstVisitor
import parser.JsFunctionAstVisitor
import parser.JsFuzzerAstVisitor
import parser.JsParserUtils
import parser.JsParserUtils.getAbstractFunctionName
import parser.JsParserUtils.getAbstractFunctionParams
import parser.JsParserUtils.getClassMethods
import parser.JsParserUtils.getClassName
import parser.JsParserUtils.getParamName
import parser.JsToplevelFunctionAstVisitor
import service.CoverageServiceProvider
import service.ServiceContext
Expand All @@ -46,7 +46,6 @@ import settings.JsTestGenerationSettings.dummyClassName
import utils.PathResolver
import utils.constructClass
import utils.toJsAny
import java.io.File


class JsTestGenerator(
Expand All @@ -62,7 +61,7 @@ class JsTestGenerator(

private val exports = mutableSetOf<String>()

private lateinit var parsedFile: FunctionNode
private lateinit var parsedFile: Node

private val utbotDir = "utbotJs"

Expand Down Expand Up @@ -97,7 +96,7 @@ class JsTestGenerator(
parsedFile = parsedFile,
strict = selectedMethods?.isNotEmpty() ?: false
)
parentClassName = classNode?.ident?.name?.toString()
parentClassName = classNode?.getClassName()
val classId = makeJsClassId(classNode, ternService)
val methods = makeMethodsToTest()
if (methods.isEmpty()) throw IllegalArgumentException("No methods to test were found!")
Expand All @@ -115,14 +114,14 @@ class JsTestGenerator(

private fun makeTestsForMethod(
classId: JsClassId,
funcNode: FunctionNode,
classNode: ClassNode?,
funcNode: Node,
classNode: Node?,
context: ServiceContext,
testSets: MutableList<CgMethodTestSet>,
paramNames: MutableMap<ExecutableId, List<String>>
) {
val execId = classId.allMethods.find {
it.name == funcNode.name.toString()
it.name == funcNode.getAbstractFunctionName()
} ?: throw IllegalStateException()
manageExports(classNode, funcNode, execId)
val (concreteValues, fuzzedValues) = runFuzzer(funcNode, execId)
Expand Down Expand Up @@ -167,7 +166,7 @@ class JsTestGenerator(
executions = testsForGenerator,
)
testSets += testSet
paramNames[execId] = funcNode.parameters.map { it.name.toString() }
paramNames[execId] = funcNode.getAbstractFunctionParams().map { it.getParamName() }
}

private fun makeImportPrefix(): String {
Expand Down Expand Up @@ -231,15 +230,15 @@ class JsTestGenerator(
}

private fun runFuzzer(
funcNode: FunctionNode,
funcNode: Node,
execId: JsMethodId
): Pair<Set<FuzzedConcreteValue>, List<List<FuzzedValue>>> {
val fuzzerVisitor = JsFuzzerAstVisitor()
funcNode.body.accept(fuzzerVisitor)
fuzzerVisitor.accept(funcNode)
val methodUnderTestDescription =
FuzzedMethodDescription(execId, fuzzerVisitor.fuzzedConcreteValues).apply {
compilableName = funcNode.name.toString()
val names = funcNode.parameters.map { it.name.toString() }
compilableName = funcNode.getAbstractFunctionName()
val names = funcNode.getAbstractFunctionParams().map { it.getParamName() }
parameterNameMap = { index -> names.getOrNull(index) }
}
val fuzzedValues =
Expand All @@ -248,28 +247,27 @@ class JsTestGenerator(
}

private fun manageExports(
classNode: ClassNode?,
funcNode: FunctionNode,
classNode: Node?,
funcNode: Node,
execId: JsMethodId
) {
val obligatoryExport = (classNode?.ident?.name ?: funcNode.ident.name).toString()
val obligatoryExport = (classNode?.getClassName() ?: funcNode.getAbstractFunctionName()).toString()
val collectedExports = collectExports(execId)
exports += (collectedExports + obligatoryExport)
exportsManager(exports.toList())
}

private fun makeMethodsToTest(): List<FunctionNode> {
private fun makeMethodsToTest(): List<Node> {
return selectedMethods?.map {
getFunctionNode(
focusedMethodName = it,
parentClassName = parentClassName,
fileText = fileText
)
} ?: getMethodsToTest()
}

private fun makeJsClassId(
classNode: ClassNode?,
classNode: Node?,
ternService: TernService
): JsClassId {
return classNode?.let {
Expand All @@ -280,21 +278,12 @@ class JsTestGenerator(
)
}

private fun runParser(fileText: String): FunctionNode {
// Fixes problem with Graal.polyglot missing from classpath, resulting in error.
withUtContext(UtContext(Context::class.java.classLoader)) {
val parser = Parser(
ScriptEnvironment.builder().build(),
Source.sourceFor("jsFile", fileText),
ErrorManager.ThrowErrorManager()
)
return parser.parse()
}
}
private fun runParser(fileText: String): Node =
Compiler().parse(SourceFile.fromCode("jsFile", fileText))

private fun extractToplevelFunctions(): List<FunctionNode> {
private fun extractToplevelFunctions(): List<Node> {
val visitor = JsToplevelFunctionAstVisitor()
parsedFile.body.accept(visitor)
visitor.accept(parsedFile)
return visitor.extractedMethods
}

Expand All @@ -321,18 +310,12 @@ class JsTestGenerator(
return resultList
}

private fun getFunctionNode(focusedMethodName: String, parentClassName: String?, fileText: String): FunctionNode {
val parser = Parser(
ScriptEnvironment.builder().build(),
Source.sourceFor("jsFile", fileText),
ErrorManager.ThrowErrorManager()
)
val fileNode = parser.parse()
private fun getFunctionNode(focusedMethodName: String, parentClassName: String?): Node {
val visitor = JsFunctionAstVisitor(
focusedMethodName,
if (parentClassName != dummyClassName) parentClassName else null
)
fileNode.accept(visitor)
visitor.accept(parsedFile)
return visitor.targetFunctionNode
}

Expand All @@ -343,12 +326,10 @@ class JsTestGenerator(
getClassMethods("")
}

private fun getClassMethods(className: String): List<FunctionNode> {
private fun getClassMethods(className: String): List<Node> {
val visitor = JsClassAstVisitor(className)
parsedFile.body.accept(visitor)
visitor.accept(parsedFile)
val classNode = JsParserUtils.searchForClassDecl(className, parsedFile)
return classNode?.classElements?.filter {
it.value is FunctionNode
}?.map { it.value as FunctionNode } ?: throw IllegalStateException("Can't extract methods of class $className")
return classNode?.getClassMethods() ?: throw IllegalStateException("Can't extract methods of class $className")
}
}
32 changes: 17 additions & 15 deletions utbot-js/src/main/kotlin/codegen/JsCodeGenerator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,24 @@ package codegen

import framework.codegen.JsCgLanguageAssistant
import framework.codegen.Mocha
import org.utbot.framework.codegen.ForceStaticMocking
import org.utbot.framework.codegen.HangingTestsTimeout
import org.utbot.framework.codegen.ParametrizedTestSource
import org.utbot.framework.codegen.RegularImport
import org.utbot.framework.codegen.RuntimeExceptionTestsBehaviour
import org.utbot.framework.codegen.StaticsMocking
import org.utbot.framework.codegen.TestFramework
import org.utbot.framework.codegen.model.CodeGeneratorResult
import org.utbot.framework.codegen.model.constructor.CgMethodTestSet
import org.utbot.framework.codegen.model.constructor.TestClassModel
import org.utbot.framework.codegen.model.constructor.context.CgContext
import org.utbot.framework.codegen.model.constructor.tree.CgTestClassConstructor
import org.utbot.framework.codegen.model.visitor.CgAbstractRenderer
import org.utbot.framework.plugin.api.CodegenLanguage
import org.utbot.framework.plugin.api.ExecutableId
import org.utbot.framework.plugin.api.MockFramework
import framework.api.js.JsClassId
import org.utbot.framework.codegen.CodeGeneratorResult
import org.utbot.framework.codegen.domain.ForceStaticMocking
import org.utbot.framework.codegen.domain.HangingTestsTimeout
import org.utbot.framework.codegen.domain.ParametrizedTestSource
import org.utbot.framework.codegen.domain.RegularImport
import org.utbot.framework.codegen.domain.RuntimeExceptionTestsBehaviour
import org.utbot.framework.codegen.domain.StaticsMocking
import org.utbot.framework.codegen.domain.TestFramework
import org.utbot.framework.codegen.domain.context.CgContext
import org.utbot.framework.codegen.domain.models.CgClassFile
import org.utbot.framework.codegen.domain.models.CgMethodTestSet
import org.utbot.framework.codegen.domain.models.TestClassModel
import org.utbot.framework.codegen.renderer.CgAbstractRenderer
import org.utbot.framework.codegen.tree.CgTestClassConstructor
import settings.JsTestGenerationSettings.fileUnderTestAliases

class JsCodeGenerator(
Expand Down Expand Up @@ -60,8 +61,9 @@ class JsCodeGenerator(
testClassCustomName: String? = null,
): CodeGeneratorResult = withCustomContext(testClassCustomName) {
val testClassModel = TestClassModel(classUnderTest, cgTestSets)
val testClassFile = CgTestClassConstructor(context).construct(testClassModel)
CodeGeneratorResult(renderClassFile(testClassFile), testClassFile.testsGenerationReport)
val astConstructor = CgTestClassConstructor(context)
val testClassFile = astConstructor.construct(testClassModel)
CodeGeneratorResult(renderClassFile(testClassFile), astConstructor.testsGenerationReport)
}

private fun <R> withCustomContext(testClassCustomName: String? = null, block: () -> R): R {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ import framework.codegen.model.constructor.tree.JsCgMethodConstructor
import framework.codegen.model.constructor.tree.JsCgStatementConstructor
import framework.codegen.model.constructor.tree.JsCgVariableConstructor
import framework.codegen.model.constructor.visitor.CgJsRenderer
import org.utbot.framework.codegen.model.constructor.TestClassContext
import org.utbot.framework.codegen.model.constructor.context.CgContext
import org.utbot.framework.codegen.model.util.CgPrinter
import org.utbot.framework.codegen.model.visitor.CgAbstractRenderer
import org.utbot.framework.codegen.model.visitor.CgRendererContext
import org.utbot.framework.codegen.domain.context.CgContext
import org.utbot.framework.codegen.domain.context.TestClassContext
import org.utbot.framework.codegen.renderer.CgAbstractRenderer
import org.utbot.framework.codegen.renderer.CgPrinter
import org.utbot.framework.codegen.renderer.CgRendererContext
import org.utbot.framework.codegen.services.language.CgLanguageAssistant
import org.utbot.framework.plugin.api.ClassId
import org.utbot.framework.plugin.api.CgLanguageAssistant
import org.utbot.framework.plugin.api.utils.testClassNameGenerator

object JsCgLanguageAssistant : CgLanguageAssistant() {
Expand Down
2 changes: 1 addition & 1 deletion utbot-js/src/main/kotlin/framework/codegen/JsDomain.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package framework.codegen

import org.utbot.framework.codegen.TestFramework
import org.utbot.framework.plugin.api.BuiltinClassId
import org.utbot.framework.plugin.api.BuiltinMethodId
import org.utbot.framework.plugin.api.ClassId
import framework.api.js.JsClassId
import framework.api.js.util.jsErrorClassId
import framework.api.js.util.jsUndefinedClassId
import org.utbot.framework.codegen.domain.TestFramework


object Mocha : TestFramework(id = "Mocha", displayName = "Mocha") {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package framework.codegen

import framework.codegen.model.constructor.tree.MochaManager
import org.utbot.framework.codegen.model.constructor.context.CgContext
import org.utbot.framework.plugin.api.LanguageTestFrameworkManager
import org.utbot.framework.codegen.domain.context.CgContext
import org.utbot.framework.codegen.services.language.LanguageTestFrameworkManager

class JsTestFrameworkManager: LanguageTestFrameworkManager() {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package framework.codegen.model.constructor.tree

import org.utbot.framework.codegen.model.constructor.context.CgContext
import org.utbot.framework.codegen.model.constructor.context.CgContextOwner
import org.utbot.framework.codegen.model.constructor.tree.CgCallableAccessManager
import org.utbot.framework.codegen.model.constructor.tree.CgIncompleteMethodCall
import org.utbot.framework.codegen.model.tree.*
import org.utbot.framework.codegen.model.util.resolve
import org.utbot.framework.codegen.domain.context.CgContext
import org.utbot.framework.codegen.domain.context.CgContextOwner
import org.utbot.framework.codegen.domain.models.CgConstructorCall
import org.utbot.framework.codegen.domain.models.CgExecutableCall
import org.utbot.framework.codegen.domain.models.CgExpression
import org.utbot.framework.codegen.domain.models.CgMethodCall
import org.utbot.framework.codegen.domain.models.CgStaticFieldAccess
import org.utbot.framework.codegen.services.access.CgCallableAccessManager
import org.utbot.framework.codegen.services.access.CgIncompleteMethodCall
import org.utbot.framework.codegen.util.resolve
import org.utbot.framework.plugin.api.ClassId
import org.utbot.framework.plugin.api.ConstructorId
import org.utbot.framework.plugin.api.FieldId
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
package framework.codegen.model.constructor.tree

import org.utbot.framework.codegen.model.constructor.context.CgContext
import org.utbot.framework.codegen.model.constructor.tree.CgMethodConstructor
import org.utbot.framework.codegen.model.tree.CgTestMethod
import org.utbot.framework.codegen.model.tree.CgTestMethodType
import org.utbot.framework.codegen.model.tree.CgValue
import org.utbot.framework.codegen.model.tree.CgVariable
import org.utbot.framework.plugin.api.ConcreteExecutionFailureException
import org.utbot.framework.plugin.api.ConstructorId
import org.utbot.framework.plugin.api.ExecutableId
Expand All @@ -17,6 +11,12 @@ import org.utbot.framework.plugin.api.onSuccess
import org.utbot.framework.plugin.api.util.voidClassId
import org.utbot.framework.util.isUnit
import java.security.AccessControlException
import org.utbot.framework.codegen.domain.context.CgContext
import org.utbot.framework.codegen.domain.models.CgTestMethod
import org.utbot.framework.codegen.domain.models.CgTestMethodType
import org.utbot.framework.codegen.domain.models.CgValue
import org.utbot.framework.codegen.domain.models.CgVariable
import org.utbot.framework.codegen.tree.CgMethodConstructor

class JsCgMethodConstructor(ctx: CgContext) : CgMethodConstructor(ctx) {

Expand Down
Loading