From 2eb25e315c578d687720293628c59f4ecd272e19 Mon Sep 17 00:00:00 2001 From: Frank Wagner Date: Wed, 23 Nov 2022 15:59:47 +0100 Subject: [PATCH 01/12] configure lint --- .scalafix.conf | 9 +++++++++ .scalafmt.conf | 15 +++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 .scalafix.conf create mode 100644 .scalafmt.conf diff --git a/.scalafix.conf b/.scalafix.conf new file mode 100644 index 0000000..a2038e8 --- /dev/null +++ b/.scalafix.conf @@ -0,0 +1,9 @@ + +rules = [ + DisableSyntax + LeakingImplicitClassVal + NoAutoTupling + NoValInForComprehension +] + +# find more at https://scalacenter.github.io/scalafix/docs/rules/community-rules.html diff --git a/.scalafmt.conf b/.scalafmt.conf new file mode 100644 index 0000000..0079b98 --- /dev/null +++ b/.scalafmt.conf @@ -0,0 +1,15 @@ +version = "3.5.3" + +preset=IntelliJ +project.excludeFilters = ["metals.sbt"] + +#maxColumn = 80 +maxColumn = 100 + +align.preset = most +assumeStandardLibraryStripMargin = true +align.stripMargin = true + +newlines.source=keep +runner.dialect = scala212source3 + From daddab0758c51f9184405d590ae88c9babcd2357 Mon Sep 17 00:00:00 2001 From: Frank Wagner Date: Wed, 23 Nov 2022 16:07:23 +0100 Subject: [PATCH 02/12] cleanup --- project/plugins.sbt | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index f4afed7..dcad5c7 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,18 +1,7 @@ -val artifactoryHost = "eu.artifactory.swg-devops.com" -val username = sys.env.getOrElse("ARTIFACTORY_USERNAME", "missing-ARTIFACTORY_USERNAME") -val password = - sys.env.getOrElse("ARTIFACTORY_PASSWORD", "missing-ARTIFACTORY_PASSWORD") // API token - -val resolverUrl = s"https://$artifactoryHost/artifactory/hyc-diesel-team-maven-virtual/" - -resolvers += "Artifactory" at resolverUrl -credentials += Credentials("Artifactory Realm", artifactoryHost, s"${username}", s"${password}") - addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.11.0") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.0") addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.10.4") -addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.0.6") addSbtPlugin( "com.ibm.diesel" % "diesel-i18n-plugin" % "LATEST-SNAPSHOT" ) // Dependencies.dieselI18nVersion From 8b7e3e2b0fa23caa65c15f08baacfad126702f0f Mon Sep 17 00:00:00 2001 From: Frank Wagner Date: Wed, 23 Nov 2022 16:56:30 +0100 Subject: [PATCH 03/12] giving up --- .scalafmt.conf | 2 +- build.sbt | 82 ++++++------- .../src/main/scala/diesel/AstHelpers.scala | 4 +- diesel/shared/src/main/scala/diesel/Bnf.scala | 110 +++++++++--------- diesel/shared/src/main/scala/diesel/Dsl.scala | 29 ++--- .../shared/src/main/scala/diesel/Earley.scala | 58 ++++----- .../src/main/scala/diesel/EarleyState.scala | 32 ++--- .../shared/src/main/scala/diesel/Lexer.scala | 20 ++-- .../shared/src/main/scala/diesel/Marker.scala | 15 ++- .../src/main/scala/diesel/Navigator.scala | 60 +++++----- .../scala/diesel/voc/SentenceProcessor.scala | 56 ++++----- .../main/scala/diesel/voc/Verbalizer.scala | 18 +-- .../src/main/scala/diesel/voc/VocDsl.scala | 28 ++--- .../main/scala/diesel/voc/Vocabulary.scala | 2 +- .../diesel/voc/i18n/EnglishVerbalizer.scala | 12 +- .../src/test/scala/diesel/AbortTest.scala | 4 +- .../src/test/scala/diesel/AmbiguityTest.scala | 4 +- .../src/test/scala/diesel/PreditionTest.scala | 2 +- .../VerbalizationContextInDslTest.scala | 6 +- .../src/test/scala/diesel/samples/Sql.scala | 2 +- project/Dependencies.scala | 3 +- 21 files changed, 280 insertions(+), 269 deletions(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index 0079b98..364ebc6 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -11,5 +11,5 @@ assumeStandardLibraryStripMargin = true align.stripMargin = true newlines.source=keep -runner.dialect = scala212source3 +runner.dialect = scala3 diff --git a/build.sbt b/build.sbt index ea272a2..432a9e0 100644 --- a/build.sbt +++ b/build.sbt @@ -3,19 +3,18 @@ import sbtcrossproject.CrossPlugin.autoImport.crossProject import scala.sys.process._ -val scalaVersion_ = "2.13.8" -// val scalaVersion_ = "3.2.1" +val scalaVersion_ = "3.2.1" inThisBuild( List( - organization := "com.ibm.diesel", - scalaVersion := scalaVersion_, + organization := "com.ibm.diesel", + scalaVersion := scalaVersion_, versionScheme := Some("semver-spec") ) ) lazy val copyrightSettings = Seq( - startYear := Some(2018), + startYear := Some(2018), organizationName := "The Diesel Authors", licenses += ("Apache-2.0", new URL("https://www.apache.org/licenses/LICENSE-2.0.txt")) ) @@ -37,80 +36,83 @@ lazy val root = project .in(file(".")) .aggregate(dieselJVM, dieselJS, samplesJVM, samplesJS) .settings( - name := "diesel-root", - scalaVersion := scalaVersion_, + name := "diesel-root", + scalaVersion := scalaVersion_, crossScalaVersions := crossVersion2Only ) .settings(copyrightSettings) lazy val sharedSettings_scalac = Seq( scalacOptions ++= Seq( + // "-source:3.0-migration", + "-source:3.0", + "-new-syntax", + "-rewrite", "-unchecked", "-deprecation", "-feature", "-Xfatal-warnings", - "-Wconf:cat=deprecation:i", - "-language:existentials", - "-Wunused:imports", - "-Ytasty-reader" + // "-Wconf:cat=deprecation:i", + "-language:existentials" + // "-Wunused:imports", + // "-Ytasty-reader" ) ) lazy val sharedSettings_test = Seq( - Test / fork := false, + Test / fork := false, Test / logBuffered := false, // see https://github.com/scalameta/munit/blob/main/junit-interface/src/main/java/munit/internal/junitinterface/JUnitRunner.java // with logger: - //Test / testOptions += Tests.Argument("+l", "--summary=1") + // Test / testOptions += Tests.Argument("+l", "--summary=1") // without logger: Test / testOptions += Tests.Argument("--summary=1") ) lazy val sharedSettings_lint = Seq( - addCompilerPlugin(scalafixSemanticdb), - ThisBuild / scalafixScalaBinaryVersion := CrossVersion.binaryScalaVersion(scalaVersion.value), - ThisBuild / semanticdbEnabled := true, - ThisBuild / semanticdbVersion := scalafixSemanticdb.revision + // addCompilerPlugin(scalafixSemanticdb), + // ThisBuild / scalafixScalaBinaryVersion := CrossVersion.binaryScalaVersion(scalaVersion.value), + ThisBuild / semanticdbEnabled := true + // ThisBuild / semanticdbVersion := scalafixSemanticdb.revision ) lazy val sharedJsSettings = Seq( - coverageEnabled := false, - scalacOptions += { - val branch = - if (version.value.endsWith("SNAPSHOT")) { - "develop" - } else { - version.value - } - val local: String = baseDirectory.value.getParentFile.getParentFile.toURI.toString - val remote = s"https://raw.github.ibm.com/diesel/diesel/$branch/" - println(s"sourceURIs : \nLOCAL:$local\nREMOTE:$remote") - s"-P:scalajs:mapSourceURI:$local->$remote" - }, +// scalacOptions += { +// val branch = +// if (version.value.endsWith("SNAPSHOT")) { +// "develop" +// } else { +// version.value +// } +// val local: String = baseDirectory.value.getParentFile.getParentFile.toURI.toString +// val remote = s"https://raw.github.ibm.com/diesel/diesel/$branch/" +// println(s"sourceURIs : \nLOCAL:$local\nREMOTE:$remote") +// s"-P:scalajs:mapSourceURI:$local->$remote" +// } // for dependency: pine - libraryDependencies := libraryDependencies.value.filterNot(_.name == "scalajs-compiler"), - addCompilerPlugin("org.scala-js" % "scalajs-compiler" % scalaJSVersion cross CrossVersion.patch) +// libraryDependencies := libraryDependencies.value.filterNot(_.name == "scalajs-compiler"), +// addCompilerPlugin("org.scala-js" % "scalajs-compiler" % scalaJSVersion cross CrossVersion.patch) ) lazy val diesel = crossProject(JSPlatform, JVMPlatform) .withoutSuffixFor(JVMPlatform) .enablePlugins(I18nPlugin) .settings( - name := "diesel", - scalaVersion := scalaVersion_, - i18nDir := file("./diesel/i18n"), + name := "diesel", + scalaVersion := scalaVersion_, + i18nDir := file("./diesel/i18n"), i18nClassName := "diesel.I18nFiles" ) .settings(copyrightSettings) .settings(sharedSettings_scalac) .settings( libraryDependencies ++= Seq( - ("com.lihaoyi" %%% "sourcecode" % "0.3.0").cross(CrossVersion.for3Use2_13), - ("com.ibm.cloud.diesel" %%% "diesel-i18n" % Dependencies.dieselI18nVersion).cross(CrossVersion.for2_13Use3), + "com.lihaoyi" %%% "sourcecode" % "0.3.0", + "com.ibm.cloud.diesel" %%% "diesel-i18n" % Dependencies.dieselI18nVersion, // ("com.lihaoyi" %%% "sourcecode" % "0.3.0"), // ("com.ibm.diesel" %%% "diesel-i18n" % Dependencies.dieselI18nVersion), - scalaOrganization.value % "scala-reflect" % scalaVersion.value, - "org.scalameta" %%% "munit" % "1.0.0-M7" % Test + // scalaOrganization.value % "scala-reflect" % scalaVersion.value, + "org.scalameta" %%% "munit" % "1.0.0-M7" % Test ) ) .settings(sharedSettings_test) @@ -125,7 +127,7 @@ lazy val samples = crossProject(JSPlatform, JVMPlatform) .in(file("./diesel-samples")) .dependsOn(diesel % "compile->compile;test->test") .settings( - name := "diesel-samples", + name := "diesel-samples", scalaVersion := scalaVersion_ ) .settings(copyrightSettings) diff --git a/diesel/shared/src/main/scala/diesel/AstHelpers.scala b/diesel/shared/src/main/scala/diesel/AstHelpers.scala index 5ee1488..a0fb56b 100644 --- a/diesel/shared/src/main/scala/diesel/AstHelpers.scala +++ b/diesel/shared/src/main/scala/diesel/AstHelpers.scala @@ -86,7 +86,7 @@ object AstHelpers { verbalizer: Option[Verbalizer] = None, axiom: Option[Axiom[_]] = None )(s: String)(f: GenericTree => Unit): Unit = { - assertAsts(dsl, verbalizer, axiom)(s) { n: Navigator => + assertAsts(dsl, verbalizer, axiom)(s) { (n: Navigator) => assert(n.hasNext) val a = n.next() // println(a.root) @@ -121,7 +121,7 @@ object AstHelpers { def assertNoMarkers(p: GenericTree, assertNoAmbiguity: Boolean = true): Unit = { assert(p.markers.isEmpty, s"markers found ${p.markers.mkString("\n")}") - if (assertNoAmbiguity) + if assertNoAmbiguity then assert(!p.toSeq.exists(n => n.hasAmbiguity)) } diff --git a/diesel/shared/src/main/scala/diesel/Bnf.scala b/diesel/shared/src/main/scala/diesel/Bnf.scala index 5fe2277..f0ae739 100644 --- a/diesel/shared/src/main/scala/diesel/Bnf.scala +++ b/diesel/shared/src/main/scala/diesel/Bnf.scala @@ -92,16 +92,16 @@ object Bnf { case None => this case Precedence(_, _, associativity, level) => - if (this.level > level) + if this.level > level then Incompatible - else if (this.level < level) + else if this.level < level then this else { - if (dot < from) { - if (this.associativity == Associativity.Left) + if dot < from then { + if this.associativity == Associativity.Left then return this - } else if (dot > to) { - if (this.associativity == Associativity.Right) + } else if dot > to then { + if this.associativity == Associativity.Right then return this } Incompatible @@ -120,7 +120,7 @@ object Bnf { case class Propagate(from: Int) extends Feature { override def merge(dot: Int, other: Feature): Feature = { - if (from == dot) other else None + if from == dot then other else None } override def shift(prefix: Int): Feature = Propagate(prefix + from) @@ -279,7 +279,7 @@ object Bnf { val to = symbols.length - 1 var from = to var current = symbols.reverse.tail - while (current.nonEmpty && current.head.isToken) { + while current.nonEmpty && current.head.isToken do { from -= 1 current = current.tail } @@ -519,32 +519,32 @@ object Bnf { ) def propagate(first: Boolean): GrammarContext = - if (first) this else GrammarContext(concept, cardinality, None, None, None) + if first then this else GrammarContext(concept, cardinality, None, None, None) override def toString: String = s"${concept match { - case Some(value) => value.name - case None => "_" - }},${cardinality match { - case Some(value) => value.name - case None => "_" - }},${article match { - case Some(value) => value.name - case None => "_" - }},${plural match { - case Some(value) => if (value) "PLURAL" else "SINGULAR" - case None => "_" - }},${partitive match { - case Some(value) => if (value) "PARTITIVE" else "NON-PARTITIVE" - case None => "_" - }}" + case Some(value) => value.name + case None => "_" + }},${cardinality match { + case Some(value) => value.name + case None => "_" + }},${article match { + case Some(value) => value.name + case None => "_" + }},${plural match { + case Some(value) => if value then "PLURAL" else "SINGULAR" + case None => "_" + }},${partitive match { + case Some(value) => if value then "PARTITIVE" else "NON-PARTITIVE" + case None => "_" + }}" } def ruleNameOf(prefix: String, ctx: GrammarContext, suffix: String): String = { - s"$prefix[$ctx]${if (suffix.isEmpty) "" else s".$suffix"}" + s"$prefix[$ctx]${if suffix.isEmpty then "" else s".$suffix"}" } def getOrCreateRule(name: String, suffix: String = ""): Rule = { - val ruleName = s"$name${if (suffix.isEmpty) "" else s".$suffix"}" + val ruleName = s"$name${if suffix.isEmpty then "" else s".$suffix"}" rules.getOrElse( ruleName, { val rule = Rule(ruleName) @@ -562,7 +562,7 @@ object Bnf { var generated: mutable.Set[String] = mutable.Set() def forwardGeneration(rule: Rule, task: () => Unit): Unit = { - if (!generated.contains(rule.name)) { + if !generated.contains(rule.name) then { processingQueue.enqueue(task) generated = generated ++ Seq(rule.name) } @@ -837,7 +837,7 @@ object Bnf { Partial(Seq(item), Propagate(0)) case SPConceptRef(c, _, m, vc) => - val newCtx = ctx.derive(c, if (m) Multiple else Single, vc) + val newCtx = ctx.derive(c, if m then Multiple else Single, vc) val target = getOrCreateRuleWithContext("target", newCtx) forwardGeneration(target, () => generateTarget(target, newCtx)) Partial(Seq(target), Propagate(0)) @@ -909,7 +909,7 @@ object Bnf { args.head.asInstanceOf[Seq[Any]] ++ Seq(args.tail.head) } ) - if (zeroIncluded) + if zeroIncluded then repRule >> new Production( Some(repRule), Seq(), @@ -1084,7 +1084,7 @@ object Bnf { } .foldLeft(Partial(Seq())) { (acc, p) => acc ++ p } - case PPExprRef(concept, vc) => + case PPExprRef(concept, vc) => val newCtx = vc .map { vc => ctx.derive(concept, Single, vc) } .getOrElse(ctx.derive(concept, Single)) @@ -1118,7 +1118,7 @@ object Bnf { def generateValue(rule: Rule, ctx: GrammarContext): Boolean = { ctx.cardinality foreach { cardinality => - if (cardinality == Single) { + if cardinality == Single then { ctx.concept foreach { concept => concept.data foreach { data => rule >> new Production( @@ -1159,10 +1159,10 @@ object Bnf { def generateInstances(rule: Bnf.Rule, ctx: GrammarContext): Boolean = { ctx.cardinality foreach { cardinality => - if (cardinality == Single) { + if cardinality == Single then { ctx.concept foreach { concept => dsl.getInstances.foreach(instance => - if (instance.concept == concept) { + if instance.concept == concept then { instance match { case instance: Instance[_] => addProduction( @@ -1199,7 +1199,7 @@ object Bnf { ctx.concept foreach { concept => dsl.getPhrases.foreach { case phrase: PhraseSingle[_] => - if (cardinality == Single && phrase.concept == concept) { + if cardinality == Single && phrase.concept == concept then { val phraseRule = getOrCreateRuleWithContext("phrase", ctx, phrase.name) forwardGeneration(phraseRule, () => generatePhrase(phrase, phraseRule, ctx)) rule >> new Production( @@ -1211,7 +1211,7 @@ object Bnf { ) } case phrase: PhraseMulti[_, _] => - if (cardinality == Multiple && phrase.concept == concept) { + if cardinality == Multiple && phrase.concept == concept then { val phraseRule = getOrCreateRuleWithContext("phrase", ctx, phrase.name) forwardGeneration(phraseRule, () => generatePhrase(phrase, phraseRule, ctx)) rule >> new Production( @@ -1263,16 +1263,16 @@ object Bnf { ctx.concept foreach { concept => dsl.getSyntaxes.foreach { case syntax: SyntaxTyped[_] => - if ( + if cardinality == Single && syntax.expression && dsl.isSubtypeOf( syntax.concept, concept ) - ) { + then { addSyntax(syntax) } case syntax: SyntaxMulti[_, _] => - if (cardinality == Multiple && dsl.isSubtypeOf(syntax.concept, concept)) { + if cardinality == Multiple && dsl.isSubtypeOf(syntax.concept, concept) then { addSyntax(syntax) } case _ => @@ -1280,11 +1280,11 @@ object Bnf { // Generic syntaxes dsl.getGenericSyntaxes.foreach { case genericSyntax: SyntaxGeneric[_] => - if (cardinality == Single) { + if cardinality == Single then { genericSyntax.apply(concept, exprTypes, dsl, addSyntax) } case genericSyntax: SyntaxGenericMulti[_, _] => - if (cardinality == Multiple) { + if cardinality == Multiple then { genericSyntax.apply(concept, exprTypes, dsl, addSyntax) } } @@ -1343,9 +1343,9 @@ object Bnf { def generateExpr(rule: Rule, exprTypes: Expressions.Types, ctx: GrammarContext): Boolean = { ctx.cardinality foreach { cardinality => ctx.concept foreach { _ => - if (cardinality == Single) { + if cardinality == Single then { // Value - if (exprTypes.has(Expressions.Values)) { + if exprTypes.has(Expressions.Values) then { val value = getOrCreateRuleWithContext("value", ctx) forwardGeneration(value, () => generateValue(value, ctx)) rule >> new Production( @@ -1357,7 +1357,7 @@ object Bnf { ) } // Instances - if (exprTypes.has(Expressions.Instances)) { + if exprTypes.has(Expressions.Instances) then { val instances = getOrCreateRuleWithContext("instances", ctx) forwardGeneration(instances, () => generateInstances(instances, ctx)) rule >> new Production( @@ -1370,7 +1370,7 @@ object Bnf { } } // Phrases - if (exprTypes.has(Expressions.Phrases)) { + if exprTypes.has(Expressions.Phrases) then { val phrases = getOrCreateRuleWithContext("phrases", ctx) forwardGeneration(phrases, () => generatePhrases(phrases, ctx)) rule >> new Production( @@ -1382,7 +1382,7 @@ object Bnf { ) } // Syntaxes - if (exprTypes.has(Expressions.Syntaxes)) { + if exprTypes.has(Expressions.Syntaxes) then { val syntaxes = getOrCreateRuleWithContext("syntaxes", ctx) forwardGeneration(syntaxes, () => generateSyntaxes(syntaxes, exprTypes, ctx)) rule >> new Production( @@ -1435,33 +1435,33 @@ object Bnf { def cleanGrammar(): Unit = { var rulesToRemove: Set[String] = Set() - var cont = false - do { + var cont = true + while cont do { rules.values.foreach { case rule: Rule => - if (rule.productions.isEmpty) + if rule.productions.isEmpty then rulesToRemove = rulesToRemove ++ Seq(rule.name) case axiom: Axiom => - if (axiom.rule.productions.isEmpty) + if axiom.rule.productions.isEmpty then rulesToRemove = rulesToRemove ++ Seq(axiom.name) case _ => } cont = false; - if (rulesToRemove.nonEmpty) { + if rulesToRemove.nonEmpty then { rules.values.foreach { case rule: Rule => var productionsToRemove: Seq[Production] = Seq() rule.productions.foreach(p => { - if ( + if p.symbols.exists { case r: Rule => rulesToRemove.contains(r.name) case _ => false } - ) { + then { productionsToRemove = productionsToRemove ++ Seq(p) } }) - if (productionsToRemove.nonEmpty) { + if productionsToRemove.nonEmpty then { rule.productions = rule.productions.filter(p => !productionsToRemove.contains(p)) cont = true } @@ -1471,7 +1471,7 @@ object Bnf { rulesToRemove.foreach(ruleName => rules = rules - ruleName) rulesToRemove = Set() } - } while (cont) + } } def dumpGrammar(): Unit = { @@ -1488,7 +1488,7 @@ object Bnf { def generateGrammar(): Seq[NonTerminal] = { generateAxioms() - while (processingQueue.nonEmpty) { + while processingQueue.nonEmpty do { val task = processingQueue.dequeue() task() } diff --git a/diesel/shared/src/main/scala/diesel/Dsl.scala b/diesel/shared/src/main/scala/diesel/Dsl.scala index 7ed0eb1..0ce4b94 100644 --- a/diesel/shared/src/main/scala/diesel/Dsl.scala +++ b/diesel/shared/src/main/scala/diesel/Dsl.scala @@ -190,7 +190,8 @@ object Dsl { def multiple[T2]: PPMultiple[T, T2] = PPMultiple(this) def verbalization(vc: SPVerbalizationContext): PPExprRef[T] = this.copy(verbalizationContext = - Some(vc)) + Some(vc) + ) } case class PPMultiple[T, T2]( @@ -201,7 +202,8 @@ object Dsl { def verbalization(vc: SPVerbalizationContext): PPMultiple[T, T2] = this.copy(verbalizationContext = - Some(vc)) + Some(vc) + ) } case class PPAssoc[T](e: PhraseProduction[T], associativity: Associativity.Value, order: Int = 0) @@ -371,9 +373,9 @@ object Dsl { dsl: Dsl, consumer: SyntaxTyped[T] => Unit ): Unit = { - if (concept.typeOf == tag) { + if concept.typeOf == tag then { val c = concept.asInstanceOf[Concept[T]] - if (accept(c, exprTypes, dsl)) + if accept(c, exprTypes, dsl) then consumer(syntaxOf(c)) } } @@ -391,9 +393,9 @@ object Dsl { dsl: Dsl, consumer: (SyntaxMulti[T, T2]) => Unit ): Unit = - if (concept.typeOf == tag) { + if concept.typeOf == tag then { val c = concept.asInstanceOf[Concept[T]] - if (accept(c, exprTypes, dsl)) + if accept(c, exprTypes, dsl) then consumer(syntaxOf(c)) } } @@ -623,7 +625,8 @@ object Dsl { def verbalization(vc: SPVerbalizationContext): SPMultiple[T, T2] = this.copy(verbalizationContext = - Some(vc)) + Some(vc) + ) } case class SPRefWithContext[T](ref: SPExprRef[T], verbalizationContext: SPVerbalizationContext) @@ -915,9 +918,9 @@ object Dsl { trait DynamicLexer {} } -/** Dsl trait : to be mixed in by language definitions. Holds all declared concepts, - * phrases, instances etc., and provides user-friendly APIs for declaring grammars and - * mapping to custom ASTs. +/** Dsl trait : to be mixed in by language definitions. Holds all declared concepts, phrases, + * instances etc., and provides user-friendly APIs for declaring grammars and mapping to custom + * ASTs. */ trait Dsl { @@ -1079,15 +1082,15 @@ trait Dsl { syntax } - def syntax[T](production: SyntaxProduction[T])(implicit name: sourcecode.Name): SyntaxUntyped[T] = - addSyntax(SyntaxUntyped(name.value, production)).asInstanceOf[SyntaxUntyped[T]] - def syntax[T]( concept: Concept[T], expression: Boolean = true )(production: SyntaxProduction[T])(implicit name: sourcecode.Name): SyntaxTyped[T] = addSyntax(SyntaxTyped(name.value, concept, expression, production)).asInstanceOf[SyntaxTyped[T]] + // def syntax[T](production: SyntaxProduction[T])(implicit name: sourcecode.Name): SyntaxUntyped[T] = + // addSyntax(SyntaxUntyped(name.value, production)).asInstanceOf[SyntaxUntyped[T]] + def syntaxMultiple[T, T2](concept: Concept[T])(production: SyntaxProduction[T2])(implicit name: sourcecode.Name ): SyntaxMulti[T, T2] = { diff --git a/diesel/shared/src/main/scala/diesel/Earley.scala b/diesel/shared/src/main/scala/diesel/Earley.scala index 6790340..758a39b 100644 --- a/diesel/shared/src/main/scala/diesel/Earley.scala +++ b/diesel/shared/src/main/scala/diesel/Earley.scala @@ -32,18 +32,18 @@ case class Earley(bnf: Bnf, dynamicLexer: Boolean = false) { } private def scan(input: Lexer.Input, tokens: Seq[Lexer.TokenId], context: Result): Lexer.Token = { - var token = if (tokens.isEmpty) lexer.next(input) else lexer.next(input, tokens) - if (token.id == Lexer.Error) { + var token = if tokens.isEmpty then lexer.next(input) else lexer.next(input, tokens) + if token.id == Lexer.Error then { var errorToken = Lexer.Token(token.offset, "", Lexer.Error) - do { - if (errorToken.offset + errorToken.length == token.offset) { + while token.id == Lexer.Error do { + if errorToken.offset + errorToken.length == token.offset then { errorToken = Lexer.Token(errorToken.offset, errorToken.text ++ token.text, Lexer.Error) } else { context.addLexicalError(errorToken) errorToken = token } - token = if (tokens.isEmpty) lexer.next(input) else lexer.next(input, tokens) - } while (token.id == Lexer.Error) + token = if tokens.isEmpty then lexer.next(input) else lexer.next(input, tokens) + } context.addLexicalError(token = errorToken) } token @@ -55,28 +55,28 @@ case class Earley(bnf: Bnf, dynamicLexer: Boolean = false) { private def buildCharts(input: Lexer.Input, axiom: Bnf.Axiom): Result = { val context = new Result(axiom) - var lexicalValue = if (dynamicLexer) skip(input) else scan(input, context) - var length = if (lexicalValue.id == Lexer.Eos) 0 else 1 + var lexicalValue = if dynamicLexer then skip(input) else scan(input, context) + var length = if lexicalValue.id == Lexer.Eos then 0 else 1 var index = 0 - while (index <= length) { + while index <= length do { var scanned = false val chart = context.beginChart(index, lexicalValue) - if (dynamicLexer) { + if dynamicLexer then { val scanQueue = closure(context) val tokens = scanQueue.map(_.nextSymbol.asInstanceOf[Bnf.Token].tokenId) lexicalValue = scan(input, tokens, context) chart.setToken(lexicalValue) scanQueue.foreach(context.processingQueue.enqueue(_)) } - while (context.processingQueue.nonEmpty) { + while context.processingQueue.nonEmpty do { val state: State = context.processingQueue.dequeue() - if (state.isCompleted) + if state.isCompleted then completer(state, context) else { val next: Bnf.Symbol = state.nextSymbol next match { case token: Bnf.Token => - if (scanner(state, token, lexicalValue, context)) + if scanner(state, token, lexicalValue, context) then scanned = true case rule: Bnf.Rule => @@ -86,18 +86,18 @@ case class Earley(bnf: Bnf, dynamicLexer: Boolean = false) { } } } - if (!scanned && !succeed(lexicalValue, context)) { + if !scanned && !succeed(lexicalValue, context) then { errorRecovery(index, lexicalValue, context) - if (lexicalValue.id == Lexer.Eos) { - while (!context.success) { + if lexicalValue.id == Lexer.Eos then { + while !context.success do { errorRecovery(index, lexicalValue, context) } } } context.endChart() - lexicalValue = if (dynamicLexer) skip(input) else scan(input, context) - if (lexicalValue.id != Lexer.Eos) + lexicalValue = if dynamicLexer then skip(input) else scan(input, context) + if lexicalValue.id != Lexer.Eos then length += 1 index += 1 } @@ -106,9 +106,9 @@ case class Earley(bnf: Bnf, dynamicLexer: Boolean = false) { private def closure(context: Result): Seq[State] = { var scanQueue: Seq[State] = Seq() - while (context.processingQueue.nonEmpty) { + while context.processingQueue.nonEmpty do { val state: State = context.processingQueue.dequeue() - if (state.isCompleted) + if state.isCompleted then completer(state, context) else { val next: Bnf.Symbol = state.nextSymbol @@ -127,15 +127,15 @@ case class Earley(bnf: Bnf, dynamicLexer: Boolean = false) { } private def succeed(lexicalValue: Lexer.Token, context: Result) = { - if (lexicalValue.id == Lexer.Eos) context.success else false + if lexicalValue.id == Lexer.Eos then context.success else false } private def errorRecovery(index: Int, lexicalValue: Lexer.Token, context: Result): Unit = { context.beginErrorRecovery() - while (context.processingQueue.nonEmpty) { + while context.processingQueue.nonEmpty do { val state: State = context.processingQueue.dequeue() - if (state.isCompleted) { - if (state == context.successState && lexicalValue.id != Eos) { + if state.isCompleted then { + if state == context.successState && lexicalValue.id != Eos then { // Insertion error hypothesis : ignore all the tokens at the end of right text context.addState( State(state.production, state.begin, state.end + 1, state.dot), @@ -148,8 +148,8 @@ case class Earley(bnf: Bnf, dynamicLexer: Boolean = false) { val next: Bnf.Symbol = state.nextSymbol next match { case token: Bnf.Token => - if (!scanner(state, token, lexicalValue, context)) { - if (lexicalValue.id != Lexer.Eos) { + if !scanner(state, token, lexicalValue, context) then { + if lexicalValue.id != Lexer.Eos then { context.addState( State(state.production, state.begin, state.end + 1, state.dot), StateKind.ErrorRecovery, @@ -199,7 +199,7 @@ case class Earley(bnf: Bnf, dynamicLexer: Boolean = false) { tokenValue: Lexer.Token, context: Result ): Boolean = { - if (token.accept(tokenValue.id, lexer.identifiers)) { + if token.accept(tokenValue.id, lexer.identifiers) then { context.addState( State(state.production, state.begin, state.end + 1, state.dot + 1), StateKind.Kernel, @@ -225,14 +225,14 @@ case class Earley(bnf: Bnf, dynamicLexer: Boolean = false) { context.chartAt(state.begin).activeStates(candidate => candidate.nextSymbol eq state.rule) candidates.foreach(candidate => { val feature = candidate.feature.merge(candidate.dot, state.feature) - if (feature != Constraints.Incompatible) { + if feature != Constraints.Incompatible then { context.addState( State( candidate.production, candidate.begin, state.end, candidate.dot + 1, - if (candidate.feature.canPropagate) feature else candidate.feature + if candidate.feature.canPropagate then feature else candidate.feature ), StateKind.next(state.kind(context)), Some(BackPtr(candidate, state)) diff --git a/diesel/shared/src/main/scala/diesel/EarleyState.scala b/diesel/shared/src/main/scala/diesel/EarleyState.scala index 31eeb2e..fecaa03 100644 --- a/diesel/shared/src/main/scala/diesel/EarleyState.scala +++ b/diesel/shared/src/main/scala/diesel/EarleyState.scala @@ -42,7 +42,7 @@ private[diesel] trait TerminalItem extends Item { def isErrorRecovery: Boolean = false - override def syntacticErrors(ctx: Result): Int = if (isErrorRecovery) 1 else 0 + override def syntacticErrors(ctx: Result): Int = if isErrorRecovery then 1 else 0 def reportErrors(): Seq[Marker] } @@ -133,11 +133,11 @@ private[diesel] case class State( val builder = new mutable.StringBuilder() builder.append(rule.name).append(" -> ") production.symbols.zipWithIndex.foreach { case (symbol: Bnf.Symbol, index: Int) => - if (index == dot) + if index == dot then builder.append(". ") builder.append(symbol.name).append(" ") } - if (production.symbols.length == dot) + if production.symbols.length == dot then builder.append(". ") builder.append("[").append(begin).append(", ").append(end).append("] ").append(feature) // states.get(this).foreach(ctx => { @@ -165,10 +165,10 @@ private[diesel] class Chart( def `+=`(state: State): Chart = { states += state - if (!state.isCompleted && state.nextSymbol.isRule) { + if !state.isCompleted && state.nextSymbol.isRule then { _activeStates += state } - if (!state.isCompleted) { + if !state.isCompleted then { _notCompletedStates += state } this @@ -227,7 +227,7 @@ private[diesel] object StateKind extends Enumeration { val Kernel, Processed, ErrorRecovery = Value def next(value: Value): Value = - if (value.id < ErrorRecovery.id) values.iteratorFrom(value).next() else value + if value.id < ErrorRecovery.id then values.iteratorFrom(value).next() else value } private[diesel] class StateContext( @@ -238,21 +238,21 @@ private[diesel] class StateContext( ) { def mergeBackPtr(kind: StateKind.Value, backPtr: BackPtr, ctx: Result): StateContext = { - if (this.kind != kind) { - if (this.kind.id > kind.id) { + if this.kind != kind then { + if this.kind.id > kind.id then { this.kind = kind; } } val syntacticErrors = backPtr.syntacticErrors(ctx) - if (backPtrs.isEmpty) { + if backPtrs.isEmpty then { this.syntacticErrors = syntacticErrors backPtrs += backPtr - } else if (syntacticErrors < this.syntacticErrors) { + } else if syntacticErrors < this.syntacticErrors then { this.syntacticErrors = syntacticErrors backPtrs.clear() backPtrs += backPtr - } else if (syntacticErrors == this.syntacticErrors && syntacticErrors == 0) { - if (!backPtrs.contains(backPtr)) // TODO: use better implementation O(n) + } else if syntacticErrors == this.syntacticErrors && syntacticErrors == 0 then { + if !backPtrs.contains(backPtr) then // TODO: use better implementation O(n) backPtrs += backPtr } this @@ -285,7 +285,7 @@ class Result(val axiom: Bnf.Axiom) { private[diesel] def reportErrors(): Seq[Marker] = markers.toSeq private[diesel] def beginChart(index: Int, token: Lexer.Token): Chart = { - val chart = if (index == charts.size) pushChart else chartAt(index) + val chart = if index == charts.size then pushChart else chartAt(index) chart.setToken(token) chart.toQueue(processingQueue) currentChart = Some(chart) @@ -300,7 +300,7 @@ class Result(val axiom: Bnf.Axiom) { }) def tokenEndsAt(offset: Int) = { - t: Token => t.offset + t.length == offset + (t: Token) => t.offset + t.length == offset } val prefix = errorTokens @@ -311,7 +311,7 @@ class Result(val axiom: Bnf.Axiom) { } private[diesel] def chartAt(index: Int) = { - while (index >= charts.size) + while index >= charts.size do pushChart charts(index) } @@ -333,7 +333,7 @@ class Result(val axiom: Bnf.Axiom) { ): Unit = { val ctx = states.getOrElseUpdate( state, { - val res = new StateContext(states.size, kind, if (state.dot == 0) 0 else Int.MaxValue) + val res = new StateContext(states.size, kind, if state.dot == 0 then 0 else Int.MaxValue) states.put(state, res) enqueue(state) res diff --git a/diesel/shared/src/main/scala/diesel/Lexer.scala b/diesel/shared/src/main/scala/diesel/Lexer.scala index dc45dd7..3989fec 100644 --- a/diesel/shared/src/main/scala/diesel/Lexer.scala +++ b/diesel/shared/src/main/scala/diesel/Lexer.scala @@ -164,14 +164,14 @@ object Lexer { var isKeyword = false identifiers.foreach { i => i.keywordScanner.findPrefixOf(text).foreach { prefix => - if (prefix == text) { - if (!keywords.contains(prefix)) { + if prefix == text then { + if !keywords.contains(prefix) then { keywords.put(prefix, IdentifiedToken(prefix)) styleOpt.foreach(style => keywordToStyles.put(prefix, Seq(style))) } else { styleOpt.foreach(style => { val styles = keywordToStyles.get(prefix) - if (styles.isEmpty) + if styles.isEmpty then keywordToStyles.put(prefix, Seq(style)) else keywordToStyles.put(prefix, styles.get ++ Seq(style)) @@ -181,14 +181,14 @@ object Lexer { } } } - if (!isKeyword) { + if !isKeyword then { computeScanner(RegexScanner(Regex.quote(text).r), IdentifiedToken(text), styleOpt) } else Seq() } def computeScanner(re: Scanner, tokenId: Lexer.TokenId, styleOpt: Option[Style]): Seq[Rule] = { - if (!scanners.contains(re)) { + if !scanners.contains(re) then { val rule = SimpleRule(re, tokenId) styleOpt.foreach { style => rule.styles = rule.styles ++ Seq(style) @@ -284,7 +284,7 @@ case class Lexer(lexerRules: Seq[Rule], tokenRules: Map[TokenId, Rule]) { def next(input: Input, tokens: Seq[TokenId]): Token = { val lexerRules = tokens.map(tokenId => tokenRules(tokenId)) ++ skipRules var res = next(input, lexerRules, eatOnError = false)._1 - if (res.id == Error) { + if res.id == Error then { res = next(input) } res @@ -300,7 +300,7 @@ case class Lexer(lexerRules: Seq[Rule], tokenRules: Map[TokenId, Rule]) { lexerRules: Seq[Rule], eatOnError: Boolean = true ): (Token, Seq[Style]) = { - if (input.eos) { + if input.eos then { (Token(input.offset, "", Eos), Seq()) } else { val initialAcc: Option[((Token, Seq[Style]), Int)] = None // (Token, Priority) @@ -313,9 +313,9 @@ case class Lexer(lexerRules: Seq[Rule], tokenRules: Map[TokenId, Rule]) { Some(((Token(input.offset, s, rule.tokenId(s)), rule.stylesOf(s)), rule.priority)) case Some(r @ ((t, _), p)) => - if ( + if (s.length > t.text.length) || ((s.length == t.text.length) && (rule.priority > p)) - ) { + then { Some(((Token(input.offset, s, rule.tokenId(s)), rule.stylesOf(s)), rule.priority)) } else { Some(r) @@ -328,7 +328,7 @@ case class Lexer(lexerRules: Seq[Rule], tokenRules: Map[TokenId, Rule]) { } a match { case None => - (Token(input.offset, if (eatOnError) input.eat(1) else "", Error), Seq()) + (Token(input.offset, if eatOnError then input.eat(1) else "", Error), Seq()) case Some(((Token(_, text, Skip), _), _)) => input.eat(text.length) diff --git a/diesel/shared/src/main/scala/diesel/Marker.scala b/diesel/shared/src/main/scala/diesel/Marker.scala index efc366a..03626d3 100644 --- a/diesel/shared/src/main/scala/diesel/Marker.scala +++ b/diesel/shared/src/main/scala/diesel/Marker.scala @@ -66,27 +66,32 @@ sealed trait InternalMsg extends MarkerMessage { case class MissingTokenMsg(token: String) extends InternalMsg { override def format(locale: String): String = { - DieselI18n.missingToken(token)(resolver(locale)) + given KeyResolver = resolver(locale) + DieselI18n.missingToken(token) } } case class InsertedTokenMsg(token: String) extends InternalMsg { override def format(locale: String): String = { - DieselI18n.insertedToken(token)(resolver(locale)) + given KeyResolver = resolver(locale) + DieselI18n.insertedToken(token) } } case class TokenMutationMsg(actualToken: String, expectedToken: String) extends InternalMsg { override def format(locale: String): String = { - DieselI18n.tokenMutation(actualToken, expectedToken)(resolver(locale)) + given KeyResolver = resolver(locale) + DieselI18n.tokenMutation(actualToken, expectedToken) } } case class UnknownTokenMsg(token: String) extends InternalMsg { override def format(locale: String): String = { - DieselI18n.unknownToken(token)(resolver(locale)) + given KeyResolver = resolver(locale) + DieselI18n.unknownToken(token) } } case object AmbiguousMsg extends InternalMsg { override def format(locale: String): String = { - DieselI18n.ambiguous()(resolver(locale)) + given KeyResolver = resolver(locale) + DieselI18n.ambiguous() } } diff --git a/diesel/shared/src/main/scala/diesel/Navigator.scala b/diesel/shared/src/main/scala/diesel/Navigator.scala index 7fdf7ad..4868990 100644 --- a/diesel/shared/src/main/scala/diesel/Navigator.scala +++ b/diesel/shared/src/main/scala/diesel/Navigator.scala @@ -66,7 +66,7 @@ private[diesel] class ParsingContext( override def hasAborted: Boolean = aborted override def abort(): Boolean = { - if (!aborted) { + if !aborted then { ambiguity.foreach(_.abort()) aborted = true } @@ -99,7 +99,7 @@ object GenericTree { override def next(): GenericNode = { val res = processingQueue.dequeue() - if (descendants) { + if descendants then { res.getChildren.foreach(child => processingQueue.enqueue(child)) } res @@ -142,7 +142,7 @@ case class GenericTree( override def toString: String = prettyPrint(this.root, 0).mkString("\n") private def nodeToStr(node: GenericNode): String = - (node.toString + (if (node.value == null) "" else " => " + node.value.toString)) + (node.toString + (if node.value == null then "" else " => " + node.value.toString)) private def prettyPrint(node: GenericNode, indent: Int): Seq[String] = { Seq( @@ -182,14 +182,14 @@ abstract class GenericNode(var parent: Option[GenericNode], val context: Context def toSeq(descendants: Boolean = false): Seq[GenericNode] = toIterable(descendants).toSeq def findNodeAtIndex(index: Int): Option[GenericNode] = - if (containsIndex(index)) { + if containsIndex(index) then { getChildren.foreach(child => { child.findNodeAtIndex(index) match { case Some(value) => return Some(value) case _ => } }) - if (startsAtIndex(index)) + if startsAtIndex(index) then Some(this) else None @@ -212,7 +212,7 @@ abstract class GenericNode(var parent: Option[GenericNode], val context: Context def findFirstParent(p: GenericNode => Boolean): Option[GenericNode] = { parent match { case Some(parent) => - if (p(parent)) + if p(parent) then Some(parent) else parent.findFirstParent(p) @@ -300,27 +300,27 @@ object Navigator { def select(navigator: Navigator): Option[GenericTree] = { var asts: Seq[GenericTree] = Seq() var errorCount: Int = Int.MaxValue - while (navigator.hasNext) { + while navigator.hasNext do { val candidate: GenericTree = navigator.next() - if (asts.isEmpty) + if asts.isEmpty then asts = Seq(candidate) else { val actualErrorCount = Marker.countErrors(candidate.markers) - if (errorCount > actualErrorCount) + if errorCount > actualErrorCount then asts = Seq(candidate) - else if (errorCount == 0 && actualErrorCount == 0) + else if errorCount == 0 && actualErrorCount == 0 then asts = asts ++ Seq(candidate) } errorCount = Marker.countErrors(asts.head.markers) } - if (errorCount == 0 && asts.size > 1) { + if errorCount == 0 && asts.size > 1 then { val ast = asts.head var errors: Seq[Marker] = Seq() ast.toSeq.foreach(node => - if (node.hasAmbiguity) + if node.hasAmbiguity then errors = errors ++ Seq(Ambiguous.apply(node.offset, node.length)) ) - if (errors.isEmpty) + if errors.isEmpty then errors = Seq(Ambiguous.apply(ast.offset, ast.length)) Some(GenericTree(ast.root, ast.value, ast.offset, ast.length, ast.markers ++ errors)) } else asts.headOption @@ -347,7 +347,7 @@ class Navigator( moveToFirst private[diesel] def choice(statement: Statement, state: State): Process = { - if (state.production.length == 0) { + if state.production.length == 0 then { pushSentinel() statement.next() } else { @@ -396,7 +396,7 @@ class Navigator( var i = state.production.length var styles: Seq[(Token, Style)] = Seq() var errors: Seq[Marker] = Seq() - while (i > 0) { + while i > 0 do { val value = stack.head value.value match { case InsertedTokenValue(_, _, _) => /* Ignore */ @@ -416,7 +416,7 @@ class Navigator( errors = popSentinel(errors) val offset = result.tokenAt(state.begin).map(_.offset).getOrElse(-1) val length = - if (state.begin == state.end) { + if state.begin == state.end then { 0 } else { result.tokenAt(state.end - 1).map(tk => tk.offset + tk.text.length).getOrElse(-1) - offset @@ -441,7 +441,7 @@ class Navigator( private def popSentinel(errors: Seq[Marker]): Seq[Marker] = { var res = errors // Pop all remaining inserted token values - while (stack.head.value != Sentinel) { + while stack.head.value != Sentinel do { val value = stack.head value.value match { case InsertedTokenValue(_, _, _) => @@ -526,11 +526,11 @@ class Navigator( } private def moveToNext: Boolean = { - while (!proc.done) { + while !proc.done do { proc = proc.step() - if (proc.pause) + if proc.pause then return true - if (proc.stop || (proc.cut && canRetry)) + if proc.stop || (proc.cut && canRetry) then proc = back() } current = null @@ -542,7 +542,7 @@ class Navigator( def next(): GenericTree = { var tree = GenericTree(current.node, current.value, current.offset, current.length, current.markers) - if (postProcessors.nonEmpty) { + if postProcessors.nonEmpty then { var markers: Seq[Marker] = Seq() postProcessors.foreach(pp => markers = markers ++ pp(tree)) tree = GenericTree(tree.root, tree.value, tree.offset, tree.length, tree.markers ++ markers) @@ -561,9 +561,9 @@ class Navigator( } private def back(): Process = { - while (choices.nonEmpty) { + while choices.nonEmpty do { val choice = choices.head - if (choice.retry) { + if choice.retry then { stack = choice.base return choice } @@ -573,7 +573,7 @@ class Navigator( } private def canRetry: Boolean = { - if (choices.nonEmpty) choices.exists(_.retry) else false + if choices.nonEmpty then choices.exists(_.retry) else false } } @@ -617,7 +617,7 @@ object Analyzer { } override def next(): Statement = { - if (!navigator.push(item, ambiguity)) { + if !navigator.push(item, ambiguity) then { return new Cut(navigator) } super.next(); @@ -633,11 +633,11 @@ object Analyzer { ) extends Statement(navigator, parent) { override def step(): Process = { - if ( + if backPtr.predecessor.dot == 0 && navigator.result.contextOf(backPtr.predecessor).forall( ctx => ctx.backPtrs.isEmpty ) - ) { + then { navigator.pushSentinel() next() } else { @@ -667,10 +667,10 @@ object Analyzer { private[diesel] val base: Seq[Parsing] = navigator.stack private var index: Seq[BackPtr] = backPtrs private val ambiguity: Option[Ambiguity] = - if (backPtrs.size > 1) Some(new Ambiguity(backPtrs.size)) else None + if backPtrs.size > 1 then Some(new Ambiguity(backPtrs.size)) else None override def step(): Process = { - if (index.nonEmpty) { + if index.nonEmpty then { val backPtr = index.head index = index.tail return new Sequence(navigator, parent, state, backPtr, ambiguity) @@ -687,7 +687,7 @@ object Analyzer { override def step(): Process = navigator.choice(this, root.state) override def next(): Statement = { - if (navigator.tree(root.state)) + if navigator.tree(root.state) then new Pause(navigator, root) else super.next() diff --git a/diesel/shared/src/main/scala/diesel/voc/SentenceProcessor.scala b/diesel/shared/src/main/scala/diesel/voc/SentenceProcessor.scala index 99cae46..874322a 100644 --- a/diesel/shared/src/main/scala/diesel/voc/SentenceProcessor.scala +++ b/diesel/shared/src/main/scala/diesel/voc/SentenceProcessor.scala @@ -89,13 +89,13 @@ object SentenceProcessor { val template = s.template var subjectFirst = false val open = 1 + template.indexOf('{') - if (open > 0) { + if open > 0 then { val close = template.indexOf('}', open) - if (close >= 0) { + if close >= 0 then { val comma = template.indexOf(',', open) val index = template.substring( open, - if (comma < 0) { + if comma < 0 then { close } else { Math.min(comma, close) @@ -104,26 +104,26 @@ object SentenceProcessor { Try(index.toInt) .toOption .foreach { idx => - if (idx > 0) { + if idx > 0 then { subjectFirst = true } } } } var ctx = context - if (subjectFirst) { + if subjectFirst then { ctx = ctx.copy(article = DefiniteArticle) } else { ctx = ctx.copy(article = NoArticle) } - if (role.cardinality == Multiple) { + if role.cardinality == Multiple then { ctx = ctx.copy(plural = true) } - if (useBracket) { + if useBracket then { writeOpenBracket(true) } writer.write(verbalizer.verbalizeTerm(ctx, RoleVerbalizable(getRole(role.roleIndex))).text) - if (useBracket) { + if useBracket then { writeCloseBracket(true) } } @@ -139,9 +139,9 @@ object SentenceProcessor { override def processObject(role: SyntacticRole, context: VerbalizationContext): Unit = { val label = getRole(role.roleIndex).label - if (useBracket) writeOpenBracket(false) + if useBracket then writeOpenBracket(false) writeObjectText(label.getOrElse("?")) - if (useBracket) writeCloseBracket(false) + if useBracket then writeCloseBracket(false) } protected def writeObjectText(s: String): Unit = { @@ -208,7 +208,7 @@ object SentenceProcessor { var ctx = context val textBuffer = new StringBuilder() val template = sentence.template - if (template.isEmpty) { + if template.isEmpty then { return } val synRoleBuffer = new StringBuilder() @@ -219,14 +219,14 @@ object SentenceProcessor { ctx = ctx.copy(sentence = Some(sentence)) handler.processSentence(sentence, ctx) var propagatePartitif = true - for (c <- template) { + for c <- template do { c match { case PLACE_HOLDER_OPEN => isInSynRole = true synRoleBuffer.clear() synRolePropsBuffer.clear() - if (textBuffer.nonEmpty) { - if (mustGeneratePartitiveArticle(ctx, propagatePartitif)) { + if textBuffer.nonEmpty then { + if mustGeneratePartitiveArticle(ctx, propagatePartitif) then { generatePartitiveArticle(verbalizer, ctx, handler) } handler.processText(textBuffer.substring(0, textBuffer.length)) @@ -240,10 +240,10 @@ object SentenceProcessor { ).toOption.flatMap(synRoleIndex => sentence.getSyntacticRole(synRoleIndex)) synRoleOpt match { case Some(synRole) => - if (synRolePropsBuffer.nonEmpty) { + if synRolePropsBuffer.nonEmpty then { val props = synRolePropsBuffer.toString.trim val propsList = getSyntacticRoleProperties(props) - if (propsList.nonEmpty) { + if propsList.nonEmpty then { ctx = ctx.copy(props = propsList) } } @@ -255,18 +255,18 @@ object SentenceProcessor { case None => // Unparseable place holder. Let's handle it as a text: - if (mustGeneratePartitiveArticle(ctx, propagatePartitif)) { + if mustGeneratePartitiveArticle(ctx, propagatePartitif) then { generatePartitiveArticle(verbalizer, ctx, handler) } handler.processText(s"$PLACE_HOLDER_OPEN$synRoleAsString$PLACE_HOLDER_CLOSE") propagatePartitif = false } case _ => - if (isInSynRole) { - if (isInSynRoleProps) { + if isInSynRole then { + if isInSynRoleProps then { synRolePropsBuffer.append(c) } else { - if (c == PLACE_HOLDER_PROPS_SEPARATOR) { + if c == PLACE_HOLDER_PROPS_SEPARATOR then { isInSynRoleProps = true } else { synRoleBuffer.append(c) @@ -277,8 +277,8 @@ object SentenceProcessor { } } } - if (textBuffer.nonEmpty) { - if (mustGeneratePartitiveArticle(ctx, propagatePartitif)) { + if textBuffer.nonEmpty then { + if mustGeneratePartitiveArticle(ctx, propagatePartitif) then { generatePartitiveArticle(verbalizer, ctx, handler) } handler.processText(textBuffer.toString()) @@ -288,12 +288,12 @@ object SentenceProcessor { private def getSyntacticRoleProperties(props: String): Map[String, String] = { val tokenizer = new StringTokenizer(props, ", ") val propsMap = mutable.Map[String, String]() - while ({ + while { tokenizer.hasMoreTokens - }) { + } do { val prop = tokenizer.nextToken val index = prop.indexOf('=') - if (index == -1) propsMap.put(prop, "true") + if index == -1 then propsMap.put(prop, "true") else { val key = prop.substring(0, index) val `val` = prop.substring(index + 1) @@ -314,12 +314,12 @@ object SentenceProcessor { case None => context.copy(partitive = context.partitive && propagatePartitif) } - if (context.getProperty(Vocabulary.Constants.NO_ARTICLE).exists(_.equalsIgnoreCase("TRUE"))) { + if context.getProperty(Vocabulary.Constants.NO_ARTICLE).exists(_.equalsIgnoreCase("TRUE")) then { ctx = ctx.copy(article = NoArticle) } - if ( + if context.getProperty(Vocabulary.Constants.PLURAL_UNDEFINED).exists(_.equalsIgnoreCase("TRUE")) - ) { + then { ctx = ctx.copy(plural = synRole.cardinality == Multiple) } ctx diff --git a/diesel/shared/src/main/scala/diesel/voc/Verbalizer.scala b/diesel/shared/src/main/scala/diesel/voc/Verbalizer.scala index bcbd12a..e79e102 100644 --- a/diesel/shared/src/main/scala/diesel/voc/Verbalizer.scala +++ b/diesel/shared/src/main/scala/diesel/voc/Verbalizer.scala @@ -137,7 +137,7 @@ trait DefaultVerbalizer extends Verbalizer { verbalizable: Verbalizable ): Verbalization = { val label = - if (context.plural) { + if context.plural then { labelBuilder.getDisplayPluralLabel(context, verbalizable) } else { labelBuilder.getDisplayLabel(context, verbalizable) @@ -145,7 +145,7 @@ trait DefaultVerbalizer extends Verbalizer { val prepend = isRTLVerbalizer && shouldInsert(context.article) val builder = new StringBuilder() - if (prepend) { + if prepend then { builder.append(label) builder.append(' ') } @@ -156,22 +156,22 @@ trait DefaultVerbalizer extends Verbalizer { articleOffset = builder.length() articleLength = article.length builder.append(article) - if (!isRTLVerbalizer || shouldAddSpace(context.article)) { + if !isRTLVerbalizer || shouldAddSpace(context.article) then { builder.append(" ") } } - if (!prepend) { + if !prepend then { builder.append(label) } val text = builder.toString() val trimmedText = text.trim val index = text.indexOf(trimmedText) - if (index >= 0) { + if index >= 0 then { articleOffset -= Math.max(0, index) } - if (articleOffset + articleLength > trimmedText.length) { + if articleOffset + articleLength > trimmedText.length then { articleLength = trimmedText.length - articleOffset } Verbalization(trimmedText, articleOffset, articleLength) @@ -192,7 +192,7 @@ trait DefaultArticleBuilder extends ArticleBuilder { context: VerbalizationContext, verbalizable: Verbalizable ): Option[String] = { - if (context.plural) { + if context.plural then { getPluralArticle(context, verbalizable) } else { getSingularArticle(context, verbalizable) @@ -207,10 +207,10 @@ trait DefaultArticleBuilder extends ArticleBuilder { context: VerbalizationContext, verbalizable: Verbalizable ): Option[String] = { - if (context.article == NoArticle) { + if context.article == NoArticle then { None } else { - if (context.useTermProperties) { + if context.useTermProperties then { glossary.getTerm(verbalizable.label).flatMap { term => term.getTermPropertyValue(Glossary.getArticlePropertyName(context)) .filter(_ != "NO_ARTICLE") diff --git a/diesel/shared/src/main/scala/diesel/voc/VocDsl.scala b/diesel/shared/src/main/scala/diesel/voc/VocDsl.scala index 032ec0f..45ccab2 100644 --- a/diesel/shared/src/main/scala/diesel/voc/VocDsl.scala +++ b/diesel/shared/src/main/scala/diesel/voc/VocDsl.scala @@ -66,14 +66,14 @@ trait VocDsl extends Dsl { case Some(value) => sourcecode.Name(s"${value}-${key}") case None => sourcecode.Name(s"${key}") } - if (c.parentIds.isEmpty) { + if c.parentIds.isEmpty then { Seq(key -> concept[Ast.Expr](classTag[Ast.Expr], sourceName)) } else { // TODO multiple inheritance? val parent = c.parentIds.headOption - .map(DslConceptKey) + .map(DslConceptKey.apply) .flatMap(concepts.get) - if (parent.isDefined) { + if parent.isDefined then { Seq(key -> concept[Ast.Expr, Ast.Expr](parent.get)(classTag[Ast.Expr], sourceName)) } else { val created = c.parentIds.headOption.flatMap(lookup.get) @@ -103,7 +103,7 @@ trait VocDsl extends Dsl { VerbalizationContext(article = DefiniteArticle), dslConcepts )(mapPhrase(ft, s)) - if (s.syntacticRoles.last.cardinality == Multiple) { + if s.syntacticRoles.last.cardinality == Multiple then { phraseMultiple(dslResultConcept)(production) } else { phrase(dslResultConcept)(production) @@ -143,7 +143,7 @@ trait VocDsl extends Dsl { val vc = VerbalizationContext(article = DemonstrativeArticle) val text = verbalizer.verbalize(vc, ConceptVerbalizable(concept)) val words = text.trim().split(" ").map(t => SPStr(t)) - val production = if (words.length > 1) SPAndN(words.toSeq) else words(0) + val production = if words.length > 1 then SPAndN(words.toSeq) else words(0) syntax(dslResultConcept)(production map { case _ => Ast.SyntaxExpr("this", concept.identifier, multiple = false, Seq()) }) @@ -187,7 +187,7 @@ private object VocDslUtils { } override def processText(text: String): Unit = { - val words = text.trim().split(" ").map(TextPart) + val words = text.trim().split(" ").map(TextPart.apply) parts.appendAll(words) } } @@ -257,9 +257,9 @@ private object VocDslUtils { case (TextPart(t), index) => precedences.get(t) match { case Some(value) => - if (index == 0) { - if (parts.isDefinedAt(index + 1)) { - if (parts.apply(index + 1).isRole && parts.length == 2) { + if index == 0 then { + if parts.isDefinedAt(index + 1) then { + if parts.apply(index + 1).isRole && parts.length == 2 then { PPAssoc(PPStr(t), value._1, value._2) } else { PPStr(t) @@ -268,15 +268,15 @@ private object VocDslUtils { PPStr(t) } } else { - if (parts.apply(index - 1).isRole) { - if (parts.isDefinedAt(index + 1)) { - if (parts.apply(index + 1).isRole && parts.length == 3) { + if parts.apply(index - 1).isRole then { + if parts.isDefinedAt(index + 1) then { + if parts.apply(index + 1).isRole && parts.length == 3 then { PPAssoc(PPStr(t), value._1, value._2) } else { PPStr(t) } } else { - if (parts.length == 2) { + if parts.length == 2 then { PPAssoc(PPStr(t), value._1, value._2) } else { PPStr(t) @@ -293,7 +293,7 @@ private object VocDslUtils { PPStr(role.label.getOrElse("?")).subject case (ObjectRolePart(syntacticRole), _) => val ref = PPExprRef[T](useConcept(Some(syntacticRole), roles, dslConcepts)) - if (syntacticRole.cardinality == Multiple) { + if syntacticRole.cardinality == Multiple then { ref .multiple[T] // TODO ? diff --git a/diesel/shared/src/main/scala/diesel/voc/Vocabulary.scala b/diesel/shared/src/main/scala/diesel/voc/Vocabulary.scala index 511bd62..8a3af8d 100644 --- a/diesel/shared/src/main/scala/diesel/voc/Vocabulary.scala +++ b/diesel/shared/src/main/scala/diesel/voc/Vocabulary.scala @@ -193,7 +193,7 @@ object Glossary { getArticlePropertyName(context.article, context.plural) def getArticlePropertyName(article: Article, isPlural: Boolean): String = - s"${article.name}${if (isPlural) PLURAL_ARTICLE_SUFFIX else SINGULAR_ARTICLE_SUFFIX}" + s"${article.name}${if isPlural then PLURAL_ARTICLE_SUFFIX else SINGULAR_ARTICLE_SUFFIX}" def empty: Glossary = Glossary(Seq.empty) } diff --git a/diesel/shared/src/main/scala/diesel/voc/i18n/EnglishVerbalizer.scala b/diesel/shared/src/main/scala/diesel/voc/i18n/EnglishVerbalizer.scala index 434a250..47c3adc 100644 --- a/diesel/shared/src/main/scala/diesel/voc/i18n/EnglishVerbalizer.scala +++ b/diesel/shared/src/main/scala/diesel/voc/i18n/EnglishVerbalizer.scala @@ -66,7 +66,7 @@ class EnglishArticleBuilder(val voc: Vocabulary) extends DefaultArticleBuilder { None case IndefiniteArticle => val label = verbalizable.label - if (EnglishUtil.isVowel(label.charAt(0))) { + if EnglishUtil.isVowel(label.charAt(0)) then { Some("an") } else { Some("a") @@ -101,9 +101,9 @@ class EnglishArticleBuilder(val voc: Vocabulary) extends DefaultArticleBuilder { private def handlePartitive(res: Option[String], context: VerbalizationContext): Option[String] = res.map { r => - if (context.partitive) { + if context.partitive then { "of" + ( - if (r.nonEmpty) " " + r else r + if r.nonEmpty then " " + r else r ) } else { r @@ -129,7 +129,7 @@ class EnglishArticleBuilder(val voc: Vocabulary) extends DefaultArticleBuilder { val sentence = context.sentence val factType = sentence.flatMap(voc.getFactType) val owner = factType.flatMap(_.getOwnerRole).isDefined - if (owner) { + if owner then { val term = glossary.getTerm(verbalizable.label) term.flatMap(_.gender) .map { @@ -159,11 +159,11 @@ object EnglishPluralBuilder extends PluralBuilder { override def getPlural(context: VerbalizationContext, verbalizable: Verbalizable): String = { val label = verbalizable.label val size = label.length - if (size > 1) { + if size > 1 then { val lastChar = label.last lastChar match { case 'y' => - if (size >= 2 && !EnglishUtil.isVowel(label.charAt(size - 2))) { + if size >= 2 && !EnglishUtil.isVowel(label.charAt(size - 2)) then { label + "ies" } else { label + "s" diff --git a/diesel/shared/src/test/scala/diesel/AbortTest.scala b/diesel/shared/src/test/scala/diesel/AbortTest.scala index 561e5a8..615eb87 100644 --- a/diesel/shared/src/test/scala/diesel/AbortTest.scala +++ b/diesel/shared/src/test/scala/diesel/AbortTest.scala @@ -38,7 +38,7 @@ class AbortTest extends DslTestFunSuite { } test("left assoc expression") { - withAsts("1 + 2 + 3") { nav: Navigator => + withAsts("1 + 2 + 3") { (nav: Navigator) => val first = nav.next() assert(first.value == Add(Add(Constant(1), Constant(2)), Constant(3))) assert(first.markers.isEmpty) @@ -51,7 +51,7 @@ class AbortTest extends DslTestFunSuite { } test("precedence expression") { - withAsts("1 + 2 * 3 + 4") { nav: Navigator => + withAsts("1 + 2 * 3 + 4") { (nav: Navigator) => val first = nav.next() assert(first.value == Add( Add(Constant(1.0), Mul(Constant(2.0), Constant(3.0))), diff --git a/diesel/shared/src/test/scala/diesel/AmbiguityTest.scala b/diesel/shared/src/test/scala/diesel/AmbiguityTest.scala index eaa2d28..fd45c03 100644 --- a/diesel/shared/src/test/scala/diesel/AmbiguityTest.scala +++ b/diesel/shared/src/test/scala/diesel/AmbiguityTest.scala @@ -38,7 +38,7 @@ class AmbiguityTest extends DslTestFunSuite { } test("left assoc") { - withAsts("1 + 2 + 3") { nav: Navigator => + withAsts("1 + 2 + 3") { (nav: Navigator) => val first = nav.next() assert(first.value == Add(Add(Constant(1), Constant(2)), Constant(3))) assert(first.toSeq.exists(n => n.hasAmbiguity)) @@ -57,7 +57,7 @@ class AmbiguityTest extends DslTestFunSuite { } test("precedence") { - withAsts("1 + 2 * 3 + 4") { nav: Navigator => + withAsts("1 + 2 * 3 + 4") { (nav: Navigator) => val first = nav.next() assert(first.value == Add( Mul(Add(Constant(1.0), Constant(2.0)), Constant(3.0)), diff --git a/diesel/shared/src/test/scala/diesel/PreditionTest.scala b/diesel/shared/src/test/scala/diesel/PreditionTest.scala index a975010..920d08b 100644 --- a/diesel/shared/src/test/scala/diesel/PreditionTest.scala +++ b/diesel/shared/src/test/scala/diesel/PreditionTest.scala @@ -34,7 +34,7 @@ class PredictTest extends FunSuite { implicit val element: DslValue[String] = DslValue(MyPredictDsl.foo) - val nodeWithStringValue: GenericNode => Boolean = { n: GenericNode => + val nodeWithStringValue: GenericNode => Boolean = { (n: GenericNode) => n.value.isInstanceOf[String] } diff --git a/diesel/shared/src/test/scala/diesel/VerbalizationContextInDslTest.scala b/diesel/shared/src/test/scala/diesel/VerbalizationContextInDslTest.scala index 8d236ac..3da54f4 100644 --- a/diesel/shared/src/test/scala/diesel/VerbalizationContextInDslTest.scala +++ b/diesel/shared/src/test/scala/diesel/VerbalizationContextInDslTest.scala @@ -49,7 +49,7 @@ class VerbalizationContextInDslTest extends FunSuite { val void: Concept[AVoid] = concept val print: Phrase[AVoid] = phrase(void)( - pS("print") ~ pR(value) map [AVoid] { + pS("print") ~ pR(value) map { case (_, (_, s)) => APrint(s) } @@ -68,7 +68,7 @@ class VerbalizationContextInDslTest extends FunSuite { object MyDsl extends BootVoc { val pi: Phrase[ANumber] = phrase(number)( - pS("pi").subject map [ANumber] { + pS("pi").subject map { case (_, t) => Pi } @@ -114,7 +114,7 @@ class VerbalizationContextInDslTest extends FunSuite { "," ) ~ pR( number - ) ~ pS(")") map [ANumber] { + ) ~ pS(")") map { case (_, (_, _, l, _, r, _)) => // maps to user Ast type AMax(l, r) diff --git a/diesel/shared/src/test/scala/diesel/samples/Sql.scala b/diesel/shared/src/test/scala/diesel/samples/Sql.scala index fe0a90d..4ba415f 100644 --- a/diesel/shared/src/test/scala/diesel/samples/Sql.scala +++ b/diesel/shared/src/test/scala/diesel/samples/Sql.scala @@ -89,7 +89,7 @@ object Sql { val nullNotNullCrit: Syntax[FieldCrit] = syntax(fieldCrit)( "is" ~ "not".? ~ "null" map { case (_, (_, not, _)) => - not.map { _: Token => IsNotNull }.getOrElse(IsNull) + not.map { (_: Token) => IsNotNull }.getOrElse(IsNull) } ) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 0403920..e20e233 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -1,3 +1,4 @@ object Dependencies { - lazy val dieselI18nVersion = "LATEST-SNAPSHOT" + // lazy val dieselI18nVersion = "LATEST-SNAPSHOT" + lazy val dieselI18nVersion = "0.5.0+0-841f3dd5+20221123-1616-SNAPSHOT" } From decad65e69d51712c2e7df32d50ffabaff216e32 Mon Sep 17 00:00:00 2001 From: Frank Wagner Date: Thu, 24 Nov 2022 11:06:41 +0100 Subject: [PATCH 04/12] config fixes after merge --- .scalafmt.conf | 2 +- build.sbt | 46 +++++++++---------- diesel/shared/src/main/scala/diesel/Bnf.scala | 4 +- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index 8c9ca0e..e96cd4e 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,6 +1,6 @@ version = "3.5.3" -runner.dialect = scala213 +runner.dialect = scala3 preset=IntelliJ project.excludeFilters = ["metals.sbt"] diff --git a/build.sbt b/build.sbt index a1f727f..c130a1e 100644 --- a/build.sbt +++ b/build.sbt @@ -3,12 +3,12 @@ import sbtcrossproject.CrossPlugin.autoImport.crossProject import scala.sys.process._ -val scalaVersion2 = "2.13.10" -// val scalaVersion3 = "3.2.1" +// val scalaVersion2 = "2.13.10" +val scalaVersion3 = "3.2.1" lazy val commonSettings = Seq( organization := "com.ibm.cloud.diesel", - scalaVersion := scalaVersion2, + scalaVersion := scalaVersion3, versionScheme := Some("semver-spec"), description := "Diesel is a library for creating and using languages easily." ) @@ -81,25 +81,25 @@ lazy val sharedSettings_test = Seq( ) lazy val sharedSettings_lint = Seq( - addCompilerPlugin(scalafixSemanticdb), - ThisBuild / scalafixScalaBinaryVersion := CrossVersion.binaryScalaVersion(scalaVersion.value), - ThisBuild / semanticdbEnabled := true, - ThisBuild / semanticdbVersion := scalafixSemanticdb.revision + // addCompilerPlugin(scalafixSemanticdb), + // ThisBuild / scalafixScalaBinaryVersion := CrossVersion.binaryScalaVersion(scalaVersion.value), + ThisBuild / semanticdbEnabled := true + // ThisBuild / semanticdbVersion := scalafixSemanticdb.revision ) lazy val sharedJsSettings = Seq( - scalacOptions += { - val branch = - if (version.value.endsWith("SNAPSHOT")) { - "develop" - } else { - version.value - } - val local: String = baseDirectory.value.getParentFile.getParentFile.toURI.toString - val remote = s"https://raw.github.ibm.com/diesel/diesel/$branch/" - println(s"sourceURIs : \nLOCAL:$local\nREMOTE:$remote") - s"-P:scalajs:mapSourceURI:$local->$remote" - }, + // scalacOptions += { + // val branch = + // if (version.value.endsWith("SNAPSHOT")) { + // "develop" + // } else { + // version.value + // } + // val local: String = baseDirectory.value.getParentFile.getParentFile.toURI.toString + // val remote = s"https://raw.github.ibm.com/diesel/diesel/$branch/" + // println(s"sourceURIs : \nLOCAL:$local\nREMOTE:$remote") + // s"-P:scalajs:mapSourceURI:$local->$remote" + // } // for dependency: pine // libraryDependencies := libraryDependencies.value.filterNot(_.name == "scalajs-compiler"), // addCompilerPlugin("org.scala-js" % "scalajs-compiler" % scalaJSVersion cross CrossVersion.patch) @@ -119,10 +119,10 @@ lazy val diesel = crossProject(JSPlatform, JVMPlatform) .settings(sharedSettings_scalac) .settings( libraryDependencies ++= Seq( - "com.lihaoyi" %%% "sourcecode" % "0.3.0", - "com.ibm.cloud.diesel" %%% "diesel-i18n" % Dependencies.dieselI18nVersion, - scalaOrganization.value % "scala-reflect" % scalaVersion.value, - "org.scalameta" %%% "munit" % "1.0.0-M7" % Test + "com.lihaoyi" %%% "sourcecode" % "0.3.0", + "com.ibm.cloud.diesel" %%% "diesel-i18n" % Dependencies.dieselI18nVersion, + // scalaOrganization.value % "scala-reflect" % scalaVersion.value, + "org.scalameta" %%% "munit" % "1.0.0-M7" % Test ) ) .settings(sharedSettings_test) diff --git a/diesel/shared/src/main/scala/diesel/Bnf.scala b/diesel/shared/src/main/scala/diesel/Bnf.scala index 766118e..f0ae739 100644 --- a/diesel/shared/src/main/scala/diesel/Bnf.scala +++ b/diesel/shared/src/main/scala/diesel/Bnf.scala @@ -531,10 +531,10 @@ object Bnf { case Some(value) => value.name case None => "_" }},${plural match { - case Some(value) => if (value) "PLURAL" else "SINGULAR" + case Some(value) => if value then "PLURAL" else "SINGULAR" case None => "_" }},${partitive match { - case Some(value) => if (value) "PARTITIVE" else "NON-PARTITIVE" + case Some(value) => if value then "PARTITIVE" else "NON-PARTITIVE" case None => "_" }}" } From 15e9192dbc9a676e331672f2a67940b15c1aac51 Mon Sep 17 00:00:00 2001 From: Frank Wagner Date: Thu, 24 Nov 2022 16:02:36 +0100 Subject: [PATCH 05/12] fix implicit conversion signature confusion on syntax() --- diesel/shared/src/main/scala/diesel/Dsl.scala | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/diesel/shared/src/main/scala/diesel/Dsl.scala b/diesel/shared/src/main/scala/diesel/Dsl.scala index 0ce4b94..bcb5f7f 100644 --- a/diesel/shared/src/main/scala/diesel/Dsl.scala +++ b/diesel/shared/src/main/scala/diesel/Dsl.scala @@ -1083,13 +1083,12 @@ trait Dsl { } def syntax[T]( - concept: Concept[T], - expression: Boolean = true + concept: Concept[T] )(production: SyntaxProduction[T])(implicit name: sourcecode.Name): SyntaxTyped[T] = - addSyntax(SyntaxTyped(name.value, concept, expression, production)).asInstanceOf[SyntaxTyped[T]] + addSyntax(SyntaxTyped(name.value, concept, true, production)).asInstanceOf[SyntaxTyped[T]] - // def syntax[T](production: SyntaxProduction[T])(implicit name: sourcecode.Name): SyntaxUntyped[T] = - // addSyntax(SyntaxUntyped(name.value, production)).asInstanceOf[SyntaxUntyped[T]] + def syntax[T](production: SyntaxProduction[T])(implicit name: sourcecode.Name): SyntaxUntyped[T] = + addSyntax(SyntaxUntyped(name.value, production)).asInstanceOf[SyntaxUntyped[T]] def syntaxMultiple[T, T2](concept: Concept[T])(production: SyntaxProduction[T2])(implicit name: sourcecode.Name From 20781bff931a45f9a8bd9c44dda07a05e8c860d8 Mon Sep 17 00:00:00 2001 From: Frank Wagner Date: Thu, 24 Nov 2022 16:03:14 +0100 Subject: [PATCH 06/12] compiler rewrites --- .../main/scala/diesel/samples/feel/Evaluator.scala | 8 ++++---- .../src/main/scala/diesel/samples/feel/Feel.scala | 8 ++++---- .../src/main/scala/diesel/samples/glsl/Glsl.scala | 4 ++-- .../main/scala/diesel/samples/glsl/eval/Expr.scala | 10 +++++----- .../main/scala/diesel/samples/glsl/eval/Func.scala | 14 +++++++------- .../scala/diesel/samples/glsl/eval/GlslEval.scala | 2 +- .../scala/diesel/samples/glsl/eval/Scope.scala | 6 +++--- .../main/scala/diesel/samples/jsmodeldsl/Ast.scala | 8 ++++---- .../scala/diesel/samples/jsmodeldsl/BmdAst.scala | 2 +- .../scala/diesel/samples/jsmodeldsl/BmdDsl.scala | 2 +- .../diesel/samples/jsmodeldsl/JsModelDsl.scala | 8 ++++---- .../diesel/samples/jsmodeldsl/Validator.scala | 10 +++++----- .../src/test/scala/diesel/CustomScannerTest.scala | 4 ++-- .../src/test/scala/diesel/DslTestFunSuite.scala | 2 +- .../src/test/scala/diesel/MappedAxiomTest.scala | 4 ++-- .../diesel/VerbalizationContextInDslTest.scala | 1 + .../test/scala/diesel/styles/MyStyledDslTest.scala | 4 ++-- 17 files changed, 49 insertions(+), 48 deletions(-) diff --git a/diesel-samples/shared/src/main/scala/diesel/samples/feel/Evaluator.scala b/diesel-samples/shared/src/main/scala/diesel/samples/feel/Evaluator.scala index a21a117..10ddaf9 100644 --- a/diesel-samples/shared/src/main/scala/diesel/samples/feel/Evaluator.scala +++ b/diesel-samples/shared/src/main/scala/diesel/samples/feel/Evaluator.scala @@ -66,7 +66,7 @@ object Evaluator { object EBool { def apply(b: Boolean): EBool = - if (b) + if b then ETrue else EFalse @@ -129,7 +129,7 @@ object Evaluator { val variablesToDeclare = args match { case Left(positional) => // arg count must match - if (positional.size != definition.params.size) { + if positional.size != definition.params.size then { throw new UnsupportedOperationException("invalid arg list") } else { definition.params.map(_.n.s).zip(positional) @@ -207,7 +207,7 @@ object Evaluator { ??? case TEIf(IfExpression(cond, thenExpr, elseExpr)) => val c = eval(cond) - if (c.isTruthy) + if c.isTruthy then eval(thenExpr) else eval(elseExpr) @@ -361,7 +361,7 @@ object Evaluator { case SLString(l) => EStr(l.v) case SLBool(l) => - if (l.v) ETrue else EFalse + if l.v then ETrue else EFalse case SLDateTime(l) => ??? } diff --git a/diesel-samples/shared/src/main/scala/diesel/samples/feel/Feel.scala b/diesel-samples/shared/src/main/scala/diesel/samples/feel/Feel.scala index 676b324..524a744 100644 --- a/diesel-samples/shared/src/main/scala/diesel/samples/feel/Feel.scala +++ b/diesel-samples/shared/src/main/scala/diesel/samples/feel/Feel.scala @@ -33,9 +33,9 @@ class Feel extends Dsl with Identifiers with DynamicLexer { // regex matches : check in scope/keywords var i = 1 var m: Option[String] = None - while (i <= str.length()) { + while i <= str.length() do { val s = str.substring(0, i) - if (scope.contains(s) || keywords.contains(s)) { + if scope.contains(s) || keywords.contains(s) then { m = Some(s) } i = i + 1 @@ -46,7 +46,7 @@ class Feel extends Dsl with Identifiers with DynamicLexer { case None => val i = str.indexOf(" in") val r = - if (i != -1) { + if i != -1 then { str.substring(0, i) } else { str @@ -86,7 +86,7 @@ class Feel extends Dsl with Identifiers with DynamicLexer { case Some(x) => val i = x.indexOf(" in") val r = - if (i != -1) { + if i != -1 then { x.substring(0, i) } else { x diff --git a/diesel-samples/shared/src/main/scala/diesel/samples/glsl/Glsl.scala b/diesel-samples/shared/src/main/scala/diesel/samples/glsl/Glsl.scala index 3419357..03e3166 100644 --- a/diesel-samples/shared/src/main/scala/diesel/samples/glsl/Glsl.scala +++ b/diesel-samples/shared/src/main/scala/diesel/samples/glsl/Glsl.scala @@ -136,13 +136,13 @@ object Glsl extends Dsl with Identifiers with Comments { } val s_primary_expression_3: Instance[PrimaryExpression] = - instance(primary_expression)("true") map { c: Context => + instance(primary_expression)("true") map { (c: Context) => c.setStyle(Keyword) PrimBoolConstant(true) } val s_primary_expression_4: Instance[PrimaryExpression] = - instance(primary_expression)("false") map { c: Context => + instance(primary_expression)("false") map { (c: Context) => c.setStyle(Keyword) PrimBoolConstant(false) } diff --git a/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/Expr.scala b/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/Expr.scala index 0ba15d6..1d6b6c4 100644 --- a/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/Expr.scala +++ b/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/Expr.scala @@ -96,7 +96,7 @@ case class ENum(v: Double) extends EValue { } override def dash(): EValue = { - ENum(if (v == 0) 0 else -v) + ENum(if v == 0 then 0 else -v) } } @@ -109,10 +109,10 @@ object Vec { def mkValues(nbComponents: Int, values: Array[Double]): Array[Double] = { val buf: mutable.ArrayBuffer[Double] = mutable.ArrayBuffer() - for (i <- 0 until nbComponents) { + for i <- 0 until nbComponents do { buf.append( values( - if (values.length < nbComponents) { + if values.length < nbComponents then { 0 } else { i @@ -222,8 +222,8 @@ trait Vec extends EValue { val thisValues = values val otherValues = vec.values val newVals = mutable.ArrayBuffer[Double]() - for (i <- thisValues.indices) { - if (i < otherValues.length) { + for i <- thisValues.indices do { + if i < otherValues.length then { newVals.append(f(values(i), otherValues(i))) } else { newVals.append(values(i)) diff --git a/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/Func.scala b/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/Func.scala index 4aae25a..62f6bc9 100644 --- a/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/Func.scala +++ b/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/Func.scala @@ -32,7 +32,7 @@ case class GlslFunc(args: Seq[GlslArg], body: Option[StatementList]) extends Fun .map(statements => { // create a new scope and add all arguments into it val s = scope.push() - for ((arg, argIndex) <- args.zipWithIndex) { + for (arg, argIndex) <- args.zipWithIndex do { val argVal = arguments(argIndex) match { case ERef(name) => scope.find(name).get @@ -47,8 +47,8 @@ case class GlslFunc(args: Seq[GlslArg], body: Option[StatementList]) extends Fun // post-process out args by setting their // values in the parent scope - for ((arg, argIndex) <- args.zipWithIndex) { - if (arg.isOut) { + for (arg, argIndex) <- args.zipWithIndex do { + if arg.isOut then { arguments(argIndex) match { case ERef(parentScopeVarName) => // it's a ref : update in the parent scope... @@ -97,7 +97,7 @@ object BuiltInFunction { } def myCos: BuiltInFunction = BuiltInFunction((scope, exprs) => { - if (exprs.length == 1) { + if exprs.length == 1 then { exprs(0) match { case ERef(name) => val v = scope.find(name).get @@ -112,11 +112,11 @@ object BuiltInFunction { }) def myDot(values: Array[Double], values2: Array[Double]): EValue = { - if (values.length != values2.length) { + if values.length != values2.length then { throw new IllegalArgumentException("dot product must have arrays of same length") } var p: Double = 0 - for (i <- values.indices) { + for i <- values.indices do { p = p + values(i) * values2(i) } num(p) @@ -128,7 +128,7 @@ object BuiltInFunction { "vec4" -> vecN(4), "cos" -> myCos, "dot" -> BuiltInFunction((scope, exprs) => { - if (exprs.length != 2) { + if exprs.length != 2 then { throw new IllegalArgumentException("dot() needs 2 args") } myDot( diff --git a/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/GlslEval.scala b/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/GlslEval.scala index f007ff9..e1ba1f1 100644 --- a/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/GlslEval.scala +++ b/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/GlslEval.scala @@ -467,7 +467,7 @@ class GlslEval(var scope: Scope) { def eval(e: ConditionalExpression): Expr = { val r = eval(e.e) - if (e.rest.isDefined) { + if e.rest.isDefined then { throw new RuntimeException("TODO") } r diff --git a/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/Scope.scala b/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/Scope.scala index 46c3517..b3e27f6 100644 --- a/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/Scope.scala +++ b/diesel-samples/shared/src/main/scala/diesel/samples/glsl/eval/Scope.scala @@ -48,10 +48,10 @@ class Scope( def getFunctions: Map[String, Func] = functions.toMap def setValue(name: String, value: EValue): Unit = { - if (variables.contains(name)) { + if variables.contains(name) then { variables(name) = value } else { - if (parent.isDefined) { + if parent.isDefined then { parent.get.setValue(name, value) } else { throw new IllegalStateException(s"trying to set value of undeclared ${name}") @@ -74,7 +74,7 @@ object Scope { def initial(): Scope = { val s = new Scope() - for (f <- BuiltInFunction.builtInFunctions) { + for f <- BuiltInFunction.builtInFunctions do { s.declare(f._1, f._2) } s diff --git a/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/Ast.scala b/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/Ast.scala index 1e5d2c4..e15c116 100644 --- a/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/Ast.scala +++ b/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/Ast.scala @@ -78,9 +78,9 @@ case class JsModelDecl(root: Root, types: Seq[TypeDefinition] = Seq()) { def format: String = s"""root : ${formatTypeRef(root.rootType)}""" + - (if (types.isEmpty) "" else "\n\n") + + (if types.isEmpty then "" else "\n\n") + types.zipWithIndex.map(x => - formatTypeDefinition(x._1) + (if (x._2 < types.length - 1) "\n\n" else "") + formatTypeDefinition(x._1) + (if x._2 < types.length - 1 then "\n\n" else "") ).mkString private def formatDiscriminator(discriminator: Discriminator): String = @@ -100,7 +100,7 @@ case class JsModelDecl(root: Root, types: Seq[TypeDefinition] = Seq()) { formatDiscriminator ).getOrElse("") + " {\n" + attributes.map(a => - s" ${a.name}${if (a.optional) "?" else ""} : ${formatTypeRef(a.declaredType)}" + s" ${a.name}${if a.optional then "?" else ""} : ${formatTypeRef(a.declaredType)}" ).mkString( "\n" ) + @@ -109,7 +109,7 @@ case class JsModelDecl(root: Root, types: Seq[TypeDefinition] = Seq()) { s"domain ${name} [\n" + values.zipWithIndex.map { case (v, i) => - s""" "${v}"${if (i < values.size - 1) ",\n" else ""}""" + s""" "${v}"${if i < values.size - 1 then ",\n" else ""}""" }.mkString + "\n]" } diff --git a/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/BmdAst.scala b/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/BmdAst.scala index 65071cd..02f85e7 100644 --- a/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/BmdAst.scala +++ b/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/BmdAst.scala @@ -149,7 +149,7 @@ object GenericTreeUtil { } def debugTraceValue[T](title: String): T => T = { v => - println(title, v) + println(s"$title $v") v } diff --git a/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/BmdDsl.scala b/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/BmdDsl.scala index e669c1f..7a1f66a 100644 --- a/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/BmdDsl.scala +++ b/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/BmdDsl.scala @@ -122,7 +122,7 @@ case object BmdDsl extends Dsl with Identifiers with Comments { // with DynamicL val sExtendsDeclaration: Syntax[CustomType] = syntax( sSymbolRef map { case (ctx, isA) => - if (isA.text == "concept") { + if isA.text == "concept" then { ctx.abort() } CustomType(Offsets(isA.offset, isA.length), isA.text) diff --git a/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/JsModelDsl.scala b/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/JsModelDsl.scala index 1857843..b95cbaf 100644 --- a/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/JsModelDsl.scala +++ b/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/JsModelDsl.scala @@ -167,10 +167,10 @@ case object JsModelDsl extends Dsl with Identifiers with Comments with DynamicLe proposals.flatMap { p => p.element match { case Some(DslSyntax(syntax)) => - if (syntax.name == sCustomRef.name) { + if syntax.name == sCustomRef.name then { // pediction for a custom ref : list what we have ! model.types.map(td => CompletionProposal(p.element, td.name)) - } else if (syntax.name == sSuperClassName.name) { + } else if syntax.name == sSuperClassName.name then { val classDeclNode = node.flatMap(_.findFirstParent(_.value.isInstanceOf[ClassDeclaration])) classDeclNode @@ -183,9 +183,9 @@ case object JsModelDsl extends Dsl with Identifiers with Comments with DynamicLe .map(CompletionProposal(p.element, _)) } .getOrElse(Seq.empty) - } else if ( + } else if syntax.name == sAttrName.name || syntax.name == sClassName.name || syntax.name == sDomainName.name - ) { + then { Seq() } else { Seq(p) diff --git a/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/Validator.scala b/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/Validator.scala index 8094b9c..68fc065 100644 --- a/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/Validator.scala +++ b/diesel-samples/shared/src/main/scala/diesel/samples/jsmodeldsl/Validator.scala @@ -58,7 +58,7 @@ object Validator { override def validate(model: JsModelDecl): Seq[Marker] = { def checkDeclared(offsets: Offsets, name: String): Option[Marker] = - if (model.findClass(name).isDefined || model.findDomain(name).isDefined) + if model.findClass(name).isDefined || model.findDomain(name).isDefined then None else { Some(Marker( @@ -115,7 +115,7 @@ object Validator { ): Option[Marker] = { classDeclaration.superClass .flatMap { superClass => - if (superClass.name == classDeclaration.name) { + if superClass.name == classDeclaration.name then { Some(Marker( semanticError, superClass.offsets.offset, @@ -123,7 +123,7 @@ object Validator { "A class cannot extend itself" )) } else { - if (checked.contains(superClass.name)) { + if checked.contains(superClass.name) then { Some(Marker( semanticError, superClass.offsets.offset, @@ -168,7 +168,7 @@ object Validator { ) } val dMarker = - if (attrMarkers.isEmpty) + if attrMarkers.isEmpty then Seq.empty else { Seq( @@ -193,7 +193,7 @@ object Validator { model.classes.flatMap { classDeclaration => classDeclaration.discriminator match { case Some(DFieldValue(offsets, _)) => - if (classDeclaration.superClass.isEmpty) { + if classDeclaration.superClass.isEmpty then { Seq( Marker( Descriptor(Kind.Semantic, Severity.Warning), diff --git a/diesel/shared/src/test/scala/diesel/CustomScannerTest.scala b/diesel/shared/src/test/scala/diesel/CustomScannerTest.scala index f64bcb3..d11b099 100644 --- a/diesel/shared/src/test/scala/diesel/CustomScannerTest.scala +++ b/diesel/shared/src/test/scala/diesel/CustomScannerTest.scala @@ -31,11 +31,11 @@ class CustomScannerTest extends FunSuite { override def findPrefixOf(source: CharSequence): Option[String] = { var i = 0 var prefix = "" - while (i < source.length() && digits.contains(source.charAt(i))) { + while i < source.length() && digits.contains(source.charAt(i)) do { prefix += source.charAt(i) i = i + 1 } - if (prefix == "") + if prefix == "" then None else Some(prefix) diff --git a/diesel/shared/src/test/scala/diesel/DslTestFunSuite.scala b/diesel/shared/src/test/scala/diesel/DslTestFunSuite.scala index c4f27f2..ad3012b 100644 --- a/diesel/shared/src/test/scala/diesel/DslTestFunSuite.scala +++ b/diesel/shared/src/test/scala/diesel/DslTestFunSuite.scala @@ -91,7 +91,7 @@ abstract class DslTestFunSuite extends FunSuite { lines.filterNot(_.isEmpty)(0) } val oneLineTestName = - if (lines.length > 1) { firstLine + s"...(${trimmed.length} on ${lines.length} lines)" } + if lines.length > 1 then { firstLine + s"...(${trimmed.length} on ${lines.length} lines)" } else { trimmed } oneLineTestName } diff --git a/diesel/shared/src/test/scala/diesel/MappedAxiomTest.scala b/diesel/shared/src/test/scala/diesel/MappedAxiomTest.scala index 80b5753..7c82bad 100644 --- a/diesel/shared/src/test/scala/diesel/MappedAxiomTest.scala +++ b/diesel/shared/src/test/scala/diesel/MappedAxiomTest.scala @@ -26,14 +26,14 @@ object MappedAxiomDsl extends Dsl { val number: Concept[Int] = concept("\\d+".r, 0) map { (c, t) => val i = t.text.toInt - if (i > 999) { + if i > 999 then { c.addMarkers(Marker(Errors.SemanticError, c.offset, c.length, "Value is too high")) } i } val ax: Axiom[Num] = axiom(number) map { (c, i) => - if (i == 111) { + if i == 111 then { c.addMarkers(Marker(Errors.SemanticError, c.offset, c.length, "Zorba le grec")) } Num(i) diff --git a/diesel/shared/src/test/scala/diesel/VerbalizationContextInDslTest.scala b/diesel/shared/src/test/scala/diesel/VerbalizationContextInDslTest.scala index 3da54f4..35cf1e2 100644 --- a/diesel/shared/src/test/scala/diesel/VerbalizationContextInDslTest.scala +++ b/diesel/shared/src/test/scala/diesel/VerbalizationContextInDslTest.scala @@ -20,6 +20,7 @@ import diesel.Dsl._ import diesel.voc.i18n.EnglishVerbalizer import diesel.voc.{Concept => _, _} import munit.FunSuite +import scala.util.NotGiven class VerbalizationContextInDslTest extends FunSuite { diff --git a/diesel/shared/src/test/scala/diesel/styles/MyStyledDslTest.scala b/diesel/shared/src/test/scala/diesel/styles/MyStyledDslTest.scala index 9d13482..2cce426 100644 --- a/diesel/shared/src/test/scala/diesel/styles/MyStyledDslTest.scala +++ b/diesel/shared/src/test/scala/diesel/styles/MyStyledDslTest.scala @@ -49,8 +49,8 @@ class MyStyledDslTest extends DslTestFunSuite { val input = new Input("1 + pi") var res: (Lexer.Token, Seq[Any]) = lexer.nextWithStyles(input) val actualStyles = mutable.ArrayBuffer[StyledRange]() - while (res._1.id != Lexer.Eos) { - if (res._2.nonEmpty) + while res._1.id != Lexer.Eos do { + if res._2.nonEmpty then actualStyles.append(StyledRange( res._1.offset, res._1.text.length, From 5de5ed5efffb5209d2a94f11fc776e5e882eba36 Mon Sep 17 00:00:00 2001 From: Frank Wagner Date: Thu, 24 Nov 2022 16:15:18 +0100 Subject: [PATCH 07/12] stronger typing for DslTestFunSuite --- diesel/shared/src/test/scala/diesel/DslTestFunSuite.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/diesel/shared/src/test/scala/diesel/DslTestFunSuite.scala b/diesel/shared/src/test/scala/diesel/DslTestFunSuite.scala index ad3012b..3895e3f 100644 --- a/diesel/shared/src/test/scala/diesel/DslTestFunSuite.scala +++ b/diesel/shared/src/test/scala/diesel/DslTestFunSuite.scala @@ -20,9 +20,9 @@ import diesel.Dsl.Axiom import diesel.voc.{Verbalizer, VocDsl} import munit.FunSuite -abstract class DslTestFunSuite extends FunSuite { +abstract class DslTestFunSuite[D <: Dsl] extends FunSuite { - protected def dsl: Dsl + protected def dsl: D protected def axiom: Option[Axiom[_]] = None protected def verbalizer: Option[Verbalizer] = dsl match { case dslWithVoc: VocDsl => Some(dslWithVoc.verbalizer) From e89b8de47ca28a6579f66d876f27dc2a810d3b38 Mon Sep 17 00:00:00 2001 From: Frank Wagner Date: Thu, 24 Nov 2022 16:15:38 +0100 Subject: [PATCH 08/12] follow stronger typing --- .../src/test/scala/diesel/samples/feel/FeelEvalTest.scala | 2 +- .../src/test/scala/diesel/samples/feel/FeelFunSuite.scala | 2 +- .../shared/src/test/scala/diesel/samples/glsl/Glsl1Test.scala | 2 +- .../shared/src/test/scala/diesel/samples/glsl/Glsl2Test.scala | 2 +- .../src/test/scala/diesel/samples/glsl/GlslEvalTest.scala | 2 +- .../diesel/samples/jsmodeldsl/BmdDslValidationTest.scala | 2 +- .../scala/diesel/samples/jsmodeldsl/JsModelDslAstTest.scala | 4 ++-- .../diesel/samples/jsmodeldsl/JsModelDslValidationTest.scala | 2 +- .../src/test/scala/diesel/samples/sfeel/SFeelTest.scala | 4 ++-- diesel/shared/src/test/scala/diesel/AbortTest.scala | 2 +- diesel/shared/src/test/scala/diesel/AmbiguityTest.scala | 2 +- diesel/shared/src/test/scala/diesel/CalcTest.scala | 2 +- diesel/shared/src/test/scala/diesel/GenericSyntaxTest.scala | 2 +- diesel/shared/src/test/scala/diesel/InheritanceTest.scala | 2 +- diesel/shared/src/test/scala/diesel/MappedAxiomTest.scala | 2 +- diesel/shared/src/test/scala/diesel/SqlTest.scala | 2 +- diesel/shared/src/test/scala/diesel/UnrelatedTypesTest.scala | 2 +- .../shared/src/test/scala/diesel/samplestests/ExprTest.scala | 3 ++- .../scala/diesel/samplestests/SimpleDynamicLexerTest.scala | 2 +- .../shared/src/test/scala/diesel/styles/MyStyledDslTest.scala | 2 +- 20 files changed, 23 insertions(+), 22 deletions(-) diff --git a/diesel-samples/shared/src/test/scala/diesel/samples/feel/FeelEvalTest.scala b/diesel-samples/shared/src/test/scala/diesel/samples/feel/FeelEvalTest.scala index 699f3c9..d29c75f 100644 --- a/diesel-samples/shared/src/test/scala/diesel/samples/feel/FeelEvalTest.scala +++ b/diesel-samples/shared/src/test/scala/diesel/samples/feel/FeelEvalTest.scala @@ -21,7 +21,7 @@ import diesel.samples.feel.Ast.{Expression, _} import diesel.samples.feel.Evaluator._ import diesel.Dsl -class FeelEvalTest extends DslTestFunSuite { +class FeelEvalTest extends DslTestFunSuite[Feel] { override def dsl = new Feel override def axiom: Some[Dsl.Axiom[Expression]] = Some(dsl.a_expression) diff --git a/diesel-samples/shared/src/test/scala/diesel/samples/feel/FeelFunSuite.scala b/diesel-samples/shared/src/test/scala/diesel/samples/feel/FeelFunSuite.scala index 515885b..a4d63bc 100644 --- a/diesel-samples/shared/src/test/scala/diesel/samples/feel/FeelFunSuite.scala +++ b/diesel-samples/shared/src/test/scala/diesel/samples/feel/FeelFunSuite.scala @@ -18,7 +18,7 @@ package diesel.samples.feel import diesel.{DslTestFunSuite} -class FeelFunSuite extends DslTestFunSuite { +class FeelFunSuite extends DslTestFunSuite[Feel] { override def dsl = new Feel diff --git a/diesel-samples/shared/src/test/scala/diesel/samples/glsl/Glsl1Test.scala b/diesel-samples/shared/src/test/scala/diesel/samples/glsl/Glsl1Test.scala index 76a0898..af8d3ec 100644 --- a/diesel-samples/shared/src/test/scala/diesel/samples/glsl/Glsl1Test.scala +++ b/diesel-samples/shared/src/test/scala/diesel/samples/glsl/Glsl1Test.scala @@ -19,7 +19,7 @@ package diesel.samples.glsl import diesel.DslTestFunSuite import diesel.samples.glsl.Ast._ -class Glsl1Test extends DslTestFunSuite { +class Glsl1Test extends DslTestFunSuite[Glsl.type] { type Ast = TranslationUnit override def dsl: Glsl.type = Glsl diff --git a/diesel-samples/shared/src/test/scala/diesel/samples/glsl/Glsl2Test.scala b/diesel-samples/shared/src/test/scala/diesel/samples/glsl/Glsl2Test.scala index 0daf8a7..676077b 100644 --- a/diesel-samples/shared/src/test/scala/diesel/samples/glsl/Glsl2Test.scala +++ b/diesel-samples/shared/src/test/scala/diesel/samples/glsl/Glsl2Test.scala @@ -19,7 +19,7 @@ package diesel.samples.glsl import diesel.DslTestFunSuite import diesel.samples.glsl.Ast._ -class Glsl2Test extends DslTestFunSuite { +class Glsl2Test extends DslTestFunSuite[Glsl.type] { type Ast = TranslationUnit override def dsl: Glsl.type = Glsl diff --git a/diesel-samples/shared/src/test/scala/diesel/samples/glsl/GlslEvalTest.scala b/diesel-samples/shared/src/test/scala/diesel/samples/glsl/GlslEvalTest.scala index 9a1a40b..664dc0b 100644 --- a/diesel-samples/shared/src/test/scala/diesel/samples/glsl/GlslEvalTest.scala +++ b/diesel-samples/shared/src/test/scala/diesel/samples/glsl/GlslEvalTest.scala @@ -21,7 +21,7 @@ import diesel.samples.glsl.eval.Expr._ import diesel.samples.glsl.eval.{EValue, GlslEval, Scope} import diesel.{DslTestFunSuite, GenericTree} -class GlslEvalTest extends DslTestFunSuite { +class GlslEvalTest extends DslTestFunSuite[Glsl.type] { override def dsl = Glsl type Ast = Scope diff --git a/diesel-samples/shared/src/test/scala/diesel/samples/jsmodeldsl/BmdDslValidationTest.scala b/diesel-samples/shared/src/test/scala/diesel/samples/jsmodeldsl/BmdDslValidationTest.scala index e423971..6286409 100644 --- a/diesel-samples/shared/src/test/scala/diesel/samples/jsmodeldsl/BmdDslValidationTest.scala +++ b/diesel-samples/shared/src/test/scala/diesel/samples/jsmodeldsl/BmdDslValidationTest.scala @@ -20,7 +20,7 @@ import diesel.Marker.{Descriptor, Kind, Severity} import diesel.{DslTestFunSuite, Marker} import diesel.Dsl -class BmdDslValidationTest extends DslTestFunSuite { +class BmdDslValidationTest extends DslTestFunSuite[BmdDsl.type] { override def dsl = BmdDsl override def axiom: Some[Dsl.Axiom[JsModelDecl]] = Some(BmdDsl.aCompileUnit) diff --git a/diesel-samples/shared/src/test/scala/diesel/samples/jsmodeldsl/JsModelDslAstTest.scala b/diesel-samples/shared/src/test/scala/diesel/samples/jsmodeldsl/JsModelDslAstTest.scala index bbe6f28..b0ae8c5 100644 --- a/diesel-samples/shared/src/test/scala/diesel/samples/jsmodeldsl/JsModelDslAstTest.scala +++ b/diesel-samples/shared/src/test/scala/diesel/samples/jsmodeldsl/JsModelDslAstTest.scala @@ -18,9 +18,9 @@ package diesel.samples.jsmodeldsl import diesel.DslTestFunSuite -class JsModelDslAstTest extends DslTestFunSuite { +class JsModelDslAstTest extends DslTestFunSuite[JsModelDsl.type] { - override def dsl: JsModelDsl.type = JsModelDsl + override def dsl = JsModelDsl type Ast = JsModelDecl test("root") { diff --git a/diesel-samples/shared/src/test/scala/diesel/samples/jsmodeldsl/JsModelDslValidationTest.scala b/diesel-samples/shared/src/test/scala/diesel/samples/jsmodeldsl/JsModelDslValidationTest.scala index 30bd8c7..cdb00f8 100644 --- a/diesel-samples/shared/src/test/scala/diesel/samples/jsmodeldsl/JsModelDslValidationTest.scala +++ b/diesel-samples/shared/src/test/scala/diesel/samples/jsmodeldsl/JsModelDslValidationTest.scala @@ -19,7 +19,7 @@ package diesel.samples.jsmodeldsl import diesel.Marker.{Descriptor, Kind, Severity} import diesel.{DslTestFunSuite, Marker} -class JsModelDslValidationTest extends DslTestFunSuite { +class JsModelDslValidationTest extends DslTestFunSuite[JsModelDsl.type] { override def dsl = JsModelDsl diff --git a/diesel-samples/shared/src/test/scala/diesel/samples/sfeel/SFeelTest.scala b/diesel-samples/shared/src/test/scala/diesel/samples/sfeel/SFeelTest.scala index fc82838..4e650c0 100644 --- a/diesel-samples/shared/src/test/scala/diesel/samples/sfeel/SFeelTest.scala +++ b/diesel-samples/shared/src/test/scala/diesel/samples/sfeel/SFeelTest.scala @@ -20,7 +20,7 @@ import diesel.DslTestFunSuite import diesel.samples.sfeel.Ast._ import diesel.Dsl -class SFeelTest extends DslTestFunSuite { +class SFeelTest extends DslTestFunSuite[SFeel.type] { override def dsl: SFeel.type = SFeel override def axiom: Some[Dsl.Axiom[Expression]] = Some(dsl.a_expression) @@ -109,7 +109,7 @@ class SFeelTest extends DslTestFunSuite { } -class SFeelSimpleUnaryTestsTest extends DslTestFunSuite { +class SFeelSimpleUnaryTestsTest extends DslTestFunSuite[SFeel.type] { override def dsl: SFeel.type = SFeel type Ast = SimpleUnaryTests diff --git a/diesel/shared/src/test/scala/diesel/AbortTest.scala b/diesel/shared/src/test/scala/diesel/AbortTest.scala index 615eb87..107ce0c 100644 --- a/diesel/shared/src/test/scala/diesel/AbortTest.scala +++ b/diesel/shared/src/test/scala/diesel/AbortTest.scala @@ -20,7 +20,7 @@ import diesel.AstHelpers._ import diesel.samples.Abort import diesel.samples.Abort.{Add, Constant, Mul} -class AbortTest extends DslTestFunSuite { +class AbortTest extends DslTestFunSuite[Dsl] { type Ast = Abort.Expr override def dsl = Abort.MyDsl diff --git a/diesel/shared/src/test/scala/diesel/AmbiguityTest.scala b/diesel/shared/src/test/scala/diesel/AmbiguityTest.scala index fd45c03..ed1bb3c 100644 --- a/diesel/shared/src/test/scala/diesel/AmbiguityTest.scala +++ b/diesel/shared/src/test/scala/diesel/AmbiguityTest.scala @@ -20,7 +20,7 @@ import diesel.AstHelpers._ import diesel.samples.Ambiguity import diesel.samples.Ambiguity._ -class AmbiguityTest extends DslTestFunSuite { +class AmbiguityTest extends DslTestFunSuite[Dsl] { type Ast = Expr override def dsl = Ambiguity.MyDsl diff --git a/diesel/shared/src/test/scala/diesel/CalcTest.scala b/diesel/shared/src/test/scala/diesel/CalcTest.scala index 6c0e8ea..d8c49b3 100644 --- a/diesel/shared/src/test/scala/diesel/CalcTest.scala +++ b/diesel/shared/src/test/scala/diesel/CalcTest.scala @@ -21,7 +21,7 @@ import diesel.Bnf.{DslInstance, DslSyntax, DslValue} import diesel.samples.calc.Ast._ import diesel.samples.calc.MyDsl -class CalcTest extends DslTestFunSuite { +class CalcTest extends DslTestFunSuite[Dsl] { type Ast = Expr override def dsl: MyDsl.type = MyDsl diff --git a/diesel/shared/src/test/scala/diesel/GenericSyntaxTest.scala b/diesel/shared/src/test/scala/diesel/GenericSyntaxTest.scala index f1c570b..233f54b 100644 --- a/diesel/shared/src/test/scala/diesel/GenericSyntaxTest.scala +++ b/diesel/shared/src/test/scala/diesel/GenericSyntaxTest.scala @@ -19,7 +19,7 @@ package diesel import diesel.Dsl.{Axiom, Concept, Syntax, SyntaxGenericMulti} import diesel.Marker.{Descriptor, Kind, Severity} -class GenericSyntaxTest extends DslTestFunSuite { +class GenericSyntaxTest extends DslTestFunSuite[Dsl] { case class MyList[T](items: Seq[T]) type Result = Either[Int, String] diff --git a/diesel/shared/src/test/scala/diesel/InheritanceTest.scala b/diesel/shared/src/test/scala/diesel/InheritanceTest.scala index 46662ab..8fd5c61 100644 --- a/diesel/shared/src/test/scala/diesel/InheritanceTest.scala +++ b/diesel/shared/src/test/scala/diesel/InheritanceTest.scala @@ -19,7 +19,7 @@ package diesel import diesel.samples.InheritanceSample.Ast._ import diesel.samples.InheritanceSample._ -class InheritanceTest extends DslTestFunSuite { +class InheritanceTest extends DslTestFunSuite[Dsl] { type Ast = Ast.Value override def dsl = MyDsl diff --git a/diesel/shared/src/test/scala/diesel/MappedAxiomTest.scala b/diesel/shared/src/test/scala/diesel/MappedAxiomTest.scala index 7c82bad..03d57c4 100644 --- a/diesel/shared/src/test/scala/diesel/MappedAxiomTest.scala +++ b/diesel/shared/src/test/scala/diesel/MappedAxiomTest.scala @@ -41,7 +41,7 @@ object MappedAxiomDsl extends Dsl { } -class MappedAxiomTest extends DslTestFunSuite { +class MappedAxiomTest extends DslTestFunSuite[Dsl] { override def dsl = MappedAxiomDsl diff --git a/diesel/shared/src/test/scala/diesel/SqlTest.scala b/diesel/shared/src/test/scala/diesel/SqlTest.scala index 0787c15..99c689f 100644 --- a/diesel/shared/src/test/scala/diesel/SqlTest.scala +++ b/diesel/shared/src/test/scala/diesel/SqlTest.scala @@ -19,7 +19,7 @@ package diesel import diesel.samples.Sql.Ast._ import diesel.samples.Sql.Sql -class SqlTest extends DslTestFunSuite { +class SqlTest extends DslTestFunSuite[Dsl] { type Ast = Clause override def dsl = Sql diff --git a/diesel/shared/src/test/scala/diesel/UnrelatedTypesTest.scala b/diesel/shared/src/test/scala/diesel/UnrelatedTypesTest.scala index 0a2f983..1d6ebf1 100644 --- a/diesel/shared/src/test/scala/diesel/UnrelatedTypesTest.scala +++ b/diesel/shared/src/test/scala/diesel/UnrelatedTypesTest.scala @@ -19,7 +19,7 @@ package diesel import diesel.samples.UnrelatedTypes import diesel.samples.UnrelatedTypes.{Foo, RFoo, Root} -class UnrelatedTypesTest extends DslTestFunSuite { +class UnrelatedTypesTest extends DslTestFunSuite[Dsl] { type Ast = Root override def dsl = UnrelatedTypes.UnrelatedTypesDsl diff --git a/diesel/shared/src/test/scala/diesel/samplestests/ExprTest.scala b/diesel/shared/src/test/scala/diesel/samplestests/ExprTest.scala index d00b880..41cc42d 100644 --- a/diesel/shared/src/test/scala/diesel/samplestests/ExprTest.scala +++ b/diesel/shared/src/test/scala/diesel/samplestests/ExprTest.scala @@ -19,8 +19,9 @@ package diesel.samplestests import diesel.DslTestFunSuite import diesel.samples.Expr import diesel.samples.Expr._ +import diesel.Dsl -class ExprTest extends DslTestFunSuite { +class ExprTest extends DslTestFunSuite[Dsl] { type Ast = Expression override def dsl = Expr diff --git a/diesel/shared/src/test/scala/diesel/samplestests/SimpleDynamicLexerTest.scala b/diesel/shared/src/test/scala/diesel/samplestests/SimpleDynamicLexerTest.scala index 8fa3ccf..7419dba 100644 --- a/diesel/shared/src/test/scala/diesel/samplestests/SimpleDynamicLexerTest.scala +++ b/diesel/shared/src/test/scala/diesel/samplestests/SimpleDynamicLexerTest.scala @@ -37,7 +37,7 @@ object MyDsl extends Dsl with DynamicLexer { } -class MyTest extends DslTestFunSuite { +class MyTest extends DslTestFunSuite[Dsl] { type Ast = String override def dsl = MyDsl diff --git a/diesel/shared/src/test/scala/diesel/styles/MyStyledDslTest.scala b/diesel/shared/src/test/scala/diesel/styles/MyStyledDslTest.scala index 2cce426..154a7e7 100644 --- a/diesel/shared/src/test/scala/diesel/styles/MyStyledDslTest.scala +++ b/diesel/shared/src/test/scala/diesel/styles/MyStyledDslTest.scala @@ -22,7 +22,7 @@ import diesel.styles.MyStyledDsl.{Add, Constant, Keyword, Literal, Pi, Value} import scala.collection.mutable -class MyStyledDslTest extends DslTestFunSuite { +class MyStyledDslTest extends DslTestFunSuite[Dsl] { type Ast = MyStyledDsl.Expr override def dsl = MyStyledDsl From bed0949eec72fa495d06d7352a346cc1e8681f91 Mon Sep 17 00:00:00 2001 From: Frank Wagner Date: Thu, 24 Nov 2022 16:23:44 +0100 Subject: [PATCH 09/12] lint fix --- .../shared/src/main/scala/diesel/voc/SentenceProcessor.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/diesel/shared/src/main/scala/diesel/voc/SentenceProcessor.scala b/diesel/shared/src/main/scala/diesel/voc/SentenceProcessor.scala index 874322a..7e264fe 100644 --- a/diesel/shared/src/main/scala/diesel/voc/SentenceProcessor.scala +++ b/diesel/shared/src/main/scala/diesel/voc/SentenceProcessor.scala @@ -314,7 +314,8 @@ object SentenceProcessor { case None => context.copy(partitive = context.partitive && propagatePartitif) } - if context.getProperty(Vocabulary.Constants.NO_ARTICLE).exists(_.equalsIgnoreCase("TRUE")) then { + if context.getProperty(Vocabulary.Constants.NO_ARTICLE).exists(_.equalsIgnoreCase("TRUE")) + then { ctx = ctx.copy(article = NoArticle) } if From fbbb5b101062d640a56ff3bd8dbefb5ae2b4c66f Mon Sep 17 00:00:00 2001 From: Frank Wagner Date: Thu, 24 Nov 2022 17:56:25 +0100 Subject: [PATCH 10/12] fix dependency on diesel-i18n --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 64285fe..7c3054a 100644 --- a/build.sbt +++ b/build.sbt @@ -120,7 +120,7 @@ lazy val diesel = crossProject(JSPlatform, JVMPlatform) .settings( libraryDependencies ++= Seq( "com.lihaoyi" %%% "sourcecode" % "0.3.0", - "com.ibm.cloud.diesel" %%% "diesel-i18n" % Dependencies.dieselI18nVersion, + "com.ibm.cloud.diesel" %%% "diesel-i18n" % Dependencies.dieselI18nVersion cross (CrossVersion.for3Use2_13), // scalaOrganization.value % "scala-reflect" % scalaVersion.value, "org.scalameta" %%% "munit" % "1.0.0-M7" % Test ) From 6cc294ad615a96b8769fd08b58285c3261efa9ab Mon Sep 17 00:00:00 2001 From: Frank Wagner Date: Thu, 24 Nov 2022 17:56:47 +0100 Subject: [PATCH 11/12] map message key from sourcecode --- diesel/shared/src/main/scala/diesel/DieselI18n.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/diesel/shared/src/main/scala/diesel/DieselI18n.scala b/diesel/shared/src/main/scala/diesel/DieselI18n.scala index 58a7150..f87ec4f 100644 --- a/diesel/shared/src/main/scala/diesel/DieselI18n.scala +++ b/diesel/shared/src/main/scala/diesel/DieselI18n.scala @@ -18,8 +18,10 @@ package diesel import diesel.i18n.Messages.{Lang, Resolver} import diesel.i18n.{Lang, Loader, MessageFormat, Messages} +import diesel.i18n.MessageKey object DieselI18n extends Messages { + given m(using name: sourcecode.Name): MessageKey = MessageKey(name.value) val missingToken: Msg1[String] = msg1 val insertedToken: Msg1[String] = msg1 From 72a1df8d0ab17193ef23d2148d8363eaf8423e4e Mon Sep 17 00:00:00 2001 From: Frank Wagner Date: Fri, 25 Nov 2022 17:08:14 +0100 Subject: [PATCH 12/12] compile fix --- diesel/shared/src/main/scala/diesel/DieselI18n.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/diesel/shared/src/main/scala/diesel/DieselI18n.scala b/diesel/shared/src/main/scala/diesel/DieselI18n.scala index f87ec4f..5923cf7 100644 --- a/diesel/shared/src/main/scala/diesel/DieselI18n.scala +++ b/diesel/shared/src/main/scala/diesel/DieselI18n.scala @@ -18,10 +18,9 @@ package diesel import diesel.i18n.Messages.{Lang, Resolver} import diesel.i18n.{Lang, Loader, MessageFormat, Messages} -import diesel.i18n.MessageKey +import diesel.i18n.DeclaringSourceName.given object DieselI18n extends Messages { - given m(using name: sourcecode.Name): MessageKey = MessageKey(name.value) val missingToken: Msg1[String] = msg1 val insertedToken: Msg1[String] = msg1