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

Skip to content

Commit b6e5e19

Browse files
tamasvajkigfoo
authored andcommitted
Extract more visibility modifiers
1 parent a6d0dc7 commit b6e5e19

7 files changed

Lines changed: 107 additions & 25 deletions

File tree

java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ import com.github.codeql.utils.toRawType
88
import com.semmle.extractor.java.OdasaOutput
99
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
1010
import org.jetbrains.kotlin.builtins.functions.BuiltInFunctionArity
11-
import org.jetbrains.kotlin.descriptors.ClassKind
12-
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
13-
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
14-
import org.jetbrains.kotlin.descriptors.Modality
11+
import org.jetbrains.kotlin.descriptors.*
12+
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities
1513
import org.jetbrains.kotlin.ir.IrElement
1614
import org.jetbrains.kotlin.ir.IrStatement
1715
import org.jetbrains.kotlin.ir.declarations.*
@@ -135,9 +133,31 @@ open class KotlinFileExtractor(
135133
fun extractVisibility(elementForLocation: IrElement, id: Label<out DbModifiable>, v: DescriptorVisibility) {
136134
when (v) {
137135
DescriptorVisibilities.PRIVATE -> addModifiers(id, "private")
136+
DescriptorVisibilities.PRIVATE_TO_THIS -> addModifiers(id, "private")
138137
DescriptorVisibilities.PROTECTED -> addModifiers(id, "protected")
139138
DescriptorVisibilities.PUBLIC -> addModifiers(id, "public")
140139
DescriptorVisibilities.INTERNAL -> addModifiers(id, "internal")
140+
DescriptorVisibilities.LOCAL -> if (elementForLocation is IrFunction && elementForLocation.isLocalFunction()) {
141+
// The containing class is `private`.
142+
addModifiers(id, "public")
143+
} else {
144+
addModifiers(id, "private")
145+
}
146+
is DelegatedDescriptorVisibility -> {
147+
when (v.delegate) {
148+
JavaVisibilities.ProtectedStaticVisibility -> {
149+
addModifiers(id, "protected")
150+
addModifiers(id, "static")
151+
}
152+
JavaVisibilities.PackageVisibility -> {
153+
// default java visibility (top level)
154+
}
155+
JavaVisibilities.ProtectedAndPackage -> {
156+
// default java visibility (member level)
157+
}
158+
else -> logger.warnElement(Severity.ErrorSevere, "Unexpected visibility: $v", elementForLocation)
159+
}
160+
}
141161
else -> logger.warnElement(Severity.ErrorSevere, "Unexpected visibility: $v", elementForLocation)
142162
}
143163
}
@@ -2505,7 +2525,7 @@ open class KotlinFileExtractor(
25052525

25062526
// TODO: We might need to add an `<obinit>` function, and a call to it to match other classes
25072527

2508-
addModifiers(id, "public", "static", "final")
2528+
addModifiers(id, "private", "final")
25092529
extractClassSupertypes(superTypes, listOf(), id)
25102530

25112531
var parent: IrDeclarationParent? = currentDeclaration.parent
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import java
2+
3+
from string mod, Location l
4+
where
5+
diagnostics(_, _, _, _, "Unexpected visibility: " + mod, _, l) and
6+
not mod in ["invisible_fake"]
7+
select mod, l

java/ql/test/kotlin/library-tests/classes/classes.expected

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99
| classes.kt:49:1:51:1 | Direction | Direction | final, public |
1010
| classes.kt:53:1:57:1 | Color | Color | final, public |
1111
| classes.kt:63:1:91:1 | Class1 | Class1 | final, public |
12-
| classes.kt:66:20:66:54 | new Object(...) { ... } | <anonymous class> | final |
13-
| classes.kt:68:20:68:74 | new Object(...) { ... } | <anonymous class> | final |
14-
| classes.kt:72:16:77:10 | new Object(...) { ... } | <anonymous class> | final |
15-
| classes.kt:75:24:75:33 | new Object(...) { ... } | <anonymous class> | final |
16-
| classes.kt:81:16:81:38 | new Interface1(...) { ... } | <anonymous class> | final |
17-
| classes.kt:85:16:85:25 | new Object(...) { ... } | <anonymous class> | final |
18-
| classes.kt:89:16:89:44 | new Interface3<Integer>(...) { ... } | <anonymous class> | final |
12+
| classes.kt:66:20:66:54 | new Object(...) { ... } | <anonymous class> | final, private |
13+
| classes.kt:68:20:68:74 | new Object(...) { ... } | <anonymous class> | final, private |
14+
| classes.kt:72:16:77:10 | new Object(...) { ... } | <anonymous class> | final, private |
15+
| classes.kt:75:24:75:33 | new Object(...) { ... } | <anonymous class> | final, private |
16+
| classes.kt:81:16:81:38 | new Interface1(...) { ... } | <anonymous class> | final, private |
17+
| classes.kt:85:16:85:25 | new Object(...) { ... } | <anonymous class> | final, private |
18+
| classes.kt:89:16:89:44 | new Interface3<Integer>(...) { ... } | <anonymous class> | final, private |
1919
| classes.kt:93:1:93:26 | pulicClass | pulicClass | final, public |
2020
| classes.kt:94:1:94:29 | privateClass | privateClass | final, private |
2121
| classes.kt:95:1:95:31 | internalClass | internalClass | final, internal |
@@ -29,18 +29,18 @@
2929
| classes.kt:106:1:106:27 | sealedClass | sealedClass | public, sealed |
3030
| classes.kt:107:1:107:23 | openClass | openClass | public |
3131
| classes.kt:109:1:136:1 | C1 | C1 | final, public |
32-
| classes.kt:111:9:113:9 | Local1 | C1$Local1 | final |
33-
| classes.kt:118:9:123:9 | | C1$ | final, public, static |
34-
| classes.kt:119:13:121:13 | Local2 | C1$Local2 | final |
35-
| classes.kt:127:16:134:9 | new Object(...) { ... } | <anonymous class> | final |
36-
| classes.kt:129:17:131:17 | Local3 | C1$$Local3 | final |
32+
| classes.kt:111:9:113:9 | Local1 | C1$Local1 | final, private |
33+
| classes.kt:118:9:123:9 | | C1$ | final, private |
34+
| classes.kt:119:13:121:13 | Local2 | C1$Local2 | final, private |
35+
| classes.kt:127:16:134:9 | new Object(...) { ... } | <anonymous class> | final, private |
36+
| classes.kt:129:17:131:17 | Local3 | C1$$Local3 | final, private |
3737
| local_anonymous.kt:3:1:28:1 | Class1 | LocalAnonymous.Class1 | final, public |
38-
| local_anonymous.kt:5:16:7:9 | new Object(...) { ... } | <anonymous class> | final |
39-
| local_anonymous.kt:11:9:11:24 | new Object(...) { ... } | <anonymous class> | final, public, static |
40-
| local_anonymous.kt:16:23:16:49 | new Function2<Integer,Integer,Integer>(...) { ... } | <anonymous class> | final, public, static |
41-
| local_anonymous.kt:17:23:17:49 | new Function2<Integer,Integer,Integer>(...) { ... } | <anonymous class> | final, public, static |
42-
| local_anonymous.kt:21:21:21:31 | new Function1<Class1,Unit>(...) { ... } | <anonymous class> | final, public, static |
43-
| local_anonymous.kt:25:9:25:27 | LocalClass | LocalAnonymous.Class1$LocalClass | final |
38+
| local_anonymous.kt:5:16:7:9 | new Object(...) { ... } | <anonymous class> | final, private |
39+
| local_anonymous.kt:11:9:11:24 | new Object(...) { ... } | <anonymous class> | final, private |
40+
| local_anonymous.kt:16:23:16:49 | new Function2<Integer,Integer,Integer>(...) { ... } | <anonymous class> | final, private |
41+
| local_anonymous.kt:17:23:17:49 | new Function2<Integer,Integer,Integer>(...) { ... } | <anonymous class> | final, private |
42+
| local_anonymous.kt:21:21:21:31 | new Function1<Class1,Unit>(...) { ... } | <anonymous class> | final, private |
43+
| local_anonymous.kt:25:9:25:27 | LocalClass | LocalAnonymous.Class1$LocalClass | final, private |
4444
| superChain.kt:1:1:1:33 | SuperChain1 | SuperChain1 | public |
4545
| superChain.kt:2:1:2:60 | SuperChain2 | SuperChain2 | public |
4646
| superChain.kt:3:1:3:60 | SuperChain3 | SuperChain3 | public |

java/ql/test/kotlin/library-tests/methods/methods.expected

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ methods
99
| methods4.kt:5:3:9:3 | InsideNestedTest | methods4.kt:5:3:9:3 | <obinit> | <obinit>() | |
1010
| methods4.kt:5:3:9:3 | InsideNestedTest | methods4.kt:7:5:7:34 | m | m(foo.bar.NestedTest.InsideNestedTest) | public |
1111
| methods5.kt:0:0:0:0 | Methods5Kt | methods5.kt:3:1:11:1 | x | x() | public |
12-
| methods5.kt:5:3:5:27 | new Object(...) { ... } | methods5.kt:5:3:5:27 | a | a(int) | |
13-
| methods5.kt:9:3:9:32 | new Object(...) { ... } | methods5.kt:9:3:9:32 | f1 | f1(foo.bar.C1,int) | |
12+
| methods5.kt:5:3:5:27 | new Object(...) { ... } | methods5.kt:5:3:5:27 | a | a(int) | public |
13+
| methods5.kt:9:3:9:32 | new Object(...) { ... } | methods5.kt:9:3:9:32 | f1 | f1(foo.bar.C1,int) | public |
1414
| methods5.kt:13:1:13:14 | C1 | methods5.kt:13:1:13:14 | <obinit> | <obinit>() | |
1515
| methods.kt:0:0:0:0 | MethodsKt | methods.kt:2:1:3:1 | topLevelMethod | topLevelMethod(int,int) | public |
1616
| methods.kt:5:1:19:1 | Class | methods.kt:5:1:19:1 | <obinit> | <obinit>() | |
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
| modifiers.kt:1:1:21:1 | X | public |
2+
| modifiers.kt:1:6:21:1 | X | public |
3+
| modifiers.kt:2:5:2:21 | a | private |
4+
| modifiers.kt:2:5:2:21 | a | private |
5+
| modifiers.kt:2:13:2:21 | getA | private |
6+
| modifiers.kt:3:5:3:23 | b | private |
7+
| modifiers.kt:3:5:3:23 | b | protected |
8+
| modifiers.kt:3:15:3:23 | getB | protected |
9+
| modifiers.kt:4:5:4:22 | c | internal |
10+
| modifiers.kt:4:5:4:22 | c | private |
11+
| modifiers.kt:4:14:4:22 | getC | internal |
12+
| modifiers.kt:5:5:5:34 | d | private |
13+
| modifiers.kt:5:5:5:34 | d | public |
14+
| modifiers.kt:5:5:5:34 | getD | public |
15+
| modifiers.kt:7:5:9:5 | Nested | final |
16+
| modifiers.kt:7:5:9:5 | Nested | protected |
17+
| modifiers.kt:7:15:9:5 | Nested | public |
18+
| modifiers.kt:8:9:8:29 | e | private |
19+
| modifiers.kt:8:9:8:29 | e | public |
20+
| modifiers.kt:8:16:8:29 | getE | public |
21+
| modifiers.kt:11:5:15:5 | fn1 | public |
22+
| modifiers.kt:12:16:14:9 | | public |
23+
| modifiers.kt:12:16:14:9 | new Object(...) { ... } | final |
24+
| modifiers.kt:12:16:14:9 | new Object(...) { ... } | private |
25+
| modifiers.kt:13:13:13:23 | fn | public |
26+
| modifiers.kt:17:5:20:5 | fn2 | public |
27+
| modifiers.kt:18:9:18:24 | fnLocal | public |
28+
| modifiers.kt:18:9:18:24 | new Object(...) { ... } | final |
29+
| modifiers.kt:18:9:18:24 | new Object(...) { ... } | private |
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
open class X {
2+
private val a = 1
3+
protected val b = 2
4+
internal val c = 3
5+
val d = 4 // public by default
6+
7+
protected class Nested {
8+
public val e: Int = 5
9+
}
10+
11+
fun fn1(): Any {
12+
return object {
13+
fun fn() {}
14+
}
15+
}
16+
17+
fun fn2() {
18+
fun fnLocal() {}
19+
fnLocal()
20+
}
21+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import java
2+
3+
from Modifiable m, string mod
4+
where m.fromSource() and m.hasModifier(mod)
5+
select m, mod

0 commit comments

Comments
 (0)