Skip to content

Commit 74e329d

Browse files
committed
Prefix generated class names
Using only the class name declared in a gir file as the name of the corresponding generated Java class can lead to confusing results. An example is having three different classes called Object: the classes corresponding to GObject and GstObject are both called Object, with the additional java.lang.Object making things even worse. To solve this, prefix the names of all generated classes (except the namespace-wide function classes) with the c:identifier-prefixes of the namespace, or if not present, the name of the namespace.
1 parent ca9d567 commit 74e329d

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

src/gir2java/Constants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ public class Constants {
1414
public static final String CONTEXT_EXTRA_PARAM_TYPES = "param-types";
1515
public static final String CONTEXT_EXTRA_SNAPSHOTS = "snapshots";
1616
public static final String CONTEXT_EXTRA_UNDEFINED = "undefined";
17-
17+
public static final String CONTEXT_EXTRA_PREFIX = "prefix";
1818

1919
}

src/gir2java/GirParser.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,11 +341,17 @@ private void parsePackage(Element root, ParsingContext context) {
341341
@SuppressWarnings("unused")
342342
private void parseNamespace(Element root, ParsingContext context) {
343343
String nsName = root.getAttributeValue("name");
344+
String prefix = root.getAttributeValue("identifier-prefixes", Constants.GIR_XMLNS_C);
345+
if (prefix == null) {
346+
prefix = nsName;
347+
}
344348
String javaPackageName = NameUtils.javaifyPackageName(nsName);
345349
ParsingContext newContext = context.copy();
346350

347351
newContext.appendPackage(javaPackageName);
348352
newContext.putExtra(Constants.CONTEXT_EXTRA_NAMESPACE, nsName);
353+
newContext.putExtra(Constants.CONTEXT_EXTRA_PREFIX, prefix);
354+
349355
System.out.println("Namespace " + nsName + " becomes Java package " + newContext.getCurrentPackage());
350356

351357
//If there is a shared library defined, it takes precedence over any guesswork
@@ -366,7 +372,7 @@ private void parseEnumeration(Element root, ParsingContext context) {
366372
JCodeModel cm = (JCodeModel)context.getCmNode();
367373

368374
try {
369-
String enumFqcn = context.getCurrentPackage() + '.' + enumName;
375+
String enumFqcn = context.getCurrentPackage() + '.' + context.getExtra(Constants.CONTEXT_EXTRA_PREFIX) + enumName;
370376
JDefinedClass enumClass = cm._class(enumFqcn, ClassType.ENUM);
371377
System.out.println("New enum: " + enumFqcn);
372378

@@ -450,7 +456,7 @@ private void parseRecordOrClass(Element root, ParsingContext context) {
450456

451457
JCodeModel cm = (JCodeModel) context.getCmNode();
452458
String name = root.getAttributeValue("name");
453-
String className = context.getCurrentPackage() + '.' + name;
459+
String className = context.getCurrentPackage() + '.' + context.getExtra(Constants.CONTEXT_EXTRA_PREFIX) + name;
454460

455461
Set<String> foundTypes = (Set<String>)context.getExtra(Constants.CONTEXT_EXTRA_DEFINED_TYPES);
456462
foundTypes.add("" + context.getExtra(Constants.CONTEXT_EXTRA_NAMESPACE) + '.' + name);

0 commit comments

Comments
 (0)