Commit 868538b3 authored by Dag Sverre Seljebotn's avatar Dag Sverre Seljebotn

Scope now creating by parse stage in Main

parent 06d7ad86
...@@ -318,40 +318,50 @@ class Context: ...@@ -318,40 +318,50 @@ class Context:
class CompilationSource(object): class CompilationSource(object):
def __init__(self, source_desc, full_module_name): """
Contains the data necesarry to start up a compilation pipeline for
a single compilation source (= file, usually).
"""
def __init__(self, source_desc, full_module_name, cwd):
self.source_desc = source_desc self.source_desc = source_desc
self.full_module_name = full_module_name self.full_module_name = full_module_name
self.cwd = cwd
def create_parse(context, scope): def create_parse(context):
def parse(compsrc): def parse(compsrc):
source_desc = compsrc.source_desc source_desc = compsrc.source_desc
full_module_name = compsrc.full_module_name full_module_name = compsrc.full_module_name
initial_pos = (source_desc, 1, 0)
scope = context.find_module(full_module_name, pos = initial_pos, need_pxd = 0)
tree = context.parse(source_desc, scope, pxd = 0, full_module_name = full_module_name) tree = context.parse(source_desc, scope, pxd = 0, full_module_name = full_module_name)
tree.compilation_source = compsrc tree.compilation_source = compsrc
tree.scope = scope
return tree return tree
return parse return parse
def create_generate_code(context, scope, options): def create_generate_code(context, options):
def generate_code(tree): def generate_code(module_node):
result = create_default_resultobj(tree.compilation_source.source_desc, options, os.getcwd()) scope = module_node.scope
tree.process_implementation(scope, options, result) result = create_default_resultobj(module_node.compilation_source, options)
module_node.process_implementation(scope, options, result)
return result return result
return generate_code return generate_code
def create_default_pipeline(context, scope, options): def create_default_pipeline(context, options):
from ParseTreeTransforms import WithTransform, PostParse from ParseTreeTransforms import WithTransform, PostParse
return [ return [
create_parse(context, scope), create_parse(context),
PostParse(), PostParse(),
WithTransform(), WithTransform(),
create_generate_code(context, scope, options) create_generate_code(context, options)
] ]
def create_default_resultobj(source_desc, options, cwd): def create_default_resultobj(compilation_source, options):
result = CompilationResult() result = CompilationResult()
result.main_source_file = source_desc.filename result.main_source_file = compilation_source.source_desc.filename
source_desc = compilation_source.source_desc
if options.output_file: if options.output_file:
result.c_file = os.path.join(cwd, options.output_file) result.c_file = os.path.join(compilation_source.cwd, options.output_file)
else: else:
if options.cplus: if options.cplus:
c_suffix = ".cpp" c_suffix = ".cpp"
...@@ -379,13 +389,10 @@ def run_pipeline(source, options = None, full_module_name = None): ...@@ -379,13 +389,10 @@ def run_pipeline(source, options = None, full_module_name = None):
cwd = os.getcwd() cwd = os.getcwd()
source_desc = FileSourceDescriptor(os.path.join(cwd, source)) source_desc = FileSourceDescriptor(os.path.join(cwd, source))
full_module_name = full_module_name or context.extract_module_name(source, options) full_module_name = full_module_name or context.extract_module_name(source, options)
source = CompilationSource(source_desc, full_module_name) source = CompilationSource(source_desc, full_module_name, cwd)
# Get pipeline # Get pipeline
initial_pos = (source_desc, 1, 0) pipeline = create_default_pipeline(context, options)
scope = context.find_module(full_module_name, pos = initial_pos, need_pxd = 0)
pipeline = create_default_pipeline(context, scope, options)
data = source data = source
errors_occurred = False errors_occurred = False
......
...@@ -32,6 +32,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -32,6 +32,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
# referenced_modules [ModuleScope] # referenced_modules [ModuleScope]
# module_temp_cname string # module_temp_cname string
# full_module_name string # full_module_name string
#
# scope The module scope.
# compilation_source A CompilationSource (see Main)
child_attrs = ["body"] child_attrs = ["body"]
...@@ -45,6 +48,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -45,6 +48,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
self.body.analyse_declarations(env) self.body.analyse_declarations(env)
def process_implementation(self, env, options, result): def process_implementation(self, env, options, result):
# Currently, scope is also set by the parse step in Main.py; they will be the same
assert self.scope is env
self.scope = env self.scope = env
from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform
AnalyseDeclarationsTransform(env).visit_ModuleNode(self) # self.analyse_declarations(env) AnalyseDeclarationsTransform(env).visit_ModuleNode(self) # self.analyse_declarations(env)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment