diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java index 6fd8e6ffcf45..92d7f9dc3c87 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.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. @@ -45,6 +45,7 @@ import com.sun.jdi.event.Event; import org.jdom.Attribute; import org.jdom.Element; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.regex.PatternSyntaxException; @@ -373,6 +374,18 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils { public abstract CompletionEditor createEditor(Project project, PsiElement context, @NonNls String recentsId); + @Nullable + public static CodeFragmentFactory getEffectiveCodeFragmentFactory(final PsiElement psiContext) { + final CodeFragmentFactory factory = ApplicationManager.getApplication().runReadAction(new Computable() { + public CodeFragmentFactory compute() { + final List codeFragmentFactories = getCodeFragmentFactories(psiContext); + // the list always contains at least DefaultCodeFragmentFactory + return codeFragmentFactories.get(0); + } + }); + return factory != null? new CodeFragmentFactoryContextWrapper(factory) : null; + } + private static class SigReader { final String buffer; int pos = 0; @@ -564,4 +577,6 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils { return DebuggerBundle.message("status.thread.undefined"); } } + + } diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/EditorTextProvider.java b/java/debugger/impl/src/com/intellij/debugger/impl/EditorTextProvider.java index 849b62592ec5..1667b745a010 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/EditorTextProvider.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/EditorTextProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 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. @@ -17,6 +17,8 @@ package com.intellij.debugger.impl; import com.intellij.debugger.engine.evaluation.TextWithImports; import com.intellij.lang.LanguageExtension; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.Nullable; @@ -29,4 +31,7 @@ public interface EditorTextProvider { @Nullable TextWithImports getEditorText(PsiElement elementAtCaret); + + @Nullable + Pair findExpression(PsiElement elementAtCaret, boolean allowMethodCalls); } diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/JavaEditorTextProviderImpl.java b/java/debugger/impl/src/com/intellij/debugger/impl/JavaEditorTextProviderImpl.java index a4fa15454efe..e97b4bf7b8bb 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/JavaEditorTextProviderImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/JavaEditorTextProviderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 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. @@ -15,16 +15,23 @@ */ package com.intellij.debugger.impl; +import com.intellij.debugger.engine.DebuggerUtils; import com.intellij.debugger.engine.evaluation.CodeFragmentKind; import com.intellij.debugger.engine.evaluation.TextWithImports; import com.intellij.debugger.engine.evaluation.TextWithImportsImpl; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; +import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.Nullable; /** * @author Maxim.Medvedev */ public class JavaEditorTextProviderImpl implements EditorTextProvider { + private static final Logger LOG = Logger.getInstance(JavaEditorTextProviderImpl.class); + @Override public TextWithImports getEditorText(PsiElement elementAtCaret) { String result = null; @@ -68,4 +75,55 @@ public class JavaEditorTextProviderImpl implements EditorTextProvider { } return null; } + + @Nullable + public Pair findExpression(PsiElement element, boolean allowMethodCalls) { + if (!(element instanceof PsiIdentifier || element instanceof PsiKeyword)) { + return null; + } + + PsiElement expression = null; + PsiElement parent = element.getParent(); + if (parent instanceof PsiVariable) { + expression = element; + } + else if (parent instanceof PsiReferenceExpression) { + final PsiElement pparent = parent.getParent(); + if (pparent instanceof PsiCallExpression) { + parent = pparent; + } + if (allowMethodCalls || !DebuggerUtils.hasSideEffects(parent)) { + expression = parent; + } + } + else if (parent instanceof PsiThisExpression) { + expression = parent; + } + + if (expression != null) { + try { + PsiElement context = element; + if(parent instanceof PsiParameter) { + try { + context = ((PsiMethod)((PsiParameter)parent).getDeclarationScope()).getBody(); + } + catch (Throwable ignored) { + } + } + else { + while(context != null && !(context instanceof PsiStatement) && !(context instanceof PsiClass)) { + context = context.getParent(); + } + } + TextRange textRange = expression.getTextRange(); + PsiElement psiExpression = JavaPsiFacade.getInstance(expression.getProject()).getElementFactory().createExpressionFromText(expression.getText(), context); + return Pair.create(psiExpression, textRange); + } + catch (IncorrectOperationException e) { + LOG.debug(e); + } + } + return null; + } + } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/ValueHint.java b/java/debugger/impl/src/com/intellij/debugger/ui/ValueHint.java index ec53a137c4e3..31b309a0dd5f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/ValueHint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/ValueHint.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,7 +20,6 @@ import com.intellij.debugger.DebuggerBundle; import com.intellij.debugger.DebuggerInvocationUtil; import com.intellij.debugger.DebuggerManagerEx; import com.intellij.debugger.engine.DebugProcessImpl; -import com.intellij.debugger.engine.DebuggerUtils; import com.intellij.debugger.engine.JVMName; import com.intellij.debugger.engine.JVMNameUtil; import com.intellij.debugger.engine.evaluation.*; @@ -29,6 +28,8 @@ import com.intellij.debugger.engine.evaluation.expression.ExpressionEvaluator; import com.intellij.debugger.engine.events.DebuggerContextCommandImpl; import com.intellij.debugger.impl.DebuggerContextImpl; import com.intellij.debugger.impl.DebuggerSession; +import com.intellij.debugger.impl.DebuggerUtilsEx; +import com.intellij.debugger.impl.EditorTextProvider; import com.intellij.debugger.ui.impl.DebuggerTreeRenderer; import com.intellij.debugger.ui.impl.InspectDebuggerTree; import com.intellij.debugger.ui.impl.watch.WatchItemDescriptor; @@ -39,6 +40,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.*; import com.intellij.psi.*; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.ui.SimpleColoredText; import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.IncorrectOperationException; @@ -60,16 +62,16 @@ import java.awt.*; */ public class ValueHint extends AbstractValueHint { private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.ValueHint"); - private PsiExpression myCurrentExpression = null; + private PsiElement myCurrentExpression = null; private Value myValueToShow = null; - private ValueHint(Project project, Editor editor, Point point, ValueHintType type, final PsiExpression selectedExpression, final TextRange textRange) { + private ValueHint(Project project, Editor editor, Point point, ValueHintType type, final PsiElement selectedExpression, final TextRange textRange) { super(project, editor, point, type, textRange); myCurrentExpression = selectedExpression; } public static ValueHint createValueHint(Project project, Editor editor, Point point, ValueHintType type) { - Trinity trinity = getSelectedExpression(project, editor, point, type); + Trinity trinity = getSelectedExpression(project, editor, point, type); final ValueHint hint = new ValueHint(project, editor, point, type, trinity.getFirst(), trinity.getSecond()); hint.myValueToShow = trinity.getThird(); return hint; @@ -79,6 +81,22 @@ public class ValueHint extends AbstractValueHint { return myCurrentExpression != null; } + + @Nullable + private ExpressionEvaluator getExpressionEvaluator(DebuggerContextImpl debuggerContext) throws EvaluateException { + if (myCurrentExpression instanceof PsiExpression) { + return EvaluatorBuilderImpl.getInstance().build(myCurrentExpression, debuggerContext.getSourcePosition()); + } + + CodeFragmentFactory factory = DebuggerUtilsEx.getEffectiveCodeFragmentFactory(myCurrentExpression); + TextWithImportsImpl textWithImports = new TextWithImportsImpl(CodeFragmentKind.EXPRESSION, myCurrentExpression.getText()); + if (factory == null) return null; + JavaCodeFragment codeFragment = factory.createCodeFragment(textWithImports, myCurrentExpression.getContext(), getProject()); + codeFragment.forceResolveScope(GlobalSearchScope.allScope(getProject())); + return factory.getEvaluatorBuilder().build(codeFragment, debuggerContext.getSourcePosition()); + } + + protected void evaluateAndShowHint() { final DebuggerContextImpl debuggerContext = DebuggerManagerEx.getInstanceEx(getProject()).getContext(); @@ -86,7 +104,9 @@ public class ValueHint extends AbstractValueHint { if(debuggerSession == null || !debuggerSession.isPaused()) return; try { - final ExpressionEvaluator evaluator = EvaluatorBuilderImpl.getInstance().build(myCurrentExpression, debuggerContext.getSourcePosition()); + + final ExpressionEvaluator evaluator = getExpressionEvaluator(debuggerContext); + if (evaluator == null) return; debuggerContext.getDebugProcess().getManagerThread().schedule(new DebuggerContextCommandImpl(debuggerContext) { public Priority getPriority() { @@ -201,57 +221,16 @@ public class ValueHint extends AbstractValueHint { } @Nullable - private static Pair findExpression(PsiElement element, boolean allowMethodCalls) { - if (!(element instanceof PsiIdentifier || element instanceof PsiKeyword)) { - return null; - } - - PsiElement expression = null; - PsiElement parent = element.getParent(); - if (parent instanceof PsiVariable) { - expression = element; - } - else if (parent instanceof PsiReferenceExpression) { - final PsiElement pparent = parent.getParent(); - if (pparent instanceof PsiMethodCallExpression) { - parent = pparent; - } - if (allowMethodCalls || !DebuggerUtils.hasSideEffects(parent)) { - expression = parent; - } - } - else if (parent instanceof PsiThisExpression) { - expression = parent; - } - - if (expression != null) { - try { - PsiElement context = element; - if(parent instanceof PsiParameter) { - try { - context = ((PsiMethod)((PsiParameter)parent).getDeclarationScope()).getBody(); - } - catch (Throwable ignored) { - } - } - else { - while(context != null && !(context instanceof PsiStatement) && !(context instanceof PsiClass)) { - context = context.getParent(); - } - } - TextRange textRange = expression.getTextRange(); - PsiExpression psiExpression = JavaPsiFacade.getInstance(expression.getProject()).getElementFactory().createExpressionFromText(expression.getText(), context); - return Pair.create(psiExpression, textRange); - } - catch (IncorrectOperationException e) { - LOG.debug(e); - } + private static Pair findExpression(PsiElement element, boolean allowMethodCalls) { + final EditorTextProvider textProvider = EditorTextProvider.EP.forLanguage(element.getLanguage()); + if (textProvider != null) { + return textProvider.findExpression(element, allowMethodCalls); } return null; } - private static Trinity getSelectedExpression(final Project project, final Editor editor, final Point point, final ValueHintType type) { - final Ref selectedExpression = Ref.create(null); + private static Trinity getSelectedExpression(final Project project, final Editor editor, final Point point, final ValueHintType type) { + final Ref selectedExpression = Ref.create(null); final Ref currentRange = Ref.create(null); final Ref preCalculatedValue = Ref.create(null); @@ -273,7 +252,7 @@ public class ValueHint extends AbstractValueHint { try { String text = editor.getSelectionModel().getSelectedText(); if(text != null && ctx != null) { - selectedExpression.set(JavaPsiFacade.getInstance(project).getElementFactory().createExpressionFromText(text, ctx)); + selectedExpression.set(JVMElementFactories.getFactory(ctx.getLanguage(), project).createExpressionFromText(text, ctx)); currentRange.set(new TextRange(editor.getSelectionModel().getSelectionStart(), editor.getSelectionModel().getSelectionEnd())); } } catch (IncorrectOperationException e) { @@ -286,7 +265,7 @@ public class ValueHint extends AbstractValueHint { if (elementAtCursor == null) { return; } - Pair pair = findExpression(elementAtCursor, type == ValueHintType.MOUSE_CLICK_HINT || type == ValueHintType.MOUSE_ALT_OVER_HINT); + Pair pair = findExpression(elementAtCursor, type == ValueHintType.MOUSE_CLICK_HINT || type == ValueHintType.MOUSE_ALT_OVER_HINT); if (pair == null) { if (type == ValueHintType.MOUSE_OVER_HINT) { final DebuggerSession debuggerSession = DebuggerManagerEx.getInstanceEx(project).getContext().getDebuggerSession(); @@ -295,7 +274,7 @@ public class ValueHint extends AbstractValueHint { if (lastExecuted != null) { final Method method = lastExecuted.getFirst(); if (method != null) { - final Pair expressionPair = findExpression(elementAtCursor, true); + final Pair expressionPair = findExpression(elementAtCursor, true); if (expressionPair != null && expressionPair.getFirst() instanceof PsiMethodCallExpression) { final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)expressionPair.getFirst(); final PsiMethod psiMethod = methodCallExpression.resolveMethod(); @@ -311,7 +290,7 @@ public class ValueHint extends AbstractValueHint { } } } - } + } } } } 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 4166e359ddf2..e09c17c979e5 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 @@ -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. @@ -22,15 +22,12 @@ import com.intellij.debugger.EvaluatingComputable; import com.intellij.debugger.engine.ContextUtil; import com.intellij.debugger.engine.StackFrameContext; import com.intellij.debugger.engine.evaluation.*; -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; -import com.intellij.openapi.util.Computable; import com.intellij.psi.PsiCodeFragment; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiExpression; @@ -40,8 +37,6 @@ import com.sun.jdi.Value; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.List; - /** * @author lex */ @@ -74,14 +69,7 @@ public abstract class EvaluationDescriptor extends ValueDescriptorImpl{ if (myCodeFragmentFactory != null) { return myCodeFragmentFactory; } - final CodeFragmentFactory factory = ApplicationManager.getApplication().runReadAction(new Computable() { - public CodeFragmentFactory compute() { - final List codeFragmentFactories = DebuggerUtilsEx.getCodeFragmentFactories(psiContext); - // the list always contains at least DefaultCodeFragmentFactory - return codeFragmentFactories.get(0); - } - }); - return factory != null? new CodeFragmentFactoryContextWrapper(factory) : null; + return DebuggerUtilsEx.getEffectiveCodeFragmentFactory(psiContext); } protected abstract EvaluationContextImpl getEvaluationContext (EvaluationContextImpl evaluationContext); diff --git a/java/java-psi-api/src/com/intellij/psi/JVMElementFactory.java b/java/java-psi-api/src/com/intellij/psi/JVMElementFactory.java index 5c2ba6caf81c..6f88ab5afde7 100644 --- a/java/java-psi-api/src/com/intellij/psi/JVMElementFactory.java +++ b/java/java-psi-api/src/com/intellij/psi/JVMElementFactory.java @@ -124,4 +124,6 @@ public interface JVMElementFactory { @NotNull PsiAnnotation createAnnotationFromText(@NotNull @NonNls String annotationText, @Nullable PsiElement context) throws IncorrectOperationException; + + PsiElement createExpressionFromText(String text, PsiElement ctx) throws IncorrectOperationException; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/debugger/GroovyEditorTextProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/debugger/GroovyEditorTextProvider.java index 61711b9abf05..5a75fba824ea 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/debugger/GroovyEditorTextProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/debugger/GroovyEditorTextProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 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. @@ -19,15 +19,18 @@ import com.intellij.debugger.engine.evaluation.CodeFragmentKind; import com.intellij.debugger.engine.evaluation.TextWithImports; import com.intellij.debugger.engine.evaluation.TextWithImportsImpl; import com.intellij.debugger.impl.EditorTextProvider; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiEnumConstant; -import com.intellij.psi.PsiVariable; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrThisReferenceExpression; +import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; /** * @author Maxim.Medvedev @@ -36,7 +39,7 @@ public class GroovyEditorTextProvider implements EditorTextProvider { @Override public TextWithImports getEditorText(PsiElement elementAtCaret) { String result = ""; - PsiElement element = findExpression(elementAtCaret); + PsiElement element = findExpressionInner(elementAtCaret, false); if (element != null) { if (element instanceof GrReferenceExpression) { final GrReferenceExpression reference = (GrReferenceExpression)element; @@ -59,18 +62,31 @@ public class GroovyEditorTextProvider implements EditorTextProvider { } @Nullable - private static PsiElement findExpression(PsiElement element) { + private static PsiElement findExpressionInner(PsiElement element, boolean allowMethodCalls) { PsiElement parent = element.getParent(); if (parent instanceof GrVariable && element == ((GrVariable)parent).getNameIdentifierGroovy()) { return element; } - if (parent instanceof GrReferenceExpression) { - if (parent.getParent() instanceof GrCall) return parent.getParent(); - return parent; + else if (parent instanceof GrReferenceExpression) { + final PsiElement pparent = parent.getParent(); + if (pparent instanceof GrCall) { + parent = pparent; + } + if (allowMethodCalls || !GroovyRefactoringUtil.hasSideEffect((GroovyPsiElement)parent)) { + return parent; + } } + if (parent instanceof GrThisReferenceExpression) { return parent; } return null; } + + @Override + public Pair findExpression(PsiElement element, boolean allowMethodCalls) { + PsiElement expression = findExpressionInner(element, allowMethodCalls); + if (expression == null) return null; + return new Pair(expression, expression.getTextRange()); + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementFactoryImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementFactoryImpl.java index 78d2a2b96c01..9fcfea253076 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementFactoryImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementFactoryImpl.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. @@ -143,8 +143,11 @@ public class GroovyPsiElementFactoryImpl extends GroovyPsiElementFactory { public GrExpression createExpressionFromText(String text, PsiElement context) { GroovyFileImpl file = (GroovyFileImpl)createGroovyFile(text, false, context); - assert file.getTopStatements()[0] instanceof GrExpression; - return (GrExpression) file.getTopStatements()[0]; + GrTopStatement[] topStatements = file.getTopStatements(); + if (topStatements.length == 0 || !(topStatements[0] instanceof GrExpression)) { + throw new IncorrectOperationException("incorrect expression = '" + text + "'"); + } + return (GrExpression) topStatements[0]; } public GrVariableDeclaration createVariableDeclaration(@Nullable String[] modifiers, diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringUtil.java index 0afc3e5e01ff..f5d5069615f4 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyRefactoringUtil.java @@ -615,7 +615,7 @@ public abstract class GroovyRefactoringUtil { return GroovyPsiElementFactory.getInstance(project).createExpressionFromText(argText.toString()); } - public static boolean hasSideEffect(@NotNull GrStatement statement) { + public static boolean hasSideEffect(@NotNull GroovyPsiElement statement) { final Ref hasSideEffect = new Ref(false); statement.accept(new GroovyRecursiveElementVisitor() { @Override @@ -633,6 +633,8 @@ public abstract class GroovyRefactoringUtil { hasSideEffect.set(true); } + + @Override public void visitElement(GroovyPsiElement element) { if (hasSideEffect.get()) return;