Update JetClassFileViewProvider: JetClsFile is Kotlin compiled file

This commit is contained in:
Pavel V. Talanov
2014-11-14 17:32:56 +03:00
parent 6362336208
commit 6cf14f5500
3 changed files with 17 additions and 222 deletions
@@ -37,7 +37,7 @@ public class JetClassFileViewProvider(
}
override fun getContents(): CharSequence {
return if (!isInternal) jetClsFile!!.getText() else ""
return jetClsFile?.getText() ?: ""
}
override fun createFile(project: Project, file: VirtualFile, fileType: FileType): PsiFile? = jetClsFile
@@ -26,45 +26,33 @@ import com.intellij.psi.PsiElement
import org.jetbrains.jet.plugin.decompiler.textBuilder.buildDecompiledText
import org.jetbrains.jet.plugin.decompiler.textBuilder.descriptorToKey
import org.jetbrains.jet.utils.concurrent.block.LockedClearableLazyValue
import org.jetbrains.jet.lang.psi.JetFile
public class JetClsFile(val provider: JetClassFileViewProvider) : ClsFileImpl(provider) {
private val mirrorLock = Any()
private val mirrorFile = LockedClearableLazyValue(mirrorLock) {
JetDummyClassFileViewProvider.createJetFile(
provider.getManager(),
getVirtualFile(),
decompiledText.get().text)!!
}
private val decompiledText = LockedClearableLazyValue(mirrorLock) {
public class JetClsFile(val provider: JetClassFileViewProvider) : JetFile(provider, true) {
private val decompiledText = LockedClearableLazyValue(Any()) {
buildDecompiledText(getVirtualFile())
}
override fun getMirror(): PsiElement? = mirrorFile.get()
public fun getDeclarationForDescriptor(descriptor: DeclarationDescriptor): JetDeclaration? {
val key = descriptorToKey(descriptor.getOriginal())
return synchronized(mirrorLock) {
val range = decompiledText.get().renderedDescriptorsToRange[key]
if (range != null) {
PsiTreeUtil.findElementOfClassAtRange(
mirrorFile.get(), range.getStartOffset(), range.getEndOffset(), javaClass<JetDeclaration>())
}
else {
null
}
val range = decompiledText.get().renderedDescriptorsToRange[key]
return if (range != null) {
PsiTreeUtil.findElementOfClassAtRange(this, range.getStartOffset(), range.getEndOffset(), javaClass<JetDeclaration>())
}
else {
null
}
}
override fun onContentReload() {
super<ClsFileImpl>.onContentReload()
override fun getText(): String? {
return decompiledText.get().text
}
synchronized (mirrorLock) {
decompiledText.drop()
mirrorFile.drop()
}
override fun onContentReload() {
super.onContentReload()
decompiledText.drop()
}
TestOnly
@@ -1,193 +0,0 @@
/*
* 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.decompiler;
import com.intellij.lang.Language;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.SharedPsiElementImplUtil;
import com.intellij.psi.impl.source.tree.LeafElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.plugin.JetLanguage;
import java.util.Collections;
import java.util.List;
import java.util.Set;
class JetDummyClassFileViewProvider extends UserDataHolderBase implements FileViewProvider {
private final String text;
private final PsiManager manager;
private JetFile jetFile = null;
private final VirtualFile virtualFile;
public JetDummyClassFileViewProvider(@NotNull PsiManager manager, @NotNull VirtualFile file, String text) {
this.manager = manager;
virtualFile = file;
this.text = text;
jetFile = new JetFile(this, true) {
@Override
public VirtualFile getVirtualFile() {
return virtualFile; // overridden to return not-null; original method returns null when isEventSystemEnabled() = false
}
};
}
@Override
@NotNull
public PsiManager getManager() {
return manager;
}
@Override
@Nullable
public Document getDocument() {
return null;
}
@Override
@NotNull
public String getContents() {
return text;
}
@Override
@NotNull
public VirtualFile getVirtualFile() {
return virtualFile;
}
@Override
@NotNull
public Language getBaseLanguage() {
return JetLanguage.INSTANCE;
}
@Override
@NotNull
public Set<Language> getLanguages() {
return Collections.singleton(getBaseLanguage());
}
@Override
public JetFile getPsi(@NotNull Language target) {
if (JetLanguage.INSTANCE != target) {
return null;
}
return jetFile;
}
@Override
@NotNull
public List<PsiFile> getAllFiles() {
return Collections.<PsiFile>singletonList(jetFile);
}
@Override
public void beforeContentsSynchronized() {
}
@Override
public void contentsSynchronized() {
}
@Override
public boolean isEventSystemEnabled() {
return false;
}
@Override
public boolean isPhysical() {
return false;
}
@Override
public long getModificationStamp() {
return 0;
}
@Override
public boolean supportsIncrementalReparse(@NotNull Language rootLanguage) {
return true;
}
@Override
public void rootChanged(@NotNull PsiFile psiFile) {
}
@Override
public FileViewProvider clone(){
throw new UnsupportedOperationException();
}
@Override
public PsiReference findReferenceAt(int offset) {
return SharedPsiElementImplUtil.findReferenceAt(getPsi(getBaseLanguage()), offset);
}
@Override
@Nullable
public PsiElement findElementAt(int offset, @NotNull Language language) {
return language == getBaseLanguage() ? findElementAt(offset) : null;
}
@Override
public PsiElement findElementAt(int offset, @NotNull Class<? extends Language> lang) {
if (JetLanguage.class != lang) {
return null;
}
return findElementAt(offset);
}
@Override
public PsiElement findElementAt(int offset) {
LeafElement element = jetFile.calcTreeElement().findLeafElementAt(offset);
return element != null ? element.getPsi() : null;
}
@Override
public PsiReference findReferenceAt(int offsetInElement, @NotNull Language language) {
if (JetLanguage.INSTANCE != language) {
return null;
}
return findReferenceAt(offsetInElement);
}
@NotNull
@Override
public FileViewProvider createCopy(@NotNull VirtualFile copy) {
throw new UnsupportedOperationException();
}
@NotNull
@Override
public PsiFile getStubBindingRoot() {
PsiFile psi = getPsi(getBaseLanguage());
assert psi != null;
return psi;
}
@NotNull
public static JetFile createJetFile(PsiManager psiManager, VirtualFile file, String text) {
return new JetDummyClassFileViewProvider(psiManager, file, text).getPsi(JetLanguage.INSTANCE);
}
}