mirror of
https://github.com/github/codeql.git
synced 2026-04-30 03:05:15 +02:00
Add DelegatedProperty QL class and use it in tests
This commit is contained in:
@@ -713,6 +713,21 @@ class Property extends Element, Modifiable, @kt_property {
|
||||
override string getAPrimaryQlClass() { result = "Property" }
|
||||
}
|
||||
|
||||
/** A Kotlin delegated property. */
|
||||
class DelegatedProperty extends Property {
|
||||
Variable underlying;
|
||||
|
||||
DelegatedProperty() { ktPropertyDelegates(this, underlying) }
|
||||
|
||||
/** Holds if this delegated property is declared as a local variable. */
|
||||
predicate isLocal() { underlying instanceof LocalVariableDecl }
|
||||
|
||||
/** Gets the underlying local variable or field to which this property is delegating the calls. */
|
||||
Variable getDelegatee() { result = underlying }
|
||||
|
||||
override string getAPrimaryQlClass() { result = "DelegatedProperty" }
|
||||
}
|
||||
|
||||
/** A Kotlin extension function. */
|
||||
class ExtensionMethod extends Method {
|
||||
Type extendedType;
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
delegatedProperties
|
||||
| delegatedProperties.kt:6:9:9:9 | prop1 | prop1 | local | delegatedProperties.kt:6:24:9:9 | Lazy<Integer> prop1$delegate | delegatedProperties.kt:6:27:9:9 | lazy(...) |
|
||||
| delegatedProperties.kt:19:9:19:51 | varResource1 | varResource1 | local | delegatedProperties.kt:19:31:19:51 | ResourceDelegate varResource1$delegate | delegatedProperties.kt:19:34:19:51 | new ResourceDelegate(...) |
|
||||
| delegatedProperties.kt:23:9:23:31 | name | name | local | delegatedProperties.kt:23:26:23:31 | Map<String,Object> name$delegate | delegatedProperties.kt:23:29:23:31 | map |
|
||||
| delegatedProperties.kt:33:9:33:76 | readOnly | readOnly | local | delegatedProperties.kt:33:27:33:47 | ReadWriteProperty<Object,Integer> readOnly$delegate | delegatedProperties.kt:33:30:33:47 | resourceDelegate(...) |
|
||||
| delegatedProperties.kt:34:9:34:48 | readWrite | readWrite | local | delegatedProperties.kt:34:28:34:48 | ReadWriteProperty<Object,Integer> readWrite$delegate | delegatedProperties.kt:34:31:34:48 | resourceDelegate(...) |
|
||||
delegatedPropertyTypes
|
||||
| delegatedProperties.kt:6:9:9:9 | prop1 | file://:0:0:0:0 | int | file://<external>/Lazy.class:0:0:0:0 | Lazy<Integer> |
|
||||
| delegatedProperties.kt:19:9:19:51 | varResource1 | file://:0:0:0:0 | int | delegatedProperties.kt:38:1:44:1 | ResourceDelegate |
|
||||
| delegatedProperties.kt:23:9:23:31 | name | file://<external>/String.class:0:0:0:0 | String | file://<external>/Map.class:0:0:0:0 | Map<String,Object> |
|
||||
| delegatedProperties.kt:33:9:33:76 | readOnly | file://:0:0:0:0 | int | file://<external>/ReadWriteProperty.class:0:0:0:0 | ReadWriteProperty<Object,Integer> |
|
||||
| delegatedProperties.kt:34:9:34:48 | readWrite | file://:0:0:0:0 | int | file://<external>/ReadWriteProperty.class:0:0:0:0 | ReadWriteProperty<Object,Integer> |
|
||||
delegatedPropertyGetters
|
||||
| delegatedProperties.kt:6:9:9:9 | prop1 | delegatedProperties.kt:6:24:9:9 | <get-prop1> |
|
||||
| delegatedProperties.kt:19:9:19:51 | varResource1 | delegatedProperties.kt:19:31:19:51 | <get-varResource1> |
|
||||
| delegatedProperties.kt:23:9:23:31 | name | delegatedProperties.kt:23:26:23:31 | <get-name> |
|
||||
| delegatedProperties.kt:33:9:33:76 | readOnly | delegatedProperties.kt:33:27:33:47 | <get-readOnly> |
|
||||
| delegatedProperties.kt:34:9:34:48 | readWrite | delegatedProperties.kt:34:28:34:48 | <get-readWrite> |
|
||||
delegatedPropertySetters
|
||||
| delegatedProperties.kt:19:9:19:51 | varResource1 | delegatedProperties.kt:19:31:19:51 | <set-varResource1> |
|
||||
| delegatedProperties.kt:34:9:34:48 | readWrite | delegatedProperties.kt:34:28:34:48 | <set-readWrite> |
|
||||
@@ -0,0 +1,38 @@
|
||||
import java
|
||||
|
||||
// Stop external filepaths from appearing in the results
|
||||
class ClassOrInterfaceLocation extends ClassOrInterface {
|
||||
override predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) {
|
||||
exists(string fullPath | super.hasLocationInfo(fullPath, sl, sc, el, ec) |
|
||||
if exists(this.getFile().getRelativePath())
|
||||
then path = fullPath
|
||||
else path = fullPath.regexpReplaceAll(".*/", "<external>/")
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
query predicate delegatedProperties(
|
||||
DelegatedProperty dp, string name, string isLocal, Variable underlying, Expr initializer
|
||||
) {
|
||||
(
|
||||
dp.isLocal() and isLocal = "local"
|
||||
or
|
||||
not dp.isLocal() and isLocal = "non-local"
|
||||
) and
|
||||
underlying = dp.getDelegatee() and
|
||||
name = dp.getName() and
|
||||
underlying.getInitializer() = initializer
|
||||
}
|
||||
|
||||
query predicate delegatedPropertyTypes(DelegatedProperty dp, Type type, Type underlyingType) {
|
||||
dp.getGetter().getReturnType() = type and
|
||||
dp.getDelegatee().getType() = underlyingType
|
||||
}
|
||||
|
||||
query predicate delegatedPropertyGetters(DelegatedProperty dp, Method getter) {
|
||||
dp.getGetter() = getter
|
||||
}
|
||||
|
||||
query predicate delegatedPropertySetters(DelegatedProperty dp, Method setter) {
|
||||
dp.getSetter() = setter
|
||||
}
|
||||
Reference in New Issue
Block a user