codemirror-rails 5.13.2 → 5.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/codemirror.js +55 -42
  4. data/vendor/assets/javascripts/codemirror/addons/comment/comment.js +9 -2
  5. data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +1 -1
  6. data/vendor/assets/javascripts/codemirror/addons/fold/brace-fold.js +8 -8
  7. data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +3 -3
  8. data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +25 -38
  9. data/vendor/assets/javascripts/codemirror/addons/hint/sql-hint.js +2 -2
  10. data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +2 -1
  11. data/vendor/assets/javascripts/codemirror/addons/scroll/simplescrollbars.js +9 -6
  12. data/vendor/assets/javascripts/codemirror/addons/search/match-highlighter.js +24 -27
  13. data/vendor/assets/javascripts/codemirror/addons/search/search.js +5 -2
  14. data/vendor/assets/javascripts/codemirror/addons/tern/tern.js +2 -2
  15. data/vendor/assets/javascripts/codemirror/keymaps/sublime.js +3 -21
  16. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +24 -25
  17. data/vendor/assets/javascripts/codemirror/modes/clike.js +34 -29
  18. data/vendor/assets/javascripts/codemirror/modes/clojure.js +59 -3
  19. data/vendor/assets/javascripts/codemirror/modes/crystal.js +1 -1
  20. data/vendor/assets/javascripts/codemirror/modes/css.js +6 -6
  21. data/vendor/assets/javascripts/codemirror/modes/django.js +8 -8
  22. data/vendor/assets/javascripts/codemirror/modes/dtd.js +6 -6
  23. data/vendor/assets/javascripts/codemirror/modes/ebnf.js +1 -1
  24. data/vendor/assets/javascripts/codemirror/modes/haml.js +3 -3
  25. data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +1 -1
  26. data/vendor/assets/javascripts/codemirror/modes/jade.js +3 -3
  27. data/vendor/assets/javascripts/codemirror/modes/javascript.js +15 -9
  28. data/vendor/assets/javascripts/codemirror/modes/markdown.js +11 -21
  29. data/vendor/assets/javascripts/codemirror/modes/mathematica.js +1 -0
  30. data/vendor/assets/javascripts/codemirror/modes/mbox.js +129 -0
  31. data/vendor/assets/javascripts/codemirror/modes/pegjs.js +6 -6
  32. data/vendor/assets/javascripts/codemirror/modes/perl.js +1 -1
  33. data/vendor/assets/javascripts/codemirror/modes/php.js +1 -1
  34. data/vendor/assets/javascripts/codemirror/modes/powershell.js +396 -0
  35. data/vendor/assets/javascripts/codemirror/modes/properties.js +1 -1
  36. data/vendor/assets/javascripts/codemirror/modes/puppet.js +1 -1
  37. data/vendor/assets/javascripts/codemirror/modes/python.js +20 -28
  38. data/vendor/assets/javascripts/codemirror/modes/sas.js +315 -0
  39. data/vendor/assets/javascripts/codemirror/modes/slim.js +4 -4
  40. data/vendor/assets/javascripts/codemirror/modes/sparql.js +1 -1
  41. data/vendor/assets/javascripts/codemirror/modes/sql.js +10 -2
  42. data/vendor/assets/javascripts/codemirror/modes/tiddlywiki.js +78 -128
  43. data/vendor/assets/javascripts/codemirror/modes/verilog.js +1 -1
  44. data/vendor/assets/javascripts/codemirror/modes/vhdl.js +1 -1
  45. data/vendor/assets/javascripts/codemirror/modes/webidl.js +195 -0
  46. data/vendor/assets/javascripts/codemirror/modes/xquery.js +1 -1
  47. data/vendor/assets/javascripts/codemirror/modes/yacas.js +204 -0
  48. data/vendor/assets/stylesheets/codemirror.css +1 -1
  49. data/vendor/assets/stylesheets/codemirror/addons/lint/lint.css +2 -2
  50. data/vendor/assets/stylesheets/codemirror/themes/icecoder.css +4 -4
  51. metadata +6 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cfc683c617e825011944a7a5c23d4f5d70261ac4
