Property definitions

nitc $ NoWarningPhase :: defaultinit
private class NoWarningPhase
	super Phase

	redef fun process_nmodule(nmodule)
	do
		# Get the mmodule
		var mmodule = nmodule.mmodule
		if mmodule == null then return

		var source = nmodule.location.file

		var nmoduledecl = nmodule.n_moduledecl
		if nmoduledecl == null or nmoduledecl.n_doc == null then
			# Disable `missing-doc` if there is no `module` clause
			# Rationale: the presence of a `module` clause is a good heuristic to
			# discriminate quick and dirty prototypes from nice and clean modules
			if source != null then toolcontext.warning_blacklist[source].add("missing-doc")

		end

		# If no decl block then quit
		if nmoduledecl == null then return

		var modelbuilder = toolcontext.modelbuilder

		# Disable `missing-doc` for `test`
		if source != null and not nmoduledecl.get_annotations("test").is_empty then
			toolcontext.warning_blacklist[source].add("missing-doc")
		end

		# Get all the `no_warning` annotations
		var name = "no_warning"
		var annots = nmoduledecl.get_annotations(name)

		if annots.is_empty then return

		if source == null then
			modelbuilder.warning(annots.first, "file-less-module", "Warning: `{name}` does not currently work on file-less modules.")
			return
		end

		for annot in annots do
			var args = annot.n_args
			if args.is_empty then
				modelbuilder.error(annot, "Syntax Error: `{name}` expects a list of warnings. Use `\"all\"` to disable all warnings.")
				continue
			end
			for arg in args do
				var tag = arg.as_string
				if tag == null then
					modelbuilder.error(arg, "Syntax Error: `{name}` expects String as arguments.")
					continue
				end

				toolcontext.warning_blacklist[source].add(tag)
			end
		end
	end
end
src/frontend/no_warning.nit:26,1--84,3