mirror of
https://github.com/github/codeql.git
synced 2026-04-30 11:15:13 +02:00
Extract more visibility modifiers
This commit is contained in:
@@ -8,10 +8,8 @@ import com.github.codeql.utils.toRawType
|
||||
import com.semmle.extractor.java.OdasaOutput
|
||||
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
|
||||
import org.jetbrains.kotlin.builtins.functions.BuiltInFunctionArity
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
@@ -135,9 +133,31 @@ open class KotlinFileExtractor(
|
||||
fun extractVisibility(elementForLocation: IrElement, id: Label<out DbModifiable>, v: DescriptorVisibility) {
|
||||
when (v) {
|
||||
DescriptorVisibilities.PRIVATE -> addModifiers(id, "private")
|
||||
DescriptorVisibilities.PRIVATE_TO_THIS -> addModifiers(id, "private")
|
||||
DescriptorVisibilities.PROTECTED -> addModifiers(id, "protected")
|
||||
DescriptorVisibilities.PUBLIC -> addModifiers(id, "public")
|
||||
DescriptorVisibilities.INTERNAL -> addModifiers(id, "internal")
|
||||
DescriptorVisibilities.LOCAL -> if (elementForLocation is IrFunction && elementForLocation.isLocalFunction()) {
|
||||
// The containing class is `private`.
|
||||
addModifiers(id, "public")
|
||||
} else {
|
||||
addModifiers(id, "private")
|
||||
}
|
||||
is DelegatedDescriptorVisibility -> {
|
||||
when (v.delegate) {
|
||||
JavaVisibilities.ProtectedStaticVisibility -> {
|
||||
addModifiers(id, "protected")
|
||||
addModifiers(id, "static")
|
||||
}
|
||||
JavaVisibilities.PackageVisibility -> {
|
||||
// default java visibility (top level)
|
||||
}
|
||||
JavaVisibilities.ProtectedAndPackage -> {
|
||||
// default java visibility (member level)
|
||||
}
|
||||
else -> logger.warnElement(Severity.ErrorSevere, "Unexpected visibility: $v", elementForLocation)
|
||||
}
|
||||
}
|
||||
else -> logger.warnElement(Severity.ErrorSevere, "Unexpected visibility: $v", elementForLocation)
|
||||
}
|
||||
}
|
||||
@@ -2505,7 +2525,7 @@ open class KotlinFileExtractor(
|
||||
|
||||
// TODO: We might need to add an `<obinit>` function, and a call to it to match other classes
|
||||
|
||||
addModifiers(id, "public", "static", "final")
|
||||
addModifiers(id, "private", "final")
|
||||
extractClassSupertypes(superTypes, listOf(), id)
|
||||
|
||||
var parent: IrDeclarationParent? = currentDeclaration.parent
|
||||
|
||||
7
java/ql/consistency-queries/modifiers.ql
Normal file
7
java/ql/consistency-queries/modifiers.ql
Normal file
@@ -0,0 +1,7 @@
|
||||
import java
|
||||
|
||||
from string mod, Location l
|
||||
where
|
||||
diagnostics(_, _, _, _, "Unexpected visibility: " + mod, _, l) and
|
||||
not mod in ["invisible_fake"]
|
||||
select mod, l
|
||||
@@ -9,13 +9,13 @@
|
||||
| classes.kt:49:1:51:1 | Direction | Direction | final, public |
|
||||
| classes.kt:53:1:57:1 | Color | Color | final, public |
|
||||
| classes.kt:63:1:91:1 | Class1 | Class1 | final, public |
|
||||
| classes.kt:66:20:66:54 | new Object(...) { ... } | <anonymous class> | final |
|
||||
| classes.kt:68:20:68:74 | new Object(...) { ... } | <anonymous class> | final |
|
||||
| classes.kt:72:16:77:10 | new Object(...) { ... } | <anonymous class> | final |
|
||||
| classes.kt:75:24:75:33 | new Object(...) { ... } | <anonymous class> | final |
|
||||
| classes.kt:81:16:81:38 | new Interface1(...) { ... } | <anonymous class> | final |
|
||||
| classes.kt:85:16:85:25 | new Object(...) { ... } | <anonymous class> | final |
|
||||
| classes.kt:89:16:89:44 | new Interface3<Integer>(...) { ... } | <anonymous class> | final |
|
||||
| classes.kt:66:20:66:54 | new Object(...) { ... } | <anonymous class> | final, private |
|
||||
| classes.kt:68:20:68:74 | new Object(...) { ... } | <anonymous class> | final, private |
|
||||
| classes.kt:72:16:77:10 | new Object(...) { ... } | <anonymous class> | final, private |
|
||||
| classes.kt:75:24:75:33 | new Object(...) { ... } | <anonymous class> | final, private |
|
||||
| classes.kt:81:16:81:38 | new Interface1(...) { ... } | <anonymous class> | final, private |
|
||||
| classes.kt:85:16:85:25 | new Object(...) { ... } | <anonymous class> | final, private |
|
||||
| classes.kt:89:16:89:44 | new Interface3<Integer>(...) { ... } | <anonymous class> | final, private |
|
||||
| classes.kt:93:1:93:26 | pulicClass | pulicClass | final, public |
|
||||
| classes.kt:94:1:94:29 | privateClass | privateClass | final, private |
|
||||
| classes.kt:95:1:95:31 | internalClass | internalClass | final, internal |
|
||||
@@ -29,18 +29,18 @@
|
||||
| classes.kt:106:1:106:27 | sealedClass | sealedClass | public, sealed |
|
||||
| classes.kt:107:1:107:23 | openClass | openClass | public |
|
||||
| classes.kt:109:1:136:1 | C1 | C1 | final, public |
|
||||
| classes.kt:111:9:113:9 | Local1 | C1$Local1 | final |
|
||||
| classes.kt:118:9:123:9 | | C1$ | final, public, static |
|
||||
| classes.kt:119:13:121:13 | Local2 | C1$Local2 | final |
|
||||
| classes.kt:127:16:134:9 | new Object(...) { ... } | <anonymous class> | final |
|
||||
| classes.kt:129:17:131:17 | Local3 | C1$$Local3 | final |
|
||||
| classes.kt:111:9:113:9 | Local1 | C1$Local1 | final, private |
|
||||
| classes.kt:118:9:123:9 | | C1$ | final, private |
|
||||
| classes.kt:119:13:121:13 | Local2 | C1$Local2 | final, private |
|
||||
| classes.kt:127:16:134:9 | new Object(...) { ... } | <anonymous class> | final, private |
|
||||
| classes.kt:129:17:131:17 | Local3 | C1$$Local3 | final, private |
|
||||
| local_anonymous.kt:3:1:28:1 | Class1 | LocalAnonymous.Class1 | final, public |
|
||||
| local_anonymous.kt:5:16:7:9 | new Object(...) { ... } | <anonymous class> | final |
|
||||
| local_anonymous.kt:11:9:11:24 | new Object(...) { ... } | <anonymous class> | final, public, static |
|
||||
| local_anonymous.kt:16:23:16:49 | new Function2<Integer,Integer,Integer>(...) { ... } | <anonymous class> | final, public, static |
|
||||
| local_anonymous.kt:17:23:17:49 | new Function2<Integer,Integer,Integer>(...) { ... } | <anonymous class> | final, public, static |
|
||||
| local_anonymous.kt:21:21:21:31 | new Function1<Class1,Unit>(...) { ... } | <anonymous class> | final, public, static |
|
||||
| local_anonymous.kt:25:9:25:27 | LocalClass | LocalAnonymous.Class1$LocalClass | final |
|
||||
| local_anonymous.kt:5:16:7:9 | new Object(...) { ... } | <anonymous class> | final, private |
|
||||
| local_anonymous.kt:11:9:11:24 | new Object(...) { ... } | <anonymous class> | final, private |
|
||||
| local_anonymous.kt:16:23:16:49 | new Function2<Integer,Integer,Integer>(...) { ... } | <anonymous class> | final, private |
|
||||
| local_anonymous.kt:17:23:17:49 | new Function2<Integer,Integer,Integer>(...) { ... } | <anonymous class> | final, private |
|
||||
| local_anonymous.kt:21:21:21:31 | new Function1<Class1,Unit>(...) { ... } | <anonymous class> | final, private |
|
||||
| local_anonymous.kt:25:9:25:27 | LocalClass | LocalAnonymous.Class1$LocalClass | final, private |
|
||||
| superChain.kt:1:1:1:33 | SuperChain1 | SuperChain1 | public |
|
||||
| superChain.kt:2:1:2:60 | SuperChain2 | SuperChain2 | public |
|
||||
| superChain.kt:3:1:3:60 | SuperChain3 | SuperChain3 | public |
|
||||
|
||||
@@ -9,8 +9,8 @@ methods
|
||||
| methods4.kt:5:3:9:3 | InsideNestedTest | methods4.kt:5:3:9:3 | <obinit> | <obinit>() | |
|
||||
| methods4.kt:5:3:9:3 | InsideNestedTest | methods4.kt:7:5:7:34 | m | m(foo.bar.NestedTest.InsideNestedTest) | public |
|
||||
| methods5.kt:0:0:0:0 | Methods5Kt | methods5.kt:3:1:11:1 | x | x() | public |
|
||||
| methods5.kt:5:3:5:27 | new Object(...) { ... } | methods5.kt:5:3:5:27 | a | a(int) | |
|
||||
| methods5.kt:9:3:9:32 | new Object(...) { ... } | methods5.kt:9:3:9:32 | f1 | f1(foo.bar.C1,int) | |
|
||||
| methods5.kt:5:3:5:27 | new Object(...) { ... } | methods5.kt:5:3:5:27 | a | a(int) | public |
|
||||
| methods5.kt:9:3:9:32 | new Object(...) { ... } | methods5.kt:9:3:9:32 | f1 | f1(foo.bar.C1,int) | public |
|
||||
| methods5.kt:13:1:13:14 | C1 | methods5.kt:13:1:13:14 | <obinit> | <obinit>() | |
|
||||
| methods.kt:0:0:0:0 | MethodsKt | methods.kt:2:1:3:1 | topLevelMethod | topLevelMethod(int,int) | public |
|
||||
| methods.kt:5:1:19:1 | Class | methods.kt:5:1:19:1 | <obinit> | <obinit>() | |
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
| modifiers.kt:1:1:21:1 | X | public |
|
||||
| modifiers.kt:1:6:21:1 | X | public |
|
||||
| modifiers.kt:2:5:2:21 | a | private |
|
||||
| modifiers.kt:2:5:2:21 | a | private |
|
||||
| modifiers.kt:2:13:2:21 | getA | private |
|
||||
| modifiers.kt:3:5:3:23 | b | private |
|
||||
| modifiers.kt:3:5:3:23 | b | protected |
|
||||
| modifiers.kt:3:15:3:23 | getB | protected |
|
||||
| modifiers.kt:4:5:4:22 | c | internal |
|
||||
| modifiers.kt:4:5:4:22 | c | private |
|
||||
| modifiers.kt:4:14:4:22 | getC | internal |
|
||||
| modifiers.kt:5:5:5:34 | d | private |
|
||||
| modifiers.kt:5:5:5:34 | d | public |
|
||||
| modifiers.kt:5:5:5:34 | getD | public |
|
||||
| modifiers.kt:7:5:9:5 | Nested | final |
|
||||
| modifiers.kt:7:5:9:5 | Nested | protected |
|
||||
| modifiers.kt:7:15:9:5 | Nested | public |
|
||||
| modifiers.kt:8:9:8:29 | e | private |
|
||||
| modifiers.kt:8:9:8:29 | e | public |
|
||||
| modifiers.kt:8:16:8:29 | getE | public |
|
||||
| modifiers.kt:11:5:15:5 | fn1 | public |
|
||||
| modifiers.kt:12:16:14:9 | | public |
|
||||
| modifiers.kt:12:16:14:9 | new Object(...) { ... } | final |
|
||||
| modifiers.kt:12:16:14:9 | new Object(...) { ... } | private |
|
||||
| modifiers.kt:13:13:13:23 | fn | public |
|
||||
| modifiers.kt:17:5:20:5 | fn2 | public |
|
||||
| modifiers.kt:18:9:18:24 | fnLocal | public |
|
||||
| modifiers.kt:18:9:18:24 | new Object(...) { ... } | final |
|
||||
| modifiers.kt:18:9:18:24 | new Object(...) { ... } | private |
|
||||
21
java/ql/test/kotlin/library-tests/modifiers/modifiers.kt
Normal file
21
java/ql/test/kotlin/library-tests/modifiers/modifiers.kt
Normal file
@@ -0,0 +1,21 @@
|
||||
open class X {
|
||||
private val a = 1
|
||||
protected val b = 2
|
||||
internal val c = 3
|
||||
val d = 4 // public by default
|
||||
|
||||
protected class Nested {
|
||||
public val e: Int = 5
|
||||
}
|
||||
|
||||
fun fn1(): Any {
|
||||
return object {
|
||||
fun fn() {}
|
||||
}
|
||||
}
|
||||
|
||||
fun fn2() {
|
||||
fun fnLocal() {}
|
||||
fnLocal()
|
||||
}
|
||||
}
|
||||
5
java/ql/test/kotlin/library-tests/modifiers/modifiers.ql
Normal file
5
java/ql/test/kotlin/library-tests/modifiers/modifiers.ql
Normal file
@@ -0,0 +1,5 @@
|
||||
import java
|
||||
|
||||
from Modifiable m, string mod
|
||||
where m.fromSource() and m.hasModifier(mod)
|
||||
select m, mod
|
||||
Reference in New Issue
Block a user