From 538489d579fbda9e897d6be60f245c5ff1c585c2 Mon Sep 17 00:00:00 2001 From: Alexandre Terrasa Date: Wed, 30 May 2018 10:12:37 -0400 Subject: [PATCH] nitunit: use the new markdown parser Signed-off-by: Alexandre Terrasa --- src/testing/testing_doc.nit | 51 ++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/src/testing/testing_doc.nit b/src/testing/testing_doc.nit index 665d38f..46f5a4a 100644 --- a/src/testing/testing_doc.nit +++ b/src/testing/testing_doc.nit @@ -17,13 +17,12 @@ module testing_doc private import parser_util import testing_base -import markdown +import markdown2 import html import realtime # Extractor, Executor and Reporter for the tests in a module class NitUnitExecutor - super HTMLDecorator # Toolcontext used to parse Nit code blocks. var toolcontext: ToolContext @@ -40,12 +39,11 @@ class NitUnitExecutor # The name of the suite var name: String - # Markdown processor used to parse markdown comments and extract code. - var mdproc = new MarkdownProcessor + # Markdown parse used to parse markdown comments and extract code + private var md_parser = new MdParser - init do - mdproc.decorator = new NitunitDecorator(self) - end + # Markdown visitor used to extract markdown code blocks + private var md_visitor = new NitunitMdVisitor(self) is lazy # The associated documentation object var mdoc: nullable MDoc = null @@ -75,7 +73,8 @@ class NitUnitExecutor self.mdoc = mdoc # Populate `blocks` from the markdown decorator - mdproc.process(mdoc.content.join("\n")) + var md_node = md_parser.parse(mdoc.content.join("\n")) + md_visitor.enter_visit(md_node) end # All extracted docunits @@ -346,17 +345,23 @@ class NitUnitExecutor end end -private class NitunitDecorator - super HTMLDecorator +private class NitunitMdVisitor + super MdVisitor var executor: NitUnitExecutor - redef fun add_code(v, block) do - var code = block.raw_content - var meta = block.meta or else "nit" + redef fun visit(node) do node.accept_nitunit(self) + + fun parse_code(block: MdCodeBlock) do + var code = block.literal + if code == null then return + + var meta = block.info or else "nit" # Do not try to test non-nit code. if meta != "nit" then return + # Try to parse code blocks + var executor = self.executor var ast = executor.toolcontext.parse_something(code) var mdoc = executor.mdoc @@ -367,12 +372,12 @@ private class NitunitDecorator # The location is computed according to the starts of the mdoc and the block # Note, the following assumes that all the comments of the mdoc are correctly aligned. - var loc = block.block.location + var loc = block.location var line_offset = loc.line_start + mdoc.location.line_start - 2 var column_offset = loc.column_start + mdoc.location.column_start # Hack to handle precise location in blocks # TODO remove when markdown is more reliable - if block isa BlockFence then + if block isa MdFencedCodeBlock then # Skip the starting fence line_offset += 1 else @@ -426,8 +431,7 @@ private class NitunitDecorator end # Return and register a new empty docunit - fun new_docunit: DocUnit - do + fun new_docunit: DocUnit do var mdoc = executor.mdoc assert mdoc != null @@ -445,6 +449,14 @@ private class NitunitDecorator end end +redef class MdNode + private fun accept_nitunit(v: NitunitMdVisitor) do visit_all(v) +end + +redef class MdCodeBlock + redef fun accept_nitunit(v) do v.parse_code(self) +end + # A unit-test extracted from some documentation. # # A docunit is extracted from the code-blocks of mdocs. @@ -514,10 +526,13 @@ class DocUnit fun real_location(ast_location: Location): Location do var mdoc = self.mdoc - var res = new Location(mdoc.location.file, lines[ast_location.line_start-1], + + var res = new Location(mdoc.location.file, + lines[ast_location.line_start-1], lines[ast_location.line_end-1], columns[ast_location.line_start-1] + ast_location.column_start, columns[ast_location.line_end-1] + ast_location.column_end) + return res end -- 1.7.9.5