diff --git a/lib/bashcov/lexer.rb b/lib/bashcov/lexer.rb index 6c8ceb8..649fec3 100644 --- a/lib/bashcov/lexer.rb +++ b/lib/bashcov/lexer.rb @@ -27,10 +27,17 @@ def initialize(filename, coverage) # Process and complete initial coverage. # @return [void] - def complete_coverage + def complete_coverage # rubocop:disable Metrics/MethodLength lines = IO.read(@filename).encode("utf-8", invalid: :replace).lines lines.each_with_index do |line, lineno| + # multi-line arrays + mark_multiline( + lines, lineno, + /\A[^\n]*\b=\([^()]*\)/, + forward: false + ) + # heredoc mark_multiline( lines, lineno, @@ -43,6 +50,12 @@ def complete_coverage /\A[^\n]+\\$(\s*['"][^'"]*['"]\s*\\$){1,}\s*['"][^'"]*['"]\s*$/ ) + # simple line continuations with backslashes + mark_multiline( + lines, lineno, + /\A([^\n&|;]*[^\\&|;](\\\\)*\\\n)+[^\n&|;]*[^\n\\&|;](\\\\)*$/ + ) + # multiline string concatenated with newlines %w[' "].each do |char| mark_multiline( diff --git a/spec/support/test_app.rb b/spec/support/test_app.rb index 3eb0f47..4738e08 100644 --- a/spec/support/test_app.rb +++ b/spec/support/test_app.rb @@ -15,6 +15,7 @@ def uncovered_files def expected_coverage # rubocop:disable Metrics/MethodLength { "#{test_app}/never_called.sh" => [nil, nil, 0], + "#{test_app}/scripts/array.sh" => [nil, nil, 1, 1, 1, 1, 1, 1], "#{test_app}/scripts/case.sh" => [nil, nil, nil, 2, nil, 1, nil, nil, 0, 1, nil, nil, nil, 1, 1], "#{test_app}/scripts/cd.sh" => [nil, nil, 1, 2, nil, 3, 1, 3, nil, 2, nil, nil, 1, nil, 3, nil, 6, nil, 1, nil, 1], "#{test_app}/scripts/delete.sh" => [nil, nil, 1, 1, 1, 1, nil, 1, 1], @@ -31,6 +32,7 @@ def expected_coverage # rubocop:disable Metrics/MethodLength "#{test_app}/scripts/unicode.sh" => [nil, nil, nil, 1, nil, 1], "#{test_app}/scripts/multiline.sh" => [nil, nil, nil, 1, nil, 0, nil, 1, nil, 1, nil, 0, nil, nil, 1, 2, 1, 1, 0, nil, nil, 2, nil, nil, 1, 1, 1, 1, nil, 1, 1, 1, 1, 1, nil, 1, 1, 1, 1, nil, 1], "#{test_app}/scripts/multiline2.sh" => [nil, nil, 1, 1, 1, 1, nil, 1, 1, 1, 1, nil, 1, 1, 1, 1, 1, 1, nil, 1, 1, 1, 1, 1, 1, 1, 1, nil, 1, 1, 1, nil, 1], + "#{test_app}/scripts/multiline3.sh" => [nil, nil, 1, 1, 1, 1], "#{test_app}/scripts/executable" => [nil, nil, 1], "#{test_app}/scripts/exit_non_zero.sh" => [nil, nil, 1], "#{test_app}/scripts/no_shebang.sh" => [nil, nil, nil, nil, 0], diff --git a/spec/test_app/scripts/array.sh b/spec/test_app/scripts/array.sh new file mode 100755 index 0000000..3e23bf7 --- /dev/null +++ b/spec/test_app/scripts/array.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +arr=( + foo + bar + baz + quux +) diff --git a/spec/test_app/scripts/multiline3.sh b/spec/test_app/scripts/multiline3.sh new file mode 100755 index 0000000..487d87f --- /dev/null +++ b/spec/test_app/scripts/multiline3.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +echo 1 \ + 2 \ + 3 \ + 4