From e046e5c6a59d45ad17ba1178a0422a2a026667e4 Mon Sep 17 00:00:00 2001 From: Maksim Zuev Date: Wed, 2 Oct 2024 17:36:00 +0000 Subject: [PATCH] [debugger] CodeFragmentFactory can produce PsiCodeFragment * broaden code fragment type to be able to implement non-java evaluators Merge-request: IJ-MR-145790 Merged-by: Maksim Zuev GitOrigin-RevId: 096badbd7e76b2c8065867349e0839452b683ab4 --- .../engine/JavaDebuggerCodeFragmentFactory.kt | 42 +++++++++++++++++++ .../engine/JavaDebuggerEvaluator.java | 2 +- .../CodeFragmentFactoryContextWrapper.java | 10 ++--- .../DefaultCodeFragmentFactory.java | 11 +++-- .../expression/EvaluatorBuilderImpl.java | 4 +- .../debugger/ui/breakpoints/Breakpoint.java | 2 +- .../ui/impl/watch/CompilingEvaluator.java | 2 +- .../ui/impl/watch/EvaluationDescriptor.java | 2 +- .../ui/tree/render/CachedEvaluator.java | 3 +- .../debugger/JavaDebuggerEditorsProvider.java | 17 +------- .../evaluation/CodeFragmentFactory.java | 25 ++++++++++- .../debugger/GroovyCodeFragmentFactory.java | 8 ++-- ...MultiplatformCodeFragmentCompletionTest.kt | 2 +- .../evaluate/KotlinK1CodeFragmentFactory.kt | 10 ++--- .../evaluate/KotlinK2CodeFragmentFactory.kt | 10 ++--- 15 files changed, 100 insertions(+), 50 deletions(-) create mode 100644 java/debugger/impl/src/com/intellij/debugger/engine/JavaDebuggerCodeFragmentFactory.kt diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebuggerCodeFragmentFactory.kt b/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebuggerCodeFragmentFactory.kt new file mode 100644 index 000000000000..9aaa50f9c4bc --- /dev/null +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebuggerCodeFragmentFactory.kt @@ -0,0 +1,42 @@ +// 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.debugger.engine + +import com.intellij.debugger.engine.evaluation.CodeFragmentFactory +import com.intellij.debugger.engine.evaluation.TextWithImports +import com.intellij.debugger.impl.DebuggerUtilsImpl +import com.intellij.openapi.project.Project +import com.intellij.psi.* +import com.intellij.psi.util.PsiTreeUtil + +abstract class JavaDebuggerCodeFragmentFactory : CodeFragmentFactory() { + final override fun createPsiCodeFragment(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment? { + val codeFragment = createPsiCodeFragmentImpl(item, context, project) ?: return null + if (context != null) { + setThisType(context, codeFragment) + } + return codeFragment + } + + + final override fun createPresentationPsiCodeFragment(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment? { + val codeFragment = createPresentationPsiCodeFragmentImpl(item, context, project) ?: return null + if (context != null) { + setThisType(context, codeFragment) + } + return codeFragment + } + + protected abstract fun createPresentationPsiCodeFragmentImpl(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment? + protected abstract fun createPsiCodeFragmentImpl(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment? + + private fun setThisType(context: PsiElement, codeFragment: JavaCodeFragment) { + var contextType = context.getUserData(DebuggerUtilsImpl.PSI_TYPE_KEY) + if (contextType == null) { + val contextClass = PsiTreeUtil.getNonStrictParentOfType(context, PsiClass::class.java) + if (contextClass != null) { + contextType = JavaPsiFacade.getElementFactory(codeFragment.getProject()).createType(contextClass) + } + } + codeFragment.setThisType(contextType) + } +} diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebuggerEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebuggerEvaluator.java index a5e8d06fbc16..cee36c66c2c3 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebuggerEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebuggerEvaluator.java @@ -148,7 +148,7 @@ public class JavaDebuggerEvaluator extends XDebuggerEvaluator implements XDebugg catch (UnsupportedExpressionException ex) { PsiElement context = PositionUtil.getContextElement(debuggerContext); ExpressionEvaluator eval = CompilingEvaluatorImpl.create(project, context, e -> - factory.createCodeFragment(text.get(), context, project)); + factory.createPsiCodeFragment(text.get(), context, project)); if (eval != null) { return eval; } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactoryContextWrapper.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactoryContextWrapper.java index 2c2f4a66ad56..233516713a0e 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactoryContextWrapper.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactoryContextWrapper.java @@ -28,13 +28,13 @@ public class CodeFragmentFactoryContextWrapper extends CodeFragmentFactory { } @Override - public JavaCodeFragment createCodeFragment(TextWithImports item, PsiElement context, Project project) { - return prepareResolveScope(myDelegate.createCodeFragment(item, wrapContext(project, context), project)); + public PsiCodeFragment createPsiCodeFragment(TextWithImports item, PsiElement context, Project project) { + return prepareResolveScope(myDelegate.createPsiCodeFragment(item, wrapContext(project, context), project)); } @Override - public JavaCodeFragment createPresentationCodeFragment(TextWithImports item, PsiElement context, Project project) { - return prepareResolveScope(myDelegate.createPresentationCodeFragment(item, wrapContext(project, context), project)); + public PsiCodeFragment createPresentationPsiCodeFragment(TextWithImports item, PsiElement context, Project project) { + return prepareResolveScope(myDelegate.createPresentationPsiCodeFragment(item, wrapContext(project, context), project)); } @Override @@ -53,7 +53,7 @@ public class CodeFragmentFactoryContextWrapper extends CodeFragmentFactory { return myDelegate.getEvaluatorBuilder(); } - private static JavaCodeFragment prepareResolveScope(JavaCodeFragment codeFragment) { + private static PsiCodeFragment prepareResolveScope(PsiCodeFragment codeFragment) { GlobalSearchScope originalResolveScope = codeFragment.getResolveScope(); codeFragment.forceResolveScope(new DelegatingGlobalSearchScope(GlobalSearchScope.allScope(codeFragment.getProject())) { final Comparator myScopeComparator = Comparator.comparing(originalResolveScope::contains).thenComparing(super::compare); diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java index 5f27ca6d53c3..d5ebd9719f16 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java @@ -6,6 +6,7 @@ import com.intellij.codeInsight.completion.JavaCompletionUtil; import com.intellij.debugger.DebuggerManagerEx; import com.intellij.debugger.JavaDebuggerBundle; import com.intellij.debugger.codeinsight.RuntimeTypeEvaluator; +import com.intellij.debugger.engine.JavaDebuggerCodeFragmentFactory; import com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilder; import com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilderImpl; import com.intellij.debugger.impl.DebuggerContextImpl; @@ -27,7 +28,7 @@ import java.util.concurrent.atomic.AtomicReference; /** * @author Eugene Zhuravlev */ -public class DefaultCodeFragmentFactory extends CodeFragmentFactory { +public class DefaultCodeFragmentFactory extends JavaDebuggerCodeFragmentFactory { private static final class SingletonHolder { public static final DefaultCodeFragmentFactory ourInstance = new DefaultCodeFragmentFactory(); } @@ -37,12 +38,14 @@ public class DefaultCodeFragmentFactory extends CodeFragmentFactory { } @Override - public JavaCodeFragment createPresentationCodeFragment(final TextWithImports item, final PsiElement context, final Project project) { - return createCodeFragment(item, context, project); + protected JavaCodeFragment createPresentationPsiCodeFragmentImpl(final @NotNull TextWithImports item, + final PsiElement context, + final @NotNull Project project) { + return createPsiCodeFragment(item, context, project); } @Override - public JavaCodeFragment createCodeFragment(TextWithImports item, PsiElement context, final Project project) { + public JavaCodeFragment createPsiCodeFragmentImpl(TextWithImports item, PsiElement context, final @NotNull Project project) { final JavaCodeFragmentFactory factory = JavaCodeFragmentFactory.getInstance(project); final String text = item.getText(); diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java index 73d0755f4845..7daf3289d893 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java @@ -60,7 +60,7 @@ public final class EvaluatorBuilderImpl implements EvaluatorBuilder { @Nullable final SourcePosition position, @NotNull Project project) throws EvaluateException { CodeFragmentFactory factory = DebuggerUtilsEx.findAppropriateCodeFragmentFactory(text, contextElement); - PsiCodeFragment codeFragment = factory.createCodeFragment(text, contextElement, project); + PsiCodeFragment codeFragment = factory.createPsiCodeFragment(text, contextElement, project); if (codeFragment == null) { throw EvaluateExceptionUtil.createEvaluateException(JavaDebuggerBundle.message("evaluation.error.invalid.expression", text.getText())); } @@ -1516,7 +1516,7 @@ public final class EvaluatorBuilderImpl implements EvaluatorBuilder { private Evaluator buildFromJavaCode(String code, String imports, @NotNull PsiElement context) { TextWithImportsImpl text = new TextWithImportsImpl(CodeFragmentKind.CODE_BLOCK, code, imports, JavaFileType.INSTANCE); - JavaCodeFragment codeFragment = DefaultCodeFragmentFactory.getInstance().createCodeFragment(text, context, context.getProject()); + JavaCodeFragment codeFragment = DefaultCodeFragmentFactory.getInstance().createPsiCodeFragment(text, context, context.getProject()); return accept(codeFragment); } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java index debb0ad456ed..28ad1c85c822 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java @@ -555,7 +555,7 @@ public abstract class Breakpoint

