From b0bbc0bec1aaed2230b8a4aa1c08e379fed4629a Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Mon, 11 Mar 2019 15:41:05 +0200 Subject: WOrking on script engine. --- .../Tango.Scripting.Editors/Images/class.png | Bin 212 -> 417 bytes .../Tango.Scripting.Editors/Images/field.png | Bin 395 -> 216 bytes .../Tango.Scripting.Editors/Images/interface.png | Bin 222 -> 381 bytes .../Tango.Scripting.Editors/Images/namespace.png | Bin 250 -> 241 bytes .../Tango.Scripting.Editors/Images/property.png | Bin 363 -> 428 bytes .../Tango.Scripting.Editors/ScriptEditor.cs | 79 +++++++++++++++++---- .../Tango.Scripting.Editors.csproj | 14 ++-- .../Tango.Scripting/Parsing/ScriptParser.cs | 66 ++++++++++++++++- .../Tango.Scripting/Parsing/ScriptSymbol.cs | 24 +++++++ .../Tango.Scripting/Parsing/ScriptType.cs | 22 ++++++ .../Tango.Scripting/Parsing/ScriptVariable.cs | 22 ------ .../Tango.Scripting/Tango.Scripting.csproj | 3 +- 12 files changed, 184 insertions(+), 46 deletions(-) create mode 100644 Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptSymbol.cs create mode 100644 Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptType.cs delete mode 100644 Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptVariable.cs (limited to 'Software/Visual_Studio/TEMP') diff --git a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/class.png b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/class.png index 91b35a829..3e40469f5 100644 Binary files a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/class.png and b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/class.png differ diff --git a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/field.png b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/field.png index 37de414e9..763eadffb 100644 Binary files a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/field.png and b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/field.png differ diff --git a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/interface.png b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/interface.png index 3b07597dd..fb00f0cc7 100644 Binary files a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/interface.png and b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/interface.png differ diff --git a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/namespace.png b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/namespace.png index 7f2b6b5ef..6520448ce 100644 Binary files a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/namespace.png and b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/namespace.png differ diff --git a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/property.png b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/property.png index 4abd1a4a4..d2f90f569 100644 Binary files a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/property.png and b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Images/property.png differ diff --git a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/ScriptEditor.cs b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/ScriptEditor.cs index 64fb0f194..bcc05bde5 100644 --- a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/ScriptEditor.cs +++ b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/ScriptEditor.cs @@ -50,7 +50,7 @@ namespace Tango.Scripting.Editors private ScriptParser _parser; private List _current_usings; private List _knownTypes; - private List _declaredTypes; + private List _declaredTypes; #region Mini Classes @@ -136,7 +136,7 @@ namespace Tango.Scripting.Editors /// public ScriptEditor() { - _declaredTypes = new List(); + _declaredTypes = new List(); _current_usings = new List(); @@ -511,11 +511,11 @@ namespace Tango.Scripting.Editors foreach (var type in _declaredTypes) { - if (type.TypeKind == TypeKind.Interface || type.TypeKind == TypeKind.Enum) + if (type.Kind == TypeKind.Interface || type.Kind == TypeKind.Enum) { interfaceTypes.Add(String.Format("{0}", type.Name)); } - else if (type.TypeKind == TypeKind.Class) + else if (type.Kind == TypeKind.Class) { referenceTypes.Add(String.Format("{0}", type.Name)); } @@ -752,6 +752,15 @@ namespace Tango.Scripting.Editors ShowCompletionWindow(data, GetCurrentWord()); } + else + { + var declaredType = GetCurrentDeclaredType(); + + if (declaredType != null) + { + + } + } } else if (e.Text == "(" || e.Text == ",") { @@ -837,43 +846,43 @@ namespace Tango.Scripting.Editors foreach (var type in _declaredTypes.Where(x => x.Name.StartsWith(word))) { - if (type.TypeKind == TypeKind.Struct) + if (type.Kind == TypeKind.Struct) { data.Add(new StructCompletionItem() { Name = type.Name, Description = "Declared inside the current script...", - Namespace = type.ContainingNamespace?.Name, + Namespace = type.ContainingNamespace, Priority = 1, }); } - else if (type.TypeKind == TypeKind.Enum) + else if (type.Kind == TypeKind.Enum) { data.Add(new EnumCompletionItem() { Name = type.Name, Description = "Declared inside the current script...", - Namespace = type.ContainingNamespace?.Name, + Namespace = type.ContainingNamespace, Priority = 1, }); } - else if (type.TypeKind == TypeKind.Interface) + else if (type.Kind == TypeKind.Interface) { data.Add(new InterfaceCompletionItem() { Name = type.Name, Description = "Declared inside the current script...", - Namespace = type.ContainingNamespace?.Name, + Namespace = type.ContainingNamespace, Priority = 1, }); } - else if (type.TypeKind == TypeKind.Class) + else if (type.Kind == TypeKind.Class) { data.Add(new ClassCompletionItem() { Name = type.Name, Description = "Declared inside the current script...", - Namespace = type.ContainingNamespace?.Name, + Namespace = type.ContainingNamespace, Priority = 1, }); } @@ -944,7 +953,7 @@ namespace Tango.Scripting.Editors Priority = 2, }); } - else if (symbol.Kind == SymbolKind.Field) + else if (symbol.Kind == SymbolKind.Field || symbol.Kind == SymbolKind.Local) { data.Add(new FieldCompletionItem() { @@ -1110,6 +1119,50 @@ namespace Tango.Scripting.Editors return null; } + private ScriptType GetCurrentDeclaredType() + { + var expression = GetPreviousWords().LastOrDefault(); + + if (expression != null) + { + var tree = expression.Split('.').Select(x => x.Remove(@"\n|\t|\r|\(.*\)|\[.*\]|\s")).ToList(); + var variableName = tree.FirstOrDefault(); + + if (variableName != null) + { + tree.RemoveAt(0); + var variables = _parser.GetContextSymbols(Document.Text, CaretOffset); + var variable = variables.FirstOrDefault(x => x.Name == variableName); + + if (variable != null) + { + var declaredType = _declaredTypes.FirstOrDefault(x => x.Name == Regex.Replace(variable.Type, "<.+>", "")); + + if (declaredType != null) + { + while (tree.Count > 1) + { + var memberName = tree.First(); + tree.RemoveAt(0); + var member = declaredType.Symbols.FirstOrDefault(x => x.Name == memberName); + + if (member == null) + { + return null; + } + + declaredType = _declaredTypes.FirstOrDefault(x => x.ContainingNamespace + "." + x.Name == member.ContainingNamespace + "." + member.Type); + } + + return declaredType; + } + } + } + } + + return null; + } + #endregion #region Popup diff --git a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Tango.Scripting.Editors.csproj b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Tango.Scripting.Editors.csproj index e5960a664..8b213a870 100644 --- a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Tango.Scripting.Editors.csproj +++ b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Tango.Scripting.Editors.csproj @@ -597,32 +597,32 @@ - + - + - + - + - + - + - + \ No newline at end of file diff --git a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptParser.cs b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptParser.cs index 43a5a6b54..1ee2b780c 100644 --- a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptParser.cs +++ b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptParser.cs @@ -50,6 +50,8 @@ namespace Tango.Scripting.Parsing Type = prop.GetValue(symbol).ToString(), Class = symbol.ContainingType?.Name, Kind = symbol.Kind, + Accessibility = symbol.DeclaredAccessibility, + ContainingNamespace = symbol.ContainingNamespace?.Name, }); } } @@ -65,6 +67,8 @@ namespace Tango.Scripting.Parsing Type = prop.GetValue(symbol).ToString(), Class = symbol.ContainingType?.Name, Kind = symbol.Kind, + Accessibility = symbol.DeclaredAccessibility, + ContainingNamespace = symbol.ContainingNamespace?.Name, }); } } @@ -80,9 +84,9 @@ namespace Tango.Scripting.Parsing return matches.OfType().Select(x => x.Value.Replace("using ", "").Replace(";", "").Replace("\n", "").Replace("\t", "").Replace("\r", "")).ToList(); } - public List GetDeclaredTypes(String code) + public List GetDeclaredTypes(String code) { - List types = new List(); + List types = new List(); SyntaxTree tree = CSharpSyntaxTree.ParseText(code); CompilationUnitSyntax root = tree.GetCompilationUnitRoot(); @@ -94,7 +98,63 @@ namespace Tango.Scripting.Parsing var type = model.GetDeclaredSymbol(d); if (!String.IsNullOrWhiteSpace(type.Name)) { - types.Add(type); + ScriptType scriptType = new ScriptType(); + scriptType.Name = type.Name; + scriptType.Kind = type.TypeKind; + scriptType.ContainingNamespace = type.ContainingNamespace?.Name; + + foreach (var symbol in d.DescendantNodes().OfType()) + { + var symbolModel = model.GetDeclaredSymbol(symbol); + + scriptType.Symbols.Add(new ScriptSymbol() + { + Class = scriptType.Name, + Accessibility = symbolModel.DeclaredAccessibility, + Kind = SymbolKind.Property, + Name = symbolModel.Name, + Type = symbolModel.Type.ToString(), + ContainingNamespace = symbolModel.ContainingNamespace?.Name, + }); + } + + foreach (var symbol in d.DescendantNodes().OfType()) + { + var symbolModel = model.GetDeclaredSymbol(symbol.Declaration.Variables.FirstOrDefault()) as IFieldSymbol; + + if (symbolModel != null) + { + scriptType.Symbols.Add(new ScriptSymbol() + { + Class = scriptType.Name, + Accessibility = symbolModel.DeclaredAccessibility, + Kind = SymbolKind.Field, + Name = symbolModel.Name, + Type = symbolModel.Type.ToString(), + ContainingNamespace = symbolModel.ContainingNamespace?.Name, + }); + } + } + + foreach (var symbol in d.DescendantNodes().OfType()) + { + var symbolModel = model.GetDeclaredSymbol(symbol); + + if (symbolModel != null) + { + scriptType.Symbols.Add(new ScriptSymbol() + { + Class = scriptType.Name, + Accessibility = symbolModel.DeclaredAccessibility, + Kind = SymbolKind.Method, + Name = symbolModel.Name, + Type = symbolModel.ReturnType.ToString(), + ContainingNamespace = symbolModel.ContainingNamespace?.Name, + }); + } + } + + types.Add(scriptType); } } diff --git a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptSymbol.cs b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptSymbol.cs new file mode 100644 index 000000000..b93b7951a --- /dev/null +++ b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptSymbol.cs @@ -0,0 +1,24 @@ +using Microsoft.CodeAnalysis; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.Scripting.Parsing +{ + public class ScriptSymbol + { + public String Name { get; set; } + public String Type { get; set; } + public SymbolKind Kind { get; set; } + public String Class { get; set; } + public Accessibility Accessibility { get; set; } + public String ContainingNamespace { get; set; } + + public override string ToString() + { + return $"{Kind.ToString()} : {Type} : {Name}"; + } + } +} diff --git a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptType.cs b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptType.cs new file mode 100644 index 000000000..fc360acb5 --- /dev/null +++ b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptType.cs @@ -0,0 +1,22 @@ +using Microsoft.CodeAnalysis; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.Scripting.Parsing +{ + public class ScriptType + { + public String Name { get; set; } + public TypeKind Kind { get; set; } + public List Symbols { get; set; } + public string ContainingNamespace { get; set; } + + public ScriptType() + { + Symbols = new List(); + } + } +} diff --git a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptVariable.cs b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptVariable.cs deleted file mode 100644 index 50b3fdd7e..000000000 --- a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptVariable.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.CodeAnalysis; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Tango.Scripting.Parsing -{ - public class ScriptSymbol - { - public String Name { get; set; } - public String Type { get; set; } - public SymbolKind Kind { get; set; } - public String Class { get; set; } - - public override string ToString() - { - return $"{Kind.ToString()} : {Type} : {Name}"; - } - } -} diff --git a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Tango.Scripting.csproj b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Tango.Scripting.csproj index f5d0175e7..081009e7e 100644 --- a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Tango.Scripting.csproj +++ b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Tango.Scripting.csproj @@ -124,6 +124,7 @@ + @@ -133,7 +134,7 @@ - + -- cgit v1.3.1