Templates: add whitespace marker in non-empty line (RUBY-16672) idea/142.2009
authorAlexander Zolotov <Alexander.Zolotov@jetbrains.com>
Tue, 26 May 2015 09:39:52 +0000 (11:39 +0200)
committerAlexander Zolotov <Alexander.Zolotov@jetbrains.com>
Tue, 26 May 2015 09:43:13 +0000 (11:43 +0200)
platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java
platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerImpl.java

index c80c812668b84695ded325b8f41642c8b7d882c8..fe432b5a672c55688ecb7d4fddc1b0ad64a1f026 100644 (file)
@@ -743,10 +743,21 @@ public class TemplateState implements Disposable {
 
     ExpressionContext context = createExpressionContext(start);
     Result result = isQuick ? expressionNode.calculateQuickResult(context) : expressionNode.calculateResult(context);
-    if (isQuick && result == null && !oldValue.isEmpty()) {
+    if (isQuick && result == null) {
+      if (!oldValue.isEmpty()) {
+        return;
+      }
+    }
+    
+    final boolean resultIsNullOrEmpty = result == null || result.equalsToText("", element);
+    
+    // do not update default value of neighbour segment
+    if (resultIsNullOrEmpty && myCurrentSegmentNumber >= 0 && 
+        (mySegments.getSegmentStart(segmentNumber) == mySegments.getSegmentEnd(myCurrentSegmentNumber) ||
+        mySegments.getSegmentEnd(segmentNumber) == mySegments.getSegmentStart(myCurrentSegmentNumber))) {
       return;
     }
-    if (defaultValue != null && (result == null || result.equalsToText("", element))) {
+    if (defaultValue != null && resultIsNullOrEmpty) {
       result = defaultValue.calculateResult(context);
     }
     if (element != null) {
index 529585953a8852f0e95606166a18ad927818aaaf..e678edb57f631c05a1baaea7b6ad498b0f75a687 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 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.
@@ -477,7 +477,8 @@ public class CodeStyleManagerImpl extends CodeStyleManager {
 
   /**
    * Formatter trims line that contains white spaces symbols only, however, there is a possible case that we want
-   * to preserve them for particular line (e.g. for live template that defines blank line that contains $END$ marker).
+   * to preserve them for particular line 
+   * (e.g. for live template that defines line with whitespaces that contains $END$ marker: templateText   $END$).
    * <p/>
    * Current approach is to do the following:
    * <pre>
@@ -489,7 +490,7 @@ public class CodeStyleManagerImpl extends CodeStyleManager {
    * </pre>
    * <p/>
    * This method inserts that dummy comment (fallback to identifier <code>xxx</code>, see {@link CodeStyleManagerImpl#createDummy(PsiFile)})
-   * if necessary (if target line contains white space symbols only).
+   * if necessary.
    * <p/>
 
    * <b>Note:</b> it's expected that the whole white space region that contains given offset is processed in a way that all
@@ -505,26 +506,22 @@ public class CodeStyleManagerImpl extends CodeStyleManager {
    */
   @Nullable
   public static TextRange insertNewLineIndentMarker(@NotNull PsiFile file, @NotNull Document document, int offset) {
-    CharSequence text = document.getCharsSequence();
-    if (offset < 0 || offset >= text.length() || !isWhiteSpaceSymbol(text.charAt(offset))) {
+    CharSequence text = document.getImmutableCharSequence();
+    if (offset <= 0 || offset >= text.length() || !isWhiteSpaceSymbol(text.charAt(offset))) {
       return null;
     }
-
-    for (int i = offset - 1; i >= 0; i--) {
-      char c = text.charAt(i);
-      // We don't want to insert a marker if target line is not blank (doesn't consist from white space symbols only).
-      if (c == '\n') {
-        break;
-      }
-      if (!isWhiteSpaceSymbol(c)) {
-        return null;
-      }
+    
+    if (!isWhiteSpaceSymbol(text.charAt(offset - 1))) {
+      return null; // no whitespaces before offset
     }
 
     int end = offset;
     for (; end < text.length(); end++) {
+      if (text.charAt(end) == '\n') {
+        break; // line is empty till the end
+      }
       if (!isWhiteSpaceSymbol(text.charAt(end))) {
-        break;
+        return null;
       }
     }