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

Commit e1f0bee

Browse files
author
MikhailArkhipov
committed
Overload tests
1 parent 3670ed9 commit e1f0bee

6 files changed

Lines changed: 38 additions & 57 deletions

File tree

src/Analysis/Engine/Impl/OverloadResult.cs

Lines changed: 17 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
using System;
1818
using System.Collections.Generic;
19+
using System.Diagnostics;
1920
using System.Linq;
2021
using System.Text;
2122
using System.Threading.Tasks;
@@ -26,26 +27,25 @@
2627
namespace Microsoft.PythonTools.Analysis {
2728
public class OverloadResult : IOverloadResult {
2829
private readonly ParameterResult[] _parameters;
29-
private readonly IAnalysisSet _returnTypes;
30+
private readonly string[] _returnType;
3031

31-
public OverloadResult(ParameterResult[] parameters, string name, string documentation, IAnalysisSet returnTypes) {
32+
public OverloadResult(ParameterResult[] parameters, string name, string documentation, IEnumerable<string> returnType) {
3233
_parameters = parameters;
3334
Name = name;
3435
Documentation = documentation;
35-
_returnTypes = returnTypes;
36+
_returnType = returnType.MaybeEnumerate().ToArray();
3637
}
3738

3839
public string Name { get; }
39-
public virtual IReadOnlyList<string> ReturnType => _returnTypes.Select(t => t.Name).ToArray();
40-
public virtual IAnalysisSet ReturnTypes => _returnTypes;
40+
public virtual IReadOnlyList<string> ReturnType => _returnType;
4141
public virtual string Documentation { get; }
4242
public virtual ParameterResult[] Parameters => _parameters;
4343

4444
internal virtual OverloadResult WithNewParameters(ParameterResult[] newParameters)
45-
=> new OverloadResult(newParameters, Name, Documentation, ReturnTypes);
45+
=> new OverloadResult(newParameters, Name, Documentation, _returnType);
4646

4747
internal virtual OverloadResult WithoutLeadingParameters(int skipCount = 1)
48-
=> new OverloadResult(_parameters.Skip(skipCount).ToArray(), Name, Documentation, _returnTypes);
48+
=> new OverloadResult(_parameters.Skip(skipCount).ToArray(), Name, Documentation, _returnType);
4949

5050
private static string Longest(string x, string y) {
5151
if (x == null) {
@@ -115,8 +115,8 @@ public static OverloadResult Merge(IEnumerable<OverloadResult> overloads) {
115115
return res;
116116
});
117117

118-
var returnTypes = overloads.SelectMany(o => o.ReturnTypes).Distinct();
119-
return new OverloadResult(parameters, name, doc, AnalysisSet.Create(returnTypes));
118+
var returnType = overloads.SelectMany(o => o.ReturnType).Distinct();
119+
return new OverloadResult(parameters, name, doc, returnType);
120120
}
121121

122122
public override string ToString() {
@@ -131,7 +131,7 @@ public override string ToString() {
131131

132132
var returnType = "{0}{1}{2}".FormatInvariant(
133133
ReturnType.Count > 1 ? "[" : string.Empty,
134-
ReturnType.Count > 0 ? string.Join(",", ReturnType.OrderBy(k => k)) : "None",
134+
ReturnType.Count > 0 ? string.Join(", ", ReturnType.OrderBy(k => k)) : "None",
135135
ReturnType.Count > 1 ? "]" : string.Empty
136136
);
137137

@@ -146,7 +146,7 @@ class AccumulatedOverloadResult {
146146
private string[] _pnames;
147147
private IAnalysisSet[] _ptypes;
148148
private string[] _pdefaults;
149-
private IAnalysisSet _rtypes;
149+
private readonly HashSet<string> _rtypes;
150150

151151
public AccumulatedOverloadResult(string name, string documentation, int parameters) {
152152
_name = name;
@@ -155,7 +155,7 @@ public AccumulatedOverloadResult(string name, string documentation, int paramete
155155
_ptypes = new IAnalysisSet[parameters];
156156
_pdefaults = new string[parameters];
157157
ParameterCount = parameters;
158-
_rtypes = AnalysisSet.Empty;
158+
_rtypes = new HashSet<string>();
159159
}
160160

161161
public int ParameterCount { get; }
@@ -184,12 +184,12 @@ private IAnalysisSet ChooseBest(IAnalysisSet x, IAnalysisSet y) {
184184
return (y == null) ? AnalysisSet.Empty : y;
185185
}
186186
if (y == null || y.IsObjectOrUnknown()) {
187-
return null;
187+
return AnalysisSet.Empty;
188188
}
189-
return MergeTypes(x, y);
189+
return x.Union(y);
190190
}
191191

192-
public bool TryAddOverload(string name, string documentation, string[] names, IAnalysisSet[] types, string[] defaults, IAnalysisSet returnTypes) {
192+
public bool TryAddOverload(string name, string documentation, string[] names, IAnalysisSet[] types, string[] defaults, IEnumerable<string> returnTypes) {
193193
if (names.Length != _pnames.Length || types.Length != _ptypes.Length) {
194194
return false;
195195
}
@@ -203,7 +203,7 @@ public bool TryAddOverload(string name, string documentation, string[] names, IA
203203
return false;
204204
}
205205

206-
for (int i = 0; i < _pnames.Length; ++i) {
206+
for (var i = 0; i < _pnames.Length; ++i) {
207207
_pnames[i] = ChooseBest(_pnames[i], names[i]);
208208
_ptypes[i] = ChooseBest(_ptypes[i], types[i]);
209209
_pdefaults[i] = ChooseBest(_pdefaults[i], defaults[i]);
@@ -217,7 +217,7 @@ public bool TryAddOverload(string name, string documentation, string[] names, IA
217217
}
218218

219219
if (returnTypes != null) {
220-
_rtypes = ChooseBest(_rtypes, returnTypes);
220+
_rtypes.UnionWith(returnTypes);
221221
}
222222

223223
return true;
@@ -241,27 +241,6 @@ public OverloadResult ToOverloadResult() {
241241
}
242242
return new OverloadResult(parameters, _name, _doc, _rtypes);
243243
}
244-
245-
private IAnalysisSet MergeTypes(IAnalysisSet x, IAnalysisSet y) {
246-
// Merge types so we get simple parameter description such as
247-
// list[int] rather than duplicates such as list[int],list[int, int, int].
248-
var cmp = UnionComparer.Instances[1];
249-
var xA = x.ToArray();
250-
var yA = y.ToArray();
251-
var mergedValues = new List<AnalysisValue>();
252-
for (var i = 0; i < xA.Length; i++) {
253-
// Order types for merging in the order of description length
254-
// so more complex type would possibly fold into the simpler type
255-
// such as list[int, int, int] will fold into the list[int].
256-
257-
// TODO: this is not bulletproof.
258-
// For example, it will merge user type derived from int into the int.
259-
var xd = string.Join(",", xA[i].GetShortDescriptions());
260-
var yd = string.Join(",", yA[i].GetShortDescriptions());
261-
mergedValues.Add(xd.Length < yd.Length ? cmp.MergeTypes(xA[i], yA[i], out _) : cmp.MergeTypes(yA[i], xA[i], out _));
262-
}
263-
return AnalysisSet.CreateUnion(mergedValues, cmp);
264-
}
265244
}
266245

267246
class BuiltinFunctionOverloadResult : OverloadResult {

src/Analysis/Engine/Impl/Values/BuiltinInstanceInfo.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public BuiltinInstanceInfo(BuiltinClassInfo klass)
3333
IBuiltinClassInfo IBuiltinInstanceInfo.ClassInfo => ClassInfo;
3434
public BuiltinClassInfo ClassInfo => _klass;
3535

36+
public override string Name => _klass.Name;
3637
public override IPythonType PythonType => _type;
3738

3839
public override IAnalysisSet GetInstanceType() {
@@ -165,7 +166,7 @@ public override IAnalysisSet Call(Node node, AnalysisUnit unit, IAnalysisSet[] a
165166
Pop();
166167
}
167168
}
168-
169+
169170
return res;
170171
}
171172

@@ -330,18 +331,18 @@ internal override AnalysisValue UnionMergeTypes(AnalysisValue ns, int strength)
330331
return ProjectState.ClassInfos[BuiltinTypeId.Object].Instance;
331332

332333
} else if (strength >= MergeStrength.ToBaseClass) {
333-
var bii = ns as BuiltinInstanceInfo;
334-
if (bii != null) {
334+
if (ns is BuiltinInstanceInfo bii) {
335335
return ClassInfo.UnionMergeTypes(bii.ClassInfo, strength).GetInstanceType().Single();
336336
}
337-
var ii = ns as InstanceInfo;
338-
if (ii != null) {
337+
if (ns is InstanceInfo ii) {
339338
return ClassInfo.UnionMergeTypes(ii.ClassInfo, strength).GetInstanceType().Single();
340339
}
340+
if (ns is ProtocolInfo pi) {
341+
return pi.UnionMergeTypes(this, strength).GetInstanceType().Single();
342+
}
341343
} else if (this is ConstantInfo || ns is ConstantInfo) {
342344
return ClassInfo.Instance;
343345
}
344-
345346
return base.UnionMergeTypes(ns, strength);
346347
}
347348

src/Analysis/Engine/Impl/Values/ClassInfo.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ public override IEnumerable<OverloadResult> Overloads {
271271
overload.Parameters,
272272
ClassDefinition.Name,
273273
overload.Documentation,
274-
overload.ReturnTypes
274+
overload.ReturnType
275275
)
276276
);
277277
}
@@ -289,7 +289,7 @@ public override IEnumerable<OverloadResult> Overloads {
289289
new ParameterResult[0],
290290
ClassDefinition.Name,
291291
ClassDefinition.Body.Documentation.TrimDocumentation(),
292-
AnalysisSet.Empty
292+
new[] { ShortDescription }
293293
));
294294
}
295295

@@ -304,7 +304,7 @@ private OverloadResult GetNewOverloadResult(OverloadResult overload) {
304304
overload.Parameters.RemoveFirst(),
305305
ClassDefinition.Name,
306306
string.IsNullOrEmpty(doc) ? Documentation : doc,
307-
overload.ReturnTypes
307+
overload.ReturnType
308308
);
309309
}
310310

@@ -314,7 +314,7 @@ private OverloadResult GetInitOverloadResult(OverloadResult overload) {
314314
overload.Parameters.RemoveFirst(),
315315
ClassDefinition.Name,
316316
string.IsNullOrEmpty(doc) ? Documentation : doc,
317-
overload.ReturnTypes
317+
overload.ReturnType
318318
);
319319
}
320320

src/Analysis/Engine/Impl/Values/FunctionInfo.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,12 +485,13 @@ public override IEnumerable<OverloadResult> Overloads {
485485
LazyCallArgs = new Lazy<ArgumentSet>(() => new ArgumentSet(vars, null, null, null)),
486486
ResolveFully = true
487487
}, out _)
488+
.GetShortDescriptions()
488489
.ToArray();
489490

490491
bool needNewSet = true;
491492
foreach (var set in parameterSets) {
492493
if (set.ParameterCount == names.Length) {
493-
if (set.TryAddOverload(null, null, names, vars, defaults, AnalysisSet.Create(rtypes))) {
494+
if (set.TryAddOverload(null, null, names, vars, defaults, rtypes)) {
494495
needNewSet = false;
495496
break;
496497
}
@@ -500,7 +501,7 @@ public override IEnumerable<OverloadResult> Overloads {
500501
if (needNewSet) {
501502
var set = new AccumulatedOverloadResult(FunctionDefinition.Name, Documentation, names.Length);
502503
parameterSets.Add(set);
503-
set.TryAddOverload(null, null, names, vars, defaults, AnalysisSet.Create(rtypes));
504+
set.TryAddOverload(null, null, names, vars, defaults, rtypes);
504505
}
505506
}
506507

src/Analysis/Engine/Impl/Values/Protocols.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ protected override void EnsureMembers(IDictionary<string, IAnalysisSet> members)
187187

188188
private OverloadResult[] GenerateOverloads() {
189189
return new[] {
190-
new OverloadResult(Arguments.Select(ToParameterResult).ToArray(), Name, null, ReturnType)
190+
new OverloadResult(Arguments.Select(ToParameterResult).ToArray(), Name, null, ReturnType.GetShortDescriptions())
191191
};
192192
}
193193

src/Analysis/Engine/Test/TypeAnnotationTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ def scale(scalar: float, vector: Vector) -> Vector:
391391
new_vector = scale(2.0, [1.0, -4.2, 5.4])
392392
",
393393
new[] {
394-
"scale:scale(scalar:float, vector:list[float]) -> list[float]"
394+
"scale:scale(scalar:float, vector:list[float, float, float], list[float]) -> list[float]"
395395
}
396396
);
397397
}
@@ -438,7 +438,7 @@ def get_user_name(user_id: UserId) -> str:
438438
user_b = get_user_name(-1)
439439
",
440440
new[] {
441-
"get_user_name:get_user_name(user_id:int) -> str"
441+
"get_user_name:get_user_name(user_id:int, UserId) -> str"
442442
}
443443
);
444444
}
@@ -543,7 +543,7 @@ def zero_all_vars(vars: Iterable[LoggedVar[int]]) -> None:
543543
var.set(0)
544544
",
545545
new[] {
546-
"LoggedVar.set:set(self:LoggedVar, new:T) -> None",
546+
"LoggedVar.set:set(self:LoggedVar, new:int, T) -> None",
547547
"zero_all_vars:zero_all_vars(vars:iterable[LoggedVar]) -> None"
548548
}
549549
);
@@ -553,13 +553,13 @@ def zero_all_vars(vars: Iterable[LoggedVar[int]]) -> None:
553553
public async Task TypingModuleDocumentationExample_10() {
554554
await TypingModuleDocumentationExampleAsync(@"from typing import NewType
555555
556-
UserId = NewType('UserId', int)
556+
UserId = NewType('UserId', float)
557557
558-
def f(u : UserId=345, a : float=1.0):
558+
def f(u : UserId=345., a : float=1.0):
559559
return u
560560
",
561561
new[] {
562-
"f:f(u:int=345, a:float=1.0) -> UserId"
562+
"f:f(u:float, UserId=345.0, a:float=1.0) -> [float, UserId]"
563563
}
564564
);
565565
}

0 commit comments

Comments
 (0)