mirror of
https://github.com/github/codeql.git
synced 2026-04-30 11:15:13 +02:00
Implement Java signature extraction
This commit is contained in:
committed by
Ian Lynagh
parent
6391484692
commit
ccf21b7183
@@ -323,9 +323,9 @@ open class KotlinUsesExtractor(
|
||||
return id
|
||||
}
|
||||
|
||||
data class UseClassInstanceResult(val classLabel: Label<out DbClassorinterface>, val javaClass: IrClass, val shortName: String)
|
||||
data class TypeResult<LabelType>(val id: Label<LabelType>, val signature: String, val shortName: String)
|
||||
data class TypeResults(val javaResult: TypeResult<out DbType>, val kotlinResult: TypeResult<out DbKt_type>)
|
||||
data class UseClassInstanceResult(val typeResult: TypeResult<DbClassorinterface>, val javaClass: IrClass)
|
||||
data class TypeResult<out LabelType>(val id: Label<out LabelType>, val signature: String?, val shortName: String)
|
||||
data class TypeResults(val javaResult: TypeResult<DbType>, val kotlinResult: TypeResult<DbKt_type>)
|
||||
|
||||
fun useType(t: IrType, canReturnPrimitiveTypes: Boolean = true) =
|
||||
when(t) {
|
||||
@@ -382,7 +382,7 @@ open class KotlinUsesExtractor(
|
||||
substituteClass?.let { extractClassLaterIfExternal(it) }
|
||||
})
|
||||
|
||||
return UseClassInstanceResult(classLabel, extractClass, classId.shortName)
|
||||
return UseClassInstanceResult(TypeResult(classLabel, extractClass.fqNameWhenAvailable?.asString(), classId.shortName), extractClass)
|
||||
}
|
||||
|
||||
fun isExternalDeclaration(d: IrDeclaration): Boolean {
|
||||
@@ -412,22 +412,20 @@ open class KotlinUsesExtractor(
|
||||
externalClassExtractor.extractLater(c)
|
||||
}
|
||||
|
||||
fun addClassLabel(c: IrClass, typeArgs: List<IrTypeArgument>): TypeResult<out DbClassorinterface> {
|
||||
fun addClassLabel(c: IrClass, typeArgs: List<IrTypeArgument>): TypeResult<DbClassorinterface> {
|
||||
val classLabelResult = getClassLabel(c, typeArgs)
|
||||
return TypeResult(
|
||||
tw.getLabelFor(classLabelResult.classLabel),
|
||||
"TODO",
|
||||
c.fqNameWhenAvailable?.asString(),
|
||||
classLabelResult.shortName)
|
||||
}
|
||||
|
||||
fun useSimpleTypeClass(c: IrClass, args: List<IrTypeArgument>, hasQuestionMark: Boolean): TypeResults {
|
||||
val classInstanceResult = useClassInstance(c, args)
|
||||
val javaClassId = classInstanceResult.classLabel
|
||||
val javaClassId = classInstanceResult.typeResult.id
|
||||
val kotlinQualClassName = getUnquotedClassLabel(c, args).classLabel
|
||||
val javaQualClassName = classInstanceResult.javaClass.fqNameForIrSerialization.asString()
|
||||
val javaSignature = javaQualClassName // TODO: Is this right?
|
||||
// TODO: args ought to be substituted, so e.g. MutableList<MutableList<String>> gets the Java type List<List<String>>
|
||||
val javaResult = TypeResult(javaClassId, javaSignature, classInstanceResult.shortName)
|
||||
val javaResult = classInstanceResult.typeResult
|
||||
val kotlinResult = if (hasQuestionMark) {
|
||||
val kotlinSignature = "$kotlinQualClassName?" // TODO: Is this right?
|
||||
val kotlinLabel = "@\"kt_type;nullable;$kotlinQualClassName\""
|
||||
@@ -547,10 +545,10 @@ open class KotlinUsesExtractor(
|
||||
TypeResult(label, primitiveName, primitiveName)
|
||||
} else {
|
||||
val label = makeClass(javaPackageName, javaClassName)
|
||||
val signature = "$javaPackageName.$javaClassName" // TODO: Is this right?
|
||||
val signature = "$javaPackageName.$javaClassName"
|
||||
TypeResult(label, signature, javaClassName)
|
||||
}
|
||||
val kotlinClassId = useClassInstance(kotlinClass, listOf()).classLabel
|
||||
val kotlinClassId = useClassInstance(kotlinClass, listOf()).typeResult.id
|
||||
val kotlinResult = if (s.hasQuestionMark) {
|
||||
val kotlinSignature = "$kotlinPackageName.$kotlinClassName?" // TODO: Is this right?
|
||||
val kotlinLabel = "@\"kt_type;nullable;$kotlinPackageName.$kotlinClassName\""
|
||||
@@ -700,7 +698,7 @@ class X {
|
||||
|
||||
fun getTypeArgumentLabel(
|
||||
arg: IrTypeArgument
|
||||
): TypeResult<out DbReftype> {
|
||||
): TypeResult<DbReftype> {
|
||||
|
||||
fun extractBoundedWildcard(wildcardKind: Int, wildcardLabelStr: String, wildcardShortName: String, boundLabel: Label<out DbReftype>): Label<DbWildcard> =
|
||||
tw.getLabelFor(wildcardLabelStr) { wildcardLabel ->
|
||||
@@ -711,11 +709,12 @@ class X {
|
||||
}
|
||||
}
|
||||
|
||||
// Note this function doesn't return a signature because type arguments are never incorporated into function signatures.
|
||||
return when (arg) {
|
||||
is IrStarProjection -> {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val anyTypeLabel = useType(pluginContext.irBuiltIns.anyType).javaResult.id as Label<out DbReftype>
|
||||
TypeResult(extractBoundedWildcard(1, "@\"wildcard;\"", "?", anyTypeLabel), "?", "?")
|
||||
TypeResult(extractBoundedWildcard(1, "@\"wildcard;\"", "?", anyTypeLabel), null, "?")
|
||||
}
|
||||
is IrTypeProjection -> {
|
||||
val boundResults = useType(arg.type, false)
|
||||
@@ -724,14 +723,14 @@ class X {
|
||||
|
||||
return if(arg.variance == Variance.INVARIANT)
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
boundResults.javaResult as TypeResult<out DbReftype>
|
||||
boundResults.javaResult as TypeResult<DbReftype>
|
||||
else {
|
||||
val keyPrefix = if (arg.variance == Variance.IN_VARIANCE) "super" else "extends"
|
||||
val wildcardKind = if (arg.variance == Variance.IN_VARIANCE) 2 else 1
|
||||
val wildcardShortName = "? $keyPrefix ${boundResults.javaResult.shortName}"
|
||||
TypeResult(
|
||||
extractBoundedWildcard(wildcardKind, "@\"wildcard;$keyPrefix{$boundLabel}\"", wildcardShortName, boundLabel),
|
||||
"TODO",
|
||||
null,
|
||||
wildcardShortName)
|
||||
}
|
||||
}
|
||||
@@ -799,7 +798,7 @@ class X {
|
||||
// in extractClassSource or extractFunction
|
||||
logger.warn(Severity.ErrorSevere, "Missing type parameter label")
|
||||
},
|
||||
param.name.asString(),
|
||||
useType(eraseTypeParameter(param)).javaResult.signature,
|
||||
param.name.asString()
|
||||
)
|
||||
|
||||
@@ -828,7 +827,7 @@ class X {
|
||||
is IrClass -> {
|
||||
val classifier: IrClassifierSymbol = t.classifier
|
||||
val tcls: IrClass = classifier.owner as IrClass
|
||||
val l = useClassInstance(tcls, t.arguments).classLabel
|
||||
val l = useClassInstance(tcls, t.arguments).typeResult.id
|
||||
tw.writeExtendsReftype(id, l)
|
||||
}
|
||||
else -> {
|
||||
@@ -857,7 +856,7 @@ class X {
|
||||
val classifier = t.classifier
|
||||
val owner = classifier.owner
|
||||
if(owner is IrTypeParameter) {
|
||||
return erase(owner.superTypes[0])
|
||||
return eraseTypeParameter(owner)
|
||||
}
|
||||
|
||||
// todo: fix this:
|
||||
@@ -874,6 +873,9 @@ class X {
|
||||
return t
|
||||
}
|
||||
|
||||
fun eraseTypeParameter(t: IrTypeParameter) =
|
||||
erase(t.superTypes[0])
|
||||
|
||||
fun getValueParameterLabel(vp: IrValueParameter): String {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val parentId: Label<out DbMethod> = useDeclarationParent(vp.parent) as Label<out DbMethod>
|
||||
@@ -1062,7 +1064,7 @@ open class KotlinFileExtractor(
|
||||
|
||||
val parent = c.parent
|
||||
if (parent is IrClass) {
|
||||
val parentId = useClassInstance(parent, listOf()).classLabel
|
||||
val parentId = useClassInstance(parent, listOf()).typeResult.id
|
||||
tw.writeEnclInReftype(id, parentId)
|
||||
if(c.isCompanion) {
|
||||
// If we are a companion then our parent has a
|
||||
@@ -1116,7 +1118,7 @@ open class KotlinFileExtractor(
|
||||
logger.warn(Severity.ErrorSevere, "Using companion instance for non-companion class")
|
||||
return null
|
||||
} else {
|
||||
val parentId = useClassInstance(parent, listOf()).classLabel
|
||||
val parentId = useClassInstance(parent, listOf()).typeResult.id
|
||||
val instanceName = c.name.asString()
|
||||
val instanceLabel = "@\"field;{$parentId};$instanceName\""
|
||||
val instanceId: Label<DbField> = tw.getLabelFor(instanceLabel)
|
||||
@@ -1128,20 +1130,21 @@ open class KotlinFileExtractor(
|
||||
if(!c.isNonCompanionObject) {
|
||||
logger.warn(Severity.ErrorSevere, "Using instance for non-object class")
|
||||
}
|
||||
val classId = useClassInstance(c, listOf()).classLabel
|
||||
val classId = useClassInstance(c, listOf()).typeResult.id
|
||||
val instanceName = "INSTANCE"
|
||||
val instanceLabel = "@\"field;{$classId};$instanceName\""
|
||||
val instanceId: Label<DbField> = tw.getLabelFor(instanceLabel)
|
||||
return FieldResult(instanceId, instanceName)
|
||||
}
|
||||
|
||||
fun extractValueParameter(vp: IrValueParameter, parent: Label<out DbCallable>, idx: Int) {
|
||||
fun extractValueParameter(vp: IrValueParameter, parent: Label<out DbCallable>, idx: Int): TypeResults {
|
||||
val id = useValueParameter(vp)
|
||||
val type = useType(vp.type)
|
||||
val locId = tw.getLocation(vp)
|
||||
tw.writeParams(id, type.javaResult.id, type.kotlinResult.id, idx, parent, id)
|
||||
tw.writeHasLocation(id, locId)
|
||||
tw.writeParamName(id, vp.name.asString())
|
||||
return type
|
||||
}
|
||||
|
||||
private fun extractObjectInitializerFunction(c: IrClass, parentId: Label<out DbReftype>) {
|
||||
@@ -1152,9 +1155,8 @@ open class KotlinFileExtractor(
|
||||
// add method:
|
||||
val obinitLabel = getFunctionLabel(c, "<obinit>", listOf(), pluginContext.irBuiltIns.unitType)
|
||||
val obinitId = tw.getLabelFor<DbMethod>(obinitLabel)
|
||||
val signature = "TODO"
|
||||
val returnType = useType(pluginContext.irBuiltIns.unitType)
|
||||
tw.writeMethods(obinitId, "<obinit>", signature, returnType.javaResult.id, returnType.kotlinResult.id, parentId, obinitId)
|
||||
tw.writeMethods(obinitId, "<obinit>", "<obinit>()", returnType.javaResult.id, returnType.kotlinResult.id, parentId, obinitId)
|
||||
|
||||
val locId = tw.getLocation(c)
|
||||
tw.writeHasLocation(obinitId, locId)
|
||||
@@ -1216,17 +1218,23 @@ open class KotlinFileExtractor(
|
||||
f.typeParameters.map { extractTypeParameter(it) }
|
||||
|
||||
val locId = tw.getLocation(f)
|
||||
val signature = "TODO"
|
||||
|
||||
val id: Label<out DbCallable>
|
||||
val id = useFunction<DbCallable>(f)
|
||||
val paramTypes = f.valueParameters.mapIndexed { i, vp ->
|
||||
extractValueParameter(vp, id, i)
|
||||
}
|
||||
val paramsSignature = paramTypes.joinToString(separator = ",", prefix = "(", postfix = ")") { it.javaResult.signature!! }
|
||||
|
||||
if (f.symbol is IrConstructorSymbol) {
|
||||
val returnType = useType(erase(f.returnType))
|
||||
id = useFunction<DbConstructor>(f)
|
||||
tw.writeConstrs(id, f.returnType.classFqName?.shortName()?.asString() ?: f.name.asString(), signature, returnType.javaResult.id, returnType.kotlinResult.id, parentId, id)
|
||||
val shortName = f.returnType.classFqName?.shortName()?.asString() ?: f.name.asString()
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
tw.writeConstrs(id as Label<DbConstructor>, shortName, "$shortName$paramsSignature", returnType.javaResult.id, returnType.kotlinResult.id, parentId, id)
|
||||
} else {
|
||||
val returnType = useType(f.returnType)
|
||||
id = useFunction<DbMethod>(f)
|
||||
tw.writeMethods(id, f.name.asString(), signature, returnType.javaResult.id, returnType.kotlinResult.id, parentId, id)
|
||||
val shortName = f.name.asString()
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
tw.writeMethods(id as Label<DbMethod>, shortName, "$shortName$paramsSignature", returnType.javaResult.id, returnType.kotlinResult.id, parentId, id)
|
||||
|
||||
val extReceiver = f.extensionReceiverParameter
|
||||
if (extReceiver != null) {
|
||||
@@ -1240,9 +1248,6 @@ open class KotlinFileExtractor(
|
||||
if(body != null) {
|
||||
extractBody(body, id)
|
||||
}
|
||||
f.valueParameters.forEachIndexed { i, vp ->
|
||||
extractValueParameter(vp, id, i)
|
||||
}
|
||||
|
||||
currentFunction = null
|
||||
return id
|
||||
|
||||
@@ -3,6 +3,13 @@ cloneMethods
|
||||
| file://:0:0:0:0 | clone | clone() | file://:0:0:0:0 | Integer[][] | file://:0:0:0:0 | Integer[][] | file://:0:0:0:0 | Kotlin nullable Array<Integer[]> |
|
||||
| file://:0:0:0:0 | clone | clone() | file://:0:0:0:0 | int[] | file://:0:0:0:0 | int[] | file://:0:0:0:0 | Kotlin nullable IntArray |
|
||||
| file://:0:0:0:0 | clone | clone() | file://:0:0:0:0 | int[][] | file://:0:0:0:0 | int[][] | file://:0:0:0:0 | Kotlin nullable Array<int[]> |
|
||||
sourceSignatures
|
||||
| primitiveArrays.kt:3:1:7:1 | <obinit> | <obinit>() |
|
||||
| primitiveArrays.kt:3:1:7:1 | Test | Test() |
|
||||
| primitiveArrays.kt:3:1:7:1 | equals | equals(java.lang.Object) |
|
||||
| primitiveArrays.kt:3:1:7:1 | hashCode | hashCode() |
|
||||
| primitiveArrays.kt:3:1:7:1 | toString | toString() |
|
||||
| primitiveArrays.kt:5:3:5:123 | test | test(java.lang.Integer[],java.lang.Integer[],int[],java.lang.Integer[][],java.lang.Integer[][],int[][]) |
|
||||
#select
|
||||
| primitiveArrays.kt:5:12:5:24 | a | file://:0:0:0:0 | Integer[] | Integer | Integer | file://:0:0:0:0 | Kotlin not-null Array<Integer> |
|
||||
| primitiveArrays.kt:5:27:5:40 | b | file://:0:0:0:0 | Integer[] | Integer | Integer | file://:0:0:0:0 | Kotlin not-null Array<Integer> |
|
||||
|
||||
@@ -17,3 +17,7 @@ query predicate cloneMethods(Method m, string signature, Array declType, Type re
|
||||
returnType = m.getReturnType() and
|
||||
ktReturnType = m.getReturnKotlinType()
|
||||
}
|
||||
|
||||
query predicate sourceSignatures(Callable c, string signature) {
|
||||
c.getSignature() = signature and c.fromSource()
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@ genericType
|
||||
| generics.kt:11:1:11:19 | C0 | generics.kt:11:15:11:15 | V | 0 |
|
||||
| generics.kt:13:1:18:1 | C1 | generics.kt:13:10:13:10 | T | 0 |
|
||||
| generics.kt:13:1:18:1 | C1 | generics.kt:13:13:13:13 | W | 1 |
|
||||
| generics.kt:36:1:40:1 | BoundedTest | generics.kt:36:19:36:34 | T | 0 |
|
||||
| generics.kt:36:1:40:1 | BoundedTest | generics.kt:36:37:36:41 | S | 1 |
|
||||
parameterizedType
|
||||
| generics.kt:11:1:11:19 | C0 | generics.kt:11:1:11:19 | C0 | 0 | V |
|
||||
| generics.kt:11:1:11:19 | C0<?> | generics.kt:11:1:11:19 | C0 | 0 | ? |
|
||||
@@ -18,6 +20,37 @@ parameterizedType
|
||||
| generics.kt:13:1:18:1 | C1<String,String> | generics.kt:13:1:18:1 | C1 | 1 | String |
|
||||
| generics.kt:13:1:18:1 | C1<U,U> | generics.kt:13:1:18:1 | C1 | 0 | U |
|
||||
| generics.kt:13:1:18:1 | C1<U,U> | generics.kt:13:1:18:1 | C1 | 1 | U |
|
||||
| generics.kt:36:1:40:1 | BoundedTest | generics.kt:36:1:40:1 | BoundedTest | 0 | T |
|
||||
| generics.kt:36:1:40:1 | BoundedTest | generics.kt:36:1:40:1 | BoundedTest | 1 | S |
|
||||
function
|
||||
| generics.kt:3:1:5:1 | f0 | f0(java.lang.Object) |
|
||||
| generics.kt:7:1:9:1 | f1 | f1(java.lang.Object) |
|
||||
| generics.kt:11:1:11:19 | <obinit> | <obinit>() |
|
||||
| generics.kt:11:6:11:19 | C0 | C0() |
|
||||
| generics.kt:11:6:11:19 | equals | equals(java.lang.Object) |
|
||||
| generics.kt:11:6:11:19 | hashCode | hashCode() |
|
||||
| generics.kt:11:6:11:19 | toString | toString() |
|
||||
| generics.kt:13:1:18:1 | <obinit> | <obinit>() |
|
||||
| generics.kt:13:1:18:1 | C1 | C1(java.lang.Object) |
|
||||
| generics.kt:13:1:18:1 | equals | equals(java.lang.Object) |
|
||||
| generics.kt:13:1:18:1 | hashCode | hashCode() |
|
||||
| generics.kt:13:1:18:1 | toString | toString() |
|
||||
| generics.kt:13:16:13:23 | <get-t> | <get-t>() |
|
||||
| generics.kt:14:5:14:19 | f1 | f1(java.lang.Object) |
|
||||
| generics.kt:15:5:17:5 | f2 | f2(java.lang.Object) |
|
||||
| generics.kt:20:1:22:1 | <obinit> | <obinit>() |
|
||||
| generics.kt:20:1:22:1 | C2 | C2() |
|
||||
| generics.kt:20:1:22:1 | equals | equals(java.lang.Object) |
|
||||
| generics.kt:20:1:22:1 | hashCode | hashCode() |
|
||||
| generics.kt:20:1:22:1 | toString | toString() |
|
||||
| generics.kt:21:5:21:23 | f4 | f4(java.lang.Object) |
|
||||
| generics.kt:24:1:34:1 | m | m() |
|
||||
| generics.kt:36:1:40:1 | <obinit> | <obinit>() |
|
||||
| generics.kt:36:1:40:1 | BoundedTest | BoundedTest() |
|
||||
| generics.kt:36:1:40:1 | equals | equals(java.lang.Object) |
|
||||
| generics.kt:36:1:40:1 | hashCode | hashCode() |
|
||||
| generics.kt:36:1:40:1 | toString | toString() |
|
||||
| generics.kt:38:5:38:25 | m | m(java.lang.CharSequence,java.lang.CharSequence) |
|
||||
genericFunction
|
||||
| generics.kt:3:1:5:1 | f0 | generics.kt:3:6:3:6 | S | 0 |
|
||||
| generics.kt:7:1:9:1 | f1 | generics.kt:7:6:7:6 | S | 0 |
|
||||
|
||||
@@ -31,4 +31,10 @@ fun m() {
|
||||
val c3 = C2()
|
||||
c3.f4(5)
|
||||
val c4: C0<*> = C0<Int>()
|
||||
}
|
||||
}
|
||||
|
||||
class BoundedTest<T : CharSequence, S : T> {
|
||||
|
||||
fun m(s: S, t: T) { }
|
||||
|
||||
}
|
||||
|
||||
@@ -10,6 +10,11 @@ query predicate parameterizedType(ParameterizedType t, GenericType gt, int i, st
|
||||
t.getFile().getExtension() = "kt"
|
||||
}
|
||||
|
||||
query predicate function(Callable c, string signature) {
|
||||
signature = c.getSignature() and
|
||||
c.getFile().getExtension() = "kt"
|
||||
}
|
||||
|
||||
query predicate genericFunction(GenericCallable c, TypeVariable tv, int i) {
|
||||
c.getTypeParameter(i) = tv and
|
||||
c.getFile().getExtension() = "kt"
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
| methods2.kt:7:1:10:1 | <obinit>(...) | MethodAccess |
|
||||
| methods3.kt:5:1:7:1 | <obinit>(...) | MethodAccess |
|
||||
| methods4.kt:3:1:11:1 | <obinit>(...) | MethodAccess |
|
||||
| methods4.kt:5:3:9:3 | <obinit>(...) | MethodAccess |
|
||||
| methods.kt:5:1:13:1 | <obinit>(...) | MethodAccess |
|
||||
| methods.kt:10:9:10:25 | classMethod(...) | MethodAccess |
|
||||
| methods.kt:10:9:10:25 | this | ThisAccess |
|
||||
|
||||
@@ -1,27 +1,38 @@
|
||||
methods
|
||||
| methods2.kt:4:1:5:1 | fooBarTopLevelMethod |
|
||||
| methods2.kt:7:1:10:1 | <obinit> |
|
||||
| methods2.kt:7:1:10:1 | equals |
|
||||
| methods2.kt:7:1:10:1 | hashCode |
|
||||
| methods2.kt:7:1:10:1 | toString |
|
||||
| methods2.kt:8:5:9:5 | fooBarClassMethod |
|
||||
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod |
|
||||
| methods3.kt:5:1:7:1 | <obinit> |
|
||||
| methods3.kt:5:1:7:1 | equals |
|
||||
| methods3.kt:5:1:7:1 | hashCode |
|
||||
| methods3.kt:5:1:7:1 | toString |
|
||||
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod |
|
||||
| methods.kt:2:1:3:1 | topLevelMethod |
|
||||
| methods.kt:5:1:13:1 | <obinit> |
|
||||
| methods.kt:5:1:13:1 | equals |
|
||||
| methods.kt:5:1:13:1 | hashCode |
|
||||
| methods.kt:5:1:13:1 | toString |
|
||||
| methods.kt:6:5:7:5 | classMethod |
|
||||
| methods.kt:9:5:12:5 | anotherClassMethod |
|
||||
| methods2.kt:4:1:5:1 | fooBarTopLevelMethod | fooBarTopLevelMethod(int,int) |
|
||||
| methods2.kt:7:1:10:1 | <obinit> | <obinit>() |
|
||||
| methods2.kt:7:1:10:1 | equals | equals(java.lang.Object) |
|
||||
| methods2.kt:7:1:10:1 | hashCode | hashCode() |
|
||||
| methods2.kt:7:1:10:1 | toString | toString() |
|
||||
| methods2.kt:8:5:9:5 | fooBarClassMethod | fooBarClassMethod(int,int) |
|
||||
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod | fooBarTopLevelMethod(int) |
|
||||
| methods3.kt:5:1:7:1 | <obinit> | <obinit>() |
|
||||
| methods3.kt:5:1:7:1 | equals | equals(java.lang.Object) |
|
||||
| methods3.kt:5:1:7:1 | hashCode | hashCode() |
|
||||
| methods3.kt:5:1:7:1 | toString | toString() |
|
||||
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod | fooBarTopLevelMethod(int) |
|
||||
| methods4.kt:3:1:11:1 | <obinit> | <obinit>() |
|
||||
| methods4.kt:3:1:11:1 | equals | equals(java.lang.Object) |
|
||||
| methods4.kt:3:1:11:1 | hashCode | hashCode() |
|
||||
| methods4.kt:3:1:11:1 | toString | toString() |
|
||||
| methods4.kt:5:3:9:3 | <obinit> | <obinit>() |
|
||||
| methods4.kt:5:3:9:3 | equals | equals(java.lang.Object) |
|
||||
| methods4.kt:5:3:9:3 | hashCode | hashCode() |
|
||||
| methods4.kt:5:3:9:3 | toString | toString() |
|
||||
| methods4.kt:7:5:7:34 | m | m(foo.bar.NestedTest.InsideNestedTest) |
|
||||
| methods.kt:2:1:3:1 | topLevelMethod | topLevelMethod(int,int) |
|
||||
| methods.kt:5:1:13:1 | <obinit> | <obinit>() |
|
||||
| methods.kt:5:1:13:1 | equals | equals(java.lang.Object) |
|
||||
| methods.kt:5:1:13:1 | hashCode | hashCode() |
|
||||
| methods.kt:5:1:13:1 | toString | toString() |
|
||||
| methods.kt:6:5:7:5 | classMethod | classMethod(int,int) |
|
||||
| methods.kt:9:5:12:5 | anotherClassMethod | anotherClassMethod(int,int) |
|
||||
constructors
|
||||
| methods2.kt:7:1:10:1 | Class2 |
|
||||
| methods3.kt:5:1:7:1 | Class3 |
|
||||
| methods.kt:5:1:13:1 | Class |
|
||||
| methods2.kt:7:1:10:1 | Class2 | Class2() |
|
||||
| methods3.kt:5:1:7:1 | Class3 | Class3() |
|
||||
| methods4.kt:3:1:11:1 | NestedTest | NestedTest() |
|
||||
| methods4.kt:5:3:9:3 | InsideNestedTest | InsideNestedTest() |
|
||||
| methods.kt:5:1:13:1 | Class | Class() |
|
||||
extensions
|
||||
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod | file://:0:0:0:0 | int |
|
||||
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod | file://:0:0:0:0 | int |
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import java
|
||||
|
||||
query predicate methods(Method m) { m.fromSource() }
|
||||
query predicate methods(Method m, string signature) { m.fromSource() and signature = m.getSignature() }
|
||||
|
||||
query predicate constructors(Constructor c) { c.fromSource() }
|
||||
query predicate constructors(Constructor c, string signature) { c.fromSource() and signature = c.getSignature() }
|
||||
|
||||
query predicate extensions(ExtensionMethod m, Type t) { m.getExtendedType() = t and m.fromSource() }
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod | methods3.kt:3:30:3:35 | x | 0 |
|
||||
| methods3.kt:5:1:7:1 | equals | methods3.kt:5:1:7:1 | other | 0 |
|
||||
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod | methods3.kt:6:34:6:39 | x | 0 |
|
||||
| methods4.kt:3:1:11:1 | equals | methods4.kt:3:1:11:1 | other | 0 |
|
||||
| methods4.kt:5:3:9:3 | equals | methods4.kt:5:3:9:3 | other | 0 |
|
||||
| methods4.kt:7:5:7:34 | m | methods4.kt:7:11:7:29 | x | 0 |
|
||||
| methods.kt:2:1:3:1 | topLevelMethod | methods.kt:2:20:2:25 | x | 0 |
|
||||
| methods.kt:2:1:3:1 | topLevelMethod | methods.kt:2:28:2:33 | y | 1 |
|
||||
| methods.kt:5:1:13:1 | equals | methods.kt:5:1:13:1 | other | 0 |
|
||||
|
||||
Reference in New Issue
Block a user