Skip to content

Commit da5eea7

Browse files
authored
Removal of the FlutterModuleType, issue #748. (#1213)
* Removal of the FlutterModuleType, issue #748. Flutter modules are no longer defined as modules with the FlutterModuleType, instead they are defined as modules with the Dart SDK enabled on the module, where the SDK path is defined inside of a Flutter SDK. See FlutterModuleUtils.isFlutterModule(). Flutter Bazel projects are defined by FlutterModuleUtils.getFlutterBazelWorkspace(), as a project that has a Dart SDK enabled on some module and the module has flutter or module in the directory path. The requirement to have the Dart SDK is a stronger requirement, but is already required for analysis from the Dart Analysis Server, so this will not be a problem. Small IDEs support (aka WebStorm) for project creation and support has not changed. This PR has updated and refactored FlutterModuleUtils to be more of a common interface and definition for determining the Flutterness of some Module or Project. The FlutterInitializer detects the now deprecated module type , "FLUTTER_MODULE_TYPE", and converts these modules into the type of "WEB_MODULE". On the first load of an existing project, users will see a notification from the framework "Unknown Module Type". * Resolve the TODO in FlutterPubspecNotificationProvider, with an additional comment. * Comments from @devoncarew
1 parent 54d84be commit da5eea7

15 files changed

+130
-207
lines changed

resources/META-INF/plugin.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -365,9 +365,9 @@
365365
<liveTemplateContext implementation="io.flutter.template.DartToplevelTemplateContextType"/>
366366

367367
<!-- IDEA only -->
368-
<moduleType id="FLUTTER_MODULE_TYPE" implementationClass="io.flutter.module.FlutterModuleType"/>
368+
<moduleBuilder builderClass="io.flutter.module.FlutterModuleBuilder"/>
369369

370-
<!-- Small IDE support -->
370+
<!-- Small IDE support (ex: WebStorm) -->
371371
<directoryProjectGenerator implementation="io.flutter.module.FlutterSmallIDEProjectGenerator"/>
372372

373373
<projectService serviceImplementation="io.flutter.sdk.FlutterSdkManager"/>
@@ -397,7 +397,6 @@
397397

398398
<editorNotificationProvider implementation="io.flutter.editor.FlutterPubspecNotificationProvider"/>
399399
<editorNotificationProvider implementation="io.flutter.inspections.SdkConfigurationNotificationProvider"/>
400-
<editorNotificationProvider implementation="io.flutter.inspections.WrongModuleTypeNotificationProvider"/>
401400

402401
<projectService serviceInterface="io.flutter.run.FlutterReloadManager"
403402
serviceImplementation="io.flutter.run.FlutterReloadManager"

src/io/flutter/FlutterBundle.properties

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,8 @@ app.release.action.text=Run in Flutter release mode
1515
app.release.config.action.text=Flutter Run ''{0}'' (Release)
1616
app.release.action.description=Run Flutter app in release mode
1717

18-
change.module.type.to.flutter.and.reload.project=Change module type to Flutter
19-
2018
dart.plugin.update.action.label=Update Dart
2119
dart.sdk.is.not.configured=Dart SDK is not configured
22-
don.t.show.again.for.this.module=Don't show again
2320

2421
error.folder.specified.as.sdk.not.exists=The folder specified as the Flutter SDK home does not exist.
2522
error.flutter.sdk.without.dart.sdk=The Flutter SDK installation is incomplete; please see: https://flutter.io/setup.
@@ -34,7 +31,6 @@ flutter.project.description=Build high-performance, high-fidelity, mobile apps f
3431
flutter.sdk.browse.path.label=Select Flutter SDK Path
3532
flutter.sdk.is.not.configured=The Flutter SDK is not configured
3633
flutter.sdk.path.label=Flutter &SDK path:
37-
flutter.support.is.not.enabled.for.module.0=Flutter support is not enabled for module ''{0}''
3834
flutter.title=Flutter
3935
flutter.sdk.notAvailable.title=No Flutter SDK Configured
4036
flutter.sdk.notAvailable.message=This action requires a Flutter SDK to be configured; configure one now?
@@ -49,15 +45,11 @@ get.dependencies=Get dependencies
4945
upgrade.dependencies=Upgrade dependencies
5046
ignore.warning=Ignore
5147

