Documentation for instruction with special register shows specific register expected.

This commit is contained in:
Chris Hodges 2021-09-05 18:33:18 +02:00
parent 665947827b
commit 1bff1a12c2
4 changed files with 19 additions and 6 deletions

View File

@ -10,8 +10,8 @@ This plugin delivers support for MC68000 assembly language files ([VAsm](http://
It adds a language parser with syntax highlighting, referencing and refactoring support, and a few more features. It adds a language parser with syntax highlighting, referencing and refactoring support, and a few more features.
I'm an Amiga retro democoder, and the lack of a plugin for M68k was the motivation to write one. Also, diving deep into custom language plugins has a steep I'm an Amiga retro democoder (among other things), and the lack of a plugin for M68k was the motivation to write one. Also, diving deep into custom language
learning curve. plugins has a steep learning curve.
When I started the plugin in July 2021, I was not aware of the [M68k plugin efforts by Jetbrains employee Yann Cébron](https://github.com/YannCebron/m68kplugin) When I started the plugin in July 2021, I was not aware of the [M68k plugin efforts by Jetbrains employee Yann Cébron](https://github.com/YannCebron/m68kplugin)
who has been working on the same topic for quite some time. At the time of writing, his plugin however, has not been release yet. Nevertheless, it has a lot of who has been working on the same topic for quite some time. At the time of writing, his plugin however, has not been release yet. Nevertheless, it has a lot of
@ -154,6 +154,7 @@ are appreciated. They really are, because they do keep me motivated to continue
- Bugfix: `movem` with pc-relative mode was missing for weird immediate mode (courtesy of Yann). - Bugfix: `movem` with pc-relative mode was missing for weird immediate mode (courtesy of Yann).
- Bugfix: Special registers for address mode matching only worked with lower case register names (courtesy of Yann). - Bugfix: Special registers for address mode matching only worked with lower case register names (courtesy of Yann).
- Enhancement: Assembler syntax with implicit immediate 1 for shifts and rotations no longer cause syntax errors (courtesy of Yann). - Enhancement: Assembler syntax with implicit immediate 1 for shifts and rotations no longer cause syntax errors (courtesy of Yann).
- Enhancement: Documentation for instruction with special register shows specific register expected.
### V0.6 (09-Aug-21) ### V0.6 (09-Aug-21)

View File

@ -63,6 +63,7 @@ patchPluginXml {
<li>Bugfix: 'movem' with pc-relative mode was missing for weird immediate mode (courtesy of Yann). <li>Bugfix: 'movem' with pc-relative mode was missing for weird immediate mode (courtesy of Yann).
<li>Bugfix: Special registers for address mode matching only worked with lower case register names (courtesy of Yann). <li>Bugfix: Special registers for address mode matching only worked with lower case register names (courtesy of Yann).
<li>Enhancement: Assembler syntax with implicit immediate 1 for shifts and rotations no longer cause syntax errors (courtesy of Yann). <li>Enhancement: Assembler syntax with implicit immediate 1 for shifts and rotations no longer cause syntax errors (courtesy of Yann).
<li>Enhancement: Documentation for instruction with special register shows specific register expected.
</ul> </ul>
<h4>V0.6 (09-Aug-21)</h4> <h4>V0.6 (09-Aug-21)</h4>
<ul> <ul>

View File

@ -92,8 +92,8 @@ class M68kInstructionDocumentationProvider : AbstractDocumentationProvider() {
val cellsPerRow = ArrayList<HtmlChunk>(3) val cellsPerRow = ArrayList<HtmlChunk>(3)
cellsPerRow.add(contentBuilder.toFragment()) cellsPerRow.add(contentBuilder.toFragment())
if (allowedAdrMode.op1 != null) cellsPerRow.add(collectAddressModes(allowedAdrMode.op1)) if (allowedAdrMode.op1 != null) cellsPerRow.add(collectAddressModes(allowedAdrMode.op1, allowedAdrMode.specialReg))
if (allowedAdrMode.op1 != null) cellsPerRow.add(collectAddressModes(allowedAdrMode.op2)) if (allowedAdrMode.op1 != null) cellsPerRow.add(collectAddressModes(allowedAdrMode.op2, allowedAdrMode.specialReg))
addressModeInfoRows.append(HtmlChunk.tag("tr").children(cellsPerRow.map { it.wrapWith(DocumentationMarkup.SECTION_CONTENT_CELL) })) addressModeInfoRows.append(HtmlChunk.tag("tr").children(cellsPerRow.map { it.wrapWith(DocumentationMarkup.SECTION_CONTENT_CELL) }))
addressModeInfoRows.toFragment() addressModeInfoRows.toFragment()
@ -126,11 +126,12 @@ class M68kInstructionDocumentationProvider : AbstractDocumentationProvider() {
return defBuilder return defBuilder
} }
private fun collectAddressModes(addressModes: Set<AddressMode>?): HtmlChunk { private fun collectAddressModes(addressModes: Set<AddressMode>?, specialReg: String?): HtmlChunk {
if (addressModes == null) return HtmlChunk.text("") if (addressModes == null) return HtmlChunk.text("")
val modes = HtmlBuilder() val modes = HtmlBuilder()
addressModes.sortedBy(AddressMode::ordinal) addressModes.sortedBy(AddressMode::ordinal)
.forEach { modes.append(HtmlChunk.text(it.syntax).wrapWith(HtmlChunk.div())) } .map { if (it == AddressMode.SPECIAL_REGISTER_DIRECT) specialReg!! else it.syntax }
.forEach { modes.append(HtmlChunk.text(it).wrapWith(HtmlChunk.div())) }
return modes.toFragment() return modes.toFragment()
} }

View File

@ -108,6 +108,16 @@ internal class M68kInstructionDocumentationProviderTest : AbstractDocumentationP
assertThat(generateDocumentation(myFixture)).contains("Reset External Devices", "(privileged)") assertThat(generateDocumentation(myFixture)).contains("Reset External Devices", "(privileged)")
} }
@Test
internal fun check_documentation_for_instruction_with_special_register(@MyFixture myFixture: CodeInsightTestFixture) {
myFixture.configureByText(
"documentme.asm", """
<caret>move.l usp,a0
"""
)
assertThat(generateDocumentation(myFixture)).contains("<div>usp</div>")
}
@Test @Test
internal fun check_documentation_if_there_is_no_concrete_match(@MyFixture myFixture: CodeInsightTestFixture) { internal fun check_documentation_if_there_is_no_concrete_match(@MyFixture myFixture: CodeInsightTestFixture) {
myFixture.configureByText( myFixture.configureByText(