Skip to content

Commit

Permalink
feat(javascript): add new files and modify existing files #81
Browse files Browse the repository at this point in the history
- 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`.
  • Loading branch information
phodal committed Jan 25, 2024
1 parent e352bc5 commit e3a53bf
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 3 deletions.
Expand Up @@ -8,6 +8,7 @@ import kotlinx.serialization.Serializable
@Serializable
data class DsComponent(
val name: String,
val props: List<String>,
val events: List<String>
val path: String,
val props: List<String> = emptyList(),
val events: List<String> = emptyList(),
)
@@ -1,13 +1,18 @@
package cc.unitmesh.ide.javascript.flow

import cc.unitmesh.ide.javascript.util.JSPsiUtil
import com.intellij.lang.ecmascript6.JSXHarmonyFileType
import com.intellij.lang.javascript.JavaScriptFileType
import com.intellij.lang.javascript.TypeScriptJSXFileType
import com.intellij.lang.javascript.dialects.TypeScriptJSXLanguageDialect
import com.intellij.lang.javascript.psi.JSFile
import com.intellij.lang.javascript.psi.ecma6.TypeScriptFunction
import com.intellij.lang.javascript.psi.ecma6.impl.TypeScriptClassImpl
import com.intellij.lang.javascript.psi.ecma6.impl.TypeScriptVariableImpl
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.guessProjectDir
import com.intellij.psi.PsiNameIdentifierOwner
import com.intellij.psi.search.FileTypeIndex
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.ProjectScope
Expand Down Expand Up @@ -82,7 +87,28 @@ class ReactAutoPage(
pages.forEach {
when(it.language) {
is TypeScriptJSXLanguageDialect -> {
it.language
val psiElements = JSPsiUtil.getExportElements(it)
// a page can have multiple exports

psiElements.forEach { psiElement ->
val name = psiElement.name ?: return@forEach
val path = it.virtualFile.canonicalPath ?: return@forEach
// is React Functional Component
when (psiElement) {
is TypeScriptFunction -> {
result += DsComponent(name = name, path)
}
is TypeScriptClassImpl -> {
result += DsComponent(name = name, path)
}
is TypeScriptVariableImpl -> {
result += DsComponent(name = name, path)
}
else -> {
println("unknown type: ${psiElement::class.java}")
}
}
}
}
}
}
Expand Down
Expand Up @@ -17,6 +17,7 @@ import com.intellij.lang.javascript.psi.util.JSStubBasedPsiTreeUtil
import com.intellij.lang.javascript.psi.util.JSUtils
import com.intellij.openapi.roots.ProjectFileIndex
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiNameIdentifierOwner
import com.intellij.psi.PsiPolyVariantReference
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.psi.util.parents
Expand Down Expand Up @@ -56,6 +57,30 @@ object JSPsiUtil {
}
}

fun getExportElements(file: JSFile): List<PsiNameIdentifierOwner> {
val exportDeclarations =
PsiTreeUtil.getChildrenOfTypeAsList(file, ES6ExportDeclaration::class.java)

val map = exportDeclarations.map { exportDeclaration ->
exportDeclaration.exportSpecifiers
.asSequence()
.mapNotNull {
it.alias?.findAliasedElement()
}
.filterIsInstance<PsiNameIdentifierOwner>()
.toList()
}.flatten()

val defaultAssignments = PsiTreeUtil.getChildrenOfTypeAsList(file, ES6ExportDefaultAssignment::class.java)
val defaultAssignment = defaultAssignments.mapNotNull {
val jsReferenceExpression = it.expression as? JSReferenceExpression ?: return@mapNotNull null
val resolveReference = JSResolveResult.resolveReference(jsReferenceExpression)
resolveReference.firstOrNull() as? PsiNameIdentifierOwner
}

return map + defaultAssignment
}

private fun skipDeclaration(element: PsiElement): Boolean {
return when (element) {
is JSParameter, is TypeScriptGenericOrMappedTypeParameter -> true
Expand Down
9 changes: 9 additions & 0 deletions javascript/src/test/resources/ts/Sample.tsx
@@ -0,0 +1,9 @@
class MyDocument {
render() {
return (
<div/>
);
}
}

export default MyDocument;

0 comments on commit e3a53bf

Please sign in to comment.