Skip to content

Update Flutter commands on Build and Tools menu to run for all Flutter modules #6215

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 54 additions & 29 deletions flutter-idea/src/io/flutter/actions/FlutterBuildActionGroup.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,44 +17,54 @@
import com.intellij.openapi.vfs.VirtualFile;
import io.flutter.FlutterMessages;
import io.flutter.pub.PubRoot;
import io.flutter.pub.PubRoots;
import io.flutter.sdk.FlutterSdk;
import io.flutter.utils.FlutterModuleUtils;
import io.flutter.utils.ProgressHelper;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.List;

public class FlutterBuildActionGroup extends DefaultActionGroup {

public static ColoredProcessHandler build(@NotNull Project project,
public static void build(@NotNull Project project,
@NotNull PubRoot pubRoot,
FlutterSdk sdk,
BuildType buildType,
String desc) {
@NotNull FlutterSdk sdk,
@NotNull BuildType buildType,
@Nullable String desc) {
final ProgressHelper progressHelper = new ProgressHelper(project);
progressHelper.start(desc);
final ColoredProcessHandler processHandler = sdk.flutterBuild(pubRoot, buildType.type).startInConsole(project);
if (processHandler == null) {
progressHelper.done();
progressHelper.start(desc == null ? "building" : desc);
final Module module = pubRoot.getModule(project);
if (module != null) {
sdk.flutterBuild(pubRoot, buildType.type).startInModuleConsole(module, pubRoot::refresh, null);
}
else {
processHandler.addProcessListener(new ProcessAdapter() {
@Override
public void processTerminated(@NotNull ProcessEvent event) {
progressHelper.done();
final int exitCode = event.getExitCode();
if (exitCode != 0) {
FlutterMessages.showError("Error while building " + buildType, "`flutter build` returned: " + exitCode, project);
final ColoredProcessHandler processHandler = sdk.flutterBuild(pubRoot, buildType.type).startInConsole(project);
if (processHandler == null) {
progressHelper.done();
}
else {
processHandler.addProcessListener(new ProcessAdapter() {
@Override
public void processTerminated(@NotNull ProcessEvent event) {
progressHelper.done();
final int exitCode = event.getExitCode();
if (exitCode != 0) {
FlutterMessages.showError("Error while building " + buildType, "`flutter build` returned: " + exitCode, project);
}
}
}
});
});
}
}
return processHandler;
}

public enum BuildType {
AAR("aar"),
APK("apk"),
APP_BUNDLE("appbundle"),
IOS("ios");
IOS("ios"),
WEB("web");

final public String type;

Expand All @@ -64,7 +74,7 @@ public enum BuildType {
}

@Override
public void update(AnActionEvent event) {
public void update(@NotNull AnActionEvent event) {
final Presentation presentation = event.getPresentation();
final boolean enabled = isInFlutterModule(event);
presentation.setEnabled(enabled);
Expand All @@ -79,6 +89,7 @@ private static boolean isInFlutterModule(@NotNull AnActionEvent event) {
return FlutterModuleUtils.hasFlutterModule(project);
}

@Nullable
public static Module findFlutterModule(@NotNull Project project, @NotNull VirtualFile file) {
Module module = ModuleUtilCore.findModuleForFile(file, project);
if (module == null) {
Expand All @@ -98,6 +109,7 @@ public static Module findFlutterModule(@NotNull Project project, @NotNull Virtua

abstract public static class FlutterBuildAction extends AnAction {

@NotNull
abstract protected BuildType buildType();

@Override
Expand All @@ -112,45 +124,58 @@ public void actionPerformed(@NotNull AnActionEvent event) {
return;
}
final PubRoot pubRoot = PubRoot.forEventWithRefresh(event);
if (pubRoot == null) {
return;
}
final BuildType buildType = buildType();
build(project, pubRoot, sdk, buildType, presentation.getDescription());
if (pubRoot != null) {
build(project, pubRoot, sdk, buildType, presentation.getDescription());
}
else {
List<PubRoot> roots = PubRoots.forProject(project);
for (PubRoot sub : roots) {
build(project, sub, sdk, buildType, presentation.getDescription());
}
}
}
}

public static class AAR extends FlutterBuildAction {
@Override
protected BuildType buildType() {
protected @NotNull BuildType buildType() {
return BuildType.AAR;
}
}

public static class APK extends FlutterBuildAction {
@Override
protected BuildType buildType() {
protected @NotNull BuildType buildType() {
return BuildType.APK;
}
}

public static class AppBundle extends FlutterBuildAction {
@Override
protected BuildType buildType() {
protected @NotNull BuildType buildType() {
return BuildType.APP_BUNDLE;
}
}

public static class Ios extends FlutterBuildAction {
@Override
protected BuildType buildType() {
protected @NotNull BuildType buildType() {
return BuildType.IOS;
}

@Override
public void update(AnActionEvent event) {
public void update(@NotNull AnActionEvent event) {
final Presentation presentation = event.getPresentation();
presentation.setEnabled(SystemInfo.isMac);
}
}

public static class Web extends FlutterBuildAction {

@Override
protected @NotNull BuildType buildType() {
return BuildType.WEB;
}
}
}
15 changes: 14 additions & 1 deletion flutter-idea/src/io/flutter/actions/FlutterSdkAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,14 @@
import io.flutter.FlutterUtils;
import io.flutter.bazel.Workspace;
import io.flutter.pub.PubRoot;
import io.flutter.pub.PubRoots;
import io.flutter.sdk.FlutterSdk;
import io.flutter.utils.FlutterModuleUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.List;

/**
* Base class for Flutter commands.
*/
Expand Down Expand Up @@ -52,7 +55,17 @@ public void actionPerformed(@NotNull AnActionEvent event) {

FlutterInitializer.sendAnalyticsAction(this);
FileDocumentManager.getInstance().saveAllDocuments();
startCommand(project, sdk, PubRoot.forEventWithRefresh(event), event.getDataContext());
PubRoot root = PubRoot.forEventWithRefresh(event);
@NotNull DataContext context = event.getDataContext();
if (root != null) {
startCommand(project, sdk, root, context);
}
else {
List<PubRoot> roots = PubRoots.forProject(project);
for (PubRoot sub : roots) {
startCommand(project, sdk, sub, context);
}
}
}

public abstract void startCommand(@NotNull Project project,
Expand Down
8 changes: 0 additions & 8 deletions flutter-idea/src/io/flutter/pub/PubRoot.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,14 +82,6 @@ public static PubRoot forEventWithRefresh(@NotNull final AnActionEvent event) {
}
}

final Project project = event.getData(CommonDataKeys.PROJECT);
if (project != null) {
final List<PubRoot> roots = PubRoots.forProject(project);
if (!roots.isEmpty()) {
return roots.get(0);
}
}

return null;
}

Expand Down
2 changes: 1 addition & 1 deletion flutter-idea/src/io/flutter/utils/FlutterModuleUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ public static VirtualFile findXcodeProjectFile(@NotNull Project project, @Nullab
}

@Nullable
public static VirtualFile findXcodeProjectFile(@NotNull Project project) {
private static VirtualFile findXcodeProjectFile(@NotNull Project project) {
if (project.isDisposed()) return null;

// Look for Xcode metadata file in `ios/`.
Expand Down
2 changes: 2 additions & 0 deletions resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,8 @@
<!--suppress PluginXmlCapitalization -->
<action id="flutter.build.ios" text="Build iOS" description="Building a Flutter app for Apple App Store distribution"
class="io.flutter.actions.FlutterBuildActionGroup$Ios"/>
<action id="flutter.build.web" text="Build Web" description="Building a Flutter app for web"
class="io.flutter.actions.FlutterBuildActionGroup$Web"/>
</group>
<add-to-group group-id="BuildMenu" anchor="first"/>
</group>
Expand Down
2 changes: 2 additions & 0 deletions resources/META-INF/plugin_template.xml
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,8 @@
<!--suppress PluginXmlCapitalization -->
<action id="flutter.build.ios" text="Build iOS" description="Building a Flutter app for Apple App Store distribution"
class="io.flutter.actions.FlutterBuildActionGroup$Ios"/>
<action id="flutter.build.web" text="Build Web" description="Building a Flutter app for web"
class="io.flutter.actions.FlutterBuildActionGroup$Web"/>
</group>
<add-to-group group-id="BuildMenu" anchor="first"/>
</group>
Expand Down