From 9a8cd1e52d9d2c170a49cb454cf7afc1632f1911 Mon Sep 17 00:00:00 2001 From: Andrey Zaytsev Date: Thu, 27 Nov 2025 13:04:07 +0100 Subject: [PATCH] follow up on IJ-CR-183248 GitOrigin-RevId: 12861b2510d3b76e30b83d7bb60250ffb9f78535 --- .../lang/regexp/RegExpParsingTest.java | 2 +- .../smartPointers/SmartPointerManagerEx.java | 10 ++- .../SmartPointerManagerImpl.java | 2 +- .../mock/MockSmartPointerManager.java | 63 ++++++++++++++++++- 4 files changed, 73 insertions(+), 4 deletions(-) diff --git a/RegExpSupport/test/org/intellij/lang/regexp/RegExpParsingTest.java b/RegExpSupport/test/org/intellij/lang/regexp/RegExpParsingTest.java index e73c4d6ebb58..d00fd2a2f949 100644 --- a/RegExpSupport/test/org/intellij/lang/regexp/RegExpParsingTest.java +++ b/RegExpSupport/test/org/intellij/lang/regexp/RegExpParsingTest.java @@ -24,7 +24,7 @@ public class RegExpParsingTest extends ParsingTestCase { @Override protected void setUp() throws Exception { super.setUp(); - project.registerService(SmartPointerManager.class, new MockSmartPointerManager()); + project.registerService(SmartPointerManager.class, new MockSmartPointerManager(project)); } @Override diff --git a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerManagerEx.java b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerManagerEx.java index 7f403a93c1b9..bbc92fc1eee4 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerManagerEx.java +++ b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerManagerEx.java @@ -1,6 +1,7 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.psi.impl.smartPointers; +import com.intellij.openapi.Disposable; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.impl.FrozenDocument; @@ -16,8 +17,15 @@ import org.jetbrains.annotations.Nullable; import java.util.List; +/** + * All implementers of {@link SmartPointerManager} should extend this class. + * One should not downcast {@link SmartPointerManager} to {@link SmartPointerManagerImpl}. + * Even though these methods are solely used by smart pointer implementations, + * this abstract class is necessary for Analyzer to be able to redirect them to the right SmartPointerManagerImpl. + * The lifetimes of smart pointers and the actual SmartPointerManagerImpl may differ. + */ @ApiStatus.Internal -public abstract class SmartPointerManagerEx extends SmartPointerManager { +public abstract class SmartPointerManagerEx extends SmartPointerManager implements Disposable { public abstract void fastenBelts(@NotNull VirtualFile file); public abstract @NotNull SmartPsiElementPointer createSmartPsiElementPointer(@NotNull E element, diff --git a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerManagerImpl.java b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerManagerImpl.java index 7804bfa229e0..08f523978719 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerManagerImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerManagerImpl.java @@ -30,7 +30,7 @@ import java.util.concurrent.ConcurrentMap; import static com.intellij.reference.SoftReference.dereference; -public final class SmartPointerManagerImpl extends SmartPointerManagerEx implements Disposable { +public final class SmartPointerManagerImpl extends SmartPointerManagerEx { private static final Logger LOG = Logger.getInstance(SmartPointerManagerImpl.class); private final Project myProject; private final PsiDocumentManagerEx myPsiDocManager; diff --git a/platform/testFramework/src/com/intellij/mock/MockSmartPointerManager.java b/platform/testFramework/src/com/intellij/mock/MockSmartPointerManager.java index eb70fd37bb8f..0e8636911a2d 100644 --- a/platform/testFramework/src/com/intellij/mock/MockSmartPointerManager.java +++ b/platform/testFramework/src/com/intellij/mock/MockSmartPointerManager.java @@ -1,16 +1,30 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.mock; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.event.DocumentEvent; +import com.intellij.openapi.editor.impl.FrozenDocument; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Segment; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; +import com.intellij.psi.impl.PsiDocumentManagerEx; +import com.intellij.psi.impl.smartPointers.SmartPointerManagerEx; +import com.intellij.psi.impl.smartPointers.SmartPointerTracker; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class MockSmartPointerManager extends SmartPointerManager { +import java.util.List; + +public class MockSmartPointerManager extends SmartPointerManagerEx { + private final Project myProject; + + public MockSmartPointerManager(@NotNull Project project) { + myProject = project; + } + @Override public @NotNull SmartPsiFileRange createSmartPsiFileRangePointer(@NotNull PsiFile psiFile, @NotNull TextRange range) { throw new IncorrectOperationException(); @@ -65,4 +79,51 @@ public class MockSmartPointerManager extends SmartPointerManager { public void removePointer(@NotNull SmartPsiElementPointer pointer) { } + + @Override + public void fastenBelts(@NotNull VirtualFile file) { + + } + + @Override + public @NotNull SmartPsiElementPointer createSmartPsiElementPointer(@NotNull E element, + PsiFile containingFile, + boolean forInjected) { + return createSmartPsiElementPointer(element); + } + + @Override + public @NotNull SmartPsiFileRange createSmartPsiFileRangePointer(@NotNull PsiFile file, @NotNull TextRange range, boolean forInjected) { + throw new UnsupportedOperationException("createSmartPsiFileRangePointer not implemented in mock"); + } + + @Override + public @Nullable SmartPointerTracker getTracker(@NotNull VirtualFile file) { + return null; + } + + @Override + public void updatePointers(@NotNull Document document, @NotNull FrozenDocument frozen, @NotNull List events) { + + } + + @Override + public void updatePointerTargetsAfterReparse(@NotNull VirtualFile file) { + + } + + @Override + public @NotNull Project getProject() { + return myProject; + } + + @Override + public @NotNull PsiDocumentManagerEx getPsiDocumentManager() { + return (PsiDocumentManagerEx)PsiDocumentManager.getInstance(myProject); + } + + @Override + public void dispose() { + + } }