@uiw/react-codemirror 4.21.2 → 4.21.4
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.
- package/cjs/useCodeMirror.js +3 -0
- package/dist/codemirror.js +335 -309
- package/dist/codemirror.min.js +1 -1
- package/esm/useCodeMirror.js +3 -0
- package/package.json +2 -2
- package/src/useCodeMirror.ts +3 -0
package/dist/codemirror.js
CHANGED
|
@@ -149,7 +149,7 @@ var getDefaultExtensions = __webpack_require__(736);
|
|
|
149
149
|
// EXTERNAL MODULE: ./src/utils.ts
|
|
150
150
|
var utils = __webpack_require__(742);
|
|
151
151
|
;// CONCATENATED MODULE: ./src/useCodeMirror.ts
|
|
152
|
-
var External=state_.Annotation.define();function useCodeMirror(props){var value=props.value,selection=props.selection,onChange=props.onChange,onStatistics=props.onStatistics,onCreateEditor=props.onCreateEditor,onUpdate=props.onUpdate,_props$extensions=props.extensions,extensions=_props$extensions===void 0?[]:_props$extensions,autoFocus=props.autoFocus,_props$theme=props.theme,theme=_props$theme===void 0?'light':_props$theme,_props$height=props.height,height=_props$height===void 0?'':_props$height,_props$minHeight=props.minHeight,minHeight=_props$minHeight===void 0?'':_props$minHeight,_props$maxHeight=props.maxHeight,maxHeight=_props$maxHeight===void 0?'':_props$maxHeight,_props$placeholder=props.placeholder,placeholderStr=_props$placeholder===void 0?'':_props$placeholder,_props$width=props.width,width=_props$width===void 0?'':_props$width,_props$minWidth=props.minWidth,minWidth=_props$minWidth===void 0?'':_props$minWidth,_props$maxWidth=props.maxWidth,maxWidth=_props$maxWidth===void 0?'':_props$maxWidth,_props$editable=props.editable,editable=_props$editable===void 0?true:_props$editable,_props$readOnly=props.readOnly,readOnly=_props$readOnly===void 0?false:_props$readOnly,_props$indentWithTab=props.indentWithTab,defaultIndentWithTab=_props$indentWithTab===void 0?true:_props$indentWithTab,_props$basicSetup=props.basicSetup,defaultBasicSetup=_props$basicSetup===void 0?true:_props$basicSetup,root=props.root,initialState=props.initialState;var _useState=(0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useState)(),_useState2=_slicedToArray(_useState,2),container=_useState2[0],setContainer=_useState2[1];var _useState3=(0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useState)(),_useState4=_slicedToArray(_useState3,2),view=_useState4[0],setView=_useState4[1];var _useState5=(0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useState)(),_useState6=_slicedToArray(_useState5,2),state=_useState6[0],setState=_useState6[1];var defaultThemeOption=view_.EditorView.theme({'&':{height:height,minHeight:minHeight,maxHeight:maxHeight,width:width,minWidth:minWidth,maxWidth:maxWidth}});var updateListener=view_.EditorView.updateListener.of(function(vu){if(vu.docChanged&&typeof onChange==='function'&&// Fix echoing of the remote changes:
|
|
152
|
+
var External=state_.Annotation.define();function useCodeMirror(props){var value=props.value,selection=props.selection,onChange=props.onChange,onStatistics=props.onStatistics,onCreateEditor=props.onCreateEditor,onUpdate=props.onUpdate,_props$extensions=props.extensions,extensions=_props$extensions===void 0?[]:_props$extensions,autoFocus=props.autoFocus,_props$theme=props.theme,theme=_props$theme===void 0?'light':_props$theme,_props$height=props.height,height=_props$height===void 0?'':_props$height,_props$minHeight=props.minHeight,minHeight=_props$minHeight===void 0?'':_props$minHeight,_props$maxHeight=props.maxHeight,maxHeight=_props$maxHeight===void 0?'':_props$maxHeight,_props$placeholder=props.placeholder,placeholderStr=_props$placeholder===void 0?'':_props$placeholder,_props$width=props.width,width=_props$width===void 0?'':_props$width,_props$minWidth=props.minWidth,minWidth=_props$minWidth===void 0?'':_props$minWidth,_props$maxWidth=props.maxWidth,maxWidth=_props$maxWidth===void 0?'':_props$maxWidth,_props$editable=props.editable,editable=_props$editable===void 0?true:_props$editable,_props$readOnly=props.readOnly,readOnly=_props$readOnly===void 0?false:_props$readOnly,_props$indentWithTab=props.indentWithTab,defaultIndentWithTab=_props$indentWithTab===void 0?true:_props$indentWithTab,_props$basicSetup=props.basicSetup,defaultBasicSetup=_props$basicSetup===void 0?true:_props$basicSetup,root=props.root,initialState=props.initialState;var _useState=(0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useState)(),_useState2=_slicedToArray(_useState,2),container=_useState2[0],setContainer=_useState2[1];var _useState3=(0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useState)(),_useState4=_slicedToArray(_useState3,2),view=_useState4[0],setView=_useState4[1];var _useState5=(0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useState)(),_useState6=_slicedToArray(_useState5,2),state=_useState6[0],setState=_useState6[1];var defaultThemeOption=view_.EditorView.theme({'&':{height:height,minHeight:minHeight,maxHeight:maxHeight,width:width,minWidth:minWidth,maxWidth:maxWidth},'& .cm-scroller':{height:'100% !important'}});var updateListener=view_.EditorView.updateListener.of(function(vu){if(vu.docChanged&&typeof onChange==='function'&&// Fix echoing of the remote changes:
|
|
153
153
|
// If transaction is market as remote we don't have to call `onChange` handler again
|
|
154
154
|
!vu.transactions.some(function(tr){return tr.annotation(External);})){var doc=vu.state.doc;var _value=doc.toString();onChange(_value,vu);}onStatistics&&onStatistics((0,utils/* getStatistics */.a)(vu));});var defaultExtensions=(0,getDefaultExtensions.getDefaultExtensions)({theme:theme,editable:editable,readOnly:readOnly,placeholder:placeholderStr,indentWithTab:defaultIndentWithTab,basicSetup:defaultBasicSetup});var getExtensions=[updateListener,defaultThemeOption].concat(_toConsumableArray(defaultExtensions));if(onUpdate&&typeof onUpdate==='function'){getExtensions.push(view_.EditorView.updateListener.of(onUpdate));}getExtensions=getExtensions.concat(extensions);(0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useEffect)(function(){if(container&&!state){var config={doc:value,selection:selection,extensions:getExtensions};var stateCurrent=initialState?state_.EditorState.fromJSON(initialState.json,config,initialState.fields):state_.EditorState.create(config);setState(stateCurrent);if(!view){var viewCurrent=new view_.EditorView({state:stateCurrent,parent:container,root:root});setView(viewCurrent);onCreateEditor&&onCreateEditor(viewCurrent,stateCurrent);}}return function(){if(view){setState(undefined);setView(undefined);}};},[container,state]);(0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useEffect)(function(){return setContainer(props.container);},[props.container]);(0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useEffect)(function(){return function(){if(view){view.destroy();setView(undefined);}};},[view]);(0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useEffect)(function(){if(autoFocus&&view){view.focus();}},[autoFocus,view]);(0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useEffect)(function(){if(view){view.dispatch({effects:state_.StateEffect.reconfigure.of(getExtensions)});}// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
155
155
|
},[theme,extensions,height,minHeight,maxHeight,width,minWidth,maxWidth,placeholderStr,editable,readOnly,defaultIndentWithTab,defaultBasicSetup,onChange,onUpdate]);(0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useEffect)(function(){if(value===undefined){return;}var currentValue=view?view.state.doc.toString():'';if(view&&value!==currentValue){view.dispatch({changes:{from:0,to:currentValue.length,insert:value||''},annotations:[External.of(true)]});}},[value,view]);return{state:state,setState:setState,view:view,setView:setView,container:container,setContainer:setContainer};}
|
|
@@ -1652,7 +1652,7 @@ class FuzzyMatcher {
|
|
|
1652
1652
|
// is. See `Penalty` above.
|
|
1653
1653
|
match(word) {
|
|
1654
1654
|
if (this.pattern.length == 0)
|
|
1655
|
-
return [-100 /*
|
|
1655
|
+
return [-100 /* NotFull */];
|
|
1656
1656
|
if (word.length < this.pattern.length)
|
|
1657
1657
|
return null;
|
|
1658
1658
|
let { chars, folded, any, precise, byWord } = this;
|
|
@@ -1660,17 +1660,17 @@ class FuzzyMatcher {
|
|
|
1660
1660
|
// at the start
|
|
1661
1661
|
if (chars.length == 1) {
|
|
1662
1662
|
let first = (0,state_.codePointAt)(word, 0), firstSize = (0,state_.codePointSize)(first);
|
|
1663
|
-
let score = firstSize == word.length ? 0 : -100 /*
|
|
1663
|
+
let score = firstSize == word.length ? 0 : -100 /* NotFull */;
|
|
1664
1664
|
if (first == chars[0]) ;
|
|
1665
1665
|
else if (first == folded[0])
|
|
1666
|
-
score += -200 /*
|
|
1666
|
+
score += -200 /* CaseFold */;
|
|
1667
1667
|
else
|
|
1668
1668
|
return null;
|
|
1669
1669
|
return [score, 0, firstSize];
|
|
1670
1670
|
}
|
|
1671
1671
|
let direct = word.indexOf(this.pattern);
|
|
1672
1672
|
if (direct == 0)
|
|
1673
|
-
return [word.length == this.pattern.length ? 0 : -100 /*
|
|
1673
|
+
return [word.length == this.pattern.length ? 0 : -100 /* NotFull */, 0, this.pattern.length];
|
|
1674
1674
|
let len = chars.length, anyTo = 0;
|
|
1675
1675
|
if (direct < 0) {
|
|
1676
1676
|
for (let i = 0, e = Math.min(word.length, 200); i < e && anyTo < len;) {
|
|
@@ -1694,7 +1694,7 @@ class FuzzyMatcher {
|
|
|
1694
1694
|
let adjacentTo = 0, adjacentStart = -1, adjacentEnd = -1;
|
|
1695
1695
|
let hasLower = /[a-z]/.test(word), wordAdjacent = true;
|
|
1696
1696
|
// Go over the option's text, scanning for the various kinds of matches
|
|
1697
|
-
for (let i = 0, e = Math.min(word.length, 200), prevType = 0 /*
|
|
1697
|
+
for (let i = 0, e = Math.min(word.length, 200), prevType = 0 /* NonWord */; i < e && byWordTo < len;) {
|
|
1698
1698
|
let next = (0,state_.codePointAt)(word, i);
|
|
1699
1699
|
if (direct < 0) {
|
|
1700
1700
|
if (preciseTo < len && next == chars[preciseTo])
|
|
@@ -1712,9 +1712,9 @@ class FuzzyMatcher {
|
|
|
1712
1712
|
}
|
|
1713
1713
|
}
|
|
1714
1714
|
let ch, type = next < 0xff
|
|
1715
|
-
? (next >= 48 && next <= 57 || next >= 97 && next <= 122 ? 2 /*
|
|
1716
|
-
: ((ch = (0,state_.fromCodePoint)(next)) != ch.toLowerCase() ? 1 /*
|
|
1717
|
-
if (!i || type == 1 /*
|
|
1715
|
+
? (next >= 48 && next <= 57 || next >= 97 && next <= 122 ? 2 /* Lower */ : next >= 65 && next <= 90 ? 1 /* Upper */ : 0 /* NonWord */)
|
|
1716
|
+
: ((ch = (0,state_.fromCodePoint)(next)) != ch.toLowerCase() ? 1 /* Upper */ : ch != ch.toUpperCase() ? 2 /* Lower */ : 0 /* NonWord */);
|
|
1717
|
+
if (!i || type == 1 /* Upper */ && hasLower || prevType == 0 /* NonWord */ && type != 0 /* NonWord */) {
|
|
1718
1718
|
if (chars[byWordTo] == next || (folded[byWordTo] == next && (byWordFolded = true)))
|
|
1719
1719
|
byWord[byWordTo++] = i;
|
|
1720
1720
|
else if (byWord.length)
|
|
@@ -1724,17 +1724,17 @@ class FuzzyMatcher {
|
|
|
1724
1724
|
i += (0,state_.codePointSize)(next);
|
|
1725
1725
|
}
|
|
1726
1726
|
if (byWordTo == len && byWord[0] == 0 && wordAdjacent)
|
|
1727
|
-
return this.result(-100 /*
|
|
1727
|
+
return this.result(-100 /* ByWord */ + (byWordFolded ? -200 /* CaseFold */ : 0), byWord, word);
|
|
1728
1728
|
if (adjacentTo == len && adjacentStart == 0)
|
|
1729
|
-
return [-200 /*
|
|
1729
|
+
return [-200 /* CaseFold */ - word.length + (adjacentEnd == word.length ? 0 : -100 /* NotFull */), 0, adjacentEnd];
|
|
1730
1730
|
if (direct > -1)
|
|
1731
|
-
return [-700 /*
|
|
1731
|
+
return [-700 /* NotStart */ - word.length, direct, direct + this.pattern.length];
|
|
1732
1732
|
if (adjacentTo == len)
|
|
1733
|
-
return [-200 /*
|
|
1733
|
+
return [-200 /* CaseFold */ + -700 /* NotStart */ - word.length, adjacentStart, adjacentEnd];
|
|
1734
1734
|
if (byWordTo == len)
|
|
1735
|
-
return this.result(-100 /*
|
|
1736
|
-
(wordAdjacent ? 0 : -1100 /*
|
|
1737
|
-
return chars.length == 2 ? null : this.result((any[0] ? -700 /*
|
|
1735
|
+
return this.result(-100 /* ByWord */ + (byWordFolded ? -200 /* CaseFold */ : 0) + -700 /* NotStart */ +
|
|
1736
|
+
(wordAdjacent ? 0 : -1100 /* Gap */), byWord, word);
|
|
1737
|
+
return chars.length == 2 ? null : this.result((any[0] ? -700 /* NotStart */ : 0) + -200 /* CaseFold */ + -1100 /* Gap */, any, word);
|
|
1738
1738
|
}
|
|
1739
1739
|
result(score, positions, word) {
|
|
1740
1740
|
let result = [score - word.length], i = 1;
|
|
@@ -1792,11 +1792,11 @@ function defaultPositionInfo(view, list, option, info, space) {
|
|
|
1792
1792
|
left = true;
|
|
1793
1793
|
if (infoWidth <= (left ? spaceLeft : spaceRight)) {
|
|
1794
1794
|
offset = Math.max(space.top, Math.min(option.top, space.bottom - infoHeight)) - list.top;
|
|
1795
|
-
maxWidth = Math.min(400 /*
|
|
1795
|
+
maxWidth = Math.min(400 /* Width */, left ? spaceLeft : spaceRight);
|
|
1796
1796
|
}
|
|
1797
1797
|
else {
|
|
1798
1798
|
narrow = true;
|
|
1799
|
-
maxWidth = Math.min(400 /*
|
|
1799
|
+
maxWidth = Math.min(400 /* Width */, (rtl ? list.right : space.right - list.left) - 30 /* Margin */);
|
|
1800
1800
|
let spaceBelow = space.bottom - list.bottom;
|
|
1801
1801
|
if (spaceBelow >= infoHeight || spaceBelow > list.top) { // Below the completion
|
|
1802
1802
|
offset = option.bottom - list.top;
|
|
@@ -1812,232 +1812,6 @@ function defaultPositionInfo(view, list, option, info, space) {
|
|
|
1812
1812
|
};
|
|
1813
1813
|
}
|
|
1814
1814
|
|
|
1815
|
-
/**
|
|
1816
|
-
Returns a command that moves the completion selection forward or
|
|
1817
|
-
backward by the given amount.
|
|
1818
|
-
*/
|
|
1819
|
-
function moveCompletionSelection(forward, by = "option") {
|
|
1820
|
-
return (view) => {
|
|
1821
|
-
let cState = view.state.field(completionState, false);
|
|
1822
|
-
if (!cState || !cState.open || cState.open.disabled ||
|
|
1823
|
-
Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay)
|
|
1824
|
-
return false;
|
|
1825
|
-
let step = 1, tooltip;
|
|
1826
|
-
if (by == "page" && (tooltip = (0,view_.getTooltip)(view, cState.open.tooltip)))
|
|
1827
|
-
step = Math.max(2, Math.floor(tooltip.dom.offsetHeight /
|
|
1828
|
-
tooltip.dom.querySelector("li").offsetHeight) - 1);
|
|
1829
|
-
let { length } = cState.open.options;
|
|
1830
|
-
let selected = cState.open.selected > -1 ? cState.open.selected + step * (forward ? 1 : -1) : forward ? 0 : length - 1;
|
|
1831
|
-
if (selected < 0)
|
|
1832
|
-
selected = by == "page" ? 0 : length - 1;
|
|
1833
|
-
else if (selected >= length)
|
|
1834
|
-
selected = by == "page" ? length - 1 : 0;
|
|
1835
|
-
view.dispatch({ effects: setSelectedEffect.of(selected) });
|
|
1836
|
-
return true;
|
|
1837
|
-
};
|
|
1838
|
-
}
|
|
1839
|
-
/**
|
|
1840
|
-
Accept the current completion.
|
|
1841
|
-
*/
|
|
1842
|
-
const acceptCompletion = (view) => {
|
|
1843
|
-
let cState = view.state.field(completionState, false);
|
|
1844
|
-
if (view.state.readOnly || !cState || !cState.open || cState.open.selected < 0 ||
|
|
1845
|
-
Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay)
|
|
1846
|
-
return false;
|
|
1847
|
-
if (!cState.open.disabled)
|
|
1848
|
-
return applyCompletion(view, cState.open.options[cState.open.selected]);
|
|
1849
|
-
return true;
|
|
1850
|
-
};
|
|
1851
|
-
/**
|
|
1852
|
-
Explicitly start autocompletion.
|
|
1853
|
-
*/
|
|
1854
|
-
const startCompletion = (view) => {
|
|
1855
|
-
let cState = view.state.field(completionState, false);
|
|
1856
|
-
if (!cState)
|
|
1857
|
-
return false;
|
|
1858
|
-
view.dispatch({ effects: startCompletionEffect.of(true) });
|
|
1859
|
-
return true;
|
|
1860
|
-
};
|
|
1861
|
-
/**
|
|
1862
|
-
Close the currently active completion.
|
|
1863
|
-
*/
|
|
1864
|
-
const closeCompletion = (view) => {
|
|
1865
|
-
let cState = view.state.field(completionState, false);
|
|
1866
|
-
if (!cState || !cState.active.some(a => a.state != 0 /* State.Inactive */))
|
|
1867
|
-
return false;
|
|
1868
|
-
view.dispatch({ effects: closeCompletionEffect.of(null) });
|
|
1869
|
-
return true;
|
|
1870
|
-
};
|
|
1871
|
-
class RunningQuery {
|
|
1872
|
-
constructor(active, context) {
|
|
1873
|
-
this.active = active;
|
|
1874
|
-
this.context = context;
|
|
1875
|
-
this.time = Date.now();
|
|
1876
|
-
this.updates = [];
|
|
1877
|
-
// Note that 'undefined' means 'not done yet', whereas 'null' means
|
|
1878
|
-
// 'query returned null'.
|
|
1879
|
-
this.done = undefined;
|
|
1880
|
-
}
|
|
1881
|
-
}
|
|
1882
|
-
const DebounceTime = 50, MaxUpdateCount = 50, MinAbortTime = 1000;
|
|
1883
|
-
const completionPlugin = /*@__PURE__*/view_.ViewPlugin.fromClass(class {
|
|
1884
|
-
constructor(view) {
|
|
1885
|
-
this.view = view;
|
|
1886
|
-
this.debounceUpdate = -1;
|
|
1887
|
-
this.running = [];
|
|
1888
|
-
this.debounceAccept = -1;
|
|
1889
|
-
this.composing = 0 /* CompositionState.None */;
|
|
1890
|
-
for (let active of view.state.field(completionState).active)
|
|
1891
|
-
if (active.state == 1 /* State.Pending */)
|
|
1892
|
-
this.startQuery(active);
|
|
1893
|
-
}
|
|
1894
|
-
update(update) {
|
|
1895
|
-
let cState = update.state.field(completionState);
|
|
1896
|
-
if (!update.selectionSet && !update.docChanged && update.startState.field(completionState) == cState)
|
|
1897
|
-
return;
|
|
1898
|
-
let doesReset = update.transactions.some(tr => {
|
|
1899
|
-
return (tr.selection || tr.docChanged) && !getUserEvent(tr);
|
|
1900
|
-
});
|
|
1901
|
-
for (let i = 0; i < this.running.length; i++) {
|
|
1902
|
-
let query = this.running[i];
|
|
1903
|
-
if (doesReset ||
|
|
1904
|
-
query.updates.length + update.transactions.length > MaxUpdateCount && Date.now() - query.time > MinAbortTime) {
|
|
1905
|
-
for (let handler of query.context.abortListeners) {
|
|
1906
|
-
try {
|
|
1907
|
-
handler();
|
|
1908
|
-
}
|
|
1909
|
-
catch (e) {
|
|
1910
|
-
(0,view_.logException)(this.view.state, e);
|
|
1911
|
-
}
|
|
1912
|
-
}
|
|
1913
|
-
query.context.abortListeners = null;
|
|
1914
|
-
this.running.splice(i--, 1);
|
|
1915
|
-
}
|
|
1916
|
-
else {
|
|
1917
|
-
query.updates.push(...update.transactions);
|
|
1918
|
-
}
|
|
1919
|
-
}
|
|
1920
|
-
if (this.debounceUpdate > -1)
|
|
1921
|
-
clearTimeout(this.debounceUpdate);
|
|
1922
|
-
this.debounceUpdate = cState.active.some(a => a.state == 1 /* State.Pending */ && !this.running.some(q => q.active.source == a.source))
|
|
1923
|
-
? setTimeout(() => this.startUpdate(), DebounceTime) : -1;
|
|
1924
|
-
if (this.composing != 0 /* CompositionState.None */)
|
|
1925
|
-
for (let tr of update.transactions) {
|
|
1926
|
-
if (getUserEvent(tr) == "input")
|
|
1927
|
-
this.composing = 2 /* CompositionState.Changed */;
|
|
1928
|
-
else if (this.composing == 2 /* CompositionState.Changed */ && tr.selection)
|
|
1929
|
-
this.composing = 3 /* CompositionState.ChangedAndMoved */;
|
|
1930
|
-
}
|
|
1931
|
-
}
|
|
1932
|
-
startUpdate() {
|
|
1933
|
-
this.debounceUpdate = -1;
|
|
1934
|
-
let { state } = this.view, cState = state.field(completionState);
|
|
1935
|
-
for (let active of cState.active) {
|
|
1936
|
-
if (active.state == 1 /* State.Pending */ && !this.running.some(r => r.active.source == active.source))
|
|
1937
|
-
this.startQuery(active);
|
|
1938
|
-
}
|
|
1939
|
-
}
|
|
1940
|
-
startQuery(active) {
|
|
1941
|
-
let { state } = this.view, pos = cur(state);
|
|
1942
|
-
let context = new CompletionContext(state, pos, active.explicitPos == pos);
|
|
1943
|
-
let pending = new RunningQuery(active, context);
|
|
1944
|
-
this.running.push(pending);
|
|
1945
|
-
Promise.resolve(active.source(context)).then(result => {
|
|
1946
|
-
if (!pending.context.aborted) {
|
|
1947
|
-
pending.done = result || null;
|
|
1948
|
-
this.scheduleAccept();
|
|
1949
|
-
}
|
|
1950
|
-
}, err => {
|
|
1951
|
-
this.view.dispatch({ effects: closeCompletionEffect.of(null) });
|
|
1952
|
-
(0,view_.logException)(this.view.state, err);
|
|
1953
|
-
});
|
|
1954
|
-
}
|
|
1955
|
-
scheduleAccept() {
|
|
1956
|
-
if (this.running.every(q => q.done !== undefined))
|
|
1957
|
-
this.accept();
|
|
1958
|
-
else if (this.debounceAccept < 0)
|
|
1959
|
-
this.debounceAccept = setTimeout(() => this.accept(), DebounceTime);
|
|
1960
|
-
}
|
|
1961
|
-
// For each finished query in this.running, try to create a result
|
|
1962
|
-
// or, if appropriate, restart the query.
|
|
1963
|
-
accept() {
|
|
1964
|
-
var _a;
|
|
1965
|
-
if (this.debounceAccept > -1)
|
|
1966
|
-
clearTimeout(this.debounceAccept);
|
|
1967
|
-
this.debounceAccept = -1;
|
|
1968
|
-
let updated = [];
|
|
1969
|
-
let conf = this.view.state.facet(completionConfig);
|
|
1970
|
-
for (let i = 0; i < this.running.length; i++) {
|
|
1971
|
-
let query = this.running[i];
|
|
1972
|
-
if (query.done === undefined)
|
|
1973
|
-
continue;
|
|
1974
|
-
this.running.splice(i--, 1);
|
|
1975
|
-
if (query.done) {
|
|
1976
|
-
let active = new ActiveResult(query.active.source, query.active.explicitPos, query.done, query.done.from, (_a = query.done.to) !== null && _a !== void 0 ? _a : cur(query.updates.length ? query.updates[0].startState : this.view.state));
|
|
1977
|
-
// Replay the transactions that happened since the start of
|
|
1978
|
-
// the request and see if that preserves the result
|
|
1979
|
-
for (let tr of query.updates)
|
|
1980
|
-
active = active.update(tr, conf);
|
|
1981
|
-
if (active.hasResult()) {
|
|
1982
|
-
updated.push(active);
|
|
1983
|
-
continue;
|
|
1984
|
-
}
|
|
1985
|
-
}
|
|
1986
|
-
let current = this.view.state.field(completionState).active.find(a => a.source == query.active.source);
|
|
1987
|
-
if (current && current.state == 1 /* State.Pending */) {
|
|
1988
|
-
if (query.done == null) {
|
|
1989
|
-
// Explicitly failed. Should clear the pending status if it
|
|
1990
|
-
// hasn't been re-set in the meantime.
|
|
1991
|
-
let active = new ActiveSource(query.active.source, 0 /* State.Inactive */);
|
|
1992
|
-
for (let tr of query.updates)
|
|
1993
|
-
active = active.update(tr, conf);
|
|
1994
|
-
if (active.state != 1 /* State.Pending */)
|
|
1995
|
-
updated.push(active);
|
|
1996
|
-
}
|
|
1997
|
-
else {
|
|
1998
|
-
// Cleared by subsequent transactions. Restart.
|
|
1999
|
-
this.startQuery(current);
|
|
2000
|
-
}
|
|
2001
|
-
}
|
|
2002
|
-
}
|
|
2003
|
-
if (updated.length)
|
|
2004
|
-
this.view.dispatch({ effects: setActiveEffect.of(updated) });
|
|
2005
|
-
}
|
|
2006
|
-
}, {
|
|
2007
|
-
eventHandlers: {
|
|
2008
|
-
blur(event) {
|
|
2009
|
-
let state = this.view.state.field(completionState, false);
|
|
2010
|
-
if (state && state.tooltip && this.view.state.facet(completionConfig).closeOnBlur) {
|
|
2011
|
-
let dialog = state.open && (0,view_.getTooltip)(this.view, state.open.tooltip);
|
|
2012
|
-
if (!dialog || !dialog.dom.contains(event.relatedTarget))
|
|
2013
|
-
this.view.dispatch({ effects: closeCompletionEffect.of(null) });
|
|
2014
|
-
}
|
|
2015
|
-
},
|
|
2016
|
-
compositionstart() {
|
|
2017
|
-
this.composing = 1 /* CompositionState.Started */;
|
|
2018
|
-
},
|
|
2019
|
-
compositionend() {
|
|
2020
|
-
if (this.composing == 3 /* CompositionState.ChangedAndMoved */) {
|
|
2021
|
-
// Safari fires compositionend events synchronously, possibly
|
|
2022
|
-
// from inside an update, so dispatch asynchronously to avoid reentrancy
|
|
2023
|
-
setTimeout(() => this.view.dispatch({ effects: startCompletionEffect.of(false) }), 20);
|
|
2024
|
-
}
|
|
2025
|
-
this.composing = 0 /* CompositionState.None */;
|
|
2026
|
-
}
|
|
2027
|
-
}
|
|
2028
|
-
});
|
|
2029
|
-
function applyCompletion(view, option) {
|
|
2030
|
-
const apply = option.completion.apply || option.completion.label;
|
|
2031
|
-
let result = view.state.field(completionState).active.find(a => a.source == option.source);
|
|
2032
|
-
if (!(result instanceof ActiveResult))
|
|
2033
|
-
return false;
|
|
2034
|
-
if (typeof apply == "string")
|
|
2035
|
-
view.dispatch(Object.assign(Object.assign({}, insertCompletionText(view.state, apply, result.from, result.to)), { annotations: pickedCompletion.of(option.completion) }));
|
|
2036
|
-
else
|
|
2037
|
-
apply(view, option.completion, result.from, result.to);
|
|
2038
|
-
return true;
|
|
2039
|
-
}
|
|
2040
|
-
|
|
2041
1815
|
function optionContent(config) {
|
|
2042
1816
|
let content = config.addToOptions.slice();
|
|
2043
1817
|
if (config.icons)
|
|
@@ -2097,10 +1871,12 @@ function rangeAroundSelected(total, selected, max) {
|
|
|
2097
1871
|
return { from: total - (off + 1) * max, to: total - off * max };
|
|
2098
1872
|
}
|
|
2099
1873
|
class CompletionTooltip {
|
|
2100
|
-
constructor(view, stateField) {
|
|
1874
|
+
constructor(view, stateField, applyCompletion) {
|
|
2101
1875
|
this.view = view;
|
|
2102
1876
|
this.stateField = stateField;
|
|
1877
|
+
this.applyCompletion = applyCompletion;
|
|
2103
1878
|
this.info = null;
|
|
1879
|
+
this.infoDestroy = null;
|
|
2104
1880
|
this.placeInfoReq = {
|
|
2105
1881
|
read: () => this.measureInfo(),
|
|
2106
1882
|
write: (pos) => this.placeInfo(pos),
|
|
@@ -2121,7 +1897,7 @@ class CompletionTooltip {
|
|
|
2121
1897
|
this.dom.addEventListener("mousedown", (e) => {
|
|
2122
1898
|
for (let dom = e.target, match; dom && dom != this.dom; dom = dom.parentNode) {
|
|
2123
1899
|
if (dom.nodeName == "LI" && (match = /-(\d+)$/.exec(dom.id)) && +match[1] < options.length) {
|
|
2124
|
-
applyCompletion(view, options[+match[1]]);
|
|
1900
|
+
this.applyCompletion(view, options[+match[1]]);
|
|
2125
1901
|
e.preventDefault();
|
|
2126
1902
|
return;
|
|
2127
1903
|
}
|
|
@@ -2180,33 +1956,39 @@ class CompletionTooltip {
|
|
|
2180
1956
|
});
|
|
2181
1957
|
}
|
|
2182
1958
|
if (this.updateSelectedOption(open.selected)) {
|
|
2183
|
-
|
|
2184
|
-
this.info.remove();
|
|
2185
|
-
this.info = null;
|
|
2186
|
-
}
|
|
1959
|
+
this.destroyInfo();
|
|
2187
1960
|
let { completion } = open.options[open.selected];
|
|
2188
1961
|
let { info } = completion;
|
|
2189
1962
|
if (!info)
|
|
2190
1963
|
return;
|
|
2191
|
-
let infoResult = typeof info ===
|
|
1964
|
+
let infoResult = typeof info === "string" ? document.createTextNode(info) : info(completion);
|
|
2192
1965
|
if (!infoResult)
|
|
2193
1966
|
return;
|
|
2194
|
-
if (
|
|
2195
|
-
infoResult.then(
|
|
2196
|
-
if (
|
|
2197
|
-
this.addInfoPane(
|
|
1967
|
+
if ("then" in infoResult) {
|
|
1968
|
+
infoResult.then(obj => {
|
|
1969
|
+
if (obj && this.view.state.field(this.stateField, false) == cState)
|
|
1970
|
+
this.addInfoPane(obj, completion);
|
|
2198
1971
|
}).catch(e => (0,view_.logException)(this.view.state, e, "completion info"));
|
|
2199
1972
|
}
|
|
2200
1973
|
else {
|
|
2201
|
-
this.addInfoPane(infoResult);
|
|
1974
|
+
this.addInfoPane(infoResult, completion);
|
|
2202
1975
|
}
|
|
2203
1976
|
}
|
|
2204
1977
|
}
|
|
2205
|
-
addInfoPane(content) {
|
|
2206
|
-
|
|
2207
|
-
|
|
2208
|
-
|
|
2209
|
-
|
|
1978
|
+
addInfoPane(content, completion) {
|
|
1979
|
+
this.destroyInfo();
|
|
1980
|
+
let wrap = this.info = document.createElement("div");
|
|
1981
|
+
wrap.className = "cm-tooltip cm-completionInfo";
|
|
1982
|
+
if (content.nodeType != null) {
|
|
1983
|
+
wrap.appendChild(content);
|
|
1984
|
+
this.infoDestroy = null;
|
|
1985
|
+
}
|
|
1986
|
+
else {
|
|
1987
|
+
let { dom, destroy } = content;
|
|
1988
|
+
wrap.appendChild(dom);
|
|
1989
|
+
this.infoDestroy = destroy || null;
|
|
1990
|
+
}
|
|
1991
|
+
this.dom.appendChild(wrap);
|
|
2210
1992
|
this.view.requestMeasure(this.placeInfoReq);
|
|
2211
1993
|
}
|
|
2212
1994
|
updateSelectedOption(selected) {
|
|
@@ -2299,11 +2081,22 @@ class CompletionTooltip {
|
|
|
2299
2081
|
ul.classList.add("cm-completionListIncompleteBottom");
|
|
2300
2082
|
return ul;
|
|
2301
2083
|
}
|
|
2084
|
+
destroyInfo() {
|
|
2085
|
+
if (this.info) {
|
|
2086
|
+
if (this.infoDestroy)
|
|
2087
|
+
this.infoDestroy();
|
|
2088
|
+
this.info.remove();
|
|
2089
|
+
this.info = null;
|
|
2090
|
+
}
|
|
2091
|
+
}
|
|
2092
|
+
destroy() {
|
|
2093
|
+
this.destroyInfo();
|
|
2094
|
+
}
|
|
2302
2095
|
}
|
|
2303
2096
|
// We allocate a new function instance every time the completion
|
|
2304
2097
|
// changes to force redrawing/repositioning of the tooltip
|
|
2305
|
-
function completionTooltip(stateField) {
|
|
2306
|
-
return (view) => new CompletionTooltip(view, stateField);
|
|
2098
|
+
function completionTooltip(stateField, applyCompletion) {
|
|
2099
|
+
return (view) => new CompletionTooltip(view, stateField, applyCompletion);
|
|
2307
2100
|
}
|
|
2308
2101
|
function scrollIntoView(container, element) {
|
|
2309
2102
|
let parent = container.getBoundingClientRect();
|
|
@@ -2396,7 +2189,7 @@ class CompletionDialog {
|
|
|
2396
2189
|
static build(active, state, id, prev, conf) {
|
|
2397
2190
|
let options = sortOptions(active, state);
|
|
2398
2191
|
if (!options.length) {
|
|
2399
|
-
return prev && active.some(a => a.state == 1 /*
|
|
2192
|
+
return prev && active.some(a => a.state == 1 /* Pending */) ?
|
|
2400
2193
|
new CompletionDialog(prev.options, prev.attrs, prev.tooltip, prev.timestamp, prev.selected, true) : null;
|
|
2401
2194
|
}
|
|
2402
2195
|
let selected = state.facet(completionConfig).selectOnOpen ? 0 : -1;
|
|
@@ -2410,7 +2203,7 @@ class CompletionDialog {
|
|
|
2410
2203
|
}
|
|
2411
2204
|
return new CompletionDialog(options, makeAttrs(id, selected), {
|
|
2412
2205
|
pos: active.reduce((a, b) => b.hasResult() ? Math.min(a, b.from) : a, 1e8),
|
|
2413
|
-
create: completionTooltip(completionState),
|
|
2206
|
+
create: completionTooltip(completionState, applyCompletion),
|
|
2414
2207
|
above: conf.aboveCursor,
|
|
2415
2208
|
}, prev ? prev.timestamp : Date.now(), selected, false);
|
|
2416
2209
|
}
|
|
@@ -2433,7 +2226,7 @@ class CompletionState {
|
|
|
2433
2226
|
state.languageDataAt("autocomplete", cur(state)).map(asSource);
|
|
2434
2227
|
let active = sources.map(source => {
|
|
2435
2228
|
let value = this.active.find(s => s.source == source) ||
|
|
2436
|
-
new ActiveSource(source, this.active.some(a => a.state != 0 /*
|
|
2229
|
+
new ActiveSource(source, this.active.some(a => a.state != 0 /* Inactive */) ? 1 /* Pending */ : 0 /* Inactive */);
|
|
2437
2230
|
return value.update(tr, conf);
|
|
2438
2231
|
});
|
|
2439
2232
|
if (active.length == this.active.length && active.every((a, i) => a == this.active[i]))
|
|
@@ -2444,10 +2237,10 @@ class CompletionState {
|
|
|
2444
2237
|
if (tr.selection || active.some(a => a.hasResult() && tr.changes.touchesRange(a.from, a.to)) ||
|
|
2445
2238
|
!sameResults(active, this.active))
|
|
2446
2239
|
open = CompletionDialog.build(active, state, this.id, open, conf);
|
|
2447
|
-
else if (open && open.disabled && !active.some(a => a.state == 1 /*
|
|
2240
|
+
else if (open && open.disabled && !active.some(a => a.state == 1 /* Pending */))
|
|
2448
2241
|
open = null;
|
|
2449
|
-
if (!open && active.every(a => a.state != 1 /*
|
|
2450
|
-
active = active.map(a => a.hasResult() ? new ActiveSource(a.source, 0 /*
|
|
2242
|
+
if (!open && active.every(a => a.state != 1 /* Pending */) && active.some(a => a.hasResult()))
|
|
2243
|
+
active = active.map(a => a.hasResult() ? new ActiveSource(a.source, 0 /* Inactive */) : a);
|
|
2451
2244
|
for (let effect of tr.effects)
|
|
2452
2245
|
if (effect.is(setSelectedEffect))
|
|
2453
2246
|
open = open && open.setSelected(effect.value, this.id);
|
|
@@ -2501,13 +2294,13 @@ class ActiveSource {
|
|
|
2501
2294
|
value = value.handleUserEvent(tr, event, conf);
|
|
2502
2295
|
else if (tr.docChanged)
|
|
2503
2296
|
value = value.handleChange(tr);
|
|
2504
|
-
else if (tr.selection && value.state != 0 /*
|
|
2505
|
-
value = new ActiveSource(value.source, 0 /*
|
|
2297
|
+
else if (tr.selection && value.state != 0 /* Inactive */)
|
|
2298
|
+
value = new ActiveSource(value.source, 0 /* Inactive */);
|
|
2506
2299
|
for (let effect of tr.effects) {
|
|
2507
2300
|
if (effect.is(startCompletionEffect))
|
|
2508
|
-
value = new ActiveSource(value.source, 1 /*
|
|
2301
|
+
value = new ActiveSource(value.source, 1 /* Pending */, effect.value ? cur(tr.state) : -1);
|
|
2509
2302
|
else if (effect.is(closeCompletionEffect))
|
|
2510
|
-
value = new ActiveSource(value.source, 0 /*
|
|
2303
|
+
value = new ActiveSource(value.source, 0 /* Inactive */);
|
|
2511
2304
|
else if (effect.is(setActiveEffect))
|
|
2512
2305
|
for (let active of effect.value)
|
|
2513
2306
|
if (active.source == value.source)
|
|
@@ -2516,10 +2309,10 @@ class ActiveSource {
|
|
|
2516
2309
|
return value;
|
|
2517
2310
|
}
|
|
2518
2311
|
handleUserEvent(tr, type, conf) {
|
|
2519
|
-
return type == "delete" || !conf.activateOnTyping ? this.map(tr.changes) : new ActiveSource(this.source, 1 /*
|
|
2312
|
+
return type == "delete" || !conf.activateOnTyping ? this.map(tr.changes) : new ActiveSource(this.source, 1 /* Pending */);
|
|
2520
2313
|
}
|
|
2521
2314
|
handleChange(tr) {
|
|
2522
|
-
return tr.changes.touchesRange(cur(tr.startState)) ? new ActiveSource(this.source, 0 /*
|
|
2315
|
+
return tr.changes.touchesRange(cur(tr.startState)) ? new ActiveSource(this.source, 0 /* Inactive */) : this.map(tr.changes);
|
|
2523
2316
|
}
|
|
2524
2317
|
map(changes) {
|
|
2525
2318
|
return changes.empty || this.explicitPos < 0 ? this : new ActiveSource(this.source, this.state, changes.mapPos(this.explicitPos));
|
|
@@ -2527,7 +2320,7 @@ class ActiveSource {
|
|
|
2527
2320
|
}
|
|
2528
2321
|
class ActiveResult extends ActiveSource {
|
|
2529
2322
|
constructor(source, explicitPos, result, from, to) {
|
|
2530
|
-
super(source, 2 /*
|
|
2323
|
+
super(source, 2 /* Result */, explicitPos);
|
|
2531
2324
|
this.result = result;
|
|
2532
2325
|
this.from = from;
|
|
2533
2326
|
this.to = to;
|
|
@@ -2540,17 +2333,17 @@ class ActiveResult extends ActiveSource {
|
|
|
2540
2333
|
if ((this.explicitPos < 0 ? pos <= from : pos < this.from) ||
|
|
2541
2334
|
pos > to ||
|
|
2542
2335
|
type == "delete" && cur(tr.startState) == this.from)
|
|
2543
|
-
return new ActiveSource(this.source, type == "input" && conf.activateOnTyping ? 1 /*
|
|
2336
|
+
return new ActiveSource(this.source, type == "input" && conf.activateOnTyping ? 1 /* Pending */ : 0 /* Inactive */);
|
|
2544
2337
|
let explicitPos = this.explicitPos < 0 ? -1 : tr.changes.mapPos(this.explicitPos), updated;
|
|
2545
2338
|
if (checkValid(this.result.validFor, tr.state, from, to))
|
|
2546
2339
|
return new ActiveResult(this.source, explicitPos, this.result, from, to);
|
|
2547
2340
|
if (this.result.update &&
|
|
2548
2341
|
(updated = this.result.update(this.result, from, to, new CompletionContext(tr.state, pos, explicitPos >= 0))))
|
|
2549
2342
|
return new ActiveResult(this.source, explicitPos, updated, updated.from, (_a = updated.to) !== null && _a !== void 0 ? _a : cur(tr.state));
|
|
2550
|
-
return new ActiveSource(this.source, 1 /*
|
|
2343
|
+
return new ActiveSource(this.source, 1 /* Pending */, explicitPos);
|
|
2551
2344
|
}
|
|
2552
2345
|
handleChange(tr) {
|
|
2553
|
-
return tr.changes.touchesRange(this.from, this.to) ? new ActiveSource(this.source, 0 /*
|
|
2346
|
+
return tr.changes.touchesRange(this.from, this.to) ? new ActiveSource(this.source, 0 /* Inactive */) : this.map(tr.changes);
|
|
2554
2347
|
}
|
|
2555
2348
|
map(mapping) {
|
|
2556
2349
|
return mapping.empty ? this :
|
|
@@ -2575,6 +2368,232 @@ const completionState = /*@__PURE__*/state_.StateField.define({
|
|
|
2575
2368
|
view_.EditorView.contentAttributes.from(f, state => state.attrs)
|
|
2576
2369
|
]
|
|
2577
2370
|
});
|
|
2371
|
+
function applyCompletion(view, option) {
|
|
2372
|
+
const apply = option.completion.apply || option.completion.label;
|
|
2373
|
+
let result = view.state.field(completionState).active.find(a => a.source == option.source);
|
|
2374
|
+
if (!(result instanceof ActiveResult))
|
|
2375
|
+
return false;
|
|
2376
|
+
if (typeof apply == "string")
|
|
2377
|
+
view.dispatch(Object.assign(Object.assign({}, insertCompletionText(view.state, apply, result.from, result.to)), { annotations: pickedCompletion.of(option.completion) }));
|
|
2378
|
+
else
|
|
2379
|
+
apply(view, option.completion, result.from, result.to);
|
|
2380
|
+
return true;
|
|
2381
|
+
}
|
|
2382
|
+
|
|
2383
|
+
/**
|
|
2384
|
+
Returns a command that moves the completion selection forward or
|
|
2385
|
+
backward by the given amount.
|
|
2386
|
+
*/
|
|
2387
|
+
function moveCompletionSelection(forward, by = "option") {
|
|
2388
|
+
return (view) => {
|
|
2389
|
+
let cState = view.state.field(completionState, false);
|
|
2390
|
+
if (!cState || !cState.open || cState.open.disabled ||
|
|
2391
|
+
Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay)
|
|
2392
|
+
return false;
|
|
2393
|
+
let step = 1, tooltip;
|
|
2394
|
+
if (by == "page" && (tooltip = (0,view_.getTooltip)(view, cState.open.tooltip)))
|
|
2395
|
+
step = Math.max(2, Math.floor(tooltip.dom.offsetHeight /
|
|
2396
|
+
tooltip.dom.querySelector("li").offsetHeight) - 1);
|
|
2397
|
+
let { length } = cState.open.options;
|
|
2398
|
+
let selected = cState.open.selected > -1 ? cState.open.selected + step * (forward ? 1 : -1) : forward ? 0 : length - 1;
|
|
2399
|
+
if (selected < 0)
|
|
2400
|
+
selected = by == "page" ? 0 : length - 1;
|
|
2401
|
+
else if (selected >= length)
|
|
2402
|
+
selected = by == "page" ? length - 1 : 0;
|
|
2403
|
+
view.dispatch({ effects: setSelectedEffect.of(selected) });
|
|
2404
|
+
return true;
|
|
2405
|
+
};
|
|
2406
|
+
}
|
|
2407
|
+
/**
|
|
2408
|
+
Accept the current completion.
|
|
2409
|
+
*/
|
|
2410
|
+
const acceptCompletion = (view) => {
|
|
2411
|
+
let cState = view.state.field(completionState, false);
|
|
2412
|
+
if (view.state.readOnly || !cState || !cState.open || cState.open.selected < 0 ||
|
|
2413
|
+
Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay)
|
|
2414
|
+
return false;
|
|
2415
|
+
if (!cState.open.disabled)
|
|
2416
|
+
return applyCompletion(view, cState.open.options[cState.open.selected]);
|
|
2417
|
+
return true;
|
|
2418
|
+
};
|
|
2419
|
+
/**
|
|
2420
|
+
Explicitly start autocompletion.
|
|
2421
|
+
*/
|
|
2422
|
+
const startCompletion = (view) => {
|
|
2423
|
+
let cState = view.state.field(completionState, false);
|
|
2424
|
+
if (!cState)
|
|
2425
|
+
return false;
|
|
2426
|
+
view.dispatch({ effects: startCompletionEffect.of(true) });
|
|
2427
|
+
return true;
|
|
2428
|
+
};
|
|
2429
|
+
/**
|
|
2430
|
+
Close the currently active completion.
|
|
2431
|
+
*/
|
|
2432
|
+
const closeCompletion = (view) => {
|
|
2433
|
+
let cState = view.state.field(completionState, false);
|
|
2434
|
+
if (!cState || !cState.active.some(a => a.state != 0 /* Inactive */))
|
|
2435
|
+
return false;
|
|
2436
|
+
view.dispatch({ effects: closeCompletionEffect.of(null) });
|
|
2437
|
+
return true;
|
|
2438
|
+
};
|
|
2439
|
+
class RunningQuery {
|
|
2440
|
+
constructor(active, context) {
|
|
2441
|
+
this.active = active;
|
|
2442
|
+
this.context = context;
|
|
2443
|
+
this.time = Date.now();
|
|
2444
|
+
this.updates = [];
|
|
2445
|
+
// Note that 'undefined' means 'not done yet', whereas 'null' means
|
|
2446
|
+
// 'query returned null'.
|
|
2447
|
+
this.done = undefined;
|
|
2448
|
+
}
|
|
2449
|
+
}
|
|
2450
|
+
const DebounceTime = 50, MaxUpdateCount = 50, MinAbortTime = 1000;
|
|
2451
|
+
const completionPlugin = /*@__PURE__*/view_.ViewPlugin.fromClass(class {
|
|
2452
|
+
constructor(view) {
|
|
2453
|
+
this.view = view;
|
|
2454
|
+
this.debounceUpdate = -1;
|
|
2455
|
+
this.running = [];
|
|
2456
|
+
this.debounceAccept = -1;
|
|
2457
|
+
this.composing = 0 /* None */;
|
|
2458
|
+
for (let active of view.state.field(completionState).active)
|
|
2459
|
+
if (active.state == 1 /* Pending */)
|
|
2460
|
+
this.startQuery(active);
|
|
2461
|
+
}
|
|
2462
|
+
update(update) {
|
|
2463
|
+
let cState = update.state.field(completionState);
|
|
2464
|
+
if (!update.selectionSet && !update.docChanged && update.startState.field(completionState) == cState)
|
|
2465
|
+
return;
|
|
2466
|
+
let doesReset = update.transactions.some(tr => {
|
|
2467
|
+
return (tr.selection || tr.docChanged) && !getUserEvent(tr);
|
|
2468
|
+
});
|
|
2469
|
+
for (let i = 0; i < this.running.length; i++) {
|
|
2470
|
+
let query = this.running[i];
|
|
2471
|
+
if (doesReset ||
|
|
2472
|
+
query.updates.length + update.transactions.length > MaxUpdateCount && Date.now() - query.time > MinAbortTime) {
|
|
2473
|
+
for (let handler of query.context.abortListeners) {
|
|
2474
|
+
try {
|
|
2475
|
+
handler();
|
|
2476
|
+
}
|
|
2477
|
+
catch (e) {
|
|
2478
|
+
(0,view_.logException)(this.view.state, e);
|
|
2479
|
+
}
|
|
2480
|
+
}
|
|
2481
|
+
query.context.abortListeners = null;
|
|
2482
|
+
this.running.splice(i--, 1);
|
|
2483
|
+
}
|
|
2484
|
+
else {
|
|
2485
|
+
query.updates.push(...update.transactions);
|
|
2486
|
+
}
|
|
2487
|
+
}
|
|
2488
|
+
if (this.debounceUpdate > -1)
|
|
2489
|
+
clearTimeout(this.debounceUpdate);
|
|
2490
|
+
this.debounceUpdate = cState.active.some(a => a.state == 1 /* Pending */ && !this.running.some(q => q.active.source == a.source))
|
|
2491
|
+
? setTimeout(() => this.startUpdate(), DebounceTime) : -1;
|
|
2492
|
+
if (this.composing != 0 /* None */)
|
|
2493
|
+
for (let tr of update.transactions) {
|
|
2494
|
+
if (getUserEvent(tr) == "input")
|
|
2495
|
+
this.composing = 2 /* Changed */;
|
|
2496
|
+
else if (this.composing == 2 /* Changed */ && tr.selection)
|
|
2497
|
+
this.composing = 3 /* ChangedAndMoved */;
|
|
2498
|
+
}
|
|
2499
|
+
}
|
|
2500
|
+
startUpdate() {
|
|
2501
|
+
this.debounceUpdate = -1;
|
|
2502
|
+
let { state } = this.view, cState = state.field(completionState);
|
|
2503
|
+
for (let active of cState.active) {
|
|
2504
|
+
if (active.state == 1 /* Pending */ && !this.running.some(r => r.active.source == active.source))
|
|
2505
|
+
this.startQuery(active);
|
|
2506
|
+
}
|
|
2507
|
+
}
|
|
2508
|
+
startQuery(active) {
|
|
2509
|
+
let { state } = this.view, pos = cur(state);
|
|
2510
|
+
let context = new CompletionContext(state, pos, active.explicitPos == pos);
|
|
2511
|
+
let pending = new RunningQuery(active, context);
|
|
2512
|
+
this.running.push(pending);
|
|
2513
|
+
Promise.resolve(active.source(context)).then(result => {
|
|
2514
|
+
if (!pending.context.aborted) {
|
|
2515
|
+
pending.done = result || null;
|
|
2516
|
+
this.scheduleAccept();
|
|
2517
|
+
}
|
|
2518
|
+
}, err => {
|
|
2519
|
+
this.view.dispatch({ effects: closeCompletionEffect.of(null) });
|
|
2520
|
+
(0,view_.logException)(this.view.state, err);
|
|
2521
|
+
});
|
|
2522
|
+
}
|
|
2523
|
+
scheduleAccept() {
|
|
2524
|
+
if (this.running.every(q => q.done !== undefined))
|
|
2525
|
+
this.accept();
|
|
2526
|
+
else if (this.debounceAccept < 0)
|
|
2527
|
+
this.debounceAccept = setTimeout(() => this.accept(), DebounceTime);
|
|
2528
|
+
}
|
|
2529
|
+
// For each finished query in this.running, try to create a result
|
|
2530
|
+
// or, if appropriate, restart the query.
|
|
2531
|
+
accept() {
|
|
2532
|
+
var _a;
|
|
2533
|
+
if (this.debounceAccept > -1)
|
|
2534
|
+
clearTimeout(this.debounceAccept);
|
|
2535
|
+
this.debounceAccept = -1;
|
|
2536
|
+
let updated = [];
|
|
2537
|
+
let conf = this.view.state.facet(completionConfig);
|
|
2538
|
+
for (let i = 0; i < this.running.length; i++) {
|
|
2539
|
+
let query = this.running[i];
|
|
2540
|
+
if (query.done === undefined)
|
|
2541
|
+
continue;
|
|
2542
|
+
this.running.splice(i--, 1);
|
|
2543
|
+
if (query.done) {
|
|
2544
|
+
let active = new ActiveResult(query.active.source, query.active.explicitPos, query.done, query.done.from, (_a = query.done.to) !== null && _a !== void 0 ? _a : cur(query.updates.length ? query.updates[0].startState : this.view.state));
|
|
2545
|
+
// Replay the transactions that happened since the start of
|
|
2546
|
+
// the request and see if that preserves the result
|
|
2547
|
+
for (let tr of query.updates)
|
|
2548
|
+
active = active.update(tr, conf);
|
|
2549
|
+
if (active.hasResult()) {
|
|
2550
|
+
updated.push(active);
|
|
2551
|
+
continue;
|
|
2552
|
+
}
|
|
2553
|
+
}
|
|
2554
|
+
let current = this.view.state.field(completionState).active.find(a => a.source == query.active.source);
|
|
2555
|
+
if (current && current.state == 1 /* Pending */) {
|
|
2556
|
+
if (query.done == null) {
|
|
2557
|
+
// Explicitly failed. Should clear the pending status if it
|
|
2558
|
+
// hasn't been re-set in the meantime.
|
|
2559
|
+
let active = new ActiveSource(query.active.source, 0 /* Inactive */);
|
|
2560
|
+
for (let tr of query.updates)
|
|
2561
|
+
active = active.update(tr, conf);
|
|
2562
|
+
if (active.state != 1 /* Pending */)
|
|
2563
|
+
updated.push(active);
|
|
2564
|
+
}
|
|
2565
|
+
else {
|
|
2566
|
+
// Cleared by subsequent transactions. Restart.
|
|
2567
|
+
this.startQuery(current);
|
|
2568
|
+
}
|
|
2569
|
+
}
|
|
2570
|
+
}
|
|
2571
|
+
if (updated.length)
|
|
2572
|
+
this.view.dispatch({ effects: setActiveEffect.of(updated) });
|
|
2573
|
+
}
|
|
2574
|
+
}, {
|
|
2575
|
+
eventHandlers: {
|
|
2576
|
+
blur(event) {
|
|
2577
|
+
let state = this.view.state.field(completionState, false);
|
|
2578
|
+
if (state && state.tooltip && this.view.state.facet(completionConfig).closeOnBlur) {
|
|
2579
|
+
let dialog = state.open && (0,view_.getTooltip)(this.view, state.open.tooltip);
|
|
2580
|
+
if (!dialog || !dialog.dom.contains(event.relatedTarget))
|
|
2581
|
+
this.view.dispatch({ effects: closeCompletionEffect.of(null) });
|
|
2582
|
+
}
|
|
2583
|
+
},
|
|
2584
|
+
compositionstart() {
|
|
2585
|
+
this.composing = 1 /* Started */;
|
|
2586
|
+
},
|
|
2587
|
+
compositionend() {
|
|
2588
|
+
if (this.composing == 3 /* ChangedAndMoved */) {
|
|
2589
|
+
// Safari fires compositionend events synchronously, possibly
|
|
2590
|
+
// from inside an update, so dispatch asynchronously to avoid reentrancy
|
|
2591
|
+
setTimeout(() => this.view.dispatch({ effects: startCompletionEffect.of(false) }), 20);
|
|
2592
|
+
}
|
|
2593
|
+
this.composing = 0 /* None */;
|
|
2594
|
+
}
|
|
2595
|
+
}
|
|
2596
|
+
});
|
|
2578
2597
|
|
|
2579
2598
|
const dist_baseTheme = /*@__PURE__*/view_.EditorView.baseTheme({
|
|
2580
2599
|
".cm-tooltip.cm-tooltip-autocomplete": {
|
|
@@ -2631,13 +2650,13 @@ const dist_baseTheme = /*@__PURE__*/view_.EditorView.baseTheme({
|
|
|
2631
2650
|
position: "absolute",
|
|
2632
2651
|
padding: "3px 9px",
|
|
2633
2652
|
width: "max-content",
|
|
2634
|
-
maxWidth: `${400 /*
|
|
2653
|
+
maxWidth: `${400 /* Width */}px`,
|
|
2635
2654
|
boxSizing: "border-box"
|
|
2636
2655
|
},
|
|
2637
2656
|
".cm-completionInfo.cm-completionInfo-left": { right: "100%" },
|
|
2638
2657
|
".cm-completionInfo.cm-completionInfo-right": { left: "100%" },
|
|
2639
|
-
".cm-completionInfo.cm-completionInfo-left-narrow": { right: `${30 /*
|
|
2640
|
-
".cm-completionInfo.cm-completionInfo-right-narrow": { left: `${30 /*
|
|
2658
|
+
".cm-completionInfo.cm-completionInfo-left-narrow": { right: `${30 /* Margin */}px` },
|
|
2659
|
+
".cm-completionInfo.cm-completionInfo-right-narrow": { left: `${30 /* Margin */}px` },
|
|
2641
2660
|
"&light .cm-snippetField": { backgroundColor: "#00000022" },
|
|
2642
2661
|
"&dark .cm-snippetField": { backgroundColor: "#ffffff22" },
|
|
2643
2662
|
".cm-snippetFieldPosition": {
|
|
@@ -2990,7 +3009,7 @@ function storeWords(doc, wordRE, result, seen, ignoreAt) {
|
|
|
2990
3009
|
if (!seen[m[0]] && pos + m.index != ignoreAt) {
|
|
2991
3010
|
result.push({ type: "text", label: m[0] });
|
|
2992
3011
|
seen[m[0]] = true;
|
|
2993
|
-
if (result.length >= 2000 /*
|
|
3012
|
+
if (result.length >= 2000 /* MaxList */)
|
|
2994
3013
|
return;
|
|
2995
3014
|
}
|
|
2996
3015
|
}
|
|
@@ -2998,7 +3017,7 @@ function storeWords(doc, wordRE, result, seen, ignoreAt) {
|
|
|
2998
3017
|
}
|
|
2999
3018
|
}
|
|
3000
3019
|
function collectWords(doc, cache, wordRE, to, ignoreAt) {
|
|
3001
|
-
let big = doc.length >= 1000 /*
|
|
3020
|
+
let big = doc.length >= 1000 /* MinCacheLen */;
|
|
3002
3021
|
let cached = big && cache.get(doc);
|
|
3003
3022
|
if (cached)
|
|
3004
3023
|
return cached;
|
|
@@ -3006,7 +3025,7 @@ function collectWords(doc, cache, wordRE, to, ignoreAt) {
|
|
|
3006
3025
|
if (doc.children) {
|
|
3007
3026
|
let pos = 0;
|
|
3008
3027
|
for (let ch of doc.children) {
|
|
3009
|
-
if (ch.length >= 1000 /*
|
|
3028
|
+
if (ch.length >= 1000 /* MinCacheLen */) {
|
|
3010
3029
|
for (let c of collectWords(ch, cache, wordRE, to - pos, ignoreAt - pos)) {
|
|
3011
3030
|
if (!seen[c.label]) {
|
|
3012
3031
|
seen[c.label] = true;
|
|
@@ -3023,7 +3042,7 @@ function collectWords(doc, cache, wordRE, to, ignoreAt) {
|
|
|
3023
3042
|
else {
|
|
3024
3043
|
storeWords(doc, wordRE, result, seen, ignoreAt);
|
|
3025
3044
|
}
|
|
3026
|
-
if (big && result.length < 2000 /*
|
|
3045
|
+
if (big && result.length < 2000 /* MaxList */)
|
|
3027
3046
|
cache.set(doc, result);
|
|
3028
3047
|
return result;
|
|
3029
3048
|
}
|
|
@@ -3039,7 +3058,7 @@ const completeAnyWord = context => {
|
|
|
3039
3058
|
if (!token && !context.explicit)
|
|
3040
3059
|
return null;
|
|
3041
3060
|
let from = token ? token.from : context.pos;
|
|
3042
|
-
let options = collectWords(context.state.doc, wordCache(wordChars), re, 50000 /*
|
|
3061
|
+
let options = collectWords(context.state.doc, wordCache(wordChars), re, 50000 /* Range */, from);
|
|
3043
3062
|
return { from, options, validFor: mapRE(re, s => "^" + s) };
|
|
3044
3063
|
};
|
|
3045
3064
|
|
|
@@ -3331,8 +3350,8 @@ returns `null`.
|
|
|
3331
3350
|
*/
|
|
3332
3351
|
function completionStatus(state) {
|
|
3333
3352
|
let cState = state.field(completionState, false);
|
|
3334
|
-
return cState && cState.active.some(a => a.state == 1 /*
|
|
3335
|
-
: cState && cState.active.some(a => a.state != 0 /*
|
|
3353
|
+
return cState && cState.active.some(a => a.state == 1 /* Pending */) ? "pending"
|
|
3354
|
+
: cState && cState.active.some(a => a.state != 0 /* Inactive */) ? "active" : null;
|
|
3336
3355
|
}
|
|
3337
3356
|
const completionArrayCache = /*@__PURE__*/new WeakMap;
|
|
3338
3357
|
/**
|
|
@@ -7641,14 +7660,14 @@ class LanguageState {
|
|
|
7641
7660
|
// state updates with parse work beyond the viewport.
|
|
7642
7661
|
let upto = this.context.treeLen == tr.startState.doc.length ? undefined
|
|
7643
7662
|
: Math.max(tr.changes.mapPos(this.context.treeLen), newCx.viewport.to);
|
|
7644
|
-
if (!newCx.work(20 /*
|
|
7663
|
+
if (!newCx.work(20 /* Apply */, upto))
|
|
7645
7664
|
newCx.takeTree();
|
|
7646
7665
|
return new LanguageState(newCx);
|
|
7647
7666
|
}
|
|
7648
7667
|
static init(state) {
|
|
7649
|
-
let vpTo = Math.min(3000 /*
|
|
7668
|
+
let vpTo = Math.min(3000 /* InitViewport */, state.doc.length);
|
|
7650
7669
|
let parseState = ParseContext.create(state.facet(language).parser, state, { from: 0, to: vpTo });
|
|
7651
|
-
if (!parseState.work(20 /*
|
|
7670
|
+
if (!parseState.work(20 /* Apply */, vpTo))
|
|
7652
7671
|
parseState.takeTree();
|
|
7653
7672
|
return new LanguageState(parseState);
|
|
7654
7673
|
}
|
|
@@ -7665,14 +7684,14 @@ Language.state = /*@__PURE__*/state_.StateField.define({
|
|
|
7665
7684
|
}
|
|
7666
7685
|
});
|
|
7667
7686
|
let requestIdle = (callback) => {
|
|
7668
|
-
let timeout = setTimeout(() => callback(), 500 /*
|
|
7687
|
+
let timeout = setTimeout(() => callback(), 500 /* MaxPause */);
|
|
7669
7688
|
return () => clearTimeout(timeout);
|
|
7670
7689
|
};
|
|
7671
7690
|
if (typeof requestIdleCallback != "undefined")
|
|
7672
7691
|
requestIdle = (callback) => {
|
|
7673
7692
|
let idle = -1, timeout = setTimeout(() => {
|
|
7674
|
-
idle = requestIdleCallback(callback, { timeout: 500 /*
|
|
7675
|
-
}, 100 /*
|
|
7693
|
+
idle = requestIdleCallback(callback, { timeout: 500 /* MaxPause */ - 100 /* MinPause */ });
|
|
7694
|
+
}, 100 /* MinPause */);
|
|
7676
7695
|
return () => idle < 0 ? clearTimeout(timeout) : cancelIdleCallback(idle);
|
|
7677
7696
|
};
|
|
7678
7697
|
const isInputPending = typeof navigator != "undefined" && ((_a = navigator.scheduling) === null || _a === void 0 ? void 0 : _a.isInputPending)
|
|
@@ -7695,7 +7714,7 @@ const parseWorker = /*@__PURE__*/view_.ViewPlugin.fromClass(class ParseWorker {
|
|
|
7695
7714
|
this.scheduleWork();
|
|
7696
7715
|
if (update.docChanged) {
|
|
7697
7716
|
if (this.view.hasFocus)
|
|
7698
|
-
this.chunkBudget += 50 /*
|
|
7717
|
+
this.chunkBudget += 50 /* ChangeBonus */;
|
|
7699
7718
|
this.scheduleWork();
|
|
7700
7719
|
}
|
|
7701
7720
|
this.checkAsyncSchedule(cx);
|
|
@@ -7711,19 +7730,19 @@ const parseWorker = /*@__PURE__*/view_.ViewPlugin.fromClass(class ParseWorker {
|
|
|
7711
7730
|
this.working = null;
|
|
7712
7731
|
let now = Date.now();
|
|
7713
7732
|
if (this.chunkEnd < now && (this.chunkEnd < 0 || this.view.hasFocus)) { // Start a new chunk
|
|
7714
|
-
this.chunkEnd = now + 30000 /*
|
|
7715
|
-
this.chunkBudget = 3000 /*
|
|
7733
|
+
this.chunkEnd = now + 30000 /* ChunkTime */;
|
|
7734
|
+
this.chunkBudget = 3000 /* ChunkBudget */;
|
|
7716
7735
|
}
|
|
7717
7736
|
if (this.chunkBudget <= 0)
|
|
7718
7737
|
return; // No more budget
|
|
7719
7738
|
let { state, viewport: { to: vpTo } } = this.view, field = state.field(Language.state);
|
|
7720
|
-
if (field.tree == field.context.tree && field.context.isDone(vpTo + 100000 /*
|
|
7739
|
+
if (field.tree == field.context.tree && field.context.isDone(vpTo + 100000 /* MaxParseAhead */))
|
|
7721
7740
|
return;
|
|
7722
|
-
let endTime = Date.now() + Math.min(this.chunkBudget, 100 /*
|
|
7741
|
+
let endTime = Date.now() + Math.min(this.chunkBudget, 100 /* Slice */, deadline && !isInputPending ? Math.max(25 /* MinSlice */, deadline.timeRemaining() - 5) : 1e9);
|
|
7723
7742
|
let viewportFirst = field.context.treeLen < vpTo && state.doc.length > vpTo + 1000;
|
|
7724
7743
|
let done = field.context.work(() => {
|
|
7725
7744
|
return isInputPending && isInputPending() || Date.now() > endTime;
|
|
7726
|
-
}, vpTo + (viewportFirst ? 0 : 100000 /*
|
|
7745
|
+
}, vpTo + (viewportFirst ? 0 : 100000 /* MaxParseAhead */));
|
|
7727
7746
|
this.chunkBudget -= Date.now() - now;
|
|
7728
7747
|
if (done || this.chunkBudget <= 0) {
|
|
7729
7748
|
field.context.takeTree();
|
|
@@ -8165,13 +8184,20 @@ class TreeIndentContext extends IndentContext {
|
|
|
8165
8184
|
on if it is covered by another such node.
|
|
8166
8185
|
*/
|
|
8167
8186
|
get baseIndent() {
|
|
8168
|
-
|
|
8187
|
+
return this.baseIndentFor(this.node);
|
|
8188
|
+
}
|
|
8189
|
+
/**
|
|
8190
|
+
Get the indentation for the reference line of the given node
|
|
8191
|
+
(see [`baseIndent`](https://codemirror.net/6/docs/ref/#language.TreeIndentContext.baseIndent)).
|
|
8192
|
+
*/
|
|
8193
|
+
baseIndentFor(node) {
|
|
8194
|
+
let line = this.state.doc.lineAt(node.from);
|
|
8169
8195
|
// Skip line starts that are covered by a sibling (or cousin, etc)
|
|
8170
8196
|
for (;;) {
|
|
8171
|
-
let atBreak =
|
|
8197
|
+
let atBreak = node.resolve(line.from);
|
|
8172
8198
|
while (atBreak.parent && atBreak.parent.from == atBreak.from)
|
|
8173
8199
|
atBreak = atBreak.parent;
|
|
8174
|
-
if (isParent(atBreak,
|
|
8200
|
+
if (isParent(atBreak, node))
|
|
8175
8201
|
break;
|
|
8176
8202
|
line = this.state.doc.lineAt(atBreak.from);
|
|
8177
8203
|
}
|
|
@@ -9303,7 +9329,7 @@ class StreamLanguage extends (/* unused pure expression or super */ null && (Lan
|
|
|
9303
9329
|
state = this.streamParser.startState(cx.unit);
|
|
9304
9330
|
statePos = 0;
|
|
9305
9331
|
}
|
|
9306
|
-
if (pos - statePos > 10000 /*
|
|
9332
|
+
if (pos - statePos > 10000 /* MaxIndentScanDist */)
|
|
9307
9333
|
return null;
|
|
9308
9334
|
while (statePos < pos) {
|
|
9309
9335
|
let line = cx.state.doc.lineAt(statePos), end = Math.min(pos, line.to);
|
|
@@ -9385,7 +9411,7 @@ class Parse {
|
|
|
9385
9411
|
this.chunks.push(tree.children[i]);
|
|
9386
9412
|
this.chunkPos.push(tree.positions[i]);
|
|
9387
9413
|
}
|
|
9388
|
-
if (context && this.parsedPos < context.viewport.from - 100000 /*
|
|
9414
|
+
if (context && this.parsedPos < context.viewport.from - 100000 /* MaxDistanceBeforeViewport */) {
|
|
9389
9415
|
this.state = this.lang.streamParser.startState(getIndentUnit(context.state));
|
|
9390
9416
|
context.skipUntilInView(this.parsedPos, context.viewport.from);
|
|
9391
9417
|
this.parsedPos = context.viewport.from;
|
|
@@ -9395,7 +9421,7 @@ class Parse {
|
|
|
9395
9421
|
advance() {
|
|
9396
9422
|
let context = ParseContext.get();
|
|
9397
9423
|
let parseEnd = this.stoppedAt == null ? this.to : Math.min(this.to, this.stoppedAt);
|
|
9398
|
-
let end = Math.min(parseEnd, this.chunkStart + 2048 /*
|
|
9424
|
+
let end = Math.min(parseEnd, this.chunkStart + 2048 /* ChunkSize */);
|
|
9399
9425
|
if (context)
|
|
9400
9426
|
end = Math.min(end, context.viewport.to);
|
|
9401
9427
|
while (this.parsedPos < end)
|
|
@@ -9479,7 +9505,7 @@ class Parse {
|
|
|
9479
9505
|
let token = readToken(streamParser.token, stream, this.state);
|
|
9480
9506
|
if (token)
|
|
9481
9507
|
offset = this.emitToken(this.lang.tokenTable.resolve(token), this.parsedPos + stream.start, this.parsedPos + stream.pos, 4, offset);
|
|
9482
|
-
if (stream.start > 10000 /*
|
|
9508
|
+
if (stream.start > 10000 /* MaxLineLength */)
|
|
9483
9509
|
break;
|
|
9484
9510
|
}
|
|
9485
9511
|
}
|
|
@@ -9495,7 +9521,7 @@ class Parse {
|
|
|
9495
9521
|
length: this.parsedPos - this.chunkStart,
|
|
9496
9522
|
nodeSet,
|
|
9497
9523
|
topID: 0,
|
|
9498
|
-
maxBufferLength: 2048 /*
|
|
9524
|
+
maxBufferLength: 2048 /* ChunkSize */,
|
|
9499
9525
|
reused: this.chunkReused
|
|
9500
9526
|
});
|
|
9501
9527
|
tree = new Tree(tree.type, tree.children, tree.positions, tree.length, [[this.lang.stateAfter, this.lang.streamParser.copyState(this.state)]]);
|