Skip to content

Commit b55a01f

Browse files
committed
优化require补全,优化一般代码补全
1 parent a608add commit b55a01f

File tree

6 files changed

+106
-36
lines changed

6 files changed

+106
-36
lines changed

EmmyLua-Common/src/main/ext/com/tang/intellij/lua/editor/completion/LookupElementFactory.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,28 @@ object LookupElementFactory {
5858
return item
5959
}
6060

61+
fun createShouldBeMethodLookupElement(clazzName: String,
62+
lookupString: String,
63+
classMember: LuaClassMember,
64+
signature: IFunSignature,
65+
bold: Boolean,
66+
fnTy: ITyFunction,
67+
icon: Icon?): LuaLookupElement {
68+
val item = buildSignatureCompletionItem(lookupString, signature, true)
69+
item.lookupString = ":${item.lookupString}"
70+
item.kind = CompletionItemKind.Method
71+
item.itemText = "[$clazzName]"
72+
val file = classMember.containingFile?.virtualFile as? ILuaFile
73+
if (file != null) {
74+
item.data = "${file.uri}|${classMember.textOffset}"
75+
}
76+
if(classMember.isDeprecated){
77+
item.deprecated = true
78+
}
79+
80+
return item
81+
}
82+
6183
fun createFieldLookupElement(clazzName: String,
6284
name: String,
6385
field: LuaClassField,
Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,50 @@
11
package com.tang.intellij.lua.editor.completion
22

33
import com.intellij.codeInsight.lookup.LookupElement
4-
import org.eclipse.lsp4j.CompletionItem
5-
import org.eclipse.lsp4j.CompletionItemKind
6-
import org.eclipse.lsp4j.CompletionItemTag
7-
import org.eclipse.lsp4j.TextEdit
4+
import org.eclipse.lsp4j.*
85
import org.eclipse.lsp4j.jsonrpc.messages.Either
96

107
class LuaLookupElement(label: String) : LookupElement(label) {
118
var kind = CompletionItemKind.Text
12-
var data:String? = null
9+
var data: String? = null
1310
var insertText: String? = null
1411
var textEdit: TextEdit? = null
1512
var deprecated = false
1613
var isEnumMember = false
14+
var additionDetail: String? = null
1715
}
1816

19-
val LookupElement.asCompletionItem: CompletionItem get() {
20-
val item = when {
21-
this is LuaLookupElement -> {
22-
val completionItem = CompletionItem(lookupString)
23-
completionItem.insertText = insertText
24-
completionItem.data = data
25-
completionItem.kind = kind
26-
completionItem.textEdit = Either.forLeft(textEdit)
27-
if(deprecated){
28-
completionItem.tags = listOf(CompletionItemTag.Deprecated)
17+
val LookupElement.asCompletionItem: CompletionItem
18+
get() {
19+
val item = when {
20+
this is LuaLookupElement -> {
21+
val completionItem = CompletionItem(lookupString)
22+
completionItem.insertText = insertText
23+
completionItem.data = data
24+
completionItem.kind = kind
25+
26+
if (textEdit != null) {
27+
if (insertText != null) {
28+
completionItem.additionalTextEdits = listOf(textEdit)
29+
} else {
30+
completionItem.textEdit = Either.forLeft(textEdit)
31+
}
32+
}
33+
34+
if (deprecated) {
35+
completionItem.tags = listOf(CompletionItemTag.Deprecated)
36+
}
37+
if(additionDetail != null){
38+
val labelDetail = CompletionItemLabelDetails()
39+
labelDetail.description = additionDetail
40+
completionItem.labelDetails = labelDetail
41+
}
42+
43+
completionItem
2944
}
30-
completionItem
45+
else -> CompletionItem(lookupString)
3146
}
32-
else -> CompletionItem(lookupString)
33-
}
34-
item.detail = this.itemText
35-
return item
36-
}
47+
item.detail = this.itemText
48+
49+
return item
50+
}

EmmyLua-Common/src/main/java/com/tang/intellij/lua/editor/completion/ClassMemberCompletionProvider.kt

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ import com.tang.intellij.lua.lang.LuaIcons
2828
import com.tang.intellij.lua.psi.*
2929
import com.tang.intellij.lua.search.SearchContext
3030
import com.tang.intellij.lua.ty.*
31+
import com.tang.lsp.ILuaFile
32+
import com.tang.lsp.toRange
33+
import org.eclipse.lsp4j.CompletionItemKind
34+
import org.eclipse.lsp4j.TextEdit
3135

3236
enum class MemberCompletionMode {
3337
Dot, // self.xxx
@@ -43,8 +47,9 @@ open class ClassMemberCompletionProvider : LuaCompletionProvider() {
4347
protected abstract class HandlerProcessor {
4448
open fun processLookupString(lookupString: String, member: LuaClassMember, memberTy: ITy?): String =
4549
lookupString
50+
open fun processCorrectElement(element: LuaLookupElement) : LookupElement = element
4651

47-
abstract fun process(element: LuaLookupElement, member: LuaClassMember, memberTy: ITy?): LookupElement
52+
open fun process(element: LuaLookupElement, member: LuaClassMember, memberTy: ITy?): LookupElement = element
4853
}
4954

5055
override fun addCompletions(session: CompletionSession) {
@@ -60,6 +65,7 @@ open class ClassMemberCompletionProvider : LuaCompletionProvider() {
6065
val contextTy = LuaPsiTreeUtil.findContextClass(indexExpr)
6166
val context = SearchContext.get(project)
6267
val prefixType = indexExpr.guessParentType(context)
68+
val file = psi.containingFile.virtualFile
6369
if (!Ty.isInvalid(prefixType)) {
6470
complete(
6571
isColon,
@@ -68,7 +74,14 @@ open class ClassMemberCompletionProvider : LuaCompletionProvider() {
6874
prefixType,
6975
completionResultSet,
7076
completionResultSet.prefixMatcher,
71-
null
77+
object : HandlerProcessor() {
78+
override fun processCorrectElement(element: LuaLookupElement): LookupElement {
79+
if(element.lookupString.startsWith(":") && indexExpr.dot != null && file is ILuaFile) {
80+
element.textEdit = TextEdit(indexExpr.dot!!.textRange.toRange(file), ":")
81+
}
82+
return element
83+
}
84+
}
7285
)
7386
}
7487
//smart
@@ -128,7 +141,6 @@ open class ClassMemberCompletionProvider : LuaCompletionProvider() {
128141
handlerProcessor: HandlerProcessor?
129142
) {
130143
val context = SearchContext.get(project)
131-
luaType.lazyInit(context)
132144
luaType.processVisibleMembers(context, contextTy) { curType, member ->
133145
ProgressManager.checkCanceled()
134146
member.name?.let {
@@ -193,8 +205,9 @@ open class ClassMemberCompletionProvider : LuaCompletionProvider() {
193205
return
194206
}
195207
}
196-
if (completionMode != MemberCompletionMode.Colon)
208+
if (completionMode != MemberCompletionMode.Colon) {
197209
addField(completionResultSet, bold, className, member, type, handlerProcessor)
210+
}
198211
}
199212
}
200213

@@ -229,16 +242,19 @@ open class ClassMemberCompletionProvider : LuaCompletionProvider() {
229242
val name = classMember.name
230243
if (name != null) {
231244
fnTy.process(Processor {
232-
233245
val firstParam = it.getFirstParam(thisType, isColonStyle)
234-
if (isColonStyle) {
235-
if (firstParam == null) return@Processor true
236-
if (!callType.subTypeOf(firstParam.ty, SearchContext.get(classMember.project), true))
237-
return@Processor true
246+
val firstParamIsSelf = if (firstParam != null) {
247+
callType.subTypeOf(firstParam.ty, SearchContext.get(classMember.project), true)
248+
} else {
249+
false
238250
}
239251

240-
val lookupString = handlerProcessor?.processLookupString(name, classMember, fnTy) ?: name
252+
if (isColonStyle && !firstParamIsSelf) {
253+
return@Processor true
254+
}
241255

256+
val lookupString = handlerProcessor?.processLookupString(name, classMember, fnTy) ?: name
257+
// basic
242258
val element = LookupElementFactory.createMethodLookupElement(
243259
clazzName,
244260
lookupString,
@@ -251,6 +267,20 @@ open class ClassMemberCompletionProvider : LuaCompletionProvider() {
251267
)
252268
val ele = handlerProcessor?.process(element, classMember, fnTy) ?: element
253269
completionResultSet.addElement(ele)
270+
// correction completion
271+
if (!isColonStyle && firstParamIsSelf) {
272+
val colonElement = LookupElementFactory.createShouldBeMethodLookupElement(
273+
clazzName,
274+
lookupString,
275+
classMember,
276+
it,
277+
bold,
278+
fnTy,
279+
LuaIcons.CLASS_METHOD
280+
)
281+
val colonEle = handlerProcessor?.processCorrectElement(colonElement) ?: colonElement
282+
completionResultSet.addElement(colonEle)
283+
}
254284
true
255285
})
256286
}

EmmyLua-Common/src/main/java/com/tang/intellij/lua/editor/completion/RequirePathCompletionProvider.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ class RequirePathCompletionProvider : LuaCompletionProvider() {
3131
val paths = requirePath.split(Regex("[/\\\\]"))
3232
val insert = paths.joinToString(".")
3333
val element = LuaLookupElement(insert)
34-
element.kind = CompletionItemKind.Module
34+
element.itemText = path
35+
element.kind = CompletionItemKind.File
3536
element.textEdit = TextEdit(toRange, insert)
3637
session.resultSet.addElement(element)
3738
}

EmmyLua-LS/src/main/kotlin/com/tang/vscode/LuaLanguageServer.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class LuaLanguageServer : LanguageServer, LanguageClientAware {
8282
val completionOptions = CompletionOptions()
8383
completionOptions.triggerCharacters = listOf(".", ":", "@", "(")
8484
completionOptions.resolveProvider = true
85+
completionOptions.completionItem = CompletionItemOptions(true)
8586
capabilities.completionProvider = completionOptions
8687

8788
capabilities.definitionProvider = Either.forLeft(true)

EmmyLua-LS/src/main/kotlin/com/tang/vscode/api/impl/LuaFile.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -377,10 +377,12 @@ class LuaFile(override val uri: FileURI) : VirtualFileBase(uri), ILuaFile, Virtu
377377
val inlayHints = mutableListOf<InlayHint>()
378378
if (paramHints.isNotEmpty()) {
379379
for (paramHint in paramHints) {
380-
val hint = InlayHint(paramHint.range.start, Either.forLeft("${paramHint.hint}:"))
381-
hint.kind = InlayHintKind.Parameter
382-
hint.paddingRight = true
383-
inlayHints.add(hint)
380+
if(paramHint.hint != null) {
381+
val hint = InlayHint(paramHint.range.start, Either.forLeft("${paramHint.hint}:"))
382+
hint.kind = InlayHintKind.Parameter
383+
hint.paddingRight = true
384+
inlayHints.add(hint)
385+
}
384386
}
385387
}
386388
if (localHints.isNotEmpty()) {

0 commit comments

Comments
 (0)