4
- data.tar.gz: 365c027102d29e10bef6ffe0bd07f188c59a203b
3
+ metadata.gz: 8452d7d850f333131e02651f87171085c9373949
4
+ data.tar.gz: 41821f0945c79008b27dbe9a9da195f1998b4c9f
5
5
  SHA512:
6
- metadata.gz: fba3203eaca8a56a75642cdfe20a5db0b0f4c23bf43e4322eb17f32bd8a48507601a9a346ada5611505cd59768a1aef7b6ba782fbe99f396bc40950b12a867e7
7
- data.tar.gz: 07c6ec78e6b3f583daae6457d5f61989eec4c1d4f0c96fd4e83c25ef7ac139467ddb8e22b30fde4eb2e4b815fc1bdcdbe3be771005b28d295d6448a524567a7f
6
+ metadata.gz: 6be7a3a6c3434c0f6ce75732429fabf3e73d19da666ec44f87503906076324c5848343bc1fd749564157dc875d33ed872ece373aadb119dea3ff1edeb3df7852
7
+ data.tar.gz: f7bc70b832ff41811db9cd0b0e34a3e62c346a520b83a95edd398261053bd0f536c18f9fa901eb9dd223636f2c25bd95df9d49259e2daa8c968994ddd766a058
@@ -1,6 +1,6 @@
1
1
  module Codemirror
2
2
  module Rails
3
- VERSION = '5.13.2'
4
- CODEMIRROR_VERSION = '5.13.2'
3
+ VERSION = '5.15.2'
4
+ CODEMIRROR_VERSION = '5.15.2'
5
5
  end
6
6
  end
@@ -41,6 +41,7 @@
41
41
  // This is woefully incomplete. Suggestions for alternative methods welcome.
42
42
  var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
43
43
  var mac = ios || /Mac/.test(platform);
44
+ var chromeOS = /\bCrOS\b/.test(userAgent);
44
45
  var windows = /win/i.test(platform);
45
46
 
46
47
  var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/);
@@ -1095,9 +1096,9 @@
1095
1096
  if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); }
1096
1097
  }
1097
1098
 
1098
- // This will be set to an array of strings when copying, so that,
1099
- // when pasting, we know what kind of selections the copied text
1100
- // was made out of.
1099
+ // This will be set to a {lineWise: bool, text: [string]} object, so
1100
+ // that, when pasting, we know what kind of selections the copied
1101
+ // text was made out of.
1101
1102
  var lastCopied = null;
1102
1103
 
