Skip to content

Commit e3a53bf

Browse files
committed
feat(javascript): add new files and modify existing files #81
- Add new file `Sample.tsx` in `javascript/src/test/resources/ts` directory. - Modify file `JSPsiUtil.kt` in `javascript/src/main/kotlin/cc/unitmesh/ide/javascript/util` directory. - Modify file `DsComponent.kt` in `javascript/src/main/kotlin/cc/unitmesh/ide/javascript/flow` directory. - Modify file `ReactAutoPage.kt` in `javascript/src/main/kotlin/cc/unitmesh/ide/javascript/flow` directory. The changes include adding a new class `MyDocument` in `Sample.tsx`, importing `PsiNameIdentifierOwner` in `JSPsiUtil.kt`, modifying the properties of `DsComponent` data class in `DsComponent.kt`, and adding new logic to extract export elements in `ReactAutoPage.kt`.
1 parent e352bc5 commit e3a53bf

File tree

4 files changed

+64
-3
lines changed

4 files changed

+64
-3
lines changed

javascript/src/main/kotlin/cc/unitmesh/ide/javascript/flow/DsComponent.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import kotlinx.serialization.Serializable
88
@Serializable
99
data class DsComponent(
1010
val name: String,
11-
val props: List<String>,
12-
val events: List<String>
11+
val path: String,
12+
val props: List<String> = emptyList(),
13+
val events: List<String> = emptyList(),
1314
)

javascript/src/main/kotlin/cc/unitmesh/ide/javascript/flow/ReactAutoPage.kt

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package cc.unitmesh.ide.javascript.flow
22

3+
import cc.unitmesh.ide.javascript.util.JSPsiUtil
34
import com.intellij.lang.ecmascript6.JSXHarmonyFileType
45
import com.intellij.lang.javascript.JavaScriptFileType
56
import com.intellij.lang.javascript.TypeScriptJSXFileType
67
import com.intellij.lang.javascript.dialects.TypeScriptJSXLanguageDialect
78
import com.intellij.lang.javascript.psi.JSFile
9+
import com.intellij.lang.javascript.psi.ecma6.TypeScriptFunction
10+
import com.intellij.lang.javascript.psi.ecma6.impl.TypeScriptClassImpl
11+
import com.intellij.lang.javascript.psi.ecma6.impl.TypeScriptVariableImpl
812
import com.intellij.openapi.editor.Editor
913
import com.intellij.openapi.project.Project
1014
import com.intellij.openapi.project.guessProjectDir
15+
import com.intellij.psi.PsiNameIdentifierOwner
1116
import com.intellij.psi.search.FileTypeIndex
1217
import com.intellij.psi.search.GlobalSearchScope
1318
import com.intellij.psi.search.ProjectScope
@@ -82,7 +87,28 @@ class ReactAutoPage(
8287
pages.forEach {
8388
when(it.language) {
8489
is TypeScriptJSXLanguageDialect -> {
85-
it.language
90+
val psiElements = JSPsiUtil.getExportElements(it)
91+
// a page can have multiple exports
92+
93+
psiElements.forEach { psiElement ->
94+
val name = psiElement.name ?: return@forEach
95+
val path = it.virtualFile.canonicalPath ?: return@forEach
96+
// is React Functional Component
97+
when (psiElement) {
98+
is TypeScriptFunction -> {
99+
result += DsComponent(name = name, path)
100+
}
101+
is TypeScriptClassImpl -> {
102+
result += DsComponent(name = name, path)
103+
}
104+
is TypeScriptVariableImpl -> {
105+
result += DsComponent(name = name, path)
106+
}
107+
else -> {
108+
println("unknown type: ${psiElement::class.java}")
109+
}
110+
}
111+
}
86112
}
87113
}
88114
}

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.intellij.lang.javascript.psi.util.JSStubBasedPsiTreeUtil
1717
import com.intellij.lang.javascript.psi.util.JSUtils
1818
import com.intellij.openapi.roots.ProjectFileIndex
1919
import com.intellij.psi.PsiElement
20+
import com.intellij.psi.PsiNameIdentifierOwner
2021
import com.intellij.psi.PsiPolyVariantReference
2122
import com.intellij.psi.util.PsiTreeUtil
2223
import com.intellij.psi.util.parents
@@ -56,6 +57,30 @@ object JSPsiUtil {
5657
}
5758
}
5859

60+
fun getExportElements(file: JSFile): List<PsiNameIdentifierOwner> {
61+
val exportDeclarations =
62+
PsiTreeUtil.getChildrenOfTypeAsList(file, ES6ExportDeclaration::class.java)
63+
64+
val map = exportDeclarations.map { exportDeclaration ->
65+
exportDeclaration.exportSpecifiers
66+
.asSequence()
67+
.mapNotNull {
68+
it.alias?.findAliasedElement()
69+
}
70+
.filterIsInstance<PsiNameIdentifierOwner>()
71+
.toList()
72+
}.flatten()
73+
74+
val defaultAssignments = PsiTreeUtil.getChildrenOfTypeAsList(file, ES6ExportDefaultAssignment::class.java)
75+
val defaultAssignment = defaultAssignments.mapNotNull {
76+
val jsReferenceExpression = it.expression as? JSReferenceExpression ?: return@mapNotNull null
77+
val resolveReference = JSResolveResult.resolveReference(jsReferenceExpression)
78+
resolveReference.firstOrNull() as? PsiNameIdentifierOwner
79+
}
80+
81+
return map + defaultAssignment
82+
}
83+
5984
private fun skipDeclaration(element: PsiElement): Boolean {
6085
return when (element) {
6186
is JSParameter, is TypeScriptGenericOrMappedTypeParameter -> true
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class MyDocument {
2+
render() {
3+
return (
4+
<div/>
5+
);
6+
}
7+
}
8+
9+
export default MyDocument;

0 commit comments

Comments
 (0)