From 0c54909eff95e822904655c8b290e99df25b1af6 Mon Sep 17 00:00:00 2001 From: David Barri Date: Fri, 20 Aug 2021 11:10:34 +1000 Subject: [PATCH] Format deprecated methods more clearly in API reports --- api-reports/2_12.txt | 10 +++---- api-reports/2_13.txt | 10 +++---- .../dom/scalafix/GenerateApiReport.scala | 28 +++++++++++++++++-- .../scalajs/dom/scalafix/MutableState.scala | 7 +++-- 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/api-reports/2_12.txt b/api-reports/2_12.txt index 446672788..6e9715e9f 100644 --- a/api-reports/2_12.txt +++ b/api-reports/2_12.txt @@ -863,7 +863,7 @@ experimental/permissions/package[SO] val permissions: Permissions experimental/permissions/package[SO] val `persistent-storage` = "persistent-storage".asInstanceOf[PermissionName] experimental/permissions/package[SO] val prompt = "prompt".asInstanceOf[PermissionState] experimental/permissions/package[SO] val push = "push".asInstanceOf[PermissionName] -experimental/permissions/package[SO] def query( permissionDescriptor: PermissionDescriptor): js.Promise[PermissionStatus] +experimental/permissions/package[SO] def query(permissionDescriptor: PermissionDescriptor): js.Promise[PermissionStatus] experimental/permissions/package[SO] val state: PermissionState experimental/permissions/package[SO] implicit def toPermissions(navigator: dom.raw.Navigator): PermissionsNavigator experimental/permissions/package[SO] val userVisibleOnly = permissionUserVisibleOnly @@ -888,7 +888,7 @@ experimental/permissions/package.PermissionStatus[JT] var onchange: js.Function1 experimental/permissions/package.PermissionStatus[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit experimental/permissions/package.PermissionStatus[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit experimental/permissions/package.PermissionStatus[JT] val state: PermissionState -experimental/permissions/package.Permissions[JT] def query( permissionDescriptor: PermissionDescriptor): js.Promise[PermissionStatus] +experimental/permissions/package.Permissions[JT] def query(permissionDescriptor: PermissionDescriptor): js.Promise[PermissionStatus] experimental/permissions/package.PermissionsNavigator[JT] val permissions: Permissions experimental/permissions/package.PushPermissionDescriptor[JT] val name: PermissionName experimental/permissions/package.PushPermissionDescriptor[JT] val userVisibleOnly: Boolean @@ -933,7 +933,7 @@ experimental/push/package.PushServiceWorkerRegistration[JT] val pushManager: Pus experimental/serviceworkers/Cache[JC] def add(request: RequestInfo): js.Promise[Unit] experimental/serviceworkers/Cache[JC] def addAll(requests: js.Array[RequestInfo]): js.Promise[Unit] experimental/serviceworkers/Cache[JC] def delete(request: RequestInfo, options: js.UndefOr[CacheQueryOptions]?): js.Promise[Boolean] -experimental/serviceworkers/Cache[JC] def keys(request: js.UndefOr[RequestInfo]?, options: js.UndefOr[ CacheQueryOptions]?): js.Promise[js.Array[Request]] +experimental/serviceworkers/Cache[JC] def keys(request: js.UndefOr[RequestInfo]?, options: js.UndefOr[CacheQueryOptions]?): js.Promise[js.Array[Request]] experimental/serviceworkers/Cache[JC] def `match`(request: RequestInfo, options: js.UndefOr[CacheQueryOptions]?): js.Promise[js.UndefOr[Response]] experimental/serviceworkers/Cache[JC] def matchAll(request: RequestInfo?, options: js.UndefOr[CacheQueryOptions]?): js.Promise[js.Array[Response]] experimental/serviceworkers/Cache[JC] def put(request: RequestInfo, response: Response): js.Promise[Unit] @@ -2535,7 +2535,7 @@ raw/BiquadFilterNode[JT] def removeEventListener[T <: Event](`type`: String, lis raw/BiquadFilterNode[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit raw/BiquadFilterNode[JT] var `type`: String raw/Blob[JC] def arrayBuffer(): js.Promise[ArrayBuffer] -raw/Blob[JC] @deprecated("This method seems to have been added in error and not actually exist.", "1.2.0") def close(): Unit +raw/Blob[JC] def close(): Unit (@deprecated in 1.2.0) raw/Blob[JC] def size: Double raw/Blob[JC] def slice(start: Double?, end: Double?, contentType: String?): Blob raw/Blob[JC] def stream(): ReadableStream[Byte] @@ -3774,7 +3774,7 @@ raw/EventTarget[JC] def removeEventListener[T <: Event](`type`: String, listener raw/EventTarget[JC] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit raw/External[JT] raw/File[JC] def arrayBuffer(): js.Promise[ArrayBuffer] -raw/File[JC] @deprecated("This method seems to have been added in error and not actually exist.", "1.2.0") def close(): Unit +raw/File[JC] def close(): Unit (@deprecated in 1.2.0) raw/File[JC] def name: String raw/File[JC] def size: Double raw/File[JC] def slice(start: Double?, end: Double?, contentType: String?): Blob diff --git a/api-reports/2_13.txt b/api-reports/2_13.txt index a9f7be132..0f00a9008 100644 --- a/api-reports/2_13.txt +++ b/api-reports/2_13.txt @@ -863,7 +863,7 @@ experimental/permissions/package[SO] val permissions: Permissions experimental/permissions/package[SO] val `persistent-storage` = "persistent-storage".asInstanceOf[PermissionName] experimental/permissions/package[SO] val prompt = "prompt".asInstanceOf[PermissionState] experimental/permissions/package[SO] val push = "push".asInstanceOf[PermissionName] -experimental/permissions/package[SO] def query( permissionDescriptor: PermissionDescriptor): js.Promise[PermissionStatus] +experimental/permissions/package[SO] def query(permissionDescriptor: PermissionDescriptor): js.Promise[PermissionStatus] experimental/permissions/package[SO] val state: PermissionState experimental/permissions/package[SO] implicit def toPermissions(navigator: dom.raw.Navigator): PermissionsNavigator experimental/permissions/package[SO] val userVisibleOnly = permissionUserVisibleOnly @@ -888,7 +888,7 @@ experimental/permissions/package.PermissionStatus[JT] var onchange: js.Function1 experimental/permissions/package.PermissionStatus[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit experimental/permissions/package.PermissionStatus[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit experimental/permissions/package.PermissionStatus[JT] val state: PermissionState -experimental/permissions/package.Permissions[JT] def query( permissionDescriptor: PermissionDescriptor): js.Promise[PermissionStatus] +experimental/permissions/package.Permissions[JT] def query(permissionDescriptor: PermissionDescriptor): js.Promise[PermissionStatus] experimental/permissions/package.PermissionsNavigator[JT] val permissions: Permissions experimental/permissions/package.PushPermissionDescriptor[JT] val name: PermissionName experimental/permissions/package.PushPermissionDescriptor[JT] val userVisibleOnly: Boolean @@ -933,7 +933,7 @@ experimental/push/package.PushServiceWorkerRegistration[JT] val pushManager: Pus experimental/serviceworkers/Cache[JC] def add(request: RequestInfo): js.Promise[Unit] experimental/serviceworkers/Cache[JC] def addAll(requests: js.Array[RequestInfo]): js.Promise[Unit] experimental/serviceworkers/Cache[JC] def delete(request: RequestInfo, options: js.UndefOr[CacheQueryOptions]?): js.Promise[Boolean] -experimental/serviceworkers/Cache[JC] def keys(request: js.UndefOr[RequestInfo]?, options: js.UndefOr[ CacheQueryOptions]?): js.Promise[js.Array[Request]] +experimental/serviceworkers/Cache[JC] def keys(request: js.UndefOr[RequestInfo]?, options: js.UndefOr[CacheQueryOptions]?): js.Promise[js.Array[Request]] experimental/serviceworkers/Cache[JC] def `match`(request: RequestInfo, options: js.UndefOr[CacheQueryOptions]?): js.Promise[js.UndefOr[Response]] experimental/serviceworkers/Cache[JC] def matchAll(request: RequestInfo?, options: js.UndefOr[CacheQueryOptions]?): js.Promise[js.Array[Response]] experimental/serviceworkers/Cache[JC] def put(request: RequestInfo, response: Response): js.Promise[Unit] @@ -2535,7 +2535,7 @@ raw/BiquadFilterNode[JT] def removeEventListener[T <: Event](`type`: String, lis raw/BiquadFilterNode[JT] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit raw/BiquadFilterNode[JT] var `type`: String raw/Blob[JC] def arrayBuffer(): js.Promise[ArrayBuffer] -raw/Blob[JC] @deprecated("This method seems to have been added in error and not actually exist.", "1.2.0") def close(): Unit +raw/Blob[JC] def close(): Unit (@deprecated in 1.2.0) raw/Blob[JC] def size: Double raw/Blob[JC] def slice(start: Double?, end: Double?, contentType: String?): Blob raw/Blob[JC] def stream(): ReadableStream[Byte] @@ -3774,7 +3774,7 @@ raw/EventTarget[JC] def removeEventListener[T <: Event](`type`: String, listener raw/EventTarget[JC] def removeEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit raw/External[JT] raw/File[JC] def arrayBuffer(): js.Promise[ArrayBuffer] -raw/File[JC] @deprecated("This method seems to have been added in error and not actually exist.", "1.2.0") def close(): Unit +raw/File[JC] def close(): Unit (@deprecated in 1.2.0) raw/File[JC] def name: String raw/File[JC] def size: Double raw/File[JC] def slice(start: Double?, end: Double?, contentType: String?): Blob diff --git a/scalafix/src/main/scala/org/scalajs/dom/scalafix/GenerateApiReport.scala b/scalafix/src/main/scala/org/scalajs/dom/scalafix/GenerateApiReport.scala index b16ac9bee..94479f347 100644 --- a/scalafix/src/main/scala/org/scalajs/dom/scalafix/GenerateApiReport.scala +++ b/scalafix/src/main/scala/org/scalajs/dom/scalafix/GenerateApiReport.scala @@ -48,7 +48,7 @@ class GenerateApiReport extends SemanticRule("GenerateApiReport") { return // Remove definition bodies - val t2: Tree = + var t2: Tree = t match { case Defn.Def(mods, name, tparams, paramss, Some(tpe), _) => Decl.Def(mods, name, tparams, paramss, tpe) case Defn.Val(mods, pats, Some(tpe), _) => Decl.Val(mods, pats, tpe) @@ -56,6 +56,30 @@ class GenerateApiReport extends SemanticRule("GenerateApiReport") { case _ => t } + // Inspect annotations + var deprecatedVer = Option.empty[String] + + def inspectAnnotations(mods: List[Mod]): List[Mod] = + mods.filter { + case Mod.Annot(Init(tpe, _, List(List(_, ver)))) if tpe.toString == "deprecated" => + deprecatedVer = Some { + ver match { + case Lit.String(s) => s + case term => term.toString + } + } + false + case _ => true + } + + t2 match { + case Decl.Def(mods, name, tparams, paramss, tpe) => t2 = Decl.Def(inspectAnnotations(mods), name, tparams, paramss, tpe) + case Decl.Val(mods, pats, tpe) => t2 = Decl.Val(inspectAnnotations(mods), pats, tpe) + case Decl.Var(mods, pats, tpe) => t2 = Decl.Var(inspectAnnotations(mods), pats, tpe) + case _ => + } + + // Generate member desc val desc = t2 .toString @@ -71,7 +95,7 @@ class GenerateApiReport extends SemanticRule("GenerateApiReport") { // "?" means that type aliases come before everything else val name = Util.termName(t2).fold("?")(_.value) - s.add(MutableState.Member(name, desc)) + s.add(MutableState.Member(name, desc, deprecatedVer)) } body.traverse { diff --git a/scalafix/src/main/scala/org/scalajs/dom/scalafix/MutableState.scala b/scalafix/src/main/scala/org/scalajs/dom/scalafix/MutableState.scala index 93dcb5ea6..86934f545 100644 --- a/scalafix/src/main/scala/org/scalajs/dom/scalafix/MutableState.scala +++ b/scalafix/src/main/scala/org/scalajs/dom/scalafix/MutableState.scala @@ -69,7 +69,10 @@ final class MutableState { } { membersFound = true val key = (scopeKey, v.name, v.desc) - b += Result(key, prefix + v.desc) + var result = prefix + v.desc + for (ver <- v.deprecatedVer) + result = s"$result (@deprecated in $ver)" + b += Result(key, result) } if (!membersFound && !scopeName.endsWith("/package")) { @@ -103,7 +106,7 @@ object MutableState { synchronized(directMembers += v) } - final case class Member(name: String, desc: String) + final case class Member(name: String, desc: String, deprecatedVer: Option[String]) private[MutableState] final case class Result(sortKey: Result.SortKey, value: String)