From d7c06d9d98fed33bd3f5ab8ee480c71414bf4a01 Mon Sep 17 00:00:00 2001 From: MikhailArkhipov Date: Fri, 5 Oct 2018 10:52:21 -0700 Subject: [PATCH 1/5] Fix protocol type id --- src/Analysis/Engine/Impl/Values/Protocols.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Analysis/Engine/Impl/Values/Protocols.cs b/src/Analysis/Engine/Impl/Values/Protocols.cs index def71b7d7..090f301c2 100644 --- a/src/Analysis/Engine/Impl/Values/Protocols.cs +++ b/src/Analysis/Engine/Impl/Values/Protocols.cs @@ -389,9 +389,7 @@ class TupleProtocol : IterableProtocol { public TupleProtocol(ProtocolInfo self, IEnumerable values) : base(self, AnalysisSet.UnionAll(values)) { _values = values.Select(s => s.AsUnion(1)).ToArray(); - - var argTypes = _values.SelectMany(e => e.Select(v => v is IHasQualifiedName qn ? qn.FullyQualifiedName : v.ShortDescription)); - Name = "tuple[{0}]".FormatInvariant(string.Join(", ", argTypes)); + Name = "tuple[{0}]".FormatInvariant(string.Join(", ", _values.Select(v => v.GetShortDescriptions()))); } protected override void EnsureMembers(IDictionary members) { @@ -419,6 +417,7 @@ public override IAnalysisSet GetIndex(Node node, AnalysisUnit unit, IAnalysisSet } public override string Name { get; } + public override BuiltinTypeId TypeId => BuiltinTypeId.Tuple; public override IEnumerable> GetRichDescription() { if (_values.Any()) { From da98c14761ced5d8fbd13b6dd1bac89e9561db85 Mon Sep 17 00:00:00 2001 From: MikhailArkhipov Date: Fri, 5 Oct 2018 10:54:12 -0700 Subject: [PATCH 2/5] Fix type ids --- src/Analysis/Engine/Impl/Values/Protocols.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Analysis/Engine/Impl/Values/Protocols.cs b/src/Analysis/Engine/Impl/Values/Protocols.cs index 090f301c2..91dd8c131 100644 --- a/src/Analysis/Engine/Impl/Values/Protocols.cs +++ b/src/Analysis/Engine/Impl/Values/Protocols.cs @@ -436,7 +436,7 @@ public override IEnumerable> GetRichDescription() { } } - protected override bool Equals(Protocol other) => + protected override bool Equals(Protocol other) => other is TupleProtocol tp && _values.Zip(tp._values, (x, y) => x.SetEquals(y)).All(b => b); @@ -523,6 +523,7 @@ public override IAnalysisSet GetIndex(Node node, AnalysisUnit unit, IAnalysisSet } public override string Name => "dict"; + public override BuiltinTypeId TypeId => BuiltinTypeId.Dict; public override IEnumerable> GetRichDescription() { if (_valueType.Any()) { @@ -575,14 +576,13 @@ protected override void EnsureMembers(IDictionary members) } public override string Name => "generator"; - + public override BuiltinTypeId TypeId => BuiltinTypeId.Generator; + public IAnalysisSet Yielded => _yielded; public IAnalysisSet Sent { get; } public IAnalysisSet Returned { get; } - public override IAnalysisSet GetReturnForYieldFrom(Node node, AnalysisUnit unit) { - return Returned; - } + public override IAnalysisSet GetReturnForYieldFrom(Node node, AnalysisUnit unit) => Returned; public override IEnumerable> GetRichDescription() { if (_yielded.Any() || Sent.Any() || Returned.Any()) { From b84d9a5c682a691ad2bf1c01f922e76565a17b4a Mon Sep 17 00:00:00 2001 From: MikhailArkhipov Date: Fri, 5 Oct 2018 12:35:18 -0700 Subject: [PATCH 3/5] Don't ignore empty value sets (unknown types) --- src/Analysis/Engine/Impl/Values/Protocols.cs | 37 +++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/Analysis/Engine/Impl/Values/Protocols.cs b/src/Analysis/Engine/Impl/Values/Protocols.cs index 91dd8c131..897dbd1b4 100644 --- a/src/Analysis/Engine/Impl/Values/Protocols.cs +++ b/src/Analysis/Engine/Impl/Values/Protocols.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text; using Microsoft.PythonTools.Analysis.Infrastructure; using Microsoft.PythonTools.Interpreter; using Microsoft.PythonTools.Parsing; @@ -389,7 +390,41 @@ class TupleProtocol : IterableProtocol { public TupleProtocol(ProtocolInfo self, IEnumerable values) : base(self, AnalysisSet.UnionAll(values)) { _values = values.Select(s => s.AsUnion(1)).ToArray(); - Name = "tuple[{0}]".FormatInvariant(string.Join(", ", _values.Select(v => v.GetShortDescriptions()))); + Name = GetNameFromValues(); + } + + private string GetNameFromValues() { + // Enumerate manually since SelectMany drops empty/unknown values + var sb = new StringBuilder("tuple["); + for (var i = 0; i < _values.Length; i++) { + if (i > 0) { + sb.Append(", "); + } + sb.Append(GetParameterString(_values[i].ToArray())); + } + sb.Append(']'); + return sb.ToString(); + } + + private string GetParameterString(AnalysisValue[] sets) { + if (sets.Length == 0) { + return "?"; + } + var sb = new StringBuilder(); + if (sets.Length > 1) { + sb.Append('['); + } + for (var i = 0; i < sets.Length; i++) { + if (i > 0) { + sb.Append(", "); + } + var desc = sets[i] is IHasQualifiedName qn ? qn.FullyQualifiedName : sets[i].ShortDescription; + sb.Append(desc); + } + if (sets.Length > 1) { + sb.Append(']'); + } + return sb.ToString(); } protected override void EnsureMembers(IDictionary members) { From ca6ee8aca57d5d295eb22135abeb60e651a379d0 Mon Sep 17 00:00:00 2001 From: MikhailArkhipov Date: Fri, 5 Oct 2018 13:03:37 -0700 Subject: [PATCH 4/5] PR feedback --- .../Extensions/StringBuilderExtensions.cs | 10 +++++- src/Analysis/Engine/Impl/Values/Protocols.cs | 32 ++++++++----------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/Analysis/Engine/Impl/Infrastructure/Extensions/StringBuilderExtensions.cs b/src/Analysis/Engine/Impl/Infrastructure/Extensions/StringBuilderExtensions.cs index 8c22853b0..11b9f2fde 100644 --- a/src/Analysis/Engine/Impl/Infrastructure/Extensions/StringBuilderExtensions.cs +++ b/src/Analysis/Engine/Impl/Infrastructure/Extensions/StringBuilderExtensions.cs @@ -37,7 +37,15 @@ public static StringBuilder EnsureEndsWithWhiteSpace(this StringBuilder sb, int if (whiteSpaceCount > 0) { sb.Append(' ', whiteSpaceCount); } - + + return sb; + } + + public static StringBuilder AppendIf(this StringBuilder sb, bool condition, string value) { + if (condition) { + sb.Append(value); + } + return sb; } } diff --git a/src/Analysis/Engine/Impl/Values/Protocols.cs b/src/Analysis/Engine/Impl/Values/Protocols.cs index 897dbd1b4..90c50f59f 100644 --- a/src/Analysis/Engine/Impl/Values/Protocols.cs +++ b/src/Analysis/Engine/Impl/Values/Protocols.cs @@ -397,34 +397,30 @@ private string GetNameFromValues() { // Enumerate manually since SelectMany drops empty/unknown values var sb = new StringBuilder("tuple["); for (var i = 0; i < _values.Length; i++) { - if (i > 0) { - sb.Append(", "); - } - sb.Append(GetParameterString(_values[i].ToArray())); + sb.AppendIf(i > 0, ", "); + AppendParameterString(sb, _values[i].ToArray()); } sb.Append(']'); return sb.ToString(); } - private string GetParameterString(AnalysisValue[] sets) { + private void AppendParameterString(StringBuilder sb, AnalysisValue[] sets) { if (sets.Length == 0) { - return "?"; + sb.Append('?'); + return; } - var sb = new StringBuilder(); - if (sets.Length > 1) { - sb.Append('['); + + if (sets.Length == 1) { + sb.Append(sets[0] is IHasQualifiedName qn ? qn.FullyQualifiedName : sets[0].ShortDescription); + return; } + + sb.Append('['); for (var i = 0; i < sets.Length; i++) { - if (i > 0) { - sb.Append(", "); - } - var desc = sets[i] is IHasQualifiedName qn ? qn.FullyQualifiedName : sets[i].ShortDescription; - sb.Append(desc); + sb.AppendIf(i > 0, ", "); + sb.Append(sets[i] is IHasQualifiedName qn ? qn.FullyQualifiedName : sets[i].ShortDescription); } - if (sets.Length > 1) { - sb.Append(']'); - } - return sb.ToString(); + sb.Append(']'); } protected override void EnsureMembers(IDictionary members) { From 96ae47905745bca79eb70c5af65ca1b18de725f0 Mon Sep 17 00:00:00 2001 From: MikhailArkhipov Date: Fri, 5 Oct 2018 13:07:09 -0700 Subject: [PATCH 5/5] Even simpler --- src/Analysis/Engine/Impl/Values/Protocols.cs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/Analysis/Engine/Impl/Values/Protocols.cs b/src/Analysis/Engine/Impl/Values/Protocols.cs index 90c50f59f..7808f11b4 100644 --- a/src/Analysis/Engine/Impl/Values/Protocols.cs +++ b/src/Analysis/Engine/Impl/Values/Protocols.cs @@ -410,17 +410,12 @@ private void AppendParameterString(StringBuilder sb, AnalysisValue[] sets) { return; } - if (sets.Length == 1) { - sb.Append(sets[0] is IHasQualifiedName qn ? qn.FullyQualifiedName : sets[0].ShortDescription); - return; - } - - sb.Append('['); + sb.AppendIf(sets.Length > 1, "["); for (var i = 0; i < sets.Length; i++) { sb.AppendIf(i > 0, ", "); sb.Append(sets[i] is IHasQualifiedName qn ? qn.FullyQualifiedName : sets[i].ShortDescription); } - sb.Append(']'); + sb.AppendIf(sets.Length > 1, "]"); } protected override void EnsureMembers(IDictionary members) {