private TokenTagCollection MatchSquareBrackets(SnapshotSpan span) { var tokenTags = new TokenTagCollection(span); tokenTags.SetClassifierTag(GLSLTokenTypes.SquareBracket); int start = span.Start; if (!_squareBracketBuilder.Start.HasValue) { _squareBracketBuilder.Start = start; string text = span.Snapshot.GetText(); int end = GetClosingPosition(text, start, '[', ']', _squareBracketBuilder); if (end >= 0) { _squareBracketBuilder.End = end + 1; var bracketSpan = _squareBracketBuilder.ToSpan(); _squareBracketBuilder.Clear(); int outlineEnd = _squareBracketBuilder.ConsumeUntil(text, start, "\r", "\n"); if (outlineEnd >= 0 && outlineEnd < end) { var collapseText = text.Substring(start, outlineEnd - start) + "...]"; var tagSpan = new TagSpan <GLSLOutlineTag>(bracketSpan, new GLSLOutlineTag(SQUARE_TOKEN_TYPE, collapseText)); tokenTags.AddOutlineTagSpan(tagSpan); _squareBracketSpans.Add(tagSpan); } } } return(tokenTags); }
private TokenTagCollection MatchParentheses(SnapshotSpan span) { var tokenTags = new TokenTagCollection(span); tokenTags.SetClassifierTag(GLSLTokenTypes.Parenthesis); int start = span.Start; if (!_parenthesisBuilder.Start.HasValue) { _parenthesisBuilder.Start = start; string text = span.Snapshot.GetText(); int end = GetClosingPosition(text, start, '(', ')', _parenthesisBuilder); if (end >= 0) { _parenthesisBuilder.End = end + 1; var parenthesisSpan = _parenthesisBuilder.ToSpan(); _parenthesisBuilder.Clear(); int outlineEnd = _parenthesisBuilder.ConsumeUntil(text, start, "\r", "\n"); if (outlineEnd >= 0 && outlineEnd < end) { var collapseText = text.Substring(start, outlineEnd - start) + "...)"; var tagSpan = new TagSpan <GLSLOutlineTag>(parenthesisSpan, new GLSLOutlineTag(PARENTHESIS_TOKEN_TYPE, collapseText)); tokenTags.AddOutlineTagSpan(tagSpan); _parenthesisSpans.Add(tagSpan); } } } return(tokenTags); }
public TokenTagCollection Match(SnapshotSpan span) { _builder.Snapshot = span.Snapshot; var tokenTags = new TokenTagCollection(span); string token = span.GetText(); int position = span.Start + token.Length; if (token.StartsWith("#")) { int start = position - token.Length; if (!_builder.Start.HasValue) { _builder.Start = start; string text = span.Snapshot.GetText(); int nConsumed = _builder.ConsumeUntil(text, start, "\r", "\n"); if (nConsumed >= 0) { _builder.End = _builder.Start + nConsumed; var preprocessorSpan = _builder.ToSpan(); _builder.Clear(); _spans.Add(preprocessorSpan); tokenTags.Consumed = preprocessorSpan.Length - token.Length; tokenTags.ClassifierTagSpan = new TagSpan <GLSLClassifierTag>(preprocessorSpan, new GLSLClassifierTag(TOKEN_TYPE)); } } } return(tokenTags); }
private int GetClosingPosition(string text, int start, char openingCharacter, char closingCharacter, SpanBuilder spanBuilder) { int position = spanBuilder.ConsumeUntil(text, start, openingCharacter.ToString(), closingCharacter.ToString()); if (position >= 0) { if (text[position] == openingCharacter) { int end = GetClosingPosition(text, position, openingCharacter, closingCharacter, spanBuilder); int doubleEnd = GetClosingPosition(text, end, openingCharacter, closingCharacter, spanBuilder); return(doubleEnd); } else { return(position); } } return(-1); }
private string GetCollapseText(SpanBuilder spanBuilder, string text, int position, char closingChar) { int spanEnd = spanBuilder.End.Value - 1; int outlineEnd = spanBuilder.ConsumeUntil(text, position, "\r", "\n"); if (outlineEnd >= 0) { var collapseText = new StringBuilder(); if (spanEnd > outlineEnd) { collapseText.Append(text.Substring(position, outlineEnd - position)); } collapseText.Append("..." + closingChar); return(collapseText.ToString()); } return(GLSLOutlineTag.COLLAPSE_TEXT); }
public TokenTagCollection Match(SnapshotSpan span) { _singleLineCommentBuilder.Snapshot = span.Snapshot; _multiLineCommentBuilder.Snapshot = span.Snapshot; var tokenTags = new TokenTagCollection(span); string token = span.GetText(); int position = span.Start + token.Length; if (token.Contains("//")) { int tokenIndex = token.IndexOf("//"); int start = position - token.Length + tokenIndex; if (!_singleLineCommentBuilder.Start.HasValue) { _singleLineCommentBuilder.Start = start; string text = span.Snapshot.GetText(); int end = _singleLineCommentBuilder.ConsumeUntil(text, start, "\r", "\n"); if (end >= 0) { _singleLineCommentBuilder.End = end; var commentSpan = _singleLineCommentBuilder.ToSpan(); _singleLineCommentBuilder.Clear(); var commentTagSpan = new TagSpan <GLSLClassifierTag>(commentSpan, new GLSLClassifierTag(TOKEN_TYPE)); _singleLineComments.Add(commentTagSpan); tokenTags.Consumed = commentSpan.Length - token.Length; } } } if (token.Contains("/*")) { int tokenIndex = token.IndexOf("/*"); int start = position - token.Length + tokenIndex; if (!_multiLineCommentBuilder.Start.HasValue) { _multiLineCommentBuilder.Start = start; string text = span.Snapshot.GetText(); int end = _multiLineCommentBuilder.ConsumeUntil(text, start, "*/"); if (end >= 0) { _multiLineCommentBuilder.End = end + 1; var commentSpan = _multiLineCommentBuilder.ToSpan(); _multiLineCommentBuilder.Clear(); var commentTagSpan = new TagSpan <IGLSLTag>(commentSpan, new GLSLClassifierTag(TOKEN_TYPE)); _multiLineComments.Add(commentTagSpan); int outlineEnd = _multiLineCommentBuilder.ConsumeUntil(text, start, "\r", "\n"); if (outlineEnd >= 0) { var outlineTagSpan = new TagSpan <IGLSLTag>(commentSpan, new GLSLOutlineTag(TOKEN_TYPE, text.Substring(start, outlineEnd - start) + "...*/")); _multiLineComments.Add(outlineTagSpan); } tokenTags.Consumed = commentSpan.Length - token.Length; } } } tokenTags.SetClassifierTag(_singleLineComments); tokenTags.SetClassifierTag(_multiLineComments.OfType <TagSpan <GLSLClassifierTag> >()); tokenTags.AddOutlineTagSpans(_multiLineComments.OfType <TagSpan <GLSLOutlineTag> >()); return(tokenTags); }