Commit 1ee7a554 authored by Kenny Kaye's avatar Kenny Kaye

Resolve import and extern based on include provided include path

parent 64a9d3aa
......@@ -16,7 +16,7 @@
package djinni
import java.io.{IOException, FileInputStream, InputStreamReader, File, BufferedWriter, FileWriter}
import java.io.{IOException, FileNotFoundException, FileInputStream, InputStreamReader, File, BufferedWriter, FileWriter}
import djinni.generatorTools._
......@@ -244,10 +244,10 @@ object Main {
None
}
val idl = try {
(new Parser).parseFile(idlFile, inFileListWriter)
(new Parser(idlIncludePaths)).parseFile(idlFile, inFileListWriter)
}
catch {
case ex: IOException =>
case ex @ (_: FileNotFoundException | _: IOException) =>
System.err.println("Error reading from --idl file: " + ex.getMessage)
System.exit(1); return
}
......
......@@ -16,7 +16,7 @@
package djinni
import java.io.{File, InputStreamReader, FileInputStream, Writer}
import java.io.{File, FileNotFoundException, InputStreamReader, FileInputStream, Writer}
import djinni.ast.Interface.Method
import djinni.ast.Record.DerivingType.DerivingType
......@@ -29,7 +29,7 @@ import scala.collection.mutable
import scala.util.parsing.combinator.RegexParsers
import scala.util.parsing.input.{Position, Positional}
case class Parser() {
case class Parser(includePaths: List[String]) {
val visitedFiles = mutable.Set[File]()
val fileStack = mutable.Stack[File]()
......@@ -37,23 +37,42 @@ val fileStack = mutable.Stack[File]()
private object IdlParser extends RegexParsers {
override protected val whiteSpace = """[ \t\n\r]+""".r
def idlFile(origin: String): Parser[IdlFile] = rep(importFile) ~ rep(typeDecl(origin)) ^^ { case imp~types => IdlFile(imp, types) }
def importFile: Parser[FileRef] = {
def fileParent:String = if (fileStack.top.getParent() != null) return fileStack.top.getParent() + "/" else return ""
def idlFile(origin: String): Parser[IdlFile] = rep(importFileRef) ~ rep(typeDecl(origin)) ^^ { case imp~types => IdlFile(imp, types) }
def importFileRef(): Parser[FileRef] = {
("@" ~> directive) ~ ("\"" ~> filePath <~ "\"") ^^ {
case "import" ~ x =>
val newPath = fileParent + x
new IdlFileRef(new File(newPath))
case "extern" ~ x =>
val newPath = fileParent + x
new ExternFileRef(new File(newPath))
case "import" ~ x => {
new IdlFileRef(importFile(x))
}
case "extern" ~ x => {
new ExternFileRef(importFile(x))
}
}
}
def importFile(fileName: String): File = {
var file: Option[File] = None
includePaths.foreach(path => {
if (file.isEmpty) {
var relPath = if (path == ".") fileParent else path + "/"
val tmp = new File(relPath + fileName);
if (tmp.exists)
file = Some(tmp)
}
})
if (file.isEmpty) throw new FileNotFoundException("Unable to find file \"" + fileName + "\" at " + fileStack.top.getCanonicalPath)
return file.get
}
def filePath = "[^\"]*".r
def fileParent(): String = {
if (fileStack.top.getParent() != null) fileStack.top.getParent() + "/" else ""
}
def directive = importDirective | externDirective
def importDirective = "import".r
def externDirective = "extern".r
......
@import "common.djinni"
@import "date.djinni"
@import "duration.djinni"
@import "third-party/duration.djinni"
......@@ -17,5 +17,5 @@ djinni/single_language_interfaces.djinni
djinni/extended_record.djinni
djinni/date.djinni
djinni/date.yaml
djinni/duration.djinni
djinni/duration.yaml
./djinni/vendor/third-party/duration.djinni
./djinni/vendor/third-party/duration.yaml
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment