nitc :: NitunitMdVisitor :: _executor
nitc :: NitunitMdVisitor :: defaultinit
nitc :: NitunitMdVisitor :: executor
nitc :: NitunitMdVisitor :: executor=
nitc :: NitunitMdVisitor :: new_docunit
Return and register a new empty docunitnitc :: NitunitMdVisitor :: parse_code
nitc $ NitunitMdVisitor :: SELF
Type of this instance, automatically specialized in every classnitc :: NitunitMdVisitor :: _executor
core :: Object :: class_factory
Implementation used byget_class
to create the specific class.
nitc :: NitunitMdVisitor :: defaultinit
core :: Object :: defaultinit
markdown2 :: MdVisitor :: defaultinit
nitc :: NitunitMdVisitor :: executor
nitc :: NitunitMdVisitor :: executor=
core :: Object :: is_same_instance
Return true ifself
and other
are the same instance (i.e. same identity).
core :: Object :: is_same_serialized
Isself
the same as other
in a serialization context?
core :: Object :: is_same_type
Return true ifself
and other
have the same dynamic type.
core :: Object :: native_class_name
The class name of the object in CString format.nitc :: NitunitMdVisitor :: new_docunit
Return and register a new empty docunitcore :: Object :: output_class_name
Display class name on stdout (debug only).nitc :: NitunitMdVisitor :: parse_code
private class NitunitMdVisitor
super MdVisitor
var executor: NitUnitExecutor
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
assert mdoc != null
# Skip pure comments
if ast isa TComment then return
# 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.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 MdFencedCodeBlock then
# Skip the starting fence
line_offset += 1
else
# Account a standard 4 space indentation
column_offset += 4
end
# We want executable code
if not (ast isa AModule or ast isa ABlockExpr or ast isa AExpr) then
var message
var l = ast.location
# Get real location of the node (or error)
var location = new Location(mdoc.location.file,
l.line_start + line_offset,
l.line_end + line_offset,
l.column_start + column_offset,
l.column_end + column_offset)
if ast isa AError then
message = ast.message
else
message = "Error: Invalid Nit code."
end
var du = new_docunit
du.block += code
du.error_location = location
du.error = message
executor.toolcontext.modelbuilder.failed_entities += 1
return
end
# Create a first block
# Or create a new block for modules that are more than a main part
var last_docunit = executor.last_docunit
if last_docunit == null or ast isa AModule then
last_docunit = new_docunit
executor.last_docunit = last_docunit
end
# Add it to the file
last_docunit.block += code
# In order to retrieve precise positions,
# the real position of each line of the raw_content is stored.
# See `DocUnit::real_location`
line_offset -= loc.line_start - 1
for i in [loc.line_start..loc.line_end] do
last_docunit.lines.add i + line_offset
last_docunit.columns.add column_offset
end
end
# Return and register a new empty docunit
fun new_docunit: DocUnit do
var mdoc = executor.mdoc
assert mdoc != null
var next_number = 1
var name = executor.xml_name
if executor.docunits.not_empty and executor.docunits.last.mdoc == mdoc then
next_number = executor.docunits.last.number + 1
name += "#" + next_number.to_s
end
var res = new DocUnit(mdoc, next_number, "", executor.xml_classname, name)
executor.docunits.add res
executor.toolcontext.modelbuilder.unit_entities += 1
return res
end
end
src/testing/testing_doc.nit:348,1--450,3