1103
1104
  function applyTextInput(cm, inserted, deleted, sel, origin) {
@@ -1106,14 +1107,14 @@
1106
1107
  if (!sel) sel = doc.sel;
1107
1108
 
1108
1109
  var paste = cm.state.pasteIncoming || origin == "paste";
1109
- var textLines = doc.splitLines(inserted), multiPaste = null;
1110
+ var textLines = doc.splitLines(inserted), multiPaste = null
1110
1111
  // When pasing N lines into N selections, insert one line per selection
1111
1112
  if (paste && sel.ranges.length > 1) {
1112
- if (lastCopied && lastCopied.join("\n") == inserted) {
1113
- if (sel.ranges.length % lastCopied.length == 0) {
1113
+ if (lastCopied && lastCopied.text.join("\n") == inserted) {
1114
+ if (sel.ranges.length % lastCopied.text.length == 0) {
1114
1115
  multiPaste = [];
1115
- for (var i = 0; i < lastCopied.length; i++)
1116
- multiPaste.push(doc.splitLines(lastCopied[i]));
1116
+ for (var i = 0; i < lastCopied.text.length; i++)
1117
+ multiPaste.push(doc.splitLines(lastCopied.text[i]));
1117
1118
  }
1118
1119
  } else if (textLines.length == sel.ranges.length) {
1119
1120
  multiPaste = map(textLines, function(l) { return [l]; });
@@ -1129,6 +1130,8 @@
1129
1130
  from = Pos(from.line, from.ch - deleted);
1130
1131
  else if (cm.state.overwrite && !paste) // Handle overwrite
1131
1132
  to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length));
1133
+ else if (lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == inserted)
1134
+ from = to = Pos(from.line, 0)
1132
1135
  }
1133
1136
  var updateInput = cm.curOp.updateInput;
1134
1137
  var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines,
@@ -1261,18 +1264,18 @@
1261
1264
  function prepareCopyCut(e) {
1262
1265
  if (signalDOMEvent(cm, e)) return
1263
1266
  if (cm.somethingSelected()) {
1264
- lastCopied = cm.getSelections();
1267
+ lastCopied = {lineWise: false, text: cm.getSelections()};
1265
1268
  if (input.inaccurateSelection) {
1266
1269
  input.prevInput = "";
1267
1270
  input.inaccurateSelection = false;
1268
- te.value = lastCopied.join("\n");
1271
+ te.value = lastCopied.text.join("\n");
1269
1272
  selectInput(te);
1270
1273
  }
1271
1274
  } else if (!cm.options.lineWiseCopyCut) {
1272
1275
  return;
1273
1276
  } else {
1274
1277
  var ranges = copyableRanges(cm);
1275
- lastCopied = ranges.text;
1278
+ lastCopied = {lineWise: true, text: ranges.text};
1276
1279
  if (e.type == "cut") {
1277
1280
  cm.setSelections(ranges.ranges, null, sel_dontScroll);
1278
1281
  } else {
@@ -1620,13 +1623,13 @@
1620
1623
  function onCopyCut(e) {
1621
1624
  if (signalDOMEvent(cm, e)) return
1622
1625
  if (cm.somethingSelected()) {
1623
- lastCopied = cm.getSelections();
1626
+ lastCopied = {lineWise: false, text: cm.getSelections()};
1624
1627
  if (e.type == "cut") cm.replaceSelection("", null, "cut");
1625
1628
  } else if (!cm.options.lineWiseCopyCut) {
1626
1629
  return;
1627
1630
  } else {
1628
1631
  var ranges = copyableRanges(cm);
1629
- lastCopied = ranges.text;
1632
+ lastCopied = {lineWise: true, text: ranges.text};
1630
1633
  if (e.type == "cut") {
1631
1634
  cm.operation(function() {
1632
1635
  cm.setSelections(ranges.ranges, 0, sel_dontScroll);
@@ -1638,12 +1641,12 @@
1638
1641
  if (e.clipboardData && !ios) {
1639
1642
  e.preventDefault();
1640
1643
  e.clipboardData.clearData();
1641
- e.clipboardData.setData("text/plain", lastCopied.join("\n"));
1644
+ e.clipboardData.setData("text/plain", lastCopied.text.join("\n"));
1642
1645
  } else {
1643
1646
  // Old-fashioned briefly-focus-a-textarea hack
1644
1647
  var kludge = hiddenTextarea(), te = kludge.firstChild;
1645
1648
  cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);
1646
- te.value = lastCopied.join("\n");
1649
+ te.value = lastCopied.text.join("\n");
1647
1650
  var hadFocus = document.activeElement;
1648
1651
  selectInput(te);
1649
1652
  setTimeout(function() {
@@ -1662,9 +1665,9 @@
1662
1665
  return result;
1663
1666
  },
1664
1667
 
1665
- showSelection: function(info) {
1668
+ showSelection: function(info, takeFocus) {
1666
1669
  if (!info || !this.cm.display.view.length) return;
1667
- if (info.focus) this.showPrimarySelection();
1670
+ if (info.focus || takeFocus) this.showPrimarySelection();
1668
1671
  this.showMultipleSelections(info);
1669
1672
  },
1670
1673
 
@@ -3100,7 +3103,7 @@
3100
3103
  }
3101
3104
 
3102
3105
  if (op.updatedDisplay || op.selectionChanged)
3103
- op.preparedSelection = display.input.prepareSelection();
3106
+ op.preparedSelection = display.input.prepareSelection(op.focus);
3104
3107
  }
3105
3108
 
3106
3109
  function endOperation_W2(op) {
@@ -3113,8 +3116,9 @@
3113
3116
  cm.display.maxLineChanged = false;
3114
3117
  }
3115
3118
 
3119
+ var takeFocus = op.focus && op.focus == activeElt() && (!document.hasFocus || document.hasFocus())
3116
3120
  if (op.preparedSelection)
3117
- cm.display.input.showSelection(op.preparedSelection);
3121
+ cm.display.input.showSelection(op.preparedSelection, takeFocus);
3118
3122
  if (op.updatedDisplay || op.startHeight != cm.doc.height)
3119
3123
  updateScrollbars(cm, op.barMeasure);
3120
3124
  if (op.updatedDisplay)
@@ -3124,8 +3128,7 @@
3124
3128
 
3125
3129
  if (cm.state.focused && op.updateInput)
3126
3130
  cm.display.input.reset(op.typing);
3127
- if (op.focus && op.focus == activeElt() && (!document.hasFocus || document.hasFocus()))
3128
- ensureFocus(op.cm);
3131
+ if (takeFocus) ensureFocus(op.cm);
3129
3132
  }
3130
3133
 
3131
3134
  function endOperation_finish(op) {
@@ -3680,7 +3683,7 @@
3680
3683
  ourIndex = doc.sel.primIndex;
3681
3684
  }
3682
3685
 
3683
- if (e.altKey) {
3686
+ if (chromeOS ? e.shiftKey && e.metaKey : e.altKey) {
3684
3687
  type = "rect";
3685
3688
  if (!addNew) ourRange = new Range(start, start);
3686
3689
  start = posFromMouse(cm, e, true, true);
@@ -3905,6 +3908,7 @@
3905
3908
  if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
3906
3909
 
3907
3910
  e.dataTransfer.setData("Text", cm.getSelection());
3911
+ e.dataTransfer.effectAllowed = "copyMove"
3908
3912
 
3909
3913
  // Use dummy image instead of default browsers image.
3910
3914
  // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
@@ -5390,7 +5394,7 @@
5390
5394
  for (var i = newBreaks.length - 1; i >= 0; i--)
5391
5395
  replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length))
5392
5396
  });
5393
- option("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val, old) {
5397
+ option("specialChars", /[\u0000-\u001f\u007f\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val, old) {
5394
5398
  cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
5395
5399
  if (old != CodeMirror.Init) cm.refresh();
5396
5400
  });
@@ -5719,7 +5723,7 @@
5719
5723
  for (var i = 0; i < ranges.length; i++) {
5720
5724
  var pos = ranges[i].from();
5721
5725
  var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);
5722
- spaces.push(new Array(tabSize - col % tabSize + 1).join(" "));
5726
+ spaces.push(spaceStr(tabSize - col % tabSize));
5723
5727
  }
5724
5728
  cm.replaceSelections(spaces);
5725
5729
  },
@@ -5762,6 +5766,7 @@
5762
5766
  ensureCursorVisible(cm);
5763
5767
  });
5764
5768
  },
5769
+ openLine: function(cm) {cm.replaceSelection("\n", "start")},
5765
5770
  toggleOverwrite: function(cm) {cm.toggleOverwrite();}
5766
5771
  };
5767
5772
 
@@ -5796,7 +5801,8 @@
5796
5801
  "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
5797
5802
  "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
5798
5803
  "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",
5799
- "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
5804
+ "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars",
5805
+ "Ctrl-O": "openLine"
5800
5806
  };
5801
5807
  keyMap.macDefault = {
5802
5808
  "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
@@ -6558,8 +6564,8 @@
6558
6564
  var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);
6559
6565
  var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);
