diff --git a/swift/ql/lib/codeql/swift/elements/type/FloatingPointType.qll b/swift/ql/lib/codeql/swift/elements/type/FloatingPointType.qll deleted file mode 100644 index e5ae0ac3e7a0..000000000000 --- a/swift/ql/lib/codeql/swift/elements/type/FloatingPointType.qll +++ /dev/null @@ -1,12 +0,0 @@ -private import swift - -/** - * A floating-point type. This includes the `Float` type, the `Double`, and - * builtin floating-point types. - */ -class FloatingPointType extends Type { - FloatingPointType() { - this.getName() = ["Float", "Double"] or - this instanceof BuiltinFloatType - } -} diff --git a/swift/ql/lib/codeql/swift/elements/type/NumericOrCharType.qll b/swift/ql/lib/codeql/swift/elements/type/NumericOrCharType.qll deleted file mode 100644 index 217690039edc..000000000000 --- a/swift/ql/lib/codeql/swift/elements/type/NumericOrCharType.qll +++ /dev/null @@ -1,35 +0,0 @@ -private import swift - -/** The `Character` type. */ -class CharacterType extends StructType { - CharacterType() { this.getName() = "Character" } -} - -/** - * An integer-like type. For example, `Int`, `Int16`, `Uint16`, etc. - */ -class IntegerType extends Type { - IntegerType() { - this.getName() = - ["Int", "Int8", "Int16", "Int32", "Int64", "UInt", "UInt8", "UInt16", "UInt32", "UInt64"] - or - this instanceof BuiltinIntegerType - } -} - -/** The `Bool` type. */ -class BooleanType extends Type { - BooleanType() { this.getName() = "Bool" } -} - -/** - * A numeric-like type. This includes the types `Character`, `Bool`, and all - * the integer-like types. - */ -class NumericOrCharType extends Type { - NumericOrCharType() { - this instanceof CharacterType or - this instanceof IntegerType or - this instanceof BooleanType - } -} diff --git a/swift/ql/lib/codeql/swift/elements/type/NumericType.qll b/swift/ql/lib/codeql/swift/elements/type/NumericType.qll new file mode 100644 index 000000000000..1becac4493b4 --- /dev/null +++ b/swift/ql/lib/codeql/swift/elements/type/NumericType.qll @@ -0,0 +1,44 @@ +private import swift + +/** + * A floating-point type. This includes the `Float` type, the `Double`, and + * builtin floating-point types. + */ +class FloatingPointType extends Type { + FloatingPointType() { + this.getName() = ["Float", "Double"] or + this instanceof BuiltinFloatType + } +} + +/** The `Character` type. */ +class CharacterType extends StructType { + CharacterType() { this.getName() = "Character" } +} + +/** + * An integer-like type. For example, `Int`, `Int16`, `Uint16`, etc. + */ +class IntegralType extends Type { + IntegralType() { + this.getName() = + ["Int", "Int8", "Int16", "Int32", "Int64", "UInt", "UInt8", "UInt16", "UInt32", "UInt64"] + or + this instanceof BuiltinIntegerType + } +} + +/** The `Bool` type. */ +class BoolType extends Type { + BoolType() { this.getName() = "Bool" } +} + +/** + * A numeric type. This includes the integer and floating point types. + */ +class NumericType extends Type { + NumericType() { + this instanceof IntegralType or + this instanceof FloatingPointType + } +} diff --git a/swift/ql/lib/swift.qll b/swift/ql/lib/swift.qll index 552f2c99828d..897bbf9b2f75 100644 --- a/swift/ql/lib/swift.qll +++ b/swift/ql/lib/swift.qll @@ -10,6 +10,5 @@ import codeql.swift.elements.expr.InitializerCallExpr import codeql.swift.elements.expr.SelfRefExpr import codeql.swift.elements.decl.MethodDecl import codeql.swift.elements.decl.ClassOrStructDecl -import codeql.swift.elements.type.FloatingPointType -import codeql.swift.elements.type.NumericOrCharType +import codeql.swift.elements.type.NumericType import codeql.swift.Unit diff --git a/swift/ql/test/library-tests/elements/type/numerictype/numeric.swift b/swift/ql/test/library-tests/elements/type/numerictype/numeric.swift new file mode 100644 index 000000000000..6da917e14110 --- /dev/null +++ b/swift/ql/test/library-tests/elements/type/numerictype/numeric.swift @@ -0,0 +1,32 @@ + +typealias MyFloat = Float + +func test() { + var f1: Float + let f2 = 123.456 + let f3 = f2 + var f4: Float? + var f5: MyFloat + var f6: MyFloat? + + var d: Double + + var c: Character + + var i1: Int + let i2 = 123 + let i3 = 0xFFFF + var i4: Int8 + var i5: Int16 + var i6: Int32 + var i7: Int64 + + var u1: UInt + var u2: UInt8 + var u3: UInt16 + var u4: UInt32 + var u5: UInt64 + + var b1: Bool + let b2 = true +} diff --git a/swift/ql/test/library-tests/elements/type/numerictype/numerictype.expected b/swift/ql/test/library-tests/elements/type/numerictype/numerictype.expected new file mode 100644 index 000000000000..5670aededb83 --- /dev/null +++ b/swift/ql/test/library-tests/elements/type/numerictype/numerictype.expected @@ -0,0 +1,22 @@ +| numeric.swift:5:6:5:6 | f1 | Float | FloatingPointType, NumericType | +| numeric.swift:6:6:6:6 | f2 | Double | FloatingPointType, NumericType | +| numeric.swift:7:6:7:6 | f3 | Double | FloatingPointType, NumericType | +| numeric.swift:8:6:8:6 | f4 | Float? | | +| numeric.swift:9:6:9:6 | f5 | MyFloat | | +| numeric.swift:10:6:10:6 | f6 | MyFloat? | | +| numeric.swift:12:6:12:6 | d | Double | FloatingPointType, NumericType | +| numeric.swift:14:6:14:6 | c | Character | CharacterType | +| numeric.swift:16:6:16:6 | i1 | Int | IntegralType, NumericType | +| numeric.swift:17:6:17:6 | i2 | Int | IntegralType, NumericType | +| numeric.swift:18:6:18:6 | i3 | Int | IntegralType, NumericType | +| numeric.swift:19:6:19:6 | i4 | Int8 | IntegralType, NumericType | +| numeric.swift:20:6:20:6 | i5 | Int16 | IntegralType, NumericType | +| numeric.swift:21:6:21:6 | i6 | Int32 | IntegralType, NumericType | +| numeric.swift:22:6:22:6 | i7 | Int64 | IntegralType, NumericType | +| numeric.swift:24:6:24:6 | u1 | UInt | IntegralType, NumericType | +| numeric.swift:25:6:25:6 | u2 | UInt8 | IntegralType, NumericType | +| numeric.swift:26:6:26:6 | u3 | UInt16 | IntegralType, NumericType | +| numeric.swift:27:6:27:6 | u4 | UInt32 | IntegralType, NumericType | +| numeric.swift:28:6:28:6 | u5 | UInt64 | IntegralType, NumericType | +| numeric.swift:30:6:30:6 | b1 | Bool | BoolType | +| numeric.swift:31:6:31:6 | b2 | Bool | BoolType | diff --git a/swift/ql/test/library-tests/elements/type/numerictype/numerictype.ql b/swift/ql/test/library-tests/elements/type/numerictype/numerictype.ql new file mode 100644 index 000000000000..7f3fb4591f84 --- /dev/null +++ b/swift/ql/test/library-tests/elements/type/numerictype/numerictype.ql @@ -0,0 +1,19 @@ +import swift + +string describe(Type t) { + t instanceof FloatingPointType and result = "FloatingPointType" + or + t instanceof CharacterType and result = "CharacterType" + or + t instanceof IntegralType and result = "IntegralType" + or + t instanceof BoolType and result = "BoolType" + or + t instanceof NumericType and result = "NumericType" +} + +from VarDecl v, Type t +where + v.getLocation().getFile().getBaseName() != "" and + t = v.getType() +select v, t.toString(), concat(describe(t), ", ")