mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-80483 NPE
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
+6
-6
@@ -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());
|
||||
|
||||
+2
-2
@@ -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()) {
|
||||
|
||||
+1
-1
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user