Skip to content

Commit 190f5da

Browse files
authored
Merge pull request #599 from shuzijun/gradle
fix #598
2 parents 10da661 + 24e3daa commit 190f5da

File tree

5 files changed

+65
-14
lines changed

5 files changed

+65
-14
lines changed

src/main/java/com/shuzijun/leetcode/plugin/editor/converge/NotePreview.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import com.intellij.openapi.actionSystem.DefaultActionGroup;
77
import com.intellij.openapi.application.ApplicationManager;
88
import com.intellij.openapi.fileEditor.*;
9-
import com.intellij.openapi.fileEditor.ex.FileEditorProviderManager;
109
import com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorProvider;
1110
import com.intellij.openapi.project.Project;
1211
import com.intellij.openapi.util.Disposer;
@@ -21,6 +20,7 @@
2120
import com.shuzijun.leetcode.plugin.manager.NoteManager;
2221
import com.shuzijun.leetcode.plugin.model.LeetcodeEditor;
2322
import com.shuzijun.leetcode.plugin.model.PluginConstant;
23+
import com.shuzijun.leetcode.plugin.utils.FileEditorProviderReflection;
2424
import com.shuzijun.leetcode.plugin.utils.URLUtils;
2525
import org.jetbrains.annotations.Nls;
2626
import org.jetbrains.annotations.NotNull;
@@ -74,7 +74,7 @@ private void initComponent() {
7474
myComponent.addToCenter(new JBLabel("No note"));
7575
} else {
7676
VirtualFile vf = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file);
77-
FileEditorProvider[] editorProviders = FileEditorProviderManager.getInstance().getProviders(project, vf);
77+
FileEditorProvider[] editorProviders = FileEditorProviderReflection.getProviders(project, vf);
7878

