Skip to content

Commit c5f39a2

Browse files
committed
JNAerator: Allow BridJ generation tests.
1 parent 40c890c commit c5f39a2

27 files changed

+87
-19
lines changed

jnaerator/pom.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>com.jnaerator</groupId>
66
<artifactId>jnaerator</artifactId>
7-
<name>JNAerator CLI &amp; Studio Tools</name>
7+
<name>JNAerator CLI and Studio Tools</name>
88
<url>http://code.google.com/p/jnaerator/</url>
99
<version>${jnaerator.version}</version>
1010
<packaging>jar</packaging>
@@ -17,7 +17,7 @@
1717
</parent>
1818

1919
<description>
20-
JNAerator (pronounce "generator") simply parses C &amp; Objective-C headers and generates the corresponding JNA and Rococoa Java interfaces (it also has a very limited support for C++).
20+
JNAerator (pronounce "generator") simply parses C and Objective-C headers and generates the corresponding JNA and Rococoa Java interfaces (it also has a very limited support for C++).
2121

2222
This lets Java programmers access native libraries transparently, with full IDE support and little to no hand-tweaking.
2323

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -1412,7 +1412,7 @@ public void jnaerationCore(SourceFiles sourceFiles, Result result) throws IOExce
14121412
}
14131413

14141414
/// Perform Objective-C-specific pre-transformation (javadoc conversion for enums + find name of enums based on next sibling integer typedefs)
1415-
sourceFiles.accept(new ObjectiveCToJavaPreScanner());
1415+
sourceFiles.accept(new ObjectiveCToJavaPreScanner(result));
14161416

