Skip to content

Commit e604634

Browse files
authored
enhance ReferenceGall
1 parent c5ace78 commit e604634

File tree

7 files changed

+86
-43
lines changed

7 files changed

+86
-43
lines changed

src/main/kotlin/com/github/oldmegit/goframehelper/callUtil/CallUtil.kt

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,31 @@ package com.github.oldmegit.goframehelper.callUtil
22

33
import com.intellij.psi.PsiElement
44

5-
interface CallUtil {
6-
fun getData(psiElement: PsiElement) : Map<String, PsiElement?>
5+
abstract class CallUtil {
6+
abstract fun getData(psiElement: PsiElement) : Map<String, Set<PsiElement>>
77
// get completion of tail from psi
8-
fun getPsiTail(psiElement: PsiElement?) : String
9-
}
8+
abstract fun getPsiTail(psiElement: PsiElement?) : String
9+
10+
// get completion of tail from set<psi>
11+
fun getPsiTail(setPsi: Set<PsiElement>): String {
12+
if (setPsi.size == 1) {
13+
return getPsiTail(setPsi.elementAt(0))
14+
}
15+
return ""
16+
}
17+
18+
// merge map for same key
19+
protected fun Map<String, Set<PsiElement>>.merge(oneMap: Map<String, PsiElement?>) : Map<String, Set<PsiElement>> {
20+
val data = this.toMutableMap()
21+
22+
for ((k, v) in oneMap) {
23+
val oldV = data.getOrElse(k) { mutableSetOf() }.toMutableSet()
24+
if (v != null) {
25+
oldV += v
26+
}
27+
data[k] = oldV
28+
}
29+
30+
return data
31+
}
32+
}

src/main/kotlin/com/github/oldmegit/goframehelper/callUtil/cfg/CfgUtil.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ import com.intellij.psi.PsiElement
99
import com.intellij.psi.PsiManager
1010
import java.io.File
1111

12-
object CfgUtil : CallUtil {
12+
object CfgUtil : CallUtil() {
1313
private val cfgTypes = mapOf(
1414
"yaml" to Yaml,
1515
"yml" to Yaml,
1616
"json" to Json,
1717
)
1818

19-
override fun getData(psiElement: PsiElement): Map<String, PsiElement?> {
19+
override fun getData(psiElement: PsiElement): Map<String, Set<PsiElement>> {
2020
val project = psiElement.project
2121
val fileMaps = getCfgFilesPath(project)
2222
return try {
@@ -39,13 +39,14 @@ object CfgUtil : CallUtil {
3939
}
4040

4141
// get key and value in all file
42-
private fun getKeyValue(files: Map<PsiElement, String>): Map<String, PsiElement?> {
43-
val map = hashMapOf<String, PsiElement?>()
42+
private fun getKeyValue(files: Map<PsiElement, String>): Map<String, Set<PsiElement>> {
43+
var data = mapOf<String, Set<PsiElement>>()
4444

4545
for ((file, extension) in files) {
46-
map += cfgTypes[extension]!!.getFileKeyValue(file)
46+
val fileMap = cfgTypes[extension]!!.getFileKeyValue(file)
47+
data = data.merge(fileMap)
4748
}
48-
return map
49+
return data
4950
}
5051

5152
// get gf config folder

src/main/kotlin/com/github/oldmegit/goframehelper/callUtil/i18n/I18nUtil.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ import com.intellij.psi.PsiElement
1111
import com.intellij.psi.PsiManager
1212
import java.io.File
1313

14-
object I18nUtil : CallUtil {
14+
object I18nUtil : CallUtil() {
1515
private val i18nTypes = mapOf(
1616
"yaml" to Yaml,
1717
"yml" to Yaml,
1818
"json" to Json,
1919
)
2020

21-
override fun getData(psiElement: PsiElement): Map<String, PsiElement?> {
21+
override fun getData(psiElement: PsiElement): Map<String, Set<PsiElement>> {
2222
val project = psiElement.project
2323
return try {
2424
val fileMaps = getI18nFilesPath(project)
@@ -33,13 +33,14 @@ object I18nUtil : CallUtil {
3333
}
3434

3535
// get key and value in all file
36-
private fun getKeyValue(files: Map<PsiElement, String>): Map<String, PsiElement?> {
37-
val map = hashMapOf<String, PsiElement?>()
36+
private fun getKeyValue(files: Map<PsiElement, String>): Map<String, Set<PsiElement>> {
37+
var data = mapOf<String, Set<PsiElement>>()
3838

3939
for ((file, extension) in files) {
40-
map += i18nTypes[extension]!!.getFileKeyValue(file)
40+
val fileMap = i18nTypes[extension]!!.getFileKeyValue(file)
41+
data = data.merge(fileMap)
4142
}
42-
return map
43+
return data
4344
}
4445

4546
// get gf i18n folder

src/main/kotlin/com/github/oldmegit/goframehelper/callUtil/orm/OrmUtil.kt

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import com.intellij.psi.ResolveState
99
import com.intellij.psi.util.PsiTreeUtil
1010
import com.intellij.util.ObjectUtils
1111

12-
object OrmUtil : CallUtil {
13-
override fun getData(psiElement: PsiElement): Map<String, PsiElement?> {
12+
object OrmUtil : CallUtil() {
13+
override fun getData(psiElement: PsiElement): Map<String, Set<PsiElement>> {
1414
return try {
1515
val statement = getStatementContainDao(psiElement)
1616
val dao = getDaoByStatement(statement!!)
@@ -22,13 +22,17 @@ object OrmUtil : CallUtil {
2222
}
2323

2424
override fun getPsiTail(psiElement: PsiElement?): String {
25-
var ctx = ""
25+
var text = ""
2626
if (psiElement == null) {
27-
return ctx
27+
return text
2828
}
29+
2930
val psiComment = psiElement.nextSibling.nextSibling
30-
ctx = extractTextFromComment(psiComment.text)
31-
return ctx
31+
if (psiComment !is PsiComment) {
32+
return text
33+
}
34+
text = extractTextFromComment(psiComment.text)
35+
return text
3236
}
3337

3438
// get statement contain XXXDao by given PsiElement
@@ -99,21 +103,21 @@ object OrmUtil : CallUtil {
99103
}
100104

101105
// get table data by XXXColumns of type GoTypeSpec
102-
private fun getTableData(columnType: GoType): Map<String, PsiElement?> {
106+
private fun getTableData(columnType: GoType): Map<String, Set<PsiElement>> {
103107
val typeSpec = columnType.resolve(ResolveState.initial()) as GoTypeSpec
104108
val fields = PsiTreeUtil.findChildrenOfType(typeSpec, GoFieldDeclaration::class.java)
105-
val data: MutableMap<String, PsiElement?> = hashMapOf()
109+
val data = mutableMapOf<String, Set<PsiElement>>()
110+
106111
for (field in fields) {
107112
val fieldDefinition = field.firstChild
108113
if (fieldDefinition !is GoFieldDefinition) {
109114
continue
110115
}
111-
val psiComment = field.nextSibling.nextSibling
112-
var comment : PsiElement? = null
113-
if (psiComment is PsiComment) {
114-
comment = psiComment
116+
if (field != null) {
117+
data[fieldDefinition.text.camelToSnakeCase()] = setOf(field)
118+
} else {
119+
data[fieldDefinition.text.camelToSnakeCase()] = hashSetOf()
115120
}
116-
data[fieldDefinition.text.camelToSnakeCase()] = comment
117121
}
118122
return data
119123
}

src/main/kotlin/com/github/oldmegit/goframehelper/provider/CompletionCall.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.oldmegit.goframehelper.provider
22

3+
import com.github.oldmegit.goframehelper.callUtil.CallUtil
34
import com.github.oldmegit.goframehelper.callUtil.orm.OrmCallables
45
import com.github.oldmegit.goframehelper.callUtil.orm.OrmUtil
56
import com.github.oldmegit.goframehelper.gf.Gf
@@ -23,10 +24,11 @@ class CompletionCall : CompletionBase() {
2324

2425
val data = callUtil.getData(position)
2526
for ((k, v) in data) {
27+
val tail = callUtil.getPsiTail(v)
2628
result.addElement(
2729
LookupElementBuilder.create(k)
2830
.withIcon(Gf.icon)
29-
.withTailText(" $v", true)
31+
.withTailText(" $tail", true)
3032
)
3133
}
3234
}

src/main/kotlin/com/github/oldmegit/goframehelper/provider/ReferenceCallBase.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.github.oldmegit.goframehelper.provider
22

33
import com.goide.psi.GoStringLiteral
4-
import com.intellij.openapi.util.TextRange
54
import com.intellij.psi.PsiElement
65
import com.intellij.psi.PsiReference
76
import com.intellij.psi.PsiReferenceProvider
@@ -12,7 +11,7 @@ class ReferenceCallBase : PsiReferenceProvider() {
1211
if (element is GoStringLiteral) {
1312
var text = element.text
1413
text = text.trim('"')
15-
return arrayOf(ReferenceGall(element, TextRange(1, text.length+1), text))
14+
return arrayOf(ReferenceGall(element, text))
1615
}
1716
return PsiReference.EMPTY_ARRAY
1817
}

src/main/kotlin/com/github/oldmegit/goframehelper/provider/ReferenceGall.kt

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,29 @@ import com.github.oldmegit.goframehelper.gf.Gf
99
import com.goide.psi.GoCallExpr
1010
import com.intellij.codeInsight.lookup.LookupElement
1111
import com.intellij.codeInsight.lookup.LookupElementBuilder
12-
import com.intellij.openapi.util.TextRange
13-
import com.intellij.psi.PsiElement
14-
import com.intellij.psi.PsiReferenceBase
12+
import com.intellij.psi.*
1513
import com.intellij.psi.util.PsiTreeUtil
1614

17-
class ReferenceGall(element: PsiElement, range: TextRange, private val name: String) : PsiReferenceBase<PsiElement>(element, range) {
18-
override fun resolve(): PsiElement? {
15+
class ReferenceGall(element: PsiElement, private val name: String) : PsiReferenceBase<PsiElement>(element), PsiPolyVariantReference {
16+
override fun multiResolve(boolean: Boolean): Array<ResolveResult> {
1917
val callUtil = getCallUtil()
2018
if (callUtil == null) {
21-
return null
19+
return arrayOf()
2220
}
2321
val data = callUtil.getData(element)
22+
var results: MutableList<ResolveResult> = ArrayList()
2423

2524
for ((k, v) in data) {
26-
if (k == name && v != null) {
27-
return v
25+
if (k == name) {
26+
results = addResult(v)
2827
}
2928
}
30-
return null
29+
return results.toTypedArray<ResolveResult>()
30+
}
31+
32+
override fun resolve(): PsiElement? {
33+
val resolveResults = multiResolve(false)
34+
return if (resolveResults.size == 1) resolveResults[0].element else null
3135
}
3236

3337
override fun getVariants(): Array<LookupElement> {
@@ -39,11 +43,11 @@ class ReferenceGall(element: PsiElement, range: TextRange, private val name: Str
3943
val data = callUtil.getData(element)
4044

4145
for ((k, v) in data) {
42-
val vCtx = callUtil.getPsiTail(v)
46+
val tail = callUtil.getPsiTail(v)
4347
variants.add(
4448
LookupElementBuilder.create(k)
4549
.withIcon(Gf.icon)
46-
.withTailText(" $vCtx", true)
50+
.withTailText(" $tail", true)
4751
)
4852
}
4953

@@ -64,4 +68,13 @@ class ReferenceGall(element: PsiElement, range: TextRange, private val name: Str
6468

6569
return callUtil
6670
}
71+
72+
// add one PsiElement to results
73+
private fun addResult(setPsi: Set<PsiElement>) : MutableList<ResolveResult> {
74+
val results: MutableList<ResolveResult> = ArrayList()
75+
for (v in setPsi) {
76+
results.add(PsiElementResolveResult(v))
77+
}
78+
return results
79+
}
6780
}

0 commit comments

Comments
 (0)