implements } private static PsiCodeFragment createCodeFragment(Project project, TextWithImports text, PsiElement context) { - return DebuggerUtilsEx.findAppropriateCodeFragmentFactory(text, context).createCodeFragment(text, context, project); + return DebuggerUtilsEx.findAppropriateCodeFragmentFactory(text, context).createPsiCodeFragment(text, context, project); } protected String calculateEventClass(EvaluationContextImpl context, LocatableEvent event) throws EvaluateException { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/CompilingEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/CompilingEvaluator.java index 7fe1e7b2e5c7..ed0a9722d765 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/CompilingEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/CompilingEvaluator.java @@ -70,7 +70,7 @@ public abstract class CompilingEvaluator implements ExpressionEvaluator { TextWithImports callCode = getCallCode(); PsiElement copyContext = myData.getAnchor(); CodeFragmentFactory factory = DebuggerUtilsEx.findAppropriateCodeFragmentFactory(callCode, copyContext); - return factory.getEvaluatorBuilder().build(factory.createCodeFragment(callCode, copyContext, myProject), + return factory.getEvaluatorBuilder().build(factory.createPsiCodeFragment(callCode, copyContext, myProject), // can not use evaluation position here, it does not match classes then SourcePosition.createFromElement(copyContext)); } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/EvaluationDescriptor.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/EvaluationDescriptor.java index 33de6e9abcc3..18b3f855a307 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/EvaluationDescriptor.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/EvaluationDescriptor.java @@ -54,7 +54,7 @@ public abstract class EvaluationDescriptor extends ValueDescriptorImpl { public PsiCodeFragment createCodeFragment(PsiElement context) { TextWithImports text = getEvaluationText(); - return DebuggerUtilsEx.findAppropriateCodeFragmentFactory(text, context).createCodeFragment(text, context, myProject); + return DebuggerUtilsEx.findAppropriateCodeFragmentFactory(text, context).createPsiCodeFragment(text, context, myProject); } @ApiStatus.Experimental diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/CachedEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/CachedEvaluator.java index 596e64efc0b2..6adcbcf058dd 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/CachedEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/CachedEvaluator.java @@ -54,8 +54,7 @@ public abstract class CachedEvaluator { throw EvaluateExceptionUtil.createEvaluateException(JavaDebuggerBundle.message("evaluation.error.cannot.find.source", className)); } CodeFragmentFactory factory = DebuggerUtilsEx.findAppropriateCodeFragmentFactory(myReferenceExpression, context); - JavaCodeFragment codeFragment = factory.createCodeFragment(myReferenceExpression, overrideContext(context), project); - codeFragment.setThisType(psiClassAndType.second); + PsiCodeFragment codeFragment = factory.createPsiCodeFragment(myReferenceExpression, overrideContext(context), project); DebuggerUtils.checkSyntax(codeFragment); cache.myPsiChildrenExpression = codeFragment instanceof PsiExpressionCodeFragment ? ((PsiExpressionCodeFragment)codeFragment).getExpression() : null; diff --git a/java/debugger/impl/src/org/jetbrains/java/debugger/JavaDebuggerEditorsProvider.java b/java/debugger/impl/src/org/jetbrains/java/debugger/JavaDebuggerEditorsProvider.java index cefb49a674a9..964b0158def0 100644 --- a/java/debugger/impl/src/org/jetbrains/java/debugger/JavaDebuggerEditorsProvider.java +++ b/java/debugger/impl/src/org/jetbrains/java/debugger/JavaDebuggerEditorsProvider.java @@ -5,7 +5,6 @@ import com.intellij.debugger.engine.evaluation.CodeFragmentFactory; import com.intellij.debugger.engine.evaluation.TextWithImports; import com.intellij.debugger.engine.evaluation.TextWithImportsImpl; import com.intellij.debugger.impl.DebuggerUtilsEx; -import com.intellij.debugger.impl.DebuggerUtilsImpl; import com.intellij.ide.highlighter.JavaFileType; import com.intellij.lang.Language; import com.intellij.openapi.editor.Document; @@ -13,7 +12,6 @@ import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.xdebugger.XExpression; import com.intellij.xdebugger.XSourcePosition; @@ -74,20 +72,7 @@ public class JavaDebuggerEditorsProvider extends XDebuggerEditorsProviderBase { TextWithImports text = TextWithImportsImpl.fromXExpression(expression); if (text != null) { CodeFragmentFactory factory = DebuggerUtilsEx.findAppropriateCodeFragmentFactory(text, context); - JavaCodeFragment codeFragment = factory.createPresentationCodeFragment(text, context, project); - - if (context != null) { - PsiType contextType = context.getUserData(DebuggerUtilsImpl.PSI_TYPE_KEY); - if (contextType == null) { - PsiClass contextClass = PsiTreeUtil.getNonStrictParentOfType(context, PsiClass.class); - if (contextClass != null) { - contextType = JavaPsiFacade.getElementFactory(codeFragment.getProject()).createType(contextClass); - } - } - codeFragment.setThisType(contextType); - } - - return codeFragment; + return factory.createPresentationPsiCodeFragment(text, context, project); } else { return super.createExpressionCodeFragment(project, expression, context, isPhysical); diff --git a/java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactory.java b/java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactory.java index a26df1682ce8..4070925908fa 100644 --- a/java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactory.java +++ b/java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/CodeFragmentFactory.java @@ -6,6 +6,7 @@ import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.project.Project; import com.intellij.psi.JavaCodeFragment; +import com.intellij.psi.PsiCodeFragment; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -17,9 +18,29 @@ public abstract class CodeFragmentFactory { public static final ExtensionPointName EXTENSION_POINT_NAME = ExtensionPointName.create("com.intellij.debugger.codeFragmentFactory"); - public abstract JavaCodeFragment createCodeFragment(TextWithImports item, PsiElement context, Project project); + /** + * @deprecated Use {@link CodeFragmentFactory#createPsiCodeFragment} instead + */ + @Deprecated + public JavaCodeFragment createCodeFragment(TextWithImports item, PsiElement context, Project project) { + throw new AbstractMethodError(); + } - public abstract JavaCodeFragment createPresentationCodeFragment(TextWithImports item, PsiElement context, Project project); + /** + * @deprecated Use {@link CodeFragmentFactory#createPresentationPsiCodeFragment(TextWithImports, PsiElement, Project)} instead + */ + @Deprecated + public JavaCodeFragment createPresentationCodeFragment(TextWithImports item, PsiElement context, Project project) { + throw new AbstractMethodError(); + } + + public PsiCodeFragment createPsiCodeFragment(TextWithImports item, PsiElement context, Project project) { + return createCodeFragment(item, context, project); + } + + public PsiCodeFragment createPresentationPsiCodeFragment(TextWithImports item, PsiElement context, Project project) { + return createPresentationCodeFragment(item, context, project); + } public abstract boolean isContextAccepted(PsiElement contextElement); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/debugger/GroovyCodeFragmentFactory.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/debugger/GroovyCodeFragmentFactory.java index 350dd36322c8..05fcf1b6fdfa 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/debugger/GroovyCodeFragmentFactory.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/debugger/GroovyCodeFragmentFactory.java @@ -1,7 +1,7 @@ // Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.groovy.debugger; -import com.intellij.debugger.engine.evaluation.CodeFragmentFactory; +import com.intellij.debugger.engine.JavaDebuggerCodeFragmentFactory; import com.intellij.debugger.engine.evaluation.TextWithImports; import com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilder; import com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilderImpl; @@ -39,7 +39,7 @@ import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import java.util.*; import java.util.regex.Pattern; -public class GroovyCodeFragmentFactory extends CodeFragmentFactory { +public class GroovyCodeFragmentFactory extends JavaDebuggerCodeFragmentFactory { private static final String EVAL_NAME = "_JETGROOVY_EVAL_"; private static final String IMPORTS = "___$$IMPORTS$$___"; private static final String TEXT = "___$$TEXT$$___"; @@ -54,7 +54,7 @@ public class GroovyCodeFragmentFactory extends CodeFragmentFactory { } @Override - public JavaCodeFragment createCodeFragment(TextWithImports textWithImports, PsiElement context, Project project) { + public JavaCodeFragment createPsiCodeFragmentImpl(TextWithImports textWithImports, PsiElement context, @NotNull Project project) { final Pair, GroovyFile> pair = externalParameters(textWithImports.getText(), context); GroovyFile toEval = pair.second; final Map parameters = pair.first; @@ -290,7 +290,7 @@ public class GroovyCodeFragmentFactory extends CodeFragmentFactory { } @Override - public JavaCodeFragment createPresentationCodeFragment(TextWithImports item, PsiElement context, Project project) { + protected JavaCodeFragment createPresentationPsiCodeFragmentImpl(@NotNull TextWithImports item, PsiElement context, @NotNull Project project) { GroovyCodeFragment result = new GroovyCodeFragment(project, item.getText()); result.setContext(context); return result; diff --git a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/debugger/evaluate/AbstractK2MultiplatformCodeFragmentCompletionTest.kt b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/debugger/evaluate/AbstractK2MultiplatformCodeFragmentCompletionTest.kt index ccbc3544b820..efc323f2cf07 100644 --- a/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/debugger/evaluate/AbstractK2MultiplatformCodeFragmentCompletionTest.kt +++ b/plugins/kotlin/fir/tests/test/org/jetbrains/kotlin/idea/fir/debugger/evaluate/AbstractK2MultiplatformCodeFragmentCompletionTest.kt @@ -23,7 +23,7 @@ abstract class AbstractK2MultiplatformCodeFragmentCompletionTest : AbstractK2Cod val elementAt = file?.findElementAt(caretOffset) val fragmentText = File("$testPath.fragment").readText() val textWithImports = TextWithImportsImpl(CodeFragmentKind.CODE_BLOCK, fragmentText) - val file = KotlinK2CodeFragmentFactory().createCodeFragment(textWithImports, elementAt, project) + val file = KotlinK2CodeFragmentFactory().createPsiCodeFragment(textWithImports, elementAt, project)!! configureFromExistingVirtualFile(file.virtualFile!!) } diff --git a/plugins/kotlin/jvm-debugger/evaluation/k1/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinK1CodeFragmentFactory.kt b/plugins/kotlin/jvm-debugger/evaluation/k1/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinK1CodeFragmentFactory.kt index 509f3740c926..4d57f5f72e16 100644 --- a/plugins/kotlin/jvm-debugger/evaluation/k1/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinK1CodeFragmentFactory.kt +++ b/plugins/kotlin/jvm-debugger/evaluation/k1/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinK1CodeFragmentFactory.kt @@ -3,7 +3,7 @@ package org.jetbrains.kotlin.idea.debugger.evaluate import com.intellij.debugger.DebuggerManagerEx -import com.intellij.debugger.engine.evaluation.CodeFragmentFactory +import com.intellij.debugger.engine.JavaDebuggerCodeFragmentFactory import com.intellij.debugger.engine.evaluation.TextWithImports import com.intellij.debugger.engine.events.DebuggerCommandImpl import com.intellij.debugger.impl.DebuggerContextImpl @@ -39,8 +39,8 @@ import org.jetbrains.kotlin.psi.psiUtil.quoteIfNeeded import org.jetbrains.kotlin.types.KotlinType import java.util.concurrent.atomic.AtomicReference -class KotlinK1CodeFragmentFactory : CodeFragmentFactory() { - override fun createCodeFragment(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment { +class KotlinK1CodeFragmentFactory : JavaDebuggerCodeFragmentFactory() { + override fun createPsiCodeFragmentImpl(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment { val contextElement = CodeFragmentContextTuner.getInstance().tuneContextElement(context) val codeFragment = KtBlockCodeFragment(project, "fragment.kt", item.text, initImports(item.imports), contextElement) @@ -199,8 +199,8 @@ class KotlinK1CodeFragmentFactory : CodeFragmentFactory() { return import } - override fun createPresentationCodeFragment(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment { - val kotlinCodeFragment = createCodeFragment(item, context, project) + override fun createPresentationPsiCodeFragmentImpl(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment? { + val kotlinCodeFragment = createPsiCodeFragment(item, context, project) ?: return null if (PsiTreeUtil.hasErrorElements(kotlinCodeFragment) && kotlinCodeFragment is KtCodeFragment) { val javaExpression = try { PsiElementFactory.getInstance(project).createExpressionFromText(item.text, context) diff --git a/plugins/kotlin/jvm-debugger/evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinK2CodeFragmentFactory.kt b/plugins/kotlin/jvm-debugger/evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinK2CodeFragmentFactory.kt index d0f04985a8e5..1c3a36d1a426 100644 --- a/plugins/kotlin/jvm-debugger/evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinK2CodeFragmentFactory.kt +++ b/plugins/kotlin/jvm-debugger/evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinK2CodeFragmentFactory.kt @@ -1,7 +1,7 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.debugger.evaluate -import com.intellij.debugger.engine.evaluation.CodeFragmentFactory +import com.intellij.debugger.engine.JavaDebuggerCodeFragmentFactory import com.intellij.debugger.engine.evaluation.TextWithImports import com.intellij.openapi.project.Project import com.intellij.psi.JavaCodeFragment @@ -18,9 +18,9 @@ import org.jetbrains.kotlin.idea.debugger.core.CodeFragmentContextTuner import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.psi.KtBlockCodeFragment -class KotlinK2CodeFragmentFactory : CodeFragmentFactory() { +class KotlinK2CodeFragmentFactory : JavaDebuggerCodeFragmentFactory() { @OptIn(KaImplementationDetail::class) - override fun createCodeFragment(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment { + override fun createPsiCodeFragmentImpl(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment { val contextElement = CodeFragmentContextTuner.getInstance().tuneContextElement(context) return KtBlockCodeFragment(project, "fragment.kt", item.text, item.imports, contextElement).apply { @@ -38,8 +38,8 @@ class KotlinK2CodeFragmentFactory : CodeFragmentFactory() { } } - override fun createPresentationCodeFragment(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment { - return createCodeFragment(item, context, project) + override fun createPresentationPsiCodeFragmentImpl(item: TextWithImports, context: PsiElement?, project: Project): JavaCodeFragment? { + return createPsiCodeFragment(item, context, project) } override fun isContextAccepted(contextElement: PsiElement?): Boolean {