Skip to content

Commit

Permalink
Performance: make readDollarExpr fail early if no $
Browse files Browse the repository at this point in the history
  • Loading branch information
koalaman committed Jun 30, 2016
1 parent 43c2606 commit 6c1abb2
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion ShellCheck/Parser.hs
Original file line number Diff line number Diff line change
Expand Up @@ -1328,7 +1328,12 @@ prop_readDollarExpression1 = isOk readDollarExpression "$(((1) && 3))"
prop_readDollarExpression2 = isWarning readDollarExpression "$(((1)) && 3)"
prop_readDollarExpression3 = isWarning readDollarExpression "$((\"$@\" &); foo;)"
readDollarExpression :: Monad m => SCParser m Token
readDollarExpression = arithmetic <|> readDollarExpansion <|> readDollarBracket <|> readDollarBraceCommandExpansion <|> readDollarBraced <|> readDollarVariable
readDollarExpression = do
-- The grammar should have been designed along the lines of readDollarExpr = char '$' >> stuff, but
-- instead, each subunit parses its own $. This results in ~7 1-3 char lookaheads instead of one 1-char.
-- Instead of optimizing the grammar, here's a green cut that decreases shellcheck runtime by 10%:
lookAhead $ char '$'
arithmetic <|> readDollarExpansion <|> readDollarBracket <|> readDollarBraceCommandExpansion <|> readDollarBraced <|> readDollarVariable
where
arithmetic = readAmbiguous "$((" readDollarArithmetic readDollarExpansion (\pos ->
parseNoteAt pos WarningC 1102 "Shells disambiguate $(( differently or not at all. If the first $( should start command substitution, add a space after it.")
Expand Down

0 comments on commit 6c1abb2

Please sign in to comment.