diff --git a/idea/src/org/jetbrains/jet/plugin/framework/FrameworksCompatibilityUtils.java b/idea/src/org/jetbrains/jet/plugin/framework/FrameworksCompatibilityUtils.java new file mode 100644 index 00000000000..6a2e7070a19 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/framework/FrameworksCompatibilityUtils.java @@ -0,0 +1,65 @@ +/* + * Copyright 2010-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.framework; + +import com.intellij.openapi.roots.LibraryOrderEntry; +import com.intellij.openapi.roots.ModifiableRootModel; +import com.intellij.openapi.roots.OrderEntry; +import com.intellij.openapi.roots.OrderRootType; +import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.roots.libraries.LibraryKind; +import com.intellij.openapi.roots.ui.configuration.libraries.LibraryPresentationManager; +import com.intellij.openapi.ui.Messages; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class FrameworksCompatibilityUtils { + private FrameworksCompatibilityUtils() { + } + + public static void suggestRemoveIncompatibleFramework( + @NotNull ModifiableRootModel rootModel, + @NotNull LibraryKind kind, + String message, + String title + ) { + List existingEntries = new ArrayList(); + + for (OrderEntry entry : rootModel.getOrderEntries()) { + if (!(entry instanceof LibraryOrderEntry)) continue; + final Library library = ((LibraryOrderEntry)entry).getLibrary(); + if (library == null) continue; + + if (LibraryPresentationManager.getInstance().isLibraryOfKind(Arrays.asList(library.getFiles(OrderRootType.CLASSES)), kind)) { + existingEntries.add(entry); + } + } + + if (!existingEntries.isEmpty()) { + int result = Messages.showYesNoDialog(message, title, Messages.getWarningIcon()); + + if (result == 0) { + for (OrderEntry entry : existingEntries) { + rootModel.removeOrderEntry(entry); + } + } + } + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/framework/JavaScriptFrameworkType.java b/idea/src/org/jetbrains/jet/plugin/framework/JavaScriptFrameworkType.java index 94b7845dc20..9986d62ea30 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/JavaScriptFrameworkType.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/JavaScriptFrameworkType.java @@ -24,6 +24,10 @@ import org.jetbrains.jet.plugin.JetIcons; import javax.swing.*; public class JavaScriptFrameworkType extends FrameworkTypeEx { + public static JavaScriptFrameworkType getInstance() { + return FrameworkTypeEx.EP_NAME.findExtension(JavaScriptFrameworkType.class); + } + public JavaScriptFrameworkType() { super("kotlin-js-framework-id"); } diff --git a/idea/src/org/jetbrains/jet/plugin/framework/JetJavaFrameworkSupportProvider.java b/idea/src/org/jetbrains/jet/plugin/framework/JetJavaFrameworkSupportProvider.java index a4ab39f0821..a0ecc28617e 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/JetJavaFrameworkSupportProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/JetJavaFrameworkSupportProvider.java @@ -36,7 +36,7 @@ public class JetJavaFrameworkSupportProvider extends FrameworkSupportInModulePro @NotNull @Override public FrameworkTypeEx getFrameworkType() { - return FrameworkTypeEx.EP_NAME.findExtension(JetJavaFrameworkType.class); + return JetJavaFrameworkType.getInstance(); } @NotNull @@ -72,6 +72,11 @@ public class JetJavaFrameworkSupportProvider extends FrameworkSupportInModulePro @NotNull Module module, @NotNull ModifiableRootModel rootModel, @NotNull ModifiableModelsProvider modifiableModelsProvider) { + FrameworksCompatibilityUtils.suggestRemoveIncompatibleFramework( + rootModel, + JetJavaScriptLibraryDescription.KOTLIN_JAVASCRIPT_KIND, + "Current module is already configured as JavaScript Kotlin module.\nDo you want to remove JavaScript support?", + "Configure Kotlin Java Support"); } private FrameworkSourcePanel getConfigurationPanel() { diff --git a/idea/src/org/jetbrains/jet/plugin/framework/JetJavaFrameworkType.java b/idea/src/org/jetbrains/jet/plugin/framework/JetJavaFrameworkType.java index af8fad70699..a31d1748473 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/JetJavaFrameworkType.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/JetJavaFrameworkType.java @@ -24,6 +24,10 @@ import org.jetbrains.jet.plugin.JetIcons; import javax.swing.*; public class JetJavaFrameworkType extends FrameworkTypeEx { + public static JetJavaFrameworkType getInstance() { + return FrameworkTypeEx.EP_NAME.findExtension(JetJavaFrameworkType.class); + } + public JetJavaFrameworkType() { super("kotlin-java-framework-id"); } diff --git a/idea/src/org/jetbrains/jet/plugin/framework/JetJavaRuntimeLibraryDescription.java b/idea/src/org/jetbrains/jet/plugin/framework/JetJavaRuntimeLibraryDescription.java index 4143bff1095..04873a09020 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/JetJavaRuntimeLibraryDescription.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/JetJavaRuntimeLibraryDescription.java @@ -50,7 +50,6 @@ public class JetJavaRuntimeLibraryDescription extends CustomLibraryDescription { this.frameworkSourcePanel = frameworkSourcePanel; } - @NotNull @Override public Set getSuitableLibraryKinds() { diff --git a/idea/src/org/jetbrains/jet/plugin/framework/JetJavaScriptFrameworkSupportProvider.java b/idea/src/org/jetbrains/jet/plugin/framework/JetJavaScriptFrameworkSupportProvider.java index c4c0becd21a..55081df827c 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/JetJavaScriptFrameworkSupportProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/JetJavaScriptFrameworkSupportProvider.java @@ -36,7 +36,7 @@ public class JetJavaScriptFrameworkSupportProvider extends FrameworkSupportInMod @NotNull @Override public FrameworkTypeEx getFrameworkType() { - return FrameworkTypeEx.EP_NAME.findExtension(JavaScriptFrameworkType.class); + return JavaScriptFrameworkType.getInstance(); } @NotNull @@ -62,17 +62,16 @@ public class JetJavaScriptFrameworkSupportProvider extends FrameworkSupportInMod getConfigurationPanel().onFrameworkSelectionChanged(selected); } - @Override - public boolean isOnlyLibraryAdded() { - return true; - } - @Override public void addSupport( @NotNull Module module, @NotNull ModifiableRootModel rootModel, @NotNull ModifiableModelsProvider modifiableModelsProvider) { - + FrameworksCompatibilityUtils.suggestRemoveIncompatibleFramework( + rootModel, + JetJavaRuntimeLibraryDescription.KOTLIN_JAVA_RUNTIME_KIND, + "Current module is already configured as Java Kotlin module.\nDo you want to remove Java support?", + "Configure Kotlin JavaScript Support"); } private FrameworkSourcePanel getConfigurationPanel() { diff --git a/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaScriptHeadersPresentationProvider.java b/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaScriptHeadersPresentationProvider.java index bae6d319dca..b9e41314a70 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaScriptHeadersPresentationProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/KotlinJavaScriptHeadersPresentationProvider.java @@ -29,7 +29,7 @@ import java.util.List; public class KotlinJavaScriptHeadersPresentationProvider extends LibraryPresentationProvider { protected KotlinJavaScriptHeadersPresentationProvider() { - super(JetJavaScriptLibraryDescription.KOTLIN_JAVASCRIPT_HEADERS_KIND); + super(JetJavaScriptLibraryDescription.KOTLIN_JAVASCRIPT_KIND); } @Nullable