codemirror-rails 5.13.2 → 5.15.2

Sign up to get free protection for your applications and to get access to all the features.
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")) {