Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/microsoft/vs-editor-api.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/Editor/Language/Def/Intellisense/Snippet/ExpansionTemplate.cs')
-rw-r--r--src/Editor/Language/Def/Intellisense/Snippet/ExpansionTemplate.cs148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/Editor/Language/Def/Intellisense/Snippet/ExpansionTemplate.cs b/src/Editor/Language/Def/Intellisense/Snippet/ExpansionTemplate.cs
new file mode 100644
index 0000000..356d2bd
--- /dev/null
+++ b/src/Editor/Language/Def/Intellisense/Snippet/ExpansionTemplate.cs
@@ -0,0 +1,148 @@
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for license information.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+
+namespace Microsoft.VisualStudio.Text.Editor.Expansion
+{
+ public class ExpansionTemplate
+ {
+ private string snippetFullText;
+ private readonly List<ExpansionField> tokens = new List<ExpansionField>();
+ private int selectedOffset;
+ private int editOffset;
+ private string snippetFirst;
+ private string snippetLast;
+
+ public CodeSnippet Snippet { get; set; }
+
+ public ExpansionTemplate(string filePath)
+ :this(CodeSnippet.ReadSnippetsFromFile(filePath).First())
+ {
+
+ }
+
+ public ExpansionTemplate(CodeSnippet snippet)
+ {
+ Snippet = snippet;
+ Parse();
+ }
+
+ private void Parse()
+ {
+ foreach (var field in Snippet.Fields)
+ {
+ tokens.Add(field);
+ }
+
+ var matches = Regex.Matches(Snippet.Code, @"\$(\w+)\$");
+
+ var total = new StringBuilder();
+ int index = 0;
+ int indexCorrection = 0;
+ foreach (Match match in matches)
+ {
+ string fieldName = match.Groups[1].Value;
+ string substitution = GetDefaultValue(fieldName) ?? "";
+ if (match.Index > index)
+ {
+ total.Append(Snippet.Code.Substring(index, match.Index - index));
+ }
+
+ AddToken(total.Length, fieldName);
+ total.Append(substitution);
+
+ index = match.Index + match.Length;
+ indexCorrection += substitution.Length;
+ }
+
+ if (index <= Snippet.Code.Length - 1)
+ {
+ total.Append(Snippet.Code.Substring(index, Snippet.Code.Length - index));
+ }
+
+ this.snippetFullText = total.ToString();
+ this.snippetFirst = snippetFullText.Substring(0, selectedOffset);
+ this.snippetLast = snippetFullText.Substring(selectedOffset, snippetFullText.Length - selectedOffset);
+ }
+
+ private string GetDefaultValue(string fieldName)
+ {
+ ExpansionField field = FindField(fieldName);
+ if (field == null)
+ {
+ return null;
+ }
+
+ return field.Default;
+ }
+
+ private void AddToken(int position, string fieldName)
+ {
+ ExpansionField field = FindField(fieldName);
+ if (field != null)
+ {
+ field.AddOffset(position);
+ }
+ else if (fieldName == "selected")
+ {
+ this.selectedOffset = position;
+ }
+ else if (fieldName == "end")
+ {
+ this.editOffset = position;
+ }
+ }
+
+ private ExpansionField FindField(string fieldName)
+ {
+ return tokens.FirstOrDefault(t => t.ID == fieldName);
+ }
+
+ public string GetCodeSnippet()
+ {
+ return snippetFullText;
+ }
+
+ public int GetSelectedOffset()
+ {
+ return selectedOffset;
+ }
+
+ public int GetEditOffset()
+ {
+ return editOffset;
+ }
+
+ public string GetCodeSnippet(bool all, bool first)
+ {
+ if (all)
+ {
+ return snippetFullText;
+ }
+ else if (first)
+ {
+ return snippetFirst;
+ }
+ else
+ {
+ return snippetLast;
+ }
+ }
+
+ public IEnumerable<ExpansionField> Fields
+ {
+ get
+ {
+ return tokens;
+ }
+ }
+ }
+}