Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
/**
* JNI sig: Lcom/xamarin/JavaEnum;
*/
// Disconnective comment?
enum JavaEnum {
/** FIRST; JNI sig: Lcom/xamarin/JavaEnum; */
FIRST,
Expand Down Expand Up @@ -161,6 +162,7 @@ public int compareTo (JavaType<E> value) {
}

/** JNI sig: func.(Ljava/lang/StringBuilder;)Ljava/util/List; */
// Comment to "disconnect" Javadoc from the member
public List<String> func (StringBuilder value) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,7 @@ static String getJavaType(JniTypeInfo typeInfo, JniMethodInfo methodInfo, Type t
final ResolvedType rt = type.resolve();
return rt.describe();
} catch (final Throwable thr) {
return ".*" + type.asString();
return getUnresolvedJavaType(type);
}
}

Expand Down Expand Up @@ -389,7 +389,8 @@ static String getJniType(JniTypeInfo typeInfo, JniMethodInfo methodInfo, Type ty
}
catch (final Exception thr) {
}
return ".*" + type.asString();

return getUnresolvedJniType(type);
}

static String getJniType(JniTypeInfo typeInfo, JniMethodInfo methodInfo, ArrayType type) {
Expand All @@ -412,7 +413,7 @@ static String getPrimitiveJniType(String javaType) {
case "short": return "S";
case "void": return "V";
}
throw new Error("Don't know JNI type for `" + javaType + "`!");
throw new Error("Don't know JNI type for primitive type `" + javaType + "`!");
}

static String getJniType(ResolvedType type) {
Expand Down Expand Up @@ -453,4 +454,42 @@ static String getJniType(ResolvedReferenceType type) {
name.append(";");
return name.toString();
}

static String getUnresolvedJavaType(Type type) {
final StringBuilder jniType = new StringBuilder();

jniType.append(".*");

if (type.isClassOrInterfaceType()) {
// Special-case class-or-interface declarations so that we skip type parameters.
type.ifClassOrInterfaceType(c -> {
c.getScope().ifPresent(s -> jniType.append(s.asString()).append("."));
jniType.append(c.getName().asString());
});
} else {
jniType.append(type.asString());
}

return jniType.toString();
}

static String getUnresolvedJniType(Type type) {
final StringBuilder jniType = new StringBuilder();

jniType.append("L.*");

if (type.isClassOrInterfaceType()) {
// Special-case class-or-interface declarations so that we skip type parameters.
type.ifClassOrInterfaceType(c -> {
c.getScope().ifPresent(s -> jniType.append(s.asString()).append("."));
jniType.append(c.getName().asString());
});
} else {
jniType.append(type.asString());
}

jniType.append(";");

return jniType.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,11 @@ public void testWritePackages_JavaType_java() throws Throwable {
testWritePackages("../../../com/xamarin/JavaType.java", "JavaType.xml");
}

@Test
public void testWritePackages_UnresolvedTypes_txt() throws Throwable {
testWritePackages("../../../UnresolvedTypes.txt", "../../../UnresolvedTypes.xml");
}

private static void testWritePackages(final String resourceJava, final String resourceXml) throws Throwable {
final JavaParser parser = JniPackagesInfoFactoryTest.createParser();
final JniPackagesInfoFactory factory = new JniPackagesInfoFactory(parser);
Expand Down
11 changes: 11 additions & 0 deletions tools/java-source-utils/src/test/resources/UnresolvedTypes.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package example;

public class UnresolvedTypes {
/**
* Method using unresolvable types. As such, we make do.
*
* JNI Sig: method.(L.*example.name.UnresolvedParameterType;)L.*UnresolvedReturnType;
*/
public static UnresolvedReturnType<String, Integer> method(example.name.UnresolvedParameterType<Class> parameter) {
}
}
13 changes: 13 additions & 0 deletions tools/java-source-utils/src/test/resources/UnresolvedTypes.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<api api-source="java-source-utils">
<package jni-name="example" name="example">
<class jni-signature="Lexample/UnresolvedTypes;" name="UnresolvedTypes">
<method jni-return="L.*UnresolvedReturnType;" jni-signature="(L.*example.name.UnresolvedParameterType;)L.*UnresolvedReturnType;" name="method" return=".*UnresolvedReturnType">
<parameter jni-type="L.*example.name.UnresolvedParameterType;" name="parameter" type=".*example.name.UnresolvedParameterType"/>
<javadoc><![CDATA[Method using unresolvable types. As such, we make do.

JNI Sig: method.(L.*example.name.UnresolvedParameterType;)L.*UnresolvedReturnType;]]></javadoc>
</method>
</class>
</package>
</api>