Skip to content

Commit

Permalink
Merge pull request universal-ctags#3315 from masatake/rake
Browse files Browse the repository at this point in the history
Rake: extract tasks defined with special ways
  • Loading branch information
masatake authored Mar 26, 2022
2 parents dc97d47 + d6e2517 commit e525892
Show file tree
Hide file tree
Showing 4 changed files with 159 additions and 30 deletions.
2 changes: 2 additions & 0 deletions Units/parser-rake.r/xtasks.d/args.ctags
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
--sort=no
--fields=+{typeref}K
15 changes: 15 additions & 0 deletions Units/parser-rake.r/xtasks.d/expected.tags
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
spec input.rake /^namespace :spec do$/;" namespace
setup input.rake /^ task :setup => ["app:test:vmdb:setup"]$/;" task namespace:spec
spec input.rake /^RSpec::Core::RakeTask.new(:spec => ['app:test:spec_deps', 'app:test:providers_common']) do |t|$/;" xtask typeref:typename:RSpec::Core::RakeTask.new
cucumber input.rake /^Cucumber::Rake::Task.new(:cucumber)$/;" xtask typeref:typename:Cucumber::Rake::Task.new
spec input.rake /^RSpec::Core::RakeTask.new(:spec) do |t|$/;" xtask typeref:typename:RSpec::Core::RakeTask.new
spec input.rake /^namespace :spec do$/;" namespace
ui input.rake /^ RSpec::Core::RakeTask.new(:ui) do |t|$/;" xtask namespace:spec typeref:typename:RSpec::Core::RakeTask.new
rubocop input.rake /^task :rubocop do$/;" task
clobber input.rake /^task :clobber do$/;" task
rdoc input.rake /^task :rdoc do$/;" task
relish input.rake /^task :relish, :version do |_t, args|$/;" task
relish_staging input.rake /^task :relish_staging do$/;" task
default input.rake /^task :default => [:spec, :cucumber, :rubocop]$/;" task
verify_private_key_present input.rake /^task :verify_private_key_present do$/;" task
build input.rake /^task :build => :verify_private_key_present$/;" task
97 changes: 97 additions & 0 deletions Units/parser-rake.r/xtasks.d/input.rake
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# Taken from https://github.com/ManageIQ/manageiq-providers-vmware/blob/master/lib/tasks_private/spec.rake
namespace :spec do
desc "Setup environment specs"
task :setup => ["app:test:vmdb:setup"]
end

desc "Run all specs"
RSpec::Core::RakeTask.new(:spec => ['app:test:spec_deps', 'app:test:providers_common']) do |t|
EvmTestHelper.init_rspec_task(t)
end

# Taken from https://github.com/rspec/rspec-core/blob/main/Rakefile
require "bundler"
Bundler.setup
Bundler::GemHelper.install_tasks

require "rake"
require "yaml"

require "rspec/core/rake_task"

require "cucumber/rake/task"
Cucumber::Rake::Task.new(:cucumber)

desc "Run all examples"
RSpec::Core::RakeTask.new(:spec) do |t|
t.ruby_opts = %w[-w]
end

namespace :spec do
desc "Run ui examples"
RSpec::Core::RakeTask.new(:ui) do |t|
t.ruby_opts = %w[-w]
t.rspec_opts = %w[--tag ui]
end
end

desc 'Run RuboCop on the lib directory'
task :rubocop do
sh 'bundle exec rubocop lib'
end

desc "delete generated files"
task :clobber do
sh 'find . -name "*.rbc" | xargs rm'
sh 'rm -rf pkg'
sh 'rm -rf tmp'
sh 'rm -rf coverage'
sh 'rm -rf .yardoc'
sh 'rm -rf doc'
end

desc "generate rdoc"
task :rdoc do
sh "yardoc"
end

with_changelog_in_features = lambda do |&block|
begin
sh "cp Changelog.md features/"
block.call
ensure
sh "rm features/Changelog.md"
end
end

desc "Push docs/cukes to relishapp using the relish-client-gem"
task :relish, :version do |_t, args|
raise "rake relish[VERSION]" unless args[:version]

with_changelog_in_features.call do
if `relish versions rspec/rspec-core`.split.map(&:strip).include? args[:version]
puts "Version #{args[:version]} already exists"
else
sh "relish versions:add rspec/rspec-core:#{args[:version]}"
end
sh "relish push rspec/rspec-core:#{args[:version]}"
end
end