14171417
/// Explode declarations to have only one direct declarator each
14181418
sourceFiles.accept(new CToJavaPreScanner());
@@ -1516,9 +1516,9 @@ public List<Modifier> getStoMods(List<Modifier> mods) {
15161516

15171517
generateLibraryFiles(sourceFiles, result);
15181518

1519-
//if (config.verbose)
1520-
for (String unknownType : result.typeConverter.unknownTypes)
1521-
System.out.println("Unknown Type: " + unknownType);
1519+
if (config.verbose)
1520+
for (String unknownType : result.typeConverter.unknownTypes)
1521+
System.out.println("Unknown Type: " + unknownType);
15221522

15231523
if (result.config.choicesOutFile != null) {
15241524
PrintWriter out = new PrintWriter(result.config.choicesOutFile);

jnaerator/src/main/java/com/ochafik/lang/jnaerator/MissingNamesChooser.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ private boolean chooseNameIfMissing(TaggedTypeRef taggedTypeRef) {
351351
// return true;
352352
// }
353353
//String betterTag = result.declarationsConverter.getActualTaggedTypeName(taggedTypeRef);
354-
if (isNull(taggedTypeRef.getTag())) {
354+
if (isNull(taggedTypeRef.getTag()) && !(taggedTypeRef.getParentElement() instanceof TaggedTypeRefDeclaration)) {
355355
Identifier tag = result.declarationsConverter.getActualTaggedTypeName(taggedTypeRef);
356356
if (isNull(tag)) {
357357
List<String> ownerNames = JNAeratorUtils.guessOwnerName(taggedTypeRef);//.getParentElement() instanceof StructTypeRef ? struct.getParentElement() : struct);

jnaerator/src/main/java/com/ochafik/lang/jnaerator/ObjectiveCToJavaPreScanner.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ public class ObjectiveCToJavaPreScanner extends Scanner {
4646
// else
4747
// super.visitStruct(struct);
4848
// }
49+
Result result;
50+
public ObjectiveCToJavaPreScanner(Result result) {
51+
this.result = result;
52+
}
4953
@Override
5054
public void visitEnum(Enum e) {
5155
Element parent = e.getParentElement();
@@ -115,8 +119,8 @@ private boolean handleAppleEnumTypeDef(Element nextDeclaration, Enum e) {
115119
ep.replaceBy(null);
116120
typeDef.setValueType(e);
117121

118-
119-
System.err.println("Inferred enum name : " + name);
122+
if (result.config.verbose)
123+
System.err.println("Inferred enum name : " + name);
120124
return false;
121125
}
122126
}

jnaerator/src/test/java/com/ochafik/lang/jnaerator/JNAerationTest.java

+39-10
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ This file is part of JNAerator (http://jnaerator.googlecode.com/).
3232
import java.util.TreeSet;
3333
import java.util.Map.Entry;
3434
import java.util.regex.Pattern;
35+
import java.util.regex.Matcher;
3536

3637
import junit.framework.Assert;
3738

@@ -66,9 +67,11 @@ public JNAerationTest(String title, TestDesc test) {
6667
static class TestDesc {
6768
String cSource;
6869
String libraryName = "test";
70+
JNAeratorConfig.Runtime runtime;
6971
Map<String, String> extraJavaSourceFilesContents = new HashMap<String, String>();
70-
public TestDesc(String cSource) {
72+
public TestDesc(String cSource, JNAeratorConfig.Runtime runtime) {
7173
this.cSource = cSource;
74+
this.runtime = runtime;
7275
}
7376
public TestDesc addSource(String className, String javaContent) {
7477
extraJavaSourceFilesContents.put(className, javaContent);
@@ -80,9 +83,20 @@ public TestDesc addMainContentSource(String className, String javaContent) {
8083
//String lib = libraryName + "." + StringUtils.capitalize(libraryName) + "Library";
8184
//imports.add("import " + lib + ";");
8285
//imports.add("import static " + lib + ".*;");
83-
imports.add("import com.sun.jna.*;");
84-
imports.add("import com.sun.jna.ptr.*;");
85-
imports.add("import java.nio.*;");
86+
switch (runtime) {
87+
88+
case JNAerator:
89+
case JNA:
90+
imports.add("import com.sun.jna.*;");
91+
imports.add("import com.sun.jna.ptr.*;");
92+
imports.add("import java.nio.*;");
93+
break;
94+
case BridJ:
95+
imports.add("import com.bridj.*;");
96+
imports.add("import com.bridj.cpp.*;");
97+
imports.add("import java.nio.*;");
98+
break;
99+
}
86100

87101
for (String line : javaContent.split("\r?\n")) {
88102
if (line.matches("^\\s*import[^\\w].*"))
@@ -107,6 +121,7 @@ public void test() throws SyntaxException, IOException, LexerException, Recognit
107121
JNAeratorConfig config = new JNAeratorConfig();
108122
config.defaultLibrary = test.libraryName;
109123
config.compile = true;
124+
config.runtime = test.runtime;
110125
config.preferJavac = true;
111126
config.extraJavaSourceFilesContents.putAll(test.extraJavaSourceFilesContents);
112127
config.libraryForElementsInNullFile = test.libraryName;//test.classNameToJavaContent;
@@ -178,7 +193,7 @@ public void wrappersGenerated(Result result) {
178193
}
179194
});
180195
}
181-
196+
static Pattern runtimePattern = Pattern.compile("(?m)#runtime\\((BridJ|JNAerator|JNA)\\).*");
182197
@Parameters
183198
public static List<Object[]> readParameters() throws IOException {
184199
//List<String> lines = ReadText.readLines(ObjCppParsingTests.class.getClassLoader().getResource(TEST_FILE));
@@ -198,11 +213,25 @@ public boolean accept(String path) {
198213
})) {
199214
String t = ReadText.readText(testURL);
200215
String[] tt = t.split("\n--\n");
201-
data.add(new Object[] {
202-
//testURL.toString(), //
203-
new File(URLDecoder.decode(testURL.toString(), "utf-8")).getName(),
204-
new TestDesc(tt[0]).addMainContentSource("Test", tt[1])
205-
});
216+
String cSource = tt[0];
217+
String n = new File(URLDecoder.decode(testURL.toString(), "utf-8")).getName();
218+
for (int i = 1; i < tt.length; i++) {
219+
String rawSource = tt[i];
220+
JNAeratorConfig.Runtime runtime = JNAeratorConfig.Runtime.JNAerator;
221+
Matcher m = runtimePattern.matcher(rawSource);
222+
if (m.find()) {
223+
runtime = Enum.valueOf(JNAeratorConfig.Runtime.class, m.group(1).trim());
224+
}
225+
String javaSource = rawSource.replaceAll("^#", "//#");
226+
String testName = n + " / " + runtime.name();
227+
data.add(new Object[] {
228+
testName,
229+
new TestDesc(cSource, runtime).addMainContentSource(
230+
"Test" + runtime.name(),
231+
"// " + testName + "\n" + javaSource
232+
)
233+
});
234+
}
206235
}
207236
return data;
208237
}

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/anonymous types.test

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ void ComplexArgFunction(
99
}* pArg
1010
);
1111
--
12+
#runtime(JNAerator)
1213
import test.*;
1314
import static test.TestLibrary.*;
1415

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/apple enums name inference.test

+14
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ typedef uint32_t E4; // too far away !
2626

2727

2828
--
29+
#runtime(JNAerator)
2930
import test.*;
3031
import static test.TestLibrary.*;
3132

@@ -34,3 +35,16 @@ i = _E1.E1A;
3435
i = E2.E2A;
3536
i = E3.E3A;
3637
i = E4A;
38+
--
39+
#runtime(BridJ)
40+
import test.*;
41+
import static test.TestLibrary.*;
42+
43+
_E1 e1 = _E1.E1A;
44+
E2 e2 = E2.E2A;
45+
E3 e3 = E3.E3A;
46+
47+
IntValuedEnum<_E1> v1 = e1;
48+
IntValuedEnum<E2> v2 = e2;
49+
IntValuedEnum<E3> v3 = e3;
50+
int i4 = E4A;

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/array fields.test

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ struct Months {
1111
Str15 names[12];
1212
};
1313
--
14+
#runtime(JNAerator)
1415
import test.*;
1516
import static test.TestLibrary.*;
1617

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/basic structs.test

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ struct B {
66
A *pa;
77
};
88
--
9+
#runtime(JNAerator)
910
import test.*;
1011
import static test.TestLibrary.*;
1112

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/bit fields.test

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ struct BF {
77
float f;
88
};
99
--
10+
#runtime(JNAerator)
1011
import test.*;
1112
import static test.TestLibrary.*;
1213

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/callback fields.test

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ struct S {
44
long (*foo[10])(union { long l; int i; });
55
};
66
--
7+
#runtime(JNAerator)
78
import test.*;
89
import static test.TestLibrary.*;
910

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/constants.test

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
const int Expression = X + (1 + 2) * 4;
33
const int unsignedValue = (UInt32)4294967288L;
44
--
5+
#runtime(JNAerator)
56
import test.*;
67
import static test.TestLibrary.*;
78

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/cpp operators.test

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
extern bool operator/=(int&, float);
22
--
3+
#runtime(JNAerator)
34
import test.*;
45
import static test.TestLibrary.*;
56

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/enum name.test

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ void f(Choice c);
1313
void ff(_OtherChoice c);
1414

1515
--
16+
#runtime(JNAerator)
1617
import test.*;
1718
import static test.TestLibrary.*;
1819

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/enums.test

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ enum E {
1111
Item2 = Item1 + 10
1212
};
1313
--
14+
#runtime(JNAerator)
1415
import test.*;
1516
import static test.TestLibrary.*;
1617

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/function alternatives.test

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
void CopyBytes(char* dest, const char* source, const wchar_t* wsource, size_t n, const int* intArray);
22
int process(void* ptr);
33
--
4+
#runtime(JNAerator)
45
import test.*;
56
import static test.TestLibrary.*;
67
import org.rococoa.cocoa.foundation.*;

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/modifiers as identifiers.test

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ typedef struct _outerstruct2 {
88
} outerstruct2;
99

1010
--
11+
#runtime(JNAerator)
1112
import test.*;
1213
import static test.TestLibrary.*;
1314

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/objective-c categories protocols.test

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
@end
1515

1616
--
17+
#runtime(JNAerator)
1718
import test.*;
1819
import test.protocols.*;
1920

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/objective-c class.test

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
@end
99
--
10+
#runtime(JNAerator)
1011
import test.*;
1112

1213
NSMutableArray a = NSMutableArray.arrayWithCapacity(10);

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/simple globals.test

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ extern NSInteger nsi;
77
extern CGFloat cgf;
88

99
--
10+
#runtime(JNAerator)
1011
import test.*;
1112
import org.rococoa.cocoa.*;
1213
import com.ochafik.lang.jnaerator.runtime.*;

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/struct and enum fields constructors.test

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ struct S2 : S {
1919
};
2020

2121
--
22+
#runtime(JNAerator)
2223

2324
import test.*;
2425
import static test.TestLibrary.*;

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/struct arguments.test

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ void fp(S*);
99
void fp_(_S*);
1010

1111
--
12+
#runtime(JNAerator)
1213

1314
import test.*;
1415
import static test.TestLibrary.*;

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/struct by value vs by reference.test

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ simplestruct myfuncV();
4242
void myfuncV(simplestruct);
4343

4444
--
45+
#runtime(JNAerator)
4546

4647
import test.*;
4748
import org.rococoa.cocoa.*;

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/struct fields.test

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ struct S2 {
1010
};
1111

1212
--
13+
#runtime(JNAerator)
1314
import test.*;
1415
import static test.TestLibrary.*;
1516

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/tagged types name correction.test

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ typedef struct _S2
2323
} K;
2424

2525
--
26+
#runtime(JNAerator)
2627
import test.*;
2728
import static test.TestLibrary.*;
2829

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/typedef scope.test

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ f(S, void (*fptr)(), T*, lfptr p2);
1313

1414

1515
--
16+
#runtime(JNAerator)
1617
import test.*;
1718

1819
S s = new S();

jnaerator/src/test/resources/com/ochafik/lang/jnaerator/tests/unknown pointers.test

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ struct OpaqueStruct;
33
const OpaqueStruct* GetInterestingMessage(UnknownPtr*);
44

55
--
6+
#runtime(JNAerator)
67

78
import test.*;
89
import static test.TestLibrary.*;

0 commit comments

Comments
 (0)