// Copyright 2016 Pants project contributors (see CONTRIBUTORS.md). // Licensed under the Apache License, Version 2.0 (see LICENSE). package com.twitter.intellij.pants.compiler.actions; import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.twitter.intellij.pants.util.PantsConstants; import com.twitter.intellij.pants.util.PantsUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.LinkedList; import java.util.List; import java.util.Optional; /** * PantsCompileActionGroup is an dynamic action group to compile Pants targets */ public class PantsCompileActionGroup extends ActionGroup { @NotNull @Override public AnAction[] getChildren(@Nullable AnActionEvent event) { // Deletes existing make and compile options. ActionManager actionManager = ActionManager.getInstance(); // TODO: don't remove these actions or put on our own unless we're in a // pants project, so we don't clobber these actions in a non-pants project DefaultActionGroup actionGroup = (DefaultActionGroup) actionManager.getAction(PantsConstants.ACTION_COMPILE_GROUP_ID); actionGroup.remove(actionManager.getAction(IdeActions.ACTION_MAKE_MODULE)); actionGroup.remove(actionManager.getAction(IdeActions.ACTION_COMPILE)); final AnAction[] emptyAction = new AnAction[0]; if (event == null) { return emptyAction; } Project project = event.getProject(); Optional<VirtualFile> eventFile = PantsUtil.getFileForEvent(event); // TODO: signal if no project found? if (project == null || !eventFile.isPresent()) { return emptyAction; } VirtualFile file = eventFile.get(); List<AnAction> actions = new LinkedList<>(); Module module = ModuleUtil.findModuleForFile(file, project); if (module == null) { return emptyAction; } List<String> targetAddresses = PantsUtil.getNonGenTargetAddresses(module); // TODO: signal if no addresses found? if (targetAddresses.isEmpty()) { return emptyAction; } actions.add(new PantsLintTargetAction(targetAddresses)); // Adds compile all option for modules with multiple targets. if (targetAddresses.size() > 1) { actions.add(new PantsCompileAllTargetsInModuleAction(Optional.of(module))); } targetAddresses.forEach(target -> actions.add(new PantsCompileTargetAction(target))); return actions.toArray(emptyAction); } }