Skip to content

Commit 8f1ee44

Browse files
committed
bug fix #17
1 parent 370ef39 commit 8f1ee44

File tree

5 files changed

+90
-19
lines changed

5 files changed

+90
-19
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.tang.intellij.lua.editor
2+
3+
import com.intellij.openapi.editor.Caret
4+
5+
class CaretImpl(private val caretOffset: Int) : Caret {
6+
override fun getOffset(): Int {
7+
return caretOffset
8+
}
9+
}

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

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package com.tang.intellij.lua.editor.completion
22

3+
import com.intellij.codeInsight.completion.CompletionInitializationContext
34
import com.intellij.codeInsight.completion.CompletionParameters
45
import com.intellij.codeInsight.completion.CompletionResultSet
56
import com.intellij.codeInsight.completion.CompletionType
67
import com.intellij.codeInsight.completion.impl.CamelHumpMatcher
78
import com.intellij.codeInsight.lookup.LookupElement
89
import com.intellij.lang.PsiBuilderFactory
10+
import com.intellij.psi.PsiElement
911
import com.intellij.psi.PsiFile
1012
import com.intellij.util.Consumer
1113
import com.tang.intellij.lua.configuration.IConfigurationManager
14+
import com.tang.intellij.lua.editor.CaretImpl
1215
import com.tang.intellij.lua.lang.LuaParserDefinition
1316
import com.tang.intellij.lua.lexer.LuaLexer
1417
import com.tang.intellij.lua.parser.LuaParser
@@ -35,32 +38,48 @@ object CompletionService {
3538
LuaDocCompletionContributor()
3639
)
3740

38-
fun collectCompletion(psi: PsiFile, pos: Int, consumer: Consumer<LookupElement>) {
39-
val config = IConfigurationManager.get(psi.project)
40-
val text = psi.text.replaceRange(pos, pos, "emmy")
41-
42-
val parser = LuaParser()
43-
val builder = PsiBuilderFactory.getInstance().createBuilder(LuaParserDefinition(), LuaLexer(), text)
44-
val node = parser.parse(LuaParserDefinition.FILE, builder)
45-
val tempPsi = node.psi as LuaPsiFile
46-
tempPsi.virtualFile = psi.virtualFile
47-
val position = tempPsi.findElementAt(pos)
48-
41+
fun collectCompletion(file: PsiFile, caret: Int, consumer: Consumer<LookupElement>) {
42+
val config = IConfigurationManager.get(file.project)
4943
val parameters = CompletionParameters()
5044
parameters.completionType = CompletionType.BASIC
51-
parameters.position = position!!
52-
parameters.originalFile = psi
53-
parameters.offset = pos
45+
parameters.originalFile = file
46+
parameters.offset = caret
47+
val context = CompletionInitializationContext()
48+
context.file = file
49+
context.caret = CaretImpl(caret)
50+
context.startOffset = caret
51+
context.dummyIdentifier = CompletionInitializationContext.DUMMY_IDENTIFIER
52+
contributors.forEach { it.beforeCompletion(context) }
53+
if (context.dummyIdentifier.isEmpty()) {
54+
parameters.position = file.findElementAt(caret)!!
55+
} else {
56+
parameters.position = insertDummyIdentifier(context)
57+
}
5458

59+
val text = file.text
5560
val result = CompletionResultSetImpl(consumer)
56-
val prefix = findPrefix(text, pos)
61+
val prefix = findPrefix(text, caret)
5762
result.prefixMatcher = CamelHumpMatcher(prefix, config.completionCaseSensitive)
5863

5964
parameters.originalFile.putUserData(CompletionSession.KEY, CompletionSession(parameters, result))
6065

6166
contributors.forEach { it.fillCompletionVariants(parameters, result) }
6267
}
6368

69+
private fun insertDummyIdentifier(context: CompletionInitializationContext): PsiElement {
70+
val oriFile = context.file
71+
val pos = context.startOffset
72+
val text = oriFile.text.replaceRange(pos, pos, context.dummyIdentifier)
73+
val parser = LuaParser()
74+
val builder = PsiBuilderFactory.getInstance().createBuilder(LuaParserDefinition(), LuaLexer(), text)
75+
val node = parser.parse(LuaParserDefinition.FILE, builder)
76+
val copy = node.psi as LuaPsiFile
77+
copy.virtualFile = oriFile.virtualFile
78+
val position = copy.findElementAt(pos)
79+
context.file = copy
80+
return position!!
81+
}
82+
6483
private fun findPrefix(text: String, pos: Int): String {
6584
var i = pos
6685
while (i > 0) {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class LuaCompletionContributor : CompletionContributor() {
8383
}*/
8484

8585
override fun beforeCompletion(context: CompletionInitializationContext) {
86-
/*suggestWords = true
86+
suggestWords = true
8787
val file = context.file
8888
if (file is LuaPsiFile) {
8989
val element = file.findElementAt(context.caret.offset - 1)
@@ -101,7 +101,7 @@ class LuaCompletionContributor : CompletionContributor() {
101101
}
102102
}
103103
}
104-
}*/
104+
}
105105
}
106106

107107
companion object {

IntelliJ-Core/src/main/java/com/intellij/codeInsight/completion/CompletionInitializationContext.java

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,53 @@
1515
*/
1616
package com.intellij.codeInsight.completion;
1717

18+
import com.intellij.openapi.editor.Caret;
1819
import com.intellij.psi.PsiFile;
1920

2021
/**
2122
* @author peter
2223
*/
2324
public class CompletionInitializationContext {
25+
public static String DUMMY_IDENTIFIER = "emmy ";
2426
public static String DUMMY_IDENTIFIER_TRIMMED = "emmy";
2527

26-
public String dummyIdentifier;
28+
private String dummyIdentifier;
2729

28-
public PsiFile file;
30+
private PsiFile file;
31+
32+
private int startOffset;
33+
34+
private Caret caret;
35+
36+
public int getStartOffset() {
37+
return startOffset;
38+
}
39+
40+
public void setStartOffset(int startOffset) {
41+
this.startOffset = startOffset;
42+
}
43+
44+
public Caret getCaret() {
45+
return caret;
46+
}
47+
48+
public void setCaret(Caret caret) {
49+
this.caret = caret;
50+
}
51+
52+
public PsiFile getFile() {
53+
return file;
54+
}
55+
56+
public void setFile(PsiFile file) {
57+
this.file = file;
58+
}
59+
60+
public String getDummyIdentifier() {
61+
return dummyIdentifier;
62+
}
63+
64+
public void setDummyIdentifier(String dummyIdentifier) {
65+
this.dummyIdentifier = dummyIdentifier;
66+
}
2967
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.intellij.openapi.editor;
2+
3+
public interface Caret {
4+
int getOffset();
5+
}

0 commit comments

Comments
 (0)