Skip to content

Commit 8123892

Browse files
committed
feat(javascript): add JavaScriptClassContextBuilder and update JSPsiUtil
- 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.
1 parent 75e809c commit 8123892

File tree

2 files changed

+30
-18
lines changed

2 files changed

+30
-18
lines changed

javascript/src/main/kotlin/cc/unitmesh/ide/javascript/provider/testing/JSWriteTestService.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cc.unitmesh.ide.javascript.provider.testing
33
import cc.unitmesh.devti.context.ClassContext
44
import cc.unitmesh.devti.provider.WriteTestService
55
import cc.unitmesh.devti.provider.context.TestFileContext
6+
import cc.unitmesh.ide.javascript.context.JavaScriptClassContextBuilder
67
import cc.unitmesh.ide.javascript.util.LanguageApplicableUtil
78
import cc.unitmesh.ide.javascript.util.JSPsiUtil
89
import com.intellij.execution.configurations.RunProfile
@@ -11,7 +12,6 @@ import com.intellij.lang.javascript.psi.*
1112
import com.intellij.lang.javascript.psi.ecmal4.JSClass
1213
import com.intellij.openapi.application.ReadAction
1314
import com.intellij.openapi.application.runReadAction
14-
import com.intellij.openapi.application.runWriteAction
1515
import com.intellij.openapi.command.WriteCommandAction
1616
import com.intellij.openapi.project.Project
1717
import com.intellij.openapi.project.guessProjectDir
@@ -51,7 +51,9 @@ class JSWriteTestService : WriteTestService() {
5151
PsiFileFactory.getInstance(project).createFileFromText(testFileName, language, testFileText)
5252
}
5353

54-
return TestFileContext(true, testFilePsi.virtualFile, emptyList(), elementName, language, null)
54+
val currentClz = JavaScriptClassContextBuilder().getClassContext(elementToTest, false)
55+
56+
return TestFileContext(true, testFilePsi.virtualFile, emptyList(), elementName, language, currentClz)
5557
}
5658

5759
override fun lookupRelevantClass(project: Project, element: PsiElement): List<ClassContext> {

javascript/src/main/kotlin/cc/unitmesh/ide/javascript/util/JSPsiUtil.kt

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,28 @@ import com.intellij.psi.util.parents
1414

1515
object JSPsiUtil {
1616
fun isExportedFileFunction(element: PsiElement): Boolean {
17-
val parent = element.parent
18-
19-
if ((parent is JSFile) || (parent is JSEmbeddedContent)) {
20-
return when (element) {
21-
is JSVarStatement -> {
22-
val variables = element.variables
23-
val variable = variables.firstOrNull()
24-
variable != null && variable.initializerOrStub is JSFunction && exported(variable)
17+
when (val parent = element.parent) {
18+
is JSFile, is JSEmbeddedContent -> {
19+
return when (element) {
20+
is JSVarStatement -> {
21+
val variables = element.variables
22+
val variable = variables.firstOrNull() ?: return false
23+
variable.initializerOrStub is JSFunction && exported(variable)
24+
}
25+
26+
is JSFunction -> exported(element)
27+
else -> false
2528
}
29+
}
30+
31+
is JSVariable -> {
32+
val varStatement = parent.parent as? JSVarStatement ?: return false
33+
return varStatement.parent is JSFile && exported(parent)
34+
}
2635

27-
is JSFunction -> exported(element)
28-
else -> false
36+
else -> {
37+
return parent is ES6ExportDefaultAssignment
2938
}
30-
} else if (parent is JSVariable) {
31-
val varStatement = parent.parent as? JSVarStatement
32-
return varStatement != null && varStatement.parent is JSFile && exported(parent)
33-
} else {
34-
return parent is ES6ExportDefaultAssignment
3539
}
3640
}
3741

@@ -58,7 +62,7 @@ object JSPsiUtil {
5862
}
5963
}
6064

61-
fun exported(element: PsiElement): Boolean {
65+
private fun exported(element: PsiElement): Boolean {
6266
if (element !is JSElementBase) return false
6367

6468
if (element.isExported || element.isExportedWithDefault) {
@@ -91,6 +95,12 @@ object JSPsiUtil {
9195
return jSVariable.name
9296
}
9397

98+
/**
99+
* Determines whether the given [element] is a private member.
100+
*
101+
* @param element the PSI element to check
102+
* @return `true` if the element is a private member, `false` otherwise
103+
*/
94104
fun isPrivateMember(element: PsiElement): Boolean {
95105
if (element is JSQualifiedNamedElement && element.isPrivateName) {
96106
return true

0 commit comments

Comments
 (0)