@@ -196,33 +196,36 @@ abstract class Declaration extends Locatable, @declaration {
196196 * When called on a template, this will return a template parameter type for
197197 * both typed and non-typed parameters.
198198 */
199- final Type getATemplateArgument ( ) { result = getTemplateArgument ( _) }
199+ final Locatable getATemplateArgument ( ) { result = getTemplateArgument ( _) }
200200
201201 /**
202202 * Gets a template argument used to instantiate this declaration from a template.
203203 * When called on a template, this will return a non-typed template
204204 * parameter value.
205205 */
206- final Expr getATemplateArgumentValue ( ) { result = getTemplateArgumentValue ( _) }
206+ final Locatable getATemplateArgumentKind ( ) { result = getTemplateArgumentKind ( _) }
207207
208208 /**
209209 * Gets the `i`th template argument used to instantiate this declaration from a
210- * template. When called on a template, this will return the `i`th template
211- * parameter's type.
210+ * template.
212211 *
213212 * For example:
214213 *
215214 * `template<typename T, T X> class Foo;`
216215 *
217216 * Will have `getTemplateArgument(0)` return `T`, and
218- * `getTemplateArgument(1)` return `T `.
217+ * `getTemplateArgument(1)` return `X `.
219218 *
220219 * `Foo<int, 1> bar;
221220 *
222221 * Will have `getTemplateArgument())` return `int`, and
223- * `getTemplateArgument(1)` return `int `.
222+ * `getTemplateArgument(1)` return `1 `.
224223 */
225- Type getTemplateArgument ( int index ) { none ( ) }
224+ final Locatable getTemplateArgument ( int index ) {
225+ if exists ( getTemplateArgumentValue ( index ) )
226+ then result = getTemplateArgumentValue ( index )
227+ else result = getTemplateArgumentType ( index )
228+ }
226229
227230 /**
228231 * Gets the `i`th template argument value used to instantiate this declaration
@@ -233,20 +236,44 @@ abstract class Declaration extends Locatable, @declaration {
233236 *
234237 * `template<typename T, T X> class Foo;`
235238 *
236- * Will have `getTemplateArgumentValue (1)` return `X `, and no result for
237- * `getTemplateArgumentValue (0)`.
239+ * Will have `getTemplateArgumentKind (1)` return `T `, and no result for
240+ * `getTemplateArgumentKind (0)`.
238241 *
239242 * `Foo<int, 10> bar;
240243 *
241- * Will have `getTemplateArgumentValue (1)` return `10 `, and no result for
242- * `getTemplateArgumentValue (0)`.
244+ * Will have `getTemplateArgumentKind (1)` return `int `, and no result for
245+ * `getTemplateArgumentKind (0)`.
243246 */
244- Expr getTemplateArgumentValue ( int index ) { none ( ) }
247+ final Locatable getTemplateArgumentKind ( int index ) {
248+ if exists ( getTemplateArgumentValue ( index ) )
249+ then result = getTemplateArgumentType ( index )
250+ else none ( )
251+ }
245252
246253 /** Gets the number of template arguments for this declaration. */
247254 final int getNumberOfTemplateArguments ( ) {
248255 result = count ( int i | exists ( getTemplateArgument ( i ) ) )
249256 }
257+
258+ /**
259+ * INTERNAL: Do not use.
260+ *
261+ * Gets a Type for a template argument. May be the template argument itself
262+ * or the type of a non-type template argument.
263+ *
264+ * Use `getTemplateArgument` or `getTemplateKind` instead.
265+ */
266+ Type getTemplateArgumentType ( int index ) { none ( ) }
267+
268+ /**
269+ * INTERNAL: Do not use.
270+ *
271+ * Gets an Expression representing the value of a non-type template
272+ * argument.
273+ *
274+ * Use `getTemplateArgument` or `getTemplateKind` instead.
275+ */
276+ Expr getTemplateArgumentValue ( int index ) { none ( ) }
250277}
251278
252279/**
0 commit comments