Skip to content

Commit 2e6d6e1

Browse files
authored
Merge pull request #10894 from igfoo/igfoo/psi
Kotlin: Refactor PSI handling
2 parents a56ed88 + 9bc0c98 commit 2e6d6e1

File tree

8 files changed

+39
-28
lines changed

8 files changed

+39
-28
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.github.codeql
22

33
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
44
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
5+
import org.jetbrains.kotlin.config.KotlinCompilerVersion
56
import org.jetbrains.kotlin.ir.declarations.*
67
import org.jetbrains.kotlin.ir.util.*
78
import org.jetbrains.kotlin.ir.IrElement
@@ -139,6 +140,8 @@ class KotlinExtractorExtension(
139140
logger.flush()
140141
logger.info("Extraction for invocation TRAP file $invocationTrapFile")
141142
logger.flush()
143+
logger.info("Kotlin version ${KotlinCompilerVersion.getVersion()}")
144+
logger.flush()
142145
logPeakMemoryUsage(logger, "before extractor")
143146
if (System.getenv("CODEQL_EXTRACTOR_JAVA_KOTLIN_DUMP") == "true") {
144147
logger.info("moduleFragment:\n" + moduleFragment.dump())

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package com.github.codeql
22

3-
import com.github.codeql.utils.versions.Psi2Ir
3+
import com.github.codeql.utils.versions.getPsi2Ir
44
import com.intellij.psi.PsiComment
55
import com.intellij.psi.PsiElement
66
import com.intellij.psi.PsiWhiteSpace
7+
import org.jetbrains.kotlin.config.KotlinCompilerVersion
78
import org.jetbrains.kotlin.ir.IrElement
89
import org.jetbrains.kotlin.ir.declarations.*
910
import org.jetbrains.kotlin.kdoc.psi.api.KDocElement
@@ -15,9 +16,16 @@ class LinesOfCode(
1516
val tw: FileTrapWriter,
1617
val file: IrFile
1718
) {
18-
val psi2Ir = Psi2Ir(logger)
19+
val psi2Ir = getPsi2Ir(logger).also {
20+
if (it == null) {
21+
logger.warn("Lines of code will not be populated as Kotlin version is too old (${KotlinCompilerVersion.getVersion()})")
22+
}
23+
}
1924

2025
fun linesOfCodeInFile(id: Label<DbFile>) {
26+
if (psi2Ir == null) {
27+
return
28+
}
2129
val ktFile = psi2Ir.getKtFile(file)
2230
if (ktFile == null) {
2331
return
@@ -26,6 +34,9 @@ class LinesOfCode(
2634
}
2735

2836
fun linesOfCodeInDeclaration(d: IrDeclaration, id: Label<out DbSourceline>) {
37+
if (psi2Ir == null) {
38+
return
39+
}
2940
val p = psi2Ir.findPsiElement(d, file)
3041
if (p == null) {
3142
return

java/kotlin-extractor/src/main/kotlin/comments/CommentExtractor.kt

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ package com.github.codeql.comments
33
import com.github.codeql.*
44
import com.github.codeql.utils.IrVisitorLookup
55
import com.github.codeql.utils.isLocalFunction
6-
import com.github.codeql.utils.versions.Psi2Ir
6+
import com.github.codeql.utils.versions.getPsi2Ir
7+
import com.github.codeql.utils.versions.Psi2IrFacade
78
import com.intellij.psi.PsiComment
89
import com.intellij.psi.PsiElement
10+
import org.jetbrains.kotlin.config.KotlinCompilerVersion
911
import org.jetbrains.kotlin.ir.IrElement
1012
import org.jetbrains.kotlin.ir.declarations.*
1113
import org.jetbrains.kotlin.ir.expressions.IrBody
@@ -21,18 +23,23 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffset
2123
class CommentExtractor(private val fileExtractor: KotlinFileExtractor, private val file: IrFile, private val fileLabel: Label<out DbFile>) {
2224
private val tw = fileExtractor.tw
2325
private val logger = fileExtractor.logger
24-
private val psi2Ir = Psi2Ir(logger)
25-
private val ktFile = psi2Ir.getKtFile(file)
2626

2727
fun extract() {
28+
val psi2Ir = getPsi2Ir(logger)
29+
if (psi2Ir == null) {
30+
logger.warn("Comments will not be extracted as Kotlin version is too old (${KotlinCompilerVersion.getVersion()})")
31+
return
32+
}
33+
val ktFile = psi2Ir.getKtFile(file)
2834
if (ktFile == null) {
2935
logger.warn("Comments are not being processed in ${file.path}.")
30-
} else {
31-
ktFile.accept(commentVisitor)
36+
return
3237
}
38+
val commentVisitor = mkCommentVisitor(psi2Ir)
39+
ktFile.accept(commentVisitor)
3340
}
3441

35-
private val commentVisitor =
42+
private fun mkCommentVisitor(psi2Ir: Psi2IrFacade): KtVisitor<Unit, Unit> =
3643
object : KtVisitor<Unit, Unit>() {
3744
override fun visitElement(element: PsiElement) {
3845
element.acceptChildren(this)

java/kotlin-extractor/src/main/kotlin/utils/IrVisitorLookup.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package com.github.codeql.utils
22

3-
import com.github.codeql.utils.versions.Psi2Ir
3+
import com.github.codeql.utils.versions.Psi2IrFacade
44
import com.intellij.psi.PsiElement
55
import org.jetbrains.kotlin.ir.IrElement
66
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
77
import org.jetbrains.kotlin.ir.declarations.IrFile
88
import org.jetbrains.kotlin.ir.util.isFakeOverride
99
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
1010

11-
class IrVisitorLookup(private val psi2Ir: Psi2Ir, private val psi: PsiElement, private val file: IrFile) :
11+
class IrVisitorLookup(private val psi2Ir: Psi2IrFacade, private val psi: PsiElement, private val file: IrFile) :
1212
IrElementVisitor<Unit, MutableCollection<IrElement>> {
1313
private val location = psi.getLocation()
1414

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,5 @@
11
package com.github.codeql.utils.versions
22

33
import com.github.codeql.FileLogger
4-
import com.intellij.psi.PsiElement
5-
import org.jetbrains.kotlin.ir.IrElement
6-
import org.jetbrains.kotlin.ir.declarations.IrFile
7-
import org.jetbrains.kotlin.psi.KtFile
84

9-
class Psi2Ir(private val logger: FileLogger) : Psi2IrFacade {
10-
override fun getKtFile(irFile: IrFile): KtFile? {
11-
logger.warn("Comment extraction is not supported for Kotlin < 1.5.20")
12-
return null
13-
}
14-
15-
override fun findPsiElement(irElement: IrElement, irFile: IrFile): PsiElement? {
16-
logger.error("Attempted comment extraction for Kotlin < 1.5.20")
17-
return null
18-
}
19-
}
5+
fun getPsi2Ir(@Suppress("UNUSED_PARAMETER") logger: FileLogger): Psi2IrFacade? = null

java/kotlin-extractor/src/main/kotlin/utils/versions/v_1_5_20/Psi2Ir.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import org.jetbrains.kotlin.ir.IrElement
88
import org.jetbrains.kotlin.ir.declarations.IrFile
99
import org.jetbrains.kotlin.psi.KtFile
1010

11-
class Psi2Ir(private val logger: FileLogger): Psi2IrFacade {
11+
fun getPsi2Ir(logger: FileLogger): Psi2IrFacade? = Psi2Ir(logger)
12+
13+
private class Psi2Ir(private val logger: FileLogger): Psi2IrFacade {
1214
override fun getKtFile(irFile: IrFile): KtFile? {
1315
return irFile.getKtFile()
1416
}

java/ql/integration-tests/posix-only/kotlin/logs/index_logs.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def write_line(origin, kind, msg):
3232
j = json.loads(line)
3333
msg = j['message']
3434
msg = re.sub('(?<=Extraction for invocation TRAP file ).*/kt-db/trap/java/invocations/kotlin\..*\.trap', '<FILENAME>', msg)
35+
msg = re.sub('(?<=Kotlin version )[0-9.]+', '<VERSION>', msg)
3536
if msg.startswith('Peak memory: '):
3637
# Peak memory information varies from run to run, so just ignore it
3738
continue
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
| 1 | 1 | Test script | Log file | 1 |
22
| 1 | 2 | CodeQL Kotlin extractor | INFO | Extraction started |
33
| 1 | 3 | CodeQL Kotlin extractor | INFO | Extraction for invocation TRAP file <FILENAME> |
4-
| 1 | 4 | CodeQL Kotlin extractor | INFO | Extracting file test.kt |
5-
| 1 | 5 | CodeQL Kotlin extractor | INFO | Extraction completed |
4+
| 1 | 4 | CodeQL Kotlin extractor | INFO | Kotlin version <VERSION> |
5+
| 1 | 5 | CodeQL Kotlin extractor | INFO | Extracting file test.kt |
6+
| 1 | 6 | CodeQL Kotlin extractor | INFO | Extraction completed |

0 commit comments

Comments
 (0)