framework type

This commit is contained in:
Maxim Manuylov
2012-07-21 15:48:24 +04:00
committed by Evgeny Gerashchenko
parent fd560e62b7
commit 7adaff2cdc
7 changed files with 437 additions and 0 deletions
+2
View File
@@ -76,6 +76,8 @@
<errorHandler implementation="org.jetbrains.jet.plugin.reporter.KotlinReportSubmitter"/>
<framework.type implementation="org.jetbrains.jet.plugin.sdk.KotlinFrameworkType"/>
<internalFileTemplate name="Kotlin File"/>
<internalFileTemplate name="Kotlin Class"/>
<internalFileTemplate name="Kotlin Enum"/>
@@ -0,0 +1,56 @@
/*
* Copyright 2010-2012 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.sdk;
import com.intellij.framework.addSupport.FrameworkSupportInModuleConfigurable;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.ModifiableModelsProvider;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
/**
* @author Maxim.Manuylov
* Date: 19.05.12
*/
public class KotlinFrameworkSupportConfigurable extends FrameworkSupportInModuleConfigurable {
@Nullable
@Override
public JComponent createComponent() {
return null;
}
@NotNull
@Override
public CustomLibraryDescription createLibraryDescription() {
return new KotlinSdkDescription();
}
@Override
public boolean isOnlyLibraryAdded() {
return true;
}
@Override
public void addSupport(@NotNull final Module module,
@NotNull final ModifiableRootModel rootModel,
@NotNull final ModifiableModelsProvider modifiableModelsProvider) {
}
}
@@ -0,0 +1,51 @@
/*
* Copyright 2010-2012 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.sdk;
import com.intellij.framework.FrameworkTypeEx;
import com.intellij.framework.addSupport.FrameworkSupportInModuleConfigurable;
import com.intellij.framework.addSupport.FrameworkSupportInModuleProvider;
import com.intellij.ide.util.frameworkSupport.FrameworkSupportModel;
import com.intellij.openapi.module.JavaModuleType;
import com.intellij.openapi.module.ModuleType;
import org.jetbrains.annotations.NotNull;
/**
* @author Maxim.Manuylov
* Date: 19.05.12
*/
public class KotlinFrameworkSupportProvider extends FrameworkSupportInModuleProvider {
@NotNull private static final String PLUGIN_MODULE_ID = "PLUGIN_MODULE";
@NotNull private static final String ANDROID_MODULE_ID = "ANDROID_MODULE";
@NotNull
@Override
public FrameworkTypeEx getFrameworkType() {
return FrameworkTypeEx.EP_NAME.findExtension(KotlinFrameworkType.class);
}
@NotNull
@Override
public FrameworkSupportInModuleConfigurable createConfigurable(@NotNull final FrameworkSupportModel model) {
return new KotlinFrameworkSupportConfigurable();
}
@Override
public boolean isEnabledForModuleType(@NotNull final ModuleType type) {
return type instanceof JavaModuleType || PLUGIN_MODULE_ID.equals(type.getId()) || ANDROID_MODULE_ID.equals(type.getId());
}
}
@@ -0,0 +1,52 @@
/*
* Copyright 2010-2012 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.sdk;
import com.intellij.framework.FrameworkTypeEx;
import com.intellij.framework.addSupport.FrameworkSupportInModuleProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.plugin.JetIcons;
import javax.swing.*;
/**
* @author Maxim.Manuylov
* Date: 19.05.12
*/
public class KotlinFrameworkType extends FrameworkTypeEx {
public KotlinFrameworkType() {
super("Kotlin");
}
@NotNull
@Override
public FrameworkSupportInModuleProvider createProvider() {
return new KotlinFrameworkSupportProvider();
}
@NotNull
@Override
public String getPresentableName() {
return "Kotlin";
}
@NotNull
@Override
public Icon getIcon() {
return JetIcons.SMALL_LOGO;
}
}
@@ -0,0 +1,129 @@
/*
* Copyright 2010-2012 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.sdk;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.libraries.LibraryKind;
import com.intellij.openapi.roots.libraries.NewLibraryConfiguration;
import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription;
import com.intellij.openapi.roots.ui.configuration.libraryEditor.LibraryEditor;
import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/**
* @author Maxim.Manuylov
* Date: 19.05.12
*/
public class KotlinSdkDescription extends CustomLibraryDescription {
@NotNull
@Override
public Set<? extends LibraryKind> getSuitableLibraryKinds() {
return Collections.singleton(KotlinSdkUtil.getKotlinSdkLibraryKind());
}
@Nullable
@Override
public NewLibraryConfiguration createNewLibrary(@NotNull final JComponent parentComponent, @Nullable final VirtualFile contextDirectory) {
VirtualFile initial = findFile(System.getenv("KOTLIN_HOME"));
if (initial == null) {
initial = findFile(System.getProperty("kotlinHome"));
}
final FileChooserDescriptor descriptor = new FileChooserDescriptor(false, true, false, false, false, false) {
@Override
public boolean isFileSelectable(@Nullable final VirtualFile file) {
return super.isFileSelectable(file) && KotlinSdkUtil.isSDKHome(file);
}
};
descriptor.setTitle("Kotlin SDK");
descriptor.setDescription("Choose a directory containing Kotlin distribution");
final VirtualFile sdkHome = FileChooser.chooseFile(parentComponent, descriptor, initial);
if (sdkHome == null) return null;
final String sdkHomePath = sdkHome.getPath();
final String sdkVersion = KotlinSdkUtil.getSDKVersion(sdkHomePath);
if (sdkVersion == null) {
Messages.showErrorDialog(parentComponent,
"Failed to find Kotlin SDK in the specified path: cannot determine Kotlin version.",
"Failed to Find Kotlin SDK");
return null;
}
return new NewLibraryConfiguration(KotlinSdkUtil.getSDKName(sdkVersion)) {
@Override
public void addRoots(@NotNull final LibraryEditor editor) {
addSDKRoots(editor, sdkHomePath);
}
};
}
@Nullable
private static VirtualFile findFile(@Nullable final String path) {
if (StringUtil.isEmptyOrSpaces(path)) return null;
//noinspection ConstantConditions
return LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(path));
}
private static void addSDKRoots(@NotNull final LibraryEditor editor, @NotNull final String sdkHomePath) {
final File libDir = new File(sdkHomePath, "lib");
if (!libDir.isDirectory()) return;
final List<File> jars = new ArrayList<File>();
collectJars(libDir, jars);
for (final File jar : jars) {
editor.addRoot(VfsUtil.getUrlForLibraryRoot(jar), OrderRootType.CLASSES);
}
}
private static void collectJars(@NotNull final File dir, @NotNull final List<File> jars) {
final File[] children = dir.listFiles();
if (children == null) return;
for (final File child : children) {
if (child.isDirectory()) {
collectJars(child, jars);
}
else if (child.isFile() && child.getName().endsWith(".jar")) {
jars.add(child);
}
}
}
@NotNull
@Override
public LibrariesContainer.LibraryLevel getDefaultLevel() {
return LibrariesContainer.LibraryLevel.GLOBAL;
}
}
@@ -0,0 +1,58 @@
/*
* Copyright 2010-2012 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.sdk;
import com.intellij.openapi.roots.libraries.LibraryProperties;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Maxim.Manuylov
* Date: 19.05.12
*/
public class KotlinSdkProperties extends LibraryProperties<KotlinSdkProperties> {
@NotNull private String myVersion;
public KotlinSdkProperties(@NotNull final String version) {
myVersion = version;
}
@NotNull
public String getVersion() {
return myVersion;
}
@Override
public KotlinSdkProperties getState() {
return this;
}
@Override
public void loadState(@NotNull final KotlinSdkProperties state) {
myVersion = state.myVersion;
}
@Override
public boolean equals(@Nullable final Object that) {
return this == that || (that instanceof KotlinSdkProperties && myVersion.equals(((KotlinSdkProperties)that).myVersion));
}
@Override
public int hashCode() {
return myVersion.hashCode();
}
}
@@ -0,0 +1,89 @@
/*
* Copyright 2010-2012 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.sdk;
import com.intellij.openapi.roots.libraries.PersistentLibraryKind;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* @author Maxim.Manuylov
* Date: 19.05.12
*/
public class KotlinSdkUtil {
@NotNull private static final PersistentLibraryKind<KotlinSdkProperties> KOTLIN_SDK_KIND =
new PersistentLibraryKind<KotlinSdkProperties>("KotlinSDK", false) {
@NotNull
@Override
public KotlinSdkProperties createDefaultProperties() {
return new KotlinSdkProperties("");
}
};
@NotNull private static final String KOTLIN_COMPILER_JAR = "kotlin-compiler.jar";
private KotlinSdkUtil() {}
public static boolean isSDKHome(@Nullable final VirtualFile dir) {
return dir != null && isSDKHome(new File(dir.getPath()));
}
private static boolean isSDKHome(@NotNull final File dir) {
return dir.isDirectory() && new File(new File(dir, "lib"), KOTLIN_COMPILER_JAR).isFile();
}
@Nullable
public static String getSDKVersion(@NotNull final String sdkHomePath) {
try {
return FileUtil.loadFile(new File(sdkHomePath, "build.txt")).trim();
}
catch (final IOException e) {
return null;
}
}
@Nullable
public static String detectSDKVersion(@NotNull final List<VirtualFile> jars) {
for (final VirtualFile jar : jars) {
if (jar.getName().equals(KOTLIN_COMPILER_JAR)) {
final VirtualFile libDir = jar.getParent();
if (libDir != null) {
final VirtualFile sdkHomeDir = libDir.getParent();
if (sdkHomeDir != null) {
return getSDKVersion(sdkHomeDir.getPath());
}
}
}
}
return null;
}
@NotNull
public static String getSDKName(@NotNull final String version) {
return "Kotlin " + version;
}
@NotNull
public static PersistentLibraryKind<KotlinSdkProperties> getKotlinSdkLibraryKind() {
return KOTLIN_SDK_KIND;
}
}