summaryrefslogtreecommitdiff
path: root/plugins/kotlin/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinJavaBuilderExtension.kt
blob: 314ab6e75515192a85497810472a8fddfb34bb39 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.

package org.jetbrains.kotlin.jps.build

import org.jetbrains.jps.api.BasicFuture
import org.jetbrains.jps.builders.java.JavaBuilderExtension
import org.jetbrains.jps.builders.java.dependencyView.Callbacks
import org.jetbrains.jps.incremental.CompileContext
import org.jetbrains.kotlin.incremental.LookupSymbol
import java.io.File
import java.util.concurrent.Executors
import java.util.concurrent.Future
import java.util.concurrent.TimeUnit

class KotlinJavaBuilderExtension : JavaBuilderExtension() {
    override fun getConstantSearch(context: CompileContext): Callbacks.ConstantAffectionResolver {
        return KotlinLookupConstantSearch(context)
    }
}

private class KotlinLookupConstantSearch(context: CompileContext) : Callbacks.ConstantAffectionResolver {
    private val pool = Executors.newSingleThreadExecutor()
    private val kotlinContext by lazy { context.kotlin }

    override fun request(
        ownerClassName: String,
        fieldName: String,
        accessFlags: Int,
        fieldRemoved: Boolean,
        accessChanged: Boolean
    ): Future<Callbacks.ConstantAffection> {
        val future = object : BasicFuture<Callbacks.ConstantAffection>() {
            @Volatile
            private var result: Callbacks.ConstantAffection = Callbacks.ConstantAffection.EMPTY

            fun result(files: Collection<File>) {
                result = Callbacks.ConstantAffection(files)
                setDone()
            }

            override fun get(): Callbacks.ConstantAffection {
                super.get()
                return result
            }

            override fun get(timeout: Long, unit: TimeUnit): Callbacks.ConstantAffection {
                super.get(timeout, unit)
                return result
            }
        }
        pool.submit {
            if (!future.isCancelled) {
                kotlinContext.lookupStorageManager.withLookupStorage { storage ->
                    val paths = storage.get(LookupSymbol(name = fieldName, scope = ownerClassName))
                    future.result(paths.map { File(it) })
                }
            }
        }
        return future
    }
}