From f5f2ce48b9dc947fc9e7e567fddd4bc4da327821 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 1 Jun 2026 19:41:25 +0200 Subject: [PATCH 1/6] =?UTF-8?q?refactor(scala-3,core):=20F[=5F]=20?= =?UTF-8?q?=E2=86=92=20F[=3F]=20in=20applied=20positions=20(serialization)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Targeted rewrites: Array[GenCodec[?]], Array[Class[?]], List[Case[?]], Opt[cborKey[?]], Opt[cborDiscriminator[?]], List[Field[?]], List[CborKeyInfo[?]], Array[GenCodec.OOOFieldsObjectCodec[?]], Array[OOOFieldsObjectCodec[?]], InputMetadata[?], BIterable[?], Transformed[?, ?]. Kind-parameter declarations (trait PolyCodec[C[_]], abstract class HasPolyGenCodec[C[_]], abstract class HasPolyGenObjectCodec[C[_]], trait PolyObjectCodec[C[_]], abstract class HasPolyGenObjectCodecWithDeps[D, C[_]], abstract class HasPolyGenCodecWithDeps[D, C[_]], trait GadtCodec[C[_]], abstract class HasGadtCodec[C[_]], trait CborAdtPolyInstances[C[_]], abstract class HasPolyCborCodec[C[_]]) preserved verbatim per Pitfall 3. --- .../commons/serialization/FieldValues.scala | 2 +- .../commons/serialization/GenCodec.scala | 4 ++-- .../commons/serialization/InputOutput.scala | 4 ++-- .../serialization/cbor/CborAdtMetadata.scala | 16 ++++++++-------- .../commons/serialization/cbor/CborOutput.scala | 2 +- .../serialization/json/JsonStringOutput.scala | 2 +- .../commons/serialization/macroCodecs.scala | 16 ++++++++-------- .../commons/serialization/wrappers.scala | 2 +- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/core/src/main/scala/com/avsystem/commons/serialization/FieldValues.scala b/core/src/main/scala/com/avsystem/commons/serialization/FieldValues.scala index f40b42f6a..fa5a6a69f 100644 --- a/core/src/main/scala/com/avsystem/commons/serialization/FieldValues.scala +++ b/core/src/main/scala/com/avsystem/commons/serialization/FieldValues.scala @@ -12,7 +12,7 @@ object FieldValues { } final class FieldValues( private val fieldNames: Array[String], - codecs: Array[GenCodec[_]], + codecs: Array[GenCodec[?]], ofWhat: OptArg[String] = OptArg.Empty, ) { diff --git a/core/src/main/scala/com/avsystem/commons/serialization/GenCodec.scala b/core/src/main/scala/com/avsystem/commons/serialization/GenCodec.scala index 97c3eef3b..111e866f0 100644 --- a/core/src/main/scala/com/avsystem/commons/serialization/GenCodec.scala +++ b/core/src/main/scala/com/avsystem/commons/serialization/GenCodec.scala @@ -331,8 +331,8 @@ object GenCodec extends RecursiveAutoCodecs with TupleGenCodecs { } } - def underlyingCodec(codec: GenCodec[_]): GenCodec[_] = codec match { - case tc: Transformed[_, _] => underlyingCodec(tc.wrapped) + def underlyingCodec(codec: GenCodec[?]): GenCodec[?] = codec match { + case tc: Transformed[?, ?] => underlyingCodec(tc.wrapped) case _ => codec } diff --git a/core/src/main/scala/com/avsystem/commons/serialization/InputOutput.scala b/core/src/main/scala/com/avsystem/commons/serialization/InputOutput.scala index 62c77154e..486cba737 100644 --- a/core/src/main/scala/com/avsystem/commons/serialization/InputOutput.scala +++ b/core/src/main/scala/com/avsystem/commons/serialization/InputOutput.scala @@ -74,7 +74,7 @@ trait Output extends Any with AcceptsCustomEvents { * [[com.avsystem.commons.serialization.InputMetadata InputMetadata]] identifier. If this method returns `false` then * this `Output` does not support this medatata type and codec should fall back to some other serialization strategy. */ - def keepsMetadata(metadata: InputMetadata[_]): Boolean = false + def keepsMetadata(metadata: InputMetadata[?]): Boolean = false /** This ugly workaround has been introduced when standard `Option` encoding changed from zero-or-one element list * encoding to unwrapped-or-null encoding which effectively disallowed serializing `null` and `Some(null)`. If some @@ -168,7 +168,7 @@ trait SequentialOutput extends Any with AcceptsCustomEvents { /** Based on given collection's `knownSize` and [[sizePolicy]], declares the size of this output as size of this * collection if it is either cheap or required to do so. */ - final def declareSizeOf(coll: BIterable[_]): Unit = sizePolicy match { + final def declareSizeOf(coll: BIterable[?]): Unit = sizePolicy match { case SizePolicy.Ignored => case SizePolicy.Optional => coll.knownSize match { diff --git a/core/src/main/scala/com/avsystem/commons/serialization/cbor/CborAdtMetadata.scala b/core/src/main/scala/com/avsystem/commons/serialization/cbor/CborAdtMetadata.scala index b29a238de..63a1822cc 100644 --- a/core/src/main/scala/com/avsystem/commons/serialization/cbor/CborAdtMetadata.scala +++ b/core/src/main/scala/com/avsystem/commons/serialization/cbor/CborAdtMetadata.scala @@ -77,7 +77,7 @@ object CborAdtMetadata extends AdtMetadataCompanion[CborAdtMetadata] { final class CborKeyInfo[T]( @reifyName val sourceName: String, @optional @reifyAnnot val nameAnnot: Opt[name], - @optional @reifyAnnot val cborKey: Opt[cborKey[_]], + @optional @reifyAnnot val cborKey: Opt[cborKey[?]], ) { val stringKey: String = nameAnnot.fold(sourceName)(_.name) val rawKey: RawCbor = cborKey.fold(CborOutput.writeRawCbor(stringKey))(_.rawKey) @@ -86,9 +86,9 @@ object CborAdtMetadata extends AdtMetadataCompanion[CborAdtMetadata] { @positioned(positioned.here) final class Union[T]( @reifyName val sourceName: String, - @optional @reifyAnnot val discriminator: Opt[cborDiscriminator[_]], + @optional @reifyAnnot val discriminator: Opt[cborDiscriminator[?]], @optional @reifyAnnot val flattenAnnot: Opt[flatten], - @multi @adtCaseMetadata val cases: List[Case[_]], + @multi @adtCaseMetadata val cases: List[Case[?]], ) extends CborAdtMetadata[T] { union => private val caseNamesKeyCodec = new MappingCborKeyCodec(cases.map(_.keyInfo)) @@ -106,7 +106,7 @@ object CborAdtMetadata extends AdtMetadataCompanion[CborAdtMetadata] { nestedCodec.caseNames, nestedCodec.cases, ) { - def caseDependencies: Array[GenCodec[_]] = + def caseDependencies: Array[GenCodec[?]] = (nestedCodec.caseDependencies.iterator zip union.cases.iterator).map { case (caseCodec: ApplyUnapplyCodec[Any @unchecked], theCase: CborAdtMetadata.Record[Any @unchecked]) => theCase.adjustCodec(caseCodec) @@ -137,9 +137,9 @@ object CborAdtMetadata extends AdtMetadataCompanion[CborAdtMetadata] { override protected def doReadCaseName(input: Input): String = input.readCustom(RawCbor).map(caseNamesKeyCodec.strKeys).getOrElse(super.doReadCaseName(input)) - def oooDependencies: Array[GenCodec[_]] = flatCodec.oooDependencies + def oooDependencies: Array[GenCodec[?]] = flatCodec.oooDependencies - def caseDependencies: Array[GenCodec.OOOFieldsObjectCodec[_]] = + def caseDependencies: Array[GenCodec.OOOFieldsObjectCodec[?]] = (flatCodec.caseDependencies.iterator zip union.cases.iterator).map { case (caseCodec: ApplyUnapplyCodec[Any @unchecked], theCase: CborAdtMetadata.Record[Any @unchecked]) => theCase.adjustFlatCaseCodec(caseCodec) @@ -175,7 +175,7 @@ object CborAdtMetadata extends AdtMetadataCompanion[CborAdtMetadata] { @positioned(positioned.here) final class Record[T]( @composite val keyInfo: CborKeyInfo[T], - @multi @adtParamMetadata val fields: List[Field[_]], + @multi @adtParamMetadata val fields: List[Field[?]], ) extends Case[T] { private val keyCodec = new MappingCborKeyCodec(fields.map(_.keyInfo)) @@ -223,7 +223,7 @@ object CborAdtMetadata extends AdtMetadataCompanion[CborAdtMetadata] { def validate(): Unit = () } - private class MappingCborKeyCodec(keyInfos: List[CborKeyInfo[_]]) extends CborKeyCodec { + private class MappingCborKeyCodec(keyInfos: List[CborKeyInfo[?]]) extends CborKeyCodec { val rawKeys: Map[String, RawCbor] = keyInfos.mkMap(_.stringKey, _.rawKey) val strKeys: Map[RawCbor, String] = diff --git a/core/src/main/scala/com/avsystem/commons/serialization/cbor/CborOutput.scala b/core/src/main/scala/com/avsystem/commons/serialization/cbor/CborOutput.scala index 2a5c2544f..0b3458aab 100644 --- a/core/src/main/scala/com/avsystem/commons/serialization/cbor/CborOutput.scala +++ b/core/src/main/scala/com/avsystem/commons/serialization/cbor/CborOutput.scala @@ -172,7 +172,7 @@ class CborOutput(out: DataOutput, keyCodec: CborKeyCodec, sizePolicy: SizePolicy super.writeCustom(typeMarker, value) } - override def keepsMetadata(metadata: InputMetadata[_]): Boolean = metadata match { + override def keepsMetadata(metadata: InputMetadata[?]): Boolean = metadata match { case InitialByte | Tags => true case _ => super.keepsMetadata(metadata) } diff --git a/core/src/main/scala/com/avsystem/commons/serialization/json/JsonStringOutput.scala b/core/src/main/scala/com/avsystem/commons/serialization/json/JsonStringOutput.scala index bce129f4b..c3a0c7a25 100644 --- a/core/src/main/scala/com/avsystem/commons/serialization/json/JsonStringOutput.scala +++ b/core/src/main/scala/com/avsystem/commons/serialization/json/JsonStringOutput.scala @@ -123,7 +123,7 @@ final class JsonStringOutput(builder: JStringBuilder, options: JsonOptions = Jso def writeRawJson(json: String): Unit = builder.append(json) - override def keepsMetadata(metadata: InputMetadata[_]): Boolean = + override def keepsMetadata(metadata: InputMetadata[?]): Boolean = metadata == JsonType override def writeCustom[T](typeMarker: TypeMarker[T], value: T): Boolean = diff --git a/core/src/main/scala/com/avsystem/commons/serialization/macroCodecs.scala b/core/src/main/scala/com/avsystem/commons/serialization/macroCodecs.scala index 251ed0237..7a395fa95 100644 --- a/core/src/main/scala/com/avsystem/commons/serialization/macroCodecs.scala +++ b/core/src/main/scala/com/avsystem/commons/serialization/macroCodecs.scala @@ -24,7 +24,7 @@ abstract class ApplyUnapplyCodec[T]( ) extends ErrorReportingCodec[T] with OOOFieldsObjectCodec[T] { - protected def dependencies: Array[GenCodec[_]] + protected def dependencies: Array[GenCodec[?]] protected def instantiate(fieldValues: FieldValues): T private[this] lazy val deps = dependencies @@ -130,7 +130,7 @@ abstract class SealedHierarchyCodec[T]( val typeRepr: String, val nullable: Boolean, val caseNames: Array[String], - val cases: Array[Class[_]], + val cases: Array[Class[?]], ) extends ErrorReportingCodec[T] with ObjectCodec[T] { @@ -149,10 +149,10 @@ abstract class NestedSealedHierarchyCodec[T]( typeRepr: String, nullable: Boolean, caseNames: Array[String], - cases: Array[Class[_]], + cases: Array[Class[?]], ) extends SealedHierarchyCodec[T](typeRepr, nullable, caseNames, cases) { - def caseDependencies: Array[GenCodec[_]] + def caseDependencies: Array[GenCodec[?]] private[this] lazy val caseDeps = caseDependencies @@ -177,7 +177,7 @@ abstract class FlatSealedHierarchyCodec[T]( typeRepr: String, nullable: Boolean, caseNames: Array[String], - cases: Array[Class[_]], + cases: Array[Class[?]], val oooFieldNames: Array[String], val caseDependentFieldNames: Set[String], override val caseFieldName: String, @@ -185,8 +185,8 @@ abstract class FlatSealedHierarchyCodec[T]( val defaultCaseTransient: Boolean, ) extends SealedHierarchyCodec[T](typeRepr, nullable, caseNames, cases) { - def oooDependencies: Array[GenCodec[_]] - def caseDependencies: Array[OOOFieldsObjectCodec[_]] + def oooDependencies: Array[GenCodec[?]] + def caseDependencies: Array[OOOFieldsObjectCodec[?]] private[this] lazy val oooDeps = oooDependencies private[this] lazy val caseDeps = caseDependencies @@ -386,7 +386,7 @@ abstract class JavaBuilderBasedCodec[T, B]( ) extends ErrorReportingCodec[T] with GenCodec.ObjectCodec[T] { - protected def dependencies: Array[GenCodec[_]] + protected def dependencies: Array[GenCodec[?]] private lazy val deps = dependencies diff --git a/core/src/main/scala/com/avsystem/commons/serialization/wrappers.scala b/core/src/main/scala/com/avsystem/commons/serialization/wrappers.scala index 7950adac7..e04abfe14 100644 --- a/core/src/main/scala/com/avsystem/commons/serialization/wrappers.scala +++ b/core/src/main/scala/com/avsystem/commons/serialization/wrappers.scala @@ -68,7 +68,7 @@ abstract class OutputWrapper extends Output { def writeList(): ListOutput = wrapped.writeList() def writeObject(): ObjectOutput = wrapped.writeObject() override def writeCustom[T](typeMarker: TypeMarker[T], value: T): Boolean = wrapped.writeCustom(typeMarker, value) - override def keepsMetadata(metadata: InputMetadata[_]): Boolean = wrapped.keepsMetadata(metadata) + override def keepsMetadata(metadata: InputMetadata[?]): Boolean = wrapped.keepsMetadata(metadata) override def customEvent[T](marker: CustomEventMarker[T], value: T): Boolean = wrapped.customEvent(marker, value) override def legacyOptionEncoding: Boolean = wrapped.legacyOptionEncoding } From 87fe16597cf0cde630debb9a25586e423cbac6e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 1 Jun 2026 19:41:57 +0200 Subject: [PATCH 2/6] =?UTF-8?q?refactor(scala-3,core):=20F[=5F]=20?= =?UTF-8?q?=E2=86=92=20F[=3F]=20in=20applied=20positions=20(rpc)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Targeted rewrites: Iterator[?], List[ParamMetadata[?]], Map[String, FunctionSignature[?]], Map[String, GetterSignature[?]]. Kind-parameter declarations (def materialize[M[_], Real], def materializeForApi[M[_], Real], trait RpcMetadataCompanion[M[_]], trait ApiMetadataCompanion[M[_]]) preserved verbatim per Pitfall 3. --- .../scala/com/avsystem/commons/rpc/AsRawReal.scala | 2 +- .../com/avsystem/commons/rpc/RPCFramework.scala | 2 +- .../avsystem/commons/rpc/StandardRPCFramework.scala | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/src/main/scala/com/avsystem/commons/rpc/AsRawReal.scala b/core/src/main/scala/com/avsystem/commons/rpc/AsRawReal.scala index 760123571..b72b63fbd 100644 --- a/core/src/main/scala/com/avsystem/commons/rpc/AsRawReal.scala +++ b/core/src/main/scala/com/avsystem/commons/rpc/AsRawReal.scala @@ -119,7 +119,7 @@ object RpcMetadata { // TODO[scala3-port]: RpcMetadata.auto (Scala 2 macro def) (L) def auto[T]: T = ??? - def nextInstance[T](it: Iterator[_], description: String): T = + def nextInstance[T](it: Iterator[?], description: String): T = if (it.hasNext) it.next().asInstanceOf[T] else throw new NoSuchElementException(s"typeclass instance for $description was not provided") } diff --git a/core/src/main/scala/com/avsystem/commons/rpc/RPCFramework.scala b/core/src/main/scala/com/avsystem/commons/rpc/RPCFramework.scala index 6d4b898a8..2fc4ecdc4 100644 --- a/core/src/main/scala/com/avsystem/commons/rpc/RPCFramework.scala +++ b/core/src/main/scala/com/avsystem/commons/rpc/RPCFramework.scala @@ -58,7 +58,7 @@ trait RPCFramework { trait Signature { @reifyName def name: String @multi - @rpcParamMetadata def paramMetadata: List[ParamMetadata[_]] + @rpcParamMetadata def paramMetadata: List[ParamMetadata[?]] @reifyAnnot @multi def annotations: List[MetadataAnnotation] } diff --git a/core/src/main/scala/com/avsystem/commons/rpc/StandardRPCFramework.scala b/core/src/main/scala/com/avsystem/commons/rpc/StandardRPCFramework.scala index c652f528f..c0e8720c5 100644 --- a/core/src/main/scala/com/avsystem/commons/rpc/StandardRPCFramework.scala +++ b/core/src/main/scala/com/avsystem/commons/rpc/StandardRPCFramework.scala @@ -16,7 +16,7 @@ trait ProcedureRPCFramework extends RPCFramework { case class ProcedureSignature( name: String, - paramMetadata: List[ParamMetadata[_]], + paramMetadata: List[ParamMetadata[?]], annotations: List[MetadataAnnotation], ) extends Signature with TypedMetadata[Unit] @@ -34,7 +34,7 @@ trait FunctionRPCFramework extends RPCFramework { case class FunctionSignature[T]( name: String, - paramMetadata: List[ParamMetadata[_]], + paramMetadata: List[ParamMetadata[?]], annotations: List[MetadataAnnotation], @infer resultTypeMetadata: ResultTypeMetadata[T], ) extends Signature @@ -58,7 +58,7 @@ trait GetterRPCFramework extends RPCFramework { case class GetterSignature[T]( name: String, - paramMetadata: List[ParamMetadata[_]], + paramMetadata: List[ParamMetadata[?]], annotations: List[MetadataAnnotation], @infer @checked resultMetadata: RPCMetadata.Lazy[T], ) extends Signature @@ -75,8 +75,8 @@ trait StandardRPCFramework extends GetterRPCFramework with FunctionRPCFramework @reifyName name: String, @reifyAnnot @multi annotations: List[MetadataAnnotation], @multi @verbatim @rpcMethodMetadata procedureSignatures: Map[String, ProcedureSignature], - @multi @rpcMethodMetadata functionSignatures: Map[String, FunctionSignature[_]], - @multi @rpcMethodMetadata getterSignatures: Map[String, GetterSignature[_]], + @multi @rpcMethodMetadata functionSignatures: Map[String, FunctionSignature[?]], + @multi @rpcMethodMetadata getterSignatures: Map[String, GetterSignature[?]], ) object RPCMetadata extends RpcMetadataCompanion[RPCMetadata] } @@ -91,7 +91,7 @@ trait OneWayRPCFramework extends GetterRPCFramework with ProcedureRPCFramework { @reifyName name: String, @reifyAnnot @multi annotations: List[MetadataAnnotation], @multi @verbatim @rpcMethodMetadata procedureSignatures: Map[String, ProcedureSignature], - @multi @rpcMethodMetadata getterSignatures: Map[String, GetterSignature[_]], + @multi @rpcMethodMetadata getterSignatures: Map[String, GetterSignature[?]], ) object RPCMetadata extends RpcMetadataCompanion[RPCMetadata] } From e8e4d2e98118b89aa845a05b94cbdcf594992499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 1 Jun 2026 19:42:45 +0200 Subject: [PATCH 3/6] =?UTF-8?q?refactor(scala-3,core):=20F[=5F]=20?= =?UTF-8?q?=E2=86=92=20F[=3F]=20in=20applied=20positions=20(misc=20+=20di)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Targeted rewrites: GenKeyCodec[TypeString[?]], GenCodec[TypeString[?]], GenKeyCodec[JavaClassName[?]], GenCodec[JavaClassName[?]], Entry[K, ?]*, Component[?], AtomicReference[?], MHashMap[Component[?], ...], MHashSet[Component[?]], AtomicReference[Future[?]]. Kind-parameter declarations (class TypedMap[K[_]], case class Entry[K[_], T], def pairToEntry[K[_], T], def empty[K[_]], def apply[K[_]], trait GenCodecMapping[K[_]], def typedMapCodec[K[_]], def instancesFor[TC[_], T], case class SelfInstance[C[_]], def materialize[C[_]], trait AdtMetadataCompanion[M[_]], trait MetadataCompanion[M[_]], type MColBuilder[Elem, +Col[_]], trait TupleDerivation[C[_]]) preserved verbatim per Pitfall 3. --- .../com/avsystem/commons/di/Component.scala | 26 +++++++++---------- .../com/avsystem/commons/di/Components.scala | 2 +- .../avsystem/commons/misc/TypeString.scala | 16 ++++++------ .../com/avsystem/commons/misc/TypedMap.scala | 2 +- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/core/src/main/scala/com/avsystem/commons/di/Component.scala b/core/src/main/scala/com/avsystem/commons/di/Component.scala index 0551161ea..9a3b8b7de 100644 --- a/core/src/main/scala/com/avsystem/commons/di/Component.scala +++ b/core/src/main/scala/com/avsystem/commons/di/Component.scala @@ -8,10 +8,10 @@ import java.util.concurrent.atomic.AtomicReference import scala.annotation.compileTimeOnly import scala.annotation.unchecked.uncheckedVariance -case class ComponentInitializationException(component: Component[_], cause: Throwable) +case class ComponentInitializationException(component: Component[?], cause: Throwable) extends Exception(s"failed to initialize component ${component.info}", cause) -case class DependencyCycleException(cyclePath: List[Component[_]]) +case class DependencyCycleException(cyclePath: List[Component[?]]) extends Exception( s"component dependency cycle detected:\n${cyclePath.iterator.map(_.info).map(" " + _).mkString(" ->\n")}" ) @@ -46,7 +46,7 @@ object ComponentInfo { */ final class Component[+T]( val info: ComponentInfo, - deps: => IndexedSeq[Component[_]], + deps: => IndexedSeq[Component[?]], creator: IndexedSeq[Any] => ExecutionContext => Future[T], destroyer: DestroyFunction[T] = Component.emptyDestroy, cachedStorage: Opt[AtomicReference[Future[T]]] = Opt.Empty, @@ -61,18 +61,18 @@ final class Component[+T]( /** Returns dependencies of this component extracted from the component definition. You can use this to inspect the * dependency graph without initializing any components. */ - lazy val dependencies: IndexedSeq[Component[_]] = deps + lazy val dependencies: IndexedSeq[Component[?]] = deps private[this] val storage: AtomicReference[Future[T]] = cachedStorage.getOrElse(new AtomicReference) - private def sameStorage(otherStorage: AtomicReference[_]): Boolean = + private def sameStorage(otherStorage: AtomicReference[?]): Boolean = storage eq otherStorage // equality based on storage identity is important for cycle detection with cached components override def hashCode(): Int = storage.hashCode() override def equals(obj: Any): Boolean = obj match { - case c: Component[_] => c.sameStorage(storage) + case c: Component[?] => c.sameStorage(storage) case _ => false } @@ -106,7 +106,7 @@ final class Component[+T]( /** Forces a dependency on another component or components. */ - def dependsOn(moreDeps: Component[_]*): Component[T] = + def dependsOn(moreDeps: Component[?]*): Component[T] = new Component(info, deps ++ moreDeps, creator, destroyer, cachedStorage) /** Specifies an asynchronous function that will be used to destroy this component, i.e. free up any resources that @@ -189,7 +189,7 @@ object Component { def async[T](definition: => T): ExecutionContext => Future[T] = implicit ctx => Future(definition) - def validateAll(components: Seq[Component[_]]): Unit = + def validateAll(components: Seq[Component[?]]): Unit = GraphUtils.dfs(components)( _.dependencies.toList, onCycle = (node, stack) => { @@ -203,9 +203,9 @@ object Component { * ensured that a component is only destroyed after all components that depend on it are destroyed (reverse * initialization order). Independent components are destroyed in parallel, using given `ExecutionContext`. */ - def destroyAll(components: Seq[Component[_]])(implicit ec: ExecutionContext): Future[Unit] = { - val reverseGraph = new MHashMap[Component[_], MListBuffer[Component[_]]] - val terminals = new MHashSet[Component[_]] + def destroyAll(components: Seq[Component[?]])(implicit ec: ExecutionContext): Future[Unit] = { + val reverseGraph = new MHashMap[Component[?], MListBuffer[Component[?]]] + val terminals = new MHashSet[Component[?]] GraphUtils.dfs(components)( _.dependencies.toList, onEnter = { (c, _) => @@ -218,9 +218,9 @@ object Component { terminals += c }, ) - val destroyFutures = new MHashMap[Component[_], Future[Unit]] + val destroyFutures = new MHashMap[Component[?], Future[Unit]] - def doDestroy(c: Component[_]): Future[Unit] = + def doDestroy(c: Component[?]): Future[Unit] = destroyFutures.getOrElseUpdate(c, Future.traverse(reverseGraph(c))(doDestroy).flatMap(_ => c.doDestroy)) Future.traverse(reverseGraph.keys)(doDestroy).toUnit diff --git a/core/src/main/scala/com/avsystem/commons/di/Components.scala b/core/src/main/scala/com/avsystem/commons/di/Components.scala index d635108b9..c4bfb0d89 100644 --- a/core/src/main/scala/com/avsystem/commons/di/Components.scala +++ b/core/src/main/scala/com/avsystem/commons/di/Components.scala @@ -29,7 +29,7 @@ trait Components extends ComponentsLowPrio { protected def asyncSingleton[T](definition: ExecutionContext => Future[T])(implicit sourceInfo: SourceInfo) : Component[T] = ??? - private lazy val singletonsCache = new ConcurrentHashMap[ComponentInfo, AtomicReference[Future[_]]] + private lazy val singletonsCache = new ConcurrentHashMap[ComponentInfo, AtomicReference[Future[?]]] protected def cached[T](component: Component[T], freshInfo: ComponentInfo): Component[T] = { val cacheStorage = diff --git a/core/src/main/scala/com/avsystem/commons/misc/TypeString.scala b/core/src/main/scala/com/avsystem/commons/misc/TypeString.scala index a4de4ac93..e872f1841 100644 --- a/core/src/main/scala/com/avsystem/commons/misc/TypeString.scala +++ b/core/src/main/scala/com/avsystem/commons/misc/TypeString.scala @@ -31,11 +31,11 @@ object TypeString { // TODO[scala3-port]: TypeString.materialize (Scala 2 macro def) (L) implicit def materialize[T]: TypeString[T] = ??? - implicit val keyCodec: GenKeyCodec[TypeString[_]] = - GenKeyCodec.create[TypeString[_]](new TypeString(_), _.value) + implicit val keyCodec: GenKeyCodec[TypeString[?]] = + GenKeyCodec.create[TypeString[?]](new TypeString(_), _.value) - implicit val codec: GenCodec[TypeString[_]] = - GenCodec.nonNullSimple[TypeString[_]](i => new TypeString(i.readString()), (o, ts) => o.writeString(ts.value)) + implicit val codec: GenCodec[TypeString[?]] = + GenCodec.nonNullSimple[TypeString[?]](i => new TypeString(i.readString()), (o, ts) => o.writeString(ts.value)) } /** Typeclass that contains JVM fully qualified class name corresponding to given type. `JavaClassName.of[T]` is always @@ -80,11 +80,11 @@ object JavaClassName extends JavaClassNameLowPrio { new JavaClassName("[" + elementName) } - implicit val keyCodec: GenKeyCodec[JavaClassName[_]] = - GenKeyCodec.create[JavaClassName[_]](new JavaClassName(_), _.value) + implicit val keyCodec: GenKeyCodec[JavaClassName[?]] = + GenKeyCodec.create[JavaClassName[?]](new JavaClassName(_), _.value) - implicit val codec: GenCodec[JavaClassName[_]] = - GenCodec.nonNullSimple[JavaClassName[_]](i => new JavaClassName(i.readString()), (o, ts) => o.writeString(ts.value)) + implicit val codec: GenCodec[JavaClassName[?]] = + GenCodec.nonNullSimple[JavaClassName[?]](i => new JavaClassName(i.readString()), (o, ts) => o.writeString(ts.value)) } trait JavaClassNameLowPrio { this: JavaClassName.type => // TODO[scala3-port]: JavaClassName.materialize (Scala 2 macro def) (L) diff --git a/core/src/main/scala/com/avsystem/commons/misc/TypedMap.scala b/core/src/main/scala/com/avsystem/commons/misc/TypedMap.scala index f34d3fed6..248d58d31 100644 --- a/core/src/main/scala/com/avsystem/commons/misc/TypedMap.scala +++ b/core/src/main/scala/com/avsystem/commons/misc/TypedMap.scala @@ -78,7 +78,7 @@ object TypedMap { def empty[K[_]]: TypedMap[K] = new TypedMap[K](Map.empty) - def apply[K[_]](entries: Entry[K, _]*): TypedMap[K] = { + def apply[K[_]](entries: Entry[K, ?]*): TypedMap[K] = { val raw = Map.newBuilder[K[Any], Any] entries.foreach(e => raw += e.pair.asInstanceOf[(K[Any], Any)]) new TypedMap[K](raw.result()) From 45b83ecb806be1c93396f738351aa4fc53c25e14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 1 Jun 2026 19:43:53 +0200 Subject: [PATCH 4/6] =?UTF-8?q?refactor(scala-3,mongo):=20F[=5F]=20?= =?UTF-8?q?=E2=86=92=20F[=3F]=20in=20applied=20positions=20(sweep)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Translated from origin/master@848b8e9e (mongo subset). Targeted rewrites: InputMetadata[?], MongoQueryOperator[?], MongoFilter[?], List[Case[?]], Map[Class[?], Case[?]], Map[Class[?], UnionFormat[?]], MHashMap[Class[?], (SealedParent[?], MListBuffer[Case[?]])], List[SealedParent[?]], Opt[Field[?]], List[Field[?]], Map[String, Field[?]], MongoCollection[?]. Kind-parameter declarations (final case class TypedMapFormat[K[_]], implicit def typedMapFormat[K[_]], implicit class typedMapFormatOps[K[_]], trait MongoPolyAdtInstances[D[_]], abstract class AbstractMongoPolyDataCompanion[Implicits, D[_]], abstract class MongoPolyDataCompanion[D[_]], implicit class TypedMapRefOps[E, K[_]], trait MongoFormatMapping[K[_]]) preserved verbatim per Pitfall 3. --- .../commons/mongo/BsonInputOutput.scala | 2 +- .../mongo/typed/FilterDocBuilder.scala | 4 +-- .../commons/mongo/typed/MongoFormat.scala | 28 +++++++++---------- .../mongo/typed/TypedMongoCollection.scala | 8 +++--- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/BsonInputOutput.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/BsonInputOutput.scala index b1122e958..ec14ad994 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/BsonInputOutput.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/BsonInputOutput.scala @@ -111,7 +111,7 @@ trait BsonOutput extends Any with OutputAndSimpleOutput { case Opt.Empty => writeBinary(BsonOutput.bigDecimalBytes(bigDecimal)) } - override def keepsMetadata(metadata: InputMetadata[_]): Boolean = + override def keepsMetadata(metadata: InputMetadata[?]): Boolean = BsonTypeMetadata == metadata override def writeCustom[T](typeMarker: TypeMarker[T], value: T): Boolean = diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/FilterDocBuilder.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/FilterDocBuilder.scala index b987dd4db..a841795e3 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/FilterDocBuilder.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/FilterDocBuilder.scala @@ -36,7 +36,7 @@ private final class FilterDocBuilder(prefixPath: Opt[String], filterDocs: BsonAr addImpliedFilters(prefix) } - private def addOperator(op: MongoQueryOperator[_]): Unit = { + private def addOperator(op: MongoQueryOperator[?]): Unit = { val path = prefixPath.getOrElse( throw new IllegalArgumentException( "cannot add MongoOperatorsFilter to toplevel filter document without prefix path" @@ -62,7 +62,7 @@ private final class FilterDocBuilder(prefixPath: Opt[String], filterDocs: BsonAr loop(0) } - def addFilter(filter: MongoFilter[_]): Unit = filter match { + def addFilter(filter: MongoFilter[?]): Unit = filter match { case Empty() => case And(filters) => diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoFormat.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoFormat.scala index 97b9c499f..a612967fc 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoFormat.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoFormat.scala @@ -175,14 +175,14 @@ object MongoAdtFormat extends AdtMetadataCompanion[MongoAdtFormat] { @infer val codec: GenObjectCodec[T], @infer val dataClassTag: ClassTag[T], @reifyAnnot val flattenAnnot: flatten, - @multi @adtCaseMetadata val cases: List[Case[_]], + @multi @adtCaseMetadata val cases: List[Case[?]], ) extends MongoAdtFormat[T] { - lazy val casesByClass: Map[Class[_], Case[_]] = + lazy val casesByClass: Map[Class[?], Case[?]] = cases.toMapBy(_.classTag.runtimeClass) - lazy val subUnionsByClass: Map[Class[_], UnionFormat[_]] = { - val casesPerClass = new MHashMap[Class[_], (SealedParent[_], MListBuffer[Case[_]])] + lazy val subUnionsByClass: Map[Class[?], UnionFormat[?]] = { + val casesPerClass = new MHashMap[Class[?], (SealedParent[?], MListBuffer[Case[?]])] for { cse <- cases subUnion <- cse.sealedParents @@ -206,7 +206,7 @@ object MongoAdtFormat extends AdtMetadataCompanion[MongoAdtFormat] { } def fieldRefFor[E, T0](prefix: MongoRef[E, T], scalaFieldName: String): MongoPropertyRef[E, T0] = { - @tailrec def loop(cases: List[Case[_]], rawName: Opt[String]): Unit = cases match { + @tailrec def loop(cases: List[Case[?]], rawName: Opt[String]): Unit = cases match { case cse :: tail => val field = cse .getField(scalaFieldName) @@ -228,7 +228,7 @@ object MongoAdtFormat extends AdtMetadataCompanion[MongoAdtFormat] { } private def subtypeInfo[T0](subclass: Class[T0]): (List[String], MongoAdtFormat[T0]) = { - def asAdtFormat[C](cse: Case[_], codec: GenObjectCodec[_]): MongoAdtFormat[C] = + def asAdtFormat[C](cse: Case[?], codec: GenObjectCodec[?]): MongoAdtFormat[C] = cse.asInstanceOf[Case[C]].asAdtFormat(codec.asInstanceOf[GenObjectCodec[C]]) casesByClass @@ -282,9 +282,9 @@ object MongoAdtFormat extends AdtMetadataCompanion[MongoAdtFormat] { sealed trait Case[T] extends TypedMetadata[T] { def info: GenCaseInfo[T] def classTag: ClassTag[T] - def sealedParents: List[SealedParent[_]] + def sealedParents: List[SealedParent[?]] - def getField(scalaFieldName: String): Opt[Field[_]] + def getField(scalaFieldName: String): Opt[Field[?]] def fieldRefFor[E, T0](prefix: MongoRef[E, T], scalaFieldName: String): MongoPropertyRef[E, T0] def asAdtFormat(codec: GenObjectCodec[T]): MongoAdtFormat[T] @@ -294,8 +294,8 @@ object MongoAdtFormat extends AdtMetadataCompanion[MongoAdtFormat] { final class RecordCase[T]( @composite val info: GenCaseInfo[T], @infer val classTag: ClassTag[T], - @multi @adtParamMetadata val fields: List[Field[_]], - @multi @adtCaseSealedParentMetadata val sealedParents: List[SealedParent[_]], + @multi @adtParamMetadata val fields: List[Field[?]], + @multi @adtCaseSealedParentMetadata val sealedParents: List[SealedParent[?]], ) extends Case[T] { def asAdtFormat(codec: GenObjectCodec[T]): MongoAdtFormat[T] = new RecordFormat(this, codec) @@ -303,10 +303,10 @@ object MongoAdtFormat extends AdtMetadataCompanion[MongoAdtFormat] { def transparentWrapper: Boolean = info.transparent && fields.size == 1 - lazy val fieldsByScalaName: Map[String, Field[_]] = + lazy val fieldsByScalaName: Map[String, Field[?]] = fields.toMapBy(_.info.sourceName) - def getField(scalaFieldName: String): Opt[Field[_]] = + def getField(scalaFieldName: String): Opt[Field[?]] = fieldsByScalaName.getOpt(scalaFieldName) def fieldRefFor[E, T0](prefix: MongoRef[E, T], scalaFieldName: String): MongoPropertyRef[E, T0] = { @@ -326,14 +326,14 @@ object MongoAdtFormat extends AdtMetadataCompanion[MongoAdtFormat] { final class SingletonCase[T]( @composite val info: GenCaseInfo[T], @infer val classTag: ClassTag[T], - @multi @adtCaseSealedParentMetadata val sealedParents: List[SealedParent[_]], + @multi @adtCaseSealedParentMetadata val sealedParents: List[SealedParent[?]], @infer @checked val value: scala.ValueOf[T], ) extends Case[T] { def asAdtFormat(codec: GenObjectCodec[T]): MongoAdtFormat[T] = new SingletonFormat(this, codec) // TODO: @generated - def getField(scalaFieldName: String): Opt[Field[_]] = Opt.Empty + def getField(scalaFieldName: String): Opt[Field[?]] = Opt.Empty def fieldRefFor[E, T0](prefix: MongoRef[E, T], scalaFieldName: String): MongoPropertyRef[E, T0] = throw new NoSuchElementException(s"Field $scalaFieldName not found") diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/TypedMongoCollection.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/TypedMongoCollection.scala index df5e6c24a..e8065c52a 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/TypedMongoCollection.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/TypedMongoCollection.scala @@ -24,7 +24,7 @@ class TypedMongoCollection[E <: BaseMongoEntity] private ( with TypedMongoUtils { def this( - rawCollection: MongoCollection[_], + rawCollection: MongoCollection[?], clientSession: OptArg[TypedClientSession] = OptArg.Empty, )(implicit meta: MongoEntityMeta[E] ) = this( @@ -384,16 +384,16 @@ class TypedMongoCollection[E <: BaseMongoEntity] private ( ) } - @bincompat private[typed] def this(rawCollection: MongoCollection[_], format: MongoAdtFormat[E]) = + @bincompat private[typed] def this(rawCollection: MongoCollection[?], format: MongoAdtFormat[E]) = this(rawCollection)(MongoEntityMeta.bincompatMeta(format)) - @bincompat private[typed] def this(rawCollection: MongoCollection[_], meta: MongoEntityMeta[E]) = + @bincompat private[typed] def this(rawCollection: MongoCollection[?], meta: MongoEntityMeta[E]) = this(rawCollection)(meta) } object TypedMongoCollection { private def mkNativeCollection[E <: BaseMongoEntity: MongoEntityMeta]( - rawCollection: MongoCollection[_] + rawCollection: MongoCollection[?] )(implicit meta: MongoEntityMeta[E] ): MongoCollection[E] = { import meta.format._ From e1905e596b3bb1bc5169e9e4904689e96e7dfbe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 1 Jun 2026 19:44:22 +0200 Subject: [PATCH 5/6] docs(migration): record HKT wildcard tightening (type-level only, no source-compat) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Slice 3.2: `_` → `?` in applied positions across core + mongo. Kind-parameter declarations preserved. Pure type-argument-position syntax change; downstream callers unaffected. --- MIGRATION.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/MIGRATION.md b/MIGRATION.md index b99395701..398bab961 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -54,6 +54,10 @@ the bottom of this file. Restoration ships incrementally per feature area. compiles). - `enum` was renamed to `e` at one call site in `GenKeyCodec` (`enum` is reserved in Scala 3). - `@targetName` annotation added to `CloseableIterator` overloaded methods. +- HKT wildcard `_` → `?` in applied positions (slice 3.2). Type-argument-position syntax only; + kind-parameter declarations (`class Foo[F[_]]`, `def baz[M[_], A]`, etc.) preserved per Scala 3. + Pure type-level rename — no source-compat impact for downstream callers; type-argument site syntax + only. ### mongo @@ -63,6 +67,8 @@ the bottom of this file. Restoration ships incrementally per feature area. Scala 3 forbids type projections on non-concrete prefixes). Public-API signature change. - `BsonValueOutput.write` / `BsonValueInput.read` call sites require explicit `using` keyword. - `MongoPolyDataCompanion` / `TypedMapFormat` / `TypedMapRefOps` widened from `K[_]` / `D[_]` to `K[Any]` / `D[Any]`. +- HKT wildcard `_` → `?` in applied positions (slice 3.2). Same as core entry — pure + type-argument-position syntax change with no source-compat impact. ### hocon From 6b1a6e1ba5bd7436840294961aabefdab152a742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Mon, 1 Jun 2026 22:16:03 +0200 Subject: [PATCH 6/6] refactor(scala-3,mongo): tighten HKT wildcards with bounds in applied positions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prior sweep handled simple [_] / [_, _] applied positions. This polish catches remaining sites flagged by user 2026-06-01: - DocKey[A, _] / DocKey[_, _] / DocKey[_, _ <: BsonArray] → [A, ?] / [?, ?] / [?, ? <: BsonArray] in Filter, Sort, Update (object-level helpers) - BsonRef[_, T] / BsonRef[_, C[E]] / BsonRef[_, _] in mongo/core/ops/* (8 files) - DocKey[_, _] type ascriptions in KeyGetter - MongoRef[E, _], MongoRef[_, _], MongoPropertyRef[E, _], MongoToplevelRef[E, _] type ascriptions (parameter and return types only — type-patterns in case clauses preserved as `_` to mirror fork master shape) - MongoProjection[E, _] type ascription in ProjectionZippers Type-pattern wildcards in `case x: T[_, _]` clauses intentionally kept as `_` to match fork master @ origin/master (see MongoQueryOperator, MongoUpdate, MongoUpdateOperator, MongoRef.computePath/extractBson, MongoFormat.fieldRefFor). Per-file fork-shape comparison done; all applied-position rewrites mirror fork's canonical scala-3 form. Acceptance gate: every remaining [_]/[_ <: X] in scope is either a kind-decl position, a value-pattern wildcard, or a type-pattern in a case clause (fork- canonical). sbt compile Test/compile scalafmtCheckAll → exit 0, no new warnings, no @nowarn / -Wconf added. --- .../com/avsystem/commons/mongo/Filter.scala | 20 +++++++++---------- .../com/avsystem/commons/mongo/Sort.scala | 4 ++-- .../com/avsystem/commons/mongo/Update.scala | 6 +++--- .../mongo/core/ops/BsonRefFiltering.scala | 2 +- .../core/ops/BsonRefIterableFiltering.scala | 2 +- .../core/ops/BsonRefIterableUpdating.scala | 2 +- .../mongo/core/ops/BsonRefKeyHandling.scala | 2 +- .../mongo/core/ops/BsonRefSorting.scala | 2 +- .../mongo/core/ops/BsonRefUpdating.scala | 2 +- .../commons/mongo/core/ops/KeyGetter.scala | 8 ++++---- .../mongo/typed/FilterDocBuilder.scala | 2 +- .../commons/mongo/typed/MongoFilter.scala | 2 +- .../commons/mongo/typed/MongoIndex.scala | 8 ++++---- .../commons/mongo/typed/MongoOrder.scala | 16 +++++++-------- .../commons/mongo/typed/MongoProjection.scala | 14 ++++++------- .../commons/mongo/typed/MongoRef.scala | 2 +- .../commons/mongo/typed/MongoUpdate.scala | 2 +- .../mongo/typed/ProjectionZippers.scala | 4 ++-- 18 files changed, 50 insertions(+), 50 deletions(-) diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/Filter.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/Filter.scala index 06e898383..f9d8ec565 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/Filter.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/Filter.scala @@ -18,13 +18,13 @@ object Filter { def or(filters: Bson*): Bson = F.or(filters.asJava) @deprecated(message = "Use `equal` instead", since = "1.19.9") - def eq[A](key: DocKey[A, _], value: A): Bson = equal(key, value) + def eq[A](key: DocKey[A, ?], value: A): Bson = equal(key, value) @deprecated(message = "Use `notEqual` instead", since = "1.19.9") - def ne[A](key: DocKey[A, _], value: A): Bson = notEqual(key, value) + def ne[A](key: DocKey[A, ?], value: A): Bson = notEqual(key, value) - def equal[A](key: DocKey[A, _], value: A): Bson = F.eq(key.key, key.codec.toBson(value)) - def notEqual[A](key: DocKey[A, _], value: A): Bson = F.ne(key.key, key.codec.toBson(value)) + def equal[A](key: DocKey[A, ?], value: A): Bson = F.eq(key.key, key.codec.toBson(value)) + def notEqual[A](key: DocKey[A, ?], value: A): Bson = F.ne(key.key, key.codec.toBson(value)) def lt[A, BSON <: BsonValue: CanCompare](key: DocKey[A, BSON], value: A): Bson = F.lt(key.key, key.codec.toBson(value)) @@ -36,19 +36,19 @@ object Filter { def gte[A, BSON <: BsonValue: CanCompare](key: DocKey[A, BSON], value: A): Bson = F.gte(key.key, key.codec.toBson(value)) - def in[A](key: DocKey[A, _], values: Iterable[A]): Bson = F.in(key.key, values.map(key.codec.toBson).asJava) + def in[A](key: DocKey[A, ?], values: Iterable[A]): Bson = F.in(key.key, values.map(key.codec.toBson).asJava) - def nin[A](key: DocKey[A, _], values: Iterable[A]): Bson = F.nin(key.key, values.map(key.codec.toBson).asJava) + def nin[A](key: DocKey[A, ?], values: Iterable[A]): Bson = F.nin(key.key, values.map(key.codec.toBson).asJava) def regex[A](key: DocKey[A, BsonString], pattern: String): Bson = F.regex(key.key, pattern) - def exists(key: DocKey[_, _]): Bson = F.exists(key.key, true) + def exists(key: DocKey[?, ?]): Bson = F.exists(key.key, true) - def notExists(key: DocKey[_, _]): Bson = F.exists(key.key, false) + def notExists(key: DocKey[?, ?]): Bson = F.exists(key.key, false) - def elemMatch(key: DocKey[_, _ <: BsonArray], filter: Bson): Bson = F.elemMatch(key.key, filter) + def elemMatch(key: DocKey[?, ? <: BsonArray], filter: Bson): Bson = F.elemMatch(key.key, filter) - def contains[A, COL <: Iterable[A]](key: DocKey[COL, _ <: BsonArray], value: A)(implicit fac: Factory[A, COL]): Bson = + def contains[A, COL <: Iterable[A]](key: DocKey[COL, ? <: BsonArray], value: A)(implicit fac: Factory[A, COL]): Bson = F.eq(key.key, key.codec.toBson((fac.newBuilder += value).result()).asScala.head) object Limitations { diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/Sort.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/Sort.scala index 26357af95..765874c40 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/Sort.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/Sort.scala @@ -8,6 +8,6 @@ import org.bson.conversions.Bson * MKej */ object Sort { - def ascending(keys: DocKey[_, _]*): Bson = S.ascending(keys.map(_.key).asJava) - def descending(keys: DocKey[_, _]*): Bson = S.descending(keys.map(_.key).asJava) + def ascending(keys: DocKey[?, ?]*): Bson = S.ascending(keys.map(_.key).asJava) + def descending(keys: DocKey[?, ?]*): Bson = S.descending(keys.map(_.key).asJava) } diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/Update.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/Update.scala index f50ff66a0..1e7153758 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/Update.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/Update.scala @@ -10,8 +10,8 @@ import org.bson.conversions.Bson object Update { def combine(updates: Bson*): Bson = U.combine(updates.asJava) - def set[A](key: DocKey[A, _], value: A): Bson = U.set(key.key, key.codec.toBson(value)) - def unset(key: DocKey[_, _]): Bson = U.unset(key.key) + def set[A](key: DocKey[A, ?], value: A): Bson = U.set(key.key, key.codec.toBson(value)) + def unset(key: DocKey[?, ?]): Bson = U.unset(key.key) - def max[A](key: DocKey[A, _], value: A): Bson = U.max(key.key, key.codec.toBson(value)) + def max[A](key: DocKey[A, ?], value: A): Bson = U.max(key.key, key.codec.toBson(value)) } diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefFiltering.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefFiltering.scala index ce3213157..88f1f2a1f 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefFiltering.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefFiltering.scala @@ -3,5 +3,5 @@ package mongo.core.ops import com.avsystem.commons.mongo.BsonRef -final class BsonRefFiltering[T](protected val bsonRef: BsonRef[_, T]) +final class BsonRefFiltering[T](protected val bsonRef: BsonRef[?, T]) extends AnyVal with BaseFiltering[T] with BsonRefKeyValueHandling[T] diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefIterableFiltering.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefIterableFiltering.scala index cebf0bc24..e96e1cd29 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefIterableFiltering.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefIterableFiltering.scala @@ -5,7 +5,7 @@ import com.avsystem.commons.mongo.BsonRef import com.avsystem.commons.serialization.GenCodec final class BsonRefIterableFiltering[E, C[T] <: Iterable[T]]( - protected val bsonRef: BsonRef[_, C[E]] + protected val bsonRef: BsonRef[?, C[E]] )(implicit protected val elementCodec: GenCodec[E] ) extends BaseIterableFiltering[E, C] with BsonRefKeyValueHandling[C[E]] diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefIterableUpdating.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefIterableUpdating.scala index 3ba04cbab..7720fac0d 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefIterableUpdating.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefIterableUpdating.scala @@ -5,7 +5,7 @@ import com.avsystem.commons.mongo.BsonRef import com.avsystem.commons.serialization.GenCodec final class BsonRefIterableUpdating[E, C[T] <: Iterable[T]]( - protected val bsonRef: BsonRef[_, C[E]] + protected val bsonRef: BsonRef[?, C[E]] )(implicit protected val elementCodec: GenCodec[E] ) extends BaseIterableUpdating[E, C] with BsonRefKeyValueHandling[C[E]] diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefKeyHandling.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefKeyHandling.scala index 8781163e7..a307ea1a7 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefKeyHandling.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefKeyHandling.scala @@ -4,7 +4,7 @@ package mongo.core.ops import com.avsystem.commons.mongo.BsonRef trait BsonRefKeyHandling[T] extends Any with KeyHandling { - protected def bsonRef: BsonRef[_, T] + protected def bsonRef: BsonRef[?, T] override protected def key: String = bsonRef.path } diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefSorting.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefSorting.scala index 658e8d91a..254a61c9e 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefSorting.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefSorting.scala @@ -3,4 +3,4 @@ package mongo.core.ops import com.avsystem.commons.mongo.BsonRef -class BsonRefSorting[T](val bsonRef: BsonRef[_, T]) extends AnyVal with BaseSorting with BsonRefKeyHandling[T] +class BsonRefSorting[T](val bsonRef: BsonRef[?, T]) extends AnyVal with BaseSorting with BsonRefKeyHandling[T] diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefUpdating.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefUpdating.scala index fe7faf119..8b43d3391 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefUpdating.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/BsonRefUpdating.scala @@ -3,4 +3,4 @@ package mongo.core.ops import com.avsystem.commons.mongo.BsonRef -class BsonRefUpdating[T](val bsonRef: BsonRef[_, T]) extends AnyVal with BaseUpdating[T] with BsonRefKeyValueHandling[T] +class BsonRefUpdating[T](val bsonRef: BsonRef[?, T]) extends AnyVal with BaseUpdating[T] with BsonRefKeyValueHandling[T] diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/KeyGetter.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/KeyGetter.scala index 41c7dd72e..0e40d280d 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/KeyGetter.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/core/ops/KeyGetter.scala @@ -8,11 +8,11 @@ trait KeyGetter[-T] { } object KeyGetter { - implicit object bsonRefKeyGetter extends KeyGetter[BsonRef[_, _]] { - override def keyOf(t: BsonRef[_, _]): String = t.path + implicit object bsonRefKeyGetter extends KeyGetter[BsonRef[?, ?]] { + override def keyOf(t: BsonRef[?, ?]): String = t.path } - implicit object docKeyKeyGetter extends KeyGetter[DocKey[_, _]] { - override def keyOf(t: DocKey[_, _]): String = t.key + implicit object docKeyKeyGetter extends KeyGetter[DocKey[?, ?]] { + override def keyOf(t: DocKey[?, ?]): String = t.key } } diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/FilterDocBuilder.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/FilterDocBuilder.scala index a841795e3..f5d815659 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/FilterDocBuilder.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/FilterDocBuilder.scala @@ -12,7 +12,7 @@ private final class FilterDocBuilder(prefixPath: Opt[String], filterDocs: BsonAr new FilterDocBuilder(newPrefix.opt, filterDocs) } - @tailrec def addImpliedFilters(ref: MongoRef[_, _]): Unit = ref match { + @tailrec def addImpliedFilters(ref: MongoRef[?, ?]): Unit = ref match { case MongoRef.RootRef(_) => case MongoRef.RootSubtypeRef(fullRef, caseFieldName, caseNames, _) => diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoFilter.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoFilter.scala index 2d3d5362d..0e035817e 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoFilter.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoFilter.scala @@ -143,7 +143,7 @@ sealed trait MongoDocumentFilter[E] extends MongoFilter[E] { def ||(other: MongoDocumentFilter[E]): MongoDocumentFilter[E] = or(other) - final def toFilterBson(prefixPath: Opt[String], projectionRefs: Set[MongoRef[E, _]]): BsonDocument = { + final def toFilterBson(prefixPath: Opt[String], projectionRefs: Set[MongoRef[E, ?]]): BsonDocument = { val builder = new FilterDocBuilder(prefixPath, new BsonArray) builder.addFilter(this) projectionRefs.foreach(builder.addImpliedFilters) diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoIndex.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoIndex.scala index d2dc8cff3..15d588303 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoIndex.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoIndex.scala @@ -36,7 +36,7 @@ import org.bson.{BsonDocument, BsonValue} * type of the MongoDB entity */ case class MongoIndex[E]( - fields: Vector[(MongoPropertyRef[E, _], MongoIndexType)], + fields: Vector[(MongoPropertyRef[E, ?], MongoIndexType)], setupOptions: IndexOptions => IndexOptions = identity, ) { require(fields.nonEmpty, "MongoDB index cannot be empty") @@ -57,13 +57,13 @@ case class MongoIndex[E]( } } object MongoIndex { - def apply[E](fields: (MongoPropertyRef[E, _], MongoIndexType)*): MongoIndex[E] = + def apply[E](fields: (MongoPropertyRef[E, ?], MongoIndexType)*): MongoIndex[E] = MongoIndex(fields.toVector) - def ascending[E](fields: MongoPropertyRef[E, _]*): MongoIndex[E] = + def ascending[E](fields: MongoPropertyRef[E, ?]*): MongoIndex[E] = MongoIndex(fields.iterator.map(f => f -> MongoIndexType.Ascending).toVector) - def descending[E](fields: MongoPropertyRef[E, _]*): MongoIndex[E] = + def descending[E](fields: MongoPropertyRef[E, ?]*): MongoIndex[E] = MongoIndex(fields.iterator.map(f => f -> MongoIndexType.Descending).toVector) } diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoOrder.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoOrder.scala index c43883f71..957ae7569 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoOrder.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoOrder.scala @@ -21,7 +21,7 @@ object MongoOrder { def simple[T](ascending: Boolean): MongoOrder[T] = Simple(ascending) - def apply[E](refs: (MongoPropertyRef[E, _], Boolean)*): MongoDocumentOrder[E] = + def apply[E](refs: (MongoPropertyRef[E, ?], Boolean)*): MongoDocumentOrder[E] = MongoDocumentOrder(refs: _*) final case class Simple[T](ascending: Boolean) extends MongoOrder[T] { @@ -52,17 +52,17 @@ object MongoOrder { * @tparam E * type of the entity/document */ -case class MongoDocumentOrder[E](refs: Vector[(MongoPropertyRef[E, _], Boolean)]) extends MongoOrder[E] { +case class MongoDocumentOrder[E](refs: Vector[(MongoPropertyRef[E, ?], Boolean)]) extends MongoOrder[E] { def andThen(other: MongoDocumentOrder[E]): MongoDocumentOrder[E] = MongoDocumentOrder(refs ++ other.refs) - def andThenBy(ref: MongoPropertyRef[E, _], ascending: Boolean): MongoDocumentOrder[E] = + def andThenBy(ref: MongoPropertyRef[E, ?], ascending: Boolean): MongoDocumentOrder[E] = MongoDocumentOrder(refs :+ (ref -> ascending)) - def andThenAscendingBy(ref: MongoPropertyRef[E, _]): MongoDocumentOrder[E] = + def andThenAscendingBy(ref: MongoPropertyRef[E, ?]): MongoDocumentOrder[E] = andThenBy(ref, ascending = true) - def andThenDescendingBy(ref: MongoPropertyRef[E, _]): MongoDocumentOrder[E] = + def andThenDescendingBy(ref: MongoPropertyRef[E, ?]): MongoDocumentOrder[E] = andThenBy(ref, ascending = false) // TODO: lambda-macro versions of andThenBy @@ -73,12 +73,12 @@ case class MongoDocumentOrder[E](refs: Vector[(MongoPropertyRef[E, _], Boolean)] object MongoDocumentOrder { def unspecified[E]: MongoDocumentOrder[E] = MongoDocumentOrder(Vector.empty) - def apply[E](refs: (MongoPropertyRef[E, _], Boolean)*): MongoDocumentOrder[E] = + def apply[E](refs: (MongoPropertyRef[E, ?], Boolean)*): MongoDocumentOrder[E] = MongoDocumentOrder(refs.toVector) - def ascending[E](refs: MongoPropertyRef[E, _]*): MongoDocumentOrder[E] = + def ascending[E](refs: MongoPropertyRef[E, ?]*): MongoDocumentOrder[E] = MongoDocumentOrder(refs.iterator.map(r => r -> true).toVector) - def descending[E](refs: MongoPropertyRef[E, _]*): MongoDocumentOrder[E] = + def descending[E](refs: MongoPropertyRef[E, ?]*): MongoDocumentOrder[E] = MongoDocumentOrder(refs.iterator.map(r => r -> false).toVector) } diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoProjection.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoProjection.scala index 3d7bdb327..e852f29f9 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoProjection.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoProjection.scala @@ -35,7 +35,7 @@ import scala.annotation.tailrec * [[https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/]] */ trait MongoProjection[E, T] { - def projectionRefs: Set[MongoRef[E, _]] + def projectionRefs: Set[MongoRef[E, ?]] def decodeFrom(doc: BsonDocument): T def showRecordId: Boolean @@ -70,12 +70,12 @@ trait MongoProjection[E, T] { final def toProjectionBson: BsonDocument = { val doc = new BsonDocument - @tailrec def loop(it: Iterator[MongoRef[E, _]]): Unit = + @tailrec def loop(it: Iterator[MongoRef[E, ?]]): Unit = if (it.hasNext) it.next() match { - case propRef: MongoPropertyRef[E, _] => + case propRef: MongoPropertyRef[E, ?] => doc.put(propRef.projectionPath, Bson.int(1)) loop(it) - case _: MongoToplevelRef[E, _] => + case _: MongoToplevelRef[E, ?] => doc.clear() } loop(projectionRefs.iterator) @@ -88,7 +88,7 @@ trait MongoProjection[E, T] { object MongoProjection extends ProjectionZippers { final class Mapped[E, T, T0](prev: MongoProjection[E, T], fun: T => T0) extends MongoProjection[E, T0] { - def projectionRefs: Set[MongoRef[E, _]] = prev.projectionRefs + def projectionRefs: Set[MongoRef[E, ?]] = prev.projectionRefs def showRecordId: Boolean = prev.showRecordId def decodeFrom(doc: BsonDocument): T0 = fun(prev.decodeFrom(doc)) def on[E0](ref: MongoRef[E0, E]): MongoProjection[E0, T0] = new Mapped(prev.on(ref), fun) @@ -99,7 +99,7 @@ object MongoProjection extends ProjectionZippers { second: MongoProjection[E, T0], fun: (T, T0) => T1, ) extends MongoProjection[E, T1] { - def projectionRefs: Set[MongoRef[E, _]] = + def projectionRefs: Set[MongoRef[E, ?]] = first.projectionRefs ++ second.projectionRefs def showRecordId: Boolean = first.showRecordId || second.showRecordId @@ -114,7 +114,7 @@ object MongoProjection extends ProjectionZippers { final val RecordId = "$recordId" final case class ShowRecordId[E, T](projection: MongoProjection[E, T]) extends MongoProjection[E, WithRecordId[T]] { - def projectionRefs: Set[MongoRef[E, _]] = projection.projectionRefs + def projectionRefs: Set[MongoRef[E, ?]] = projection.projectionRefs def decodeFrom(doc: BsonDocument): WithRecordId[T] = WithRecordId(projection.decodeFrom(doc), doc.getInt64(RecordId).getValue) diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoRef.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoRef.scala index 59926bf5d..7a46ec23a 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoRef.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoRef.scala @@ -22,7 +22,7 @@ import scala.annotation.tailrec */ sealed trait MongoRef[E, T] extends MongoProjection[E, T] with DataRefDsl[E, T] { self => def format: MongoFormat[T] - def projectionRefs: Set[MongoRef[E, _]] = Set(this) + def projectionRefs: Set[MongoRef[E, ?]] = Set(this) def showRecordId: Boolean = false @macroPrivate def subtypeRefFor[C <: T: ClassTag]: MongoRef[E, C] diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoUpdate.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoUpdate.scala index e12b24a28..5733c67a5 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoUpdate.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoUpdate.scala @@ -81,7 +81,7 @@ object MongoUpdate { ) extends MongoUpdate[T] final case class MultiUpdate[E]( - propUpdates: Vector[PropertyUpdate[E, _]] + propUpdates: Vector[PropertyUpdate[E, ?]] ) extends MongoDocumentUpdate[E] final case class PropertyUpdate[E, T]( diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/ProjectionZippers.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/ProjectionZippers.scala index 379e50296..9a6aaf404 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/ProjectionZippers.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/ProjectionZippers.scala @@ -357,10 +357,10 @@ trait ProjectionZippers { this: MongoProjection.type => ) } -final class ProductProjection[E, T](componentProjections: Seq[MongoProjection[E, _]])(implicit applier: Applier[T]) +final class ProductProjection[E, T](componentProjections: Seq[MongoProjection[E, ?]])(implicit applier: Applier[T]) extends MongoProjection[E, T] { - def projectionRefs: Set[MongoRef[E, _]] = + def projectionRefs: Set[MongoRef[E, ?]] = componentProjections.iterator.flatMap(_.projectionRefs.iterator).toSet def showRecordId: Boolean =