From 2e00fd16c3415dcb51d50ccfbcab16078dcb2d69 Mon Sep 17 00:00:00 2001 From: Egor Ushakov Date: Fri, 26 Apr 2019 19:17:31 +0300 Subject: [PATCH] IDEA-211761 Smart step into fail if source code does not match the bytecode GitOrigin-RevId: d3d5d2b8ba4ce26f2e9288ebe3148ab30247eccd --- .../actions/JavaSmartStepIntoHandler.java | 129 +++++++++++++----- .../CreateLocalVarFromInstanceofAction.java | 5 - .../surroundWith/JavaWithCastSurrounder.java | 5 - .../impl/SurroundAutoCloseableAction.java | 5 - .../codeInsight/template/macro/MacroUtil.java | 7 +- .../macro/SuggestVariableNameMacro.java | 11 +- .../templates/CastVarPostfixTemplate.java | 5 - .../InstanceofExpressionPostfixTemplate.java | 5 - .../lang/java/actions/FieldExpression.kt | 2 - .../lang/java/actions/RangeExpression.kt | 2 - .../AbstractJavaInplaceIntroducer.java | 5 - .../IntroduceEmptyVariableHandler.java | 5 - .../codeInsight/template/Expression.java | 6 - .../template/impl/TextExpression.java | 5 - .../daemon/impl/quickfix/EmptyExpression.java | 5 - .../template/impl/ConstantNode.java | 5 - .../codeInsight/template/impl/EmptyNode.java | 5 - .../template/impl/SelectionNode.java | 4 - .../template/impl/TemplateState.java | 12 +- .../template/impl/VariableNode.java | 5 - .../rename/inplace/MyLookupExpression.java | 5 - .../StructuralSearchTemplateBuilder.java | 5 - .../EditorConfigTemplateConstantExpression.kt | 1 - ...EditorConfigTemplateSingletonExpression.kt | 1 - .../PyConvertLambdaToFunctionIntention.java | 5 - .../analysis/InsertRequiredAttributeFix.java | 5 - .../relaxNG/compact/psi/impl/RncNameImpl.java | 5 - 27 files changed, 105 insertions(+), 155 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/JavaSmartStepIntoHandler.java b/java/debugger/impl/src/com/intellij/debugger/actions/JavaSmartStepIntoHandler.java index 03a223ad2080..8fffd0fcc2ef 100644 --- a/java/debugger/impl/src/com/intellij/debugger/actions/JavaSmartStepIntoHandler.java +++ b/java/debugger/impl/src/com/intellij/debugger/actions/JavaSmartStepIntoHandler.java @@ -2,6 +2,7 @@ package com.intellij.debugger.actions; import com.intellij.debugger.SourcePosition; +import com.intellij.debugger.engine.DebugProcessImpl; import com.intellij.debugger.engine.DebuggerUtils; import com.intellij.debugger.engine.SuspendContextImpl; import com.intellij.debugger.engine.evaluation.EvaluateException; @@ -26,7 +27,10 @@ import com.intellij.psi.*; import com.intellij.util.DocumentUtil; import com.intellij.util.Range; import com.intellij.util.ThreeState; +import com.intellij.util.containers.ContainerUtil; import com.sun.jdi.Location; +import com.sun.jdi.Method; +import com.sun.jdi.ReferenceType; import one.util.streamex.StreamEx; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -338,42 +342,67 @@ public class JavaSmartStepIntoHandler extends JvmSmartStepIntoHandler { if (!targets.isEmpty()) { StackFrameProxyImpl frameProxy = suspendContext != null ? suspendContext.getFrameProxy() : null; if (frameProxy != null) { + // sanity check try { - Location location = frameProxy.location(); - MethodBytecodeUtil.visit(location.method(), location.codeIndex(), new MethodVisitor(Opcodes.API_VERSION) { - boolean myLineMatch = false; - - @Override - public void visitLineNumber(int line, Label start) { - myLineMatch = lines.isWithin(line - 1); - } - - @Override - public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { - if (myLineMatch) { - Iterator iterator = targets.iterator(); - while (iterator.hasNext()) { - SmartStepTarget e = iterator.next(); - if (e instanceof MethodSmartStepTarget && - DebuggerUtilsEx.methodMatches(((MethodSmartStepTarget)e).getMethod(), - owner.replace("/", "."), name, desc, - suspendContext.getDebugProcess())) { - iterator.remove(); - MethodSmartStepTarget target = (MethodSmartStepTarget)e; - // fix ordinals - existingMethodCalls(targets, target.getMethod()) - .forEach(t -> { - int ordinal = t.getOrdinal(); - if (ordinal > target.getOrdinal()) { - t.setOrdinal(ordinal - 1); - } - }); - break; - } + List methodTargets = + StreamEx.of(targets) + .select(MethodSmartStepTarget.class) + .filter(target -> !target.needsBreakpointRequest()) + .toList(); + visitLinesMethods(frameProxy.location(), true, lines, (opcode, owner, name, desc, itf) -> { + if (name.startsWith("access$")) { // bridge method + ReferenceType cls = ContainerUtil.getFirstItem(frameProxy.getVirtualMachine().classesByName(owner)); + if (cls != null) { + Method method = DebuggerUtils.findMethod(cls, name, desc); + if (method != null) { + MethodBytecodeUtil.visit(method, new MethodVisitor(Opcodes.API_VERSION) { + @Override + public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { + if ("java/lang/AbstractMethodError".equals(owner)) { + return; + } + removeMatchingMethod(methodTargets, owner, name, desc, suspendContext.getDebugProcess()); + } + }, false); } } } - }, true); + else { + removeMatchingMethod(methodTargets, owner, name, desc, suspendContext.getDebugProcess()); + } + }); + if (!methodTargets.isEmpty()) { + return Collections.emptyList(); + } + } + catch (Exception e) { + LOG.error(e); + } + + // remove already executed + try { + visitLinesMethods(frameProxy.location(), false, lines, (opcode, owner, name, desc, itf) -> { + Iterator iterator = targets.iterator(); + while (iterator.hasNext()) { + SmartStepTarget e = iterator.next(); + if (e instanceof MethodSmartStepTarget && + DebuggerUtilsEx.methodMatches(((MethodSmartStepTarget)e).getMethod(), + owner.replace("/", "."), name, desc, + suspendContext.getDebugProcess())) { + iterator.remove(); + MethodSmartStepTarget target = (MethodSmartStepTarget)e; + // fix ordinals + existingMethodCalls(targets, target.getMethod()) + .forEach(t -> { + int ordinal = t.getOrdinal(); + if (ordinal > target.getOrdinal()) { + t.setOrdinal(ordinal - 1); + } + }); + break; + } + } + }); } catch (Exception e) { LOG.info(e); @@ -386,6 +415,42 @@ public class JavaSmartStepIntoHandler extends JvmSmartStepIntoHandler { return Collections.emptyList(); } + private static void removeMatchingMethod(List targets, + String owner, + String name, + String desc, + DebugProcessImpl process) { + Iterator iterator = targets.iterator(); + while (iterator.hasNext()) { + if (DebuggerUtilsEx.methodMatches(iterator.next().getMethod(), owner.replace("/", "."), name, desc, process)) { + iterator.remove(); + break; + } + } + } + + private interface MethodInsnVisitor { + void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf); + } + + private static void visitLinesMethods(Location location, boolean full, Range lines, MethodInsnVisitor visitor) { + MethodBytecodeUtil.visit(location.method(), full ? Long.MAX_VALUE : location.codeIndex(), new MethodVisitor(Opcodes.API_VERSION) { + boolean myLineMatch = false; + + @Override + public void visitLineNumber(int line, Label start) { + myLineMatch = lines.isWithin(line - 1); + } + + @Override + public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { + if (myLineMatch) { + visitor.visitMethodInsn(opcode, owner, name, desc, itf); + } + } + }, true); + } + private static StreamEx existingMethodCalls(List targets, PsiMethod psiMethod) { return StreamEx.of(targets) .select(MethodSmartStepTarget.class) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateLocalVarFromInstanceofAction.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateLocalVarFromInstanceofAction.java index 147e32010402..48c005a84ffe 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateLocalVarFromInstanceofAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateLocalVarFromInstanceofAction.java @@ -476,11 +476,6 @@ public class CreateLocalVarFromInstanceofAction extends BaseIntentionAction { public Result calculateQuickResult(ExpressionContext context) { return result; } - - @Override - public boolean requiresCommittedPSI() { - return false; - } }; template.addVariable("", expr, expr, true); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithCastSurrounder.java b/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithCastSurrounder.java index 61effc6cff24..22477afd58db 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithCastSurrounder.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/surroundWith/JavaWithCastSurrounder.java @@ -93,11 +93,6 @@ public class JavaWithCastSurrounder extends JavaExpressionSurrounder { public Result calculateQuickResult(ExpressionContext context) { return null; } - - @Override - public boolean requiresCommittedPSI() { - return false; - } }; template.addTextSegment("(("); template.addVariable(TYPE_TEMPLATE_VARIABLE, expr, expr, true); diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/SurroundAutoCloseableAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/SurroundAutoCloseableAction.java index 34d5e78d03b2..fc5c226aa8b7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/SurroundAutoCloseableAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/SurroundAutoCloseableAction.java @@ -278,11 +278,6 @@ public class SurroundAutoCloseableAction extends PsiElementBaseIntentionAction { return new TextResult(myNames[0]); } - @Override - public boolean requiresCommittedPSI() { - return false; - } - @Override public LookupElement[] calculateLookupItems(ExpressionContext context) { return Stream.of(myNames).map(LookupElementBuilder::create).toArray(LookupElement[]::new); diff --git a/java/java-impl/src/com/intellij/codeInsight/template/macro/MacroUtil.java b/java/java-impl/src/com/intellij/codeInsight/template/macro/MacroUtil.java index bb90648c24ae..771b67a4eabe 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/macro/MacroUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/macro/MacroUtil.java @@ -21,7 +21,6 @@ import com.intellij.codeInsight.template.PsiElementResult; import com.intellij.codeInsight.template.PsiTypeResult; import com.intellij.codeInsight.template.Result; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.scope.util.PsiScopesUtil; @@ -74,11 +73,7 @@ public class MacroUtil { String text = result.toString(); if (text == null) return null; PsiManager manager = PsiManager.getInstance(project); - PsiDocumentManager psiDocumentManager = PsiDocumentManager.getInstance(project); - Editor editor = context.getEditor(); - if(editor == null) return null; - psiDocumentManager.commitDocument(editor.getDocument()); - PsiFile file = psiDocumentManager.getPsiFile(editor.getDocument()); + PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(context.getEditor().getDocument()); //-1: Hack to deal with resolve algorithm PsiElement place = file != null ? file.findElementAt(context.getStartOffset()) : null; if (place != null) { diff --git a/java/java-impl/src/com/intellij/codeInsight/template/macro/SuggestVariableNameMacro.java b/java/java-impl/src/com/intellij/codeInsight/template/macro/SuggestVariableNameMacro.java index 38c98171141d..42b0bf021df8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/macro/SuggestVariableNameMacro.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/macro/SuggestVariableNameMacro.java @@ -19,7 +19,6 @@ import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.codeInsight.template.*; -import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; @@ -76,16 +75,11 @@ public class SuggestVariableNameMacro extends Macro { private static String[] getNames (final ExpressionContext context) { String[] names = ExpressionUtil.getNames(context); if (names == null || names.length == 0) return names; - PsiDocumentManager documentManager = PsiDocumentManager.getInstance(context.getProject()); - Editor editor = context.getEditor(); - if(editor == null) return null; - documentManager.commitDocument(editor.getDocument()); - PsiFile file = documentManager.getPsiFile(editor.getDocument()); - PsiElement e = file != null ? file.findElementAt(context.getStartOffset()) : null; + PsiFile file = PsiDocumentManager.getInstance(context.getProject()).getPsiFile(context.getEditor().getDocument()); + PsiElement e = file.findElementAt(context.getStartOffset()); PsiVariable[] vars = MacroUtil.getVariablesVisibleAt(e, ""); LinkedList namesList = new LinkedList<>(Arrays.asList(names)); for (PsiVariable var : vars) { - //noinspection ConstantConditions if (e.equals(var.getNameIdentifier())) continue; namesList.remove(var.getName()); } @@ -96,7 +90,6 @@ public class SuggestVariableNameMacro extends Macro { for (int j = 1; ; j++) { String name1 = name + j; for (PsiVariable var : vars) { - //noinspection ConstantConditions if (name1.equals(var.getName()) && !var.getNameIdentifier().equals(e)) continue index; } return new String[]{name1}; diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/CastVarPostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/CastVarPostfixTemplate.java index 9e8025cd9d03..c503f30fcede 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/CastVarPostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/CastVarPostfixTemplate.java @@ -76,11 +76,6 @@ public class CastVarPostfixTemplate extends StringBasedPostfixTemplate { public Result calculateQuickResult(ExpressionContext context) { return null; } - - @Override - public boolean requiresCommittedPSI() { - return false; - } }; template.addVariable(TYPE_VAR, expr, expr, true); diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/InstanceofExpressionPostfixTemplate.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/InstanceofExpressionPostfixTemplate.java index 5bc18f8f02a0..1275f597b78c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/InstanceofExpressionPostfixTemplate.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/templates/InstanceofExpressionPostfixTemplate.java @@ -110,11 +110,6 @@ public class InstanceofExpressionPostfixTemplate extends PostfixTemplate { public Result calculateQuickResult(ExpressionContext context) { return null; } - - @Override - public boolean requiresCommittedPSI() { - return false; - } }; template.addTextSegment(exprText); diff --git a/java/java-impl/src/com/intellij/lang/java/actions/FieldExpression.kt b/java/java-impl/src/com/intellij/lang/java/actions/FieldExpression.kt index 29d3a0a9b0e0..f60fef48fd27 100644 --- a/java/java-impl/src/com/intellij/lang/java/actions/FieldExpression.kt +++ b/java/java-impl/src/com/intellij/lang/java/actions/FieldExpression.kt @@ -34,8 +34,6 @@ internal class FieldExpression( override fun calculateQuickResult(context: ExpressionContext): Result? = calculateResult(context) - override fun requiresCommittedPSI(): Boolean = false - override fun calculateLookupItems(context: ExpressionContext): Array { val psiClass = myClassPointer.element ?: return LookupElement.EMPTY_ARRAY diff --git a/java/java-impl/src/com/intellij/lang/java/actions/RangeExpression.kt b/java/java-impl/src/com/intellij/lang/java/actions/RangeExpression.kt index 996b598b53c7..89e4119bd8b2 100644 --- a/java/java-impl/src/com/intellij/lang/java/actions/RangeExpression.kt +++ b/java/java-impl/src/com/intellij/lang/java/actions/RangeExpression.kt @@ -29,7 +29,5 @@ internal class RangeExpression( override fun calculateQuickResult(context: ExpressionContext): Result? = calculateResult(context) - override fun requiresCommittedPSI(): Boolean = false - override fun calculateLookupItems(context: ExpressionContext): Array = LookupElement.EMPTY_ARRAY } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java index 8a06f47cfe4a..6bca650d83d8 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/AbstractJavaInplaceIntroducer.java @@ -194,11 +194,6 @@ public abstract class AbstractJavaInplaceIntroducer extends AbstractInplaceIntro return new TextResult(defaultType); } - @Override - public boolean requiresCommittedPSI() { - return false; - } - @Override public LookupElement[] calculateLookupItems(ExpressionContext context) { final LookupElement[] elements = expression.calculateLookupItems(context); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceEmptyVariableHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceEmptyVariableHandler.java index ce18f5e75e7a..b994561b9848 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceEmptyVariableHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceEmptyVariableHandler.java @@ -124,11 +124,6 @@ public class IntroduceEmptyVariableHandler { return calculateResult(context); } - @Override - public boolean requiresCommittedPSI() { - return false; - } - @Nullable @Override public LookupElement[] calculateLookupItems(ExpressionContext context) { diff --git a/platform/lang-api/src/com/intellij/codeInsight/template/Expression.java b/platform/lang-api/src/com/intellij/codeInsight/template/Expression.java index e14fc1063ffb..2cf64cce2e1e 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/template/Expression.java +++ b/platform/lang-api/src/com/intellij/codeInsight/template/Expression.java @@ -32,10 +32,4 @@ public abstract class Expression { public String getAdvertisingText() { return null; } - - // true if calculateResult or calculateQuickResult require committed PSI for their calculation - // false otherwise - public boolean requiresCommittedPSI() { - return true; - } } diff --git a/platform/lang-api/src/com/intellij/codeInsight/template/impl/TextExpression.java b/platform/lang-api/src/com/intellij/codeInsight/template/impl/TextExpression.java index c80a695ad13a..6a09c465aaac 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/template/impl/TextExpression.java +++ b/platform/lang-api/src/com/intellij/codeInsight/template/impl/TextExpression.java @@ -37,11 +37,6 @@ public class TextExpression extends Expression { return calculateResult(expressionContext); } - @Override - public boolean requiresCommittedPSI() { - return false; - } - @Override public LookupElement[] calculateLookupItems(ExpressionContext expressionContext) { return LookupElement.EMPTY_ARRAY; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/EmptyExpression.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/EmptyExpression.java index d3ed5c500cac..57e0881da359 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/EmptyExpression.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/EmptyExpression.java @@ -38,11 +38,6 @@ public class EmptyExpression extends Expression { return null; } - @Override - public boolean requiresCommittedPSI() { - return false; - } - @Override public LookupElement[] calculateLookupItems(ExpressionContext context) { return null; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ConstantNode.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ConstantNode.java index 4448d0b6a1d0..6a9966f7ed3b 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ConstantNode.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ConstantNode.java @@ -39,11 +39,6 @@ public class ConstantNode extends Expression { return myValue; } - @Override - public boolean requiresCommittedPSI() { - return false; - } - @Override public LookupElement[] calculateLookupItems(ExpressionContext context) { return LookupElement.EMPTY_ARRAY; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/EmptyNode.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/EmptyNode.java index 1066c841d18e..95befd7418d3 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/EmptyNode.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/EmptyNode.java @@ -35,11 +35,6 @@ public class EmptyNode extends Expression { return null; } - @Override - public boolean requiresCommittedPSI() { - return false; - } - @Override public LookupElement[] calculateLookupItems(ExpressionContext context) { return null; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/SelectionNode.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/SelectionNode.java index 53c5b07c6302..040c4a9ff626 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/SelectionNode.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/SelectionNode.java @@ -45,8 +45,4 @@ public class SelectionNode extends Expression { return calculateQuickResult(context); } - @Override - public boolean requiresCommittedPSI() { - return false; - } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java index 86e0f6e66af2..88a7d1de6d58 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java @@ -832,13 +832,11 @@ public class TemplateState implements Disposable { int start = mySegments.getSegmentStart(segmentNumber); int end = mySegments.getSegmentEnd(segmentNumber); - if(expressionNode.requiresCommittedPSI()) { - PsiDocumentManager.getInstance(myProject).commitDocument(myDocument); - } + PsiDocumentManager.getInstance(myProject).commitDocument(myDocument); PsiFile psiFile = getPsiFile(); PsiElement element = psiFile != null ? psiFile.findElementAt(start) : null; - if (element != null && !element.isValid()) { - element = null; + if (element != null) { + PsiUtilCore.ensureValid(element); } ExpressionContext context = createExpressionContext(start); @@ -860,8 +858,8 @@ public class TemplateState implements Disposable { if (defaultValue != null && resultIsNullOrEmpty) { result = defaultValue.calculateResult(context); } - if (element != null && !element.isValid()) { - element = null; + if (element != null) { + PsiUtilCore.ensureValid(element); } if (result == null || result.equalsToText(oldValue, element)) return; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/VariableNode.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/VariableNode.java index c1198c977201..8dc75cc4e686 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/VariableNode.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/VariableNode.java @@ -47,11 +47,6 @@ public class VariableNode extends Expression { return TemplateManagerImpl.getTemplateState(context.getEditor()).getVariableValue(getName()); } - @Override - public boolean requiresCommittedPSI() { - return myInitialValue != null && myInitialValue.requiresCommittedPSI(); - } - @Override public LookupElement[] calculateLookupItems(ExpressionContext context) { if (myInitialValue == null){ diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MyLookupExpression.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MyLookupExpression.java index 47666922659f..1c3a7597b6d5 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MyLookupExpression.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MyLookupExpression.java @@ -97,11 +97,6 @@ public class MyLookupExpression extends Expression { return new TextResult(myName); } - @Override - public boolean requiresCommittedPSI() { - return false; - } - @Override public String getAdvertisingText() { return myAdvertisementText; diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchTemplateBuilder.java b/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchTemplateBuilder.java index 7ce994e681ee..0b6160940ac2 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchTemplateBuilder.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/StructuralSearchTemplateBuilder.java @@ -102,11 +102,6 @@ public class StructuralSearchTemplateBuilder { return calculateResult(context); } - @Override - public boolean requiresCommittedPSI() { - return false; - } - @Nullable @Override public LookupElement[] calculateLookupItems(ExpressionContext context) { diff --git a/plugins/editorconfig/src/org/editorconfig/language/codeinsight/completion/templates/EditorConfigTemplateConstantExpression.kt b/plugins/editorconfig/src/org/editorconfig/language/codeinsight/completion/templates/EditorConfigTemplateConstantExpression.kt index d66e5709c25a..03b4e3d11a69 100644 --- a/plugins/editorconfig/src/org/editorconfig/language/codeinsight/completion/templates/EditorConfigTemplateConstantExpression.kt +++ b/plugins/editorconfig/src/org/editorconfig/language/codeinsight/completion/templates/EditorConfigTemplateConstantExpression.kt @@ -10,6 +10,5 @@ class EditorConfigTemplateConstantExpression(source: Iterable) : Express private val elements = source.map(LookupElementBuilder::create).toTypedArray() override fun calculateResult(context: ExpressionContext): Result? = null override fun calculateQuickResult(context: ExpressionContext): Result? = null - override fun requiresCommittedPSI(): Boolean = false override fun calculateLookupItems(context: ExpressionContext) = elements } diff --git a/plugins/editorconfig/src/org/editorconfig/language/codeinsight/completion/templates/EditorConfigTemplateSingletonExpression.kt b/plugins/editorconfig/src/org/editorconfig/language/codeinsight/completion/templates/EditorConfigTemplateSingletonExpression.kt index d37bae8bf062..71bea934bc10 100644 --- a/plugins/editorconfig/src/org/editorconfig/language/codeinsight/completion/templates/EditorConfigTemplateSingletonExpression.kt +++ b/plugins/editorconfig/src/org/editorconfig/language/codeinsight/completion/templates/EditorConfigTemplateSingletonExpression.kt @@ -9,6 +9,5 @@ import com.intellij.codeInsight.template.TextResult class EditorConfigTemplateSingletonExpression(private val source: String) : Expression() { override fun calculateResult(context: ExpressionContext) = TextResult(source) override fun calculateQuickResult(context: ExpressionContext) = TextResult(source) - override fun requiresCommittedPSI(): Boolean = false override fun calculateLookupItems(context: ExpressionContext) = arrayOf(LookupElementBuilder.create(source)) } diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/PyConvertLambdaToFunctionIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/PyConvertLambdaToFunctionIntention.java index ad16c8911fbf..781e07e0e0b4 100644 --- a/python/src/com/jetbrains/python/codeInsight/intentions/PyConvertLambdaToFunctionIntention.java +++ b/python/src/com/jetbrains/python/codeInsight/intentions/PyConvertLambdaToFunctionIntention.java @@ -135,11 +135,6 @@ public class PyConvertLambdaToFunctionIntention extends PyBaseIntentionAction { return null; } - @Override - public boolean requiresCommittedPSI() { - return false; - } - @Override public LookupElement[] calculateLookupItems(ExpressionContext context) { return null; diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/InsertRequiredAttributeFix.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/InsertRequiredAttributeFix.java index 1cfc50640b3b..1cee875e92b7 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/InsertRequiredAttributeFix.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/InsertRequiredAttributeFix.java @@ -127,11 +127,6 @@ public class InsertRequiredAttributeFix extends LocalQuickFixAndIntentionActionO return null; } - @Override - public boolean requiresCommittedPSI() { - return false; - } - @Override public LookupElement[] calculateLookupItems(ExpressionContext context) { final LookupElement[] items = new LookupElement[myValues.length]; diff --git a/xml/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncNameImpl.java b/xml/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncNameImpl.java index 8f29eacdba48..59e8da4e7a80 100644 --- a/xml/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncNameImpl.java +++ b/xml/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncNameImpl.java @@ -281,11 +281,6 @@ public class RncNameImpl extends RncElementImpl implements RncName, PsiReference return calculateResult(context); } - @Override - public boolean requiresCommittedPSI() { - return false; - } - @Override public LookupItem[] calculateLookupItems(ExpressionContext context) { return LookupItem.EMPTY_ARRAY;