Create file must return new file, as old one can be invalidated (KT-8266)

Invalidation in SingleRootFileViewProvider.getPsiInner()

 #KT-8266 Fixed
This commit is contained in:
Nikolay Krasko
2015-06-30 17:58:43 +03:00
parent 7c7a0fb4ea
commit ef477f99e9
4 changed files with 43 additions and 67 deletions
@@ -16,33 +16,55 @@
package org.jetbrains.kotlin.idea.decompiler
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.fileTypes.FileType
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.FileIndexFacade
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import com.intellij.psi.SingleRootFileViewProvider
import com.intellij.psi.impl.source.PsiFileImpl
import org.jetbrains.kotlin.idea.JetFileType
import org.jetbrains.kotlin.idea.JetLanguage
import kotlin.properties.Delegates
import org.jetbrains.kotlin.utils.concurrent.block.LockedClearableLazyValue
abstract class KotlinClassFileViewProvider(
manager: PsiManager,
file: VirtualFile,
physical: Boolean) : SingleRootFileViewProvider(manager, file, physical, JetLanguage.INSTANCE) {
override fun getContents(): CharSequence = getPsi(JetLanguage.INSTANCE)?.getText() ?: ""
}
public class JetClassFileViewProvider(
manager: PsiManager,
file: VirtualFile,
physical: Boolean,
val isInternal: Boolean) : KotlinClassFileViewProvider(manager, file, physical) {
override fun createFile(project: Project, file: VirtualFile, fileType: FileType): PsiFile? {
val fileIndex = ServiceManager.getService(project, javaClass<FileIndexFacade>())
if (!fileIndex.isInLibraryClasses(file) && fileIndex.isInSource(file)) {
return null
}
if (isInternal) return null
return JetClsFile(this)
}
override fun createCopy(copy: VirtualFile) = JetClassFileViewProvider(getManager(), copy, false, isInternal)
}
public class KotlinJavascriptMetaFileViewProvider (
manager: PsiManager,
val file: VirtualFile,
physical: Boolean,
val isInternal: Boolean) : SingleRootFileViewProvider(manager, file, physical, JetLanguage.INSTANCE) {
val isInternal: Boolean) : KotlinClassFileViewProvider(manager, file, physical) {
val jetClsFile by Delegates.blockingLazy(this) {
//TODO: check index that file is library file, as in ClassFileViewProvider
if (!isInternal) JetClsFile(this) else null
}
//TODO: check index that file is library file, as in ClassFileViewProvider
override fun createFile(project: Project, file: VirtualFile, fileType: FileType) =
if (!isInternal) KotlinJavascriptMetaFile(this) else null
override fun getContents(): CharSequence {
return jetClsFile?.getText() ?: ""
}
override fun createFile(project: Project, file: VirtualFile, fileType: FileType): PsiFile? = jetClsFile
override fun createCopy(copy: VirtualFile): SingleRootFileViewProvider {
return JetClassFileViewProvider(getManager(), copy, false, isInternal)
}
}
override fun createCopy(copy: VirtualFile) = KotlinJavascriptMetaFileViewProvider(getManager(), copy, false, isInternal)
}
@@ -16,11 +16,12 @@
package org.jetbrains.kotlin.idea.decompiler
import org.jetbrains.kotlin.idea.decompiler.textBuilder.buildDecompiledText
import com.intellij.psi.FileViewProvider
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledText
import org.jetbrains.kotlin.idea.decompiler.textBuilder.buildDecompiledText
import org.jetbrains.kotlin.utils.concurrent.block.LockedClearableLazyValue
public class JetClsFile(val provider: JetClassFileViewProvider) : KotlinClsFileBase(provider) {
public class JetClsFile(provider: FileViewProvider) : KotlinClsFileBase(provider) {
protected override val decompiledText: LockedClearableLazyValue<DecompiledText> = LockedClearableLazyValue(Any()) {
buildDecompiledText(getVirtualFile())
}
@@ -16,11 +16,12 @@
package org.jetbrains.kotlin.idea.decompiler
import com.intellij.psi.FileViewProvider
import org.jetbrains.kotlin.idea.decompiler.textBuilder.buildDecompiledTextFromJsMetadata
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledText
import org.jetbrains.kotlin.utils.concurrent.block.LockedClearableLazyValue
public class KotlinJavascriptMetaFile(val provider: KotlinJavascriptMetaFileViewProvider) : KotlinClsFileBase(provider) {
public class KotlinJavascriptMetaFile(provider: FileViewProvider) : KotlinClsFileBase(provider) {
protected override val decompiledText: LockedClearableLazyValue<DecompiledText> = LockedClearableLazyValue(Any()) {
buildDecompiledTextFromJsMetadata(getVirtualFile())
}
@@ -1,48 +0,0 @@
/*
* Copyright 2010-2015 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.kotlin.idea.decompiler
import com.intellij.openapi.fileTypes.FileType
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import com.intellij.psi.SingleRootFileViewProvider
import org.jetbrains.kotlin.idea.JetLanguage
import kotlin.properties.Delegates
public class KotlinJavascriptMetaFileViewProvider (
manager: PsiManager,
val file: VirtualFile,
physical: Boolean,
val isInternal: Boolean) : SingleRootFileViewProvider(manager, file, physical, JetLanguage.INSTANCE) {
val jetJsMetaFile by Delegates.blockingLazy(this) {
//TODO: check index that file is library file, as in ClassFileViewProvider
if (!isInternal) KotlinJavascriptMetaFile(this) else null
}
override fun getContents(): CharSequence {
return jetJsMetaFile?.getText() ?: ""
}
override fun createFile(project: Project, file: VirtualFile, fileType: FileType): PsiFile? = jetJsMetaFile
override fun createCopy(copy: VirtualFile): SingleRootFileViewProvider {
return KotlinJavascriptMetaFileViewProvider(getManager(), copy, false, isInternal)
}
}