aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2016-11-20 01:46:16 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2016-11-20 01:48:26 +0200
commit87340136900be1442a4c408a00a08afed02e1873 (patch)
tree06e52ede7834de53d244cf18e887f90dc562a3f2
parentc41805f012fe7305dfba978f6cb70741d782c57f (diff)
downloadmeson-87340136900be1442a4c408a00a08afed02e1873.zip
meson-87340136900be1442a4c408a00a08afed02e1873.tar.gz
meson-87340136900be1442a4c408a00a08afed02e1873.tar.bz2
I can haz source files added to targets.
-rwxr-xr-xmesonast.py2
-rw-r--r--mesonbuild/astinterpreter.py41
-rw-r--r--mesonbuild/mparser.py38
3 files changed, 53 insertions, 28 deletions
diff --git a/mesonast.py b/mesonast.py
index e24c31e..f0f09e8 100755
--- a/mesonast.py
+++ b/mesonast.py
@@ -35,7 +35,7 @@ if __name__ == '__main__':
source_root = sys.argv[1]
ast = mesonbuild.astinterpreter.AstInterpreter(source_root, '')
try:
- ast.dump()
+ ast.add_source('trivialprog', 'newfile.c')
except Exception as e:
if isinstance(e, MesonException):
if hasattr(e, 'file') and hasattr(e, 'lineno') and hasattr(e, 'colno'):
diff --git a/mesonbuild/astinterpreter.py b/mesonbuild/astinterpreter.py
index 247f7d9..4a42053 100644
--- a/mesonbuild/astinterpreter.py
+++ b/mesonbuild/astinterpreter.py
@@ -20,7 +20,7 @@ from . import environment
from .interpreterbase import InterpreterException
-import os
+import os, sys
class DontCareObject(interpreterbase.InterpreterObject):
pass
@@ -40,6 +40,8 @@ class MockCustomTarget(interpreterbase.InterpreterObject):
class MockRunTarget(interpreterbase.InterpreterObject):
pass
+ADD_SOURCE = 0
+
class AstInterpreter(interpreterbase.InterpreterBase):
def __init__(self, source_root, subdir):
super().__init__(source_root, subdir)
@@ -86,28 +88,33 @@ class AstInterpreter(interpreterbase.InterpreterBase):
'is_variable' : self.func_is_variable,
})
- def func_do_nothing(self, *args, **kwargs):
+ def func_do_nothing(self, node, args, kwargs):
return True
def method_call(self, node):
return True
- def func_executable(self, *args, **kwargs):
+ def func_executable(self, node, args, kwargs):
+ if args[0] == self.targetname:
+ if self.operation == ADD_SOURCE:
+ self.add_source_to_target(node, args, kwargs)
+ else:
+ raise NotImplementedError('Bleep bloop')
return MockExecutable()
- def func_static_lib(self, *args, **kwargs):
+ def func_static_lib(self, node, args, kwargs):
return MockStaticLibrary()
- def func_shared_lib(self, *args, **kwargs):
+ def func_shared_lib(self, node, args, kwargs):
return MockSharedLibrary()
- def func_library(self, *args, **kwargs):
- return self.func_shared_lib(*args, **kwargs)
+ def func_library(self, node, args, kwargs):
+ return self.func_shared_lib(node, args, kwargs)
- def func_custom_target(self, *args, **kwargs):
+ def func_custom_target(self, node, args, kwargs):
return MockCustomTarget()
- def func_run_target(self, *args, **kwargs):
+ def func_run_target(self, node, args, kwargs):
return MockRunTarget()
def func_subdir(self, node, args, kwargs):
@@ -144,12 +151,26 @@ class AstInterpreter(interpreterbase.InterpreterBase):
def evaluate_indexing(self, node):
return 0
- def dump(self):
+ def transform(self):
self.load_root_meson_file()
self.sanity_check_ast()
self.parse_project()
self.run()
print('AST here')
+ def add_source(self, targetname, filename):
+ self.operation = ADD_SOURCE
+ self.targetname = targetname
+ self.filename = filename
+ self.transform()
+
def unknown_function_called(self, func_name):
mlog.warning('Unknown function called: ' + func_name)
+
+ def add_source_to_target(self, node, args, kwargs):
+ namespan = node.args.arguments[0].bytespan
+ buildfilename = os.path.join(self.source_root, self.subdir, environment.build_filename)
+ raw_data = open(buildfilename, 'r').read()
+ updated = raw_data[0:namespan[1]] + (", '%s'" % self.filename) + raw_data[namespan[1]:]
+ open(buildfilename, 'w').write(updated)
+ sys.exit(0)
diff --git a/mesonbuild/mparser.py b/mesonbuild/mparser.py
index f593c8e..ec5778d 100644
--- a/mesonbuild/mparser.py
+++ b/mesonbuild/mparser.py
@@ -22,10 +22,11 @@ class ParseException(MesonException):
self.colno = colno
class Token:
- def __init__(self, tid, lineno, colno, value):
+ def __init__(self, tid, lineno, colno, bytespan, value):
self.tid = tid
self.lineno = lineno
self.colno = colno
+ self.bytespan = bytespan
self.value = value
def __eq__(self, other):
@@ -87,7 +88,10 @@ class Lexer:
curline = lineno
col = mo.start()-line_start
matched = True
+ span_start = loc
loc = mo.end()
+ span_end = loc
+ bytespan = (span_start, span_end)
match_text = mo.group()
if tid == 'ignore' or tid == 'comment':
break
@@ -123,40 +127,40 @@ class Lexer:
tid = match_text
else:
value = match_text
- yield Token(tid, curline, col, value)
+ yield Token(tid, curline, col, bytespan, value)
break
if not matched:
raise ParseException('lexer', lineno, col)
-class BooleanNode:
- def __init__(self, token, value):
+class ElementaryNode:
+ def __init__(self, token):
self.lineno = token.lineno
self.colno = token.colno
+ self.value = token.value
+ self.bytespan = token.bytespan
+
+class BooleanNode(ElementaryNode):
+ def __init__(self, token, value):
+ super().__init__(token)
self.value = value
assert(isinstance(self.value, bool))
-class IdNode:
+class IdNode(ElementaryNode):
def __init__(self, token):
- self.lineno = token.lineno
- self.colno = token.colno
- self.value = token.value
+ super().__init__(token)
assert(isinstance(self.value, str))
def __str__(self):
return "Id node: '%s' (%d, %d)." % (self.value, self.lineno, self.colno)
-class NumberNode:
+class NumberNode(ElementaryNode):
def __init__(self, token):
- self.lineno = token.lineno
- self.colno = token.colno
- self.value = token.value
+ super().__init__(token)
assert(isinstance(self.value, int))
-class StringNode:
+class StringNode(ElementaryNode):
def __init__(self, token):
- self.lineno = token.lineno
- self.colno = token.colno
- self.value = token.value
+ super().__init__(token)
assert(isinstance(self.value, str))
def __str__(self):
@@ -360,7 +364,7 @@ class Parser:
try:
self.current = next(self.stream)
except StopIteration:
- self.current = Token('eof', 0, 0, None)
+ self.current = Token('eof', 0, 0, (0, 0), None)
def accept(self, s):
if self.current.tid == s: