diff --git a/k-distribution/tests/builtins/collections/test-set2list-2.col.out b/k-distribution/tests/builtins/collections/test-set2list-2.col.out index ff7f12e8d9b..e698f880343 100644 --- a/k-distribution/tests/builtins/collections/test-set2list-2.col.out +++ b/k-distribution/tests/builtins/collections/test-set2list-2.col.out @@ -1,6 +1,6 @@ - ListItem ( 1 ) - ListItem ( 2 ) + ListItem ( 4 ) ListItem ( 3 ) - ListItem ( 4 ) ~> . + ListItem ( 2 ) + ListItem ( 1 ) ~> . diff --git a/k-distribution/tests/builtins/collections/test-set2list-3.col.out b/k-distribution/tests/builtins/collections/test-set2list-3.col.out index af1ebe42178..42af7fc9c87 100644 --- a/k-distribution/tests/builtins/collections/test-set2list-3.col.out +++ b/k-distribution/tests/builtins/collections/test-set2list-3.col.out @@ -1,5 +1,5 @@ - ListItem ( 1 ) + ListItem ( 4 ) ListItem ( 3 ) - ListItem ( 4 ) ~> . + ListItem ( 1 ) ~> . diff --git a/kore/src/main/scala/org/kframework/attributes/Att.scala b/kore/src/main/scala/org/kframework/attributes/Att.scala index d3c3685d33f..f882997bd1e 100644 --- a/kore/src/main/scala/org/kframework/attributes/Att.scala +++ b/kore/src/main/scala/org/kframework/attributes/Att.scala @@ -414,11 +414,6 @@ object Att { val attMap = union.groupBy({ case ((name, _), _) => name}) Att(union.filter { key => attMap(key._1._1).size == 1 }.toMap) } - - implicit val ord: Ordering[Att] = { - import scala.math.Ordering.Implicits._ - Ordering.by[Att, Seq[(String, String, String)]](att => att.att.iterator.map(k => (k._1._1.key, k._1._2, k._2.toString)).toSeq.sorted) - } } trait AttributesToString { diff --git a/kore/src/main/scala/org/kframework/definition/outer.scala b/kore/src/main/scala/org/kframework/definition/outer.scala index 6931bc8914b..127bb54694c 100644 --- a/kore/src/main/scala/org/kframework/definition/outer.scala +++ b/kore/src/main/scala/org/kframework/definition/outer.scala @@ -414,66 +414,18 @@ trait Sentence extends HasLocation with HasAtt with AttValue { def label: Optional[String] = att.getOptional(Att.LABEL) } -object Sentence { - implicit val ord = new Ordering[Sentence] { - def compare(a: Sentence, b: Sentence): Int = { - (a, b) match { - case (c:SyntaxSort, d:SyntaxSort) => Ordering[SyntaxSort].compare(c, d) - case (c:SortSynonym, d:SortSynonym) => Ordering[SortSynonym].compare(c, d) - case (c:SyntaxLexical, d:SyntaxLexical) => Ordering[SyntaxLexical].compare(c, d) - case (c:Production, d:Production) => Ordering[Production].compare(c, d) - case (c:SyntaxAssociativity, d:SyntaxAssociativity) => Ordering[SyntaxAssociativity].compare(c, d) - case (c:SyntaxPriority, d:SyntaxPriority) => Ordering[SyntaxPriority].compare(c, d) - case (c:ContextAlias, d:ContextAlias) => Ordering[ContextAlias].compare(c, d) - case (c:Context, d:Context) => Ordering[Context].compare(c, d) - case (c:Rule, d:Rule) => Ordering[Rule].compare(c, d) - case (c:Claim, d:Claim) => Ordering[Claim].compare(c, d) - case (_:SyntaxSort, _) => -1 - case (_, _:SyntaxSort) => 1 - case (_:SortSynonym, _) => -1 - case (_, _:SortSynonym) => 1 - case (_:SyntaxLexical, _) => -1 - case (_, _:SyntaxLexical) => 1 - case (_:Production, _) => -1 - case (_, _:Production) => 1 - case (_:SyntaxAssociativity, _) => -1 - case (_, _:SyntaxAssociativity) => 1 - case (_:SyntaxPriority, _) => -1 - case (_, _:SyntaxPriority) => 1 - case (_:ContextAlias, _) => -1 - case (_, _:ContextAlias) => 1 - case (_:Context, _) => -1 - case (_, _:Context) => 1 - case (_:Rule, _) => -1 - case (_, _:Rule) => 1 - case (_:Claim, _) => -1 - case (_, _:Claim) => 1 - case (_, _) => throw KEMException.internalError("Cannot order these sentences:\n" + a.toString() + "\n" + b.toString()) - } - } - } -} - // deprecated case class Context(body: K, requires: K, att: Att = Att.empty) extends Sentence with OuterKORE with ContextToString { override val isSyntax = false override val isNonSyntax = true override def withAtt(att: Att) = Context(body, requires, att) } -object Context { - implicit val ord: Ordering[Context] = Ordering.by[Context, (K, K, Att)](s => (s.body, s.requires, s.att)) -} case class ContextAlias(body: K, requires: K, att: Att = Att.empty) extends Sentence with OuterKORE with ContextAliasToString { override val isSyntax = true override val isNonSyntax = false override def withAtt(att: Att) = ContextAlias(body, requires, att) } -object ContextAlias { - implicit val ord: Ordering[ContextAlias] = { - Ordering.by[ContextAlias, (K, K, Att)](s => (s.body, s.requires, s.att)) - } -} abstract class RuleOrClaim extends Sentence { def body: K @@ -489,11 +441,6 @@ case class Claim(body: K, requires: K, ensures: K, att: Att = Att.empty) extends override def newInstance(body: K, requires: K, ensures: K, att: Att = Att.empty): Claim = Claim(body, requires, ensures, att) } -object Claim { - implicit val ord: Ordering[Claim] = { - Ordering.by[Claim, (K, K, K, Att)](s => (s.body, s.requires, s.ensures, s.att)) - } -} case class Rule(body: K, requires: K, ensures: K, att: Att = Att.empty) extends RuleOrClaim with RuleToString with OuterKORE { override def withAtt(att: Att): Rule = Rule(body, requires, ensures, att) @@ -502,8 +449,18 @@ case class Rule(body: K, requires: K, ensures: K, att: Att = Att.empty) extends } object Rule { - implicit val ord: Ordering[Rule] = { - Ordering.by[Rule, (K, K, K, Att)](r => (r.body, r.requires, r.ensures, r.att)) + implicit val ord: Ordering[Rule] = new Ordering[Rule] { + def compare(a: Rule, b: Rule): Int = { + val c1 = Ordering[K].compare(a.body, b.body) + if (c1 == 0) { + val c2 = Ordering[K].compare(a.requires, b.requires) + if (c2 == 0) { + Ordering[K].compare(a.ensures, b.ensures) + } + c2 + } + c1 + } } } @@ -517,12 +474,6 @@ case class SyntaxPriority(priorities: Seq[Set[Tag]], att: Att = Att.empty) override val isNonSyntax = false override def withAtt(att: Att) = SyntaxPriority(priorities, att) } -object SyntaxPriority { - implicit val ord: Ordering[SyntaxPriority] = { - import scala.math.Ordering.Implicits._ - Ordering.by[SyntaxPriority, (Seq[Seq[Tag]], Att)](s => (s.priorities.map(_.toSeq.sorted), s.att)) - } -} case class SyntaxAssociativity( assoc: Associativity, @@ -533,19 +484,9 @@ case class SyntaxAssociativity( override val isNonSyntax = false override def withAtt(att: Att) = SyntaxAssociativity(assoc, tags, att) } -object SyntaxAssociativity { - implicit val ord: Ordering[SyntaxAssociativity] = { - import scala.math.Ordering.Implicits._ - Ordering.by[SyntaxAssociativity, (Associativity, Seq[Tag], Att)](s => (s.assoc, s.tags.toSeq.sorted, s.att)) - } -} case class Tag(name: String) extends TagToString with OuterKORE -object Tag { - implicit val ord: Ordering[Tag] = Ordering.by[Tag, String](_.name) -} - //trait Production { // def sort: Sort // def att: Att @@ -562,13 +503,6 @@ case class SyntaxSort(params: Seq[Sort], sort: Sort, att: Att = Att.empty) exten override val isNonSyntax = false override def withAtt(att: Att) = SyntaxSort(params, sort, att) } -object SyntaxSort { - implicit val ord: Ordering[SyntaxSort] = { - import scala.math.Ordering.Implicits._ - Ordering.by[SyntaxSort, (Seq[String], String, Att)](s => (s.params.map(_.name), s.sort.name, s.att)) - } -} - case class SortSynonym(newSort: Sort, oldSort: Sort, att: Att = Att.empty) extends Sentence with SortSynonymToString with OuterKORE { @@ -576,12 +510,6 @@ case class SortSynonym(newSort: Sort, oldSort: Sort, att: Att = Att.empty) exten override val isNonSyntax = false override def withAtt(att: Att) = SortSynonym(newSort, oldSort, att) } -object SortSynonym { - implicit val ord: Ordering[SortSynonym] = { - Ordering.by[SortSynonym, (String, String, Att)](s => (s.newSort.name, s.oldSort.name, s.att)) - } -} - case class SyntaxLexical(name: String, regex: String, att: Att = Att.empty) extends Sentence with SyntaxLexicalToString with OuterKORE { @@ -589,11 +517,6 @@ case class SyntaxLexical(name: String, regex: String, att: Att = Att.empty) exte override val isNonSyntax = false override def withAtt(att: Att) = SyntaxLexical(name, regex, att) } -object SyntaxLexical { - implicit val ord: Ordering[SyntaxLexical] = { - Ordering.by[SyntaxLexical, (String, String, Att)](s => (s.name, s.regex, s.att)) - } -} case class Production(klabel: Option[KLabel], params: Seq[Sort], sort: Sort, items: Seq[ProductionItem], att: Att) extends Sentence with ProductionToString { @@ -715,8 +638,10 @@ case class Production(klabel: Option[KLabel], params: Seq[Sort], sort: Sort, ite } object Production { - implicit val ord: Ordering[Production] = { - Ordering.by[Production, (Option[String], Att)](s => (s.klabel.map(_.name), s.att)) + implicit val ord: Ordering[Production] = new Ordering[Production] { + def compare(a: Production, b: Production): Int = { + Ordering[Option[String]].compare(a.klabel.map(_.name), b.klabel.map(_.name)) + } } def apply(klabel: KLabel, params: Seq[Sort], sort: Sort, items: Seq[ProductionItem], att: Att = Att.empty): Production = { diff --git a/kore/src/test/scala/org/kframework/definition/OuterTest.scala b/kore/src/test/scala/org/kframework/definition/OuterTest.scala index 54e9beb0399..c42cb6fa5d8 100644 --- a/kore/src/test/scala/org/kframework/definition/OuterTest.scala +++ b/kore/src/test/scala/org/kframework/definition/OuterTest.scala @@ -4,7 +4,6 @@ package org.kframework.definition import org.junit.{Assert, Test} import org.kframework.attributes.Att -import org.kframework.kore.ADT.KToken import org.kframework.kore.KORE.Sort import org.kframework.kore.KORE.KLabel @@ -91,153 +90,4 @@ class OuterTest { val prod2 = Production(Some(KLabel("foo")), Seq(), Sort("Foo"), Seq(), Att.empty.add(Att.KLABEL, "bar")) Assert.assertNotEquals(prod1, prod2) } - - // Create multiple versions of this sentence with attributes added - def toSentenceAttList(sentence: Sentence): List[Sentence] = { - val att1 = Att.empty.add(Att.ASSOC).add(Att.BAG) - val att2 = Att.empty.add(Att.ASSOC).add(Att.CELL) - val att3 = Att.empty.add(Att.BAG).add(Att.CELL) - val att4 = Att.empty.add(Att.BAG).add(Att.HOOK, "A") - val att5 = Att.empty.add(Att.BAG).add(Att.HOOK, "B") - val att6 = Att.empty.add(Att.BAG).add(Att.LABEL, "A") - val att7 = Att.empty.add(Att.BAG).add(Att.LABEL, "B") - val att8 = Att.empty.add(Att.HOOK, "A").add(Att.LABEL, "B") - val att9 = Att.empty.add(Att.HOOK, "B").add(Att.LABEL, "A") - val sentenceWithAtt1 = sentence.withAtt(att1) - val sentenceWithAtt2 = sentence.withAtt(att2) - val sentenceWithAtt3 = sentence.withAtt(att3) - val sentenceWithAtt4 = sentence.withAtt(att4) - val sentenceWithAtt5 = sentence.withAtt(att5) - val sentenceWithAtt6 = sentence.withAtt(att6) - val sentenceWithAtt7 = sentence.withAtt(att7) - val sentenceWithAtt8 = sentence.withAtt(att8) - val sentenceWithAtt9 = sentence.withAtt(att9) - - List(sentenceWithAtt1, - sentenceWithAtt2, - sentenceWithAtt3, - sentenceWithAtt4, - sentenceWithAtt5, - sentenceWithAtt6, - sentenceWithAtt7, - sentenceWithAtt8, - sentenceWithAtt9) - } - - // Asserts that S1 < S2 < ... < Sn - // Likewise, Sn > ... > S2 > S1 - // And Sx = Sx - def checkOrdering(sentences: List[Sentence]): Unit = { - val ord = Ordering[Sentence] - for (remaining <- sentences.tails.filter(_.nonEmpty)) { - val head = remaining.head - Assert.assertTrue(ord.compare(head, head) == 0) - for (sentence <- remaining.tail) { - Assert.assertTrue(ord.compare(head, sentence) < 0) - Assert.assertTrue(ord.compare(sentence, head) > 0) - } - } - } - - @Test def sentenceOrdering(): Unit = { - val sortA = Sort("A") - val sortB = Sort("B") - val sortC = Sort("C") - - val ktokenA = KToken("A", sortA) - val ktokenB = KToken("B", sortA) - val ktokenC = KToken("C", sortA) - - val tagA = Tag("A") - val tagB = Tag("B") - val tagC = Tag("C") - - val syntaxSort1 = SyntaxSort(Seq(sortA, sortC), sortA) - val syntaxSort2 = SyntaxSort(Seq(sortA, sortC), sortB) - val syntaxSort3 = SyntaxSort(Seq(sortB, sortC), sortA) - - val synonym1 = SortSynonym(sortA, sortA) - val synonym2 = SortSynonym(sortA, sortB) - val synonym3 = SortSynonym(sortB, sortC) - - val lexical1 = SyntaxLexical("A", "A") - val lexical2 = SyntaxLexical("A", "B") - val lexical3 = SyntaxLexical("B", "A") - - val production1 = Production(Seq(), sortA, Seq(), Att.empty) - val production2 = Production(KLabel("A"), Seq(), sortA, Seq(), Att.empty) - val production3 = Production(KLabel("B"), Seq(), sortA, Seq(), Att.empty) - - val syntaxAssoc1 = SyntaxAssociativity(Associativity.Left, Set(tagA)) - val syntaxAssoc2 = SyntaxAssociativity(Associativity.Left, Set(tagB)) - val syntaxAssoc3 = SyntaxAssociativity(Associativity.Right, Set(tagA)) - - val syntaxPriority1 = SyntaxPriority(Seq(Set(tagB, tagA))) - val syntaxPriority2 = SyntaxPriority(Seq(Set(tagA, tagB, tagC), Set(tagB))) - val syntaxPriority3 = SyntaxPriority(Seq(Set(tagA, tagB, tagC), Set(tagC))) - val syntaxPriority4 = SyntaxPriority(Seq(Set(tagA, tagC, tagC), Set(tagB))) - val syntaxPriority5 = SyntaxPriority(Seq(Set(tagB))) - - val contextAlias1 = ContextAlias(ktokenA, ktokenA) - val contextAlias2 = ContextAlias(ktokenA, ktokenB) - val contextAlias3 = ContextAlias(ktokenB, ktokenB) - - val context1 = Context(ktokenA, ktokenA) - val context2 = Context(ktokenA, ktokenB) - val context3 = Context(ktokenB, ktokenA) - - val rule1 = Rule(ktokenA, ktokenA, ktokenA) - val rule2 = Rule(ktokenA, ktokenA, ktokenB) - val rule3 = Rule(ktokenA, ktokenA, ktokenC) - val rule4 = Rule(ktokenA, ktokenB, ktokenA) - val rule5 = Rule(ktokenB, ktokenA, ktokenA) - - val claim1 = Claim(ktokenA, ktokenA, ktokenA) - val claim2 = Claim(ktokenA, ktokenA, ktokenB) - val claim3 = Claim(ktokenA, ktokenA, ktokenC) - val claim4 = Claim(ktokenA, ktokenB, ktokenA) - val claim5 = Claim(ktokenB, ktokenA, ktokenA) - - val sentenceList = List( - syntaxSort1, - syntaxSort2, - syntaxSort3, - synonym1, - synonym2, - synonym3, - lexical1, - lexical2, - lexical3, - production1, - production2, - production3, - syntaxAssoc1, - syntaxAssoc2, - syntaxAssoc3, - syntaxPriority1, - syntaxPriority2, - syntaxPriority3, - syntaxPriority4, - syntaxPriority5, - contextAlias1, - contextAlias2, - contextAlias3, - context1, - context2, - context3, - rule1, - rule2, - rule3, - rule4, - rule5, - claim1, - claim2, - claim3, - claim4, - claim5) - - val sentenceListWithAtts = sentenceList.flatMap(toSentenceAttList(_)) - - checkOrdering(sentenceListWithAtts) - } }