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:
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.full_module_name = full_module_name
self.cwd = cwd
def create_parse(context, scope):
def create_parse(context):
def parse(compsrc):
source_desc = compsrc.source_desc
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.compilation_source = compsrc
tree.scope = scope
return tree
return parse
def create_generate_code(context, scope, options):
def generate_code(tree):
result = create_default_resultobj(tree.compilation_source.source_desc, options, os.getcwd())
tree.process_implementation(scope, options, result)
def create_generate_code(context, options):
def generate_code(module_node):
scope = module_node.scope
result = create_default_resultobj(module_node.compilation_source, options)
module_node.process_implementation(scope, options, result)
return result
return generate_code
def create_default_pipeline(context, scope, options):
def create_default_pipeline(context, options):
from ParseTreeTransforms import WithTransform, PostParse
return [
create_parse(context, scope),
create_parse(context),
PostParse(),
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.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:
result.c_file = os.path.join(cwd, options.output_file)
result.c_file = os.path.join(compilation_source.cwd, options.output_file)
else:
if options.cplus:
c_suffix = ".cpp"
......@@ -379,13 +389,10 @@ def run_pipeline(source, options = None, full_module_name = None):
cwd = os.getcwd()
source_desc = FileSourceDescriptor(os.path.join(cwd, source))
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
initial_pos = (source_desc, 1, 0)
scope = context.find_module(full_module_name, pos = initial_pos, need_pxd = 0)
pipeline = create_default_pipeline(context, scope, options)
pipeline = create_default_pipeline(context, options)
data = source
errors_occurred = False
......
......@@ -32,6 +32,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
# referenced_modules [ModuleScope]
# module_temp_cname string
# full_module_name string
#
# scope The module scope.
# compilation_source A CompilationSource (see Main)
child_attrs = ["body"]
......@@ -45,6 +48,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
self.body.analyse_declarations(env)
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
from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform
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