Skip to content

Commit bdb400a

Browse files
committed
调整代码提示的显示
1 parent bc85420 commit bdb400a

File tree

6 files changed

+171
-58
lines changed

6 files changed

+171
-58
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.tang.intellij.lua.editor.completion.CompletionService
1414
import com.tang.intellij.lua.editor.completion.LuaLookupElement
1515
import com.tang.intellij.lua.editor.completion.asCompletionItem
1616
import com.tang.intellij.lua.psi.*
17+
import com.tang.intellij.lua.psi.search.LuaShortNamesManager
1718
import com.tang.intellij.lua.reference.ReferencesSearch
1819
import com.tang.intellij.lua.search.SearchContext
1920
import com.tang.intellij.lua.stubs.index.LuaClassMemberIndex
@@ -210,7 +211,7 @@ class LuaTextDocumentService(private val workspace: LuaWorkspaceService) : TextD
210211
val position = arr[1].toInt()
211212
file.psi?.findElementAt(position)?.let { psi ->
212213
PsiTreeUtil.getParentOfType(psi, LuaClassMember::class.java)?.let { member ->
213-
val doc = documentProvider.generateDoc(member)
214+
val doc = documentProvider.generateDoc(member, true)
214215
val content = MarkupContent()
215216
content.kind = "markdown"
216217
content.value = doc
@@ -244,7 +245,7 @@ class LuaTextDocumentService(private val workspace: LuaWorkspaceService) : TextD
244245
val element = TargetElementUtil.findTarget(file.psi, pos)
245246
if (element != null) {
246247
val ref = element.reference?.resolve() ?: element
247-
val doc = documentProvider.generateDoc(ref)
248+
val doc = documentProvider.generateDoc(ref, false)
248249
if (doc != null)
249250
hover = Hover(listOf(Either.forLeft(doc)))
250251
}

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

Lines changed: 98 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,18 @@ internal fun StringBuilder.appendClassLink(clazz: String) {
4545
append(clazz)
4646
}
4747

48+
internal fun StringBuilder.withIndent(indent: Int){
49+
50+
}
51+
4852
internal fun renderTy(sb: StringBuilder, ty: ITy) {
4953
when (ty) {
5054
is ITyClass -> {
5155
sb.appendClassLink(ty.displayName)
5256
}
5357
is ITyFunction -> {
5458
sb.append("fun")
55-
renderSignature(sb, ty.mainSignature)
59+
renderSignature(sb, ty.mainSignature, false)
5660
}
5761
is ITyArray -> {
5862
renderTy(sb, ty.base)
@@ -84,30 +88,52 @@ internal fun renderTy(sb: StringBuilder, ty: ITy) {
8488
}
8589
}
8690

87-
internal fun renderSignature(sb: StringBuilder, sig: IFunSignature) {
88-
sb.wrap("(", ") -> ") {
89-
var idx = 0
90-
sig.params.forEach {
91-
if (idx++ != 0) sb.append(", ")
92-
sb.append("${it.name}${if (it.nullable) "?" else ""}: ")
93-
renderTy(sb, it.ty)
91+
internal fun renderSignature(sb: StringBuilder, sig: IFunSignature, inComplete: Boolean) {
92+
if (inComplete && sig.params.size > 1) {
93+
sb.wrap("(\n", "\n)\n-> ") {
94+
var idx = 0
95+
sig.params.forEach {
96+
if (idx++ != 0) sb.append(",\n")
97+
sb.append("\t${it.name}${if (it.nullable) "?" else ""}: ")
98+
renderTy(sb, it.ty)
99+
}
100+
if (sig.hasVarargs()) {
101+
sig.varargTy?.let {
102+
if (idx++ != 0) sb.append(",\n")
103+
sb.append("\t...: ")
104+
renderTy(sb, it)
105+
}
106+
}
94107
}
95-
if (sig.hasVarargs()) {
96-
sig.varargTy?.let {
108+
renderTy(sb, sig.returnTy)
109+
} else {
110+
sb.wrap("(", ") -> ") {
111+
var idx = 0
112+
sig.params.forEach {
97113
if (idx++ != 0) sb.append(", ")
98-
sb.append("...: ")
99-
renderTy(sb, it)
114+
sb.append("${it.name}${if (it.nullable) "?" else ""}: ")
115+
renderTy(sb, it.ty)
116+
}
117+
if (sig.hasVarargs()) {
118+
sig.varargTy?.let {
119+
if (idx++ != 0) sb.append(", ")
120+
sb.append("...: ")
121+
renderTy(sb, it)
122+
}
100123
}
101124
}
125+
renderTy(sb, sig.returnTy)
102126
}
103-
renderTy(sb, sig.returnTy)
104127
}
105128

106129
internal fun renderComment(sb: StringBuilder, comment: LuaComment?) {
107130
if (comment != null) {
108131
sb.append("\n\n")
109132
var child: PsiElement? = comment.firstChild
110133
var seenString = false
134+
val paramList = mutableListOf<LuaDocTagParam>()
135+
val returnList = mutableListOf<LuaDocTagReturn>()
136+
val fieldList = mutableListOf<LuaDocTagField>()
111137
while (child != null) {
112138
val elementType = child.node.elementType
113139
if (elementType == LuaDocTypes.STRING) {
@@ -121,32 +147,76 @@ internal fun renderComment(sb: StringBuilder, comment: LuaComment?) {
121147
seenString = false
122148
when (child) {
123149
is LuaDocTagParam -> {
124-
renderDocParam(sb, child)
125-
sb.append("\n")
150+
if(child.commentString != null && child.commentString!!.text.isNotEmpty()) {
151+
paramList.add(child)
152+
}
126153
}
127154
is LuaDocTagReturn -> {
128-
val typeList = child.typeList
129-
if (typeList != null) {
130-
sb.appendLine("@_return_ : (")
131-
val list = typeList.tyList
132-
list.forEachIndexed { index, luaDocTy ->
133-
renderTypeUnion(if (index != 0) ", " else null, null, sb, luaDocTy)
134-
sb.append(" ")
135-
}
136-
sb.append(")")
137-
renderCommentString(null, null, sb, child.commentString)
138-
sb.append("\n")
155+
if(child.commentString != null && child.commentString!!.text.isNotEmpty()) {
156+
returnList.add(child)
139157
}
140158
}
141159
is LuaDocTagClass -> renderClassDef(sb, child)
142-
is LuaDocTagField -> renderFieldDef(sb, child)
160+
is LuaDocTagField -> fieldList.add(child)
143161
is LuaDocTagOverload -> renderOverload(sb, child)
144162
is LuaDocTagType -> renderTypeDef(sb, child)
145163
is LuaDocTagSee -> renderSee(sb, child)
146164
}
147165
}
148166
child = child.nextSibling
149167
}
168+
169+
if(paramList.isNotEmpty()){
170+
sb.appendLine()
171+
sb.wrapLanguage("plaintext"){
172+
val paramsDescription = "Params: "
173+
val doc = FormatDoc(sb, paramsDescription.length)
174+
doc.write(paramsDescription)
175+
for(param in paramList){
176+
val paramNameRef = param.paramNameRef
177+
val commentString = param.commentString
178+
if (paramNameRef != null && commentString != null && commentString.text.isNotEmpty()) {
179+
doc.writeLine("${paramNameRef.text} - ${commentString.text}")
180+
}
181+
}
182+
}
183+
}
184+
185+
if(fieldList.isNotEmpty()){
186+
sb.appendLine()
187+
sb.wrapLanguage("plaintext") {
188+
val fieldsDescription = "Fields: "
189+
val doc = FormatDoc(sb, fieldsDescription.length)
190+
doc.write(fieldsDescription)
191+
for (field in fieldList) {
192+
val fieldNameRef = field.fieldName
193+
val commentString = field.commentString
194+
if(fieldNameRef != null) {
195+
if (commentString != null && commentString.text.isNotEmpty()) {
196+
doc.writeLine("${fieldNameRef} - ${commentString.text}")
197+
} else {
198+
doc.writeLine(fieldNameRef)
199+
}
200+
}
201+
}
202+
}
203+
}
204+
205+
if(returnList.isNotEmpty()){
206+
sb.appendLine()
207+
sb.wrapLanguage("plaintext") {
208+
val returnsDescription = "Return: "
209+
val doc = FormatDoc(sb, returnsDescription.length)
210+
doc.write(returnsDescription)
211+
for (rt in returnList) {
212+
val commentString = rt.commentString
213+
if (commentString != null) {
214+
doc.writeLine(commentString.text)
215+
}
216+
}
217+
}
218+
}
219+
150220
}
151221
}
152222

@@ -179,7 +249,7 @@ internal fun renderDocParam(sb: StringBuilder, child: LuaDocTagParam) {
179249
if (paramNameRef != null && commentString != null) {
180250
sb.appendLine("(parameter) `${paramNameRef.text}${if (child.isNullable) "?" else ""}`: ")
181251
renderTypeUnion(null, null, sb, child.ty)
182-
if(commentString.text.isNotEmpty()) {
252+
if (commentString.text.isNotEmpty()) {
183253
renderCommentString(" ", null, sb, commentString)
184254
}
185255
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.tang.vscode.documentation
2+
3+
import com.tang.vscode.formatter.FormattingOptions
4+
5+
class FormatDoc(val sb: StringBuilder, var indent: Int) {
6+
fun write(text: String) {
7+
val lastLineSeparatorIndex = text.lastIndexOf('\n')
8+
val empty = " "
9+
// 表示没找到换行符
10+
if (lastLineSeparatorIndex == -1) {
11+
sb.append(text)
12+
} else {
13+
val texts = text.split('\n').map { it -> it.trimStart() }
14+
for (index in texts.indices) {
15+
if (index != texts.size - 1) {
16+
sb.append(texts[index]).append("\n")
17+
sb.append(empty.repeat(indent))
18+
} else {
19+
sb.append(texts[index])
20+
}
21+
}
22+
}
23+
}
24+
25+
fun writeLine(text: String){
26+
write(text)
27+
sb.append("\n")
28+
sb.append(" ".repeat(indent))
29+
}
30+
}

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

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ import com.intellij.psi.util.PsiTreeUtil
2323
import com.tang.intellij.lua.comment.psi.LuaDocTagClass
2424
import com.tang.intellij.lua.comment.psi.LuaDocTagField
2525
import com.tang.intellij.lua.psi.*
26+
import com.tang.intellij.lua.psi.search.LuaShortNamesManager
2627
import com.tang.intellij.lua.reference.ReferencesSearch
2728
import com.tang.intellij.lua.search.SearchContext
2829
import com.tang.intellij.lua.stubs.index.LuaClassIndex
2930
import com.tang.intellij.lua.ty.*
3031
import com.tang.lsp.ExtendApiBase
3132
import com.tang.vscode.extendApi.ExtendApiService
33+
import com.tang.vscode.extendApi.ExtendShortNameManager
3234

3335

3436
/**
@@ -41,7 +43,7 @@ class LuaDocumentationProvider : DocumentationProvider {
4143
}
4244

4345
override fun generateDoc(element: PsiElement, originalElement: PsiElement?): String? {
44-
return generateDoc(element)
46+
return generateDoc(element, false)
4547
}
4648

4749
override fun getQuickNavigateInfo(element: PsiElement?, originalElement: PsiElement?): String? {
@@ -75,18 +77,18 @@ class LuaDocumentationProvider : DocumentationProvider {
7577
}
7678

7779

78-
fun generateDoc(element: PsiElement): String? {
80+
fun generateDoc(element: PsiElement, inComplete: Boolean): String? {
7981
val sb = StringBuilder()
8082
when (element) {
8183
is LuaParamNameDef -> renderParamNameDef(sb, element)
8284
is LuaDocTagClass -> renderClassDef(sb, element)
83-
is LuaClassMember -> renderClassMember(sb, element)
85+
is LuaClassMember -> renderClassMember(sb, element, inComplete)
8486
is LuaNameDef -> renderNamDef(sb, element)
8587
is LuaLocalFuncDef -> {
8688
sb.wrapLanguage("lua") {
8789
sb.append("local function ${element.name}")
8890
val type = element.guessType(SearchContext.get(element.project)) as ITyFunction
89-
renderSignature(sb, type.mainSignature)
91+
renderSignature(sb, type.mainSignature, inComplete)
9092
}
9193
renderComment(sb, element.comment)
9294
}
@@ -109,47 +111,41 @@ class LuaDocumentationProvider : DocumentationProvider {
109111
}
110112

111113
fun generateExtendDoc(clazzName: String, memberName: String): String? {
112-
val clazz = ExtendApiService.getNsMember(clazzName)
113-
if (clazz != null) {
114-
val member = clazz.findMember(memberName)
115-
if (member != null) {
116-
return generateDoc(member)
117-
}
114+
val member = ExtendApiService.findMember(clazzName, memberName, true)
115+
if (member != null) {
116+
return generateDoc(member, true)
118117
}
119118
return null
120119
}
121120

122-
private fun renderClassMember(sb: StringBuilder, classMember: LuaClassMember) {
121+
private fun renderClassMember(sb: StringBuilder, classMember: LuaClassMember, inComplete: Boolean) {
123122
val context = SearchContext.get(classMember.project)
124123
val parentType = classMember.guessClassType(context)
125124
val ty = classMember.guessType(context)
126125
//base info
127126
if (parentType != null) {
128127
sb.wrapLanguage("lua") {
129128
when (classMember.visibility) {
130-
Visibility.PUBLIC -> {
131-
sb.append("public ")
132-
}
133129
Visibility.PRIVATE -> {
134130
sb.append("private ")
135131
}
136132
Visibility.PROTECTED -> {
137133
sb.append("protected ")
138134
}
135+
else -> {
136+
// ignore
137+
}
139138
}
140139
when (ty) {
141140
is TyFunction -> {
142141
sb.append(classMember.name)
143-
renderSignature(sb, ty.mainSignature)
142+
renderSignature(sb, ty.mainSignature, inComplete)
144143

145144
return@wrapLanguage
146145
}
147146
else -> {
148-
if (classMember.name != null && LuaConst.isConstField(
149-
parentType.className,
150-
classMember.name!!,
151-
context
152-
)
147+
if (classMember.name != null
148+
&& LuaConst.isConstField(parentType.className, classMember.name!!, context)
153149
) {
154150
when (classMember) {
155151
is LuaTableField -> {
@@ -171,8 +167,7 @@ class LuaDocumentationProvider : DocumentationProvider {
171167
values[i]
172168
)
173169
) {
174-
renderTy(sb, parentType)
175-
sb.append(".${classMember.name} = ${values[i].text}")
170+
sb.append("${classMember.name} = ${values[i].text}")
176171
sb.append("\n")
177172
return@wrapLanguage
178173
}
@@ -186,8 +181,7 @@ class LuaDocumentationProvider : DocumentationProvider {
186181
}
187182
}
188183
}
189-
renderTy(sb, parentType)
190-
sb.append(".${classMember.name}:")
184+
sb.append("${classMember.name}: ")
191185
renderTy(sb, ty)
192186
}
193187
} else {
@@ -219,9 +213,9 @@ class LuaDocumentationProvider : DocumentationProvider {
219213
}
220214

221215
when (ty) {
222-
is TyFunction -> renderSignature(sb, ty.mainSignature)
216+
is TyFunction -> renderSignature(sb, ty.mainSignature, inComplete)
223217
else -> {
224-
append(":")
218+
append(": ")
225219
renderTy(sb, ty)
226220
}
227221
}
@@ -258,7 +252,7 @@ class LuaDocumentationProvider : DocumentationProvider {
258252
renderDocParam(sb, docParamDef)
259253
} else {
260254
val ty = infer(paramNameDef, SearchContext.get(paramNameDef.project))
261-
sb.appendLine("(parameter) `${paramNameDef.name}`:")
255+
sb.appendLine("(parameter) `${paramNameDef.name}`: ")
262256
renderTy(sb, ty)
263257
}
264258
}

0 commit comments

Comments
 (0)