Skip to content

Commit ffaea76

Browse files
committed
JNAerator: added -libraryOverrides symbol1=lib1,symbol2=lib2 for library overrides (issue #518)
1 parent b03eccb commit ffaea76

6 files changed

Lines changed: 40 additions & 4 deletions

File tree

libraries/jnaerator/jnaerator-parser/src/main/java/com/ochafik/lang/jnaerator/parser/Element.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,15 @@ public Identifier getResolvedJavaIdentifier() {
7070
return resolvedJavaIdentifier;
7171
}
7272

73+
public static Identifier getName(Element element) {
74+
if (element instanceof Function)
75+
return ((Function) element).getName();
76+
if (element instanceof TaggedTypeRefDeclaration)
77+
return getName(((TaggedTypeRefDeclaration) element).getTaggedTypeRef());
78+
if (element instanceof TypeRef.TaggedTypeRef)
79+
return ((TypeRef.TaggedTypeRef) element).getTag();
80+
return null;
81+
}
7382

7483
public Map<Object, Object> getAttributes() {
7584
return attributes == null ? Collections.EMPTY_MAP : Collections.unmodifiableMap(attributes);

libraries/jnaerator/jnaerator-parser/src/main/java/com/ochafik/lang/jnaerator/parser/ModifiableElement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ This file is part of JNAerator (http://jnaerator.googlecode.com/).
2525

2626
public abstract class ModifiableElement extends Element {
2727
protected final List<Modifier> modifiers = new ArrayList<Modifier>();
28-
28+
2929
@Override
3030
public void accept(Visitor visitor) {
3131
visitor.visitModifiableElement(this);

libraries/jnaerator/jnaerator/src/main/java/com/ochafik/lang/jnaerator/JNAerator.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,9 @@ List<String> parsed(ParsedArg a) throws Exception {
320320
case SkipIncludedFrameworks:
321321
config.skipIncludedFrameworks = true;
322322
break;
323+
case LibraryOverrides:
324+
config.libraryOverrides.putAll(a.getMapParam(0));
325+
break;
323326
case GenPrivateMembers:
324327
config.skipPrivateMembers = false;
325328
break;

libraries/jnaerator/jnaerator/src/main/java/com/ochafik/lang/jnaerator/JNAeratorCommandLineArgs.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ public String getStringParam(int pos) {
5757
return (String) params[pos];
5858
}
5959

60+
public Map<String, String> getMapParam(int pos) {
61+
return (Map) params[pos];
62+
}
63+
6064
public MessageFormat getMessageFormatParam(int pos) {
6165
return (MessageFormat) params[pos];
6266
}
@@ -186,6 +190,7 @@ public enum OptionDef {
186190
BeautifyNames("-beautifyNames", "Transform C names to Java-looking names : some_func() => someFunc()"),
187191
ConvertBodies("-convertBodies", "Experimental conversion of function bodies to equivalent Java code (BridJ only)."),
188192
JarOut("-jar", "Jar file where all generated sources and the compiled classes go", new ArgDef(Type.OutputFile, "outFile")),
193+
LibraryOverrides("-libraryOverrides", "Comma-separated list of `symbol=library` library overrides (when isolated functions are located in a different library than their surrounding code).", new ArgDef(Type.Map, "list")),
189194
ScalaStructSetters("-scalaStructSetters", "Generate Scala-style setters for BridJ structs (with a name like fieldName_$eq)"),
190195
WCharAsShort("-wcharAsShort", "Force treatment of wchar_t as short (char by default)"),
191196
CallbackInvokeName("-callbacksInvokeMethodName", "Name of the invocation method of callbacks ('apply' by default)", new ArgDef(Type.String, "methodName")),
@@ -316,7 +321,10 @@ private boolean isDeprecated() {
316321

317322
public enum Type {
318323

319-
ExistingFile, ExistingDir, File, MessageFormat, String, Int, ExistingFileOrDir, OutputDir, OutputFile, OptionalFile, Enum
324+
ExistingFile, ExistingDir, File, MessageFormat, String, Int,
325+
ExistingFileOrDir, OutputDir, OutputFile, OptionalFile,
326+
Map,
327+
Enum
320328
}
321329

322330
public static class ArgDef {
@@ -378,6 +386,8 @@ public String format(Object arg) {
378386
return arg == null ? null : ((File) arg).toString();
379387
case String:
380388
return (String) arg;
389+
case Map:
390+
return ((Map) arg).toString();
381391
case Int:
382392
return ((Integer) arg).toString();
383393
default:
@@ -414,6 +424,13 @@ Object convertArg(String arg, ArgsParser parser) throws FileNotFoundException {
414424
throw new FileNotFoundException(f.toString());
415425
}
416426
return f;
427+
case Map:
428+
Map<String, String> map = new LinkedHashMap<String, String>();
429+
for (String pair : arg.split(",")) {
430+
int i = pair.indexOf("=");
431+
map.put(pair.substring(0, i), pair.substring(i + 1));
432+
}
433+
return map;
417434
case File:
418435
return findFile(arg, parser);
419436
case Int:

libraries/jnaerator/jnaerator/src/main/java/com/ochafik/lang/jnaerator/JNAeratorConfig.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,7 @@ public Map<String, String> getAllMacros() {
409409
public boolean reification;
410410
public boolean convertBodies;
411411
public boolean removeInlineAsm;
412+
public Map<String, String> libraryOverrides = new HashMap<String, String>();
412413
public Map<String, String> extraJavaSourceFilesContents = new LinkedHashMap<String, String>();
413414
public Set<String> frameworks = new LinkedHashSet<String>();
414415
boolean skipIncludedFrameworks;
@@ -602,7 +603,13 @@ public Set<String> getLibraries() {
602603
public boolean noCPlusPlus;
603604
public String mavenGroupId = "com.mycompany", mavenArtifactId = "my-native-bindings", mavenVersion = "1.0-SNAPSHOT";
604605

605-
public String getLibrary(String elementFile) {
606+
public String getLibrary(String elementFile, Identifier elementName) {
607+
if (elementName != null) {
608+
String libraryOverride = libraryOverrides.get(elementName.toString());
609+
if (libraryOverride != null) {
610+
return libraryOverride;
611+
}
612+
}
606613
if (elementFile == null) {
607614
return libraryForElementsInNullFile;
608615
}

libraries/jnaerator/jnaerator/src/main/java/com/ochafik/lang/jnaerator/Result.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ String guessFramework(String file) {
430430

431431
String getLibrary(Element decl) {
432432
String file = resolveFile(decl);
433-
String library = config.getLibrary(file);
433+
String library = config.getLibrary(file, Element.getName(decl));
434434
if (library == null) {
435435
SourceFile f = decl.findParentOfType(SourceFile.class);
436436
if (f != null) {

0 commit comments

Comments
 (0)