Skip to content

Commit

Permalink
feat: init basic js context provider
Browse files Browse the repository at this point in the history
  • Loading branch information
phodal committed Aug 1, 2023
1 parent 7bb12a6 commit 5164da0
Show file tree
Hide file tree
Showing 10 changed files with 125 additions and 120 deletions.
Expand Up @@ -10,7 +10,7 @@ class GoVersionChatContextProvider : ChatContextProvider {
return true
}

override fun collect(project: Project, creationContext: ChatCreationContext): List<ChatContextItem> {
override suspend fun collect(project: Project, creationContext: ChatCreationContext): List<ChatContextItem> {
TODO("Not yet implemented")
}
}
Expand Up @@ -15,7 +15,7 @@ open class JavaTestContextProvider : ChatContextProvider {

open fun langFileSuffix() = "java"

override fun collect(project: Project, creationContext: ChatCreationContext): List<ChatContextItem> {
override suspend fun collect(project: Project, creationContext: ChatCreationContext): List<ChatContextItem> {
val items = mutableListOf<ChatContextItem>()

val isController = creationContext.sourceFile?.name?.let {
Expand All @@ -35,6 +35,7 @@ open class JavaTestContextProvider : ChatContextProvider {
|You MUST use should_xx style for test method name.""".trimMargin()
items += ChatContextItem(JavaTestContextProvider::class, testControllerPrompt)
}

isService -> {
val testServicePrompt = """
|You MUST use should_xx_xx style for test method name.
Expand Down
Expand Up @@ -13,7 +13,7 @@ import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.util.lang.JavaVersion

class JavaVersionProvider : ChatContextProvider {
override fun collect(
override suspend fun collect(
project: Project,
creationContext: ChatCreationContext
): List<ChatContextItem> {
Expand Down
Expand Up @@ -26,7 +26,7 @@ open class SpringContextProvider : ChatContextProvider {
return false
}

override fun collect(project: Project, creationContext: ChatCreationContext): List<ChatContextItem> {
override suspend fun collect(project: Project, creationContext: ChatCreationContext): List<ChatContextItem> {
val techStacks = prepareLibrary(project)

if (techStacks.coreFrameworks().isEmpty() && techStacks.testFrameworks().isEmpty()) {
Expand Down

This file was deleted.

1 change: 0 additions & 1 deletion kotlin/src/main/resources/cc.unitmesh.kotlin.xml
Expand Up @@ -23,7 +23,6 @@
<variableContextBuilder language="kotlin"
implementationClass="cc.unitmesh.kotlin.context.KotlinVariableContextBuilder"/>

<chatContextProvider implementation="cc.unitmesh.kotlin.provider.KotlinVersionProvider"/>
<chatContextProvider implementation="cc.unitmesh.kotlin.provider.KotlinTestContextProvider"/>

<contextPrompter
Expand Down
@@ -1,6 +1,5 @@
package cc.unitmesh.devti.provider.context

import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.project.Project
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread
Expand All @@ -13,7 +12,7 @@ interface ChatContextProvider {
fun isApplicable(project: Project, creationContext: ChatCreationContext): Boolean

@RequiresBackgroundThread
fun collect(project: Project, creationContext: ChatCreationContext): List<ChatContextItem>
suspend fun collect(project: Project, creationContext: ChatCreationContext): List<ChatContextItem>

fun filterItems(
list: List<ChatContextItem?>,
Expand Down
@@ -0,0 +1,117 @@
package cc.unitmesh.ide.webstorm.provider

import cc.unitmesh.devti.prompting.code.TestStack
import cc.unitmesh.devti.provider.context.ChatContextItem
import cc.unitmesh.devti.provider.context.ChatContextProvider
import cc.unitmesh.devti.provider.context.ChatCreationContext
import com.intellij.javascript.nodejs.PackageJsonData
import com.intellij.javascript.nodejs.PackageJsonDependency
import com.intellij.json.JsonLanguage
import com.intellij.lang.html.HTMLLanguage
import com.intellij.lang.javascript.JavaScriptSupportLoader
import com.intellij.lang.javascript.JavascriptLanguage
import com.intellij.lang.javascript.buildTools.npm.PackageJsonUtil
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.ProjectManager
import com.intellij.openapi.project.guessProjectDir
import com.intellij.psi.PsiFile
import com.intellij.util.PlatformUtils

class JavaScriptContextProvider : ChatContextProvider {
private val supportedLanguages = setOf(JavascriptLanguage.INSTANCE.id, JavaScriptSupportLoader.TYPESCRIPT.id)
override fun isApplicable(project: Project, creationContext: ChatCreationContext): Boolean {
if (PlatformUtils.isWebStorm()) return true

val sourceFile: PsiFile = creationContext.sourceFile ?: return false
val language = sourceFile.language

return supportedLanguages.contains(language.id) || language is HTMLLanguage || language is JsonLanguage
}

override suspend fun collect(project: Project, creationContext: ChatCreationContext): List<ChatContextItem> {
val techStack = prepareLibrary()

val results = mutableListOf<ChatContextItem>()
if (techStack.coreFrameworks().isNotEmpty()) {
results.add(
ChatContextItem(
JavaScriptContextProvider::class,
"The project uses the following JavaScript component frameworks: ${techStack.coreFrameworks()}"
)
)
}

if (techStack.testFrameworks().isNotEmpty()) {
results.add(
ChatContextItem(
JavaScriptContextProvider::class,
"The project uses ${techStack.testFrameworks()} to test."
)
)
}

return results
}


fun prepareLibrary(): TestStack {
val project = ProjectManager.getInstance().openProjects.firstOrNull() ?: return TestStack()

val baseDir = project.guessProjectDir() ?: return TestStack()
val packageFile = PackageJsonUtil.findUpPackageJson(baseDir) ?: return TestStack()
val packageJsonData = PackageJsonData.getOrCreate(packageFile)

val devDependencies = mutableMapOf<String, String>()
val dependencies = mutableMapOf<String, String>()

val frameworks = mutableMapOf<String, Boolean>()
val testFrameworks = mutableMapOf<String, Boolean>()

packageJsonData.allDependencyEntries.forEach { (name, entry) ->
entry.dependencyType.let {
when (it) {
PackageJsonDependency.dependencies -> {
// also remove `eslint`
if (!name.startsWith("@types/")) {
devDependencies[name] = entry.versionRange
}

JsWebFrameworks.values().forEach { framework ->
if (name.startsWith(framework.name) || name == framework.name) {
frameworks[framework.name] = true
}
}
JsTestFrameworks.values().forEach { testFramework ->
if (name.startsWith(testFramework.name) || name == testFramework.name) {
testFrameworks[testFramework.name] = true
}
}
}

PackageJsonDependency.devDependencies -> {
devDependencies[name] = entry.versionRange

JsWebFrameworks.values().forEach { frameworkName ->
if (name.startsWith(frameworkName.name) || name == frameworkName.name) {
frameworks[frameworkName.name] = true
}
}
JsTestFrameworks.values().forEach { testFramework ->
if (name.startsWith(testFramework.name) || name == testFramework.name) {
testFrameworks[testFramework.name] = true
}
}
}

PackageJsonDependency.peerDependencies -> {}
PackageJsonDependency.optionalDependencies -> {}
PackageJsonDependency.bundledDependencies -> {
}
}
}
}


return TestStack(frameworks, testFrameworks, dependencies, devDependencies)
}
}

This file was deleted.

5 changes: 2 additions & 3 deletions webstorm/src/main/resources/cc.unitmesh.webstorm.xml
Expand Up @@ -14,12 +14,11 @@
<variableContextBuilder language="JavaScript"
implementationClass="cc.unitmesh.ide.webstorm.context.JavaScriptVariableContextBuilder"/>

<chatContextProvider implementation="cc.unitmesh.ide.webstorm.provider.JavaScriptContextProvider"/>

<contextPrompter
language="JavaScript"
implementation="cc.unitmesh.ide.webstorm.provider.JavaScriptContextPrompter"/>
<techStackProvider
language="JavaScript"
implementation="cc.unitmesh.ide.webstorm.provider.JavaScriptTechStackService"/>
<devFlowProvider
language="JavaScript"
implementation="cc.unitmesh.ide.webstorm.provider.JavaScriptAutoDevFlow"/>
Expand Down

0 comments on commit 5164da0

Please sign in to comment.