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

Skip to content

Commit 348ae35

Browse files
committed
Kotlin: Extract method visibility
1 parent 6616f45 commit 348ae35

5 files changed

Lines changed: 50 additions & 27 deletions

File tree

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

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.semmle.extractor.java.OdasaOutput
88
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
99
import org.jetbrains.kotlin.builtins.functions.BuiltInFunctionArity
1010
import org.jetbrains.kotlin.descriptors.ClassKind
11+
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
1112
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
1213
import org.jetbrains.kotlin.descriptors.Modality
1314
import org.jetbrains.kotlin.ir.IrElement
@@ -93,6 +94,16 @@ open class KotlinFileExtractor(
9394
return id
9495
}
9596

97+
fun extractVisibility(elementForLocation: IrElement, id: Label<out DbModifiable>, v: DescriptorVisibility) {
98+
when (v) {
99+
DescriptorVisibilities.PRIVATE -> addModifiers(id, "private")
100+
DescriptorVisibilities.PROTECTED -> addModifiers(id, "protected")
101+
DescriptorVisibilities.PUBLIC -> addModifiers(id, "public")
102+
DescriptorVisibilities.INTERNAL -> addModifiers(id, "internal")
103+
else -> logger.warnElement(Severity.ErrorSevere, "Unexpected visibility: $v", elementForLocation)
104+
}
105+
}
106+
96107
fun extractClassModifiers(c: IrClass, id: Label<out DbClassorinterface>) {
97108
when (c.modality) {
98109
Modality.FINAL -> addModifiers(id, "final")
@@ -101,13 +112,7 @@ open class KotlinFileExtractor(
101112
Modality.ABSTRACT -> addModifiers(id, "abstract")
102113
else -> logger.warnElement(Severity.ErrorSevere, "Unexpected class modality: ${c.modality}", c)
103114
}
104-
when (c.visibility) {
105-
DescriptorVisibilities.PRIVATE -> addModifiers(id, "private")
106-
DescriptorVisibilities.PROTECTED -> addModifiers(id, "protected")
107-
DescriptorVisibilities.PUBLIC -> addModifiers(id, "public")
108-
DescriptorVisibilities.INTERNAL -> addModifiers(id, "internal")
109-
else -> logger.warnElement(Severity.ErrorSevere, "Unexpected class visibility: ${c.visibility}", c)
110-
}
115+
extractVisibility(c, id, c.visibility)
111116
}
112117

113118
fun extractClassInstance(c: IrClass, typeArgs: List<IrTypeArgument>): Label<out DbClassorinterface> {
@@ -452,6 +457,8 @@ open class KotlinFileExtractor(
452457
extractBody(body, id)
453458
}
454459

460+
extractVisibility(f, id, f.visibility)
461+
455462
currentFunction = null
456463
return id
457464
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
| methods5.kt:10:13:10:18 | new (...) | ClassInstanceExpr |
3333
| methods5.kt:10:16:10:17 | 42 | IntegerLiteral |
3434
| methods5.kt:13:1:13:14 | <obinit>(...) | MethodAccess |
35-
| methods.kt:5:1:13:1 | <obinit>(...) | MethodAccess |
35+
| methods.kt:5:1:19:1 | <obinit>(...) | MethodAccess |
3636
| methods.kt:10:9:10:25 | classMethod(...) | MethodAccess |
3737
| methods.kt:10:9:10:25 | this | ThisAccess |
3838
| methods.kt:10:21:10:21 | a | VarAccess |

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

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
11
methods
2-
| methods2.kt:0:0:0:0 | Methods2Kt | methods2.kt:4:1:5:1 | fooBarTopLevelMethod | fooBarTopLevelMethod(int,int) |
3-
| methods2.kt:7:1:10:1 | Class2 | methods2.kt:7:1:10:1 | <obinit> | <obinit>() |
4-
| methods2.kt:7:1:10:1 | Class2 | methods2.kt:8:5:9:5 | fooBarClassMethod | fooBarClassMethod(int,int) |
5-
| methods3.kt:0:0:0:0 | Methods3Kt | methods3.kt:3:1:3:42 | fooBarTopLevelMethodExt | fooBarTopLevelMethodExt(int,int) |
6-
| methods3.kt:5:1:7:1 | Class3 | methods3.kt:5:1:7:1 | <obinit> | <obinit>() |
7-
| methods3.kt:5:1:7:1 | Class3 | methods3.kt:6:5:6:46 | fooBarTopLevelMethodExt | fooBarTopLevelMethodExt(int,int) |
8-
| methods4.kt:3:1:11:1 | NestedTest | methods4.kt:3:1:11:1 | <obinit> | <obinit>() |
9-
| methods4.kt:5:3:9:3 | InsideNestedTest | methods4.kt:5:3:9:3 | <obinit> | <obinit>() |
10-
| methods4.kt:5:3:9:3 | InsideNestedTest | methods4.kt:7:5:7:34 | m | m(foo.bar.NestedTest.InsideNestedTest) |
11-
| methods5.kt:0:0:0:0 | Methods5Kt | methods5.kt:3:1:11:1 | x | x() |
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) |
14-
| methods5.kt:13:1:13:14 | C1 | methods5.kt:13:1:13:14 | <obinit> | <obinit>() |
15-
| methods.kt:0:0:0:0 | MethodsKt | methods.kt:2:1:3:1 | topLevelMethod | topLevelMethod(int,int) |
16-
| methods.kt:5:1:13:1 | Class | methods.kt:5:1:13:1 | <obinit> | <obinit>() |
17-
| methods.kt:5:1:13:1 | Class | methods.kt:6:5:7:5 | classMethod | classMethod(int,int) |
18-
| methods.kt:5:1:13:1 | Class | methods.kt:9:5:12:5 | anotherClassMethod | anotherClassMethod(int,int) |
2+
| methods2.kt:0:0:0:0 | Methods2Kt | methods2.kt:4:1:5:1 | fooBarTopLevelMethod | fooBarTopLevelMethod(int,int) | public |
3+
| methods2.kt:7:1:10:1 | Class2 | methods2.kt:7:1:10:1 | <obinit> | <obinit>() | |
4+
| methods2.kt:7:1:10:1 | Class2 | methods2.kt:8:5:9:5 | fooBarClassMethod | fooBarClassMethod(int,int) | public |
5+
| methods3.kt:0:0:0:0 | Methods3Kt | methods3.kt:3:1:3:42 | fooBarTopLevelMethodExt | fooBarTopLevelMethodExt(int,int) | public |
6+
| methods3.kt:5:1:7:1 | Class3 | methods3.kt:5:1:7:1 | <obinit> | <obinit>() | |
7+
| methods3.kt:5:1:7:1 | Class3 | methods3.kt:6:5:6:46 | fooBarTopLevelMethodExt | fooBarTopLevelMethodExt(int,int) | public |
8+
| methods4.kt:3:1:11:1 | NestedTest | methods4.kt:3:1:11:1 | <obinit> | <obinit>() | |
9+
| methods4.kt:5:3:9:3 | InsideNestedTest | methods4.kt:5:3:9:3 | <obinit> | <obinit>() | |
10+
| methods4.kt:5:3:9:3 | InsideNestedTest | methods4.kt:7:5:7:34 | m | m(foo.bar.NestedTest.InsideNestedTest) | public |
11+
| 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) | |
14+
| methods5.kt:13:1:13:14 | C1 | methods5.kt:13:1:13:14 | <obinit> | <obinit>() | |
15+
| methods.kt:0:0:0:0 | MethodsKt | methods.kt:2:1:3:1 | topLevelMethod | topLevelMethod(int,int) | public |
16+
| methods.kt:5:1:19:1 | Class | methods.kt:5:1:19:1 | <obinit> | <obinit>() | |
17+
| methods.kt:5:1:19:1 | Class | methods.kt:6:5:7:5 | classMethod | classMethod(int,int) | public |
18+
| methods.kt:5:1:19:1 | Class | methods.kt:9:5:12:5 | anotherClassMethod | anotherClassMethod(int,int) | public |
19+
| methods.kt:5:1:19:1 | Class | methods.kt:14:12:14:29 | publicFun | publicFun() | public |
20+
| methods.kt:5:1:19:1 | Class | methods.kt:15:15:15:35 | protectedFun | protectedFun() | protected |
21+
| methods.kt:5:1:19:1 | Class | methods.kt:16:13:16:31 | privateFun | privateFun() | private |
22+
| methods.kt:5:1:19:1 | Class | methods.kt:17:14:17:33 | internalFun | internalFun() | internal |
23+
| methods.kt:5:1:19:1 | Class | methods.kt:18:5:18:36 | noExplicitVisibilityFun | noExplicitVisibilityFun() | public |
1924
constructors
2025
| methods2.kt:7:1:10:1 | Class2 | methods2.kt:7:1:10:1 | Class2 | Class2() |
2126
| methods3.kt:5:1:7:1 | Class3 | methods3.kt:5:1:7:1 | Class3 | Class3() |
@@ -25,7 +30,7 @@ constructors
2530
| methods5.kt:9:3:9:32 | new Object(...) { ... } | methods5.kt:9:3:9:32 | | |
2631
| methods5.kt:13:1:13:14 | C1 | methods5.kt:13:1:13:14 | C1 | C1() |
2732
| methods5.kt:13:1:13:14 | C1<Integer> | methods5.kt:13:1:13:14 | C1<Integer> | C1<Integer>() |
28-
| methods.kt:5:1:13:1 | Class | methods.kt:5:1:13:1 | Class | Class() |
33+
| methods.kt:5:1:19:1 | Class | methods.kt:5:1:19:1 | Class | Class() |
2934
extensions
3035
| methods3.kt:3:1:3:42 | fooBarTopLevelMethodExt | file://:0:0:0:0 | int |
3136
| methods3.kt:6:5:6:46 | fooBarTopLevelMethodExt | file://:0:0:0:0 | int |

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,11 @@ class Class {
1010
classMethod(a, 3)
1111
topLevelMethod(b, 4)
1212
}
13+
14+
public fun publicFun() {}
15+
protected fun protectedFun() {}
16+
private fun privateFun() {}
17+
internal fun internalFun() {}
18+
fun noExplicitVisibilityFun() {}
1319
}
1420

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import java
22

3-
query predicate methods(RefType declType, Method m, string signature) { m.fromSource() and declType = m.getDeclaringType() and signature = m.getSignature() }
3+
query predicate methods(RefType declType, Method m, string signature, string modifiers) {
4+
m.fromSource() and
5+
declType = m.getDeclaringType() and
6+
signature = m.getSignature() and
7+
modifiers = concat(string s | m.hasModifier(s) | s, ", ")
8+
}
49

510
query predicate constructors(RefType declType, Constructor c, string signature) { c.fromSource() and declType = c.getDeclaringType() and signature = c.getSignature() }
611

0 commit comments

Comments
 (0)