@@ -8,14 +8,19 @@ private import codeql.swift.elements.decl.EnumElementDecl
88/**
99 * An expression that constructs a case of an enum.
1010 */
11- abstract class EnumElementExpr extends Expr {
11+ class EnumElementExpr extends Expr {
1212 EnumElementDecl decl ;
1313
14+ EnumElementExpr ( ) {
15+ this .( NullaryEnumElementExpr ) .getElement ( ) = decl or
16+ this .( NonNullaryEnumElementExpr ) .getElement ( ) = decl
17+ }
18+
1419 /** Gets the declaration of the enum element that this expression creates. */
1520 EnumElementDecl getElement ( ) { result = decl }
1621
1722 /** Gets the `i`th argument passed to this enum element expression (0-based). */
18- Argument getArgument ( int i ) { none ( ) }
23+ Argument getArgument ( int i ) { result = this . ( NonNullaryEnumElementExpr ) . getArgument ( i ) }
1924
2025 /** Gets an argument passed to this enum element expression, if any. */
2126 final Argument getAnArgument ( ) { result = this .getArgument ( _) }
@@ -24,23 +29,28 @@ abstract class EnumElementExpr extends Expr {
2429 final int getNumberOfArguments ( ) { result = count ( this .getArgument ( _) ) }
2530}
2631
32+ /**
33+ * An expression that refers to an enum element, either directly in the case of a nullary enum element,
34+ * or referring to the enum element constructor in the case of a non-nullary enum element.
35+ */
2736private class EnumElementLookupExpr extends MethodLookupExpr {
2837 EnumElementLookupExpr ( ) { this .getMember ( ) instanceof EnumElementDecl }
2938}
3039
31- private class NullaryEnumElementExpr extends EnumElementExpr instanceof EnumElementLookupExpr {
32- NullaryEnumElementExpr ( ) {
33- this .getMember ( ) = decl and not exists ( CallExpr ce | ce .getFunction ( ) = this )
34- }
40+ /** An expression creating an enum with no arguments */
41+ private class NullaryEnumElementExpr extends EnumElementLookupExpr {
42+ /** Gets the declaration of the enum element that this expression creates. */
43+ EnumElementDecl getElement ( ) { this .getMember ( ) = result }
44+
45+ NullaryEnumElementExpr ( ) { not exists ( CallExpr ce | ce .getFunction ( ) = this ) }
3546}
3647
37- private class NonNullaryEnumElementExpr extends EnumElementExpr instanceof CallExpr {
38- NonNullaryEnumElementExpr ( ) {
39- exists ( EnumElementLookupExpr eele |
40- this .getFunction ( ) = eele and
41- eele .getMember ( ) = decl
42- )
43- }
48+ /** An expression creating an enum with arguments */
49+ private class NonNullaryEnumElementExpr extends CallExpr {
50+ EnumElementLookupExpr eele ;
51+
52+ /** Gets the declaration of the enum element that this expression creates. */
53+ EnumElementDecl getElement ( ) { eele .getMember ( ) = result }
4454
45- override Argument getArgument ( int i ) { result = CallExpr . super . getArgument ( i ) }
55+ NonNullaryEnumElementExpr ( ) { this . getFunction ( ) = eele }
4656}
0 commit comments