From 405f1ac07d78468c3e1a0ef1c0dc8956635c8677 Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Wed, 22 Apr 2020 07:01:05 +0300 Subject: FSE work + fixed issue with personal access token on MS and PPC. --- .../Scripting/Tango.Scripting.Basic/Project.cs | 12 +-- .../Tango.Scripting.Basic/ReferenceAssembly.cs | 22 +++++- .../Tango.Scripting/Parsing/ScriptParser.cs | 91 +++++++++++++++++++--- 3 files changed, 107 insertions(+), 18 deletions(-) (limited to 'Software/Visual_Studio/Scripting') diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Project.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Project.cs index 85caf4706..14a9d94da 100644 --- a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Project.cs +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/Project.cs @@ -73,9 +73,9 @@ namespace Tango.Scripting.Basic { ReferenceAssembliesLoaded.Clear(); - foreach (var type in ReferenceAssemblies) + foreach (var asm in ReferenceAssemblies) { - ReferenceAssembliesLoaded.Add(type.FromType.Assembly); + ReferenceAssembliesLoaded.Add(Assembly.LoadFrom(asm.File)); } } @@ -85,10 +85,10 @@ namespace Tango.Scripting.Basic p.Name = name; - p.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(String) }); - p.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(Enumerable) }); - p.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(Form) }); - p.ReferenceAssemblies.Add(new ReferenceAssembly() { FromType = typeof(Project) }); + p.ReferenceAssemblies.Add(ReferenceAssembly.FromType(typeof(String))); + p.ReferenceAssemblies.Add(ReferenceAssembly.FromType(typeof(Enumerable))); + p.ReferenceAssemblies.Add(ReferenceAssembly.FromType(typeof(Form))); + p.ReferenceAssemblies.Add(ReferenceAssembly.FromType(typeof(Project))); return p; } diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs index be66e026b..4b04270c1 100644 --- a/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Basic/ReferenceAssembly.cs @@ -1,5 +1,7 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -8,11 +10,25 @@ namespace Tango.Scripting.Basic { public class ReferenceAssembly { - public Type FromType { get; set; } + public String File { get; set; } + [JsonIgnore] public String Name { - get { return FromType.Assembly.GetName().Name; } + get { return Path.GetFileNameWithoutExtension(File); } + } + + public static ReferenceAssembly FromType(Type type) + { + ReferenceAssembly reference = new ReferenceAssembly(); + var assembly = type.Assembly; + reference.File = assembly.Location; + return reference; + } + + public static ReferenceAssembly FromFile(String file) + { + return new ReferenceAssembly() { File = file }; } } } diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting/Parsing/ScriptParser.cs b/Software/Visual_Studio/Scripting/Tango.Scripting/Parsing/ScriptParser.cs index 7accdbb83..e9cb8fc4c 100644 --- a/Software/Visual_Studio/Scripting/Tango.Scripting/Parsing/ScriptParser.cs +++ b/Software/Visual_Studio/Scripting/Tango.Scripting/Parsing/ScriptParser.cs @@ -131,16 +131,32 @@ namespace Tango.Scripting.Parsing if (prop != null) { - vars.Add(new ScriptSymbol() + var type = ReplaceFakeScript(prop.GetValue(symbol).ToString()); + + ScriptSymbol varSymbol = new ScriptSymbol(); + varSymbol.Name = symbol.Name; + varSymbol.Type = type; + varSymbol.Class = ReplaceFakeScript(symbol.ContainingType?.Name); + varSymbol.Kind = symbol.Kind; + varSymbol.Accessibility = symbol.DeclaredAccessibility; + varSymbol.ContainingNamespace = ReplaceFakeScript(symbol.ContainingNamespace?.Name); + varSymbol.Summary = GetSymbolDocumentation(symbol); + vars.Add(varSymbol); + + if (type == "?") { - Name = symbol.Name, - Type = ReplaceFakeScript(prop.GetValue(symbol).ToString()), - Class = ReplaceFakeScript(symbol.ContainingType?.Name), - Kind = symbol.Kind, - Accessibility = symbol.DeclaredAccessibility, - ContainingNamespace = ReplaceFakeScript(symbol.ContainingNamespace?.Name), - Summary = GetSymbolDocumentation(symbol), - }); + try + { + var variables = GetScriptVariables(code); + var variable = variables.FirstOrDefault(x => x.Name == symbol.Name); + + if (variable != null) + { + varSymbol.Type = variable.Type; + } + } + catch { } + } } } } @@ -392,5 +408,62 @@ namespace Tango.Scripting.Parsing var ret = root.ToFullString(); return ret; } + + private List GetScriptVariables(String code) + { + List vars = new List(); + + SyntaxTree tree = CSharpSyntaxTree.ParseText(code); + var root = (CompilationUnitSyntax)tree.GetRoot(); + + List variables = new List(); + FillVariables(variables, root.Members[0]); + variables = variables.Distinct().ToList(); + + foreach (var item in variables) + { + ScriptVariable v = new ScriptVariable(); + v.Name = item.Identifier.ToString(); + + if (item.Initializer.Value.GetType() == typeof(ObjectCreationExpressionSyntax)) + { + v.Type = (item.Initializer.Value as ObjectCreationExpressionSyntax).Type.ToString(); + } + else if (item.Initializer.Value.GetType() == typeof(InvocationExpressionSyntax)) + { + v.Type = (((item.Initializer.Value as InvocationExpressionSyntax).Expression as MemberAccessExpressionSyntax).Name as GenericNameSyntax).TypeArgumentList.Arguments[0].ToString(); + } + + vars.Add(v); + } + + return vars; + } + + private void FillVariables(List variables, SyntaxNode node) + { + foreach (var item in node.DescendantNodes(x => true)) + { + if (item.GetType() == typeof(VariableDeclaratorSyntax)) + { + variables.Add(item as VariableDeclaratorSyntax); + } + else + { + FillVariables(variables, item); + } + } + } + + private class ScriptVariable + { + public String Name { get; set; } + public String Type { get; set; } + + public override string ToString() + { + return String.Format("{0} : {1}", Type, Name); + } + } } } -- cgit v1.3.1