6560
6566
  if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue;
6561
- if (fromCmp <= 0 && (cmp(found.to, from) > 0 || (sp.marker.inclusiveRight && marker.inclusiveLeft)) ||
6562
- fromCmp >= 0 && (cmp(found.from, to) < 0 || (sp.marker.inclusiveLeft && marker.inclusiveRight)))
6567
+ if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||
6568
+ fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))
6563
6569
  return true;
6564
6570
  }
6565
6571
  }
@@ -6961,8 +6967,11 @@
6961
6967
  }
6962
6968
 
6963
6969
  // See issue #2901
6964
- if (webkit && /\bcm-tab\b/.test(builder.content.lastChild.className))
6965
- builder.content.className = "cm-tab-wrap-hack";
6970
+ if (webkit) {
6971
+ var last = builder.content.lastChild
6972
+ if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab")))
6973
+ builder.content.className = "cm-tab-wrap-hack";
6974
+ }
6966
6975
 
6967
6976
  signal(cm, "renderLine", cm, lineView.line, builder.pre);
6968
6977
  if (builder.pre.className)
@@ -7314,13 +7323,16 @@
7314
7323
  if (at <= sz) {
7315
7324
  child.insertInner(at, lines, height);
7316
7325
  if (child.lines && child.lines.length > 50) {
7317
- while (child.lines.length > 50) {
7318
- var spilled = child.lines.splice(child.lines.length - 25, 25);
7319
- var newleaf = new LeafChunk(spilled);
7320
- child.height -= newleaf.height;
7321
- this.children.splice(i + 1, 0, newleaf);
7322
- newleaf.parent = this;
7326
+ // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.
7327
+ // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.
7328
+ var remaining = child.lines.length % 25 + 25
7329
+ for (var pos = remaining; pos < child.lines.length;) {
7330
+ var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));
7331
+ child.height -= leaf.height;
7332
+ this.children.splice(++i, 0, leaf);
7333
+ leaf.parent = this;
7323
7334
  }
7335
+ child.lines = child.lines.slice(0, remaining);
7324
7336
  this.maybeSpill();
7325
7337
  }
7326
7338
  break;
@@ -7340,7 +7352,7 @@
7340
7352
  copy.parent = me;
7341
7353
  me.children = [copy, sibling];
7342
7354
  me = copy;
7343
- } else {
7355
+ } else {
7344
7356
  me.size -= sibling.size;
7345
7357
  me.height -= sibling.height;
7346
7358
  var myIndex = indexOf(me.parent.children, me);
@@ -7625,9 +7637,9 @@
7625
7637
  var spans = line.markedSpans;
7626
7638
  if (spans) for (var i = 0; i < spans.length; i++) {
7627
7639
  var span = spans[i];
7628
- if (!(span.to != null && lineNo == from.line && from.ch > span.to ||
7640
+ if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||
7629
7641
  span.from == null && lineNo != from.line ||
7630
- span.from != null && lineNo == to.line && span.from > to.ch) &&
7642
+ span.from != null && lineNo == to.line && span.from >= to.ch) &&
7631
7643
  (!filter || filter(span.marker)))
7632
7644
  found.push(span.marker.parent || span.marker);
7633
7645
  }
@@ -7646,9 +7658,9 @@
7646
7658
  },
7647
7659
 
7648
7660
  posFromIndex: function(off) {
7649
- var ch, lineNo = this.first;
7661
+ var ch, lineNo = this.first, sepSize = this.lineSeparator().length;
7650
7662
  this.iter(function(line) {
7651
- var sz = line.text.length + 1;
7663
+ var sz = line.text.length + sepSize;
7652
7664
  if (sz > off) { ch = off; return true; }
7653
7665
  off -= sz;
7654
7666
  ++lineNo;
@@ -7659,8 +7671,9 @@
7659
7671
  coords = clipPos(this, coords);
7660
7672
  var index = coords.ch;
7661
7673
  if (coords.line < this.first || coords.ch < 0) return 0;
7674
+ var sepSize = this.lineSeparator().length;
7662
7675
  this.iter(this.first, coords.line, function (line) {
7663
- index += line.text.length + 1;
7676
+ index += line.text.length + sepSize;
7664
7677
  });
7665
7678
  return index;
7666
7679
  },
@@ -8889,7 +8902,7 @@
8889
8902
 
8890
8903
  // THE END
8891
8904
 
8892
- CodeMirror.version = "5.13.2";
8905
+ CodeMirror.version = "5.15.2";
8893
8906
 
8894
8907
  return CodeMirror;
8895
8908
  });
