Skip to content

Commit b4fd8de

Browse files
committed
初步支持emitter风格重载
1 parent f6d40ac commit b4fd8de

File tree

7 files changed

+68
-42
lines changed

7 files changed

+68
-42
lines changed

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ class CompletionResultSetImpl(private val consumer: Consumer<LookupElement>) : C
3333

3434
object CompletionService {
3535
private val contributors = arrayOf(
36-
LuaCompletionContributor(),
37-
SmartCompletionContributor(),
38-
LuaDocCompletionContributor()
36+
LuaCompletionContributor(),
37+
SmartCompletionContributor(),
38+
LuaDocCompletionContributor()
3939
)
4040

4141
fun collectCompletion(file: PsiFile, caret: Int, consumer: Consumer<LookupElement>) {
@@ -50,7 +50,10 @@ object CompletionService {
5050
context.startOffset = caret
5151
context.dummyIdentifier = CompletionInitializationContext.DUMMY_IDENTIFIER
5252
contributors.forEach { it.beforeCompletion(context) }
53-
parameters.position = if (context.dummyIdentifier.isEmpty()) file.findElementAt(caret) ?: return else insertDummyIdentifier(context)
53+
parameters.position =
54+
if (context.dummyIdentifier.isEmpty()) file.findElementAt(caret) ?: return else insertDummyIdentifier(
55+
context
56+
)
5457

5558
val text = file.text
5659
val result = CompletionResultSetImpl(consumer)

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import com.intellij.psi.PsiElement
2626
import com.intellij.psi.PsiNamedElement
2727
import com.intellij.psi.tree.TokenSet
2828
import com.intellij.util.ProcessingContext
29-
import com.tang.intellij.lua.Constants
3029
import com.tang.intellij.lua.project.LuaSettings
3130
import com.tang.intellij.lua.psi.*
3231

@@ -92,7 +91,7 @@ class LuaCompletionContributor : CompletionContributor() {
9291

9392
extend(CompletionType.BASIC, SHOW_STRING_INNER, StringInnerTypeCompletionProvider())
9493

95-
extend(CompletionType.BASIC, SHOW_CONST_EXPR, ConstExprProvider())
94+
extend(CompletionType.BASIC, SHOW_CONST_EXPR, EmitterOverloadProvider())
9695
}
9796

9897
/*override fun fillCompletionVariants(parameters: CompletionParameters, result: CompletionResultSet) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +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
1617
}
1718

1819
val LookupElement.asCompletionItem: CompletionItem get() {

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

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,18 @@ package com.tang.intellij.lua.editor.completion
33
import com.intellij.codeInsight.completion.CompletionResultSet
44
import com.intellij.codeInsight.completion.PrefixMatcher
55
import com.intellij.codeInsight.lookup.LookupElement
6-
import com.intellij.openapi.progress.ProgressManager
7-
import com.intellij.openapi.project.Project
86
import com.intellij.psi.PsiElement
97
import com.intellij.util.Processor
10-
import com.tang.intellij.lua.comment.psi.LuaDocTagClass
118
import com.tang.intellij.lua.psi.LuaCallExpr
12-
import com.tang.intellij.lua.psi.LuaClassField
13-
import com.tang.intellij.lua.psi.LuaClassMember
149
import com.tang.intellij.lua.psi.LuaTypes
15-
import com.tang.intellij.lua.psi.search.LuaShortNamesManager
1610
import com.tang.intellij.lua.search.SearchContext
1711
import com.tang.intellij.lua.ty.*
12+
import com.tang.lsp.ILuaFile
13+
import com.tang.lsp.toRange
1814
import org.eclipse.lsp4j.CompletionItemKind
15+
import org.eclipse.lsp4j.TextEdit
1916

20-
class ConstExprProvider : LuaCompletionProvider() {
17+
class EmitterOverloadProvider : LuaCompletionProvider() {
2118
override fun addCompletions(session: CompletionSession) {
2219
val completionParameters = session.parameters
2320
val completionResultSet = session.resultSet
@@ -27,45 +24,55 @@ class ConstExprProvider : LuaCompletionProvider() {
2724

2825
if (callExpr is LuaCallExpr) {
2926
var activeParameter = 0
30-
var nCommas = 0
3127

3228
callExpr.args.firstChild?.let { firstChild ->
3329
var child: PsiElement? = firstChild
3430
while (child != null) {
3531
if (child.node.elementType == LuaTypes.COMMA) {
3632
activeParameter++
37-
nCommas++
3833
}
3934
child = child.nextSibling
4035
}
4136
}
42-
val searchContext = SearchContext.get(callExpr.project)
43-
callExpr.guessParentType(searchContext).let { parentType ->
44-
parentType.each { ty ->
45-
if (ty is ITyFunction) {
46-
ty.process(Processor { sig ->
47-
if (activeParameter < sig.params.size) {
48-
sig.params[activeParameter].let {
37+
if (activeParameter == 0) {
38+
val searchContext = SearchContext.get(callExpr.project)
39+
callExpr.guessParentType(searchContext).let { parentType ->
40+
parentType.each { ty ->
41+
if (ty is ITyFunction) {
42+
ty.process(Processor { sig ->
43+
sig.params.firstOrNull()?.let {
4944
val paramType = it.ty
50-
// if (paramType is TyClass) {
51-
// val enumClass = LuaShortNamesManager.getInstance(searchContext.project)
52-
// .findClass(paramType.className, searchContext)
53-
// if (enumClass is LuaDocTagClass && enumClass.enum != null) {
54-
// addEnum(paramType, searchContext, completionResultSet)
55-
// }
56-
// }
45+
if (paramType is TyStringLiteral) {
46+
addOverload(psi, paramType, sig, completionResultSet)
47+
}
5748
}
58-
}
59-
true
60-
})
49+
true
50+
})
51+
}
6152
}
6253
}
6354
}
64-
65-
6655
}
6756
}
6857

58+
private fun addOverload(
59+
psiElement: PsiElement,
60+
tyStringLiteral: TyStringLiteral,
61+
signature: IFunSignature,
62+
completionResultSet: CompletionResultSet
63+
) {
64+
val file = psiElement.containingFile.virtualFile
65+
if(file is ILuaFile) {
66+
val newText = "\"${tyStringLiteral.content}\""
67+
val element = LuaLookupElement(newText)
68+
if(psiElement.node.elementType == LuaTypes.STRING) {
69+
element.textEdit = TextEdit(psiElement.textRange.toRange(file), newText)
70+
}
71+
element.isOverloadConst = true
72+
element.kind = CompletionItemKind.Constant
73+
completionResultSet.addElement(element)
74+
}
75+
}
6976
// private fun addEnum(
7077
// luaType: ITyClass,
7178
// searchContext: SearchContext,

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ class TyPrimitiveClass(override val primitiveKind: TyPrimitiveKind,
5555
return this == other.base
5656
}
5757

58+
if(other is TyStringLiteral){
59+
return true
60+
}
61+
5862
return this == other
5963
}
6064

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class LuaLanguageServer : LanguageServer, LanguageClientAware {
8080
val capabilities = ServerCapabilities()
8181

8282
val completionOptions = CompletionOptions()
83-
completionOptions.triggerCharacters = listOf(".", ":", "@")
83+
completionOptions.triggerCharacters = listOf(".", ":", "@", "(")
8484
completionOptions.resolveProvider = true
8585
capabilities.completionProvider = completionOptions
8686

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

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.tang.intellij.lua.Constants
1313
import com.tang.intellij.lua.comment.psi.*
1414
import com.tang.intellij.lua.comment.psi.api.LuaComment
1515
import com.tang.intellij.lua.editor.completion.CompletionService
16+
import com.tang.intellij.lua.editor.completion.LuaLookupElement
1617
import com.tang.intellij.lua.editor.completion.asCompletionItem
1718
import com.tang.intellij.lua.project.LuaSettings
1819
import com.tang.intellij.lua.psi.*
@@ -536,19 +537,30 @@ class LuaTextDocumentService(private val workspace: LuaWorkspaceService) : TextD
536537
}
537538
}
538539

539-
override fun completion(position: CompletionParams): CompletableFuture<Either<MutableList<CompletionItem>, CompletionList>> {
540+
override fun completion(params: CompletionParams): CompletableFuture<Either<MutableList<CompletionItem>, CompletionList>> {
540541
return computeAsync { checker ->
541542
val list = CompletionList()
542543
list.items = mutableListOf()
543-
val file = workspace.findFile(position.textDocument.uri)
544+
val file = workspace.findFile(params.textDocument.uri)
544545
if (file is ILuaFile) {
545-
val pos = file.getPosition(position.position.line, position.position.character)
546+
val pos = file.getPosition(params.position.line, params.position.character)
546547
val psi = file.psi
548+
val trigger = params.context.triggerCharacter
547549
if (psi != null) {
548-
CompletionService.collectCompletion(psi, pos, Consumer {
549-
checker.checkCanceled()
550-
list.items.add(it.asCompletionItem)
551-
})
550+
if(trigger == "("){
551+
CompletionService.collectCompletion(psi, pos, Consumer {
552+
checker.checkCanceled()
553+
if(it is LuaLookupElement && it.isOverloadConst) {
554+
list.items.add(it.asCompletionItem)
555+
}
556+
})
557+
}
558+
else {
559+
CompletionService.collectCompletion(psi, pos, Consumer {
560+
checker.checkCanceled()
561+
list.items.add(it.asCompletionItem)
562+
})
563+
}
552564
}
553565
}
554566
Either.forRight<MutableList<CompletionItem>, CompletionList>(list)

0 commit comments

Comments
 (0)