bind: support underscores in identifiers

Fixes golang/go#18536

Change-Id: I82c5993547e4d1d0df14726ccc569e1f57128072
Reviewed-on: https://go-review.googlesource.com/101156
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
This commit is contained in:
Elias Naur 2018-03-16 13:14:11 +01:00
parent 671e1c1ae2
commit 8ee74ac900
11 changed files with 350 additions and 10 deletions

View File

@ -44,6 +44,7 @@ var tests = []string{
"testdata/vars.go", "testdata/vars.go",
"testdata/ignore.go", "testdata/ignore.go",
"testdata/doc.go", "testdata/doc.go",
"testdata/underscores.go",
} }
var javaTests = []string{ var javaTests = []string{

View File

@ -749,10 +749,7 @@ func (g *JavaGen) genJNIFuncSignature(o *types.Func, sName string, jm *java.Func
g.Printf(jm.JNIName) g.Printf(jm.JNIName)
} else { } else {
oName := javaNameReplacer(lowerFirst(o.Name())) oName := javaNameReplacer(lowerFirst(o.Name()))
if strings.HasSuffix(oName, "_") { g.Printf(java.JNIMangle(oName))
oName += "1" // JNI doesn't like methods ending with underscore, needs the _1 suffixing
}
g.Printf(oName)
} }
g.Printf("(JNIEnv* env, ") g.Printf("(JNIEnv* env, ")
if sName != "" { if sName != "" {
@ -777,7 +774,7 @@ func (g *JavaGen) genJNIFuncSignature(o *types.Func, sName string, jm *java.Func
} }
func (g *JavaGen) jniPkgName() string { func (g *JavaGen) jniPkgName() string {
return strings.Replace(g.javaPkgName(g.Pkg), ".", "_", -1) return strings.Replace(java.JNIMangle(g.javaPkgName(g.Pkg)), ".", "_", -1)
} }
var javaLetterDigitRE = regexp.MustCompile(`[0-9a-zA-Z$_]`) var javaLetterDigitRE = regexp.MustCompile(`[0-9a-zA-Z$_]`)
@ -1064,7 +1061,7 @@ func (g *JavaGen) genJNIField(o *types.TypeName, f *types.Var) {
n := java.JNIMangle(g.javaTypeName(o.Name())) n := java.JNIMangle(g.javaTypeName(o.Name()))
// setter // setter
g.Printf("JNIEXPORT void JNICALL\n") g.Printf("JNIEXPORT void JNICALL\n")
g.Printf("Java_%s_%s_set%s(JNIEnv *env, jobject this, %s v) {\n", g.jniPkgName(), n, f.Name(), g.jniType(f.Type())) g.Printf("Java_%s_%s_set%s(JNIEnv *env, jobject this, %s v) {\n", g.jniPkgName(), n, java.JNIMangle(f.Name()), g.jniType(f.Type()))
g.Indent() g.Indent()
g.Printf("int32_t o = go_seq_to_refnum_go(env, this);\n") g.Printf("int32_t o = go_seq_to_refnum_go(env, this);\n")
g.genJavaToC("v", f.Type(), modeRetained) g.genJavaToC("v", f.Type(), modeRetained)
@ -1075,7 +1072,7 @@ func (g *JavaGen) genJNIField(o *types.TypeName, f *types.Var) {
// getter // getter
g.Printf("JNIEXPORT %s JNICALL\n", g.jniType(f.Type())) g.Printf("JNIEXPORT %s JNICALL\n", g.jniType(f.Type()))
g.Printf("Java_%s_%s_get%s(JNIEnv *env, jobject this) {\n", g.jniPkgName(), n, f.Name()) g.Printf("Java_%s_%s_get%s(JNIEnv *env, jobject this) {\n", g.jniPkgName(), n, java.JNIMangle(f.Name()))
g.Indent() g.Indent()
g.Printf("int32_t o = go_seq_to_refnum_go(env, this);\n") g.Printf("int32_t o = go_seq_to_refnum_go(env, this);\n")
g.Printf("%s r0 = ", g.cgoType(f.Type())) g.Printf("%s r0 = ", g.cgoType(f.Type()))
@ -1471,7 +1468,7 @@ func (g *JavaGen) GenC() error {
} }
g.Printf("\n") g.Printf("\n")
g.Printf("JNIEXPORT void JNICALL\n") g.Printf("JNIEXPORT void JNICALL\n")
g.Printf("Java_%s_%s__1init(JNIEnv *env, jclass _unused) {\n", g.jniPkgName(), g.className()) g.Printf("Java_%s_%s__1init(JNIEnv *env, jclass _unused) {\n", g.jniPkgName(), java.JNIMangle(g.className()))
g.Indent() g.Indent()
g.Printf("jclass clazz;\n") g.Printf("jclass clazz;\n")
for _, s := range g.structs { for _, s := range g.structs {

View File

@ -11,12 +11,12 @@
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_try__Try__1init(JNIEnv *env, jclass _unused) { Java_try_1_Try__1init(JNIEnv *env, jclass _unused) {
jclass clazz; jclass clazz;
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL
Java_try__Try_this_1(JNIEnv* env, jclass _clazz) { Java_try_1_Try_this_1(JNIEnv* env, jclass _clazz) {
nstring r0 = proxytry__This(); nstring r0 = proxytry__This();
jstring _r0 = go_seq_to_java_string(env, r0); jstring _r0 = go_seq_to_java_string(env, r0);
return _r0; return _r0;

13
bind/testdata/underscores.go vendored Normal file
View File

@ -0,0 +1,13 @@
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package underscore_pkg
type Underscore_struct struct {
Underscore_field string
}
var Underscore_var int
func Underscore_func() {}

60
bind/testdata/underscores.go.golden vendored Normal file
View File

@ -0,0 +1,60 @@
// Package main is an autogenerated binder stub for package underscore_pkg.
// gobind -lang=go underscores
//
// File is generated by gobind. Do not edit.
package main
/*
#include <stdlib.h>
#include <stdint.h>
#include "seq.h"
#include "underscore_pkg.h"
*/
import "C"
import (
_seq "golang.org/x/mobile/bind/seq"
"underscores"
)
// suppress the error if seq ends up unused
var _ = _seq.FromRefNum
//export proxyunderscore_pkg_Underscore_struct_Underscore_field_Set
func proxyunderscore_pkg_Underscore_struct_Underscore_field_Set(refnum C.int32_t, v C.nstring) {
ref := _seq.FromRefNum(int32(refnum))
_v := decodeString(v)
ref.Get().(*underscore_pkg.Underscore_struct).Underscore_field = _v
}
//export proxyunderscore_pkg_Underscore_struct_Underscore_field_Get
func proxyunderscore_pkg_Underscore_struct_Underscore_field_Get(refnum C.int32_t) C.nstring {
ref := _seq.FromRefNum(int32(refnum))
v := ref.Get().(*underscore_pkg.Underscore_struct).Underscore_field
_v := encodeString(v)
return _v
}
//export new_underscore_pkg_Underscore_struct
func new_underscore_pkg_Underscore_struct() C.int32_t {
return C.int32_t(_seq.ToRefNum(new(underscore_pkg.Underscore_struct)))
}
//export var_setunderscore_pkg_Underscore_var
func var_setunderscore_pkg_Underscore_var(v C.nint) {
_v := int(v)
underscore_pkg.Underscore_var = _v
}
//export var_getunderscore_pkg_Underscore_var
func var_getunderscore_pkg_Underscore_var() C.nint {
v := underscore_pkg.Underscore_var
_v := C.nint(v)
return _v
}
//export proxyunderscore_pkg__Underscore_func
func proxyunderscore_pkg__Underscore_func() {
underscore_pkg.Underscore_func()
}

61
bind/testdata/underscores.java.c.golden vendored Normal file
View File

@ -0,0 +1,61 @@
// JNI functions for the Go <=> Java bridge.
// gobind -lang=java underscores
//
// File is generated by gobind. Do not edit.
#include <android/log.h>
#include <stdint.h>
#include "seq.h"
#include "_cgo_export.h"
#include "underscore_pkg.h"
jclass proxy_class_underscore_pkg_Underscore_struct;
jmethodID proxy_class_underscore_pkg_Underscore_struct_cons;
JNIEXPORT void JNICALL
Java_underscore_1pkg_Underscore_1pkg__1init(JNIEnv *env, jclass _unused) {
jclass clazz;
clazz = (*env)->FindClass(env, "underscore_pkg/Underscore_struct");
proxy_class_underscore_pkg_Underscore_struct = (*env)->NewGlobalRef(env, clazz);
proxy_class_underscore_pkg_Underscore_struct_cons = (*env)->GetMethodID(env, clazz, "<init>", "(Lgo/Seq$Ref;)V");
}
JNIEXPORT void JNICALL
Java_underscore_1pkg_Underscore_pkg_underscore_1func(JNIEnv* env, jclass _clazz) {
proxyunderscore_pkg__Underscore_func();
}
JNIEXPORT jobject JNICALL
Java_underscore_1pkg_Underscore_1struct__1_1New(JNIEnv *env, jclass clazz) {
int32_t refnum = new_underscore_pkg_Underscore_struct();
return go_seq_from_refnum(env, refnum, NULL, NULL);
}
JNIEXPORT void JNICALL
Java_underscore_1pkg_Underscore_1struct_setUnderscore_1field(JNIEnv *env, jobject this, jstring v) {
int32_t o = go_seq_to_refnum_go(env, this);
nstring _v = go_seq_from_java_string(env, v);
proxyunderscore_pkg_Underscore_struct_Underscore_field_Set(o, _v);
}
JNIEXPORT jstring JNICALL
Java_underscore_1pkg_Underscore_1struct_getUnderscore_1field(JNIEnv *env, jobject this) {
int32_t o = go_seq_to_refnum_go(env, this);
nstring r0 = proxyunderscore_pkg_Underscore_struct_Underscore_field_Get(o);
jstring _r0 = go_seq_to_java_string(env, r0);
return _r0;
}
JNIEXPORT void JNICALL
Java_underscore_1pkg_Underscore_pkg_setUnderscore_1var(JNIEnv *env, jclass clazz, jlong v) {
nint _v = (nint)v;
var_setunderscore_pkg_Underscore_var(_v);
}
JNIEXPORT jlong JNICALL
Java_underscore_1pkg_Underscore_pkg_getUnderscore_1var(JNIEnv *env, jclass clazz) {
nint r0 = var_getunderscore_pkg_Underscore_var();
jlong _r0 = (jlong)r0;
return _r0;
}

85
bind/testdata/underscores.java.golden vendored Normal file
View File

@ -0,0 +1,85 @@
// Java class underscore_pkg.Underscore_struct is a proxy for talking to a Go program.
// gobind -lang=java underscores
//
// File is generated by gobind. Do not edit.
package underscore_pkg;
import go.Seq;
public final class Underscore_struct implements Seq.Proxy {
static { Underscore_pkg.touch(); }
private final Seq.Ref ref;
@Override public final int incRefnum() {
int refnum = ref.refnum;
Seq.incGoRef(refnum);
return refnum;
}
Underscore_struct(Seq.Ref ref) { this.ref = ref; }
public Underscore_struct() { this.ref = __New(); }
private static native Seq.Ref __New();
public final native String getUnderscore_field();
public final native void setUnderscore_field(String v);
@Override public boolean equals(Object o) {
if (o == null || !(o instanceof Underscore_struct)) {
return false;
}
Underscore_struct that = (Underscore_struct)o;
String thisUnderscore_field = getUnderscore_field();
String thatUnderscore_field = that.getUnderscore_field();
if (thisUnderscore_field == null) {
if (thatUnderscore_field != null) {
return false;
}
} else if (!thisUnderscore_field.equals(thatUnderscore_field)) {
return false;
}
return true;
}
@Override public int hashCode() {
return java.util.Arrays.hashCode(new Object[] {getUnderscore_field()});
}
@Override public String toString() {
StringBuilder b = new StringBuilder();
b.append("Underscore_struct").append("{");
b.append("Underscore_field:").append(getUnderscore_field()).append(",");
return b.append("}").toString();
}
}
// Java class underscore_pkg.Underscore_pkg is a proxy for talking to a Go program.
// gobind -lang=java underscores
//
// File is generated by gobind. Do not edit.
package underscore_pkg;
import go.Seq;
public abstract class Underscore_pkg {
static {
Seq.touch(); // for loading the native library
_init();
}
private Underscore_pkg() {} // uninstantiable
// touch is called from other bound packages to initialize this package
public static void touch() {}
private static native void _init();
public static native void setUnderscore_var(long v);
public static native long getUnderscore_var();
public static native void underscore_func();
}

13
bind/testdata/underscores.java.h.golden vendored Normal file
View File

@ -0,0 +1,13 @@
// JNI function headers for the Go <=> Java bridge.
// gobind -lang=java underscores
//
// File is generated by gobind. Do not edit.
#ifndef __Underscore_pkg_H__
#define __Underscore_pkg_H__
#include <jni.h>
extern jclass proxy_class_underscore_pkg_Underscore_struct;
extern jmethodID proxy_class_underscore_pkg_Underscore_struct_cons;
#endif

View File

@ -0,0 +1,11 @@
// Objective-C API for talking to underscores Go package.
// gobind -lang=objc underscores
//
// File is generated by gobind. Do not edit.
#ifndef __GO_underscore_pkg_H__
#define __GO_underscore_pkg_H__
#include <stdint.h>
#include <objc/objc.h>
#endif

33
bind/testdata/underscores.objc.h.golden vendored Normal file
View File

@ -0,0 +1,33 @@
// Objective-C API for talking to underscores Go package.
// gobind -lang=objc underscores
//
// File is generated by gobind. Do not edit.
#ifndef __Underscore_pkg_H__
#define __Underscore_pkg_H__
@import Foundation;
#include "Universe.objc.h"
@class Underscore_pkgUnderscore_struct;
@interface Underscore_pkgUnderscore_struct : NSObject <goSeqRefInterface> {
}
@property(strong, readonly) id _ref;
- (instancetype)initWithRef:(id)ref;
- (instancetype)init;
- (NSString*)underscore_field;
- (void)setUnderscore_field:(NSString*)v;
@end
@interface Underscore_pkg : NSObject
+ (long) underscore_var;
+ (void) setUnderscore_var:(long)v;
@end
FOUNDATION_EXPORT void Underscore_pkgUnderscore_func(void);
#endif

66
bind/testdata/underscores.objc.m.golden vendored Normal file
View File

@ -0,0 +1,66 @@
// Objective-C API for talking to underscores Go package.
// gobind -lang=objc underscores
//
// File is generated by gobind. Do not edit.
#include <Foundation/Foundation.h>
#include "seq.h"
#include "_cgo_export.h"
#include "Underscore_pkg.objc.h"
@implementation Underscore_pkgUnderscore_struct {
}
- (instancetype)initWithRef:(id)ref {
self = [super init];
if (self) { __ref = ref; }
return self;
}
- (instancetype)init {
self = [super init];
if (self) {
__ref = go_seq_from_refnum(new_underscore_pkg_Underscore_struct());
}
return self;
}
- (NSString*)underscore_field {
int32_t refnum = go_seq_go_to_refnum(self._ref);
nstring r0 = proxyunderscore_pkg_Underscore_struct_Underscore_field_Get(refnum);
NSString *_r0 = go_seq_to_objc_string(r0);
return _r0;
}
- (void)setUnderscore_field:(NSString*)v {
int32_t refnum = go_seq_go_to_refnum(self._ref);
nstring _v = go_seq_from_objc_string(v);
proxyunderscore_pkg_Underscore_struct_Underscore_field_Set(refnum, _v);
}
@end
@implementation Underscore_pkg
+ (void) setUnderscore_var:(long)v {
nint _v = (nint)v;
var_setunderscore_pkg_Underscore_var(_v);
}
+ (long) underscore_var {
nint r0 = var_getunderscore_pkg_Underscore_var();
long _r0 = (long)r0;
return _r0;
}
@end
void Underscore_pkgUnderscore_func(void) {
proxyunderscore_pkg__Underscore_func();
}
__attribute__((constructor)) static void init() {
init_seq();
}