diff options
Diffstat (limited to '')
| -rwxr-xr-x | scripts/build | 116 | 
1 files changed, 107 insertions, 9 deletions
| diff --git a/scripts/build b/scripts/build index 4d5b4ddc..780ca5b2 100755 --- a/scripts/build +++ b/scripts/build @@ -251,9 +251,15 @@ def generate_ftdetect    EOS -  ambiguous_extensions = languages.flat_map { |_, v| v["extensions"] || [] } -    .group_by(&:itself).transform_values(&:count) -    .select { |a, b| b > 1 }.keys.map { |a| a[1..] }.to_set +  ambiguous_extensions = PACKAGES.flat_map { |e| e["filetypes"] }.flat_map do |e| +    if e["linguist"] +      ((languages[e["linguist"]]["extensions"] || []).map { |e| e[1..-1] } | e.fetch("extra_extensions", [])) - e.fetch("ignored_extensions", []) +    else +      e.fetch("extensions", []) +    end +  end.group_by(&:itself).transform_values(&:count).select { |a, b| b > 1 }.keys.to_set + +  expected_filetypes = detect_filetypes    for package in PACKAGES      name = package.fetch("name") @@ -266,8 +272,9 @@ def generate_ftdetect      filetypes = package["filetypes"] or raise "Unknown filetype for: #{package["name"]}"      for filetype in filetypes +      name = filetype.fetch("name")        syntax = filetype["syntax"] ? " syntax=#{filetype["syntax"]}" : "" -      set_command = package.fetch("custom_set", "set ft=#{filetype.fetch("name")}#{syntax}") +      set_command = package.fetch("custom_set", "set ft=#{name}#{syntax}")        linguist = filetype["linguist"] ? languages.fetch(filetype["linguist"]) : {}        extensions = filetype["extensions"] || linguist.fetch("extensions", []).map { |e| e[1..] } @@ -276,6 +283,16 @@ def generate_ftdetect        filenames = filetype["filenames"] || linguist.fetch("filenames", [])        filenames = (filenames | filetype.fetch("extra_filenames", [])) - filetype.fetch("ignored_filenames", []) +      if expected_filetypes[name] && !filetype["syntax"] +        for e in expected_filetypes.fetch(name)[:extensions] - extensions - expand_all(filetype.fetch("ignored_extensions", [])) +          puts "Probable missing extension for #{name}: #{e}" +        end + +        for e in expand_all(expected_filetypes.fetch(name)[:filenames]) - expand_all(filenames).flat_map { |e| [e, e.gsub(/^\./, '')] } - expand_all(filetype.fetch("ignored_filenames", [])) - ['*'] +          puts "Probable missing filename for #{name}: #{e}" +        end +      end +        for extension in extensions.sort          outer_filetype = filetype["outer_filetype"]          if outer_filetype @@ -306,6 +323,12 @@ def generate_ftdetect      let &cpo = s:cpo_save      unlet s:cpo_save    EOS +  +  # filetypes = detect_filetypes +  # +  # for filetype in filetypes +  #    +  # end    File.write('ftdetect/polyglot.vim', output)  end @@ -333,11 +356,86 @@ def generate_tests    end    File.write('scripts/test_filetypes.vim', output) + + +end + +def brace_expansion(s) +  r=1                                       # Dummy value to forward-declare the parse function `r` +  t=->x{                                    # Function to parse a bracket block +    x=x[0].gsub(/^{(.*)}$/){$1}             # Remove outer brackets if both are present +                                            # x[0] is required because of quirks in the `scan` function +    x=x.scan(/(({(\g<1>|,)*}|[^,{}]|(?<=,|^)(?=,|$))+)/) +                                            # Regex black magic: collect elements of outer bracket +    x.map{|i|i=i[0];i[?{]?r[i]:i}.flatten   # For each element with brackets, run parse function +  } +  r=->x{                                    # Function to parse bracket expansions a{b,c}{d,e} +    i=x.scan(/({(\g<1>)*}|[^{} ]+)/)        # Regex black magic: scan for adjacent sets of brackets +    i=i.map(&t)                             # Map all elements against the bracket parser function `t` +    i.shift.product(*i).map &:join          # Combine the adjacent sets with cartesian product and join them together +  } +  s.split.map(&r).flatten +end + +def square_expansion(s) +  return [s] unless s.include?('[') +  s.scan(/(\[[^\]]+\]|[^\[]+)/).map { |x| x[0] } +    .map { |x| x[0] == "[" ? x[1..-2].split("") : [x] } +    .reduce(&:product).map(&:flatten).map(&:join) +end + +def comma_expanson(s) +  s.scan(/{[^{]+}|[^{]+/).map { |a| a[0] == "{" ? a : a.split(",", -1) }.reduce([]) do |a, b| +    a.size > 0 ? +      (b.is_a?(String) ? +         a[0..-2] + [a[-1] + b] : +         a[0..-2] + [a[-1] + b[0]] + b[1..-1]) : +      [b].flatten +  end +end + +def expand_all(pattern) +  if pattern.is_a?(Array) +    return pattern.flat_map { |p| expand_all(p) } +  end + +  comma_expanson(pattern).flat_map do |e| +    brace_expansion(e).flat_map do |e2| +      square_expansion(e2) +    end +  end +end + +def detect_filetypes +  filetypes = Dir['tmp/*/ftdetect/*.vim'].flat_map do |file| +    contents = File.read(file).gsub(/^\s*au(tocmd)?!?\s*$/, '') +    results = contents.scan(/^\s*(?:au!|au|au[^g][^ ]*) +(?:\S+)\s+(\S+)[\s\\]+([^\n]+)/) +    results = results.map do |a, b| +      [ +        a, +        b.gsub(/call (?:s:setf|s:StarSetf)\('([^']+)'\)/i, 'setf \1') +          .gsub(/set(?:local)?\s+(?:ft|filetype)=(\S+)/, 'setf \1') +        .gsub(/setf\S*/, 'setf') +        .gsub(/.*setf\s+(\S+).*/, 'setf \1') +      ] +    end.select { |a, b| b.match(/setf \S+/) }.map { |a, b| [a, b.split(" ")[1]] } +    results +  end + +  Hash[filetypes.flat_map do |ext, filetype| +    expand_all(ext).map { |e| [filetype, e] } +  end.group_by { |a, b| a }.map { |a, b| [a, b.map { |c, d| d }] }.map { |a, b| +    [a, { +      extensions: b.select { |x| x.match(/^\*\.[^\/]+$/) }.map { |a| a.strip[2..] }, +      filenames: b.select { |x| !x.match(/^\*\.[^\/]+$/) } +    }] +  }]  end -download -extract +# download +# extract  generate_ftdetect -generate_tests -puts(" Bye! Have a wonderful time!") -FileUtils.rm_rf("tmp") +# generate_tests +# puts(" Bye! Have a wonderful time!") +# FileUtils.rm_rf("tmp") +#puts(comma_expanson("*.clj,*.cljs,*.edn,*.cljx,*.cljc,{build,profile}.boot")) | 
