Skip to content

Commit 11d5154

Browse files
committed
完善emitter风格重载的签名支持和hint支持
1 parent b4fd8de commit 11d5154

File tree

10 files changed

+254
-187
lines changed

10 files changed

+254
-187
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class LuaLookupElement(label: String) : LookupElement(label) {
1313
var insertText: String? = null
1414
var textEdit: TextEdit? = null
1515
var deprecated = false
16-
var isOverloadConst = false
16+
var isEnumMember = false
1717
}
1818

1919
val LookupElement.asCompletionItem: CompletionItem get() {

EmmyLua-Common/src/main/java/com/tang/intellij/lua/comment/psi/LuaDocPsiImplUtil.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,8 @@ fun getType(luaDocParTy: LuaDocParTy): ITy {
278278

279279
fun getType(stringLiteral: LuaDocStringLiteralTy): ITy {
280280
val text = stringLiteral.text
281-
return TyStringLiteral(if (text.length >= 2) text.substring(1, text.length - 1) else "")
281+
// 历史原因
282+
return TyStringLiteral(if (text.length >= 2) text.substring(1, text.length - 1).trim('\'', '\"') else "")
282283
}
283284

284285
fun getType(unionTy: LuaDocUnionTy): ITy {
@@ -312,12 +313,12 @@ fun getNameIdentifier(f: LuaDocTableField): PsiElement? {
312313
return f.id
313314
}
314315

315-
fun getName(f:LuaDocTableField): String {
316+
fun getName(f: LuaDocTableField): String {
316317
val stub = f.stub
317318
return stub?.name ?: f.id.text
318319
}
319320

320-
fun guessType(f:LuaDocTableField, context: SearchContext): ITy {
321+
fun guessType(f: LuaDocTableField, context: SearchContext): ITy {
321322
val stub = f.stub
322323
val ty = if (stub != null) stub.docTy else f.ty?.getType()
323324
return ty ?: Ty.UNKNOWN
@@ -341,10 +342,10 @@ fun getType(alias: LuaDocTagAlias): ITy {
341342
return ty ?: Ty.UNKNOWN
342343
}
343344

344-
fun isNullable(param: LuaDocTagParam): Boolean{
345+
fun isNullable(param: LuaDocTagParam): Boolean {
345346
return param.nullable != null
346347
}
347348

348-
fun isNullable(field: LuaDocTagField): Boolean{
349+
fun isNullable(field: LuaDocTagField): Boolean {
349350
return field.nullable != null
350351
}

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

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class CallbackCompletionProvider : LuaCompletionProvider() {
2727

2828
callExpr.args.firstChild?.let { firstChild ->
2929
var child: PsiElement? = firstChild
30-
while (child != null) {
30+
while (child != null && child != psi) {
3131
if (child.node.elementType == LuaTypes.COMMA) {
3232
activeParameter++
3333
nCommas++
@@ -39,22 +39,15 @@ class CallbackCompletionProvider : LuaCompletionProvider() {
3939
callExpr.guessParentType(searchContext).let { parentType ->
4040
parentType.each { ty ->
4141
if (ty is ITyFunction) {
42-
val active = ty.findPerfectSignature(nCommas + 1)
43-
ty.process(Processor { sig ->
44-
if (sig == active) {
45-
if (activeParameter < sig.params.size) {
46-
sig.params[activeParameter].let {
47-
val paramType = it.ty
48-
if (paramType is TyFunction) {
49-
addCallback(paramType, searchContext, completionResultSet)
50-
}
51-
}
42+
val activeSig = ty.findPerfectSignature(callExpr, nCommas + 1)
43+
if (activeParameter < activeSig.params.size) {
44+
activeSig.params[activeParameter].let {
45+
val paramType = it.ty
46+
if (paramType is TyFunction) {
47+
addCallback(paramType, searchContext, completionResultSet)
5248
}
53-
5449
}
55-
56-
true
57-
})
50+
}
5851
}
5952
}
6053
}

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.tang.intellij.lua.editor.completion
22

33
import com.intellij.codeInsight.completion.CompletionResultSet
4-
import com.intellij.codeInsight.completion.PrefixMatcher
5-
import com.intellij.codeInsight.lookup.LookupElement
64
import com.intellij.psi.PsiElement
75
import com.intellij.util.Processor
86
import com.tang.intellij.lua.psi.LuaCallExpr
@@ -27,7 +25,7 @@ class EmitterOverloadProvider : LuaCompletionProvider() {
2725

2826
callExpr.args.firstChild?.let { firstChild ->
2927
var child: PsiElement? = firstChild
30-
while (child != null) {
28+
while (child != null && child != psi) {
3129
if (child.node.elementType == LuaTypes.COMMA) {
3230
activeParameter++
3331
}
@@ -68,8 +66,8 @@ class EmitterOverloadProvider : LuaCompletionProvider() {
6866
if(psiElement.node.elementType == LuaTypes.STRING) {
6967
element.textEdit = TextEdit(psiElement.textRange.toRange(file), newText)
7068
}
71-
element.isOverloadConst = true
72-
element.kind = CompletionItemKind.Constant
69+
element.isEnumMember = true
70+
element.kind = CompletionItemKind.EnumMember
7371
completionResultSet.addElement(element)
7472
}
7573
}

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

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -31,49 +31,39 @@ class EnumCompletionProvider : LuaCompletionProvider() {
3131

3232
callExpr.args.firstChild?.let { firstChild ->
3333
var child: PsiElement? = firstChild
34-
while (child != null) {
34+
while (child != null && child != psi) {
3535
if (child.node.elementType == LuaTypes.COMMA) {
3636
activeParameter++
3737
nCommas++
3838
}
3939
child = child.nextSibling
4040
}
4141
}
42+
4243
val searchContext = SearchContext.get(callExpr.project)
4344
callExpr.guessParentType(searchContext).let { parentType ->
4445
parentType.each { ty ->
4546
if (ty is ITyFunction) {
46-
val active = ty.findPerfectSignature(nCommas + 1)
47-
ty.process(Processor { sig ->
48-
if (sig == active) {
49-
if (activeParameter < sig.params.size) {
50-
sig.params[activeParameter].let {
51-
val paramType = it.ty
52-
if (paramType is TyClass) {
53-
val enumClass = LuaShortNamesManager.getInstance(searchContext.project)
54-
.findClass(paramType.className, searchContext)
55-
if (enumClass is LuaDocTagClass && enumClass.enum != null) {
56-
addEnum(paramType, searchContext, completionResultSet)
57-
}
58-
}
59-
}
47+
val activeSig = ty.findPerfectSignature(callExpr, nCommas + 1)
48+
if (activeParameter < activeSig.params.size) {
49+
activeSig.params[activeParameter].let {
50+
val paramType = it.ty
51+
if (paramType is TyClass && paramType.isEnum(callExpr.project, searchContext)) {
52+
addEnum(paramType, searchContext, completionResultSet)
6053
}
61-
6254
}
63-
64-
true
65-
})
55+
}
6656
}
6757
}
6858
}
69-
70-
7159
}
7260
}
7361

74-
private fun addEnum(luaType: ITyClass,
75-
searchContext: SearchContext,
76-
completionResultSet: CompletionResultSet) {
62+
private fun addEnum(
63+
luaType: ITyClass,
64+
searchContext: SearchContext,
65+
completionResultSet: CompletionResultSet
66+
) {
7767
luaType.lazyInit(searchContext)
7868
luaType.processMembers(searchContext) { curType, member ->
7969
ProgressManager.checkCanceled()
@@ -87,14 +77,18 @@ class EnumCompletionProvider : LuaCompletionProvider() {
8777
}
8878
}
8979

90-
private fun addEnumField(completionResultSet: CompletionResultSet,
91-
member: LuaClassMember,
92-
name: String,
93-
fieldType: ITyClass) {
80+
private fun addEnumField(
81+
completionResultSet: CompletionResultSet,
82+
member: LuaClassMember,
83+
name: String,
84+
fieldType: ITyClass
85+
) {
9486

9587
if (member is LuaClassField) {
96-
val element = LookupElementFactory.createFieldLookupElement(fieldType.className, name, member, fieldType, true)
97-
element.kind = CompletionItemKind.Enum
88+
val element =
89+
LookupElementFactory.createFieldLookupElement(fieldType.className, name, member, fieldType, true)
90+
element.kind = CompletionItemKind.EnumMember
91+
element.isEnumMember = true
9892
completionResultSet.addElement(element)
9993
}
10094
}

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

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class StringInnerTypeCompletionProvider : ClassMemberCompletionProvider() {
3232

3333
callExpr.args.firstChild?.let { firstChild ->
3434
var child: PsiElement? = firstChild
35-
while (child != null) {
35+
while (child != null && child != psi) {
3636
if (child.node.elementType == LuaTypes.COMMA) {
3737
activeParameter++
3838
nCommas++
@@ -44,45 +44,37 @@ class StringInnerTypeCompletionProvider : ClassMemberCompletionProvider() {
4444
callExpr.guessParentType(searchContext).let { parentType ->
4545
parentType.each { ty ->
4646
if (ty is ITyFunction) {
47-
val active = ty.findPerfectSignature(nCommas + 1)
48-
ty.process(Processor { sig ->
49-
if (sig == active) {
50-
if (activeParameter < sig.params.size) {
51-
sig.params[activeParameter].let {
52-
val paramType = it.ty
53-
if (paramType is TySerializedGeneric && paramType.base == STRING) {
54-
val oriFile = session.parameters.originalFile.virtualFile as ILuaFile
55-
val oriPos =
56-
session.parameters.originalFile.findElementAt(session.parameters.offset)
57-
58-
val innerType = paramType.params.firstOrNull()
59-
if (oriPos != null && innerType is ITyClass) {
60-
val content = LuaString.getContent(oriPos.text)
61-
62-
guessPrefixType(
63-
innerType,
64-
searchContext,
65-
content.value
66-
).forEach { prefixType ->
67-
addInnerClass(
68-
prefixType,
69-
getPrefix(content.value),
70-
searchContext,
71-
psi.project,
72-
completionResultSet
73-
)
74-
}
75-
76-
77-
}
47+
val activeSig = ty.findPerfectSignature(callExpr, nCommas + 1)
48+
if (activeParameter < activeSig.params.size) {
49+
activeSig.params[activeParameter].let {
50+
val paramType = it.ty
51+
if (paramType is TySerializedGeneric && paramType.base == STRING) {
52+
// val oriFile = session.parameters.originalFile.virtualFile as ILuaFile
53+
val oriPos =
54+
session.parameters.originalFile.findElementAt(session.parameters.offset)
55+
56+
val innerType = paramType.params.firstOrNull()
57+
if (oriPos != null && innerType is ITyClass) {
58+
val content = LuaString.getContent(oriPos.text)
59+
60+
guessPrefixType(
61+
innerType,
62+
searchContext,
63+
content.value
64+
).forEach { prefixType ->
65+
addInnerClass(
66+
prefixType,
67+
getPrefix(content.value),
68+
searchContext,
69+
psi.project,
70+
completionResultSet
71+
)
7872
}
7973
}
8074
}
81-
8275
}
76+
}
8377

84-
true
85-
})
8678
}
8779
}
8880
}
@@ -115,7 +107,7 @@ class StringInnerTypeCompletionProvider : ClassMemberCompletionProvider() {
115107
memberTy: ITy?
116108
): LookupElement {
117109
element.lookupString = prefix + element.lookupString
118-
if(element.kind == CompletionItemKind.Method) {
110+
if (element.kind == CompletionItemKind.Method) {
119111
element.insertText = prefix + element.insertText
120112
}
121113
return PrioritizedLookupElement.withPriority(element, 10.0)

EmmyLua-Common/src/main/java/com/tang/intellij/lua/ty/TyClass.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,12 @@ abstract class TyClass(
309309
return substitutor.substitute(this)
310310
}
311311

312+
fun isEnum(project: Project, searchContext: SearchContext): Boolean{
313+
val enumClass = LuaShortNamesManager.getInstance(project)
314+
.findClass(className, searchContext)
315+
return enumClass is LuaDocTagClass && enumClass.enum != null
316+
}
317+
312318
companion object {
313319
// for _G
314320
val G: TyClass = createSerializedClass(Constants.WORD_G)

0 commit comments

Comments
 (0)