52-
reload.project=Reload project
5348
runner.flutter.configuration.description=Flutter run configuration
5449
runner.flutter.configuration.name=Flutter
5550
runner.flutter.bazel.configuration.description=Flutter Bazel run configuration
5651
runner.flutter.bazel.configuration.name=Flutter (Bazel)
5752

58-
update.module.type=Update Module Type
59-
updating.module.type.requires.project.reload.proceed=Updating module type requires project reload. Proceed?
60-
6153
waiting.for.flutter=Waiting for debug connection...
6254

6355
entrypoint.not.set=Dart Entrypoint hasn't been set
@@ -78,6 +70,9 @@ flutter.analytics.notification.accept=Sounds good!
7870
flutter.analytics.notification.decline=No thanks
7971
flutter.analytics.privacyUrl=http://www.google.com/policies/privacy/
8072

73+
flutter.initializer.module.converted.title=Module Type Upgraded
74+
flutter.initializer.module.converted.content=Project converted from FLUTTER_MODULE_TYPE
75+
8176
flutter.reload.firstRun.title=Flutter supports hot reload!
8277
flutter.reload.firstRun.content=Apply changes to your app in place, instantly.
8378
flutter.reload.firstRun.url=https://flutter.io/getting-started/#quickly-viewing-source-code-changes-with-hot-reload

