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

Skip to content

Commit abc0da3

Browse files
tamasvajkigfoo
authored andcommitted
Extract extension method receivers as parameters
1 parent 04daa7f commit abc0da3

4 files changed

Lines changed: 22 additions & 12 deletions

File tree

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -348,8 +348,12 @@ open class KotlinFileExtractor(
348348
val locId = tw.getLocation(f)
349349

350350
val id = useFunction<DbCallable>(f)
351+
352+
val extReceiver = f.extensionReceiverParameter
353+
val isExtension = extReceiver != null
354+
val idxOffset = if (isExtension) 1 else 0
351355
val paramTypes = f.valueParameters.mapIndexed { i, vp ->
352-
extractValueParameter(vp, id, i)
356+
extractValueParameter(vp, id, i + idxOffset)
353357
}
354358
val paramsSignature = paramTypes.joinToString(separator = ",", prefix = "(", postfix = ")") { it.javaResult.signature!! }
355359

@@ -363,11 +367,11 @@ open class KotlinFileExtractor(
363367
val shortName = f.name.asString()
364368
@Suppress("UNCHECKED_CAST")
365369
tw.writeMethods(id as Label<DbMethod>, shortName, "$shortName$paramsSignature", returnType.javaResult.id, returnType.kotlinResult.id, parentId, id)
366-
367-
val extReceiver = f.extensionReceiverParameter
370+
368371
if (extReceiver != null) {
369372
val extendedType = useType(extReceiver.type)
370373
tw.writeKtExtensionFunctions(id, extendedType.javaResult.id, extendedType.kotlinResult.id)
374+
extractValueParameter(extReceiver, id, 0)
371375
}
372376
}
373377

@@ -688,21 +692,23 @@ open class KotlinFileExtractor(
688692
}
689693

690694
val dr = c.dispatchReceiver
691-
val er = c.extensionReceiver
692695
if (dr != null) {
693696
extractExpressionExpr(dr, callable, id, -1, enclosingStmt)
697+
}
694698

695-
if (er != null && er != dr) {
696-
logger.warnElement(Severity.ErrorSevere, "Expected to only find extension receiver or dispatch receiver. Found both. Extracting dispatch receiver only", c)
697-
}
698-
} else if (er != null) {
699-
extractExpressionExpr(er, callable, id, -1, enclosingStmt)
699+
val er = c.extensionReceiver
700+
val idxOffset: Int
701+
if (er != null) {
702+
extractExpressionExpr(er, callable, id, 0, enclosingStmt)
703+
idxOffset = 1
704+
} else {
705+
idxOffset = 0
700706
}
701707

702708
for(i in 0 until c.valueArgumentsCount) {
703709
val arg = c.getValueArgument(i)
704710
if(arg != null) {
705-
extractExpressionExpr(arg, callable, id, i, enclosingStmt)
711+
extractExpressionExpr(arg, callable, id, i + idxOffset, enclosingStmt)
706712
}
707713
}
708714
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
| methods2.kt:7:1:10:1 | equals | methods2.kt:7:1:10:1 | other | 0 |
44
| methods2.kt:8:5:9:5 | fooBarClassMethod | methods2.kt:8:27:8:32 | x | 0 |
55
| methods2.kt:8:5:9:5 | fooBarClassMethod | methods2.kt:8:35:8:40 | y | 1 |
6-
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod | methods3.kt:3:30:3:35 | x | 0 |
6+
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod | methods3.kt:3:5:3:7 | <this> | 0 |
7+
| methods3.kt:3:1:3:39 | fooBarTopLevelMethod | methods3.kt:3:30:3:35 | x | 1 |
78
| methods3.kt:5:1:7:1 | equals | methods3.kt:5:1:7:1 | other | 0 |
8-
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod | methods3.kt:6:34:6:39 | x | 0 |
9+
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod | methods3.kt:6:9:6:11 | <this> | 0 |
10+
| methods3.kt:6:5:6:43 | fooBarTopLevelMethod | methods3.kt:6:34:6:39 | x | 1 |
911
| methods4.kt:3:1:11:1 | equals | methods4.kt:3:1:11:1 | other | 0 |
1012
| methods4.kt:5:3:9:3 | equals | methods4.kt:5:3:9:3 | other | 0 |
1113
| methods4.kt:7:5:7:34 | m | methods4.kt:7:11:7:29 | x | 0 |

java/ql/test/kotlin/library-tests/variables/variableAccesses.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ varAcc
66
| variables.kt:16:11:16:18 | o |
77
| variables.kt:16:11:16:18 | o |
88
instAcc
9+
| variables.kt:21:9:21:9 | this |
910
| variables.kt:21:11:21:15 | this |
1011
| variables.kt:24:9:24:9 | this |
1112
| variables.kt:25:9:25:9 | this |

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@
77
| variables.kt:16:1:34:1 | other | Object | file://:0:0:0:0 | <none> |
88
| variables.kt:16:11:16:18 | o | C1 | file://:0:0:0:0 | <none> |
99
| variables.kt:16:11:16:18 | o | C1 | variables.kt:16:11:16:18 | o |
10+
| variables.kt:23:9:23:10 | <this> | C1 | file://:0:0:0:0 | <none> |
1011
| variables.kt:36:1:45:1 | other | Object | file://:0:0:0:0 | <none> |
1112
| variables.kt:38:11:44:5 | other | Object | file://:0:0:0:0 | <none> |

0 commit comments

Comments
 (0)