desc "Push to relish staging environment"
task :relish_staging do
with_changelog_in_features.call do
sh "relish push rspec-staging/rspec-core"
end
end

task :default => [:spec, :cucumber, :rubocop]

task :verify_private_key_present do
private_key = File.expand_path('~/.gem/rspec-gem-private_key.pem')
unless File.exist?(private_key)
raise "Your private key is not present. This gem should not be built without it."
end
end

task :build => :verify_private_key_present
75 changes: 45 additions & 30 deletions parsers/rake.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ typedef enum {
K_FILE,
K_DIRECTORY,
K_MULTITASK,
K_XTASK,
} rakeKind;

/*
Expand All @@ -58,6 +59,8 @@ static kindDefinition RakeKinds [] = {
ATTACH_SEPARATORS(RakeGenericSeparators)},
{ true, 'm', "multitask", "multi tasks",
ATTACH_SEPARATORS(RakeGenericSeparators)},
{ true, 'x', "xtask", "tasks defined with special constructor",
ATTACH_SEPARATORS(RakeGenericSeparators)},
};

/*
Expand Down Expand Up @@ -120,6 +123,11 @@ static int makeSimpleRakeTag (vString *vstr, int kindIndex, rubySubparser *subpa
return r;
}

struct taskType {
const char *keyword;
rakeKind kind;
};

static int parseTask (rubySubparser *s, int kind, const unsigned char **cp)
{
vString *vstr = NULL;
Expand All @@ -134,16 +142,33 @@ static int parseTask (rubySubparser *s, int kind, const unsigned char **cp)
return CORK_NIL;
}

static int lineNotify (rubySubparser *s, const unsigned char **cp)
static int parseXTask (rubySubparser *s, struct taskType *xtask, const unsigned char **cp)
{
int r = CORK_NIL;;
rubySkipWhitespace (cp);
if (**cp == '(')
{
vString *vstr = NULL;
++*cp;
rubySkipWhitespace (cp);
vstr = readTask (cp);
if (vstr)
{
int r = makeSimpleRakeTag (vstr, xtask->kind, s);
vStringDelete (vstr);
tagEntryInfo *e = getEntryInCorkQueue (r);
e->extensionFields.typeRef [0] = eStrdup ("typename");
e->extensionFields.typeRef [1] = eStrdup (xtask->keyword);
return r;
}
}
return CORK_NIL;
}

struct taskType {
const char *keyword;
rakeKind kind;
} taskTypes [] = {
static int lineNotify (rubySubparser *s, const unsigned char **cp)
{
struct taskType taskTypes [] = {
{ "task", K_TASK },
{ "namespace", K_NAMESPACE },
{ "namespace", K_NAMESPACE },
{ "file", K_FILE },
{ "directory", K_DIRECTORY },
{ "multitask", K_MULTITASK },
Expand All @@ -152,34 +177,24 @@ static int lineNotify (rubySubparser *s, const unsigned char **cp)
for (int i = 0; i < ARRAY_SIZE(taskTypes); i++)
{
if (rubyCanMatchKeywordWithAssign (cp, taskTypes[i].keyword))
{
r = parseTask (s, taskTypes[i].kind, cp);
if (r != CORK_NIL)
return r;
}
return parseTask (s, taskTypes[i].kind, cp);
}

#if 0
if (rubyCanMatchKeywordWithAssign (cp, "Rake::TestTask.new"))
struct taskType xtaskTypes [] = {
{ "RSpec::Core::RakeTask.new", K_XTASK },
{ "Cucumber::Rake::Task.new", K_XTASK },
{ "Rake::TestTask.new", K_XTASK },
{ "Rake::PackageTask.new", K_XTASK },
/* ... */
};

for (int i = 0; i < ARRAY_SIZE(xtaskTypes); i++)
{
rubySkipWhitespace (cp);
if (**cp == '(')
{
vString *vstr = NULL;
++*cp;
rubySkipWhitespace (cp);
vstr = readTask (cp);
if (vstr)
{
int r = makeSimpleTag (vstr, K_TARGET);
vStringDelete (vstr);
return r;
}
}
if (rubyCanMatchKeywordWithAssign (cp, xtaskTypes[i].keyword))
return parseXTask (s, xtaskTypes + i, cp);;
}
#endif

return r;
return CORK_NIL;
}

static void inputStart (subparser *s)
Expand Down

0 comments on commit e525892

Please sign in to comment.