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 @@ ...@@ -16,7 +16,7 @@
package djinni package djinni
import java.io.{IOException, FileInputStream, InputStreamReader, File, BufferedWriter, FileWriter} import java.io.{IOException, FileNotFoundException, FileInputStream, InputStreamReader, File, BufferedWriter, FileWriter}
import djinni.generatorTools._ import djinni.generatorTools._
...@@ -244,10 +244,10 @@ object Main { ...@@ -244,10 +244,10 @@ object Main {
None None
} }
val idl = try { val idl = try {
(new Parser).parseFile(idlFile, inFileListWriter) (new Parser(idlIncludePaths)).parseFile(idlFile, inFileListWriter)
} }
catch { catch {
case ex: IOException => case ex @ (_: FileNotFoundException | _: IOException) =>
System.err.println("Error reading from --idl file: " + ex.getMessage) System.err.println("Error reading from --idl file: " + ex.getMessage)
System.exit(1); return System.exit(1); return
} }
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
package djinni 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.Interface.Method
import djinni.ast.Record.DerivingType.DerivingType import djinni.ast.Record.DerivingType.DerivingType
...@@ -29,7 +29,7 @@ import scala.collection.mutable ...@@ -29,7 +29,7 @@ import scala.collection.mutable
import scala.util.parsing.combinator.RegexParsers import scala.util.parsing.combinator.RegexParsers
import scala.util.parsing.input.{Position, Positional} import scala.util.parsing.input.{Position, Positional}
case class Parser() { case class Parser(includePaths: List[String]) {
val visitedFiles = mutable.Set[File]() val visitedFiles = mutable.Set[File]()
val fileStack = mutable.Stack[File]() val fileStack = mutable.Stack[File]()
...@@ -37,23 +37,42 @@ val fileStack = mutable.Stack[File]() ...@@ -37,23 +37,42 @@ val fileStack = mutable.Stack[File]()
private object IdlParser extends RegexParsers { private object IdlParser extends RegexParsers {
override protected val whiteSpace = """[ \t\n\r]+""".r 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 idlFile(origin: String): Parser[IdlFile] = rep(importFileRef) ~ 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 importFileRef(): Parser[FileRef] = {
("@" ~> directive) ~ ("\"" ~> filePath <~ "\"") ^^ { ("@" ~> directive) ~ ("\"" ~> filePath <~ "\"") ^^ {
case "import" ~ x => case "import" ~ x => {
val newPath = fileParent + x new IdlFileRef(importFile(x))
new IdlFileRef(new File(newPath)) }
case "extern" ~ x => case "extern" ~ x => {
val newPath = fileParent + x new ExternFileRef(importFile(x))
new ExternFileRef(new File(newPath)) }
} }
} }
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 filePath = "[^\"]*".r
def fileParent(): String = {
if (fileStack.top.getParent() != null) fileStack.top.getParent() + "/" else ""
}
def directive = importDirective | externDirective def directive = importDirective | externDirective
def importDirective = "import".r def importDirective = "import".r
def externDirective = "extern".r def externDirective = "extern".r
......
@import "common.djinni" @import "common.djinni"
@import "date.djinni" @import "date.djinni"
@import "duration.djinni" @import "third-party/duration.djinni"
...@@ -17,5 +17,5 @@ djinni/single_language_interfaces.djinni ...@@ -17,5 +17,5 @@ djinni/single_language_interfaces.djinni
djinni/extended_record.djinni djinni/extended_record.djinni
djinni/date.djinni djinni/date.djinni
djinni/date.yaml djinni/date.yaml
djinni/duration.djinni ./djinni/vendor/third-party/duration.djinni
djinni/duration.yaml ./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