7979
if (editorProviders != null && editorProviders.length > 0) {
8080
fileEditor = editorProviders[0].createEditor(project, vf);

src/main/java/com/shuzijun/leetcode/plugin/editor/converge/SolutionPreview.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import com.intellij.openapi.actionSystem.*;
55
import com.intellij.openapi.application.ApplicationManager;
66
import com.intellij.openapi.fileEditor.*;
7-
import com.intellij.openapi.fileEditor.ex.FileEditorProviderManager;
87
import com.intellij.openapi.project.Project;
98
import com.intellij.openapi.util.Disposer;
109
import com.intellij.openapi.util.UserDataHolderBase;
@@ -21,6 +20,7 @@
2120
import com.shuzijun.leetcode.plugin.manager.ArticleManager;
2221
import com.shuzijun.leetcode.plugin.manager.QuestionManager;
2322
import com.shuzijun.leetcode.plugin.model.*;
23+
import com.shuzijun.leetcode.plugin.utils.FileEditorProviderReflection;
2424
import org.apache.commons.collections.CollectionUtils;
2525
import org.apache.commons.lang3.StringUtils;
2626
import org.jetbrains.annotations.Nls;
@@ -177,7 +177,7 @@ private void openArticle() throws InterruptedException, java.util.concurrent.Exe
177177
mySplitter.setSecondComponent(new JBLabel("no solution"));
178178
} else {
179179
VirtualFile vf = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file);
180-
FileEditorProvider[] editorProviders = FileEditorProviderManager.getInstance().getProviders(project, vf);
180+
FileEditorProvider[] editorProviders = FileEditorProviderReflection.getProviders(project, vf);
181181
FileEditor newEditor = editorProviders[0].createEditor(project, vf);
182182
if (newEditor == fileEditor) {
183183
return;

src/main/java/com/shuzijun/leetcode/plugin/editor/converge/SubmissionsPreview.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import com.intellij.openapi.actionSystem.*;
55
import com.intellij.openapi.application.ApplicationManager;
66
import com.intellij.openapi.fileEditor.*;
7-
import com.intellij.openapi.fileEditor.ex.FileEditorProviderManager;
87
import com.intellij.openapi.project.Project;
98
import com.intellij.openapi.util.Disposer;
109
import com.intellij.openapi.util.UserDataHolderBase;
@@ -26,6 +25,7 @@
2625
import com.shuzijun.leetcode.plugin.model.PluginConstant;
2726
import com.shuzijun.leetcode.plugin.model.Question;
2827
import com.shuzijun.leetcode.plugin.model.Submission;
28+
import com.shuzijun.leetcode.plugin.utils.FileEditorProviderReflection;
2929
import com.shuzijun.leetcode.plugin.window.dialog.SubmissionsPanel;
3030
import org.apache.commons.collections.CollectionUtils;
3131
import org.apache.commons.lang3.StringUtils;
@@ -186,7 +186,7 @@ private void openSubmission(Submission submission) throws InterruptedException,
186186
mySplitter.setSecondComponent(new JBLabel("no submission"));
187187
} else {
188188
VirtualFile vf = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file);
189-
FileEditorProvider[] editorProviders = FileEditorProviderManager.getInstance().getProviders(project, vf);
189+
FileEditorProvider[] editorProviders = FileEditorProviderReflection.getProviders(project, vf);
190190
FileEditor newEditor = editorProviders[0].createEditor(project, vf);
191191
if (newEditor == fileEditor) {
192192
return;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.shuzijun.leetcode.plugin.utils;
2+
3+
import com.intellij.openapi.application.ApplicationManager;
4+
import com.intellij.openapi.fileEditor.FileEditorProvider;
5+
import com.intellij.openapi.fileEditor.ex.FileEditorProviderManager;
6+
import com.intellij.openapi.project.Project;
7+
import com.intellij.openapi.vfs.VirtualFile;
8+
import com.intellij.util.ReflectionUtil;
9+
import org.jetbrains.annotations.NotNull;
10+
11+
import java.lang.reflect.InvocationTargetException;
12+
import java.lang.reflect.Method;
13+
14+
//https://youtrack.jetbrains.com/issue/IDEA-302416
15+
public class FileEditorProviderReflection {
16+
public static FileEditorProvider[] getProviders(@NotNull Project project, @NotNull VirtualFile virtualFile) {
17+
try {
18+
Method getProvidersMethod = ReflectionUtil.getMethod(
19+
FileEditorProviderManager.class,
20+
"getProviders",
21+
Project.class, VirtualFile.class
22+
);
23+
if (getProvidersMethod != null) {
24+
getProvidersMethod.setAccessible(true);
25+
// NOTE: Have to get a reference to FileEditorProviderManager this way instead of via getInstance() to
26+
// avoid a different IncompatibleClassChangeError in pre-2022.3 vs. 2022.3+
27+
FileEditorProviderManager fileEditorProviderManager = ApplicationManager.getApplication().getService(FileEditorProviderManager.class);
28+
if (fileEditorProviderManager != null) {
29+
Object result = getProvidersMethod.invoke(fileEditorProviderManager, project, virtualFile);
30+
if (result instanceof FileEditorProvider[]) {
31+
return (FileEditorProvider[]) result;
32+
}
33+
}
34+
}
35+
} catch (IllegalAccessException | InvocationTargetException e) {
36+
LogUtils.LOG.warn("Failed to get file editor providers for project '" + project.getName() + "', file '" + virtualFile.getPath() + "'.", e);
37+
}
38+
39+
return new FileEditorProvider[0];
40+
}
41+
}

src/main/java/com/shuzijun/leetcode/plugin/window/NavigatorTabsPanel.java

+18-8
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public void change(Config oldConfig, Config newConfig) {
141141
}
142142
}
143143
});
144-
messageBusConnection.subscribe(QuestionStatusNotifier.QUESTION_STATUS_TOPIC, question -> StatisticsData.refresh(project));
144+
messageBusConnection.subscribe(QuestionStatusNotifier.QUESTION_STATUS_TOPIC, (QuestionStatusNotifier) question -> StatisticsData.refresh(project));
145145

146146
for (SimpleToolWindowPanel n : navigatorPanels) {
147147
if (n != null && navigatorPanel instanceof Disposable) {
@@ -171,13 +171,7 @@ public User getUser() {
171171
} else if (userCache.containsKey(config.getUrl())) {
172172
return userCache.get(config.getUrl());
173173
} else {
174-
String otherKey = null;
175-
for (Object key : NAVIGATOR_TABS_PANEL_DISPOSABLE_MAP.keySet()) {
176-
if (!key.equals(id)) {
177-
otherKey = (String) key;
178-
break;
179-
}
180-
}
174+
String otherKey = NAVIGATOR_TABS_PANEL_DISPOSABLE_MAP.getOtherKey(id);
181175
if (otherKey == null || !((NavigatorTabsPanel) NAVIGATOR_TABS_PANEL_DISPOSABLE_MAP.get(otherKey)).userCache.containsKey(config.getUrl())) {
182176
User user = QuestionManager.getUser();
183177
userCache.put(config.getUrl(), user);
@@ -248,6 +242,22 @@ public static synchronized void loadUser(boolean login) {
248242
}
249243

250244
public static class DisposableMap<K, V> extends HashMap implements Disposable {
245+
@Override
246+
public synchronized Object put(Object key, Object value) {
247+
return super.put(key,value);
248+
}
249+
250+
public synchronized K getOtherKey(K key){
251+
K otherKey = null;
252+
for (Object k : this.keySet()) {
253+
if (!k.equals(key)) {
254+
otherKey = key;
255+
break;
256+
}
257+
}
258+
return otherKey;
259+
}
260+
251261
@Override
252262
public void dispose() {
253263
for (Object value : values()) {

0 commit comments

Comments
 (0)