Add DelegatedProperty QL class and use it in tests

This commit is contained in:
Tamas Vajk
2022-03-09 17:25:40 +01:00
committed by Ian Lynagh
parent 0ba2daf31a
commit d4701d72d9
3 changed files with 74 additions and 0 deletions

View File

@@ -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;

View File

@@ -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> |

View File

@@ -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
}