Commit 2ac6a622 authored by Robert Bradshaw's avatar Robert Bradshaw

Fix indent stripping.

parent 780e4050
...@@ -81,6 +81,7 @@ def cython_inline(code, ...@@ -81,6 +81,7 @@ def cython_inline(code,
locals=None, locals=None,
globals=None, globals=None,
**kwds): **kwds):
code = strip_common_indent(code)
ctx = Context(include_dirs, default_options) ctx = Context(include_dirs, default_options)
if locals is None: if locals is None:
locals = inspect.currentframe().f_back.f_back.f_locals locals = inspect.currentframe().f_back.f_back.f_locals
...@@ -140,28 +141,25 @@ def __invoke(%(params)s): ...@@ -140,28 +141,25 @@ def __invoke(%(params)s):
return __import__(module).__invoke(*arg_list) return __import__(module).__invoke(*arg_list)
non_space = re.compile('[^ ]') non_space = re.compile('[^ ]')
def strip_common_indent(lines): def strip_common_indent(code):
min_indent = None min_indent = None
lines = code.split('\n')
for line in lines: for line in lines:
if not line: match = non_space.search(line)
continue # empty if not match:
indent = non_space.search(line).start()
if indent == len(line):
continue # blank continue # blank
elif line[indent] == '#': indent = match.start()
if line[indent] == '#':
continue # comment continue # comment
elif min_indent is None or min_indent > indent: elif min_indent is None or min_indent > indent:
min_indent = indent min_indent = indent
for line in lines: for ix, line in enumerate(lines):
if not line: match = non_space.search(line)
continue if not match or line[indent] == '#':
indent = non_space.search(line).start()
if indent == len(line):
continue continue
elif line[indent] == '#':
yield line
else: else:
yield line[min_indent:] lines[ix] = line[min_indent:]
return '\n'.join(lines)
module_statement = re.compile(r'^((cdef +(extern|class))|cimport|(from .+ cimport)|(from .+ import +[*]))') module_statement = re.compile(r'^((cdef +(extern|class))|cimport|(from .+ cimport)|(from .+ import +[*]))')
def extract_func_code(code): def extract_func_code(code):
...@@ -170,7 +168,7 @@ def extract_func_code(code): ...@@ -170,7 +168,7 @@ def extract_func_code(code):
# TODO: string literals, backslash # TODO: string literals, backslash
current = function current = function
code = code.replace('\t', ' ') code = code.replace('\t', ' ')
lines = strip_common_indent(code.split('\n')) lines = code.split('\n')
for line in lines: for line in lines:
if not line.startswith(' '): if not line.startswith(' '):
if module_statement.match(line): if module_statement.match(line):
......
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