aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense')
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ClassCompletionItem.cs32
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ClassCompletionItemPopup.cs25
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/CompletionItem.cs49
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/CompletionItemPopupControl.cs14
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/EnumCompletionItem.cs21
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/EnumCompletionItemPopup.cs25
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/FieldCompletionItem.cs20
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/FieldCompletionItemPopup.cs25
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ICompletionItem.cs14
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ICompletionProvider.cs13
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/InterfaceCompletionItem.cs21
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/InterfaceCompletionItemPopup.cs25
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs222
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeConstructor.cs28
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeField.cs21
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeMember.cs31
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeMethod.cs42
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeMethodParameter.cs16
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeProperty.cs21
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/MethodCompletionItem.cs47
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/MethodCompletionItemPopup.cs25
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/NamespaceCompletionItem.cs27
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/NamespaceCompletionItemPopup.cs25
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/PropertyCompletionItem.cs22
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/PropertyCompletionItemPopup.cs25
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/StructCompletionItem.cs21
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/StructCompletionItemPopup.cs25
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/Utils.cs171
28 files changed, 1053 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ClassCompletionItem.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ClassCompletionItem.cs
new file mode 100644
index 000000000..a1734ba30
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ClassCompletionItem.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class ClassCompletionItem : CompletionItem
+ {
+ private static BitmapSource image = GetImage("class.png");
+
+ public override BitmapSource Image => image;
+ public override string Text => Name;
+
+ public String Name { get; set; }
+ public String Namespace { get; set; }
+ public override CompletionItemPopupControl PopupControl => new ClassCompletionItemPopup();
+
+ public override void Complete(ScriptEditor editor)
+ {
+ base.Complete(editor);
+
+ if (Text.Contains("<T>"))
+ {
+ editor.CaretOffset -= 2;
+ editor.Select(editor.CaretOffset, 1);
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ClassCompletionItemPopup.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ClassCompletionItemPopup.cs
new file mode 100644
index 000000000..d575ba9db
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ClassCompletionItemPopup.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class ClassCompletionItemPopup : CompletionItemPopupControl
+ {
+ static ClassCompletionItemPopup()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(ClassCompletionItemPopup), new FrameworkPropertyMetadata(typeof(ClassCompletionItemPopup)));
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/CompletionItem.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/CompletionItem.cs
new file mode 100644
index 000000000..c8beebd28
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/CompletionItem.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Media.Imaging;
+using Tango.Scripting.Editors.Document;
+using Tango.Scripting.Editors.Editing;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public abstract class CompletionItem : DependencyObject, ICompletionItem
+ {
+ public abstract string Text { get; }
+ public object Description { get; set; }
+ public double Priority { get; set; }
+ public abstract CompletionItemPopupControl PopupControl { get; }
+
+ public bool IsSelected
+ {
+ get { return (bool)GetValue(IsSelectedProperty); }
+ set { SetValue(IsSelectedProperty, value); }
+ }
+ public static readonly DependencyProperty IsSelectedProperty =
+ DependencyProperty.Register("IsSelected", typeof(bool), typeof(CompletionItem), new PropertyMetadata(false));
+
+ public virtual void Complete(ScriptEditor editor)
+ {
+ var word = editor.GetCurrentWord();
+ int index = editor.GetCurrentWordStartIndex();
+ int max = editor.GetCurrentLine().EndOffset;
+
+ editor.Document.Replace(index, word.Length,Text);
+ }
+
+ public abstract BitmapSource Image { get; }
+
+ protected static BitmapSource GetImage(String name)
+ {
+ return new BitmapImage(new Uri($"pack://application:,,,/Tango.Scripting.Editors;component/Images/{name}", UriKind.Absolute));
+ }
+
+ public override string ToString()
+ {
+ return Text;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/CompletionItemPopupControl.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/CompletionItemPopupControl.cs
new file mode 100644
index 000000000..14e5b6681
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/CompletionItemPopupControl.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Controls;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public abstract class CompletionItemPopupControl : Control
+ {
+
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/EnumCompletionItem.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/EnumCompletionItem.cs
new file mode 100644
index 000000000..c8f34347e
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/EnumCompletionItem.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class EnumCompletionItem : CompletionItem
+ {
+ private static BitmapSource image = GetImage("enum.png");
+
+ public override BitmapSource Image => image;
+ public override string Text => Name;
+ public override CompletionItemPopupControl PopupControl => new EnumCompletionItemPopup();
+
+ public String Name { get; set; }
+ public String Namespace { get; set; }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/EnumCompletionItemPopup.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/EnumCompletionItemPopup.cs
new file mode 100644
index 000000000..0ef29c338
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/EnumCompletionItemPopup.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class EnumCompletionItemPopup : CompletionItemPopupControl
+ {
+ static EnumCompletionItemPopup()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(EnumCompletionItemPopup), new FrameworkPropertyMetadata(typeof(EnumCompletionItemPopup)));
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/FieldCompletionItem.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/FieldCompletionItem.cs
new file mode 100644
index 000000000..3b1996174
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/FieldCompletionItem.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class FieldCompletionItem : CompletionItem
+ {
+ public override string Text => Name;
+ public override CompletionItemPopupControl PopupControl => new FieldCompletionItemPopup();
+ public override BitmapSource Image => GetImage("field.png");
+
+ public String Name { get; set; }
+ public String Class { get; set; }
+ public String Type { get; set; }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/FieldCompletionItemPopup.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/FieldCompletionItemPopup.cs
new file mode 100644
index 000000000..e1ea3ce55
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/FieldCompletionItemPopup.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class FieldCompletionItemPopup : CompletionItemPopupControl
+ {
+ static FieldCompletionItemPopup()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(FieldCompletionItemPopup), new FrameworkPropertyMetadata(typeof(FieldCompletionItemPopup)));
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ICompletionItem.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ICompletionItem.cs
new file mode 100644
index 000000000..83e304e8b
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ICompletionItem.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Scripting.Editors.CodeCompletion;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public interface ICompletionItem : ICompletionData
+ {
+ CompletionItemPopupControl PopupControl { get; }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ICompletionProvider.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ICompletionProvider.cs
new file mode 100644
index 000000000..bc48ce401
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/ICompletionProvider.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public interface ICompletionProvider
+ {
+
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/InterfaceCompletionItem.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/InterfaceCompletionItem.cs
new file mode 100644
index 000000000..56f6db7af
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/InterfaceCompletionItem.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class InterfaceCompletionItem : CompletionItem
+ {
+ private static BitmapSource image = GetImage("interface.png");
+
+ public override string Text => Name;
+ public override CompletionItemPopupControl PopupControl => new InterfaceCompletionItemPopup();
+ public override BitmapSource Image => image;
+
+ public String Name { get; set; }
+ public String Namespace { get; set; }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/InterfaceCompletionItemPopup.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/InterfaceCompletionItemPopup.cs
new file mode 100644
index 000000000..126a81c4c
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/InterfaceCompletionItemPopup.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class InterfaceCompletionItemPopup : CompletionItemPopupControl
+ {
+ static InterfaceCompletionItemPopup()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(InterfaceCompletionItemPopup), new FrameworkPropertyMetadata(typeof(InterfaceCompletionItemPopup)));
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs
new file mode 100644
index 000000000..28f9ccb9a
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs
@@ -0,0 +1,222 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml;
+using Tango.Core;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class KnownType
+ {
+ private bool _initialized;
+ private bool _documentationLoaded;
+
+ public Type Type { get; private set; }
+ public String Name { get; private set; }
+ public String TypeDefinition { get; private set; }
+ public String FriendlyName { get; private set; }
+ public String Summary { get; set; }
+ public List<KnownTypeConstructor> Constructors { get; set; }
+ public List<KnownTypeMethod> Methods { get; set; }
+ public List<KnownTypeProperty> Properties { get; set; }
+ public List<KnownTypeMember> Members
+ {
+ get
+ {
+ List<KnownTypeMember> members = new List<KnownTypeMember>();
+
+ members.AddRange(Properties);
+ members.AddRange(Methods);
+
+ return members.OrderBy(x => x.Name).ToList();
+ }
+ }
+ public List<KnownTypeField> Fields { get; set; }
+
+ public KnownType(Type type)
+ {
+ Summary = "Loading documentation...";
+ Constructors = new List<KnownTypeConstructor>();
+ Methods = new List<KnownTypeMethod>();
+ Properties = new List<KnownTypeProperty>();
+ Fields = new List<KnownTypeField>();
+ Type = type;
+ Name = type.Name;
+
+ Init();
+ }
+
+ public override string ToString()
+ {
+ return Type.ToString();
+ }
+
+ private void Init()
+ {
+ InitTypeDefinition();
+ InitFriendlyName();
+ InitType();
+ }
+
+ private void InitFriendlyName()
+ {
+ FriendlyName = Type.GetFriendlyName();
+ }
+
+ private void InitTypeDefinition()
+ {
+ if (Type.IsClass) TypeDefinition = "class";
+ else if (Type.IsEnum) TypeDefinition = "enum";
+ else if (Type.IsInterface) TypeDefinition = "interface";
+ else if (Type.IsValueType) TypeDefinition = "struct";
+ }
+
+ private void InitType()
+ {
+ if (!_initialized)
+ {
+ _initialized = true;
+
+ //Load Constructors...
+ {
+ var constructors = Type.GetConstructors().Where(x => x.IsPublic).ToList();
+
+ for (int i = 0; i < constructors.Count; i++)
+ {
+ var constructor = constructors[i];
+
+ KnownTypeConstructor c = new KnownTypeConstructor(this);
+
+ var parameters = constructor.GetParameters().ToList();
+
+ for (int j = 0; j < parameters.Count; j++)
+ {
+ var parameter = parameters[j];
+
+ KnownTypeMethodParameter p = new KnownTypeMethodParameter();
+ p.Type = parameter.ParameterType.GetFriendlyName();
+ p.Name = parameter.Name;
+
+ if (j == parameters.Count - 1)
+ {
+ p.IsLast = true;
+ }
+
+ c.Parameters.Add(p);
+ }
+
+ Constructors.Add(c);
+ }
+ }
+
+ //Load Methods...
+ {
+ var methods = Type.GetRuntimeMethods().Where(x => x.IsPublic && !x.IsSpecialName).ToList();
+
+ //TODO: Separate extension methods!
+ methods.AddRange(Type.GetExtensionMethods(Type.Assembly).ToList());
+
+ if (typeof(IEnumerable).IsAssignableFrom(Type))
+ {
+ var linqMethods = typeof(System.Linq.Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public).ToList();
+ methods.AddRange(linqMethods);
+ }
+
+ for (int i = 0; i < methods.Count; i++)
+ {
+ var method = methods[i];
+
+ KnownTypeMethod m = new KnownTypeMethod(this);
+ m.Name = method.Name;
+ m.ReturnType = method.ReturnType;
+ m.ReturnTypeFriendlyName = method.ReturnType.GetFriendlyName();
+
+ if (method.IsGenericMethod)
+ {
+ foreach (var lGenericArgument in method.GetGenericMethodDefinition().GetGenericArguments())
+ {
+ m.TypeArguments.Add(lGenericArgument.Name);
+ }
+ }
+
+ var parameters = method.GetParameters().ToList();
+
+ bool isLinq = method.DeclaringType == typeof(Enumerable);
+
+ for (int j = 0; j < parameters.Count; j++)
+ {
+ var parameter = parameters[j];
+
+ KnownTypeMethodParameter p = new KnownTypeMethodParameter();
+ p.Type = parameter.ParameterType.GetFriendlyName();
+ p.Name = parameter.Name;
+
+ if (j == parameters.Count - 1)
+ {
+ p.IsLast = true;
+ }
+
+ if (j == 0 && isLinq) continue;
+ m.Parameters.Add(p);
+ }
+
+ Methods.Add(m);
+ }
+ }
+
+ //Load Properties
+ {
+ var properties = Type.GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(x => x.PropertyType.IsPublic).ToList();
+
+ for (int i = 0; i < properties.Count; i++)
+ {
+ var property = properties[i];
+
+ KnownTypeProperty p = new KnownTypeProperty(this);
+ p.Name = property.Name;
+ p.ReturnType = property.PropertyType;
+ p.ReturnTypeFriendlyName = property.PropertyType.GetFriendlyName();
+
+ Properties.Add(p);
+ }
+ }
+
+ //Load Enum Values
+ {
+ if (Type.IsEnum)
+ {
+ var values = Enum.GetNames(Type).ToList();
+
+ for (int i = 0; i < values.Count; i++)
+ {
+ var value = values[i];
+
+ KnownTypeField f = new KnownTypeField(this);
+ f.Name = value;
+ f.ReturnType = typeof(Int32);
+ f.ReturnTypeFriendlyName = typeof(Int32).Name;
+ Fields.Add(f);
+ }
+ }
+ }
+
+ _initialized = true;
+ }
+ }
+
+ public void LoadDocumentation()
+ {
+ if (!_documentationLoaded)
+ {
+ _documentationLoaded = true;
+
+ Utils.LoadKnownTypeDocs(this);
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeConstructor.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeConstructor.cs
new file mode 100644
index 000000000..83dc3f750
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeConstructor.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class KnownTypeConstructor
+ {
+ public KnownType Type { get; set; }
+
+ public String Summary { get; set; }
+
+ public List<KnownTypeMethodParameter> Parameters { get; set; }
+
+ public KnownTypeConstructor()
+ {
+ Summary = "Loading documentation...";
+ Parameters = new List<KnownTypeMethodParameter>();
+ }
+
+ public KnownTypeConstructor(KnownType knownType) : this()
+ {
+ Type = knownType;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeField.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeField.cs
new file mode 100644
index 000000000..cd1349744
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeField.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class KnownTypeField : KnownTypeMember
+ {
+ public KnownTypeField()
+ {
+ Summary = "Loading documentation...";
+ }
+
+ public KnownTypeField(KnownType knownType) : this()
+ {
+ Type = knownType;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeMember.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeMember.cs
new file mode 100644
index 000000000..bae4edf41
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeMember.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public abstract class KnownTypeMember
+ {
+ public Type ReturnType { get; set; }
+
+ public String ReturnTypeFriendlyName { get; set; }
+
+ public KnownType Type { get; set; }
+
+ public String Summary { get; set; }
+
+ public String Name { get; set; }
+
+ public KnownTypeMember()
+ {
+ Summary = "Loading documentation...";
+ }
+
+ public KnownTypeMember(KnownType knownType) : this()
+ {
+ Type = knownType;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeMethod.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeMethod.cs
new file mode 100644
index 000000000..f84e26fe5
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeMethod.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class KnownTypeMethod : KnownTypeMember
+ {
+ public List<KnownTypeMethodParameter> Parameters { get; set; }
+
+ public List<String> TypeArguments { get; set; }
+
+ public String NameWithTypeArguments
+ {
+ get
+ {
+ if (TypeArguments.Count == 0)
+ {
+ return Name;
+ }
+ else
+ {
+ return Name + $"<{String.Join(",", TypeArguments)}>";
+ }
+ }
+ }
+
+ public KnownTypeMethod()
+ {
+ Summary = "Loading documentation...";
+ Parameters = new List<KnownTypeMethodParameter>();
+ TypeArguments = new List<string>();
+ }
+
+ public KnownTypeMethod(KnownType knownType) : this()
+ {
+ Type = knownType;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeMethodParameter.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeMethodParameter.cs
new file mode 100644
index 000000000..59f6db4fd
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeMethodParameter.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class KnownTypeMethodParameter
+ {
+ public String Type { get; set; }
+ public String Name { get; set; }
+ public String Description { get; set; }
+ public bool IsLast { get; set; }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeProperty.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeProperty.cs
new file mode 100644
index 000000000..52717579a
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownTypeProperty.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class KnownTypeProperty : KnownTypeMember
+ {
+ public KnownTypeProperty()
+ {
+ Summary = "Loading documentation...";
+ }
+
+ public KnownTypeProperty(KnownType knownType) : this()
+ {
+ Type = knownType;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/MethodCompletionItem.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/MethodCompletionItem.cs
new file mode 100644
index 000000000..d2ee40920
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/MethodCompletionItem.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class MethodCompletionItem : CompletionItem
+ {
+ private static BitmapSource image = GetImage("method.png");
+
+ public override string Text => Name;
+ public override CompletionItemPopupControl PopupControl => new MethodCompletionItemPopup();
+ public override BitmapSource Image => image;
+
+ public String Class { get; set; }
+ public String Name { get; set; }
+ public String ReturnType { get; set; }
+
+ public int Overloads { get; set; }
+
+ public bool HasOverloads
+ {
+ get { return Overloads > 0; }
+ }
+
+ public List<KnownTypeMethodParameter> Parameters { get; set; }
+
+ public override void Complete(ScriptEditor editor)
+ {
+ base.Complete(editor);
+
+ if (Text.Contains("<T>"))
+ {
+ editor.CaretOffset -= 2;
+ editor.Select(editor.CaretOffset, 1);
+ }
+ }
+
+ public MethodCompletionItem()
+ {
+ Parameters = new List<KnownTypeMethodParameter>();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/MethodCompletionItemPopup.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/MethodCompletionItemPopup.cs
new file mode 100644
index 000000000..1b9717307
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/MethodCompletionItemPopup.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class MethodCompletionItemPopup : CompletionItemPopupControl
+ {
+ static MethodCompletionItemPopup()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(MethodCompletionItemPopup), new FrameworkPropertyMetadata(typeof(MethodCompletionItemPopup)));
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/NamespaceCompletionItem.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/NamespaceCompletionItem.cs
new file mode 100644
index 000000000..d5c8db38a
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/NamespaceCompletionItem.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class NamespaceCompletionItem : CompletionItem
+ {
+ private static BitmapSource image = GetImage("namespace.png");
+
+ public override string Text => Name;
+ public override CompletionItemPopupControl PopupControl => new NamespaceCompletionItemPopup();
+ public override BitmapSource Image => image;
+
+ public String Name { get; set; }
+ public String Assembly { get; set; }
+
+ public override void Complete(ScriptEditor editor)
+ {
+ var line = editor.GetCurrentLine();
+ editor.Document.Replace(line, "using " + Name);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/NamespaceCompletionItemPopup.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/NamespaceCompletionItemPopup.cs
new file mode 100644
index 000000000..7adc82fd8
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/NamespaceCompletionItemPopup.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class NamespaceCompletionItemPopup : CompletionItemPopupControl
+ {
+ static NamespaceCompletionItemPopup()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(NamespaceCompletionItemPopup), new FrameworkPropertyMetadata(typeof(NamespaceCompletionItemPopup)));
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/PropertyCompletionItem.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/PropertyCompletionItem.cs
new file mode 100644
index 000000000..c301e8ede
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/PropertyCompletionItem.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class PropertyCompletionItem : CompletionItem
+ {
+ private static BitmapSource image = GetImage("property.png");
+
+ public override string Text => Name;
+ public override CompletionItemPopupControl PopupControl => new PropertyCompletionItemPopup();
+ public override BitmapSource Image => image;
+
+ public String Name { get; set; }
+ public String Class { get; set; }
+ public String Type { get; set; }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/PropertyCompletionItemPopup.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/PropertyCompletionItemPopup.cs
new file mode 100644
index 000000000..7790d6c43
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/PropertyCompletionItemPopup.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class PropertyCompletionItemPopup : CompletionItemPopupControl
+ {
+ static PropertyCompletionItemPopup()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(PropertyCompletionItemPopup), new FrameworkPropertyMetadata(typeof(PropertyCompletionItemPopup)));
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/StructCompletionItem.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/StructCompletionItem.cs
new file mode 100644
index 000000000..b89a7cee2
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/StructCompletionItem.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class StructCompletionItem : CompletionItem
+ {
+ private static BitmapSource image = GetImage("struct.png");
+
+ public override string Text => Name;
+ public override CompletionItemPopupControl PopupControl => new StructCompletionItemPopup();
+ public override BitmapSource Image => image;
+
+ public String Name { get; set; }
+ public String Namespace { get; set; }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/StructCompletionItemPopup.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/StructCompletionItemPopup.cs
new file mode 100644
index 000000000..09512f405
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/StructCompletionItemPopup.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public class StructCompletionItemPopup : CompletionItemPopupControl
+ {
+ static StructCompletionItemPopup()
+ {
+ DefaultStyleKeyProperty.OverrideMetadata(typeof(StructCompletionItemPopup), new FrameworkPropertyMetadata(typeof(StructCompletionItemPopup)));
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/Utils.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/Utils.cs
new file mode 100644
index 000000000..f8cc7072d
--- /dev/null
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/Utils.cs
@@ -0,0 +1,171 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml;
+
+namespace Tango.Scripting.Editors.Intellisense
+{
+ public static class Utils
+ {
+ private static String dotNetXmlFolder = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.X";
+ private static Dictionary<Assembly, XmlDocument> _assemblies_docs_cache;
+
+ static Utils()
+ {
+ _assemblies_docs_cache = new Dictionary<Assembly, XmlDocument>();
+ }
+
+ public static void LoadKnownTypeDocs(KnownType knownType)
+ {
+ XmlDocument xmlDoc = null;
+
+ if (_assemblies_docs_cache.ContainsKey(knownType.Type.Assembly))
+ {
+ xmlDoc = _assemblies_docs_cache[knownType.Type.Assembly];
+ }
+
+ if (xmlDoc == null)
+ {
+ String dllPath = knownType.Type.Assembly.Location;
+
+ string docuPath = dllPath.Substring(0, dllPath.LastIndexOf(".")) + ".XML";
+
+ if (File.Exists(docuPath))
+ {
+ xmlDoc = new XmlDocument();
+ xmlDoc.Load(docuPath);
+ }
+ else if (File.Exists(System.IO.Path.Combine(dotNetXmlFolder, System.IO.Path.GetFileName(docuPath))))
+ {
+ xmlDoc = new XmlDocument();
+ xmlDoc.Load(System.IO.Path.Combine(dotNetXmlFolder, System.IO.Path.GetFileName(docuPath)));
+ }
+
+ if (xmlDoc != null)
+ {
+ _assemblies_docs_cache.Add(knownType.Type.Assembly, xmlDoc);
+ }
+ }
+
+ if (xmlDoc == null)
+ {
+ xmlDoc = new XmlDocument();
+ }
+
+ //Load Type Summary
+ {
+ string path = "T:" + knownType.Type.FullName;
+ XmlNode xmlDocuOfType = xmlDoc.SelectSingleNode("//member[starts-with(@name, '" + path + "')]");
+
+ if (xmlDocuOfType != null)
+ {
+ XmlNode summaryNode = xmlDocuOfType.SelectSingleNode("summary");
+ knownType.Summary = summaryNode.InnerText;
+ }
+ }
+
+ //Load Constructors...
+ {
+ string path = "M:" + knownType.Type.FullName + ".#ctor";
+
+ var docNodes = xmlDoc.SelectNodes("//member[starts-with(@name, '" + path + "')]").OfType<XmlNode>().ToList();
+
+ for (int i = 0; i < knownType.Constructors.Count; i++)
+ {
+ var constructor = knownType.Constructors[i];
+ XmlNode cDoc = null;
+
+ if (i < docNodes.Count)
+ {
+ cDoc = docNodes[i];
+ }
+
+ constructor.Summary = cDoc != null ? cDoc.SelectSingleNode("summary").InnerXml : $"Initializes a new instance of {knownType.FriendlyName}.";
+
+ var parameters = constructor.Parameters.ToList();
+ var parametersNodes = cDoc != null ? cDoc.SelectNodes("param").OfType<XmlNode>().ToList() : new List<XmlNode>();
+
+ for (int j = 0; j < parameters.Count; j++)
+ {
+ var parameter = parameters[j];
+ XmlNode pNode = null;
+
+ if (j < parametersNodes.Count)
+ {
+ pNode = parametersNodes[j];
+ }
+
+ parameter.Description = pNode != null ? pNode.InnerText : null;
+ }
+ }
+ }
+
+ //Load Methods...
+ {
+ string path = "M:" + knownType.Type.FullName;
+
+ var docNodes = xmlDoc.SelectNodes("//member[starts-with(@name, '" + path + "')]").OfType<XmlNode>().ToList();
+
+ for (int i = 0; i < knownType.Methods.Count; i++)
+ {
+ var method = knownType.Methods[i];
+ XmlNode mDoc = null;
+
+ mDoc = docNodes.FirstOrDefault(x => x.Attributes["name"].InnerText.Contains(knownType.Type.Name + "." + method.Name));
+ method.Summary = mDoc != null ? mDoc.SelectSingleNode("summary").InnerXml.Remove("(<see cref=\".:)|(\" \\/>)") : "No documentation";
+
+ var parameters = method.Parameters.ToList();
+ var parametersNodes = mDoc != null ? mDoc.SelectNodes("param").OfType<XmlNode>().ToList() : new List<XmlNode>();
+
+ bool isLinq = knownType.Type == typeof(Enumerable);
+
+ for (int j = 0; j < parameters.Count; j++)
+ {
+ var parameter = parameters[j];
+
+ XmlNode pNode = null;
+
+ if (j < parametersNodes.Count)
+ {
+ pNode = parametersNodes[j];
+ }
+
+ parameter.Description = pNode != null ? pNode.InnerText.Remove("(<see cref=\".:)|(\" \\/>)") : null;
+ }
+ }
+ }
+
+ //Load Properties
+ {
+ string path = "P:" + knownType.Type.FullName;
+
+ var docNodes = xmlDoc.SelectNodes("//member[starts-with(@name, '" + path + "')]").OfType<XmlNode>().ToList();
+
+ for (int i = 0; i < knownType.Properties.Count; i++)
+ {
+ var property = knownType.Properties[i];
+ var pDoc = docNodes.FirstOrDefault(x => x.Attributes["name"].InnerText.Contains(knownType.Type.Name + "." + property.Name));
+
+ property.Summary = pDoc != null ? pDoc.SelectSingleNode("summary").InnerXml : "No documentation";
+ }
+ }
+
+ //Load Enum Values
+ {
+ if (knownType.Type.IsEnum)
+ {
+ for (int i = 0; i < knownType.Fields.Count; i++)
+ {
+ var field = knownType.Fields[i];
+ var pDoc = xmlDoc.SelectSingleNode("//member[starts-with(@name, '" + $"F:{knownType.Type.FullName}.{field.Name}" + "')]");
+ field.Summary = pDoc != null ? pDoc.SelectSingleNode("summary").InnerXml : "No documentation";
+ }
+ }
+ }
+ }
+ }
+}