diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 67632c8d7e2..d76130a0b3e 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -43,6 +43,10 @@ org.jetbrains.jet.plugin.PluginBundledRegistrar + + + org.jetbrains.jet.plugin.versions.KotlinUpdatePluginComponent + diff --git a/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java index 22a93f670d4..f5100a9a7ca 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java +++ b/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java @@ -21,8 +21,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.AbstractProjectComponent; import com.intellij.openapi.project.Project; import com.intellij.openapi.startup.StartupManager; -import com.intellij.openapi.vfs.VfsUtil; -import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.*; import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; diff --git a/idea/src/org/jetbrains/jet/plugin/versions/KotlinUpdatePluginComponent.kt b/idea/src/org/jetbrains/jet/plugin/versions/KotlinUpdatePluginComponent.kt new file mode 100644 index 00000000000..72c553074d3 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/versions/KotlinUpdatePluginComponent.kt @@ -0,0 +1,78 @@ +/* + * 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.versions + +import com.intellij.openapi.components.ApplicationComponent +import org.jetbrains.jet.utils.PathUtil +import com.intellij.openapi.vfs.JarFileSystem +import com.intellij.ide.util.PropertiesComponent +import org.jetbrains.jet.plugin.JetPluginUtil +import com.intellij.util.indexing.FileBasedIndex +import com.intellij.openapi.vfs.LocalFileSystem +import java.io.File +import com.intellij.openapi.vfs.VfsUtil +import com.intellij.openapi.vfs.VirtualFileVisitor +import com.intellij.openapi.vfs.newvfs.NewVirtualFile +import com.intellij.openapi.vfs.VfsUtilCore +import org.jetbrains.jet.plugin.vfilefinder.KotlinClassFileIndex + +private val INSTALLED_KOTLIN_VERSION = "installed.kotlin.plugin.version" + +class KotlinUpdatePluginComponent : ApplicationComponent { + override fun initComponent() { + val installedKotlinVersion = PropertiesComponent.getInstance()?.getValue(INSTALLED_KOTLIN_VERSION) + + if (installedKotlinVersion == null || JetPluginUtil.getPluginVersion() != installedKotlinVersion) { + val ideaPluginPaths = PathUtil.getKotlinPathsForIdeaPlugin() + + // Force refresh jar handlers + requestFullJarUpdate(ideaPluginPaths.getRuntimePath()) + requestFullJarUpdate(ideaPluginPaths.getRuntimeSourcesPath()) + + requestFullJarUpdate(ideaPluginPaths.getJsLibJarPath()) + + requestFullJarUpdate(ideaPluginPaths.getJdkAnnotationsPath()) + requestFullJarUpdate(ideaPluginPaths.getAndroidSdkAnnotationsPath()) + + // Force update indices for files under config directory + val fileBasedIndex = FileBasedIndex.getInstance()!! + fileBasedIndex.requestRebuild(KotlinAbiVersionIndex.INSTANCE.getName()) + fileBasedIndex.requestRebuild(KotlinClassFileIndex.KEY) + + PropertiesComponent.getInstance()?.setValue(INSTALLED_KOTLIN_VERSION, JetPluginUtil.getPluginVersion()) + } + } + + override fun getComponentName(): String { + return "ReindexBundledRuntimeComponent" + } + + override fun disposeComponent() { + } + + private fun requestFullJarUpdate(jarFilePath: File) { + val localVirtualFile = LocalFileSystem.getInstance()!!.refreshAndFindFileByIoFile(jarFilePath) + + // Build and update JarHandler + val jarFile = JarFileSystem.getInstance()!!.getJarRootForLocalFile(localVirtualFile!!) + VfsUtilCore.visitChildrenRecursively(jarFile!!, object : VirtualFileVisitor() {}) + ((jarFile as NewVirtualFile)).markDirtyRecursively() + + jarFile.refresh(false, true) + VfsUtil.markDirtyAndRefresh(false, false, true, localVirtualFile) + } +}