src/io/flutter/FlutterInitializer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,13 @@ public static void setVerboseLogging(boolean value) {
115115

116116
@Override
117117
public void runActivity(@NotNull Project project) {
118+
// Convert all modules of deprecated type FlutterModuleType.
119+
if (FlutterModuleUtils.convertFromDeprecatedModuleType(project)) {
120+
// If any modules were converted over, create a notification
121+
FlutterMessages.showInfo(FlutterBundle.message("flutter.initializer.module.converted.title"),
122+
FlutterBundle.message("flutter.initializer.module.converted.content"));
123+
}
124+
118125
// Start watching for devices.
119126
DeviceService.getInstance(project);
120127

src/io/flutter/actions/FlutterSdkAction.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.flutter.bazel.WorkspaceCache;
1919
import io.flutter.pub.PubRoot;
2020
import io.flutter.sdk.FlutterSdk;
21+
import io.flutter.utils.FlutterModuleUtils;
2122
import org.jetbrains.annotations.NotNull;
2223
import org.jetbrains.annotations.Nullable;
2324

@@ -34,8 +35,8 @@ public void actionPerformed(AnActionEvent event) {
3435

3536
if (enableActionInBazelContext()) {
3637
// See if the Bazel workspace exists for this project.
37-
final Workspace workspace = project != null ? WorkspaceCache.getInstance(project).getNow() : null;
38-
if (workspace != null && workspace.usesFlutter(project)) {
38+
final Workspace workspace = FlutterModuleUtils.getFlutterBazelWorkspace(project);
39+
if (workspace != null) {
3940
FlutterInitializer.sendAnalyticsAction(this);
4041
FileDocumentManager.getInstance().saveAllDocuments();
4142
startCommandInBazelContext(project, workspace);

src/io/flutter/bazel/Workspace.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,6 @@ private Workspace(@NotNull VirtualFile root,
4747
this.doctorScript = doctorScript;
4848
}
4949

50-
/**
51-
* Returns true for a project that uses Flutter code within this workspace.
52-
*/
53-
public boolean usesFlutter(@NotNull final Project project) {
54-
for (Module module : ModuleManager.getInstance(project).getModules()) {
55-
if (usesFlutter(module)) return true;
56-
}
57-
return false;
58-
}
59-
6050
/**
6151
* Returns true for a module that uses flutter code within this workspace.
6252
*

src/io/flutter/editor/FlutterPubspecNotificationProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ public EditorNotificationPanel createNotificationPanel(@NotNull VirtualFile file
4949
}
5050

5151
// The Bazel workspace condition is handled by this check, pubspecs are not used.
52-
// TODO(jwren) Add additional check to exit if this is a Flutter Bazel workspace (in the event that some pubspec.yaml file is opened).
52+
// If for some reason a pubspec is opened, the next condition, isFlutterModule, will return false,
53+
// there is no reason to call FlutterModuleUtils.isFlutterBazelProject().
5354
if (!PubRoot.isPubspec(file)) {
5455
return null;
5556
}

src/io/flutter/inspections/SdkConfigurationNotificationProvider.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,7 @@ public Key<EditorNotificationPanel> getKey() {
6161
public EditorNotificationPanel createNotificationPanel(@NotNull final VirtualFile file, @NotNull final FileEditor fileEditor) {
6262

6363
// If this is a Bazel configured Flutter project, exit immediately, neither of the notifications should be shown for this project type.
64-
final Workspace workspace = WorkspaceCache.getInstance(project).getNow();
65-
if (workspace != null && workspace.usesFlutter(project)) {
66-
return null;
67-
}
64+
if (FlutterModuleUtils.isFlutterBazelProject(project)) return null;
6865

6966
if (file.getFileType() != DartFileType.INSTANCE) return null;
7067

src/io/flutter/inspections/WrongModuleTypeNotificationProvider.java

Lines changed: 0 additions & 83 deletions
This file was deleted.

src/io/flutter/module/FlutterModuleBuilder.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.intellij.openapi.roots.ModifiableRootModel;
2121
import com.intellij.openapi.ui.Messages;
2222
import com.intellij.openapi.util.Disposer;
23+
import com.intellij.openapi.util.text.StringUtil;
2324
import com.intellij.openapi.vfs.LocalFileSystem;
2425
import com.intellij.openapi.vfs.VirtualFile;
2526
import icons.FlutterIcons;
@@ -42,7 +43,7 @@
4243
public class FlutterModuleBuilder extends ModuleBuilder {
4344
private static final Logger LOG = Logger.getInstance(FlutterModuleBuilder.class);
4445

45-
private static final String DART_GROUP_NAME = "Static Web";
46+
private static final String DART_GROUP_NAME = "Static Web"; // == WebModuleBuilder.GROUP_NAME
4647

4748
private FlutterModuleWizardStep myStep;
4849

@@ -56,6 +57,11 @@ public String getPresentableName() {
5657
return FlutterBundle.message("flutter.module.name");
5758
}
5859

60+
@Override
61+
public String getDescription() {
62+
return FlutterBundle.message("flutter.project.description");
63+
}
64+
5965
// This method does not exist in 2017.2.
6066
@SuppressWarnings("override")
6167
public Icon getBigIcon() {
@@ -211,8 +217,17 @@ public String getParentGroup() {
211217
}
212218

213219
@Override
220+
@NotNull
221+
public String getBuilderId() {
222+
// The builder id is used to distinguish between different builders with the same module type, see
223+
// com.intellij.ide.projectWizard.ProjectTypeStep for an example.
224+
return StringUtil.notNullize(super.getBuilderId()) + "_" + FlutterModuleBuilder.class.getCanonicalName();
225+
}
226+
227+
@Override
228+
@NotNull
214229
public ModuleType getModuleType() {
215-
return FlutterModuleType.getInstance();
230+
return FlutterModuleUtils.getModuleTypeForFlutter();
216231
}
217232

218233
/**

src/io/flutter/module/FlutterModuleConfigurationEditorProvider.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,16 @@
1111
import com.intellij.openapi.roots.ui.configuration.CommonContentEntriesEditor;
1212
import com.intellij.openapi.roots.ui.configuration.ModuleConfigurationEditorProvider;
1313
import com.intellij.openapi.roots.ui.configuration.ModuleConfigurationState;
14+
import io.flutter.utils.FlutterModuleUtils;
1415

1516
public class FlutterModuleConfigurationEditorProvider implements ModuleConfigurationEditorProvider {
1617
@Override
1718
public ModuleConfigurationEditor[] createEditors(ModuleConfigurationState state) {
1819
final Module module = state.getRootModel().getModule();
1920

20-
if (ModuleType.get(module) != FlutterModuleType.getInstance()) {
21+
if (ModuleType.get(module) != FlutterModuleUtils.getModuleTypeForFlutter()) {
2122
return ModuleConfigurationEditor.EMPTY;
2223
}
23-
else {
24-
return new ModuleConfigurationEditor[]{new CommonContentEntriesEditor(module.getName(), state)};
25-
}
24+
return new ModuleConfigurationEditor[]{new CommonContentEntriesEditor(module.getName(), state)};
2625
}
2726
}

src/io/flutter/module/FlutterModuleType.java

Lines changed: 0 additions & 55 deletions
This file was deleted.

src/io/flutter/project/FlutterIconProvider.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,15 @@
77

88
import com.intellij.icons.AllIcons;
99
import com.intellij.ide.IconProvider;
10-
import com.intellij.openapi.module.ModuleUtil;
1110
import com.intellij.openapi.util.Iconable;
1211
import com.intellij.openapi.vfs.VirtualFile;
1312
import com.intellij.psi.PsiDirectory;
1413
import com.intellij.psi.PsiElement;
1514
import com.jetbrains.lang.dart.DartFileType;
1615
import com.jetbrains.lang.dart.psi.DartFile;
1716
import io.flutter.FlutterUtils;
18-
import io.flutter.module.FlutterModuleType;
1917
import io.flutter.pub.PubRoot;
18+
import io.flutter.utils.FlutterModuleUtils;
2019
import org.jetbrains.annotations.NotNull;
2120
import org.jetbrains.annotations.Nullable;
2221

@@ -30,8 +29,9 @@ public class FlutterIconProvider extends IconProvider {
3029

3130
@Nullable
3231
public Icon getIcon(@NotNull final PsiElement element, @Iconable.IconFlags final int flags) {
32+
final boolean hasFlutterModule = FlutterModuleUtils.hasFlutterModule(element.getProject());
3333
// Directories.
34-
if (element instanceof PsiDirectory && ModuleUtil.hasModulesOfType(element.getProject(), FlutterModuleType.getInstance())) {
34+
if (hasFlutterModule && element instanceof PsiDirectory) {
3535
final VirtualFile file = ((PsiDirectory)element).getVirtualFile();
3636
if (!file.isInLocalFileSystem()) return null;
3737

@@ -43,8 +43,8 @@ public Icon getIcon(@NotNull final PsiElement element, @Iconable.IconFlags final
4343
}
4444

4545
// Files.
46-
if (element instanceof DartFile && ModuleUtil.hasModulesOfType(element.getProject(), FlutterModuleType.getInstance())) {
47-
DartFile dartFile = (DartFile)element;
46+
if (hasFlutterModule && element instanceof DartFile) {
47+
final DartFile dartFile = (DartFile)element;
4848
final VirtualFile file = dartFile.getVirtualFile();
4949
if (!file.isInLocalFileSystem()) return null;
5050

src/io/flutter/run/daemon/DeviceDaemon.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,7 @@ static Command chooseCommand(@NotNull final Project project) {
148148
}
149149

150150
private static boolean usesFlutter(@NotNull final Project project) {
151-
final Workspace workspace = WorkspaceCache.getInstance(project).getNow();
152-
if (workspace != null) {
153-
return workspace.usesFlutter(project);
154-
}
155-
return FlutterModuleUtils.hasFlutterModule(project);
151+
return FlutterModuleUtils.isFlutterBazelProject(project) || FlutterModuleUtils.hasFlutterModule(project);
156152
}
157153

158154
/**

0 commit comments

Comments
 (0)