diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2019-03-11 19:46:43 +0200 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2019-03-11 19:46:43 +0200 |
| commit | 057b7d9d9916144fed099ac8573a864c45cd0146 (patch) | |
| tree | 5e32e59ea55d3bf4066670b0cdb39901db537bf5 /Software/Visual_Studio/TEMP | |
| parent | ac251de510cfb75c2967f85efc17ac8f8ad20ea0 (diff) | |
| download | Tango-057b7d9d9916144fed099ac8573a864c45cd0146.tar.gz Tango-057b7d9d9916144fed099ac8573a864c45cd0146.zip | |
Working on script engine.
Diffstat (limited to 'Software/Visual_Studio/TEMP')
5 files changed, 252 insertions, 10 deletions
diff --git a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Popups/MethodDescription.cs b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Popups/MethodDescription.cs index 864072952..70e0d028d 100644 --- a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Popups/MethodDescription.cs +++ b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Popups/MethodDescription.cs @@ -11,6 +11,8 @@ namespace Tango.Scripting.Editors.Popups public String Description { get; set; } public String ReturnType { get; set; } public List<ParameterDescription> Parameters { get; set; } + public String Class { get; set; } + public String Name { get; set; } public MethodDescription() { 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 d2f5dd169..e43322711 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 @@ -73,6 +73,12 @@ namespace Tango.Scripting.Editors public String MethodName { get; set; } } + private class DeclaredMethodSession + { + public ScriptType Type { get; set; } + public ScriptSymbol Method { get; set; } + } + #endregion #region Properties @@ -436,6 +442,74 @@ namespace Tango.Scripting.Editors return null; } + private DeclaredMethodSession GetDeclaredMethodSession() + { + var expression = GetPreviousWords().LastOrDefault(); + + if (expression != null) + { + var tree = expression.Split('.').Select(x => x.Replace("\n", "").Replace("\r", "").Replace(" ", "").Replace("\t", "").Replace("(", "").Replace(")", "").Replace("[", "").Replace("]", "")).ToList(); + var variableName = tree.FirstOrDefault(); + + if (variableName != null && tree.Count > 0) + { + 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.Class, "<.+>", "<T>")); + + 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); + } + + var methodName = tree.Count > 0 ? tree.Last() : variableName; + + var method = declaredType.Symbols.FirstOrDefault(x => x.Kind == SymbolKind.Method && x.Name == methodName); + + if (method != null) + { + return new DeclaredMethodSession() + { + Type = declaredType, + Method = method, + }; + } + } + else if (tree.Count == 0) + { + var method = variable; + + if (method != null) + { + return new DeclaredMethodSession() + { + Type = declaredType, + Method = method, + }; + } + } + } + } + } + + return null; + } + public List<String> GetPreviousWords() { var currentLine = GetCurrentLine(); @@ -687,7 +761,7 @@ namespace Tango.Scripting.Editors String currentWord = previousWordsLast != null ? previousWordsLast.Replace("\t", "") : String.Empty; String currentWordIncludingParenthesis = currentWord.Split('(').LastOrDefault(); - if (previousWords.Count > 0 && previousWords.First().StartsWith("//")) return; + if (previousWords.Count > 0 && previousWords.First().Trim().StartsWith("//")) return; if (e.Text == " " && GetPreviousWord() == "new") { @@ -773,15 +847,29 @@ namespace Tango.Scripting.Editors if (member.Kind == SymbolKind.Method) { - data.Add(new MethodCompletionItem() + var methodCompletion = new MethodCompletionItem() { Class = declaredType.Name, Name = member.Name, ReturnType = member.Type, Description = member.Summary, - //Parameters = method.Parameters, Overloads = methodGroup.Count() - 1, - }); + }; + + + for (int i = 0; i < member.Parameters.Count; i++) + { + var pair = member.Parameters[i]; + + methodCompletion.Parameters.Add(new KnownTypeMethodParameter() + { + Type = pair.Key, + Name = pair.Value, + IsLast = (i == member.Parameters.Count - 1) + }); + } + + data.Add(methodCompletion); } else if (member.Kind == SymbolKind.Property) @@ -824,6 +912,7 @@ namespace Tango.Scripting.Editors if (content.Methods.Count > 0) { ShowPopup(content); + return; } } @@ -835,6 +924,19 @@ namespace Tango.Scripting.Editors if (content.Methods.Count > 0) { ShowPopup(content); + return; + } + } + + var declaredMethodSession = GetDeclaredMethodSession(); + + if (declaredMethodSession != null) + { + var content = CreateDeclaredMethodSessionPopupContent(declaredMethodSession); + if (content.Methods.Count > 0) + { + ShowPopup(content); + return; } } } @@ -1019,14 +1121,28 @@ namespace Tango.Scripting.Editors } else if (symbol.Kind == SymbolKind.Method) { - data.Add(new MethodCompletionItem() + var methodCompletion = new MethodCompletionItem() { Class = symbol.Class, Description = symbol.Summary, Name = symbol.Name, ReturnType = symbol.Type, Priority = 2, - }); + }; + + for (int i = 0; i < symbol.Parameters.Count; i++) + { + var pair = symbol.Parameters[i]; + + methodCompletion.Parameters.Add(new KnownTypeMethodParameter() + { + Type = pair.Key, + Name = pair.Value, + IsLast = (i == symbol.Parameters.Count - 1) + }); + } + + data.Add(methodCompletion); } } @@ -1294,6 +1410,8 @@ namespace Tango.Scripting.Editors MethodDescription method = new MethodDescription(); method.ReturnType = session.Type.Name; method.Description = m.Summary; + method.Name = m.Name; + method.Class = session.Type.FriendlyName; //if (session.Type.Type.IsGenericType && session.TypeArguments != null) //{ @@ -1336,6 +1454,53 @@ namespace Tango.Scripting.Editors return popup; } + private MethodPopup CreateDeclaredMethodSessionPopupContent(DeclaredMethodSession session) + { + MethodPopup popup = new MethodPopup(); + + MethodDescription method = new MethodDescription(); + method.ReturnType = session.Method.Type; + method.Description = session.Method.Summary; + method.Name = session.Method.Name; + method.Class = session.Method.Class; + + //if (session.Type.Type.IsGenericType && session.TypeArguments != null) + //{ + // method.ReturnType = new String(session.Type.Name.TakeWhile(x => x != '`').ToArray()) + $"<{String.Join(",", session.TypeArguments)}>"; + //} + + foreach (var p in session.Method.Parameters) + { + ParameterDescription pDescription = new ParameterDescription(method); + pDescription.Type = p.Key; + pDescription.Name = p.Value; + method.Parameters.Add(pDescription); + } + + popup.Methods.Add(method); + + //if (false) + //{ + // popup.CurrentMethod = popup.Methods.FirstOrDefault(x => x.Parameters.Count == session.ParameterIndex + 1); + + // if (popup.CurrentMethod == null) + // { + // popup.CurrentMethod = popup.Methods.FirstOrDefault(); + // } + //} + //else + //{ + popup.CurrentMethod = popup.Methods.FirstOrDefault(); + //} + + if (popup.CurrentMethod != null) + { + popup.CurrentMethodIndex = popup.Methods.IndexOf(popup.CurrentMethod) + 1; + } + + return popup; + } + #endregion } } diff --git a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Themes/Generic.xaml b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Themes/Generic.xaml index 1ab9dd2db..ce5cb39e1 100644 --- a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Themes/Generic.xaml +++ b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.Editors/Themes/Generic.xaml @@ -311,6 +311,9 @@ <StackPanel Margin="10 0 0 0"> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},Path=CurrentMethod.ReturnType}" Foreground="{StaticResource ScriptReferenceTypesBrush}"></TextBlock> + <TextBlock Margin="5 0 0 0" Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},Path=CurrentMethod.Class}" Foreground="{StaticResource ScriptReferenceTypesBrush}"></TextBlock> + <TextBlock>.</TextBlock> + <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},Path=CurrentMethod.Name}" Foreground="{StaticResource ScriptReferenceTypesBrush}"></TextBlock> <TextBlock>(</TextBlock> <ItemsControl ItemsSource="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},Path=CurrentMethod.Parameters}"> <ItemsControl.ItemsPanel> @@ -337,6 +340,16 @@ <ItemsControl.ItemTemplate> <DataTemplate DataType="{x:Type popups:ParameterDescription}"> <StackPanel Orientation="Horizontal"> + <StackPanel.Style> + <Style TargetType="StackPanel"> + <Setter Property="Visibility" Value="Visible"></Setter> + <Style.Triggers> + <DataTrigger Binding="{Binding Description}" Value="{x:Null}"> + <Setter Property="Visibility" Value="Collapsed"></Setter> + </DataTrigger> + </Style.Triggers> + </Style> + </StackPanel.Style> <TextBlock Text="{Binding Name}"></TextBlock> <TextBlock>:</TextBlock> <TextBlock Opacity="0.7" Margin="5 0 0 0" Text="{Binding Description}"></TextBlock> 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 b0c18ce83..101bfdda3 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 @@ -2,7 +2,9 @@ using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using System; +using System.Collections; using System.Collections.Generic; +using System.Collections.Immutable; using System.IO; using System.Linq; using System.Text; @@ -75,7 +77,7 @@ namespace Tango.Scripting.Parsing if (prop != null) { - vars.Add(new ScriptSymbol() + ScriptSymbol m = new ScriptSymbol() { Name = symbol.Name, Type = ReplaceFakeScript(prop.GetValue(symbol).ToString()), @@ -84,7 +86,11 @@ namespace Tango.Scripting.Parsing Accessibility = symbol.DeclaredAccessibility, ContainingNamespace = ReplaceFakeScript(symbol.ContainingNamespace?.Name), Summary = GetSymbolDocumentation(symbol), - }); + }; + + m.Parameters = GetMethodSymbolParameters(symbol); + + vars.Add(m); } } else @@ -186,7 +192,7 @@ namespace Tango.Scripting.Parsing if (symbolModel != null) { - scriptType.Symbols.Add(new ScriptSymbol() + ScriptSymbol m = new ScriptSymbol() { Class = scriptType.Name, Accessibility = symbolModel.DeclaredAccessibility, @@ -195,7 +201,14 @@ namespace Tango.Scripting.Parsing Type = symbolModel.ReturnType.ToString(), ContainingNamespace = symbolModel.ContainingNamespace?.Name, Summary = GetNodeDocumentation(symbol), - }); + }; + + foreach (var p in symbol.DescendantNodes().OfType<ParameterSyntax>()) + { + m.Parameters.Add(new KeyValuePair<string, string>(p.Type.ToString(), p.Identifier.ToString())); + } + + scriptType.Symbols.Add(m); } } @@ -279,5 +292,48 @@ namespace Tango.Scripting.Parsing return "No documentation."; } + + private SyntaxNode GetSymbolSyntaxNode(ISymbol symbol) + { + if (symbol != null) + { + var prop = symbol.GetType().GetProperty("SyntaxNode"); + + if (prop != null) + { + var node = prop.GetValue(symbol) as SyntaxNode; + + return node; + } + } + + return null; + } + + private List<KeyValuePair<String, String>> GetMethodSymbolParameters(ISymbol symbol) + { + List<KeyValuePair<String, String>> parameters = new List<KeyValuePair<string, string>>(); + + try + { + var prop = symbol.GetType().GetProperty("Parameters"); + + if (prop != null) + { + var array = prop.GetValue(symbol) as IEnumerable; + + foreach (var item in array) + { + var type = item.GetType().GetProperty("Type").GetValue(item).ToString(); + var value = item.GetType().GetProperty("Name").GetValue(item).ToString(); + + parameters.Add(new KeyValuePair<string, string>(type, value)); + } + } + } + catch { } + + return parameters; + } } } 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 index 622ca4406..d6fdaeebf 100644 --- a/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptSymbol.cs +++ b/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting/Parsing/ScriptSymbol.cs @@ -15,8 +15,14 @@ namespace Tango.Scripting.Parsing public String Class { get; set; } public Accessibility Accessibility { get; set; } public String ContainingNamespace { get; set; } + public List<KeyValuePair<String,String>> Parameters { get; set; } public String Summary { get; set; } + public ScriptSymbol() + { + Parameters = new List<KeyValuePair<string, string>>(); + } + public override string ToString() { return $"{Kind.ToString()} : {Type} : {Name}"; |
