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 package org.jetbrains.kotlin.idea.decompiler
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.fileTypes.FileType import com.intellij.openapi.fileTypes.FileType
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.FileIndexFacade
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiFile import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import com.intellij.psi.SingleRootFileViewProvider 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 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( 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, manager: PsiManager,
val file: VirtualFile, val file: VirtualFile,
physical: Boolean, 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
//TODO: check index that file is library file, as in ClassFileViewProvider override fun createFile(project: Project, file: VirtualFile, fileType: FileType) =
if (!isInternal) JetClsFile(this) else null if (!isInternal) KotlinJavascriptMetaFile(this) else null
}
override fun getContents(): CharSequence { override fun createCopy(copy: VirtualFile) = KotlinJavascriptMetaFileViewProvider(getManager(), copy, false, isInternal)
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)
}
}
@@ -16,11 +16,12 @@
package org.jetbrains.kotlin.idea.decompiler 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.DecompiledText
import org.jetbrains.kotlin.idea.decompiler.textBuilder.buildDecompiledText
import org.jetbrains.kotlin.utils.concurrent.block.LockedClearableLazyValue 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()) { protected override val decompiledText: LockedClearableLazyValue<DecompiledText> = LockedClearableLazyValue(Any()) {
buildDecompiledText(getVirtualFile()) buildDecompiledText(getVirtualFile())
} }
@@ -16,11 +16,12 @@
package org.jetbrains.kotlin.idea.decompiler 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.buildDecompiledTextFromJsMetadata
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledText import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledText
import org.jetbrains.kotlin.utils.concurrent.block.LockedClearableLazyValue 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()) { protected override val decompiledText: LockedClearableLazyValue<DecompiledText> = LockedClearableLazyValue(Any()) {
buildDecompiledTextFromJsMetadata(getVirtualFile()) 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)
}
}