blob: bbf21f48a45c04ee46bfd15409d63db39812b39d [file] [log] [blame]
"""IntelliJ plugin debug target rule used for debugging IntelliJ plugins.
Creates a plugin target debuggable from IntelliJ. Any files in
the 'deps' attribute are deployed to the plugin sandbox.
Any files are stripped of their prefix and installed into
<sandbox>/plugins. If you need structure, first put the files
into //build_defs:build_defs%repackage_files.
intellij_plugin_debug_targets can be nested.
repackaged_files(
name = "foo_files",
srcs = [
":my_plugin_jar",
":my_additional_plugin_files",
],
prefix = "plugins/foo/lib",
)
intellij_plugin_debug_target(
name = "my_debug_target",
deps = [
":my_jar",
],
)
"""
load("//build_defs:build_defs.bzl", "repackaged_files_data")
SUFFIX = ".intellij-plugin-debug-target-deploy-info"
def _trim_start(path, prefix):
return path[len(prefix):] if path.startswith(prefix) else path
def _repackaged_deploy_file(f, prefix):
return struct(
src = f,
deploy_location = prefix + "/" + f.basename,
)
def _flat_deploy_file(f):
return struct(
src = f,
deploy_location = f.basename,
)
def _intellij_plugin_debug_target_aspect_impl(target, ctx):
aspect_intellij_plugin_deploy_info = None
files = target.files
if ctx.rule.kind == "intellij_plugin_debug_target":
aspect_intellij_plugin_deploy_info = target.intellij_plugin_deploy_info
elif ctx.rule.kind == "_repackaged_files":
data = target[repackaged_files_data]
prefix = data.prefix
aspect_intellij_plugin_deploy_info = struct(
deploy_files = [_repackaged_deploy_file(f, prefix) for f in data.files],
)
# TODO(brendandouglas): Remove when migrating to Bazel 0.5, when DefaultInfo
# provider can be populated by '_repackaged_files' directly
files = files | data.files
else:
aspect_intellij_plugin_deploy_info = struct(
deploy_files = [_flat_deploy_file(f) for f in target.files],
)
return struct(
input_files = files,
aspect_intellij_plugin_deploy_info = aspect_intellij_plugin_deploy_info,
)
_intellij_plugin_debug_target_aspect = aspect(
implementation = _intellij_plugin_debug_target_aspect_impl,
)
def _build_deploy_info_file(deploy_file):
return struct(
execution_path = deploy_file.src.path,
deploy_location = deploy_file.deploy_location,
)
def _intellij_plugin_debug_target_impl(ctx):
files = depset()
deploy_files = []
for target in ctx.attr.deps:
files = files | target.input_files
deploy_files.extend(target.aspect_intellij_plugin_deploy_info.deploy_files)
deploy_info = struct(
deploy_files = [_build_deploy_info_file(f) for f in deploy_files]
)
output = ctx.new_file(ctx.label.name + SUFFIX)
ctx.file_action(output, deploy_info.to_proto())
# We've already consumed any dependent intellij_plugin_debug_targets into our own,
# do not build or report these
files = depset([f for f in files if not f.path.endswith(SUFFIX)])
files = files | depset([output])
return struct(
files = files,
intellij_plugin_deploy_info = struct(
deploy_files = deploy_files,
)
)
intellij_plugin_debug_target = rule(
implementation = _intellij_plugin_debug_target_impl,
attrs = {
"deps": attr.label_list(aspects = [_intellij_plugin_debug_target_aspect]),
},
)