@@ -2,63 +2,75 @@ import semmle.code.cpp.Location
22private import semmle.code.cpp.Enclosing
33private import semmle.code.cpp.internal.ResolveClass
44
5- /**
6- * Get the `@element` that represents this `@element`.
7- * Normally this will simply be `e`, but sometimes it is not.
8- * For example, for an incomplete struct `e` the result may be a
9- * complete struct with the same name.
10- */
11- private cached @element resolveElement ( @element e ) {
12- if isClass ( e )
13- then result = resolveClass ( e )
14- else result = e
15- }
16-
175/**
186 * Get the `Element` that represents this `@element`.
197 * Normally this will simply be a cast of `e`, but sometimes it is not.
208 * For example, for an incomplete struct `e` the result may be a
219 * complete struct with the same name.
2210 */
11+ pragma [ inline]
2312Element mkElement ( @element e ) {
24- result = resolveElement ( e )
13+ result . unresolve ( ) = e
2514}
2615
2716/**
28- * Get an `@element` that resolves to the `Element`. This should
17+ * INTERNAL: Do not use.
18+ *
19+ * Gets an `@element` that resolves to the `Element`. This should
2920 * normally only be called from member predicates, where `e` is not
3021 * `this` and you need the result for an argument to a database
3122 * extensional.
3223 * See `underlyingElement` for when `e` is `this`.
3324 */
25+ pragma [ inline]
3426@element unresolveElement ( Element e ) {
35- resolveElement ( result ) = e
27+ result = e . unresolve ( )
3628}
3729
3830/**
39- * Get the `@element` that this `Element` extends. This should normally
31+ * INTERNAL: Do not use.
32+ *
33+ * Gets the `@element` that this `Element` extends. This should normally
4034 * only be called from member predicates, where `e` is `this` and you
4135 * need the result for an argument to a database extensional.
4236 * See `unresolveElement` for when `e` is not `this`.
4337 */
38+ pragma [ inline]
4439@element underlyingElement ( Element e ) {
4540 result = e
4641}
4742
4843/**
49- * A C/C++ element with no member predicates other than `toString` . Not for
44+ * A C/C++ element with a minimal set of member predicates . Not for
5045 * general use. This class does not define a location, so classes wanting to
5146 * change their location without affecting other classes can extend
5247 * `ElementBase` instead of `Element` to create a new rootdef for `getURL`,
5348 * `getLocation`, or `hasLocationInfo`.
5449 */
5550class ElementBase extends @element {
56- ElementBase ( ) {
57- this = resolveElement ( _)
58- }
59-
6051 /** Gets a textual representation of this element. */
6152 string toString ( ) { none ( ) }
53+
54+ /**
55+ * INTERNAL: Do not use.
56+ *
57+ * Gets the `@element` that this `Element` extends. This should normally only
58+ * be called from member predicates on `this` where you need the result for
59+ * an argument to a database extensional.
60+ * See `unresolve` for when the qualifier is not `this`.
61+ */
62+ final @element underlying ( ) { result = this }
63+
64+ /**
65+ * INTERNAL: Do not use.
66+ *
67+ * Gets an `@element` that resolves to the `Element`. This should normally
68+ * only be called from member predicates, where the qualifier is not `this`
69+ * and you need the result for an argument to a database extensional.
70+ * See `underlying` for when the qualifier is `this`.
71+ */
72+ pragma [ inline]
73+ @element unresolve ( ) { result = this }
6274}
6375
6476/**
0 commit comments