class ToolContext
special MMContext
# Number of errors
- readable var _error_count: Int = 0
+ readable var _error_count: Int = 0
# Number of warnings
readable var _warning_count: Int = 0
+ fun check_errors
+ do
+ if error_count > 0 then exit(1)
+ end
+
# Display an error
fun error(s: String)
do
if _processing_modules.has(full_name) then
# FIXME: Generate better error
error("Error: Dependency loop for module {full_name}")
- exit(1)
- abort
+ check_errors
end
_processing_modules.add(full_name)
var m = l.load_and_process_module(self, module_name, dir)
if not filename.file_exists then
error("Error: File {filename} not found.")
- exit(1)
+ check_errors
abort
end
if m != null then return m
error("Error: {filename} is not a NIT source module.")
- exit(1)
+ check_errors
abort
end
end
# FIXME: Generate better error
error("Error: No ressource found for module {module_name}.")
- exit(1)
+ check_errors
abort
end
if file.eof then
context.error("Error: Problem in opening file {filename}")
- exit(1)
- abort
+ context.check_errors
end
var m = parse_file(context, file, filename, module_name, dir)
if file != stdin then file.close
end
if clibdir == null then
error("Error: Cannot locate NIT C library directory. Uses --clibdir or envvar NIT_DIR.")
- exit(1)
+ check_errors
end
end
bindir = opt_bindir.value
end
if bindir == null then
error("Error: Cannot locate NIT tools directory. Uses --bindir or envvar NIT_DIR.")
- exit(1)
+ check_errors
end
end
end
# Create local classes and attach them to global classes
var mmbv = new ClassBuilderVisitor(tc, self)
mmbv.visit(node)
- if tc.error_count > 0 then exit(1)
+ tc.check_errors
if mhe.direct_greaters.is_empty then
process_default_classes(tc)
# Resolve classes in super clauses
var mmbv1 = new ClassSpecializationBuilderVisitor(tc, self)
mmbv1.visit(node)
- if tc.error_count > 0 then exit(1)
+ tc.check_errors
# Compute specialization relation
for c in local_classes do
end
c.compute_super_classes
end
- if tc.error_count > 0 then exit(1)
+ tc.check_errors
# Class that we will process now are those in the hierarchy
# Its mean all the visible classes and their super-classes
var mmbv1b = new ClassAncestorBuilder(tc, self)
for c in classes do
c.accept_class_visitor(mmbv1b)
- if tc.error_count > 0 then exit(1)
+ tc.check_errors
c.compute_ancestors
end
for c in classes do
c.accept_class_visitor(mmbv1b)
end
- if tc.error_count > 0 then exit(1)
+ tc.check_errors
# Property inhritance and introduction
var mmbv2 = new PropertyBuilderVisitor(tc, self)
# Note that inherited unredefined property are processed on demand latter
end
- if tc.error_count > 0 then exit(1)
+ tc.check_errors
# Property signature analysis and inheritance conformance
var mmbv3 = new PropertyVerifierVisitor(tc, self)
end
end
- if tc.error_count > 0 then exit(1)
+ tc.check_errors
end
# Create some primitive default classes if they do not exists
var err = node_tree.n_eof
assert err isa PError
context.error("{err.locate}: {err.message}")
- exit(1)
+ context.check_errors
end
var node_module = node_tree.n_base
assert node_module isa AModule
private fun process_syntax(tc: ToolContext)
do
do_mmbuilder(tc)
- if tc.error_count > 0 then exit(1)
+ tc.check_errors
do_typing(tc)
- if tc.error_count > 0 then exit(1)
+ tc.check_errors
end
end