@@ -23,27 +23,36 @@ private TypeMention(Context cx, TypeSyntax syntax, IEntity parent, Type type, Mi
2323 this . loc = loc ;
2424 }
2525
26- private static TypeSyntax GetElementType ( TypeSyntax type )
26+ private TypeSyntax GetArrayElementType ( TypeSyntax type )
2727 {
2828 switch ( type )
2929 {
3030 case ArrayTypeSyntax ats :
31- return GetElementType ( ats . ElementType ) ;
31+ return GetArrayElementType ( ats . ElementType ) ;
3232 case NullableTypeSyntax nts :
33- return GetElementType ( nts . ElementType ) ;
33+ // int[]? -> int[] -> int
34+ // int? -> int?
35+ return cx . GetTypeInfo ( nts . ElementType ) . Type . IsReferenceType
36+ ? GetArrayElementType ( nts . ElementType )
37+ : nts ;
38+ case PointerTypeSyntax pts :
39+ return GetArrayElementType ( pts . ElementType ) ;
3440 default :
3541 return type ;
3642 }
3743 }
3844
39- private static Type GetElementType ( Type type )
45+ private static Type GetArrayElementType ( Type type )
4046 {
4147 switch ( type )
4248 {
4349 case ArrayType at :
44- return GetElementType ( at . ElementType . Type ) ;
45- case NamedType nt when nt . symbol . IsBoundNullable ( ) :
50+ return GetArrayElementType ( at . ElementType . Type ) ;
51+ case NamedType nt when nt . symbol . IsBoundSpan ( ) ||
52+ nt . symbol . IsBoundReadOnlySpan ( ) :
4653 return nt . TypeArguments . Single ( ) ;
54+ case PointerType pt :
55+ return GetArrayElementType ( pt . PointedAtType ) ;
4756 default :
4857 return type ;
4958 }
@@ -54,19 +63,27 @@ protected override void Populate(TextWriter trapFile)
5463 switch ( syntax . Kind ( ) )
5564 {
5665 case SyntaxKind . ArrayType :
66+ case SyntaxKind . PointerType :
5767 Emit ( trapFile , loc ?? syntax . GetLocation ( ) , parent , type ) ;
58- Create ( cx , GetElementType ( syntax ) , this , GetElementType ( type ) ) ;
68+ Create ( cx , GetArrayElementType ( syntax ) , this , GetArrayElementType ( type ) ) ;
5969 return ;
6070 case SyntaxKind . NullableType :
6171 var nts = ( NullableTypeSyntax ) syntax ;
6272 if ( type is NamedType nt )
6373 {
64- Emit ( trapFile , loc ?? syntax . GetLocation ( ) , parent , type ) ;
65- Create ( cx , nts . ElementType , this , nt . symbol . IsReferenceType ? nt : nt . TypeArguments [ 0 ] ) ;
74+ if ( ! nt . symbol . IsReferenceType )
75+ {
76+ Emit ( trapFile , loc ?? syntax . GetLocation ( ) , parent , type ) ;
77+ Create ( cx , nts . ElementType , this , nt . TypeArguments [ 0 ] ) ;
78+ }
79+ else
80+ {
81+ Create ( cx , nts . ElementType , parent , type ) ;
82+ }
6683 }
67- else if ( type is ArrayType array )
84+ else if ( type is ArrayType )
6885 {
69- Create ( cx , nts . ElementType , parent , array ) ;
86+ Create ( cx , nts . ElementType , parent , type ) ;
7087 }
7188 return ;
7289 case SyntaxKind . TupleType :
@@ -75,28 +92,20 @@ protected override void Populate(TextWriter trapFile)
7592 Emit ( trapFile , loc ?? syntax . GetLocation ( ) , parent , type ) ;
7693 tts . Elements . Zip ( tt . TupleElements , ( s , t ) => Create ( cx , s . Type , this , t . Type ) ) . Enumerate ( ) ;
7794 return ;
78- case SyntaxKind . PointerType :
79- var pts = ( PointerTypeSyntax ) syntax ;
80- var pt = ( PointerType ) type ;
81- Emit ( trapFile , loc ?? syntax . GetLocation ( ) , parent , type ) ;
82- Create ( cx , pts . ElementType , this , pt . PointedAtType ) ;
83- return ;
8495 case SyntaxKind . GenericName :
85- var gns = ( GenericNameSyntax ) syntax ;
86- Emit ( trapFile , loc ?? gns . Identifier . GetLocation ( ) , parent , type ) ;
87- cx . PopulateLater ( ( ) => gns . TypeArgumentList . Arguments . Zip ( type . TypeMentions , ( s , t ) => Create ( cx , s , this , t ) ) . Enumerate ( ) ) ;
96+ Emit ( trapFile , loc ?? syntax . GetLocation ( ) , parent , type ) ;
97+ cx . PopulateLater ( ( ) =>
98+ ( ( GenericNameSyntax ) syntax )
99+ . TypeArgumentList
100+ . Arguments
101+ . Zip ( type . TypeMentions , ( s , t ) => Create ( cx , s , this , t ) ) . Enumerate ( ) ) ;
88102 return ;
89103 case SyntaxKind . QualifiedName :
90- if ( type . ContainingType == null )
91- {
92- // namespace qualifier
93- Emit ( trapFile , loc ?? syntax . GetLocation ( ) , parent , type ) ;
94- }
95- else
104+ var qns = ( QualifiedNameSyntax ) syntax ;
105+ var right = Create ( cx , qns . Right , parent , type ) ;
106+ if ( type . ContainingType is object )
96107 {
97108 // Type qualifier
98- var qns = ( QualifiedNameSyntax ) syntax ;
99- var right = Create ( cx , qns . Right , parent , type ) ;
100109 Create ( cx , qns . Left , right , type . ContainingType ) ;
101110 }
102111 return ;
0 commit comments