Skip to content

Commit

Permalink
feat(javascript): add JavaScriptClassContextBuilder and update JSPsiUtil
Browse files Browse the repository at this point in the history
- Add JavaScriptClassContextBuilder to provide class context for JavaScript files.
- Update JSPsiUtil to use when checking if a file function is exported or a member is private.
  • Loading branch information
phodal committed Jan 16, 2024
1 parent 75e809c commit 8123892
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package cc.unitmesh.ide.javascript.provider.testing
import cc.unitmesh.devti.context.ClassContext
import cc.unitmesh.devti.provider.WriteTestService
import cc.unitmesh.devti.provider.context.TestFileContext
import cc.unitmesh.ide.javascript.context.JavaScriptClassContextBuilder
import cc.unitmesh.ide.javascript.util.LanguageApplicableUtil
import cc.unitmesh.ide.javascript.util.JSPsiUtil
import com.intellij.execution.configurations.RunProfile
Expand All @@ -11,7 +12,6 @@ import com.intellij.lang.javascript.psi.*
import com.intellij.lang.javascript.psi.ecmal4.JSClass
import com.intellij.openapi.application.ReadAction
import com.intellij.openapi.application.runReadAction
import com.intellij.openapi.application.runWriteAction
import com.intellij.openapi.command.WriteCommandAction
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.guessProjectDir
Expand Down Expand Up @@ -51,7 +51,9 @@ class JSWriteTestService : WriteTestService() {
PsiFileFactory.getInstance(project).createFileFromText(testFileName, language, testFileText)
}

return TestFileContext(true, testFilePsi.virtualFile, emptyList(), elementName, language, null)
val currentClz = JavaScriptClassContextBuilder().getClassContext(elementToTest, false)

return TestFileContext(true, testFilePsi.virtualFile, emptyList(), elementName, language, currentClz)
}

override fun lookupRelevantClass(project: Project, element: PsiElement): List<ClassContext> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,28 @@ import com.intellij.psi.util.parents

object JSPsiUtil {
fun isExportedFileFunction(element: PsiElement): Boolean {
val parent = element.parent

if ((parent is JSFile) || (parent is JSEmbeddedContent)) {
return when (element) {
is JSVarStatement -> {
val variables = element.variables
val variable = variables.firstOrNull()
variable != null && variable.initializerOrStub is JSFunction && exported(variable)
when (val parent = element.parent) {
is JSFile, is JSEmbeddedContent -> {
return when (element) {
is JSVarStatement -> {
val variables = element.variables
val variable = variables.firstOrNull() ?: return false
variable.initializerOrStub is JSFunction && exported(variable)
}

is JSFunction -> exported(element)
else -> false
}
}

is JSVariable -> {
val varStatement = parent.parent as? JSVarStatement ?: return false
return varStatement.parent is JSFile && exported(parent)
}

is JSFunction -> exported(element)
else -> false
else -> {
return parent is ES6ExportDefaultAssignment
}
} else if (parent is JSVariable) {
val varStatement = parent.parent as? JSVarStatement
return varStatement != null && varStatement.parent is JSFile && exported(parent)
} else {
return parent is ES6ExportDefaultAssignment
}
}

Expand All @@ -58,7 +62,7 @@ object JSPsiUtil {
}
}

fun exported(element: PsiElement): Boolean {
private fun exported(element: PsiElement): Boolean {
if (element !is JSElementBase) return false

if (element.isExported || element.isExportedWithDefault) {
Expand Down Expand Up @@ -91,6 +95,12 @@ object JSPsiUtil {
return jSVariable.name
}

/**
* Determines whether the given [element] is a private member.
*
* @param element the PSI element to check
* @return `true` if the element is a private member, `false` otherwise
*/
fun isPrivateMember(element: PsiElement): Boolean {
if (element is JSQualifiedNamedElement && element.isPrivateName) {
return true
Expand Down

0 comments on commit 8123892

Please sign in to comment.