Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d4701d7

Browse files
tamasvajkigfoo
authored andcommitted
Add DelegatedProperty QL class and use it in tests
1 parent 0ba2daf commit d4701d7

3 files changed

Lines changed: 74 additions & 0 deletions

File tree

java/ql/lib/semmle/code/java/Member.qll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -713,6 +713,21 @@ class Property extends Element, Modifiable, @kt_property {
713713
override string getAPrimaryQlClass() { result = "Property" }
714714
}
715715

716+
/** A Kotlin delegated property. */
717+
class DelegatedProperty extends Property {
718+
Variable underlying;
719+
720+
DelegatedProperty() { ktPropertyDelegates(this, underlying) }
721+
722+
/** Holds if this delegated property is declared as a local variable. */
723+
predicate isLocal() { underlying instanceof LocalVariableDecl }
724+
725+
/** Gets the underlying local variable or field to which this property is delegating the calls. */
726+
Variable getDelegatee() { result = underlying }
727+
728+
override string getAPrimaryQlClass() { result = "DelegatedProperty" }
729+
}
730+
716731
/** A Kotlin extension function. */
717732
class ExtensionMethod extends Method {
718733
Type extendedType;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
delegatedProperties
2+
| 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(...) |
3+
| 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(...) |
4+
| 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 |
5+
| 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(...) |
6+
| 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(...) |
7+
delegatedPropertyTypes
8+
| delegatedProperties.kt:6:9:9:9 | prop1 | file://:0:0:0:0 | int | file://<external>/Lazy.class:0:0:0:0 | Lazy<Integer> |
9+
| delegatedProperties.kt:19:9:19:51 | varResource1 | file://:0:0:0:0 | int | delegatedProperties.kt:38:1:44:1 | ResourceDelegate |
10+
| 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> |
11+
| delegatedProperties.kt:33:9:33:76 | readOnly | file://:0:0:0:0 | int | file://<external>/ReadWriteProperty.class:0:0:0:0 | ReadWriteProperty<Object,Integer> |
12+
| delegatedProperties.kt:34:9:34:48 | readWrite | file://:0:0:0:0 | int | file://<external>/ReadWriteProperty.class:0:0:0:0 | ReadWriteProperty<Object,Integer> |
13+
delegatedPropertyGetters
14+
| delegatedProperties.kt:6:9:9:9 | prop1 | delegatedProperties.kt:6:24:9:9 | <get-prop1> |
15+
| delegatedProperties.kt:19:9:19:51 | varResource1 | delegatedProperties.kt:19:31:19:51 | <get-varResource1> |
16+
| delegatedProperties.kt:23:9:23:31 | name | delegatedProperties.kt:23:26:23:31 | <get-name> |
17+
| delegatedProperties.kt:33:9:33:76 | readOnly | delegatedProperties.kt:33:27:33:47 | <get-readOnly> |
18+
| delegatedProperties.kt:34:9:34:48 | readWrite | delegatedProperties.kt:34:28:34:48 | <get-readWrite> |
19+
delegatedPropertySetters
20+
| delegatedProperties.kt:19:9:19:51 | varResource1 | delegatedProperties.kt:19:31:19:51 | <set-varResource1> |
21+
| delegatedProperties.kt:34:9:34:48 | readWrite | delegatedProperties.kt:34:28:34:48 | <set-readWrite> |
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import java
2+
3+
// Stop external filepaths from appearing in the results
4+
class ClassOrInterfaceLocation extends ClassOrInterface {
5+
override predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) {
6+
exists(string fullPath | super.hasLocationInfo(fullPath, sl, sc, el, ec) |
7+
if exists(this.getFile().getRelativePath())
8+
then path = fullPath
9+
else path = fullPath.regexpReplaceAll(".*/", "<external>/")
10+
)
11+
}
12+
}
13+
14+
query predicate delegatedProperties(
15+
DelegatedProperty dp, string name, string isLocal, Variable underlying, Expr initializer
16+
) {
17+
(
18+
dp.isLocal() and isLocal = "local"
19+
or
20+
not dp.isLocal() and isLocal = "non-local"
21+
) and
22+
underlying = dp.getDelegatee() and
23+
name = dp.getName() and
24+
underlying.getInitializer() = initializer
25+
}
26+
27+
query predicate delegatedPropertyTypes(DelegatedProperty dp, Type type, Type underlyingType) {
28+
dp.getGetter().getReturnType() = type and
29+
dp.getDelegatee().getType() = underlyingType
30+
}
31+
32+
query predicate delegatedPropertyGetters(DelegatedProperty dp, Method getter) {
33+
dp.getGetter() = getter
34+
}
35+
36+
query predicate delegatedPropertySetters(DelegatedProperty dp, Method setter) {
37+
dp.getSetter() = setter
38+
}

0 commit comments

Comments
 (0)