Skip to content

Commit efd2faa

Browse files
authored
[CQ] fix nullability problems for flutter/samples (#8307)
Fix nullability problems in `src/io/flutter/samples/`. See #8291. If we pursue #8292, we could mark `src/io/flutter/samples/` as null-"clean". --- - [x] I’ve reviewed the contributor guide and applied the relevant portions to this PR. <details> <summary>Contribution guidelines:</summary><br> - See our [contributor guide]([https://github.com/dart-lang/sdk/blob/main/CONTRIBUTING.md](https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview) for general expectations for PRs. - Larger or significant changes should be discussed in an issue before creating a PR. - Dart contributions to our repos should follow the [Dart style guide](https://dart.dev/guides/language/effective-dart) and use `dart format`. - Java and Kotlin contributions should strive to follow Java and Kotlin best practices ([discussion](#8098)). </details>
1 parent d66ec92 commit efd2faa

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

flutter-idea/src/io/flutter/samples/DartDocumentUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public static List<String> getDartdocFor(@NotNull Document document, @NotNull Da
7272
return lines;
7373
}
7474

75-
private static String getLine(Document document, int line) {
75+
private static String getLine(@NotNull Document document, int line) {
7676
return document.getText(new TextRange(document.getLineStartOffset(line - 1), document.getLineEndOffset(line - 1)));
7777
}
7878
}

flutter-idea/src/io/flutter/samples/FlutterSampleNotificationProvider.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@
77

88
import com.google.common.annotations.VisibleForTesting;
99
import com.intellij.ide.BrowserUtil;
10-
import com.intellij.openapi.application.ApplicationManager;
1110
import com.intellij.openapi.editor.Document;
1211
import com.intellij.openapi.editor.Editor;
1312
import com.intellij.openapi.editor.colors.EditorColors;
1413
import com.intellij.openapi.fileEditor.FileEditor;
1514
import com.intellij.openapi.fileEditor.TextEditor;
1615
import com.intellij.openapi.project.Project;
17-
import com.intellij.openapi.util.Computable;
1816
import com.intellij.openapi.vfs.VirtualFile;
1917
import com.intellij.psi.PsiDocumentManager;
2018
import com.intellij.psi.PsiFile;
@@ -25,6 +23,7 @@
2523
import com.jetbrains.lang.dart.psi.DartClass;
2624
import icons.FlutterIcons;
2725
import io.flutter.sdk.FlutterSdk;
26+
import io.flutter.utils.OpenApiUtils;
2827
import org.jetbrains.annotations.NotNull;
2928
import org.jetbrains.annotations.Nullable;
3029

@@ -86,10 +85,9 @@ private EditorNotificationPanel createPanelForSamples(@NotNull FileEditor fileEd
8685
}
8786

8887
// Run the code to query the document in a read action.
89-
final List<FlutterSample> samples = ApplicationManager.getApplication().
90-
runReadAction((Computable<List<FlutterSample>>)() -> {
91-
return getSamplesFromDoc(flutterPackagePath, document, filePath);
92-
});
88+
final List<FlutterSample> samples = OpenApiUtils.safeRunReadAction(() -> {
89+
return getSamplesFromDoc(flutterPackagePath, document, filePath);
90+
});
9391

9492
if (samples != null && !samples.isEmpty()) {
9593
return new FlutterSampleActionsPanel(samples);
@@ -101,8 +99,11 @@ private EditorNotificationPanel createPanelForSamples(@NotNull FileEditor fileEd
10199
private List<FlutterSample> getSamplesFromDoc(@NotNull String flutterPackagePath, @NotNull Document document, @NotNull String filePath) {
102100
final List<FlutterSample> samples = new ArrayList<>();
103101

102+
PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project);
103+
if (documentManager == null) return samples;
104+
104105
// Find all candidate class definitions.
105-
final PsiFile psiFile = PsiDocumentManager.getInstance(project).getPsiFile(document);
106+
final PsiFile psiFile = documentManager.getPsiFile(document);
106107
assert (psiFile != null);
107108

108109
final DartClass[] classes = PsiTreeUtil.getChildrenOfType(psiFile, DartClass.class);
@@ -114,6 +115,7 @@ private List<FlutterSample> getSamplesFromDoc(@NotNull String flutterPackagePath
114115
// "/// {@tool dartpad ...}".
115116

116117
for (DartClass declaration : classes) {
118+
if (declaration == null) continue;
117119
final String name = declaration.getName();
118120
if (name == null || name.startsWith("_")) {
119121
continue;
@@ -157,7 +159,7 @@ public static boolean containsDartdocFlutterSample(@NotNull List<String> lines)
157159
}
158160

159161
for (String line : lines) {
160-
if (DARTPAD_TOOL_PATTERN.matcher(line).find()) {
162+
if (line != null && DARTPAD_TOOL_PATTERN.matcher(line).find()) {
161163
return true;
162164
}
163165
}
@@ -168,24 +170,27 @@ public static boolean containsDartdocFlutterSample(@NotNull List<String> lines)
168170

169171
class FlutterSampleActionsPanel extends EditorNotificationPanel {
170172
FlutterSampleActionsPanel(@NotNull List<FlutterSample> samples) {
173+
//noinspection DataFlowIssue
171174
super(EditorColors.GUTTER_BACKGROUND);
172175

173176
icon(FlutterIcons.Flutter);
174177
text("View example on flutter.dev");
175178

176179
for (int i = 0; i < samples.size(); i++) {
177180
if (i != 0) {
181+
//noinspection DataFlowIssue
178182
myLinksPanel.add(new JSeparator(SwingConstants.VERTICAL));
179183
}
180184

181185
final FlutterSample sample = samples.get(i);
186+
assert sample != null;
182187

183188
final HyperlinkLabel label = createActionLabel(sample.getClassName(), () -> browseTo(sample));
184189
label.setToolTipText(sample.getHostedDocsUrl());
185190
}
186191
}
187192

188-
private void browseTo(FlutterSample sample) {
193+
private void browseTo(@NotNull FlutterSample sample) {
189194
BrowserUtil.browse(sample.getHostedDocsUrl());
190195
}
191196
}

0 commit comments

Comments
 (0)