diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fbfe96..d5da5fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ See also the [CHANGELOG](https://github.com/cucumber/cucumber-jvm/blob/master/CH ### Changed +- [Internal] Fix `getLocation` wherever it was wrongly defined. ([#404](https://github.com/cucumber/cucumber-jvm-scala/issues/404)) + ### Deprecated ### Removed @@ -24,6 +26,7 @@ See also the [CHANGELOG](https://github.com/cucumber/cucumber-jvm/blob/master/CH ### Changed - [Internal] Implement `HookDefinition.getHookType` and unimplement `Location.getLocation`. No impact expected for users. +([#401](https://github.com/cucumber/cucumber-jvm-scala/issues/401)) ## [8.29.0] (2025-07-15) diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/AbstractGlueDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/AbstractGlueDefinition.scala index 3ef2102..1121dd0 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/AbstractGlueDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/AbstractGlueDefinition.scala @@ -15,7 +15,7 @@ trait AbstractGlueDefinition extends Located { val location: StackTraceElement - lazy val sourceReference: SourceReference = + private lazy val sourceReference: SourceReference = SourceReference.fromStackTraceElement(location) override def getLocation(): String = { diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/DataTableTypeDsl.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/DataTableTypeDsl.scala index f43c360..2ddcae6 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/DataTableTypeDsl.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/DataTableTypeDsl.scala @@ -2,7 +2,7 @@ package io.cucumber.scala import scala.reflect.ClassTag -private[scala] trait DataTableTypeDsl extends BaseScalaDsl { +private[scala] trait DataTableTypeDsl extends BaseScalaDsl { self => /** Register a data table type. */ @@ -27,7 +27,12 @@ private[scala] trait DataTableTypeDsl extends BaseScalaDsl { body: DataTableEntryDefinitionBody[T] )(implicit ev: ClassTag[T]): Unit = { registry.registerDataTableType( - ScalaDataTableEntryTypeDetails[T](replaceWithEmptyString, body, ev) + ScalaDataTableEntryTypeDetails[T]( + replaceWithEmptyString, + body, + ev, + Utils.frame(self) + ) ) } @@ -38,7 +43,8 @@ private[scala] trait DataTableTypeDsl extends BaseScalaDsl { ScalaDataTableOptionalEntryTypeDetails[T]( replaceWithEmptyString, body, - ev + ev, + Utils.frame(self) ) ) } @@ -47,7 +53,12 @@ private[scala] trait DataTableTypeDsl extends BaseScalaDsl { body: DataTableRowDefinitionBody[T] )(implicit ev: ClassTag[T]): Unit = { registry.registerDataTableType( - ScalaDataTableRowTypeDetails[T](replaceWithEmptyString, body, ev) + ScalaDataTableRowTypeDetails[T]( + replaceWithEmptyString, + body, + ev, + Utils.frame(self) + ) ) } @@ -58,7 +69,8 @@ private[scala] trait DataTableTypeDsl extends BaseScalaDsl { ScalaDataTableOptionalRowTypeDetails[T]( replaceWithEmptyString, body, - ev + ev, + Utils.frame(self) ) ) } @@ -67,7 +79,12 @@ private[scala] trait DataTableTypeDsl extends BaseScalaDsl { body: DataTableCellDefinitionBody[T] )(implicit ev: ClassTag[T]): Unit = { registry.registerDataTableType( - ScalaDataTableCellTypeDetails[T](replaceWithEmptyString, body, ev) + ScalaDataTableCellTypeDetails[T]( + replaceWithEmptyString, + body, + ev, + Utils.frame(self) + ) ) } @@ -78,7 +95,8 @@ private[scala] trait DataTableTypeDsl extends BaseScalaDsl { ScalaDataTableOptionalCellTypeDetails[T]( replaceWithEmptyString, body, - ev + ev, + Utils.frame(self) ) ) } @@ -87,7 +105,12 @@ private[scala] trait DataTableTypeDsl extends BaseScalaDsl { body: DataTableDefinitionBody[T] )(implicit ev: ClassTag[T]): Unit = { registry.registerDataTableType( - ScalaDataTableTableTypeDetails[T](replaceWithEmptyString, body, ev) + ScalaDataTableTableTypeDetails[T]( + replaceWithEmptyString, + body, + ev, + Utils.frame(self) + ) ) } diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/DefaultTransformerDsl.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/DefaultTransformerDsl.scala index 963d332..e157a8f 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/DefaultTransformerDsl.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/DefaultTransformerDsl.scala @@ -6,7 +6,7 @@ import io.cucumber.scala.Aliases.{ DefaultParameterTransformerBody } -private[scala] trait DefaultTransformerDsl extends BaseScalaDsl { +private[scala] trait DefaultTransformerDsl extends BaseScalaDsl { self => /** Register default parameter type transformer. * @@ -17,7 +17,7 @@ private[scala] trait DefaultTransformerDsl extends BaseScalaDsl { body: DefaultParameterTransformerBody ): Unit = { registry.registerDefaultParameterTransformer( - ScalaDefaultParameterTransformerDetails(body) + ScalaDefaultParameterTransformerDetails(body, Utils.frame(self)) ) } @@ -52,7 +52,11 @@ private[scala] trait DefaultTransformerDsl extends BaseScalaDsl { replaceWithEmptyString: Seq[String] )(body: DefaultDataTableCellTransformerBody): Unit = { registry.registerDefaultDataTableCellTransformer( - ScalaDefaultDataTableCellTransformerDetails(replaceWithEmptyString, body) + ScalaDefaultDataTableCellTransformerDetails( + replaceWithEmptyString, + body, + Utils.frame(self) + ) ) } @@ -89,7 +93,11 @@ private[scala] trait DefaultTransformerDsl extends BaseScalaDsl { replaceWithEmptyString: Seq[String] )(body: DefaultDataTableEntryTransformerBody): Unit = { registry.registerDefaultDataTableEntryTransformer( - ScalaDefaultDataTableEntryTransformerDetails(replaceWithEmptyString, body) + ScalaDefaultDataTableEntryTransformerDetails( + replaceWithEmptyString, + body, + Utils.frame(self) + ) ) } diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/DocStringTypeDsl.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/DocStringTypeDsl.scala index dfc74e9..3d17067 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/DocStringTypeDsl.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/DocStringTypeDsl.scala @@ -2,7 +2,7 @@ package io.cucumber.scala import io.cucumber.scala.Aliases.DocStringDefinitionBody -private[scala] trait DocStringTypeDsl extends BaseScalaDsl { +private[scala] trait DocStringTypeDsl extends BaseScalaDsl { self => /** Register doc string type. * @@ -18,7 +18,12 @@ private[scala] trait DocStringTypeDsl extends BaseScalaDsl { contentType: String )(body: DocStringDefinitionBody[T])(implicit ev: Stepable[T]): Unit = { registry.registerDocStringType( - ScalaDocStringTypeDetails[T](contentType, body, ev.asJavaType) + ScalaDocStringTypeDetails[T]( + contentType, + body, + ev.asJavaType, + Utils.frame(self) + ) ) } diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ParameterTypeDsl.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ParameterTypeDsl.scala index cbb1c93..958f10c 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ParameterTypeDsl.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ParameterTypeDsl.scala @@ -2,7 +2,7 @@ package io.cucumber.scala import scala.reflect.ClassTag -private[scala] trait ParameterTypeDsl extends BaseScalaDsl { +private[scala] trait ParameterTypeDsl extends BaseScalaDsl { self => /** Register parameter type. * @@ -748,7 +748,7 @@ private[scala] trait ParameterTypeDsl extends BaseScalaDsl { pf: PartialFunction[List[String], R] )(implicit tag: ClassTag[R]): Unit = { registry.registerParameterType( - ScalaParameterTypeDetails[R](name, regex, pf, tag) + ScalaParameterTypeDetails[R](name, regex, pf, tag, Utils.frame(self)) ) } diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableCellDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableCellDefinition.scala index 8030548..bea1470 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableCellDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableCellDefinition.scala @@ -7,11 +7,7 @@ import scala.annotation.nowarn trait ScalaDataTableCellDefinition[T] extends ScalaDataTableTypeDefinition { - val details: ScalaDataTableCellTypeDetails[T] - - override val emptyPatterns: Seq[String] = details.emptyPatterns - - override val location: StackTraceElement = new Exception().getStackTrace()(3) + override val details: ScalaDataTableCellTypeDetails[T] private val transformer: TableCellTransformer[T] = (cell: String) => { details.body.transform(replaceEmptyPatternsWithEmptyString(cell)) diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableDefinition.scala index edf586a..afa2eb5 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableDefinition.scala @@ -7,11 +7,7 @@ import scala.annotation.nowarn trait ScalaDataTableDefinition[T] extends ScalaDataTableTypeDefinition { - val details: ScalaDataTableTableTypeDetails[T] - - override val emptyPatterns: Seq[String] = details.emptyPatterns - - override val location: StackTraceElement = new Exception().getStackTrace()(3) + override val details: ScalaDataTableTableTypeDetails[T] private val transformer: TableTransformer[T] = (table: DataTable) => { details.body.transform(replaceEmptyPatternsWithEmptyString(table)) diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableEntryDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableEntryDefinition.scala index 68bad38..47b569e 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableEntryDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableEntryDefinition.scala @@ -9,11 +9,7 @@ import scala.jdk.CollectionConverters._ trait ScalaDataTableEntryDefinition[T] extends ScalaDataTableTypeDefinition { - val details: ScalaDataTableEntryTypeDetails[T] - - override val emptyPatterns: Seq[String] = details.emptyPatterns - - override val location: StackTraceElement = new Exception().getStackTrace()(3) + override val details: ScalaDataTableEntryTypeDetails[T] private val transformer: TableEntryTransformer[T] = (entry: JavaMap[String, String]) => { diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableOptionalCellDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableOptionalCellDefinition.scala index b1746bb..391e686 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableOptionalCellDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableOptionalCellDefinition.scala @@ -8,11 +8,7 @@ import scala.annotation.nowarn trait ScalaDataTableOptionalCellDefinition[T] extends ScalaDataTableTypeDefinition { - val details: ScalaDataTableOptionalCellTypeDetails[T] - - override val emptyPatterns: Seq[String] = details.emptyPatterns - - override val location: StackTraceElement = new Exception().getStackTrace()(3) + override val details: ScalaDataTableOptionalCellTypeDetails[T] private val transformer: TableCellTransformer[T] = (cell: String) => { details.body.transform(Option(replaceEmptyPatternsWithEmptyString(cell))) diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableOptionalEntryDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableOptionalEntryDefinition.scala index aad9481..350619a 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableOptionalEntryDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableOptionalEntryDefinition.scala @@ -10,11 +10,7 @@ import scala.jdk.CollectionConverters._ trait ScalaDataTableOptionalEntryDefinition[T] extends ScalaDataTableTypeDefinition { - val details: ScalaDataTableOptionalEntryTypeDetails[T] - - override val emptyPatterns: Seq[String] = details.emptyPatterns - - override val location: StackTraceElement = new Exception().getStackTrace()(3) + override val details: ScalaDataTableOptionalEntryTypeDetails[T] private val transformer: TableEntryTransformer[T] = (entry: JavaMap[String, String]) => { diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableOptionalRowDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableOptionalRowDefinition.scala index ee64bbb..8adba9a 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableOptionalRowDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableOptionalRowDefinition.scala @@ -10,11 +10,7 @@ import scala.jdk.CollectionConverters._ trait ScalaDataTableOptionalRowDefinition[T] extends ScalaDataTableTypeDefinition { - val details: ScalaDataTableOptionalRowTypeDetails[T] - - override val emptyPatterns: Seq[String] = details.emptyPatterns - - override val location: StackTraceElement = new Exception().getStackTrace()(3) + override val details: ScalaDataTableOptionalRowTypeDetails[T] private val transformer: TableRowTransformer[T] = (row: JavaList[String]) => { details.body.transform( diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableRowDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableRowDefinition.scala index 526a857..48322d2 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableRowDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableRowDefinition.scala @@ -9,11 +9,7 @@ import scala.jdk.CollectionConverters._ trait ScalaDataTableRowDefinition[T] extends ScalaDataTableTypeDefinition { - val details: ScalaDataTableRowTypeDetails[T] - - override val emptyPatterns: Seq[String] = details.emptyPatterns - - override val location: StackTraceElement = new Exception().getStackTrace()(3) + override val details: ScalaDataTableRowTypeDetails[T] private val transformer: TableRowTransformer[T] = (row: JavaList[String]) => { details.body.transform( diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableTypeDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableTypeDefinition.scala index df4c459..6a6fcf5 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableTypeDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableTypeDefinition.scala @@ -4,7 +4,15 @@ import io.cucumber.core.backend.DataTableTypeDefinition trait ScalaDataTableTypeDefinition extends DataTableTypeDefinition - with AbstractDatatableElementTransformerDefinition {} + with AbstractDatatableElementTransformerDefinition { + + val details: ScalaDataTableTypeDetails[_] + + override val location: StackTraceElement = details.stackTraceElement + + override val emptyPatterns: Seq[String] = details.emptyPatterns + +} object ScalaDataTableTypeDefinition { @@ -13,13 +21,13 @@ object ScalaDataTableTypeDefinition { scenarioScoped: Boolean ): ScalaDataTableTypeDefinition = { details match { - case entryDetails @ ScalaDataTableEntryTypeDetails(_, _, _) => + case entryDetails: ScalaDataTableEntryTypeDetails[_] => if (scenarioScoped) { new ScalaScenarioScopedDataTableEntryDefinition[T](entryDetails) } else { new ScalaGlobalDataTableEntryDefinition[T](entryDetails) } - case entryDetails @ ScalaDataTableOptionalEntryTypeDetails(_, _, _) => + case entryDetails: ScalaDataTableOptionalEntryTypeDetails[_] => if (scenarioScoped) { new ScalaScenarioScopedDataTableOptionalEntryDefinition[T]( entryDetails @@ -27,31 +35,31 @@ object ScalaDataTableTypeDefinition { } else { new ScalaGlobalDataTableOptionalEntryDefinition[T](entryDetails) } - case rowDetails @ ScalaDataTableRowTypeDetails(_, _, _) => + case rowDetails: ScalaDataTableRowTypeDetails[_] => if (scenarioScoped) { new ScalaScenarioScopedDataTableRowDefinition[T](rowDetails) } else { new ScalaGlobalDataTableRowDefinition[T](rowDetails) } - case rowDetails @ ScalaDataTableOptionalRowTypeDetails(_, _, _) => + case rowDetails: ScalaDataTableOptionalRowTypeDetails[_] => if (scenarioScoped) { new ScalaScenarioScopedDataTableOptionalRowDefinition[T](rowDetails) } else { new ScalaGlobalDataTableOptionalRowDefinition[T](rowDetails) } - case cellDetails @ ScalaDataTableCellTypeDetails(_, _, _) => + case cellDetails: ScalaDataTableCellTypeDetails[_] => if (scenarioScoped) { new ScalaScenarioScopedDataTableCellDefinition[T](cellDetails) } else { new ScalaGlobalDataTableCellDefinition[T](cellDetails) } - case cellDetails @ ScalaDataTableOptionalCellTypeDetails(_, _, _) => + case cellDetails: ScalaDataTableOptionalCellTypeDetails[_] => if (scenarioScoped) { new ScalaScenarioScopedDataTableOptionalCellDefinition[T](cellDetails) } else { new ScalaGlobalDataTableOptionalCellDefinition[T](cellDetails) } - case rowDetails @ ScalaDataTableTableTypeDetails(_, _, _) => + case rowDetails: ScalaDataTableTableTypeDetails[_] => if (scenarioScoped) { new ScalaScenarioScopedDataTableDefinition[T](rowDetails) } else { diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableTypeDetails.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableTypeDetails.scala index 18a4c14..3e7a891 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableTypeDetails.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDataTableTypeDetails.scala @@ -2,46 +2,57 @@ package io.cucumber.scala import scala.reflect.ClassTag -sealed trait ScalaDataTableTypeDetails[T] +sealed trait ScalaDataTableTypeDetails[T] { + def emptyPatterns: Seq[String] + def tag: ClassTag[T] + def stackTraceElement: StackTraceElement +} case class ScalaDataTableEntryTypeDetails[T]( emptyPatterns: Seq[String], body: DataTableEntryDefinitionBody[T], - tag: ClassTag[T] + tag: ClassTag[T], + stackTraceElement: StackTraceElement ) extends ScalaDataTableTypeDetails[T] case class ScalaDataTableOptionalEntryTypeDetails[T]( emptyPatterns: Seq[String], body: DataTableOptionalEntryDefinitionBody[T], - tag: ClassTag[T] + tag: ClassTag[T], + stackTraceElement: StackTraceElement ) extends ScalaDataTableTypeDetails[T] case class ScalaDataTableRowTypeDetails[T]( emptyPatterns: Seq[String], body: DataTableRowDefinitionBody[T], - tag: ClassTag[T] + tag: ClassTag[T], + stackTraceElement: StackTraceElement ) extends ScalaDataTableTypeDetails[T] case class ScalaDataTableOptionalRowTypeDetails[T]( emptyPatterns: Seq[String], body: DataTableOptionalRowDefinitionBody[T], - tag: ClassTag[T] + tag: ClassTag[T], + stackTraceElement: StackTraceElement ) extends ScalaDataTableTypeDetails[T] case class ScalaDataTableCellTypeDetails[T]( emptyPatterns: Seq[String], body: DataTableCellDefinitionBody[T], - tag: ClassTag[T] + tag: ClassTag[T], + stackTraceElement: StackTraceElement ) extends ScalaDataTableTypeDetails[T] case class ScalaDataTableOptionalCellTypeDetails[T]( emptyPatterns: Seq[String], body: DataTableOptionalCellDefinitionBody[T], - tag: ClassTag[T] + tag: ClassTag[T], + stackTraceElement: StackTraceElement ) extends ScalaDataTableTypeDetails[T] case class ScalaDataTableTableTypeDetails[T]( emptyPatterns: Seq[String], body: DataTableDefinitionBody[T], - tag: ClassTag[T] + tag: ClassTag[T], + stackTraceElement: StackTraceElement ) extends ScalaDataTableTypeDetails[T] diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultDataTableCellTransformerDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultDataTableCellTransformerDefinition.scala index 72edfaf..f8e5c80 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultDataTableCellTransformerDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultDataTableCellTransformerDefinition.scala @@ -17,7 +17,7 @@ trait ScalaDefaultDataTableCellTransformerDefinition override val emptyPatterns: Seq[String] = details.emptyPatterns - override val location: StackTraceElement = new Exception().getStackTrace()(3) + override val location: StackTraceElement = details.stackTraceElement override val tableCellByTypeTransformer: TableCellByTypeTransformer = (fromValue: String, toTypeValue: Type) => { diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultDataTableEntryTransformerDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultDataTableEntryTransformerDefinition.scala index df5646c..95cfb84 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultDataTableEntryTransformerDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultDataTableEntryTransformerDefinition.scala @@ -22,7 +22,7 @@ trait ScalaDefaultDataTableEntryTransformerDefinition override val emptyPatterns: Seq[String] = details.emptyPatterns - override val location: StackTraceElement = new Exception().getStackTrace()(3) + override val location: StackTraceElement = details.stackTraceElement override val tableEntryByTypeTransformer: TableEntryByTypeTransformer = ( fromValue: JavaMap[String, String], diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultParameterTransformerDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultParameterTransformerDefinition.scala index 6c06a76..30edc27 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultParameterTransformerDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultParameterTransformerDefinition.scala @@ -15,7 +15,7 @@ trait ScalaDefaultParameterTransformerDefinition val details: ScalaDefaultParameterTransformerDetails - override val location: StackTraceElement = new Exception().getStackTrace()(3) + override val location: StackTraceElement = details.stackTraceElement override val parameterByTypeTransformer: ParameterByTypeTransformer = (fromValue: String, toValue: Type) => { diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultTransformerDetails.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultTransformerDetails.scala index 74b73e4..2ac5173 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultTransformerDetails.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDefaultTransformerDetails.scala @@ -7,15 +7,18 @@ import Aliases.{ } case class ScalaDefaultParameterTransformerDetails( - body: DefaultParameterTransformerBody + body: DefaultParameterTransformerBody, + stackTraceElement: StackTraceElement ) case class ScalaDefaultDataTableCellTransformerDetails( emptyPatterns: Seq[String], - body: DefaultDataTableCellTransformerBody + body: DefaultDataTableCellTransformerBody, + stackTraceElement: StackTraceElement ) case class ScalaDefaultDataTableEntryTransformerDetails( emptyPatterns: Seq[String], - body: DefaultDataTableEntryTransformerBody + body: DefaultDataTableEntryTransformerBody, + stackTraceElement: StackTraceElement ) diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDocStringTypeDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDocStringTypeDefinition.scala index 92f5f52..abecd0d 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDocStringTypeDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDocStringTypeDefinition.scala @@ -12,7 +12,7 @@ abstract class ScalaDocStringTypeDefinition[T] val details: ScalaDocStringTypeDetails[T] - override val location: StackTraceElement = new Exception().getStackTrace()(3) + override val location: StackTraceElement = details.stackTraceElement private val transformer: Transformer[T] = (s: String) => { details.body.apply(s) diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDocStringTypeDetails.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDocStringTypeDetails.scala index 7112323..992a999 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDocStringTypeDetails.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaDocStringTypeDetails.scala @@ -7,5 +7,6 @@ import java.lang.reflect.{Type => JType} case class ScalaDocStringTypeDetails[T]( contentType: String, body: DocStringDefinitionBody[T], - `type`: JType + `type`: JType, + stackTraceElement: StackTraceElement ) diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaHookDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaHookDefinition.scala index 4803483..aa7fb3a 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaHookDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaHookDefinition.scala @@ -10,7 +10,7 @@ trait ScalaHookDefinition extends HookDefinition with AbstractGlueDefinition { val hookDetails: ScalaHookDetails - override val location: StackTraceElement = new Exception().getStackTrace()(3) + override val location: StackTraceElement = hookDetails.stackTraceElement override def execute(state: TestCaseState): Unit = { executeAsCucumber(hookDetails.body.apply(new Scenario(state))) diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaParameterTypeDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaParameterTypeDefinition.scala index ec6ce32..75c5190 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaParameterTypeDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaParameterTypeDefinition.scala @@ -12,7 +12,7 @@ trait ScalaParameterTypeDefinition[R] val details: ScalaParameterTypeDetails[R] - override val location: StackTraceElement = new Exception().getStackTrace()(3) + override val location: StackTraceElement = details.stackTraceElement private val transformer: CaptureGroupTransformer[R] = (parameterContent: Array[String]) => { diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaParameterTypeDetails.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaParameterTypeDetails.scala index 5523db9..633b1b8 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaParameterTypeDetails.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaParameterTypeDetails.scala @@ -6,5 +6,6 @@ case class ScalaParameterTypeDetails[R]( name: String, regex: String, body: List[String] => R, - tag: ClassTag[R] + tag: ClassTag[R], + stackTraceElement: StackTraceElement ) diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaStaticHookDefinition.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaStaticHookDefinition.scala index 6825008..ca78f09 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaStaticHookDefinition.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/ScalaStaticHookDefinition.scala @@ -8,7 +8,7 @@ trait ScalaStaticHookDefinition val hookDetails: ScalaStaticHookDetails - override val location: StackTraceElement = new Exception().getStackTrace()(3) + override val location: StackTraceElement = hookDetails.stackTraceElement override def execute(): Unit = { executeAsCucumber(hookDetails.body.apply()) diff --git a/cucumber-scala/src/main/scala/io/cucumber/scala/Utils.scala b/cucumber-scala/src/main/scala/io/cucumber/scala/Utils.scala index 522dc17..bdcdaec 100644 --- a/cucumber-scala/src/main/scala/io/cucumber/scala/Utils.scala +++ b/cucumber-scala/src/main/scala/io/cucumber/scala/Utils.scala @@ -9,9 +9,25 @@ private[scala] object Utils { val frames = Thread.currentThread().getStackTrace val currentClass = self.getClass.getName // Note: the -1 check is here for Scala < 2.13 and objects - frames.reverse - .find(f => f.getClassName == currentClass && f.getLineNumber != -1) - .get + findLast(frames)(f => + f.getClassName == currentClass && f.getLineNumber != -1 + ) match { + case Some(stackFrame) => stackFrame + case None => + throw new IllegalStateException( + s"Not able to find stack frame for $currentClass" + ) + } + } + + // Copied from Scala 2.13 library, not available in 2.12 nor in scala-collections-compat + private def findLast[A](seq: Array[A])(p: A => Boolean): Option[A] = { + val it = seq.reverseIterator + while (it.hasNext) { + val elem = it.next() + if (p(elem)) return Some(elem) + } + None } }