IDEA-80483 NPE

This commit is contained in:
Alexey Kudravtsev
2012-02-03 14:34:52 +04:00
parent 1449cb56f4
commit 983a273a6e
8 changed files with 61 additions and 44 deletions
@@ -56,7 +56,7 @@ public class ClassFileViewProvider extends SingleRootFileViewProvider {
@NotNull
@Override
public SingleRootFileViewProvider createCopy(final VirtualFile copy) {
public SingleRootFileViewProvider createCopy(@NotNull final VirtualFile copy) {
return new ClassFileViewProvider(getManager(), copy, false);
}
}
@@ -37,18 +37,26 @@ import java.util.Set;
* @see PsiManager#findViewProvider(com.intellij.openapi.vfs.VirtualFile)
*/
public interface FileViewProvider extends Cloneable, UserDataHolder {
@NotNull PsiManager getManager();
@NotNull
PsiManager getManager();
@Nullable Document getDocument();
@NotNull CharSequence getContents();
@NotNull VirtualFile getVirtualFile();
@Nullable
Document getDocument();
@NotNull Language getBaseLanguage();
@NotNull
CharSequence getContents();
@NotNull
VirtualFile getVirtualFile();
@NotNull
Language getBaseLanguage();
/**
* @return all languages this file supports. See {@link #getPsi(com.intellij.lang.Language)}
*/
@NotNull Set<Language> getLanguages();
@NotNull
Set<Language> getLanguages();
/**
* @param target target language
@@ -56,33 +64,40 @@ public interface FileViewProvider extends Cloneable, UserDataHolder {
*/
PsiFile getPsi(@NotNull Language target);
@NotNull List<PsiFile> getAllFiles();
@NotNull
List<PsiFile> getAllFiles();
boolean isEventSystemEnabled();
boolean isPhysical();
long getModificationStamp();
boolean supportsIncrementalReparse(Language rootLanguage);
boolean supportsIncrementalReparse(@NotNull Language rootLanguage);
void rootChanged(@NotNull PsiFile psiFile);
void rootChanged(PsiFile psiFile);
void beforeContentsSynchronized();
void contentsSynchronized();
FileViewProvider clone();
@Nullable
PsiElement findElementAt(final int offset);
@Nullable
PsiReference findReferenceAt(final int offset);
PsiElement findElementAt(int offset);
@Nullable
PsiElement findElementAt(final int offset, final Language language);
PsiReference findReferenceAt(int offset);
@Nullable
PsiElement findElementAt(int offset, Class<? extends Language> lang);
PsiElement findElementAt(int offset, @NotNull Language language);
@Nullable
PsiReference findReferenceAt(final int offsetInElement, @NotNull Language language);
PsiElement findElementAt(int offset, @NotNull Class<? extends Language> lang);
@Nullable
PsiReference findReferenceAt(int offsetInElement, @NotNull Language language);
@NotNull
FileViewProvider createCopy(VirtualFile copy);
FileViewProvider createCopy(@NotNull VirtualFile copy);
}
@@ -115,12 +115,12 @@ public class DummyHolderViewProvider extends UserDataHolderBase implements FileV
}
@Override
public boolean supportsIncrementalReparse(final Language rootLanguage) {
public boolean supportsIncrementalReparse(@NotNull final Language rootLanguage) {
return true;
}
@Override
public void rootChanged(PsiFile psiFile) {
public void rootChanged(@NotNull PsiFile psiFile) {
}
public void setDummyHolder(@NotNull DummyHolder dummyHolder) {
@@ -140,13 +140,13 @@ public class DummyHolderViewProvider extends UserDataHolderBase implements FileV
@Override
@Nullable
public PsiElement findElementAt(final int offset, final Language language) {
public PsiElement findElementAt(final int offset, @NotNull final Language language) {
return language == getBaseLanguage() ? findElementAt(offset) : null;
}
@Override
public PsiElement findElementAt(int offset, Class<? extends Language> lang) {
public PsiElement findElementAt(int offset, @NotNull Class<? extends Language> lang) {
if (!lang.isAssignableFrom(getBaseLanguage().getClass())) return null;
return findElementAt(offset);
}
@@ -158,7 +158,7 @@ public class DummyHolderViewProvider extends UserDataHolderBase implements FileV
@NotNull
@Override
public FileViewProvider createCopy(final VirtualFile copy) {
public FileViewProvider createCopy(@NotNull final VirtualFile copy) {
throw new RuntimeException("Clone is not supported for DummyHolderProviders. Use DummyHolder clone directly.");
}
@@ -57,14 +57,14 @@ import java.util.concurrent.atomic.AtomicReference;
public class SingleRootFileViewProvider extends UserDataHolderBase implements FileViewProvider {
private static final Key<Boolean> OUR_NO_SIZE_LIMIT_KEY = Key.create("no.size.limit");
private static final Logger LOG = Logger.getInstance("#" + SingleRootFileViewProvider.class.getCanonicalName());
private final PsiManager myManager;
private final VirtualFile myVirtualFile;
@NotNull private final PsiManager myManager;
@NotNull private final VirtualFile myVirtualFile;
private final boolean myEventSystemEnabled;
private final boolean myPhysical;
private final AtomicReference<PsiFile> myPsiFile = new AtomicReference<PsiFile>();
@NotNull private final AtomicReference<PsiFile> myPsiFile = new AtomicReference<PsiFile>();
private volatile Content myContent;
private volatile SoftReference<Document> myDocument;
private final Language myBaseLanguage;
@NotNull private final Language myBaseLanguage;
private final ProjectFileExclusionManager myExclusionManager;
public SingleRootFileViewProvider(@NotNull PsiManager manager, @NotNull VirtualFile file) {
@@ -183,7 +183,7 @@ public class SingleRootFileViewProvider extends UserDataHolderBase implements Fi
}
@Override
public void rootChanged(PsiFile psiFile) {
public void rootChanged(@NotNull PsiFile psiFile) {
if (((PsiFileEx)psiFile).isContentsLoaded()) {
setContent(new PsiFileContent((PsiFileImpl)psiFile, LocalTimeCounter.currentTime()));
}
@@ -205,7 +205,7 @@ public class SingleRootFileViewProvider extends UserDataHolderBase implements Fi
}
@Override
public boolean supportsIncrementalReparse(final Language rootLanguage) {
public boolean supportsIncrementalReparse(@NotNull final Language rootLanguage) {
return true;
}
@@ -296,7 +296,7 @@ public class SingleRootFileViewProvider extends UserDataHolderBase implements Fi
}
@Nullable
protected PsiFile createFile(Language lang) {
protected PsiFile createFile(@NotNull Language lang) {
if (lang != getBaseLanguage()) return null;
final ParserDefinition parserDefinition = LanguageParserDefinitions.INSTANCE.forLanguage(lang);
if (parserDefinition != null) {
@@ -355,7 +355,7 @@ public class SingleRootFileViewProvider extends UserDataHolderBase implements Fi
@NotNull
@Override
public SingleRootFileViewProvider createCopy(final VirtualFile copy) {
public SingleRootFileViewProvider createCopy(@NotNull final VirtualFile copy) {
return new SingleRootFileViewProvider(getManager(), copy, false, myBaseLanguage);
}
@@ -366,7 +366,7 @@ public class SingleRootFileViewProvider extends UserDataHolderBase implements Fi
}
@Override
public PsiElement findElementAt(final int offset, final Language language) {
public PsiElement findElementAt(final int offset, @NotNull final Language language) {
final PsiFile psiFile = getPsi(language);
return psiFile != null ? findElementAt(psiFile, offset) : null;
}
@@ -379,7 +379,7 @@ public class SingleRootFileViewProvider extends UserDataHolderBase implements Fi
}
@Nullable
private static PsiReference findReferenceAt(final PsiFile psiFile, final int offset) {
private static PsiReference findReferenceAt(@Nullable final PsiFile psiFile, final int offset) {
if (psiFile == null) return null;
int offsetInElement = offset;
PsiElement child = psiFile.getFirstChild();
@@ -402,13 +402,13 @@ public class SingleRootFileViewProvider extends UserDataHolderBase implements Fi
@Override
public PsiElement findElementAt(int offset, Class<? extends Language> lang) {
public PsiElement findElementAt(int offset, @NotNull Class<? extends Language> lang) {
if (!ReflectionCache.isAssignable(lang, getBaseLanguage().getClass())) return null;
return findElementAt(offset);
}
@Nullable
protected static PsiElement findElementAt(final PsiElement psiFile, final int offset) {
protected static PsiElement findElementAt(@Nullable final PsiElement psiFile, final int offset) {
if (psiFile == null) return null;
int offsetInElement = offset;
PsiElement child = psiFile.getFirstChild();
@@ -476,6 +476,7 @@ public class SingleRootFileViewProvider extends UserDataHolderBase implements Fi
}
private class DocumentContent implements Content {
@NotNull
@Override
public CharSequence getText() {
final Document document = getDocument();
@@ -509,6 +510,7 @@ public class SingleRootFileViewProvider extends UserDataHolderBase implements Fi
}
if (myContent != null) return myContent;
return myContent = ApplicationManager.getApplication().runReadAction(new Computable<CharSequence>() {
@NotNull
public CharSequence compute() {
return myFile.calcTreeElement().getText();
}
@@ -47,7 +47,7 @@ public class SelectWordHandler extends EditorActionHandler {
myOriginalHandler = originalHandler;
}
public void execute(Editor editor, DataContext dataContext) {
public void execute(@NotNull Editor editor, DataContext dataContext) {
if (LOG.isDebugEnabled()) {
LOG.debug("enter: execute(editor='" + editor + "')");
}
@@ -78,10 +78,10 @@ public class SelectWordHandler extends EditorActionHandler {
doAction(editor, file);
}
private static void doAction(Editor editor, PsiFile file) {
private static void doAction(@NotNull Editor editor, @NotNull PsiFile file) {
if (file instanceof PsiCompiledElement) {
file = (PsiFile)((PsiCompiledElement)file).getMirror();
if (file == null) return;
}
FeatureUsageTracker.getInstance().triggerFeatureUsed("editing.select.word");
@@ -140,7 +140,7 @@ public class SelectWordHandler extends EditorActionHandler {
SelectWordUtil.processRanges(element, editor.getDocument().getCharsSequence(), caretOffset, editor, new Processor<TextRange>() {
@Override
public boolean process(TextRange range) {
public boolean process(@NotNull TextRange range) {
if (range.contains(selectionRange) && !range.equals(selectionRange)) {
if (minimumRange.get().contains(range)) {
minimumRange.set(range);
@@ -155,7 +155,7 @@ public class SelectWordHandler extends EditorActionHandler {
editor.getSelectionModel().setSelection(range.getStartOffset(), range.getEndOffset());
}
private static int adjustCaretOffset(Editor editor) {
private static int adjustCaretOffset(@NotNull Editor editor) {
int caretOffset = editor.getCaretModel().getOffset();
if (caretOffset == 0) {
return caretOffset;
@@ -174,7 +174,7 @@ public class SelectWordHandler extends EditorActionHandler {
}
@Nullable
private static PsiElement findElementAt(final PsiFile file, final int caretOffset) {
private static PsiElement findElementAt(@NotNull final PsiFile file, final int caretOffset) {
PsiElement elementAt = file.findElementAt(caretOffset);
if (elementAt != null && isLanguageExtension(file, elementAt)) {
return file.getViewProvider().findElementAt(caretOffset, file.getLanguage());
@@ -129,7 +129,7 @@ public abstract class MultiplePsiFilesPerDocumentFileViewProvider extends Single
@NotNull
@Override
public final MultiplePsiFilesPerDocumentFileViewProvider createCopy(final VirtualFile fileCopy) {
public final MultiplePsiFilesPerDocumentFileViewProvider createCopy(@NotNull final VirtualFile fileCopy) {
final MultiplePsiFilesPerDocumentFileViewProvider copy = cloneInner(fileCopy);
copy.myOriginal = myOriginal == null ? this : myOriginal;
return copy;
@@ -139,7 +139,7 @@ public abstract class MultiplePsiFilesPerDocumentFileViewProvider extends Single
@Override
@Nullable
public PsiElement findElementAt(int offset, Class<? extends Language> lang) {
public PsiElement findElementAt(int offset, @NotNull Class<? extends Language> lang) {
final PsiFile mainRoot = getPsi(getBaseLanguage());
PsiElement ret = null;
for (final Language language : getLanguages()) {
@@ -59,7 +59,7 @@ public class InjectedFileViewProvider extends SingleRootFileViewProvider impleme
}
@Override
public void rootChanged(PsiFile psiFile) {
public void rootChanged(@NotNull PsiFile psiFile) {
super.rootChanged(psiFile);
if (!isPhysical()) return; // injected PSI change happened inside reparse; ignore
if (myPatchingLeaves) return;
@@ -86,7 +86,7 @@ public class ReflectionCache {
return ourMethods.get(aClass);
}
public static boolean isAssignable(Class ancestor, Class descendant) {
public static boolean isAssignable(@NotNull Class ancestor, Class descendant) {
return ancestor == descendant || ancestor.isAssignableFrom(descendant);
}