@@ -40,6 +40,7 @@ exports.Lexer = class Lexer
4040 @indebt = 0 # The over-indentation at the current level.
4141 @outdebt = 0 # The under-outdentation at the current level.
4242 @indents = [] # The stack of all current indentation levels.
43+ @indentLiteral = ' ' # The indentation
4344 @ends = [] # The stack for pairing up tokens.
4445 @tokens = [] # Stream of parsed tokens in the form `['TYPE', value, location data]`.
4546 @seenFor = no # Used to recognize FORIN and FOROF tokens.
@@ -351,6 +352,16 @@ exports.Lexer = class Lexer
351352 size = indent .length - 1 - indent .lastIndexOf ' \n '
352353 noNewlines = @ unfinished ()
353354
355+ newIndentLiteral = if size > 0 then indent[- size.. ] else ' '
356+ unless / ^ (. ? )\1 * $ / .exec newIndentLiteral
357+ @ error ' mixed indentation' , offset : indent .length
358+ return indent .length
359+
360+ minLiteralLength = Math .min newIndentLiteral .length , @indentLiteral .length
361+ if newIndentLiteral[... minLiteralLength] isnt @indentLiteral [... minLiteralLength]
362+ @ error ' indentation mismatch' , offset : indent .length
363+ return indent .length
364+
354365 if size - @indebt is @indent
355366 if noNewlines then @ suppressNewlines () else @ newlineToken 0
356367 return indent .length
@@ -362,13 +373,15 @@ exports.Lexer = class Lexer
362373 return indent .length
363374 unless @tokens .length
364375 @baseIndent = @indent = size
376+ @indentLiteral = newIndentLiteral
365377 return indent .length
366378 diff = size - @indent + @outdebt
367379 @ token ' INDENT' , diff, indent .length - size, size
368380 @indents .push diff
369381 @ends .push {tag : ' OUTDENT' }
370382 @outdebt = @indebt = 0
371383 @indent = size
384+ @indentLiteral = newIndentLiteral
372385 else if size < @baseIndent
373386 @ error ' missing indentation' , offset : indent .length
374387 else
@@ -405,6 +418,7 @@ exports.Lexer = class Lexer
405418
406419 @ token ' TERMINATOR' , ' \n ' , outdentLength, 0 unless @ tag () is ' TERMINATOR' or noNewlines
407420 @indent = decreasedIndent
421+ @indentLiteral = @indentLiteral [... decreasedIndent]
408422 this
409423
410424 # Matches and consumes non-meaningful whitespace. Tag the previous token
0 commit comments