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:
+38
-16
@@ -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())
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -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())
|
||||||
}
|
}
|
||||||
|
|||||||
-48
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user