Skip to content
This repository was archived by the owner on Apr 14, 2022. It is now read-only.

Make sure tuple protocol name does not ignore unknown parameter types #206

Merged
merged 5 commits into from
Oct 5, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand Down
39 changes: 32 additions & 7 deletions src/Analysis/Engine/Impl/Values/Protocols.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -389,9 +390,32 @@ class TupleProtocol : IterableProtocol {

public TupleProtocol(ProtocolInfo self, IEnumerable<IAnalysisSet> values) : base(self, AnalysisSet.UnionAll(values)) {
_values = values.Select(s => s.AsUnion(1)).ToArray();
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++) {
sb.AppendIf(i > 0, ", ");
AppendParameterString(sb, _values[i].ToArray());
}
sb.Append(']');
return sb.ToString();
}

private void AppendParameterString(StringBuilder sb, AnalysisValue[] sets) {
if (sets.Length == 0) {
sb.Append('?');
return;
}

var argTypes = _values.SelectMany(e => e.Select(v => v is IHasQualifiedName qn ? qn.FullyQualifiedName : v.ShortDescription));
Name = "tuple[{0}]".FormatInvariant(string.Join(", ", argTypes));
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.AppendIf(sets.Length > 1, "]");
}

protected override void EnsureMembers(IDictionary<string, IAnalysisSet> members) {
Expand Down Expand Up @@ -419,6 +443,7 @@ public override IAnalysisSet GetIndex(Node node, AnalysisUnit unit, IAnalysisSet
}

public override string Name { get; }
public override BuiltinTypeId TypeId => BuiltinTypeId.Tuple;

public override IEnumerable<KeyValuePair<string, string>> GetRichDescription() {
if (_values.Any()) {
Expand All @@ -437,7 +462,7 @@ public override IEnumerable<KeyValuePair<string, string>> 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);

Expand Down Expand Up @@ -524,6 +549,7 @@ public override IAnalysisSet GetIndex(Node node, AnalysisUnit unit, IAnalysisSet
}

public override string Name => "dict";
public override BuiltinTypeId TypeId => BuiltinTypeId.Dict;

public override IEnumerable<KeyValuePair<string, string>> GetRichDescription() {
if (_valueType.Any()) {
Expand Down Expand Up @@ -576,14 +602,13 @@ protected override void EnsureMembers(IDictionary<string, IAnalysisSet> 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<KeyValuePair<string, string>> GetRichDescription() {
if (_yielded.Any() || Sent.Any() || Returned.Any()) {
Expand Down