Moving the astvalidation module in astbuilder
[nit.git] / src / frontend / parallelization_phase.nit
index bc5aa42..b5cc9fd 100644 (file)
@@ -36,7 +36,7 @@ private class ParallelizationPhase
                if nat.n_atid.n_id.text != "threaded" then return
 
                if not nmethdef isa AMethPropdef then
-                       toolcontext.error(nmethdef.location, "Syntax error: only a method can be threaded.")
+                       toolcontext.error(nat.location, "Syntax Error: only a method can be threaded.")
                        return
                end
 
@@ -47,12 +47,11 @@ private class ParallelizationPhase
                assert amod isa AModule
 
                # Construct the name of the generated class
-               var modulename = amod.n_moduledecl.n_name.n_id.text
-               var classname = "Threaded" + modulename
+               var classname = "Threaded"
 
                # Try to get the name of the class
                if nmethdef.parent isa AStdClassdef then
-                       classname += nmethdef.parent.as(AStdClassdef).n_id.text
+                       classname += nmethdef.parent.as(AStdClassdef).n_qid.n_id.text
                end
 
                # Try to get the name of the method
@@ -64,28 +63,29 @@ private class ParallelizationPhase
                var has_rvalue = nmethdef.n_signature.n_type != null
                var vtype = ""
                if has_rvalue then
-                       vtype = "redef type E: " + nmethdef.n_signature.n_type.n_id.text
+                       vtype = "redef type E: " + nmethdef.n_signature.n_type.n_qid.n_id.text
                end
+
                # create a return type
                var n_id = new TClassid
                n_id.text = classname
+               var n_qid = new AQclassid
+               n_qid.n_id = n_id
                var n_type = new AType
-               n_type.n_id = n_id
+               n_type.n_qid = n_qid
                nmethdef.n_signature.n_type = n_type
 
                var params = new Array[String]
-               # case if the method has parameters
-               if nmethdef.n_signature.n_params.not_empty then
-                       for param in nmethdef.n_signature.n_params do
-                               params.add("""
-var {{{param.n_id.text}}} : {{{param.n_type.n_id.text}}}
-
-""")
-                       end
+               for param in nmethdef.n_signature.n_params do
+                       var typ = param.n_type.n_qid.n_id.text
+                       if param.n_type.n_kwnullable != null then typ = "nullable {typ}"
+                       params.add """
+var {{{param.n_id.text}}}: {{{typ}}}
+"""
                end
 
                # String corresponding to the generated class
-               var s="""
+               var classdef_source = """
 class {{{classname}}}
        super Thread
 
@@ -98,10 +98,11 @@ end
 """
 
                # Parse newly obtained classdef
-               var classdef = toolcontext.parse_classdef(s).as(AStdClassdef)
+               var classdef = toolcontext.parse_classdef(classdef_source)
+               assert classdef isa AStdClassdef
 
                # Get the `main` fun of the class
-               var mainfun : nullable AMethPropdef = null
+               var mainfun: nullable AMethPropdef = null
                for prop in classdef.n_propdefs do
                        if prop isa AMethPropdef then mainfun = prop
                end
@@ -141,7 +142,10 @@ return thread
                var newbody = toolcontext.parse_something(s_newbody)
                nmethdef.n_block = newbody.as(ABlockExpr)
 
+               nmethdef.validate
+
                # Add the new class to the module
                amod.n_classdefs.add(classdef)
+               classdef.validate
        end
 end