From 19175b88e9a61d3c197a4627aee270de49df5269 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Mon, 23 Mar 2015 22:38:17 +0100 Subject: implement enum support --- .../com/github/jodersky/mavlink/Generator.scala | 25 ++++++++++--- .../scala/com/github/jodersky/mavlink/Parser.scala | 3 +- .../com/github/jodersky/mavlink/StringUtils.scala | 42 ++++++++++++++++++++-- .../github/jodersky/mavlink/trees/package.scala | 2 +- .../main/twirl/org/mavlink/enums/enums.scala.txt | 14 ++++++++ 5 files changed, 77 insertions(+), 9 deletions(-) create mode 100644 mavlink-library/src/main/twirl/org/mavlink/enums/enums.scala.txt (limited to 'mavlink-library') diff --git a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala index 4f8b207..2aeb9de 100644 --- a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala +++ b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala @@ -12,6 +12,7 @@ import trees._ * @param dialect a specific MAVLink dialect for which to generate code */ class Generator(dialect: Dialect) { + import Generator._ lazy val maxPayloadLength = dialect.messages.map(_.length).max @@ -30,12 +31,26 @@ class Generator(dialect: Dialect) { def targets: List[Target] = { val context = Context(dialect.version) List( - Target("org/mavlink/Assembler.scala", () => org.mavlink.txt.Assembler(context).body), - Target("org/mavlink/Crc.scala", () => org.mavlink.txt.Crc(context).body), - Target("org/mavlink/Packet.scala", () => org.mavlink.txt.Packet(context, maxPayloadLength, extraCrcs).body), - Target("org/mavlink/Parser.scala", () => org.mavlink.txt.Parser(context).body), - Target("org/mavlink/messages/messages.scala", () => org.mavlink.messages.txt.messages(context, dialect.messages).body) + Target(targetFiles(0), () => org.mavlink.txt.Assembler(context).body), + Target(targetFiles(1), () => org.mavlink.txt.Crc(context).body), + Target(targetFiles(2), () => org.mavlink.txt.Packet(context, maxPayloadLength, extraCrcs).body), + Target(targetFiles(3), () => org.mavlink.txt.Parser(context).body), + Target(targetFiles(4), () => org.mavlink.messages.txt.messages(context, dialect.messages).body), + Target(targetFiles(5), () => org.mavlink.enums.txt.enums(context, dialect.enums).body) ) } +} + +object Generator { + + val targetFiles: Seq[String] = Array( + "org/mavlink/Assembler.scala", + "org/mavlink/Crc.scala", + "org/mavlink/Packet.scala", + "org/mavlink/Parser.scala", + "org/mavlink/messages/messages.scala", + "org/mavlink/enums/enums.scala" + ) + } \ No newline at end of file diff --git a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Parser.scala b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Parser.scala index ca1b772..3010121 100644 --- a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Parser.scala +++ b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Parser.scala @@ -44,6 +44,7 @@ class Parser(reporter: Reporter) { case {_*} => val name = (node \ "@name").map(_.text).headOption getOrElse fatal("no name defined for enum", node) + val description = (node \ "description").map(_.text).headOption getOrElse "" val entries = (node \ "entry").zipWithIndex map { case (n, i) => //FIXME: some official MAVLink dialects don't define values in enums @@ -59,7 +60,7 @@ class Parser(reporter: Reporter) { case _ => fatal("illegal definition in enum, only entries are allowed", n) } } - Enum(name, entries) + Enum(name, entries, description) case {_*} => val id = (node \ "@id").map(_.text).headOption map { str => diff --git a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/StringUtils.scala b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/StringUtils.scala index 38b87e7..29f262f 100644 --- a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/StringUtils.scala +++ b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/StringUtils.scala @@ -2,15 +2,53 @@ package com.github.jodersky.mavlink object StringUtils { + private final val Keywords = Set( + "class", + "object", + "trait", + "extends", + "type", + "import", + "package", + "val", + "var", + "def", + "implicit", + "private", + "protected", + "abstract", + "override", + "class", + "case", + "match", + "final", + "this", + "super", + "throw", + "catch", + "finally", + "if", + "else", + "for", + "while", + "do" + ) + + private def escape(str: String) = if (Keywords.contains(str)) { + "`" + str + "`" + } else { + str + } + def camelify(str: String) = { val lower = str.toLowerCase - "_([a-z\\d])".r.replaceAllIn(lower, {m => m.group(1).toUpperCase()}) + escape("_([a-z\\d])".r.replaceAllIn(lower, {m => m.group(1).toUpperCase()})) } def Camelify(str: String) = { val camel = camelify(str) val (head, tail) = camel.splitAt(1) - head.toUpperCase + tail + escape(head.toUpperCase + tail) } } \ No newline at end of file diff --git a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala index 75c1753..c1e2993 100644 --- a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala +++ b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala @@ -5,7 +5,7 @@ package trees { sealed trait Tree case class Dialect(version: String, enums: Set[Enum], messages: Set[Message]) extends Tree - case class Enum(name: String, entries: Seq[EnumEntry]) extends Tree + case class Enum(name: String, entries: Seq[EnumEntry], description: String) extends Tree case class EnumEntry(value: Int, name: String, description: String) extends Tree case class Field(tpe: Type, nativeType: String, name: String, enum: Option[String], description: String) extends Tree case class Message(id: Byte, name: String, description: String, fields: Seq[Field]) extends Tree { diff --git a/mavlink-library/src/main/twirl/org/mavlink/enums/enums.scala.txt b/mavlink-library/src/main/twirl/org/mavlink/enums/enums.scala.txt new file mode 100644 index 0000000..453ba2f --- /dev/null +++ b/mavlink-library/src/main/twirl/org/mavlink/enums/enums.scala.txt @@ -0,0 +1,14 @@ +@(__context: Context, __enums: Set[Enum])@org.mavlink.txt._header(__context) +package org.mavlink.enums + +@__commentParagraphs(paragraphs: Seq[String]) = {@paragraphs.mkString("/**\n * ", "\n * ", "\n */")} + +@for(__enum <- __enums) { +@__commentParagraphs(__enum.description.grouped(100).toList) +object @{StringUtils.Camelify(__enum.name)} { + @for(__entry <- __enum.entries) { + @__commentParagraphs(__entry.description.grouped(100).toList) + final val @{StringUtils.Camelify(__entry.name)}: Int = @__entry.value.toString + } +} +} -- cgit v1.2.3