diff --git a/platform/core-api/src/com/intellij/psi/PsiLanguageInjectionHost.java b/platform/core-api/src/com/intellij/psi/PsiLanguageInjectionHost.java index bc447903aa84..ea89efe4101c 100644 --- a/platform/core-api/src/com/intellij/psi/PsiLanguageInjectionHost.java +++ b/platform/core-api/src/com/intellij/psi/PsiLanguageInjectionHost.java @@ -45,7 +45,7 @@ public interface PsiLanguageInjectionHost extends PsiElement { /** * Update the host element using the provided text of the injected file. It may be required to escape characters from {@code text} - * in accordance with the host language syntax. The implementation may delegate to {@link com.intellij.psi.ElementManipulators#handleContentChange(PsiElement, String)} + * in accordance with the host language syntax. The implementation may delegate to {@link ElementManipulators#handleContentChange(PsiElement, String)} * if {@link com.intellij.psi.ElementManipulator} implementation is registered for this element class * @param text text of the injected file * @return the updated instance @@ -59,6 +59,7 @@ public interface PsiLanguageInjectionHost extends PsiElement { LiteralTextEscaper createLiteralTextEscaper(); + @FunctionalInterface interface InjectedPsiVisitor { void visit(@NotNull PsiFile injectedPsi, @NotNull List places); } diff --git a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/InjectedSelfElementInfo.java b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/InjectedSelfElementInfo.java index 7c1c9f3d6127..44c56393d5e6 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/InjectedSelfElementInfo.java +++ b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/InjectedSelfElementInfo.java @@ -122,16 +122,13 @@ class InjectedSelfElementInfo extends SmartPointerElementInfo { @NotNull final TextRange rangeInHostFile) { final PsiDocumentManagerBase docManager = (PsiDocumentManagerBase)PsiDocumentManager.getInstance(getProject()); final PsiFile[] result = {null}; - final PsiLanguageInjectionHost.InjectedPsiVisitor visitor = new PsiLanguageInjectionHost.InjectedPsiVisitor() { - @Override - public void visit(@NotNull PsiFile injectedPsi, @NotNull List places) { - Document document = docManager.getDocument(injectedPsi); - if (document instanceof DocumentWindow) { - DocumentWindow window = (DocumentWindow)docManager.getLastCommittedDocument(document); - TextRange hostRange = window.injectedToHost(new TextRange(0, injectedPsi.getTextLength())); - if (hostRange.contains(rangeInHostFile)) { - result[0] = injectedPsi; - } + final PsiLanguageInjectionHost.InjectedPsiVisitor visitor = (injectedPsi, places) -> { + Document document = docManager.getDocument(injectedPsi); + if (document instanceof DocumentWindow) { + DocumentWindow window = (DocumentWindow)docManager.getLastCommittedDocument(document); + TextRange hostRange = window.injectedToHost(new TextRange(0, injectedPsi.getTextLength())); + if (hostRange.contains(rangeInHostFile)) { + result[0] = injectedPsi; } } }; @@ -142,7 +139,7 @@ class InjectedSelfElementInfo extends SmartPointerElementInfo { for (DocumentWindow documentWindow : InjectedLanguageManager.getInstance(getProject()).getCachedInjectedDocuments(hostFile)) { PsiFile injected = documentManager.getPsiFile(documentWindow); if (injected != null) { - visitor.visit(injected, Collections.emptyList()); + visitor.visit(injected, Collections.emptyList()); } } } @@ -151,7 +148,7 @@ class InjectedSelfElementInfo extends SmartPointerElementInfo { if (injected != null) { for (Pair pair : injected) { PsiFile injectedFile = pair.first.getContainingFile(); - visitor.visit(injectedFile, ContainerUtil.emptyList()); + visitor.visit(injectedFile, ContainerUtil.emptyList()); } } } @@ -162,7 +159,7 @@ class InjectedSelfElementInfo extends SmartPointerElementInfo { @Override public boolean pointsToTheSameElementAs(@NotNull SmartPointerElementInfo other) { if (getClass() != other.getClass()) return false; - if (!(((InjectedSelfElementInfo)other).myHostContext).equals(myHostContext)) return false; + if (!((InjectedSelfElementInfo)other).myHostContext.equals(myHostContext)) return false; SmartPointerElementInfo myElementInfo = ((SmartPsiElementPointerImpl)myInjectedFileRangeInHostFile).getElementInfo(); SmartPointerElementInfo oElementInfo = ((SmartPsiElementPointerImpl)((InjectedSelfElementInfo)other).myInjectedFileRangeInHostFile).getElementInfo(); return myElementInfo.pointsToTheSameElementAs(oElementInfo); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/ClassMapCachingNulls.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/ClassMapCachingNulls.java index 58885b674497..5169de8e0a89 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/ClassMapCachingNulls.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/ClassMapCachingNulls.java @@ -27,13 +27,13 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -public class ClassMapCachingNulls { +class ClassMapCachingNulls { private final Map myBackingMap; private final T[] myEmptyArray; private final List myOrderingArray; private final Map myMap = ContainerUtil.newConcurrentMap(); - public ClassMapCachingNulls(@NotNull Map backingMap, T[] emptyArray, @NotNull List orderingArray) { + ClassMapCachingNulls(@NotNull Map backingMap, T[] emptyArray, @NotNull List orderingArray) { myBackingMap = backingMap; myEmptyArray = emptyArray; myOrderingArray = orderingArray; @@ -103,7 +103,7 @@ public class ClassMapCachingNulls { return value; } - public Map getBackingMap() { + Map getBackingMap() { return myBackingMap; } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedFileViewProvider.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedFileViewProvider.java index b4d75db7cdd9..971b910dbc00 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedFileViewProvider.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedFileViewProvider.java @@ -43,12 +43,7 @@ public class InjectedFileViewProvider extends SingleRootFileViewProvider impleme private Project myProject; private final Object myLock = new Object(); private final DocumentWindowImpl myDocumentWindow; - private static final ThreadLocal disabledTemporarily = new ThreadLocal(){ - @Override - protected Boolean initialValue() { - return false; - } - }; + private static final ThreadLocal disabledTemporarily = ThreadLocal.withInitial(() -> false); private boolean myPatchingLeaves; InjectedFileViewProvider(@NotNull PsiManager psiManager, @@ -98,13 +93,10 @@ public class InjectedFileViewProvider extends SingleRootFileViewProvider impleme PsiElement hostElementCopy = hostPsiFileCopy.getViewProvider().findElementAt(firstTextRange.getStartOffset(), hostFileLanguage); assert hostElementCopy != null; final Ref provider = new Ref<>(); - PsiLanguageInjectionHost.InjectedPsiVisitor visitor = new PsiLanguageInjectionHost.InjectedPsiVisitor() { - @Override - public void visit(@NotNull PsiFile injectedPsi, @NotNull List places) { - Document document = documentManager.getCachedDocument(injectedPsi); - if (document instanceof DocumentWindowImpl && oldDocumentWindow.areRangesEqual((DocumentWindowImpl)document)) { - provider.set(injectedPsi.getViewProvider()); - } + PsiLanguageInjectionHost.InjectedPsiVisitor visitor = (injectedPsi, places) -> { + Document document = documentManager.getCachedDocument(injectedPsi); + if (document instanceof DocumentWindowImpl && oldDocumentWindow.areRangesEqual((DocumentWindowImpl)document)) { + provider.set(injectedPsi.getViewProvider()); } }; for (PsiElement current = hostElementCopy; current != null && current != hostPsiFileCopy; current = current.getParent()) { @@ -179,7 +171,7 @@ public class InjectedFileViewProvider extends SingleRootFileViewProvider impleme return isEventSystemEnabled(); } - public void performNonPhysically(Runnable runnable) { + void performNonPhysically(Runnable runnable) { synchronized (myLock) { disabledTemporarily.set(true); try { diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java index 135030e86cbb..1a56b0a31b80 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java @@ -64,6 +64,7 @@ import java.util.*; */ public class InjectedLanguageManagerImpl extends InjectedLanguageManager implements Disposable { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl"); + @SuppressWarnings("RedundantStringConstructorCall") static final Object ourInjectionPsiLock = new String("injectionPsiLock"); private final Project myProject; private final DumbService myDumbService; diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java index 42da2e201538..23d34bc2e419 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java @@ -56,10 +56,7 @@ public class InjectedLanguageUtil { // meaning: injected file text is probably incorrect public static void forceInjectionOnElement(@NotNull PsiElement host) { - enumerate(host, new PsiLanguageInjectionHost.InjectedPsiVisitor() { - @Override - public void visit(@NotNull PsiFile injectedPsi, @NotNull List places) { - } + enumerate(host, (injectedPsi, places) -> { }); } @@ -408,18 +405,15 @@ public class InjectedLanguageUtil { final int hostOffset, @NotNull final PsiDocumentManager documentManager) { final Ref out = new Ref<>(); - enumerate(element, hostFile, true, new PsiLanguageInjectionHost.InjectedPsiVisitor() { - @Override - public void visit(@NotNull PsiFile injectedPsi, @NotNull List places) { - for (PsiLanguageInjectionHost.Shred place : places) { - TextRange hostRange = place.getHost().getTextRange(); - if (hostRange.cutOut(place.getRangeInsideHost()).grown(1).contains(hostOffset)) { - DocumentWindowImpl document = (DocumentWindowImpl)documentManager.getCachedDocument(injectedPsi); - if (document == null) return; - int injectedOffset = document.hostToInjected(hostOffset); - PsiElement injElement = injectedPsi.findElementAt(injectedOffset); - out.set(injElement == null ? injectedPsi : injElement); - } + enumerate(element, hostFile, true, (injectedPsi, places) -> { + for (PsiLanguageInjectionHost.Shred place : places) { + TextRange hostRange = place.getHost().getTextRange(); + if (hostRange.cutOut(place.getRangeInsideHost()).grown(1).contains(hostOffset)) { + DocumentWindowImpl document = (DocumentWindowImpl)documentManager.getCachedDocument(injectedPsi); + if (document == null) return; + int injectedOffset = document.hostToInjected(hostOffset); + PsiElement injElement = injectedPsi.findElementAt(injectedOffset); + out.set(injElement == null ? injectedPsi : injElement); } } }); @@ -439,7 +433,7 @@ public class InjectedLanguageUtil { return injected; } - public static void clearCachedInjectedFragmentsForFile(@NotNull PsiFile file) { + static void clearCachedInjectedFragmentsForFile(@NotNull PsiFile file) { file.putUserData(INJECTED_DOCS_KEY, null); } @@ -527,12 +521,7 @@ public class InjectedLanguageUtil { public static boolean hasInjections(@NotNull PsiLanguageInjectionHost host) { if (!host.isPhysical()) return false; final Ref result = Ref.create(false); - enumerate(host, new PsiLanguageInjectionHost.InjectedPsiVisitor() { - @Override - public void visit(@NotNull final PsiFile injectedPsi, @NotNull final List places) { - result.set(true); - } - }); + enumerate(host, (injectedPsi, places) -> result.set(true)); return result.get().booleanValue(); } @@ -602,12 +591,7 @@ public class InjectedLanguageUtil { @Nullable public static PsiElement findElementInInjected(@NotNull PsiLanguageInjectionHost injectionHost, final int offset) { final Ref ref = Ref.create(); - enumerate(injectionHost, new PsiLanguageInjectionHost.InjectedPsiVisitor() { - @Override - public void visit(@NotNull final PsiFile injectedPsi, @NotNull final List places) { - ref.set(injectedPsi.findElementAt(offset - getInjectedStart(places))); - } - }); + enumerate(injectionHost, (injectedPsi, places) -> ref.set(injectedPsi.findElementAt(offset - getInjectedStart(places)))); return ref.get(); } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java index f4d30117effd..fe1e9f5949c7 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java @@ -496,7 +496,6 @@ public class MultiHostRegistrarImpl implements MultiHostRegistrar, ModificationT Place shreds, VirtualFileWindow virtualFile, Project project) { - List, TextRange>> tokens = new ArrayList<>(10); SyntaxHighlighter syntaxHighlighter = SyntaxHighlighterFactory.getSyntaxHighlighter(language, project, (VirtualFile)virtualFile); Lexer lexer = syntaxHighlighter.getHighlightingLexer(); lexer.start(outChars); @@ -508,6 +507,7 @@ public class MultiHostRegistrarImpl implements MultiHostRegistrar, ModificationT int suffixLength = 0; TextRange rangeInsideHost = null; int shredEndOffset = -1; + List, TextRange>> tokens = new ArrayList<>(10); for (IElementType tokenType = lexer.getTokenType(); tokenType != null; lexer.advance(), tokenType = lexer.getTokenType()) { TextRange range = new ProperTextRange(lexer.getTokenStart(), lexer.getTokenEnd()); while (range != null && !range.isEmpty()) { diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/ShredImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/ShredImpl.java index 4fbce72f315f..eaf9560627c1 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/ShredImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/ShredImpl.java @@ -59,7 +59,7 @@ class ShredImpl implements PsiLanguageInjectionHost.Shred { } @NotNull - public SmartPsiElementPointer getSmartPointer() { + SmartPsiElementPointer getSmartPointer() { return hostElementPointer; } @@ -88,13 +88,14 @@ class ShredImpl implements PsiLanguageInjectionHost.Shred { } @Override - @SuppressWarnings({"HardCodedStringLiteral"}) + @SuppressWarnings("HardCodedStringLiteral") public String toString() { PsiLanguageInjectionHost host = getHost(); Segment hostRange = getHostRangeMarker(); return "Shred " + (host == null ? null : host.getTextRange()) + ": " + host + " In host range: " + (hostRange != null ? "(" + hostRange.getStartOffset() + "," + hostRange.getEndOffset() + ");" : "invalid;") + - " PSI range: " + this.range; + " PSI range: " + + range; } @Override