Skip to content

Commit 8ab5cd4

Browse files
committed
feat(javascript): add function signature and props to DsComponent #81
- Added the ability to extract function signature and props from TypeScript function expressions and JS functions. - Updated the `DsComponent` data class to include the new fields `signature` and `props`. - Modified the `ReactPsiUtilTest` to include assertions for the extracted function signature and props.
1 parent b425406 commit 8ab5cd4

File tree

4 files changed

+23
-14
lines changed

4 files changed

+23
-14
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import kotlinx.serialization.Serializable
99
data class DsComponent(
1010
val name: String,
1111
val path: String,
12+
val signature: String = "",
1213
val props: List<String> = emptyList(),
1314
val events: List<String> = emptyList(),
1415
)

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

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cc.unitmesh.ide.javascript.util
33
import cc.unitmesh.ide.javascript.flow.DsComponent
44
import com.intellij.lang.ecmascript6.psi.ES6ExportDeclaration
55
import com.intellij.lang.ecmascript6.psi.ES6ExportDefaultAssignment
6+
import com.intellij.lang.javascript.presentable.JSFormatUtil
67
import com.intellij.lang.javascript.psi.JSFile
78
import com.intellij.lang.javascript.psi.JSFunctionExpression
89
import com.intellij.lang.javascript.psi.JSReferenceExpression
@@ -53,30 +54,36 @@ object ReactPsiUtil {
5354
val funcExpr = PsiTreeUtil.findChildrenOfType(psiElement, TypeScriptFunctionExpression::class.java)
5455
.firstOrNull() ?: return@map null
5556

56-
val map = funcExpr.parameterList?.parameters?.mapNotNull { parameter ->
57-
if (parameter.typeElement != null) {
58-
parameter.typeElement
59-
} else {
60-
null
57+
val signature = JSFormatUtil.buildFunctionSignaturePresentation(funcExpr)
58+
val props: List<String> = funcExpr.parameterList?.parameters?.mapNotNull { parameter ->
59+
val typeElement = parameter.typeElement ?: return@mapNotNull null
60+
when (typeElement) {
61+
is TypeScriptSingleType -> {
62+
val resolve = typeElement.referenceExpression?.resolve()
63+
resolve?.text
64+
}
65+
66+
else -> {
67+
println("unknown type: ${typeElement::class.java}")
68+
null
69+
}
6170
}
6271
} ?: emptyList()
6372

64-
DsComponent(name = name, path)
73+
DsComponent(name = name, path, props = props, signature = signature)
6574
}
6675

6776
is JSVariable -> {
6877
val funcExpr = PsiTreeUtil.findChildrenOfType(psiElement, JSFunctionExpression::class.java)
6978
.firstOrNull() ?: return@map null
7079

71-
val map = funcExpr.parameterList?.parameters?.mapNotNull { parameter ->
80+
val signature = JSFormatUtil.buildFunctionSignaturePresentation(funcExpr)
81+
val props: List<String> = funcExpr.parameterList?.parameters?.mapNotNull { parameter ->
7282
val typeElement = parameter.typeElement ?: return@mapNotNull null
7383
when (typeElement) {
7484
is TypeScriptSingleType -> {
75-
typeElement.referenceExpression?.let {
76-
val resolveReference = JSResolveResult.resolveReference(it).firstOrNull()
77-
println("resolveReference: ${resolveReference?.text}")
78-
resolveReference
79-
}
85+
val resolve = typeElement.referenceExpression?.resolve()
86+
resolve?.text
8087
}
8188

8289
else -> {
@@ -86,7 +93,7 @@ object ReactPsiUtil {
8693
}
8794
} ?: emptyList()
8895

89-
DsComponent(name = name, path)
96+
DsComponent(name = name, path, props = props, signature = signature)
9097
}
9198

9299
else -> {

javascript/src/test/kotlin/cc/unitmesh/ide/javascript/util/JSPsiUtilTest.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package cc.unitmesh.ide.javascript.util;
22

33
import com.intellij.lang.javascript.JavascriptLanguage
4-
import com.intellij.lang.javascript.dialects.TypeScriptLanguageDialect
54
import com.intellij.lang.javascript.psi.JSFunction
65
import com.intellij.lang.javascript.psi.ecmal4.JSClass
76
import com.intellij.psi.PsiFileFactory

javascript/src/test/kotlin/cc/unitmesh/ide/javascript/util/ReactPsiUtilTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,7 @@ class ReactPsiUtilTest : LightPlatformTestCase() {
2424
val result = ReactPsiUtil.tsxComponentToComponent(file as JSFile)
2525

2626
assertEquals(1, result.size)
27+
assertEquals("MyApp", result.first().name)
28+
assertEquals("({ Component, pageProps }: AppProps)", result.first().signature)
2729
}
2830
}

0 commit comments

Comments
 (0)