@@ -55,27 +55,12 @@ private predicate isObjectClass(Class c) { c instanceof ObjectType }
5555 * Either a value type (`ValueType`) or a reference type (`RefType`).
5656 */
5757class ValueOrRefType extends DotNet:: ValueOrRefType , Type , Attributable , @value_or_ref_type {
58- /** Gets the name of this type without `<...>` brackets, in case it is a constructed type. */
59- private string getNameWithoutBrackets ( ) {
60- exists ( UnboundGenericType unbound , string name |
61- unbound = this .( ConstructedType ) .getUnboundDeclaration ( ) and
62- name = unbound .getName ( ) and
63- result = name .prefix ( name .length ( ) - unbound .getNumberOfTypeParameters ( ) - 1 )
64- )
65- or
66- not this instanceof ConstructedType and
67- result = this .getName ( )
68- }
69-
70- language [ monotonicAggregates]
71- private string getQualifiedTypeArguments ( ) {
72- result =
73- strictconcat ( Type t , int i |
74- t = this .( ConstructedType ) .getTypeArgument ( i )
75- |
76- t .getQualifiedName ( ) , "," order by i
77- )
78- }
58+ /**
59+ * DEPRECATED: use `getUndecoratedName()` instead.
60+ *
61+ * Gets the name of this type without `<...>` brackets, in case it is a generic type.
62+ */
63+ deprecated string getNameWithoutBrackets ( ) { types ( this , _, result ) }
7964
8065 /**
8166 * Holds if this type has the qualified name `qualifier`.`name`.
@@ -84,21 +69,14 @@ class ValueOrRefType extends DotNet::ValueOrRefType, Type, Attributable, @value_
8469 * `qualifier`=`System.IO` and `name`=`IOException`.
8570 */
8671 override predicate hasQualifiedName ( string qualifier , string name ) {
87- exists ( string name0 |
88- not this instanceof ConstructedType and
89- name = name0
90- or
91- name = name0 + "<" + this .getQualifiedTypeArguments ( ) + ">"
92- |
93- exists ( string enclosing |
94- this .getDeclaringType ( ) .hasQualifiedName ( qualifier , enclosing ) and
95- name0 = enclosing + "+" + this .getNameWithoutBrackets ( )
96- )
97- or
98- not exists ( this .getDeclaringType ( ) ) and
99- qualifier = this .getNamespace ( ) .getQualifiedName ( ) and
100- name0 = this .getNameWithoutBrackets ( )
72+ exists ( string enclosing |
73+ this .getDeclaringType ( ) .hasQualifiedName ( qualifier , enclosing ) and
74+ name = enclosing + "+" + this .getUndecoratedName ( )
10175 )
76+ or
77+ not exists ( this .getDeclaringType ( ) ) and
78+ qualifier = this .getNamespace ( ) .getQualifiedName ( ) and
79+ name = this .getUndecoratedName ( )
10280 }
10381
10482 /** Gets the namespace containing this type. */
@@ -112,16 +90,7 @@ class ValueOrRefType extends DotNet::ValueOrRefType, Type, Attributable, @value_
11290
11391 override ValueOrRefType getDeclaringType ( ) { none ( ) }
11492
115- override string getUndecoratedName ( ) {
116- if this .getName ( ) .indexOf ( "<" ) > 0
117- then
118- exists ( string name , int p |
119- name = this .getName ( ) and p = min ( int p2 | p2 = name .indexOf ( "<" ) and p2 > 0 )
120- |
121- result = name .substring ( 0 , p )
122- )
123- else result = this .getName ( )
124- }
93+ override string getUndecoratedName ( ) { types ( this , _, result ) }
12594
12695 /** Gets a nested child type, if any. */
12796 NestedType getAChildType ( ) { nested_types ( result , this , _) }
@@ -201,6 +170,7 @@ class ValueOrRefType extends DotNet::ValueOrRefType, Type, Attributable, @value_
201170 * }
202171 * ```
203172 */
173+ pragma [ inline]
204174 predicate hasMethod ( Method m ) { this .hasMember ( m ) }
205175
206176 /**
@@ -227,6 +197,7 @@ class ValueOrRefType extends DotNet::ValueOrRefType, Type, Attributable, @value_
227197 * }
228198 * ```
229199 */
200+ pragma [ inline]
230201 predicate hasCallable ( Callable c ) {
231202 hasMethod ( c )
232203 or
@@ -256,25 +227,15 @@ class ValueOrRefType extends DotNet::ValueOrRefType, Type, Attributable, @value_
256227 * }
257228 * ```
258229 */
230+ pragma [ inline]
259231 predicate hasMember ( Member m ) {
260- // For performance reasons, split up into "cheap" computation
261- // (non-overridden members) and "expensive" computation
262- // (overridden members). The latter is cached, and generally
263- // much smaller than the full relation.
264- hasNonOverriddenMember ( m )
232+ m = this .getAMember ( )
233+ or
234+ hasNonOverriddenMember ( this .getBaseClass + ( ) , m )
265235 or
266236 hasOverriddenMember ( m )
267237 }
268238
269- private predicate hasNonOverriddenMember ( Member m ) {
270- isNonOverridden ( m ) and
271- (
272- m = getAMember ( )
273- or
274- getBaseClass + ( ) .getAMember ( ) = m and not m .isPrivate ( )
275- )
276- }
277-
278239 cached
279240 private predicate hasOverriddenMember ( Virtualizable v ) {
280241 v .isOverridden ( ) and
@@ -753,8 +714,12 @@ class RefType extends ValueOrRefType, @ref_type {
753714 override predicate isRefType ( ) { any ( ) }
754715}
755716
756- // Helper predicate to avoid slow "negation_body"
757- private predicate isNonOverridden ( Member m ) { not m .( Virtualizable ) .isOverridden ( ) }
717+ pragma [ noinline]
718+ private predicate hasNonOverriddenMember ( Class c , Member m ) {
719+ m = c .getAMember ( ) and
720+ not m .( Virtualizable ) .isOverridden ( ) and
721+ not m .isPrivate ( )
722+ }
758723
759724/**
760725 * A `class`, for example
@@ -963,6 +928,15 @@ class NullableType extends ValueType, DotNet::ConstructedGeneric, @nullable_type
963928 override Type getTypeArgument ( int p ) { p = 0 and result = getUnderlyingType ( ) }
964929
965930 override string getAPrimaryQlClass ( ) { result = "NullableType" }
931+
932+ final override string getName ( ) {
933+ result = "Nullable<" + this .getUnderlyingType ( ) .getName ( ) + ">"
934+ }
935+
936+ final override predicate hasQualifiedName ( string qualifier , string name ) {
937+ qualifier = "System" and
938+ name = "Nullable<" + this .getUnderlyingType ( ) .getQualifiedName ( ) + ">"
939+ }
966940}
967941
968942/**
@@ -1046,7 +1020,7 @@ class PointerType extends DotNet::PointerType, Type, @pointer_type {
10461020
10471021 override Type getChild ( int n ) { result = getReferentType ( ) and n = 0 }
10481022
1049- override string getName ( ) { result = DotNet :: PointerType . super . getName ( ) }
1023+ override string getName ( ) { types ( this , _ , result ) }
10501024
10511025 override Location getALocation ( ) { result = getReferentType ( ) .getALocation ( ) }
10521026
@@ -1120,11 +1094,14 @@ class TupleType extends ValueType, @tuple_type {
11201094 override string toStringWithTypes ( ) {
11211095 result =
11221096 "(" +
1123- concat ( int i |
1124- exists ( getElement ( i ) )
1125- |
1126- getElement ( i ) .getType ( ) .toStringWithTypes ( ) , ", " order by i
1127- ) + ")"
1097+ concat ( Type t , int i | t = getElement ( i ) .getType ( ) | t .toStringWithTypes ( ) , ", " order by i )
1098+ + ")"
1099+ }
1100+
1101+ language [ monotonicAggregates]
1102+ override string getName ( ) {
1103+ result =
1104+ "(" + concat ( Type t , int i | t = getElement ( i ) .getType ( ) | t .getName ( ) , "," order by i ) + ")"
11281105 }
11291106
11301107 override string getLabel ( ) { result = getUnderlyingType ( ) .getLabel ( ) }
0 commit comments