Skip to content

Commit 07b3b15

Browse files
authored
Merge pull request #10221 from tamasvajk/kotlin-internal
Kotlin: Change `Modifiable::isPublic` to not cover Kotlin `internal` members
2 parents 4f7eb7b + bea0ce9 commit 07b3b15

File tree

5 files changed

+38
-1
lines changed

5 files changed

+38
-1
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@ import Element
77
/** A modifier such as `private`, `static` or `abstract`. */
88
class Modifier extends Element, @modifier {
99
/** Gets the element to which this modifier applies. */
10-
Element getElement() { hasModifier(result, this) }
10+
Element getElement() {
11+
hasModifier(result, this) and
12+
// Kotlin "internal" elements may also get "public" modifiers, so we want to filter those out
13+
not exists(Modifier mod2 |
14+
hasModifier(result, mod2) and modifiers(this, "public") and modifiers(mod2, "internal")
15+
)
16+
}
1117

1218
override string getAPrimaryQlClass() { result = "Modifier" }
1319
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
public class Java {
2+
void javaFun() {
3+
new Kotlin().kotlinFun$main();
4+
}
5+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
public class Kotlin {
2+
internal fun kotlinFun() {
3+
}
4+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
isPublic
2+
isInternal
3+
| Kotlin.kt:2:11:3:2 | kotlinFun$main |
4+
modifiers_methods
5+
| file://:0:0:0:0 | final | Kotlin.kt:2:11:3:2 | kotlinFun$main |
6+
| file://:0:0:0:0 | internal | Kotlin.kt:2:11:3:2 | kotlinFun$main |
7+
#select
8+
| Kotlin.kt:2:11:3:2 | kotlinFun$main | final |
9+
| Kotlin.kt:2:11:3:2 | kotlinFun$main | internal |
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import java
2+
3+
from Method m, string s
4+
where m.fromSource() and m.hasModifier(s)
5+
select m, s
6+
7+
query predicate isPublic(Method m) { m.fromSource() and m.isPublic() }
8+
9+
query predicate isInternal(Method m) { m.fromSource() and m.isInternal() }
10+
11+
query predicate modifiers_methods(Modifier mo, Method me) {
12+
mo.getElement() = me and me.fromSource()
13+
}

0 commit comments

Comments
 (0)