Added JetDummyClassFileViewProvider which is needed to JetFiles created from libraries have link to physical VirtualFile instead of LightVirtualFile.

This commit is contained in:
Evgeny Gerashchenko
2012-03-06 23:27:47 +04:00
parent 01ed1c3f75
commit 91adb13380
2 changed files with 179 additions and 2 deletions
@@ -136,7 +136,8 @@ public class JetDecompiledData {
project,
JetSemanticServices.createSemanticServices(project),
trace);
ClsFileImpl clsFile = (ClsFileImpl) PsiManager.getInstance(project).findFile(file);
PsiManager psiManager = PsiManager.getInstance(project);
ClsFileImpl clsFile = (ClsFileImpl) psiManager.findFile(file);
assert clsFile != null;
builder.append(PsiBundle.message("psi.decompiled.text.header"));
builder.append("\n\n");
@@ -188,7 +189,7 @@ public class JetDecompiledData {
}
myText = builder.toString();
myJetFile = (JetFile) PsiFileFactory.getInstance(project).createFileFromText("", JetLanguage.INSTANCE, myText);
myJetFile = JetDummyClassFileViewProvider.createJetFile(psiManager, file, myText);
for (Map.Entry<PsiElement, TextRange> clsMemberToRange : clsMembersToRanges.entrySet()) {
PsiElement clsMember = clsMemberToRange.getKey();
assert clsMember instanceof ClsElementImpl;
@@ -0,0 +1,176 @@
/*
* Copyright 2000-2012 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;
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 java.util.Collections;
import java.util.List;
import java.util.Set;
/**
* @author Evgeny Gerashchenko
* @since 3/2/12
*/
public class JetDummyClassFileViewProvider extends UserDataHolderBase implements FileViewProvider {
private String myText;
private final PsiManager myManager;
private JetFile myJetFile = null;
private final VirtualFile myVirtualFile;
public JetDummyClassFileViewProvider(@NotNull PsiManager manager, @NotNull VirtualFile file, String text) {
myManager = manager;
myVirtualFile = file;
myText = text;
myJetFile = new JetFile(this);
}
@Override
@NotNull
public PsiManager getManager() {
return myManager;
}
@Override
@Nullable
public Document getDocument() {
return null;
}
@Override
@NotNull
public CharSequence getContents() {
return myText;
}
@Override
@NotNull
public VirtualFile getVirtualFile() {
return myVirtualFile;
}
@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) {
assert JetLanguage.INSTANCE == target;
return myJetFile;
}
@Override
@NotNull
public List<PsiFile> getAllFiles() {
return Collections.<PsiFile>singletonList(myJetFile);
}
@Override
public void beforeContentsSynchronized() {
}
@Override
public void contentsSynchronized() {
}
@Override
public boolean isEventSystemEnabled() {
return true;
}
@Override
public boolean isPhysical() {
return false;
}
@Override
public long getModificationStamp() {
return 0;
}
@Override
public boolean supportsIncrementalReparse(@NotNull final Language rootLanguage) {
return true;
}
@Override
public void rootChanged(@NotNull PsiFile psiFile) {
}
@Override
public FileViewProvider clone(){
throw new UnsupportedOperationException();
}
@Override
public PsiReference findReferenceAt(final int offset) {
return SharedPsiElementImplUtil.findReferenceAt(getPsi(getBaseLanguage()), offset);
}
@Override
@Nullable
public PsiElement findElementAt(final int offset, @NotNull final Language language) {
return language == getBaseLanguage() ? findElementAt(offset) : null;
}
@Override
public PsiElement findElementAt(int offset, @NotNull Class<? extends Language> lang) {
assert JetLanguage.class == lang;
return findElementAt(offset);
}
@Override
public PsiElement findElementAt(final int offset) {
LeafElement element = myJetFile.calcTreeElement().findLeafElementAt(offset);
return element != null ? element.getPsi() : null;
}
@Override
public PsiReference findReferenceAt(final int offsetInElement, @NotNull final Language language) {
assert JetLanguage.INSTANCE == language;
return findReferenceAt(offsetInElement);
}
@NotNull
@Override
public FileViewProvider createCopy(@NotNull final VirtualFile copy) {
throw new UnsupportedOperationException();
}
public static JetFile createJetFile(PsiManager psiManager, VirtualFile file, String text) {
return new JetDummyClassFileViewProvider(psiManager, file, text).getPsi(JetLanguage.INSTANCE);
}
}