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

Commit

Permalink
Merge pull request #206 from MikhailArkhipov/master
Browse files Browse the repository at this point in the history
Make sure tuple protocol name does not ignore unknown parameter types
  • Loading branch information
Mikhail Arkhipov authored Oct 5, 2018
2 parents b00b697 + 96ae479 commit 306f568
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 8 deletions.
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

0 comments on commit 306f568

Please sign in to comment.