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

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Krüger <mkrueger@xamarin.com>2016-07-22 22:32:49 +0300
committerMike Krüger <mkrueger@xamarin.com>2016-07-22 22:32:49 +0300
commit22bfaea3f85a685c174f86f079c107f5ea8f3313 (patch)
tree4ab2b0b92077a6c4fae7fb7f100e8b1661d78342 /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates
parenteb6bfaeaee8ee9ba9340f662980a2ab1dabe6f0e (diff)
[Ide] Added support for text mate snippets.
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates')
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateService.cs82
1 files changed, 80 insertions, 2 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateService.cs
index 5c93ac6cb8..4aaa2ccf96 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateService.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateService.cs
@@ -37,6 +37,9 @@ using MonoDevelop.Core;
using MonoDevelop.Ide.CodeCompletion;
using Mono.Addins;
using System.Linq;
+using MonoDevelop.Ide.Editor;
+using MonoDevelop.Ide.Editor.Highlighting;
+using System.Text;
namespace MonoDevelop.Ide.CodeTemplates
{
@@ -88,10 +91,85 @@ namespace MonoDevelop.Ide.CodeTemplates
{
var savedTemplates = templates;
if (savedTemplates == null || string.IsNullOrEmpty (mimeType))
- return new CodeTemplate[0];
+ return new CodeTemplate [0];
return savedTemplates.ToArray ().Where (t => t != null && t.MimeType == mimeType);
}
-
+
+ public static IEnumerable<CodeTemplate> GetCodeTemplates (TextEditor editor)
+ {
+ foreach (var template in GetCodeTemplates (editor.MimeType))
+ yield return template;
+
+ var scope = editor.SyntaxHighlighting.GetLinStartScopeStack (editor.GetLine (editor.CaretLine));
+ foreach (var setting in SyntaxHighlightingService.GetSnippets (scope)) {
+ var convertedTemplate = ConvertToTemplate (setting);
+ if (convertedTemplate != null)
+ yield return convertedTemplate;
+ }
+ }
+
+ static CodeTemplate ConvertToTemplate (TmSnippet setting)
+ {
+ var result = new CodeTemplate ();
+ result.Shortcut = setting.TabTrigger;
+ var sb = new StringBuilder ();
+ var nameBuilder = new StringBuilder ();
+ bool readDollar = false;
+ bool invariable = false;
+ bool invariablename = false;
+ int number = 0;
+ foreach (var ch in setting.Content) {
+ if (ch == '$') {
+ readDollar = true;
+ continue;
+ }
+ if (readDollar) {
+ if (ch == '{') {
+ number = 0;
+ invariable = true;
+ readDollar = false;
+ continue;
+ } else {
+ sb.Append ("$$");
+ readDollar = false;
+ }
+ }
+ if (invariable) {
+ if (ch == ':') {
+ invariable = false;
+ invariablename = true;
+ continue;
+ }
+ number = number * 10 + (ch - '0');
+ continue;
+ }
+
+ if (invariablename) {
+ if (ch == '}') {
+ if (number == 0) {
+ sb.Append ("$end$");
+ sb.Append (nameBuilder);
+ } else {
+ sb.Append ("$" + nameBuilder + "$");
+ result.AddVariable (new CodeTemplateVariable (nameBuilder.ToString ()) { Default = nameBuilder.ToString (), IsEditable = true });
+ }
+ nameBuilder.Length = 0;
+ number = 0;
+ invariablename = false;
+ continue;
+ }
+ nameBuilder.Append (ch);
+ continue;
+ }
+ sb.Append (ch);
+ }
+
+ result.Code = sb.ToString ();
+ result.CodeTemplateContext = CodeTemplateContext.Standard;
+ result.CodeTemplateType = CodeTemplateType.Expansion;
+ return result;
+ }
+
public static IEnumerable<CodeTemplate> GetCodeTemplatesForFile (string fileName)
{
return GetCodeTemplates (DesktopService.GetMimeTypeForUri (fileName));