Skip to content

Commit a33580c

Browse files
authored
feat: Add TypeDescriptor for CUnion (#183)
* Add TypeDescriptor for CUnion Fixes #174 * chore: add unit tests for descriptor logic
1 parent 1fc1bf5 commit a33580c

File tree

20 files changed

+150
-45
lines changed

20 files changed

+150
-45
lines changed

core/src/fr/hammons/slinc/CUnion.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import fr.hammons.slinc.modules.ReadWriteModule
77
import fr.hammons.slinc.modules.DescriptorModule
88
import scala.NonEmptyTuple
99

10-
class CUnion[T <: Tuple](mem: Mem):
10+
class CUnion[T <: Tuple](private[slinc] val mem: Mem):
1111
private inline def getHelper[T <: Tuple, A](using
1212
dO: DescriptorOf[A],
1313
rwm: ReadWriteModule

core/src/fr/hammons/slinc/DescriptorOf.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package fr.hammons.slinc
22

33
import fr.hammons.slinc.container.*
44
import scala.quoted.*
5+
import scala.compiletime.{summonInline, erasedValue}
6+
import scala.NonEmptyTuple
57

68
/** Typeclass that summons TypeDescriptors
79
*/
@@ -64,3 +66,14 @@ object DescriptorOf:
6466
)
6567

6668
'{ $expr.descriptor }
69+
70+
private inline def helper[B <: Tuple]: Set[TypeDescriptor] =
71+
inline erasedValue[B] match
72+
case _: (a *: t) => helper[t] + summonInline[DescriptorOf[a]].descriptor
73+
case _: EmptyTuple => Set.empty[TypeDescriptor]
74+
75+
inline given [A <: NonEmptyTuple]: DescriptorOf[CUnion[A]] =
76+
new DescriptorOf[CUnion[A]]:
77+
val descriptor: CUnionDescriptor { type Inner = CUnion[A] } =
78+
CUnionDescriptor(helper[A])
79+
.asInstanceOf[CUnionDescriptor { type Inner = CUnion[A] }]

core/src/fr/hammons/slinc/MacroHelpers.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package fr.hammons.slinc
22

33
import scala.quoted.*
4-
import scala.annotation.nowarn
5-
64
private[slinc] object MacroHelpers:
75
def widenExpr(t: Expr[?])(using Quotes) =
86
import quotes.reflect.*

core/src/fr/hammons/slinc/Mem.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package fr.hammons.slinc
22

3-
import scala.annotation.nowarn
4-
53
trait Mem:
64
import scala.compiletime.asMatchable
75
def offset(bytes: Bytes): Mem

core/src/fr/hammons/slinc/MethodHandleTools.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package fr.hammons.slinc
33
import scala.quoted.*
44
import java.lang.invoke.MethodHandle
55
import fr.hammons.slinc.modules.TransitionModule
6-
import scala.annotation.nowarn
76

87
object MethodHandleTools:
98
def exprNameMapping(expr: Expr[Any])(using Quotes): String =

core/src/fr/hammons/slinc/SlincImpl.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package fr.hammons.slinc
22

33
import scala.annotation.StaticAnnotation
44
import scala.quoted.*
5-
import scala.annotation.nowarn
65

76
class SlincImpl(val version: Int) extends StaticAnnotation
87

core/src/fr/hammons/slinc/Struct.scala

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import fr.hammons.slinc.modules.TransitionModule
88
import fr.hammons.slinc.modules.ReadWriteModule
99
import fr.hammons.slinc.modules.Reader
1010
import fr.hammons.slinc.modules.Writer
11-
import scala.annotation.nowarn
1211

1312
trait Struct[A <: Product] extends DescriptorOf[A]
1413

@@ -110,12 +109,10 @@ object Struct:
110109
val reader = readGen[A]
111110
val writer = writeGen[A]
112111

113-
@nowarn("msg=unused implicit parameter")
114112
override val returnTransition = returnValue =>
115113
val mem = summon[TransitionModule].memReturn(returnValue)
116114
summon[ReadWriteModule].read(mem, Bytes(0), this)
117115

118-
@nowarn("msg=unused implicit parameter")
119116
override val argumentTransition = argument =>
120117
val mem = summon[Allocator].allocate(this, 1)
121118
summon[ReadWriteModule].write(mem, Bytes(0), this, argument)

core/src/fr/hammons/slinc/TypeDescriptor.scala

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ import fr.hammons.slinc.modules.{
88
ArrayReader,
99
readWriteModule
1010
}
11-
import scala.annotation.nowarn
1211
import scala.reflect.ClassTag
1312
import scala.quoted.*
1413
import fr.hammons.slinc.modules.TransitionModule
1514
import fr.hammons.slinc.modules.{ArgumentTransition, ReturnTransition}
15+
import scala.NonEmptyTuple
1616

1717
/** Describes types used by C interop
1818
*/
@@ -106,31 +106,23 @@ case object LongDescriptor extends BasicDescriptor:
106106

107107
case object FloatDescriptor extends BasicDescriptor:
108108
type Inner = Float
109-
@nowarn("msg=unused implicit parameter")
110109
val reader = readWriteModule.floatReader
111-
@nowarn("msg=unused implicit parameter")
112110
val writer = readWriteModule.floatWriter
113111

114112
case object DoubleDescriptor extends BasicDescriptor:
115113
type Inner = Double
116-
@nowarn("msg=unused implicit parameter")
117114
val reader = readWriteModule.doubleReader
118-
@nowarn("msg=unused implicit parameter")
119115
val writer = readWriteModule.doubleWriter
120116

121117
case object PtrDescriptor extends TypeDescriptor:
122118
type Inner = Ptr[?]
123-
@nowarn("msg=unused implicit parameter")
124119
override val reader = (mem, offset) =>
125120
Ptr(readWriteModule.memReader(mem, offset), Bytes(0))
126-
@nowarn("msg=unused implicit parameter")
127121
override val writer = (mem, offset, a) =>
128122
readWriteModule.memWriter(mem, offset, a.mem)
129123

130-
@nowarn("msg=unused implicit parameter")
131124
override val argumentTransition = _.mem.asAddress
132125

133-
@nowarn("msg=unused implicit parameter")
134126
override val returnTransition = o =>
135127
Ptr[Any](summon[TransitionModule].addressReturn(o), Bytes(0))
136128

@@ -174,11 +166,9 @@ case class AliasDescriptor[A](val real: TypeDescriptor) extends TypeDescriptor:
174166
val writer: (ReadWriteModule, DescriptorModule) ?=> Writer[Inner] =
175167
(rwm, _) ?=> (mem, bytes, a) => rwm.write(mem, bytes, real, a)
176168

177-
@nowarn("msg=unused implicit parameter")
178169
override val argumentTransition =
179170
summon[TransitionModule].methodArgument(real, _, summon[Allocator])
180171

181-
@nowarn("msg=unused implicit parameter")
182172
override val returnTransition = summon[TransitionModule].methodReturn(real, _)
183173
override def size(using dm: DescriptorModule): Bytes = dm.sizeOf(real)
184174
override def alignment(using dm: DescriptorModule): Bytes =
@@ -189,22 +179,36 @@ case class AliasDescriptor[A](val real: TypeDescriptor) extends TypeDescriptor:
189179
case object VaListDescriptor extends TypeDescriptor:
190180
type Inner = VarArgs
191181

192-
@nowarn(TypeDescriptor.unusedImplicit)
193182
override val reader: (ReadWriteModule, DescriptorModule) ?=> Reader[Inner] =
194183
(mem, offset) => summon[ReadWriteModule].memReader(mem, offset).asVarArgs
195184

196-
@nowarn(TypeDescriptor.unusedImplicit)
197185
override val argumentTransition
198186
: (TransitionModule, ReadWriteModule, Allocator) ?=> ArgumentTransition[
199187
Inner
200188
] = _.mem.asAddress
201189

202-
@nowarn(TypeDescriptor.unusedImplicit)
203190
override val writer: (ReadWriteModule, DescriptorModule) ?=> Writer[Inner] =
204191
(mem, offset, value) =>
205192
summon[ReadWriteModule].memWriter(mem, offset, value.mem)
206193

207-
@nowarn(TypeDescriptor.unusedImplicit)
208194
override val returnTransition
209195
: (TransitionModule, ReadWriteModule) ?=> ReturnTransition[Inner] = o =>
210196
summon[TransitionModule].addressReturn(o).asVarArgs
197+
198+
case class CUnionDescriptor(possibleTypes: Set[TypeDescriptor])
199+
extends TypeDescriptor:
200+
type Inner = CUnion[? <: NonEmptyTuple]
201+
202+
override val reader: (ReadWriteModule, DescriptorModule) ?=> Reader[Inner] =
203+
???
204+
205+
override val returnTransition
206+
: (TransitionModule, ReadWriteModule) ?=> ReturnTransition[Inner] = ???
207+
208+
override val argumentTransition
209+
: (TransitionModule, ReadWriteModule, Allocator) ?=> ArgumentTransition[
210+
Inner
211+
] = ???
212+
213+
override val writer: (ReadWriteModule, DescriptorModule) ?=> Writer[Inner] =
214+
???

core/src/fr/hammons/slinc/types/Arch.scala

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package fr.hammons.slinc.types
22

3-
import scala.annotation.nowarn
4-
5-
//todo: remove once https://github.com/lampepfl/dotty/issues/16878 is fixed
6-
@nowarn("msg=unused explicit parameter")
73
private[slinc] enum Arch:
84
case I386
95
case X64

core/src/fr/hammons/slinc/types/OS.scala

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package fr.hammons.slinc.types
22

3-
import scala.annotation.nowarn
4-
5-
//todo: remove once https://github.com/lampepfl/dotty/issues/16878 is fixed
6-
@nowarn("msg=unused explicit parameter")
73
enum OS:
84
case Linux
95
case Darwin

0 commit comments

Comments
 (0)