allow nested if loop

close paren
pull/4796/head
Michael Hirsch, Ph.D 6 years ago committed by Jussi Pakkanen
parent af38722f89
commit 2ba2c7771f
  1. 1
      .gitignore
  2. 48
      tools/cmake2meson.py

1
.gitignore vendored

@ -1,3 +1,4 @@
.mypy_cache/
/.project
/.pydevproject
/.settings

@ -14,9 +14,12 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import sys, os
from typing import List
from pathlib import Path
import sys
import re
class Token:
def __init__(self, tid, value):
self.tid = tid
@ -83,7 +86,7 @@ class Lexer:
raise RuntimeError('Lexer got confused line %d column %d' % (lineno, col))
class Parser:
def __init__(self, code):
def __init__(self, code: str):
self.stream = Lexer().lex(code)
self.getsym()
@ -140,13 +143,13 @@ class Converter:
'enable_testing': True,
'include': True}
def __init__(self, cmake_root):
self.cmake_root = cmake_root
def __init__(self, cmake_root: str):
self.cmake_root = Path(cmake_root).expanduser()
self.indent_unit = ' '
self.indent_level = 0
self.options = []
self.options = [] # type: List[tuple]
def convert_args(self, args, as_array=True):
def convert_args(self, args: List[Token], as_array: bool = True):
res = []
if as_array:
start = '['
@ -229,7 +232,18 @@ class Converter:
line = '%s = %s\n' % (varname, self.convert_args(t.args[1:]))
elif t.name == 'if':
postincrement = 1
line = 'if %s' % self.convert_args(t.args, False)
try:
line = 'if %s' % self.convert_args(t.args, False)
except AttributeError: # complex if statements
line = t.name
for arg in t.args:
if isinstance(arg, Token):
line += ' ' + arg.value
elif isinstance(arg, list):
line += ' ('
for a in arg:
line += ' ' + a.value
line += ' )'
elif t.name == 'elseif':
preincrement = -1
postincrement = 1
@ -251,32 +265,32 @@ class Converter:
outfile.write('\n')
self.indent_level += postincrement
def convert(self, subdir=''):
if subdir == '':
def convert(self, subdir: Path = None):
if not subdir:
subdir = self.cmake_root
cfile = os.path.join(subdir, 'CMakeLists.txt')
cfile = Path(subdir).expanduser() / 'CMakeLists.txt'
try:
with open(cfile) as f:
with cfile.open() as f:
cmakecode = f.read()
except FileNotFoundError:
print('\nWarning: No CMakeLists.txt in', subdir, '\n')
print('\nWarning: No CMakeLists.txt in', subdir, '\n', file=sys.stderr)
return
p = Parser(cmakecode)
with open(os.path.join(subdir, 'meson.build'), 'w') as outfile:
with (subdir / 'meson.build').open('w') as outfile:
for t in p.parse():
if t.name == 'add_subdirectory':
# print('\nRecursing to subdir',
# os.path.join(self.cmake_root, t.args[0].value),
# self.cmake_root / t.args[0].value,
# '\n')
self.convert(os.path.join(subdir, t.args[0].value))
self.convert(subdir / t.args[0].value)
# print('\nReturning to', self.cmake_root, '\n')
self.write_entry(outfile, t)
if subdir == self.cmake_root and len(self.options) > 0:
self.write_options()
def write_options(self):
filename = os.path.join(self.cmake_root, 'meson_options.txt')
with open(filename, 'w') as optfile:
filename = self.cmake_root / 'meson_options.txt'
with filename.open('w') as optfile:
for o in self.options:
(optname, description, default) = o
if default is None:

Loading…
Cancel
Save