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

Commit 679d2c2

Browse files
author
Mikhail Arkhipov
authored
Merge pull request #146 from MikhailArkhipov/overloads
Fix type annotation on overloads
2 parents ade27a4 + 2b16da7 commit 679d2c2

9 files changed

Lines changed: 95 additions & 123 deletions

File tree

src/Analysis/Engine/Impl/AnalysisSet.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -593,9 +593,7 @@ public bool Equals(AnalysisValue x, AnalysisValue y) {
593593
return (x == null) ? (y == null) : x.UnionEquals(y, Strength);
594594
}
595595

596-
public int GetHashCode(AnalysisValue obj) {
597-
return (obj == null) ? 0 : obj.UnionHashCode(Strength);
598-
}
596+
public int GetHashCode(AnalysisValue obj) => obj == null ? 0 : obj.UnionHashCode(Strength);
599597

600598
public AnalysisValue MergeTypes(AnalysisValue x, AnalysisValue y, out bool wasChanged) {
601599
if (Object.ReferenceEquals(x, y)) {

src/Analysis/Engine/Impl/OverloadResult.cs

Lines changed: 45 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,15 @@ public OverloadResult(ParameterResult[] parameters, string name, string document
3535
}
3636

3737
public string Name { get; }
38-
public virtual IReadOnlyList<string> ReturnType { get { return _returnType; } }
38+
public virtual IReadOnlyList<string> ReturnType => _returnType;
3939
public virtual string Documentation { get; }
40-
public virtual ParameterResult[] Parameters { get { return _parameters; } }
40+
public virtual ParameterResult[] Parameters => _parameters;
4141

42-
internal virtual OverloadResult WithNewParameters(ParameterResult[] newParameters) {
43-
return new OverloadResult(newParameters, Name, Documentation, ReturnType);
44-
}
42+
internal virtual OverloadResult WithNewParameters(ParameterResult[] newParameters)
43+
=> new OverloadResult(newParameters, Name, Documentation, _returnType);
4544

46-
internal virtual OverloadResult WithoutLeadingParameters(int skipCount = 1) {
47-
return new OverloadResult(_parameters.Skip(skipCount).ToArray(), Name, Documentation, _returnType);
48-
}
45+
internal virtual OverloadResult WithoutLeadingParameters(int skipCount = 1)
46+
=> new OverloadResult(_parameters.Skip(skipCount).ToArray(), Name, Documentation, _returnType);
4947

5048
private static string Longest(string x, string y) {
5149
if (x == null) {
@@ -63,7 +61,7 @@ private static IEnumerable<string> CommaSplit(string x) {
6361
}
6462

6563
var sb = new StringBuilder();
66-
int nestCount = 0;
64+
var nestCount = 0;
6765
foreach (var c in x) {
6866
if (c == ',' && nestCount == 0) {
6967
yield return sb.ToString().Trim();
@@ -84,11 +82,8 @@ private static IEnumerable<string> CommaSplit(string x) {
8482
}
8583
}
8684

87-
private static string Merge(string x, string y) {
88-
return string.Join(", ",
89-
CommaSplit(x).Concat(CommaSplit(y)).OrderBy(n => n).Distinct()
90-
);
91-
}
85+
private static string Merge(string x, string y)
86+
=> string.Join(", ", CommaSplit(x).Concat(CommaSplit(y)).OrderBy(n => n).Distinct());
9287

9388
public static OverloadResult Merge(IEnumerable<OverloadResult> overloads) {
9489
overloads = overloads.ToArray();
@@ -98,7 +93,7 @@ public static OverloadResult Merge(IEnumerable<OverloadResult> overloads) {
9893
var parameters = overloads.Select(o => o.Parameters).Aggregate(Array.Empty<ParameterResult>(), (all, pms) => {
9994
var res = all.Concat(pms.Skip(all.Length)).ToArray();
10095

101-
for (int i = 0; i < res.Length; ++i) {
96+
for (var i = 0; i < res.Length; ++i) {
10297
if (res[i] == null) {
10398
res[i] = pms[i];
10499
} else {
@@ -117,44 +112,54 @@ public static OverloadResult Merge(IEnumerable<OverloadResult> overloads) {
117112

118113
return res;
119114
});
120-
var returnType = overloads.SelectMany(o => o.ReturnType).Distinct();
121115

116+
var returnType = overloads.SelectMany(o => o.ReturnType).Distinct();
122117
return new OverloadResult(parameters, name, doc, returnType);
123118
}
124119

125120
public override string ToString() {
126-
return "{0}({1})->[{2}]{3}".FormatInvariant(
127-
Name,
128-
string.Join(",", Parameters.Select(p => "{0}{1}:{2}={3}".FormatInvariant(p.Name, p.IsOptional ? "?" : "", p.Type ?? "", p.DefaultValue ?? ""))),
129-
string.Join(",", ReturnType.OrderBy(k => k)),
130-
string.IsNullOrEmpty(Documentation) ? "" : ("'''{0}'''".FormatInvariant(Documentation))
121+
var parameters = string.Join(", ",
122+
Parameters.Select(p => "{0}{1}:{2}{3}{4}"
123+
.FormatInvariant(p.Name,
124+
p.IsOptional ? "?" : string.Empty,
125+
p.Type ?? string.Empty,
126+
p.DefaultValue != null ? "=" : string.Empty,
127+
p.DefaultValue ?? string.Empty))
128+
).TrimEnd();
129+
130+
var returnType = "{0}{1}{2}".FormatInvariant(
131+
ReturnType.Count > 1 ? "[" : string.Empty,
132+
ReturnType.Count > 0 ? string.Join(", ", ReturnType.OrderBy(k => k)) : "None",
133+
ReturnType.Count > 1 ? "]" : string.Empty
131134
);
135+
136+
var doc = string.IsNullOrEmpty(Documentation) ? "" : "'''{0}'''".FormatInvariant(Documentation);
137+
return "{0}({1}) -> {2}{3}".FormatInvariant(Name, parameters, returnType, doc);
132138
}
133139
}
134140

135141
class AccumulatedOverloadResult {
136142
private string _name;
137143
private string _doc;
138144
private string[] _pnames;
139-
private IAnalysisSet[] _ptypes;
145+
private string[] _ptypes;
140146
private string[] _pdefaults;
141147
private readonly HashSet<string> _rtypes;
142148

143149
public AccumulatedOverloadResult(string name, string documentation, int parameters) {
144150
_name = name;
145151
_doc = documentation;
146152
_pnames = new string[parameters];
147-
_ptypes = new IAnalysisSet[parameters];
153+
_ptypes = new string[parameters];
148154
_pdefaults = new string[parameters];
149155
ParameterCount = parameters;
150156
_rtypes = new HashSet<string>();
151157
}
152158

153159
public int ParameterCount { get; }
154160

155-
private bool AreNullOrEqual(string x, string y) {
156-
return string.IsNullOrEmpty(x) || string.IsNullOrEmpty(y) || string.Equals(x, y, StringComparison.Ordinal);
157-
}
161+
private bool AreNullOrEqual(string x, string y) =>
162+
string.IsNullOrEmpty(x) || string.IsNullOrEmpty(y) || string.Equals(x, y, StringComparison.Ordinal);
158163

159164
private bool AreNullOrEqual(IAnalysisSet x, IAnalysisSet y) {
160165
return x == null || x.IsObjectOrUnknown() ||
@@ -172,17 +177,7 @@ private string ChooseBest(string x, string y) {
172177
return x.Length >= y.Length ? x : y;
173178
}
174179

175-
private IAnalysisSet ChooseBest(IAnalysisSet x, IAnalysisSet y) {
176-
if (x == null || x.IsObjectOrUnknown()) {
177-
return (y == null || y.IsObjectOrUnknown()) ? AnalysisSet.Empty : y;
178-
}
179-
if (y == null || y.IsObjectOrUnknown()) {
180-
return AnalysisSet.Empty;
181-
}
182-
return x.Union(y);
183-
}
184-
185-
public bool TryAddOverload(string name, string documentation, string[] names, IAnalysisSet[] types, string[] defaults, IEnumerable<string> returnTypes) {
180+
public bool TryAddOverload(string name, string documentation, string[] names, string[] types, string[] defaults, IEnumerable<string> returnTypes) {
186181
if (names.Length != _pnames.Length || types.Length != _ptypes.Length) {
187182
return false;
188183
}
@@ -196,7 +191,7 @@ public bool TryAddOverload(string name, string documentation, string[] names, IA
196191
return false;
197192
}
198193

199-
for (int i = 0; i < _pnames.Length; ++i) {
194+
for (var i = 0; i < _pnames.Length; ++i) {
200195
_pnames[i] = ChooseBest(_pnames[i], names[i]);
201196
_ptypes[i] = ChooseBest(_ptypes[i], types[i]);
202197
_pdefaults[i] = ChooseBest(_pdefaults[i], defaults[i]);
@@ -218,15 +213,15 @@ public bool TryAddOverload(string name, string documentation, string[] names, IA
218213

219214
public OverloadResult ToOverloadResult() {
220215
var parameters = new ParameterResult[_pnames.Length];
221-
for (int i = 0; i < parameters.Length; ++i) {
216+
for (var i = 0; i < parameters.Length; ++i) {
222217
if (string.IsNullOrEmpty(_pnames[i])) {
223218
return null;
224219
}
225220

226221
parameters[i] = new ParameterResult(
227222
_pnames[i],
228223
null,
229-
(_ptypes[i] == null || _ptypes[i].IsObjectOrUnknown()) ? null : string.Join(", ", _ptypes[i].GetShortDescriptions()),
224+
_ptypes[i],
230225
false,
231226
null,
232227
_pdefaults[i]
@@ -245,7 +240,6 @@ class BuiltinFunctionOverloadResult : OverloadResult {
245240
private readonly Func<string> _fallbackDoc;
246241
private string _doc;
247242
private IReadOnlyList<string> _returnTypes;
248-
private static readonly string _calculating = "Documentation is still being calculated, please try again soon.";
249243

250244
// Used by ToString to ensure docs have completed
251245
private Task _docTask;
@@ -306,7 +300,7 @@ public override string Documentation {
306300

307301
private void Calculate() {
308302
// initially fill in w/ a string saying we don't yet have the documentation
309-
_doc = _calculating;
303+
_doc = Resources.CalculatingDocumentation;
310304
_docTask = Task.Factory.StartNew(DocCalculator);
311305
}
312306

@@ -322,15 +316,15 @@ private void DocCalculator() {
322316
}
323317

324318
foreach (var param in _overload.GetParameters()) {
325-
if (!String.IsNullOrEmpty(param.Documentation)) {
319+
if (!string.IsNullOrEmpty(param.Documentation)) {
326320
doc.AppendLine();
327321
doc.Append(param.Name);
328322
doc.Append(": ");
329323
doc.Append(param.Documentation);
330324
}
331325
}
332326

333-
if (!String.IsNullOrEmpty(_overload.ReturnDocumentation)) {
327+
if (!string.IsNullOrEmpty(_overload.ReturnDocumentation)) {
334328
doc.AppendLine();
335329
doc.AppendLine();
336330
doc.Append("Returns: ");
@@ -353,7 +347,7 @@ public override ParameterResult[] Parameters {
353347

354348
var pinfo = _overload.GetParameters();
355349
var result = new List<ParameterResult>(pinfo.Length + _extraParameters.Length);
356-
int ignored = 0;
350+
var ignored = 0;
357351
ParameterResult kwDict = null;
358352
foreach (var param in pinfo) {
359353
if (ignored < _removedParams) {
@@ -386,7 +380,7 @@ public override ParameterResult[] Parameters {
386380
}
387381

388382
internal ParameterResult GetParameterResultFromParameterInfo(IParameterInfo param) {
389-
string name = param.Name;
383+
var name = param.Name;
390384

391385
string typeName;
392386
if (param.ParameterTypes != null) {
@@ -396,8 +390,7 @@ internal ParameterResult GetParameterResultFromParameterInfo(IParameterInfo para
396390
}
397391
if (param.IsParamArray) {
398392
name = "*" + name;
399-
var advType = param.ParameterTypes as IAdvancedPythonType;
400-
if (advType != null && advType.IsArray) {
393+
if (param.ParameterTypes is IAdvancedPythonType advType && advType.IsArray) {
401394
var elemType = advType.GetElementType();
402395
if (elemType == _projectState.Types[BuiltinTypeId.Object]) {
403396
typeName = "sequence";
@@ -410,8 +403,8 @@ internal ParameterResult GetParameterResultFromParameterInfo(IParameterInfo para
410403
typeName = "object";
411404
}
412405

413-
bool isOptional = false;
414-
string defaultValue = param.DefaultValue;
406+
var isOptional = false;
407+
var defaultValue = param.DefaultValue;
415408
if (defaultValue != null && defaultValue.Length == 0) {
416409
isOptional = true;
417410
defaultValue = null;
@@ -450,7 +443,7 @@ public override bool Equals(OverloadResult x, OverloadResult y) {
450443
return false;
451444
}
452445

453-
for (int i = 0; i < x.Parameters.Length; ++i) {
446+
for (var i = 0; i < x.Parameters.Length; ++i) {
454447
if (_weak) {
455448
if (!x.Parameters[i].Name.Equals(y.Parameters[i].Name)) {
456449
return false;
@@ -468,7 +461,7 @@ public override bool Equals(OverloadResult x, OverloadResult y) {
468461
public override int GetHashCode(OverloadResult obj) {
469462
// Don't use Documentation for hash code, since it changes over time
470463
// in some implementations of IOverloadResult.
471-
int hc = 552127 ^ obj.Name.GetHashCode();
464+
var hc = 552127 ^ obj.Name.GetHashCode();
472465
if (obj.Parameters != null) {
473466
foreach (var p in obj.Parameters) {
474467
hc ^= _weak ? p.Name.GetHashCode() : p.GetHashCode();

src/Analysis/Engine/Impl/Resources.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Analysis/Engine/Impl/Resources.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,4 +300,7 @@
300300
<value># Sets the width for wrapping comments
301301
# and documentation strings.</value>
302302
</data>
303+
<data name="CalculatingDocumentation" xml:space="preserve">
304+
<value>Documentation is still being calculated, please try again soon.</value>
305+
</data>
303306
</root>

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

Lines changed: 4 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,15 @@ 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
}
341340
} else if (this is ConstantInfo || ns is ConstantInfo) {
342341
return ClassInfo.Instance;
343342
}
344-
345343
return base.UnionMergeTypes(ns, strength);
346344
}
347345

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ private OverloadResult GetNewOverloadResult(OverloadResult overload) {
303303
return new OverloadResult(
304304
overload.Parameters.RemoveFirst(),
305305
ClassDefinition.Name,
306-
String.IsNullOrEmpty(doc) ? Documentation : doc,
306+
string.IsNullOrEmpty(doc) ? Documentation : doc,
307307
overload.ReturnType
308308
);
309309
}
@@ -313,7 +313,7 @@ private OverloadResult GetInitOverloadResult(OverloadResult overload) {
313313
return new OverloadResult(
314314
overload.Parameters.RemoveFirst(),
315315
ClassDefinition.Name,
316-
String.IsNullOrEmpty(doc) ? Documentation : doc,
316+
string.IsNullOrEmpty(doc) ? Documentation : doc,
317317
overload.ReturnType
318318
);
319319
}

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

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -466,27 +466,9 @@ public override IEnumerable<OverloadResult> Overloads {
466466

467467
foreach (var unit in units) {
468468
var names = FunctionDefinition.Parameters.Select(MakeParameterName).ToArray();
469-
470-
var vars = FunctionDefinition.Parameters.Select(p => {
471-
if (unit != AnalysisUnit && unit.InterpreterScope.TryGetVariable(p.Name, out var param)) {
472-
return param.Types.Resolve(unit);
473-
} else if (_analysisUnit._scope is FunctionScope fs) {
474-
return fs.GetParameter(p.Name)?.Types.Resolve(unit) ?? AnalysisSet.Empty;
475-
}
476-
return AnalysisSet.Empty;
477-
}).ToArray();
478-
469+
var vars = FunctionDefinition.Parameters.Select(p => GetAnnotation(ProjectState, p, DeclaringModule.Tree)).ToArray();
479470
var defaults = FunctionDefinition.Parameters.Select(p => GetDefaultValue(unit.State, p, DeclaringModule.Tree)).ToArray();
480-
481-
var rtypes = (unit.Scope as FunctionScope)?.ReturnValue
482-
.Types
483-
.Resolve(unit, new ResolutionContext {
484-
Caller = this,
485-
LazyCallArgs = new Lazy<ArgumentSet>(() => new ArgumentSet(vars, null, null, null)),
486-
ResolveFully = true
487-
}, out _)
488-
.GetShortDescriptions()
489-
.ToArray();
471+
var rtypes = GetReturnValue().GetShortDescriptions().ToArray();
490472

491473
bool needNewSet = true;
492474
foreach (var set in parameterSets) {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ public InstanceInfo(ClassInfo classInfo) {
3333
_classInfo = classInfo;
3434
}
3535

36+
public override string Name => _classInfo.Name;
37+
public override IPythonType PythonType => _classInfo.PythonType;
38+
3639
public override IDictionary<string, IAnalysisSet> GetAllMembers(IModuleContext moduleContext, GetMemberOptions options = GetMemberOptions.None) {
3740
var res = new Dictionary<string, IAnalysisSet>();
3841
if (_instanceAttrs != null) {

0 commit comments

Comments
 (0)