CPP-2138 fix the problem with dirty PSI, "wrong" fix for SQL tests
authorAlexey Utkin <alexey.utkin@jetbrains.com>
Tue, 29 Mar 2016 18:00:01 +0000 (21:00 +0300)
committerAlexey Utkin <alexey.utkin@jetbrains.com>
Tue, 29 Mar 2016 18:02:13 +0000 (21:02 +0300)
java/java-impl/src/com/intellij/codeInsight/editorActions/smartEnter/JavaSmartEnterProcessor.java
platform/lang-impl/src/com/intellij/lang/SmartEnterProcessorWithFixers.java

index 7ab0acddbcafe41d9df06b543bcac69f4b7eb1b6..9fd7ed8c5222408a76316e5b8b910954e0f1369f 100644 (file)
@@ -230,7 +230,10 @@ public class JavaSmartEnterProcessor extends SmartEnterProcessor {
           break;
         }
 
-        if (processor.doEnter(editor, atCaret, isModified(editor))) return;
+        if (processor.doEnter(editor, atCaret, isModified(editor))) {
+          rangeMarker.dispose();
+          return;
+        }
       }
 
       if (!isModified(editor) && !afterCompletion) {
index 9c6abc69127e31aa7ea6b8ad888e651c4332a06f..e3df20557b080605d996b91175d263d32f13e798 100644 (file)
@@ -178,14 +178,15 @@ public abstract class SmartEnterProcessorWithFixers extends SmartEnterProcessor
     }
 
     final RangeMarker rangeMarker = createRangeMarker(atCaret);
+
     if (reformatBeforeEnter(atCaret)) {
       reformat(atCaret);
     }
     commit(editor);
+    PsiElement actualAtCaret = restoreElementAtCaret(psiFile, atCaret, rangeMarker);
+    int endOffset = rangeMarker.getEndOffset();
 
-    PsiElement actualAtCaret = atCaret.isValid()
-      ? atCaret
-      : restoreInvalidElementFromRange(psiFile, rangeMarker.getStartOffset(), rangeMarker.getEndOffset(), atCaret.getClass());
+    rangeMarker.dispose();
 
     if (actualAtCaret != null) {
       for (FixEnterProcessor enterProcessor : myEnterProcessors) {
@@ -196,24 +197,24 @@ public abstract class SmartEnterProcessorWithFixers extends SmartEnterProcessor
     }
 
     if (!isModified(editor) && !afterCompletion) {
-      plainEnter(editor);
+      if (actualAtCaret != null) {
+        plainEnter(editor);
+      }
     }
     else {
       editor.getCaretModel().moveToOffset(myFirstErrorOffset == Integer.MAX_VALUE
                                           ? (actualAtCaret != null
                                              ? actualAtCaret.getTextRange().getEndOffset()
-                                             : rangeMarker.getEndOffset())
+                                             : endOffset)
                                           : myFirstErrorOffset);
     }
-    rangeMarker.dispose();
   }
 
-  protected PsiElement restoreInvalidElementFromRange(@NotNull PsiFile file,
-                                                      int startOffset,
-                                                      int endOffset,
-                                                      @NotNull Class<? extends PsiElement> klass) {
-    LOG.warn("Please, override com.intellij.lang.SmartEnterProcessorWithFixers.restoreInvalidElementFromRange for your language!");
-    return null;
+  protected PsiElement restoreElementAtCaret(PsiFile file, PsiElement origElement, RangeMarker marker){
+    if (!origElement.isValid()) {
+      LOG.warn("Please, override com.intellij.lang.SmartEnterProcessorWithFixers.restoreElementAtCaret for your language!");
+    }
+    return origElement;
   }
 
   protected boolean reformatBeforeEnter(@NotNull PsiElement atCaret) {return true;}