diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/SetValueAction.java b/java/debugger/impl/src/com/intellij/debugger/actions/SetValueAction.java index 288275b3a16b..9fd1825e5620 100644 --- a/java/debugger/impl/src/com/intellij/debugger/actions/SetValueAction.java +++ b/java/debugger/impl/src/com/intellij/debugger/actions/SetValueAction.java @@ -407,7 +407,7 @@ public class SetValueAction extends DebuggerAction { protected Object evaluate(final EvaluationContextImpl evaluationContext) throws EvaluateException { ExpressionEvaluator evaluator = DebuggerInvocationUtil.commitAndRunReadAction(evaluationContext.getProject(), new com.intellij.debugger.EvaluatingComputable() { public ExpressionEvaluator compute() throws EvaluateException { - return EvaluatorBuilderImpl.getInstance().build(text, ContextUtil.getContextElement(evaluationContext), ContextUtil.getSourcePosition(evaluationContext)); + return EvaluatorBuilderImpl.build(text, ContextUtil.getContextElement(evaluationContext), ContextUtil.getSourcePosition(evaluationContext)); } }); 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 ac522ffde739..2afe7c61bd74 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 @@ -17,6 +17,8 @@ package com.intellij.debugger.engine.evaluation; import com.intellij.debugger.DebuggerManagerEx; import com.intellij.debugger.engine.DebugProcessImpl; +import com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilder; +import com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilderImpl; import com.intellij.debugger.ui.impl.watch.ValueDescriptorImpl; import com.intellij.xdebugger.impl.ui.tree.ValueMarkup; import com.intellij.openapi.fileTypes.LanguageFileType; @@ -66,8 +68,11 @@ public class CodeFragmentFactoryContextWrapper implements CodeFragmentFactory{ public LanguageFileType getFileType() { return myDelegate.getFileType(); } - - + + @Override + public EvaluatorBuilder getEvaluatorBuilder() { + return myDelegate.getEvaluatorBuilder(); + } private PsiElement wrapContext(Project project, final PsiElement originalContext) { if (project.isDefault()) return originalContext; 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 c07bf964eb5d..899a4e287fc0 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 @@ -20,6 +20,8 @@ import com.intellij.codeInsight.completion.CompletionService; import com.intellij.codeInsight.completion.JavaCompletionUtil; import com.intellij.debugger.DebuggerManagerEx; import com.intellij.debugger.codeinsight.RuntimeTypeEvaluator; +import com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilder; +import com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilderImpl; import com.intellij.debugger.impl.DebuggerContextImpl; import com.intellij.debugger.impl.DebuggerSession; import com.intellij.debugger.ui.DebuggerExpressionComboBox; @@ -123,4 +125,9 @@ public class DefaultCodeFragmentFactory implements CodeFragmentFactory { public LanguageFileType getFileType() { return StdFileTypes.JAVA; } + + @Override + public EvaluatorBuilder getEvaluatorBuilder() { + return EvaluatorBuilderImpl.getInstance(); + } } 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 001ee6c9875f..31a0ca3ed0a7 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 @@ -58,21 +58,24 @@ public class EvaluatorBuilderImpl implements EvaluatorBuilder { return ourInstance; } - public ExpressionEvaluator build(final TextWithImports text, final PsiElement contextElement, final SourcePosition position) throws EvaluateException { + public static ExpressionEvaluator build(final TextWithImports text, final PsiElement contextElement, final SourcePosition position) throws EvaluateException { if (contextElement == null) { throw EvaluateExceptionUtil.CANNOT_FIND_SOURCE_CLASS; } final Project project = contextElement.getProject(); - PsiCodeFragment codeFragment = new CodeFragmentFactoryContextWrapper(DebuggerEditorImpl.findAppropriateFactory(text, contextElement)).createCodeFragment(text, contextElement, project); + CodeFragmentFactory factory = DebuggerEditorImpl.findAppropriateFactory(text, contextElement); + PsiCodeFragment codeFragment = new CodeFragmentFactoryContextWrapper(factory).createCodeFragment(text, contextElement, project); if(codeFragment == null) { throw EvaluateExceptionUtil.createEvaluateException(DebuggerBundle.message("evaluation.error.invalid.expression", text.getText())); } codeFragment.forceResolveScope(GlobalSearchScope.allScope(project)); DebuggerUtils.checkSyntax(codeFragment); - return build(codeFragment, position); + EvaluatorBuilder evaluatorBuilder = factory.getEvaluatorBuilder(); + + return evaluatorBuilder.build(codeFragment, position); } public ExpressionEvaluator build(final PsiElement codeFragment, final SourcePosition position) throws EvaluateException { 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 4369e60f450f..8d7da3302157 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 @@ -217,7 +217,7 @@ public abstract class Breakpoint extends FilteredRequestor implements ClassPrepa try { ExpressionEvaluator evaluator = DebuggerInvocationUtil.commitAndRunReadAction(getProject(), new EvaluatingComputable() { public ExpressionEvaluator compute() throws EvaluateException { - return EvaluatorBuilderImpl.getInstance().build(expressionToEvaluate, ContextUtil.getContextElement(context), ContextUtil.getSourcePosition(context)); + return EvaluatorBuilderImpl.build(expressionToEvaluate, ContextUtil.getContextElement(context), ContextUtil.getSourcePosition(context)); } }); final String result = DebuggerUtils.getValueAsString(context, evaluator.evaluate(context)); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/FilteredRequestor.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/FilteredRequestor.java index 85691779054a..5a4018083cf7 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/FilteredRequestor.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/FilteredRequestor.java @@ -180,7 +180,7 @@ public abstract class FilteredRequestor implements LocatableEventRequestor, JDOM if (contextPsiElement == null) { contextPsiElement = getEvaluationElement(); // as a last resort } - return EvaluatorBuilderImpl.getInstance().build(getCondition(), contextPsiElement, contextSourcePosition); + return EvaluatorBuilderImpl.build(getCondition(), contextPsiElement, contextSourcePosition); } }); final Value value = evaluator.evaluate(context); @@ -218,4 +218,4 @@ public abstract class FilteredRequestor implements LocatableEventRequestor, JDOM public Project getProject() { return myProject; } -} \ No newline at end of file +} diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java index 766e233a7b6b..4cea2454b898 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java @@ -510,7 +510,7 @@ public class FrameVariablesTree extends DebuggerTree { if (!isConstant) { final TextWithImportsImpl textWithImports = new TextWithImportsImpl(reference); try { - final ExpressionEvaluator evaluator = EvaluatorBuilderImpl.getInstance().build(textWithImports, reference, myPosition); + final ExpressionEvaluator evaluator = EvaluatorBuilderImpl.build(textWithImports, reference, myPosition); evaluator.evaluate(myEvalContext); //collect only expressions that do not produce any exceptions on evaluation myExpressions.add(textWithImports); @@ -561,4 +561,4 @@ public class FrameVariablesTree extends DebuggerTree { // Do not step in to local and anonymous classes... } } -} \ No newline at end of file +} 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 0b4adff6370a..4166e359ddf2 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 @@ -26,6 +26,7 @@ import com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilderImpl; import com.intellij.debugger.engine.evaluation.expression.ExpressionEvaluator; import com.intellij.debugger.engine.evaluation.expression.Modifier; import com.intellij.debugger.impl.DebuggerUtilsEx; +import com.intellij.debugger.impl.PositionUtil; import com.intellij.debugger.jdi.StackFrameProxyImpl; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; @@ -87,13 +88,15 @@ public abstract class EvaluationDescriptor extends ValueDescriptorImpl{ protected abstract PsiCodeFragment getEvaluationCode(StackFrameContext context) throws EvaluateException; - public final Value calcValue(EvaluationContextImpl evaluationContext) throws EvaluateException { + public final Value calcValue(final EvaluationContextImpl evaluationContext) throws EvaluateException { try { final EvaluationContextImpl thisEvaluationContext = getEvaluationContext(evaluationContext); final ExpressionEvaluator evaluator = DebuggerInvocationUtil.commitAndRunReadAction(myProject, new EvaluatingComputable() { public ExpressionEvaluator compute() throws EvaluateException { - return EvaluatorBuilderImpl.getInstance().build(getEvaluationCode(thisEvaluationContext), ContextUtil.getSourcePosition(thisEvaluationContext)); + final PsiElement psiContext = PositionUtil.getContextElement(evaluationContext); + return getEffectiveCodeFragmentFactory(psiContext).getEvaluatorBuilder().build(getEvaluationCode(thisEvaluationContext), + ContextUtil.getSourcePosition(thisEvaluationContext)); } }); 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 5192461a8de2..93e3d605d568 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 @@ -77,7 +77,7 @@ public abstract class CachedEvaluator { codeFragment.setThisType(contextType); DebuggerUtils.checkSyntax(codeFragment); cache.myPsiChildrenExpression = ((PsiExpressionCodeFragment)codeFragment).getExpression(); - cache.myEvaluator = ((DebuggerUtilsEx)DebuggerUtils.getInstance()).getEvaluatorBuilder().build(cache.myPsiChildrenExpression, null); + cache.myEvaluator = myDefaultFragmentFactory.getEvaluatorBuilder().build(cache.myPsiChildrenExpression, null); } catch (EvaluateException e) { cache.myException = e; 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 3927c242b057..e820d8748ed2 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 @@ -15,6 +15,7 @@ */ package com.intellij.debugger.engine.evaluation; +import com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilder; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.project.Project; @@ -31,4 +32,11 @@ public interface CodeFragmentFactory { boolean isContextAccepted(PsiElement contextElement); LanguageFileType getFileType(); + + /** + * In case if createCodeFragment returns java code use + * com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilderImpl#getInstance() + * @return builder, which can evaluate expression for your code fragment + */ + EvaluatorBuilder getEvaluatorBuilder(); } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilder.java b/java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilder.java similarity index 84% rename from java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilder.java rename to java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilder.java index 08842070772b..66bb45a67de9 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilder.java +++ b/java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,10 @@ import com.intellij.debugger.engine.evaluation.EvaluateException; import com.intellij.debugger.engine.evaluation.TextWithImports; import com.intellij.psi.PsiElement; +/** + * Main interface to extend evaluation for different JVM languages. + * @see com.intellij.debugger.engine.evaluation.CodeFragmentFactory + */ public interface EvaluatorBuilder { - ExpressionEvaluator build(TextWithImports text, PsiElement contextElement, final SourcePosition position) throws EvaluateException; - ExpressionEvaluator build(PsiElement codeFragment, final SourcePosition position) throws EvaluateException; } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/ExpressionEvaluator.java b/java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/expression/ExpressionEvaluator.java similarity index 100% rename from java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/ExpressionEvaluator.java rename to java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/expression/ExpressionEvaluator.java diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/Modifier.java b/java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/expression/Modifier.java similarity index 99% rename from java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/Modifier.java rename to java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/expression/Modifier.java index 0e4f14258f3e..809feacd8755 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/Modifier.java +++ b/java/debugger/openapi/src/com/intellij/debugger/engine/evaluation/expression/Modifier.java @@ -43,4 +43,4 @@ public interface Modifier { Type getExpectedType() throws ClassNotLoadedException, EvaluateException; NodeDescriptor getInspectItem(Project project); -} \ No newline at end of file +} diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/NodeDescriptor.java b/java/debugger/openapi/src/com/intellij/debugger/ui/tree/NodeDescriptor.java similarity index 100% rename from java/debugger/impl/src/com/intellij/debugger/ui/tree/NodeDescriptor.java rename to java/debugger/openapi/src/com/intellij/debugger/ui/tree/NodeDescriptor.java 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 bcb183eeec9c..899235bb7a4f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/debugger/GroovyCodeFragmentFactory.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/debugger/GroovyCodeFragmentFactory.java @@ -17,6 +17,8 @@ package org.jetbrains.plugins.groovy.debugger; import com.intellij.debugger.engine.evaluation.CodeFragmentFactory; import com.intellij.debugger.engine.evaluation.TextWithImports; +import com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilder; +import com.intellij.debugger.engine.evaluation.expression.EvaluatorBuilderImpl; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; @@ -262,4 +264,9 @@ public class GroovyCodeFragmentFactory implements CodeFragmentFactory { public LanguageFileType getFileType() { return GroovyFileType.GROOVY_FILE_TYPE; } + + @Override + public EvaluatorBuilder getEvaluatorBuilder() { + return EvaluatorBuilderImpl.getInstance(); + } }