@@ -44,9 +44,17 @@
44
44
  }
45
45
  });
46
46
 
47
+ // Rough heuristic to try and detect lines that are part of multi-line string
48
+ function probablyInsideString(cm, pos, line) {
49
+ return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\'\"`]/.test(line)
50
+ }
51
+
47
52
  CodeMirror.defineExtension("lineComment", function(from, to, options) {
48
53
  if (!options) options = noOptions;
49
54
  var self = this, mode = self.getModeAt(from);
55
+ var firstLine = self.getLine(from.line);
56
+ if (firstLine == null || probablyInsideString(self, from, firstLine)) return;
57
+
50
58
  var commentString = options.lineComment || mode.lineComment;
51
59
  if (!commentString) {
52
60
  if (options.blockCommentStart || mode.blockCommentStart) {
@@ -55,8 +63,7 @@
55
63
  }
56
64
  return;
57
65
  }
58
- var firstLine = self.getLine(from.line);
59
- if (firstLine == null) return;
66
+
60
67
  var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1);
61
68
  var pad = options.padding == null ? " " : options.padding;
62
69
  var blankLines = options.commentBlankLines || from.line == to.line;
@@ -109,7 +109,7 @@
109
109
  var ranges = cm.listSelections();
110
110
  var opening = pos % 2 == 0;
111
111
 
112
- var type, next;
112
+ var type;
113
113
  for (var i = 0; i < ranges.length; i++) {
114
114
  var range = ranges[i], cur = range.head, curType;
115
115
  var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));
@@ -13,7 +13,7 @@
13
13
 
14
14
  CodeMirror.registerHelper("fold", "brace", function(cm, start) {
15
15
  var line = start.line, lineText = cm.getLine(line);
16
- var startCh, tokenType;
16
+ var tokenType;
17
17
 
18
18
  function findOpening(openCh) {
19
19
  for (var at = start.ch, pass = 0;;) {
@@ -72,15 +72,15 @@ CodeMirror.registerHelper("fold", "import", function(cm, start) {
72
72
  }
73
73
  }
74
74
 
75
- var start = start.line, has = hasImport(start), prev;
76
- if (!has || hasImport(start - 1) || ((prev = hasImport(start - 2)) && prev.end.line == start - 1))
75
+ var startLine = start.line, has = hasImport(startLine), prev;
76
+ if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1))
77
77
  return null;
78
78
  for (var end = has.end;;) {
79
79
  var next = hasImport(end.line + 1);
80
80
  if (next == null) break;
81
81
  end = next.end;
82
82
  }
83
- return {from: cm.clipPos(CodeMirror.Pos(start, has.startCh + 1)), to: end};
83
+ return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end};
84
84
  });
85
85
 
