Commit c5b923f6 authored by Andrew Twyman's avatar Andrew Twyman Committed by GitHub

Merge pull request #252 from GreatCall-KayeK/kkaye/include-paths

Kkaye/include paths
parents 6a497f5c a440560c
......@@ -8,10 +8,10 @@
</extension>
<option name="MAIN_CLASS_NAME" value="djinni.Main" />
<option name="VM_PARAMETERS" value="" />
<option name="PROGRAM_PARAMETERS" value="--java-out djinni-output-temp/java --java-package com.dropbox.djinni.test --java-nullable-annotation &quot;javax.annotation.CheckForNull&quot; --java-nonnull-annotation &quot;javax.annotation.Nonnull&quot; --ident-java-field mFooBar --cpp-out djinni-output-temp/cpp --cpp-namespace testsuite --ident-cpp-enum-type foo_bar --cpp-optional-template &quot;std::experimental::optional&quot; --cpp-optional-header &quot;&lt;experimental/optional&gt;&quot; --jni-out djinni-output-temp/jni --ident-jni-class NativeFooBar --ident-jni-file NativeFooBar --objc-out djinni-output-temp/objc --objcpp-out djinni-output-temp/objc --objc-type-prefix DB --list-in-files generated-src/inFileList.txt --list-out-files generated-src/outFileList.txt --yaml-out djinni-output-temp/yaml --yaml-out-file &quot;yaml-test.yaml&quot; --yaml-prefix &quot;test_&quot; --idl djinni/all.djinni" />
<option name="PROGRAM_PARAMETERS" value="--java-out djinni-output-temp/java --java-package com.dropbox.djinni.test --java-nullable-annotation &quot;javax.annotation.CheckForNull&quot; --java-nonnull-annotation &quot;javax.annotation.Nonnull&quot; --ident-java-field mFooBar --cpp-out djinni-output-temp/cpp --cpp-namespace testsuite --ident-cpp-enum-type foo_bar --cpp-optional-template &quot;std::experimental::optional&quot; --cpp-optional-header &quot;&lt;experimental/optional&gt;&quot; --jni-out djinni-output-temp/jni --ident-jni-class NativeFooBar --ident-jni-file NativeFooBar --objc-out djinni-output-temp/objc --objcpp-out djinni-output-temp/objc --objc-type-prefix DB --list-in-files generated-src/inFileList.txt --list-out-files generated-src/outFileList.txt --yaml-out djinni-output-temp/yaml --yaml-out-file &quot;yaml-test.yaml&quot; --yaml-prefix &quot;test_&quot; --idl djinni/all.djinni --idl-include-path djinni/vendor" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/../test-suite" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="ENABLE_SWING_INSPECTOR" value="false" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
......
......@@ -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._
......@@ -24,6 +24,7 @@ object Main {
def main(args: Array[String]) {
var idlFile: File = null
var idlIncludePaths: List[String] = List("")
var cppOutFolder: Option[File] = None
var cppNamespace: String = ""
var cppIncludePrefix: String = ""
......@@ -95,6 +96,8 @@ object Main {
help("help")
opt[File]("idl").valueName("<in-file>").required().foreach(idlFile = _)
.text("The IDL file with the type definitions, typically with extension \".djinni\".")
opt[String]("idl-include-path").valueName("<path> ...").optional().unbounded().foreach(x => idlIncludePaths = idlIncludePaths :+ x)
.text("An include path to search for Djinni @import directives. Can specify multiple paths.")
note("")
opt[File]("java-out").valueName("<out-folder>").foreach(x => javaOutFolder = Some(x))
.text("The output for the Java files (Generator disabled if unspecified).")
......@@ -248,10 +251,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
......@@ -26,10 +26,11 @@ import java.util.{Map => JMap}
import org.yaml.snakeyaml.Yaml
import scala.collection.JavaConversions._
import scala.collection.mutable
import scala.util.control.Breaks._
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,21 +38,35 @@ 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
val path = includePaths.find(path => {
val relPath = if (path.isEmpty) fileStack.top.getParent() else path
val tmp = new File(relPath, fileName)
val exists = tmp.exists
if (exists) file = Some(tmp)
exists
})
if (file.isEmpty) throw new FileNotFoundException("Unable to find file \"" + fileName + "\" at " + fileStack.top.getCanonicalPath)
return file.get
}
def filePath = "[^\"]*".r
def directive = importDirective | externDirective
......
@import "common.djinni"
@import "date.djinni"
@import "duration.djinni"
@import "vendor/third-party/date.djinni"
@import "third-party/duration.djinni"
......@@ -17,7 +17,7 @@ djinni/single_language_interfaces.djinni
djinni/extended_record.djinni
djinni/varnames.djinni
djinni/relative_paths.djinni
djinni/date.djinni
djinni/date.yaml
djinni/duration.djinni
djinni/duration.yaml
djinni/vendor/third-party/date.djinni
djinni/vendor/third-party/date.yaml
djinni/vendor/third-party/duration.djinni
djinni/vendor/third-party/duration.yaml
......@@ -123,6 +123,7 @@ fi
--yaml-prefix "test_" \
\
--idl "$in_relative" \
--idl-include-path "djinni/vendor" \
)
# Make sure we can parse back our own generated YAML file
......
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