diff --git a/spring-javaformat-intellij/spring-javaformat-intellij-plugin/src/main/java/io/spring/format/formatter/intellij/SpringFormatComponent.java b/spring-javaformat-intellij/spring-javaformat-intellij-plugin/src/main/java/io/spring/format/formatter/intellij/SpringFormatComponent.java index fc9952ab..6d9dc4a9 100644 --- a/spring-javaformat-intellij/spring-javaformat-intellij-plugin/src/main/java/io/spring/format/formatter/intellij/SpringFormatComponent.java +++ b/spring-javaformat-intellij/spring-javaformat-intellij-plugin/src/main/java/io/spring/format/formatter/intellij/SpringFormatComponent.java @@ -16,6 +16,7 @@ package io.spring.format.formatter.intellij; +import java.lang.reflect.Method; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -26,10 +27,11 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.extensions.PluginDescriptor; import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.project.Project; import com.intellij.psi.codeStyle.CodeStyleManager; -import com.intellij.serviceContainer.PlatformComponentManagerImpl; +import com.intellij.serviceContainer.ComponentManagerImpl; import org.picocontainer.MutablePicoContainer; import io.spring.format.formatter.intellij.codestyle.SpringCodeStyleManager; @@ -112,9 +114,14 @@ private void update(State state) { private void registerCodeStyleManager(CodeStyleManager manager) { if (ApplicationInfo.getInstance().getBuild().getBaselineVersion() >= 193) { - PlatformComponentManagerImpl platformComponentManager = (PlatformComponentManagerImpl) this.project; IdeaPluginDescriptor plugin = PluginManagerCore.getPlugin(PluginId.getId("spring-javaformat")); - platformComponentManager.registerServiceInstance(CodeStyleManager.class, manager, plugin); + try { + ((ComponentManagerImpl) this.project).registerServiceInstance(CodeStyleManager.class, manager, plugin); + } + catch (NoSuchMethodError ex) { + Method method = findRegisterServiceInstanceMethod(this.project.getClass()); + invokeRegisterServiceInstanceMethod(manager, plugin, method); + } } else { MutablePicoContainer container = (MutablePicoContainer) this.project.getPicoContainer(); @@ -123,4 +130,32 @@ private void registerCodeStyleManager(CodeStyleManager manager) { } } + private Method findRegisterServiceInstanceMethod(Class projectClass) { + if (projectClass != null) { + Method[] methods = projectClass.getDeclaredMethods(); + for (Method method : methods) { + if (method.getName().equals("registerServiceInstance") && method.getParameterCount() == 3) { + if (PluginDescriptor.class.isAssignableFrom(method.getParameterTypes()[2])) { + return method; + } + } + } + return findRegisterServiceInstanceMethod(projectClass.getSuperclass()); + } + return null; + } + + private void invokeRegisterServiceInstanceMethod(CodeStyleManager manager, IdeaPluginDescriptor plugin, + Method method) { + if (method == null) { + throw new IllegalStateException("Unsupported IntelliJ version"); + } + method.setAccessible(true); + try { + method.invoke(this.project, manager, plugin); + } + catch (Exception ex) { + throw new IllegalStateException(ex); + } + } } diff --git a/spring-javaformat-intellij/spring-javaformat-intellij-runtime/pom.xml b/spring-javaformat-intellij/spring-javaformat-intellij-runtime/pom.xml index f82ab1c4..81d93047 100644 --- a/spring-javaformat-intellij/spring-javaformat-intellij-runtime/pom.xml +++ b/spring-javaformat-intellij/spring-javaformat-intellij-runtime/pom.xml @@ -13,9 +13,9 @@ Spring JavaFormat IntelliJ Runtime ${basedir}/../.. - https://download.jetbrains.com/idea/ideaIC-2019.3.1.tar.gz - https://github.com/JetBrains/intellij-community/archive/idea/193.5662.53.zip - idea-IC-193.5662.53 + https://download.jetbrains.com/idea/ideaIC-2020.1.tar.gz + https://github.com/JetBrains/intellij-community/archive/idea/201.6668.121.zip + idea-IC-201.6668.121