86
86
  CodeMirror.registerHelper("fold", "include", function(cm, start) {
@@ -91,14 +91,14 @@ CodeMirror.registerHelper("fold", "include", function(cm, start) {
91
91
  if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8;
92
92
  }
93
93
 
94
- var start = start.line, has = hasInclude(start);
95
- if (has == null || hasInclude(start - 1) != null) return null;
96
- for (var end = start;;) {
94
+ var startLine = start.line, has = hasInclude(startLine);
95
+ if (has == null || hasInclude(startLine - 1) != null) return null;
96
+ for (var end = startLine;;) {
97
97
  var next = hasInclude(end + 1);
98
98
  if (next == null) break;
99
99
  ++end;
100
100
  }
101
- return {from: CodeMirror.Pos(start, has + 1),
101
+ return {from: CodeMirror.Pos(startLine, has + 1),
102
102
  to: cm.clipPos(CodeMirror.Pos(end))};
103
103
  });
104
104
 
@@ -140,9 +140,9 @@
140
140
  var openTag = toNextTag(iter), end;
141
141
  if (!openTag || iter.line != start.line || !(end = toTagEnd(iter))) return;
142
142
  if (!openTag[1] && end != "selfClose") {
143
- var start = Pos(iter.line, iter.ch);
144
- var close = findMatchingClose(iter, openTag[2]);
145
- return close && {from: start, to: close.from};
143
+ var startPos = Pos(iter.line, iter.ch);
144
+ var endPos = findMatchingClose(iter, openTag[2]);
145
+ return endPos && {from: startPos, to: endPos.from};
146
146
  }
147
147
  }
148
148
  });
@@ -108,15 +108,11 @@
108
108
  },
109
109
 
110
110
  update: function(first) {
111
- if (this.tick == null) return;
112
- if (!this.options.hint.async) {
113
- this.finishUpdate(this.options.hint(this.cm, this.options), first);
114
- } else {
115
- var myTick = ++this.tick, self = this;
116
- this.options.hint(this.cm, function(data) {
117
- if (self.tick == myTick) self.finishUpdate(data, first);
118
- }, this.options);
119
- }
111
+ if (this.tick == null) return
112
+ var self = this, myTick = ++this.tick
113
+ fetchHints(this.options.hint, this.cm, this.options, function(data) {
114
+ if (self.tick == myTick) self.finishUpdate(data, first)
115
+ })
120
116
  },
121
117
 
122
118
  finishUpdate: function(data, first) {
@@ -362,40 +358,31 @@
362
358
  return result
363
359
  }
364
360
 
361
+ function fetchHints(hint, cm, options, callback) {
362
+ if (hint.async) {
363
+ hint(cm, callback, options)
364
+ } else {
365
+ var result = hint(cm, options)
366
+ if (result && result.then) result.then(callback)
367
+ else callback(result)
368
+ }
369
+ }
370
+
365
371
  function resolveAutoHints(cm, pos) {
366
372
  var helpers = cm.getHelpers(pos, "hint"), words
367
373
  if (helpers.length) {
368
- var async = false, resolved
369
- for (var i = 0; i < helpers.length; i++) if (helpers[i].async) async = true
370
- if (async) {
371
- resolved = function(cm, callback, options) {
372
- var app = applicableHelpers(cm, helpers)
373
- function run(i, result) {
374
- if (i == app.length) return callback(null)
375
- var helper = app[i]
376
- if (helper.async) {
377
- helper(cm, function(result) {
378
- if (result) callback(result)
379
- else run(i + 1)
380
- }, options)
381
- } else {
382
- var result = helper(cm, options)
383
- if (result) callback(result)
384
- else run(i + 1)
385
- }
386
- }
387
- run(0)
388
- }
389
- resolved.async = true
390
- } else {
391
- resolved = function(cm, options) {
392
- var app = applicableHelpers(cm, helpers)
393
- for (var i = 0; i < app.length; i++) {
394
- var cur = app[i](cm, options)
395
- if (cur && cur.list.length) return cur
396
- }
374
+ var resolved = function(cm, callback, options) {
375
+ var app = applicableHelpers(cm, helpers);
376
+ function run(i) {
377
+ if (i == app.length) return callback(null)
378
+ fetchHints(app[i], cm, options, function(result) {
379
+ if (result && result.list.length > 0) callback(result)
380
+ else run(i + 1)
381
+ })
397
382
  }
383
+ run(0)
398
384
  }
385
+ resolved.async = true
399
386
  resolved.supportsSelection = true
400
387
  return resolved
401
388
  } else if (words = cm.getHelper(cm.getCursor(), "hintWords")) {