mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
* Remove trailing spaces * Setup Bundler in some scripts * Update grammar index * Make prune-grammars script to be callable in a script directory * Prune unused xquery grammar repo source.xq by language-jsoniq is actual tm_scope for XQuery. * Remove xquery submodule git submodule deinit vendor/grammars/xquery/ git rm vendor/grammars/xquery/ * Fix invocation of script/list-grammars This fixes #3339. * Make add-grammars script to be callable in a script directory * Generate samples.json before running list-grammars list-grammars requires linguist.
61 lines
1.6 KiB
Ruby
Executable File
61 lines
1.6 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
|
|
require "bundler/setup"
|
|
require "json"
|
|
require "linguist"
|
|
require "set"
|
|
require "yaml"
|
|
|
|
ROOT = File.expand_path("../../", __FILE__)
|
|
|
|
def find_includes(json)
|
|
case json
|
|
when Hash
|
|
result = []
|
|
if inc = json["include"]
|
|
result << inc.split("#", 2).first unless inc.start_with?("#", "$")
|
|
end
|
|
result + json.values.flat_map { |v| find_includes(v) }
|
|
when Array
|
|
json.flat_map { |v| find_includes(v) }
|
|
else
|
|
[]
|
|
end
|
|
end
|
|
|
|
def transitive_includes(scope, includes)
|
|
scopes = Set.new
|
|
queue = includes[scope] || []
|
|
while s = queue.shift
|
|
next if scopes.include?(s)
|
|
scopes << s
|
|
queue += includes[s] || []
|
|
end
|
|
scopes
|
|
end
|
|
|
|
includes = {}
|
|
Dir[File.join(ROOT, "grammars/*.json")].each do |path|
|
|
scope = File.basename(path).sub(/\.json/, '')
|
|
json = JSON.load(File.read(path))
|
|
incs = find_includes(json)
|
|
next if incs.empty?
|
|
includes[scope] ||= []
|
|
includes[scope] += incs
|
|
end
|
|
|
|
yaml = YAML.load(File.read(File.join(ROOT, "grammars.yml")))
|
|
language_scopes = Linguist::Language.all.map(&:tm_scope).to_set
|
|
|
|
# The set of used scopes is the scopes for each language, plus all the scopes
|
|
# they include, transitively.
|
|
used_scopes = language_scopes + language_scopes.flat_map { |s| transitive_includes(s, includes).to_a }.to_set
|
|
|
|
unused = yaml.reject { |repo, scopes| scopes.any? { |scope| used_scopes.include?(scope) } }
|
|
|
|
puts "Unused grammar repos"
|
|
puts unused.map { |repo, scopes| sprintf("%-100s %s", repo, scopes.join(", ")) }.sort.join("\n")
|
|
|
|
yaml.delete_if { |k| unused.key?(k) }
|
|
File.write(File.join(ROOT, "grammars.yml"), YAML.dump(yaml))
|