Macro definition / invocation documentation provider that even tries to expand macros.
Moved some util classes around.
This commit is contained in:
+4
-1
@@ -6,7 +6,7 @@ import com.intellij.openapi.util.text.HtmlBuilder
|
||||
import com.intellij.openapi.util.text.HtmlChunk
|
||||
import com.intellij.psi.PsiElement
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kNamedElement
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kPsiWalkUtil
|
||||
import de.platon42.intellij.plugins.m68k.psi.utils.M68kPsiWalkUtil
|
||||
|
||||
abstract class AbstractM68kDocumentationProvider : AbstractDocumentationProvider() {
|
||||
|
||||
@@ -27,6 +27,9 @@ abstract class AbstractM68kDocumentationProvider : AbstractDocumentationProvider
|
||||
fun getContent(element: PsiElement) =
|
||||
HtmlBuilder().append(HtmlChunk.text(element.text).code()).wrapWith(DocumentationMarkup.CONTENT_ELEMENT)
|
||||
|
||||
fun getContent(chunk: HtmlChunk) =
|
||||
HtmlBuilder().append(chunk).wrapWith(DocumentationMarkup.CONTENT_ELEMENT)
|
||||
|
||||
fun getContent(value: String) =
|
||||
HtmlBuilder().append(value).wrapWith(DocumentationMarkup.CONTENT_ELEMENT)
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
package de.platon42.intellij.plugins.m68k.documentation
|
||||
|
||||
import com.intellij.openapi.util.text.HtmlBuilder
|
||||
import com.intellij.openapi.util.text.HtmlChunk
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.util.PsiTreeUtil
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kMacroCall
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kMacroDefinition
|
||||
import de.platon42.intellij.plugins.m68k.psi.utils.M68kMacroExpansionUtil
|
||||
|
||||
class M68kMacroDefinitionDocumentationProvider : AbstractM68kDocumentationProvider() {
|
||||
|
||||
override fun getQuickNavigateInfo(element: PsiElement, originalElement: PsiElement?): String? {
|
||||
return generateDoc(element, originalElement)
|
||||
}
|
||||
|
||||
override fun generateDoc(element: PsiElement, originalElement: PsiElement?): String? {
|
||||
return if (element is M68kMacroDefinition) createDoc(element, originalElement, 100) else null // TODO make this configurable
|
||||
}
|
||||
|
||||
override fun generateHoverDoc(element: PsiElement, originalElement: PsiElement?): String? {
|
||||
return if (element is M68kMacroDefinition) createDoc(element, originalElement, 4) else null // TODO make this configurable
|
||||
}
|
||||
|
||||
private fun createDoc(macrodef: M68kMacroDefinition, originalElement: PsiElement?, linesLimit: Int): String {
|
||||
val macroCall = PsiTreeUtil.getParentOfType(originalElement, M68kMacroCall::class.java)
|
||||
val expandedMacro = M68kMacroExpansionUtil.expandMacro(macrodef, macroCall)
|
||||
val builder = HtmlBuilder()
|
||||
return builder
|
||||
.append(getComments(macrodef))
|
||||
.append(getDefinition(HtmlChunk.text(macrodef.name!!).code()))
|
||||
.append(
|
||||
getContent(
|
||||
HtmlBuilder().appendWithSeparators(
|
||||
HtmlChunk.br(),
|
||||
expandedMacro.take(linesLimit).map { HtmlChunk.text(it).code() }.toList()
|
||||
).toFragment()
|
||||
)
|
||||
)
|
||||
.toString()
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -1,9 +1,10 @@
|
||||
package de.platon42.intellij.plugins.m68k.psi
|
||||
package de.platon42.intellij.plugins.m68k.psi.utils
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.search.GlobalSearchScope
|
||||
import com.intellij.psi.stubs.StubIndex
|
||||
import com.intellij.psi.util.PsiTreeUtil
|
||||
import de.platon42.intellij.plugins.m68k.psi.*
|
||||
import de.platon42.intellij.plugins.m68k.stubs.M68kGlobalLabelStubIndex
|
||||
import de.platon42.intellij.plugins.m68k.stubs.M68kMacroDefinitionStubIndex
|
||||
import de.platon42.intellij.plugins.m68k.stubs.M68kSymbolDefinitionStubIndex
|
||||
@@ -0,0 +1,25 @@
|
||||
package de.platon42.intellij.plugins.m68k.psi.utils
|
||||
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kMacroCall
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kMacroDefinition
|
||||
|
||||
object M68kMacroExpansionUtil {
|
||||
|
||||
fun expandMacro(macroDefinition: M68kMacroDefinition, macroCall: M68kMacroCall?): List<String> {
|
||||
val params = macroCall?.exprList?.map { it.text }?.toTypedArray() ?: emptyArray()
|
||||
|
||||
if (params.isEmpty()) return macroDefinition.macroPlainLineList.map { it.text }
|
||||
|
||||
val originalContent = macroDefinition.macroPlainLineList.joinToString("\n", transform = { it.text })
|
||||
var modifiedContent = originalContent
|
||||
for (param in params.withIndex()) {
|
||||
val paramRef = when (param.index) {
|
||||
in 0..8 -> "\\" + (param.index + 1)
|
||||
in 9..34 -> "\\" + ('a' + (param.index - 9))
|
||||
else -> "seriously?"
|
||||
}
|
||||
modifiedContent = modifiedContent.replace(paramRef, param.value)
|
||||
}
|
||||
return modifiedContent.split("\n")
|
||||
}
|
||||
}
|
||||
+9
-2
@@ -1,16 +1,23 @@
|
||||
package de.platon42.intellij.plugins.m68k.psi
|
||||
package de.platon42.intellij.plugins.m68k.psi.utils
|
||||
|
||||
import com.intellij.psi.PsiComment
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.util.PsiTreeUtil
|
||||
import com.intellij.util.SmartList
|
||||
import com.intellij.util.containers.addIfNotNull
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kMacroDefinition
|
||||
|
||||
object M68kPsiWalkUtil {
|
||||
|
||||
fun collectRelatedComments(element: PsiElement): List<PsiComment> {
|
||||
val comments = SmartList<PsiComment>()
|
||||
val eolComment = PsiTreeUtil.skipWhitespacesForward(element) as? PsiComment
|
||||
val eolComment = if (element is M68kMacroDefinition) {
|
||||
// macro definition needs special handling of EOL comments
|
||||
PsiTreeUtil.findChildOfType(element, PsiComment::class.java)
|
||||
} else {
|
||||
PsiTreeUtil.skipWhitespacesForward(element) as? PsiComment
|
||||
}
|
||||
|
||||
comments.addIfNotNull(eolComment)
|
||||
var prevToken: PsiElement? = element
|
||||
do {
|
||||
+1
-1
@@ -6,8 +6,8 @@ import com.intellij.codeInsight.lookup.LookupElementBuilder
|
||||
import com.intellij.patterns.PlatformPatterns
|
||||
import com.intellij.util.ProcessingContext
|
||||
import de.platon42.intellij.plugins.m68k.M68kIcons
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kLookupUtil
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kTypes
|
||||
import de.platon42.intellij.plugins.m68k.psi.utils.M68kLookupUtil
|
||||
|
||||
class M68kGlobalLabelSymbolCompletionContributor : CompletionContributor() {
|
||||
|
||||
|
||||
+1
-1
@@ -4,8 +4,8 @@ import com.intellij.codeInsight.completion.*
|
||||
import com.intellij.codeInsight.lookup.LookupElementBuilder
|
||||
import com.intellij.patterns.PlatformPatterns
|
||||
import com.intellij.util.ProcessingContext
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kLookupUtil
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kTypes
|
||||
import de.platon42.intellij.plugins.m68k.psi.utils.M68kLookupUtil
|
||||
|
||||
class M68kMacroCallCompletionContributor : CompletionContributor() {
|
||||
|
||||
|
||||
+2
-2
@@ -6,8 +6,8 @@ import com.intellij.navigation.ItemPresentation
|
||||
import com.intellij.psi.NavigatablePsiElement
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kFile
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kGlobalLabel
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kLookupUtil
|
||||
import de.platon42.intellij.plugins.m68k.psi.M68kLookupUtil.findAllLocalLabels
|
||||
import de.platon42.intellij.plugins.m68k.psi.utils.M68kLookupUtil
|
||||
import de.platon42.intellij.plugins.m68k.psi.utils.M68kLookupUtil.findAllLocalLabels
|
||||
|
||||
class M68kStructureViewElement(private val myElement: NavigatablePsiElement) : StructureViewTreeElement {
|
||||
override fun getValue(): Any = myElement
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
implementationClass="de.platon42.intellij.plugins.m68k.documentation.M68kSymbolDefinitionDocumentationProvider"/>
|
||||
<lang.documentationProvider language="MC68000"
|
||||
implementationClass="de.platon42.intellij.plugins.m68k.documentation.M68kLabelDocumentationProvider"/>
|
||||
<lang.documentationProvider language="MC68000"
|
||||
implementationClass="de.platon42.intellij.plugins.m68k.documentation.M68kMacroDefinitionDocumentationProvider"/>
|
||||
<lang.documentationProvider language="MC68000"
|
||||
implementationClass="de.platon42.intellij.plugins.m68k.documentation.M68kRegisterFlowDocumentationProvider"/>
|
||||
<lang.documentationProvider language="MC68000"
|
||||
|
||||
Reference in New Issue
Block a user