15
15
16
16
using System . Collections . Generic ;
17
17
using System . Linq ;
18
+ using Microsoft . Python . Analysis . Diagnostics ;
18
19
using Microsoft . Python . Analysis . Modules ;
19
20
using Microsoft . Python . Analysis . Specializations . Typing . Types ;
20
21
using Microsoft . Python . Analysis . Types ;
@@ -61,7 +62,7 @@ private void SpecializeMembers() {
61
62
o = new PythonFunctionOverload ( fn . Name , location ) ;
62
63
// When called, create generic parameter type. For documentation
63
64
// use original TypeVar declaration so it appear as a tooltip.
64
- o . SetReturnValueProvider ( ( interpreter , overload , args ) => CreateTypeAlias ( args . Values < IMember > ( ) ) ) ;
65
+ o . SetReturnValueProvider ( ( interpreter , overload , args ) => CreateTypeAlias ( args ) ) ;
65
66
fn . AddOverload ( o ) ;
66
67
_members [ "NewType" ] = fn ;
67
68
@@ -81,41 +82,41 @@ private void SpecializeMembers() {
81
82
82
83
_members [ "Iterable" ] = new GenericType ( "Iterable" , typeArgs => CreateListType ( "Iterable" , BuiltinTypeId . List , typeArgs , false ) , this ) ;
83
84
_members [ "Sequence" ] = new GenericType ( "Sequence" , typeArgs => CreateListType ( "Sequence" , BuiltinTypeId . List , typeArgs , false ) , this ) ;
84
- _members [ "MutableSequence" ] = new GenericType ( "MutableSequence" ,
85
+ _members [ "MutableSequence" ] = new GenericType ( "MutableSequence" ,
85
86
typeArgs => CreateListType ( "MutableSequence" , BuiltinTypeId . List , typeArgs , true ) , this ) ;
86
- _members [ "List" ] = new GenericType ( "List" ,
87
+ _members [ "List" ] = new GenericType ( "List" ,
87
88
typeArgs => CreateListType ( "List" , BuiltinTypeId . List , typeArgs , true ) , this ) ;
88
89
89
- _members [ "MappingView" ] = new GenericType ( "MappingView" ,
90
+ _members [ "MappingView" ] = new GenericType ( "MappingView" ,
90
91
typeArgs => CreateDictionary ( "MappingView" , typeArgs , false ) , this ) ;
91
92
92
93
_members [ "KeysView" ] = new GenericType ( "KeysView" , CreateKeysViewType , this ) ;
93
94
_members [ "ValuesView" ] = new GenericType ( "ValuesView" , CreateValuesViewType , this ) ;
94
95
_members [ "ItemsView" ] = new GenericType ( "ItemsView" , CreateItemsViewType , this ) ;
95
96
96
- _members [ "Set" ] = new GenericType ( "Set" ,
97
+ _members [ "Set" ] = new GenericType ( "Set" ,
97
98
typeArgs => CreateListType ( "Set" , BuiltinTypeId . Set , typeArgs , true ) , this ) ;
98
- _members [ "MutableSet" ] = new GenericType ( "MutableSet" ,
99
+ _members [ "MutableSet" ] = new GenericType ( "MutableSet" ,
99
100
typeArgs => CreateListType ( "MutableSet" , BuiltinTypeId . Set , typeArgs , true ) , this ) ;
100
- _members [ "FrozenSet" ] = new GenericType ( "FrozenSet" ,
101
+ _members [ "FrozenSet" ] = new GenericType ( "FrozenSet" ,
101
102
typeArgs => CreateListType ( "FrozenSet" , BuiltinTypeId . Set , typeArgs , false ) , this ) ;
102
103
103
104
_members [ "Tuple" ] = new GenericType ( "Tuple" , CreateTupleType , this ) ;
104
105
105
- _members [ "Mapping" ] = new GenericType ( "Mapping" ,
106
+ _members [ "Mapping" ] = new GenericType ( "Mapping" ,
106
107
typeArgs => CreateDictionary ( "Mapping" , typeArgs , false ) , this ) ;
107
- _members [ "MutableMapping" ] = new GenericType ( "MutableMapping" ,
108
+ _members [ "MutableMapping" ] = new GenericType ( "MutableMapping" ,
108
109
typeArgs => CreateDictionary ( "MutableMapping" , typeArgs , true ) , this ) ;
109
- _members [ "Dict" ] = new GenericType ( "Dict" ,
110
+ _members [ "Dict" ] = new GenericType ( "Dict" ,
110
111
typeArgs => CreateDictionary ( "Dict" , typeArgs , true ) , this ) ;
111
- _members [ "OrderedDict" ] = new GenericType ( "OrderedDict" ,
112
+ _members [ "OrderedDict" ] = new GenericType ( "OrderedDict" ,
112
113
typeArgs => CreateDictionary ( "OrderedDict" , typeArgs , true ) , this ) ;
113
- _members [ "DefaultDict" ] = new GenericType ( "DefaultDict" ,
114
+ _members [ "DefaultDict" ] = new GenericType ( "DefaultDict" ,
114
115
typeArgs => CreateDictionary ( "DefaultDict" , typeArgs , true ) , this ) ;
115
116
116
117
_members [ "Union" ] = new GenericType ( "Union" , CreateUnion , this ) ;
117
118
118
- _members [ "Counter" ] = Specialized . Function ( "Counter" , this , GetMemberDocumentation ( "Counter" ) ,
119
+ _members [ "Counter" ] = Specialized . Function ( "Counter" , this , GetMemberDocumentation ( "Counter" ) ,
119
120
new PythonInstance ( Interpreter . GetBuiltinType ( BuiltinTypeId . Int ) ) ) ;
120
121
121
122
_members [ "SupportsInt" ] = Interpreter . GetBuiltinType ( BuiltinTypeId . Int ) ;
@@ -217,13 +218,25 @@ private IPythonType CreateItemsViewType(IReadOnlyList<IPythonType> typeArgs) {
217
218
return Interpreter . UnknownType ;
218
219
}
219
220
220
- private IPythonType CreateTypeAlias ( IReadOnlyList < IMember > typeArgs ) {
221
+ private IPythonType CreateTypeAlias ( IArgumentSet args ) {
222
+ var typeArgs = args . Values < IMember > ( ) ;
221
223
if ( typeArgs . Count == 2 ) {
222
224
var typeName = ( typeArgs [ 0 ] as IPythonConstant ) ? . Value as string ;
223
225
if ( ! string . IsNullOrEmpty ( typeName ) ) {
224
226
return new TypeAlias ( typeName , typeArgs [ 1 ] . GetPythonType ( ) ?? Interpreter . UnknownType ) ;
225
227
}
226
- // TODO: report incorrect first argument to NewVar
228
+
229
+ var firstArgType = ( typeArgs [ 0 ] as PythonInstance ) ? . Type . Name ;
230
+ var eval = args . Eval ;
231
+ var expression = args . Expression ;
232
+
233
+ eval . ReportDiagnostics (
234
+ eval . Module ? . Uri ,
235
+ new DiagnosticsEntry ( Resources . NewTypeFirstArgNotString . FormatInvariant ( firstArgType ) ,
236
+ expression . GetLocation ( eval . Module ) . Span ,
237
+ Diagnostics . ErrorCodes . NewTypeArguments ,
238
+ Severity . Error , DiagnosticSource . Analysis )
239
+ ) ;
227
240
}
228
241
// TODO: report wrong number of arguments
229
242
return Interpreter . UnknownType ;
@@ -331,7 +344,7 @@ private IPythonType CreateGenericClassParameter(IReadOnlyList<IPythonType> typeA
331
344
return Interpreter . UnknownType ;
332
345
}
333
346
334
- private IPythonType ToGenericTemplate ( string typeName , IGenericTypeDefinition [ ] typeArgs , BuiltinTypeId typeId )
347
+ private IPythonType ToGenericTemplate ( string typeName , IGenericTypeDefinition [ ] typeArgs , BuiltinTypeId typeId )
335
348
=> _members [ typeName ] is GenericType gt
336
349
? new GenericType ( CodeFormatter . FormatSequence ( typeName , '[' , typeArgs ) , gt . SpecificTypeConstructor , this , typeId , typeArgs )
337
350
: Interpreter . UnknownType ;
0 commit comments