Skip to content

Commit 1d89a06

Browse files
authored
Change .packages file use to package config file (flutter#5993)
* Change .packages file use to package config file * Restore deprecated methods to build for 2020.3
1 parent ed2d9eb commit 1d89a06

File tree

6 files changed

+81
-15
lines changed

6 files changed

+81
-15
lines changed

bin/plugin

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/bin/bash
22

3-
# TODO(devoncarew): Warn if tool/plugin/.packages does not exist.
3+
# TODO: Warn if 'pub get' needs to be done.
44

55
dart tool/plugin/bin/main.dart "$@"

flutter-idea/src/io/flutter/FlutterInitializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public void moduleAdded(@NotNull Project project, @NotNull Module module) {
173173
// Watch save actions for format on save.
174174
FlutterSaveActionsManager.init(project);
175175

176-
// Start watching for project structure and .packages file changes.
176+
// Start watching for project structure changes.
177177
final FlutterPluginsLibraryManager libraryManager = new FlutterPluginsLibraryManager(project);
178178
libraryManager.startWatching();
179179

flutter-idea/src/io/flutter/run/MainFile.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public VirtualFile getFile() {
5858
}
5959

6060
/**
61-
* Returns the closest ancestor directory containing a pubspec.yaml, BUILD, or .packages file.
61+
* Returns the closest ancestor directory containing a pubspec.yaml, BUILD, or packages meta-data file.
6262
*/
6363
@NotNull
6464
public VirtualFile getAppDir() {
@@ -137,6 +137,7 @@ private static boolean isAppDir(@NotNull VirtualFile dir, @NotNull Project proje
137137
assert(!WorkspaceCache.getInstance(project).isBazel());
138138
return dir.isDirectory() && (
139139
dir.findChild("pubspec.yaml") != null ||
140+
dir.findChild(".dart_tool") != null ||
140141
dir.findChild(".packages") != null
141142
);
142143
}

flutter-idea/src/io/flutter/sdk/FlutterPluginsLibraryManager.java

Lines changed: 75 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
*/
66
package io.flutter.sdk;
77

8+
import com.google.gson.JsonArray;
9+
import com.google.gson.JsonElement;
10+
import com.google.gson.JsonObject;
811
import com.intellij.ProjectTopics;
912
import com.intellij.openapi.application.ApplicationManager;
1013
import com.intellij.openapi.application.ModalityState;
@@ -13,16 +16,21 @@
1316
import com.intellij.openapi.roots.ModuleRootEvent;
1417
import com.intellij.openapi.roots.ModuleRootListener;
1518
import com.intellij.openapi.roots.libraries.PersistentLibraryKind;
19+
import com.intellij.openapi.util.SystemInfo;
20+
import com.intellij.openapi.util.io.FileUtil;
21+
import com.intellij.openapi.util.text.StringUtil;
1622
import com.intellij.openapi.vfs.*;
23+
import com.intellij.util.io.URLUtil;
1724
import com.jetbrains.lang.dart.util.DotPackagesFileUtil;
1825
import io.flutter.pub.PubRoot;
1926
import io.flutter.pub.PubRoots;
27+
import io.flutter.utils.JsonUtils;
2028
import org.jetbrains.annotations.NotNull;
29+
import org.jetbrains.annotations.Nullable;
2130

22-
import java.util.HashSet;
23-
import java.util.List;
24-
import java.util.Map;
25-
import java.util.Set;
31+
import java.io.IOException;
32+
import java.nio.charset.StandardCharsets;
33+
import java.util.*;
2634
import java.util.concurrent.atomic.AtomicBoolean;
2735

2836
import static com.jetbrains.lang.dart.util.PubspecYamlUtil.PUBSPEC_YAML;
@@ -123,15 +131,23 @@ private static Set<String> getFlutterPluginPaths(List<PubRoot> roots) {
123131
final Set<String> paths = new HashSet<>();
124132

125133
for (PubRoot pubRoot : roots) {
134+
135+
final Map<String, String> map;
126136
if (pubRoot.getPackagesFile() == null) {
127-
continue;
137+
@Nullable VirtualFile configFile = pubRoot.getPackageConfigFile();
138+
if (configFile == null) {
139+
continue;
140+
}
141+
// TODO(messick) Use the code in the Dart plugin when available.
142+
// This is just a backup in case we need it. It does not have a proper cache, but the Dart plugin does.
143+
map = loadPackagesMap(configFile);
128144
}
129-
130-
final Map<String, String> map = DotPackagesFileUtil.getPackagesMap(pubRoot.getPackagesFile());
131-
if (map == null) {
132-
continue;
145+
else {
146+
map = DotPackagesFileUtil.getPackagesMap(pubRoot.getPackagesFile());
147+
if (map == null) {
148+
continue;
149+
}
133150
}
134-
135151
for (String packagePath : map.values()) {
136152
final VirtualFile libFolder = LocalFileSystem.getInstance().findFileByPath(packagePath);
137153
if (libFolder == null) {
@@ -150,4 +166,53 @@ private static Set<String> getFlutterPluginPaths(List<PubRoot> roots) {
150166

151167
return paths;
152168
}
169+
170+
private static Map<String, String> loadPackagesMap(@NotNull VirtualFile root) {
171+
Map<String, String> result = new HashMap<>();
172+
try {
173+
JsonElement element = JsonUtils.parseString(new String(root.contentsToByteArray(), StandardCharsets.UTF_8));
174+
if (element != null) {
175+
JsonElement packages = element.getAsJsonObject().get("packages");
176+
if (packages != null) {
177+
JsonArray array = packages.getAsJsonArray();
178+
for (int i = 0; i < array.size(); i++) {
179+
JsonObject pkg = array.get(i).getAsJsonObject();
180+
String name = pkg.get("name").getAsString();
181+
String rootUri = pkg.get("rootUri").getAsString();
182+
if (name != null && rootUri != null) {
183+
// need to protect '+' chars because URLDecoder.decode replaces '+' with space
184+
final String encodedUriWithoutPluses = StringUtil.replace(rootUri, "+", "%2B");
185+
final String uri = URLUtil.decode(encodedUriWithoutPluses);
186+
final String packageUri = getAbsolutePackageRootPath(root.getParent().getParent(), uri);
187+
result.put(name, packageUri);
188+
}
189+
}
190+
}
191+
}
192+
}
193+
catch (IOException ignored) {
194+
}
195+
return result;
196+
}
197+
198+
@Nullable
199+
private static String getAbsolutePackageRootPath(@NotNull final VirtualFile baseDir, @NotNull final String uri) {
200+
// Copied from the Dart plugin.
201+
if (uri.startsWith("file:/")) {
202+
final String pathAfterSlashes = StringUtil.trimEnd(StringUtil.trimLeading(StringUtil.trimStart(uri, "file:/"), '/'), "/");
203+
if (SystemInfo.isWindows && !ApplicationManager.getApplication().isUnitTestMode()) {
204+
if (pathAfterSlashes.length() > 2 && Character.isLetter(pathAfterSlashes.charAt(0)) && ':' == pathAfterSlashes.charAt(1)) {
205+
return pathAfterSlashes;
206+
}
207+
}
208+
else {
209+
return "/" + pathAfterSlashes;
210+
}
211+
}
212+
else {
213+
return FileUtil.toCanonicalPath(baseDir.getPath() + "/" + uri);
214+
}
215+
216+
return null;
217+
}
153218
}

flutter-idea/src/io/flutter/sdk/FlutterSdk.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ public Process startPubGet(@NotNull PubRoot root, @NotNull Project project) {
467467
if (module == null) return null;
468468
// Ensure pubspec is saved.
469469
FileDocumentManager.getInstance().saveAllDocuments();
470-
// Refresh afterwards to ensure Dart Plugin sees .packages and doesn't mistakenly nag to run pub.
470+
// Refresh afterwards to ensure Dart Plugin doesn't mistakenly nag to run pub.
471471
return flutterPackagesGet(root).startInModuleConsole(module, root::refresh, null);
472472
}
473473

flutter-idea/src/io/flutter/sdk/FlutterSdkUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ public static void enableDartSdk(@NotNull final Project project) {
254254
}
255255

256256
/**
257-
* Parse any .packages file and infer the location of the Flutter SDK from that.
257+
* Parse packages meta-data file and infer the location of the Flutter SDK from that.
258258
*/
259259
@Nullable
260260
public static String guessFlutterSdkFromPackagesFile(@NotNull Module module) {

0 commit comments

Comments
 (0)