Commit a656d150 authored by Andrew Twyman's avatar Andrew Twyman

Merge pull request #203 from guycnicholas/feature_184_take_3

Configurable paths for extended record headers.
*** POTENTIAL BREAKING CHANGE ***
If you're using extended records, you may need to pass these two command-line arguments to Djinni to maintain the old behavior:
--cpp-extended-record-include-prefix "../"
--objc-extended-record-include-prefix "../"
parents b3beb0e2 1725d321
...@@ -146,7 +146,7 @@ class CppGenerator(spec: Spec) extends Generator(spec) { ...@@ -146,7 +146,7 @@ class CppGenerator(spec: Spec) extends Generator(spec) {
// Requiring the extended class // Requiring the extended class
if (r.ext.cpp) { if (r.ext.cpp) {
refs.cpp.add("#include "+q("../" + spec.cppFileIdentStyle(ident) + "." + spec.cppHeaderExt)) refs.cpp.add("#include "+q(spec.cppExtendedRecordIncludePrefix + spec.cppFileIdentStyle(ident) + "." + spec.cppHeaderExt))
} }
// C++ Header // C++ Header
......
...@@ -27,6 +27,7 @@ object Main { ...@@ -27,6 +27,7 @@ object Main {
var cppOutFolder: Option[File] = None var cppOutFolder: Option[File] = None
var cppNamespace: String = "" var cppNamespace: String = ""
var cppIncludePrefix: String = "" var cppIncludePrefix: String = ""
var cppExtendedRecordIncludePrefix: String = ""
var cppFileIdentStyle: IdentConverter = IdentStyle.underLower var cppFileIdentStyle: IdentConverter = IdentStyle.underLower
var cppOptionalTemplate: String = "std::optional" var cppOptionalTemplate: String = "std::optional"
var cppOptionalHeader: String = "<optional>" var cppOptionalHeader: String = "<optional>"
...@@ -62,6 +63,7 @@ object Main { ...@@ -62,6 +63,7 @@ object Main {
var objcIdentStyle = IdentStyle.objcDefault var objcIdentStyle = IdentStyle.objcDefault
var objcTypePrefix: String = "" var objcTypePrefix: String = ""
var objcIncludePrefix: String = "" var objcIncludePrefix: String = ""
var objcExtendedRecordIncludePrefix: String = ""
var objcppIncludePrefix: String = "" var objcppIncludePrefix: String = ""
var objcppIncludeCppPrefix: String = "" var objcppIncludeCppPrefix: String = ""
var objcppIncludeObjcPrefixOptional: Option[String] = None var objcppIncludeObjcPrefixOptional: Option[String] = None
...@@ -161,6 +163,10 @@ object Main { ...@@ -161,6 +163,10 @@ object Main {
.text("The prefix for #include of the main C++ header files from Objective-C++ files.") .text("The prefix for #include of the main C++ header files from Objective-C++ files.")
opt[String]("objcpp-include-objc-prefix").valueName("<prefix>").foreach(x => objcppIncludeObjcPrefixOptional = Some(x)) opt[String]("objcpp-include-objc-prefix").valueName("<prefix>").foreach(x => objcppIncludeObjcPrefixOptional = Some(x))
.text("The prefix for #import of the Objective-C header files from Objective-C++ files (default: the same as --objcpp-include-prefix)") .text("The prefix for #import of the Objective-C header files from Objective-C++ files (default: the same as --objcpp-include-prefix)")
opt[String]("cpp-extended-record-include-prefix").valueName("<prefix>").foreach(cppExtendedRecordIncludePrefix = _)
.text("The prefix path for #include of the extended record C++ header (.hpp) files")
opt[String]("objc-extended-record-include-prefix").valueName("<prefix>").foreach(objcExtendedRecordIncludePrefix = _)
.text("The prefix path for #import of the extended record Objective-C header (.h) files")
opt[String]("objcpp-namespace").valueName("<prefix>").foreach(objcppNamespace = _) opt[String]("objcpp-namespace").valueName("<prefix>").foreach(objcppNamespace = _)
.text("The namespace name to use for generated Objective-C++ classes.") .text("The namespace name to use for generated Objective-C++ classes.")
opt[String]("objc-base-lib-include-prefix").valueName("...").foreach(x => objcBaseLibIncludePrefix = x) opt[String]("objc-base-lib-include-prefix").valueName("...").foreach(x => objcBaseLibIncludePrefix = x)
...@@ -273,6 +279,7 @@ object Main { ...@@ -273,6 +279,7 @@ object Main {
cppOutFolder, cppOutFolder,
cppHeaderOutFolder, cppHeaderOutFolder,
cppIncludePrefix, cppIncludePrefix,
cppExtendedRecordIncludePrefix,
cppNamespace, cppNamespace,
cppIdentStyle, cppIdentStyle,
cppFileIdentStyle, cppFileIdentStyle,
...@@ -299,6 +306,7 @@ object Main { ...@@ -299,6 +306,7 @@ object Main {
objcppExt, objcppExt,
objcHeaderExt, objcHeaderExt,
objcIncludePrefix, objcIncludePrefix,
objcExtendedRecordIncludePrefix,
objcppIncludePrefix, objcppIncludePrefix,
objcppIncludeCppPrefix, objcppIncludeCppPrefix,
objcppIncludeObjcPrefix, objcppIncludeObjcPrefix,
......
...@@ -178,7 +178,7 @@ class ObjcGenerator(spec: Spec) extends Generator(spec) { ...@@ -178,7 +178,7 @@ class ObjcGenerator(spec: Spec) extends Generator(spec) {
val self = marshal.typename(objcName, r) val self = marshal.typename(objcName, r)
refs.header.add("#import <Foundation/Foundation.h>") refs.header.add("#import <Foundation/Foundation.h>")
refs.body.add("!#import " + q(spec.objcIncludePrefix + (if (r.ext.objc) "../" else "") + marshal.headerName(ident))) refs.body.add("!#import " + q((if (r.ext.objc) spec.objcExtendedRecordIncludePrefix else spec.objcIncludePrefix) + marshal.headerName(ident)))
if (r.ext.objc) { if (r.ext.objc) {
refs.header.add(s"@class $noBaseSelf;") refs.header.add(s"@class $noBaseSelf;")
......
...@@ -66,8 +66,8 @@ class ObjcMarshal(spec: Spec) extends Marshal(spec) { ...@@ -66,8 +66,8 @@ class ObjcMarshal(spec: Spec) extends Marshal(spec) {
} }
case DRecord => case DRecord =>
val r = d.body.asInstanceOf[Record] val r = d.body.asInstanceOf[Record]
val prefix = if (r.ext.objc) "../" else "" val prefix = if (r.ext.objc) spec.objcExtendedRecordIncludePrefix else spec.objcIncludePrefix
List(ImportRef(q(spec.objcIncludePrefix + prefix + headerName(d.name)))) List(ImportRef(q(prefix + headerName(d.name))))
} }
case e: MExtern => List(ImportRef(e.objc.header)) case e: MExtern => List(ImportRef(e.objc.header))
case p: MParam => List() case p: MParam => List()
......
...@@ -302,8 +302,8 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) { ...@@ -302,8 +302,8 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) {
val noBaseSelf = objcMarshal.typename(ident, r) // Used for constant names val noBaseSelf = objcMarshal.typename(ident, r) // Used for constant names
val cppSelf = cppMarshal.fqTypename(ident, r) val cppSelf = cppMarshal.fqTypename(ident, r)
refs.privHeader.add("!#import " + q(spec.objcppIncludeObjcPrefix + (if(r.ext.objc) "../" else "") + headerName(ident))) refs.privHeader.add("!#import " + q((if(r.ext.objc) spec.objcExtendedRecordIncludePrefix else spec.objcppIncludeObjcPrefix) + headerName(ident)))
refs.privHeader.add("!#include " + q(spec.objcppIncludeCppPrefix + (if(r.ext.cpp) "../" else "") + spec.cppFileIdentStyle(ident) + "." + spec.cppHeaderExt)) refs.privHeader.add("!#include " + q((if(r.ext.cpp) spec.cppExtendedRecordIncludePrefix else spec.objcppIncludeCppPrefix) + spec.cppFileIdentStyle(ident) + "." + spec.cppHeaderExt))
refs.body.add("#include <cassert>") refs.body.add("#include <cassert>")
refs.body.add("!#import " + q(spec.objcppIncludePrefix + objcppMarshal.privateHeaderName(objcName))) refs.body.add("!#import " + q(spec.objcppIncludePrefix + objcppMarshal.privateHeaderName(objcName)))
......
...@@ -38,6 +38,7 @@ package object generatorTools { ...@@ -38,6 +38,7 @@ package object generatorTools {
cppOutFolder: Option[File], cppOutFolder: Option[File],
cppHeaderOutFolder: Option[File], cppHeaderOutFolder: Option[File],
cppIncludePrefix: String, cppIncludePrefix: String,
cppExtendedRecordIncludePrefix: String,
cppNamespace: String, cppNamespace: String,
cppIdentStyle: CppIdentStyle, cppIdentStyle: CppIdentStyle,
cppFileIdentStyle: IdentConverter, cppFileIdentStyle: IdentConverter,
...@@ -64,6 +65,7 @@ package object generatorTools { ...@@ -64,6 +65,7 @@ package object generatorTools {
objcppExt: String, objcppExt: String,
objcHeaderExt: String, objcHeaderExt: String,
objcIncludePrefix: String, objcIncludePrefix: String,
objcExtendedRecordIncludePrefix: String,
objcppIncludePrefix: String, objcppIncludePrefix: String,
objcppIncludeCppPrefix: String, objcppIncludeCppPrefix: String,
objcppIncludeObjcPrefix: String, objcppIncludeObjcPrefix: String,
......
...@@ -2,4 +2,5 @@ ...@@ -2,4 +2,5 @@
# Extended record # Extended record
extended_record = record +c { extended_record = record +c {
foo: bool; foo: bool;
const extended_record_const: extended_record = {foo=true};
} }
// AUTOGENERATED FILE - DO NOT MODIFY!
// This file generated by Djinni from extended_record.djinni
#include "extended_record_base.hpp" // my header
#include "../../handwritten-src/cpp/extended_record.hpp"
namespace testsuite {
ExtendedRecord const ExtendedRecordBase::EXTENDED_RECORD_CONST = ExtendedRecord(
true /* foo */ );
} // namespace testsuite
...@@ -11,6 +11,8 @@ struct ExtendedRecord; // Requiring extended class ...@@ -11,6 +11,8 @@ struct ExtendedRecord; // Requiring extended class
/** Extended record */ /** Extended record */
struct ExtendedRecordBase { struct ExtendedRecordBase {
static ExtendedRecord const EXTENDED_RECORD_CONST;
bool foo; bool foo;
ExtendedRecordBase(bool foo_) ExtendedRecordBase(bool foo_)
......
...@@ -9,6 +9,10 @@ import javax.annotation.Nonnull; ...@@ -9,6 +9,10 @@ import javax.annotation.Nonnull;
/** Extended record */ /** Extended record */
public final class ExtendedRecord { public final class ExtendedRecord {
@Nonnull
public static final ExtendedRecord EXTENDED_RECORD_CONST = new ExtendedRecord(
true /* mFoo */ );
/*package*/ final boolean mFoo; /*package*/ final boolean mFoo;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// This file generated by Djinni from extended_record.djinni // This file generated by Djinni from extended_record.djinni
#import "DBExtendedRecord.h" #import "DBExtendedRecord.h"
#include "../extended_record.hpp" #include "../../handwritten-src/cpp/extended_record.hpp"
static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for this file"); static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for this file");
......
// AUTOGENERATED FILE - DO NOT MODIFY! // AUTOGENERATED FILE - DO NOT MODIFY!
// This file generated by Djinni from extended_record.djinni // This file generated by Djinni from extended_record.djinni
#import "DBExtendedRecord+Private.h"
#import "DBExtendedRecord+Private.h" #import "DBExtendedRecord+Private.h"
#import "DJIMarshal+Private.h" #import "DJIMarshal+Private.h"
#include <cassert> #include <cassert>
......
// AUTOGENERATED FILE - DO NOT MODIFY! // AUTOGENERATED FILE - DO NOT MODIFY!
// This file generated by Djinni from extended_record.djinni // This file generated by Djinni from extended_record.djinni
#import "DBExtendedRecord.h"
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
/** Extended record */ /** Extended record */
...@@ -11,3 +12,5 @@ ...@@ -11,3 +12,5 @@
@property (nonatomic, readonly) BOOL foo; @property (nonatomic, readonly) BOOL foo;
@end @end
extern DBExtendedRecord * __nonnull const DBExtendedRecordExtendedRecordConst;
...@@ -3,6 +3,12 @@ ...@@ -3,6 +3,12 @@
#import "DBExtendedRecord.h" #import "DBExtendedRecord.h"
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
DBExtendedRecord * __nonnull const DBExtendedRecordExtendedRecordConst = [[DBExtendedRecord alloc] initWithFoo:YES];
#pragma clang diagnostic pop
@implementation DBExtendedRecord @implementation DBExtendedRecord
......
...@@ -5,6 +5,7 @@ djinni-output-temp/cpp/date_record.hpp ...@@ -5,6 +5,7 @@ djinni-output-temp/cpp/date_record.hpp
djinni-output-temp/cpp/date_record.cpp djinni-output-temp/cpp/date_record.cpp
djinni-output-temp/cpp/map_date_record.hpp djinni-output-temp/cpp/map_date_record.hpp
djinni-output-temp/cpp/extended_record_base.hpp djinni-output-temp/cpp/extended_record_base.hpp
djinni-output-temp/cpp/extended_record_base.cpp
djinni-output-temp/cpp/objc_only_listener.hpp djinni-output-temp/cpp/objc_only_listener.hpp
djinni-output-temp/cpp/java_only_listener.hpp djinni-output-temp/cpp/java_only_listener.hpp
djinni-output-temp/cpp/uses_single_language_listeners.hpp djinni-output-temp/cpp/uses_single_language_listeners.hpp
......
...@@ -71,6 +71,7 @@ fi ...@@ -71,6 +71,7 @@ fi
--ident-cpp-enum-type foo_bar \ --ident-cpp-enum-type foo_bar \
--cpp-optional-template "std::experimental::optional" \ --cpp-optional-template "std::experimental::optional" \
--cpp-optional-header "<experimental/optional>" \ --cpp-optional-header "<experimental/optional>" \
--cpp-extended-record-include-prefix "../../handwritten-src/cpp/" \
\ \
--jni-out "$temp_out_relative/jni" \ --jni-out "$temp_out_relative/jni" \
--ident-jni-class NativeFooBar \ --ident-jni-class NativeFooBar \
......
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