Skip to content

Commit d58b435

Browse files
committed
feat(rust): add support for EnumContext
1 parent 085a699 commit d58b435

File tree

6 files changed

+60
-6
lines changed

6 files changed

+60
-6
lines changed

rust/src/233/main/kotlin/cc/unitmesh/rust/context/RustClassContextBuilder.kt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import org.rust.lang.core.psi.RsStructItem
1212
import org.rust.lang.core.psi.ext.RsStructOrEnumItemElement
1313
import org.rust.lang.core.psi.ext.expandedFields
1414
import org.rust.lang.core.psi.ext.implementingType
15+
import org.rust.lang.core.types.asTy
16+
import org.rust.lang.core.types.implLookup
1517

1618
class RustClassContextBuilder : ClassContextBuilder {
1719
override fun getClassContext(psiElement: PsiElement, gatherUsages: Boolean): ClassContext? {
@@ -61,7 +63,22 @@ class RustClassContextBuilder : ClassContextBuilder {
6163
}
6264

6365
is RsEnumItem -> {
64-
// TODO: Implement
66+
val fields = psiElement.enumBody?.enumVariantList?.map { it } ?: emptyList()
67+
// val impls = psiElement.implLookup.findImplsAndTraits(psiElement.asTy()).toList()
68+
// val methods = impls.flatMap {
69+
// it.implementedTrait?.element?.children?.filterIsInstance<RsFunction>() ?: emptyList()
70+
// }
71+
72+
return ClassContext(
73+
psiElement,
74+
psiElement.text,
75+
psiElement.name,
76+
emptyList(),
77+
fields,
78+
emptyList(),
79+
emptyList(),
80+
psiElement.name
81+
)
6582
}
6683
}
6784

rust/src/233/test/kotlin/cc/unitmesh/rust/context/RustClassContextBuilderTest.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.intellij.openapi.application.ApplicationManager
44
import com.intellij.openapi.extensions.ExtensionPoint
55
import com.intellij.psi.util.PsiTreeUtil
66
import com.intellij.testFramework.fixtures.BasePlatformTestCase
7+
import org.rust.lang.core.psi.RsEnumItem
78
import org.rust.lang.core.psi.RsStructItem
89

910
class RustClassContextBuilderTest: BasePlatformTestCase() {
@@ -55,5 +56,42 @@ class RustClassContextBuilderTest: BasePlatformTestCase() {
5556
""".trimIndent()
5657
)
5758
}
59+
60+
fun testShouldHandleForEnum() {
61+
val code = myFixture.configureByText(
62+
"test.rs", """
63+
64+
enum List {
65+
Cons(u32, Box<List>),
66+
Nil,
67+
}
68+
69+
impl List {
70+
fn new() -> List {
71+
Nil
72+
}
73+
74+
fn prepend(self, elem: u32) -> List {
75+
Cons(elem, Box::new(self))
76+
}
77+
}
78+
""".trimIndent()
79+
)
80+
81+
val decl = PsiTreeUtil.getChildrenOfTypeAsList(code, RsEnumItem::class.java).first()
82+
val result = RustClassContextBuilder().getClassContext(decl, false)!!
83+
84+
assertEquals("List", result.name)
85+
assertEquals(
86+
result.format(), """
87+
'package: List
88+
class List {
89+
Cons(u32, Box<List>)
90+
Nil
91+
92+
}
93+
""".trimIndent()
94+
)
95+
}
5896
}
5997

src/main/kotlin/cc/unitmesh/devti/actions/chat/base/ChatBaseAction.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ abstract class ChatBaseAction : AnAction() {
3333
val file = event.getData(CommonDataKeys.PSI_FILE)
3434

3535
val lineEndOffset = document?.getLineEndOffset(document.getLineNumber(caretModel?.offset ?: 0)) ?: 0
36+
3637
// if selectedText is empty, then we use the cursor position to get the text
3738
if (prefixText.isEmpty()) {
3839
prefixText = document?.text?.substring(0, lineEndOffset) ?: ""

src/main/kotlin/cc/unitmesh/devti/actions/quick/QuickAssistantAction.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,14 @@ class QuickAssistantAction : AnAction() {
9898
val promptInlay: InlayPanel<QuickPromptField>? =
9999
InlayPanel.add(editor as EditorEx, offset, QuickPromptField())
100100

101-
promptInlay?.let { doExecute(it, project, editor, element, sourceFile) }
101+
promptInlay?.let { doExecute(it, project, editor, element) }
102102
}
103103

104104
private fun doExecute(
105105
inlay: InlayPanel<QuickPromptField>,
106106
project: Project,
107107
editor: EditorEx,
108108
element: PsiElement?,
109-
sourceFile: PsiFile,
110109
) {
111110
val component = inlay.component
112111

src/main/kotlin/cc/unitmesh/devti/actions/template/NewPromptTemplateAction.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@ import com.intellij.psi.PsiDirectory
1111
class NewPromptTemplateAction : CreateFileFromTemplateAction(
1212
"AutoDev Customize", "Creates new AutoDev customize", AutoDevIcons.AI_COPILOT
1313
), DumbAware {
14-
override fun getDefaultTemplateProperty(): String {
15-
return "DefaultAutoDevTemplate"
16-
}
14+
override fun getDefaultTemplateProperty(): String = "DefaultAutoDevTemplate"
1715

1816
override fun buildDialog(project: Project, psiDir: PsiDirectory, builder: CreateFileFromTemplateDialog.Builder) {
1917
builder

src/main/kotlin/cc/unitmesh/devti/llms/openai/OpenAIProvider.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class OpenAIProvider(val project: Project) : LLMProvider {
7474
if (project.coderSetting.state.recordingInLocal) {
7575
return project.service<JsonlRecording>()
7676
}
77+
7778
return EmptyRecording()
7879
}
7980

0 commit comments

Comments
 (0)