@@ -14,52 +14,50 @@ import kotlin.reflect.KClass
1414
1515typealias ConfigurationBuilder <C > = (KSolverUniversalConfigurationBuilder ) -> C
1616
17- private val solverConstructorZ3 : (KContext ) -> KSolver <* > by lazy {
18- val cls = Class .forName(" org.ksmt.solver.z3.KZ3Solver " )
17+ internal fun createSolverConstructor ( solverQualifiedName : String ): (KContext ) -> KSolver <* > {
18+ val cls = Class .forName(solverQualifiedName )
1919 val ctor = cls.getConstructor(KContext ::class .java)
20- ( { ctx: KContext -> ctor.newInstance(ctx) as KSolver <* > })
20+ return { ctx: KContext -> ctor.newInstance(ctx) as KSolver <* > }
2121}
2222
23- private val configConstructorZ3: (KSolverUniversalConfigurationBuilder ) -> KSolverConfiguration by lazy {
24- val cls = Class .forName(" org.ksmt.solver.z3.KZ3SolverUniversalConfiguration" )
23+ internal fun createConfigConstructor (
24+ configQualifiedName : String
25+ ): (KSolverUniversalConfigurationBuilder ) -> KSolverConfiguration {
26+ val cls = Class .forName(configQualifiedName)
2527 val ctor = cls.getConstructor(KSolverUniversalConfigurationBuilder ::class .java)
26- ({ builder: KSolverUniversalConfigurationBuilder -> ctor.newInstance(builder) as KSolverConfiguration })
28+ return { builder: KSolverUniversalConfigurationBuilder -> ctor.newInstance(builder) as KSolverConfiguration }
29+ }
30+
31+ private val solverConstructorZ3: (KContext ) -> KSolver <* > by lazy {
32+ createSolverConstructor(" org.ksmt.solver.z3.KZ3Solver" )
33+ }
34+
35+ private val configConstructorZ3: (KSolverUniversalConfigurationBuilder ) -> KSolverConfiguration by lazy {
36+ createConfigConstructor(" org.ksmt.solver.z3.KZ3SolverUniversalConfiguration" )
2737}
2838
2939private val solverConstructorBitwuzla: (KContext ) -> KSolver <* > by lazy {
30- val cls = Class .forName(" org.ksmt.solver.bitwuzla.KBitwuzlaSolver" )
31- val ctor = cls.getConstructor(KContext ::class .java)
32- ({ ctx: KContext -> ctor.newInstance(ctx) as KSolver <* > })
40+ createSolverConstructor(" org.ksmt.solver.bitwuzla.KBitwuzlaSolver" )
3341}
3442
3543private val configConstructorBitwuzla: (KSolverUniversalConfigurationBuilder ) -> KSolverConfiguration by lazy {
36- val cls = Class .forName(" org.ksmt.solver.bitwuzla.KBitwuzlaSolverUniversalConfiguration" )
37- val ctor = cls.getConstructor(KSolverUniversalConfigurationBuilder ::class .java)
38- ({ builder: KSolverUniversalConfigurationBuilder -> ctor.newInstance(builder) as KSolverConfiguration })
44+ createConfigConstructor(" org.ksmt.solver.bitwuzla.KBitwuzlaSolverUniversalConfiguration" )
3945}
4046
4147private val solverConstructorYices: (KContext ) -> KSolver <* > by lazy {
42- val cls = Class .forName(" org.ksmt.solver.yices.KYicesSolver" )
43- val ctor = cls.getConstructor(KContext ::class .java)
44- ({ ctx: KContext -> ctor.newInstance(ctx) as KSolver <* > })
48+ createSolverConstructor(" org.ksmt.solver.yices.KYicesSolver" )
4549}
4650
4751private val configConstructorYices: (KSolverUniversalConfigurationBuilder ) -> KSolverConfiguration by lazy {
48- val cls = Class .forName(" org.ksmt.solver.yices.KYicesSolverUniversalConfiguration" )
49- val ctor = cls.getConstructor(KSolverUniversalConfigurationBuilder ::class .java)
50- ({ builder: KSolverUniversalConfigurationBuilder -> ctor.newInstance(builder) as KSolverConfiguration })
52+ createConfigConstructor(" org.ksmt.solver.yices.KYicesSolverUniversalConfiguration" )
5153}
5254
5355private val solverConstructorCvc5: (KContext ) -> KSolver <* > by lazy {
54- val cls = Class .forName(" org.ksmt.solver.cvc5.KCvc5Solver" )
55- val ctor = cls.getConstructor(KContext ::class .java)
56- ({ ctx: KContext -> ctor.newInstance(ctx) as KSolver <* > })
56+ createSolverConstructor(" org.ksmt.solver.cvc5.KCvc5Solver" )
5757}
5858
5959private val configConstructorCvc5: (KSolverUniversalConfigurationBuilder ) -> KSolverConfiguration by lazy {
60- val cls = Class .forName(" org.ksmt.solver.cvc5.KCvc5SolverUniversalConfiguration" )
61- val ctor = cls.getConstructor(KSolverUniversalConfigurationBuilder ::class .java)
62- ({ builder: KSolverUniversalConfigurationBuilder -> ctor.newInstance(builder) as KSolverConfiguration })
60+ createConfigConstructor(" org.ksmt.solver.cvc5.KCvc5SolverUniversalConfiguration" )
6361}
6462
6563private val solverTypes = mapOf (
@@ -70,13 +68,14 @@ private val solverTypes = mapOf(
7068)
7169
7270val KClass <out KSolver <* >>.solverType: SolverType
73- get() = solverTypes[qualifiedName] ? : error( " Unsupported solver: ${qualifiedName} " )
71+ get() = solverTypes[qualifiedName] ? : SolverType . Custom
7472
7573fun SolverType.createInstance (ctx : KContext ): KSolver <* > = when (this ) {
7674 SolverType .Z3 -> solverConstructorZ3(ctx)
7775 SolverType .Bitwuzla -> solverConstructorBitwuzla(ctx)
7876 SolverType .Yices -> solverConstructorYices(ctx)
7977 SolverType .Cvc5 -> solverConstructorCvc5(ctx)
78+ SolverType .Custom -> error(" User defined solvers should not be created with this builder" )
8079}
8180
8281@Suppress(" UNCHECKED_CAST" )
@@ -85,5 +84,6 @@ fun <C : KSolverConfiguration> SolverType.createConfigurationBuilder(): Configur
8584 SolverType .Bitwuzla -> { builder -> configConstructorBitwuzla(builder) as C }
8685 SolverType .Yices -> { builder -> configConstructorYices(builder) as C }
8786 SolverType .Cvc5 -> { builder -> configConstructorCvc5(builder) as C }
87+ SolverType .Custom -> error(" User defined solver config builders should not be created with this builder" )
8888}
8989
0 commit comments