public bool TryGetApplicableToSpan(char typedChar, SnapshotPoint triggerPt, out SnapshotSpan applicableToSpan, CancellationToken token) { ThreadHelper.ThrowIfNotOnUIThread(); _mode = CompletionMode.None; _fileName = VsTextUtil.TryGetDocumentFileName(_textView.TextBuffer); _appSettings = ProbeEnvironment.CurrentAppSettings; var tracker = Classifier.TextBufferStateTracker.GetTrackerForTextBuffer(triggerPt.Snapshot.TextBuffer); var state = tracker.GetStateForPosition(triggerPt, _fileName, _appSettings); if (Classifier.State.IsInLiveCode(state)) { Match match; var line = triggerPt.Snapshot.GetLineFromPosition(triggerPt.Position); var prefix = line.GetTextUpToPosition(triggerPt); if (typedChar == ' ') { #region Assignment or Comparison if ((match = _rxAfterAssignOrCompare.Match(prefix)).Success) { _mode = CompletionMode.AfterAssignOrCompare; applicableToSpan = triggerPt.ToSnapshotSpan(); _params.str = match.Groups[1].Value; _params.pt = new SnapshotPoint(line.Snapshot, match.Groups[1].Index + line.Start.Position); return(true); } #endregion #region #ifdef else if ((match = _rxAfterIfDef.Match(prefix)).Success) { _mode = CompletionMode.AfterIfDef; applicableToSpan = triggerPt.ToSnapshotSpan(); return(true); } #endregion #region Comma else if (prefix.EndsWith(", ")) { _mode = CompletionMode.AfterComma; applicableToSpan = triggerPt.ToSnapshotSpan(); return(true); } #endregion #region order by else if ((match = _rxOrderBy.Match(prefix)).Success) { _mode = CompletionMode.AfterOrderBy; applicableToSpan = triggerPt.ToSnapshotSpan(); return(true); } #endregion #region After Word else if ((match = _rxAfterWord.Match(prefix)).Success) { switch (match.Groups[1].Value) { case "case": _mode = CompletionMode.AfterCase; applicableToSpan = triggerPt.ToSnapshotSpan(); return(true); case "extract": _mode = CompletionMode.AfterExtract; applicableToSpan = triggerPt.ToSnapshotSpan(); _params.str = match.Groups[1].Value; return(true); case "return": _mode = CompletionMode.AfterReturn; applicableToSpan = triggerPt.ToSnapshotSpan(); return(true); case "tag": _mode = CompletionMode.AfterTag; applicableToSpan = triggerPt.ToSnapshotSpan(); return(true); default: _mode = CompletionMode.AfterWord; applicableToSpan = triggerPt.ToSnapshotSpan(); _params.str = match.Groups[1].Value; _params.snapshot = triggerPt.Snapshot; return(true); } } #endregion #region After Symbol else if ((match = _rxAfterSymbol.Match(prefix)).Success) { _mode = CompletionMode.AfterSymbol; applicableToSpan = triggerPt.ToSnapshotSpan(); return(true); } #endregion #region After Number else if ((match = _rxAfterNumber.Match(prefix)).Success) { _mode = CompletionMode.AfterNumber; applicableToSpan = triggerPt.ToSnapshotSpan(); return(true); } #endregion #region After String Literal else if ((match = _rxAfterStringLiteral.Match(prefix)).Success) { _mode = CompletionMode.AfterStringLiteral; applicableToSpan = triggerPt.ToSnapshotSpan(); return(true); } #endregion } #region Table.Field else if ((match = _rxTypingTable.Match(prefix)).Success) { _mode = CompletionMode.DotSeparatedWords; applicableToSpan = new SnapshotSpan(triggerPt.Snapshot, match.Groups[2].Index + line.Start.Position, match.Groups[2].Length); _params.str = match.Groups[1].Value; _params.str2 = match.Groups[2].Value; return(true); } #endregion #region Word else if ((match = _rxTypingWord.Match(prefix)).Success) { // Typing a regular word. _mode = CompletionMode.Word; _params.pt = new SnapshotPoint(triggerPt.Snapshot, line.Start.Position + match.Index); applicableToSpan = new SnapshotSpan(_params.pt, match.Length); return(true); } #endregion #region Class function bracket else if ((match = _rxClassFunctionStartBracket.Match(prefix)).Success) { _mode = CompletionMode.ClassFunction; applicableToSpan = triggerPt.ToSnapshotSpan(); _params.str = match.Groups[1].Value; _params.str2 = match.Groups[2].Value; return(true); } #endregion #region Function bracket else if ((match = _rxFunctionStartBracket.Match(prefix)).Success) { _mode = CompletionMode.Function; applicableToSpan = triggerPt.ToSnapshotSpan(); _params.str = match.Groups[1].Value; return(true); } #endregion #region #include else if ((match = _rxAfterInclude.Match(prefix)).Success) { _mode = CompletionMode.Include; applicableToSpan = triggerPt.ToSnapshotSpan(); _params.str = match.Groups[1].Value; return(true); } #endregion } else { if ((state & State.StringLiteral_Mask) != 0) { Match match; var line = triggerPt.Snapshot.GetLineFromPosition(triggerPt.Position); var prefix = line.GetTextUpToPosition(triggerPt); #region #include (for string literal) if ((match = _rxAfterInclude.Match(prefix)).Success) { _mode = CompletionMode.Include; applicableToSpan = triggerPt.ToSnapshotSpan(); _params.str = match.Groups[1].Value; return(true); } #endregion } } applicableToSpan = new SnapshotSpan(triggerPt.Snapshot, new Span(0, 0)); return(false); }