[Go] Add %go_import directive.
This commit is contained in:
parent
3785454a87
commit
f2dc3a9c1f
5 changed files with 84 additions and 19 deletions
|
|
@ -5,6 +5,9 @@ See the RELEASENOTES file for a summary of changes in each release.
|
||||||
Version 3.0.0 (in progress)
|
Version 3.0.0 (in progress)
|
||||||
============================
|
============================
|
||||||
|
|
||||||
|
2014-01-21: ianlancetaylor
|
||||||
|
[Go] Add %go_import directive.
|
||||||
|
|
||||||
2014-01-21: ianlancetaylor
|
2014-01-21: ianlancetaylor
|
||||||
[Go] Add support for Go 1.3, not yet released.
|
[Go] Add support for Go 1.3, not yet released.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -666,9 +666,31 @@ func (arg SwigcptrWrapped_MyClass) GetAValue() (int, bool) {
|
||||||
few, then you might as well define your own struct that includes the
|
few, then you might as well define your own struct that includes the
|
||||||
swig-wrapped object, instead of adding methods to the swig-generated object.</p>
|
swig-wrapped object, instead of adding methods to the swig-generated object.</p>
|
||||||
|
|
||||||
<p>This only works if your wrappers do not need to import other go modules.
|
<p>If you need to import other go packages, you can do this with
|
||||||
There is at present no way to insert import statements in the correct place
|
<code>%go_import</code>. For example,</p>
|
||||||
in swig-generated go. If you need to do that, you must put your go code
|
<div class="code">
|
||||||
in a separate file.</p>
|
<pre>
|
||||||
|
%go_import("fmt", _ "unusedPackage", rp "renamed/package")
|
||||||
|
|
||||||
|
%insert(go_wrapper) %{
|
||||||
|
|
||||||
|
func foo() {
|
||||||
|
fmt.Println("Some string:", rp.GetString())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Importing the same package twice is permitted,
|
||||||
|
// Go code will be generated with only the first instance of the import.
|
||||||
|
%go_import("fmt")
|
||||||
|
|
||||||
|
%insert(go_wrapper) %{
|
||||||
|
|
||||||
|
func bar() {
|
||||||
|
fmt.Println("Hello world!")
|
||||||
|
}
|
||||||
|
|
||||||
|
%}
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,9 @@
|
||||||
* Go configuration module.
|
* Go configuration module.
|
||||||
* ------------------------------------------------------------ */
|
* ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
/* Code insertion directives */
|
||||||
|
#define %go_import(...) %insert(go_imports) %{__VA_ARGS__%}
|
||||||
|
|
||||||
/* Basic types */
|
/* Basic types */
|
||||||
|
|
||||||
%typemap(gotype) bool, const bool & "bool"
|
%typemap(gotype) bool, const bool & "bool"
|
||||||
|
|
|
||||||
|
|
@ -192,30 +192,26 @@ static _gostring_ _swig_makegostring(const char *p, size_t l) {
|
||||||
|
|
||||||
#ifndef SWIGGO_GCCGO
|
#ifndef SWIGGO_GCCGO
|
||||||
|
|
||||||
%insert(go_header) %{
|
%go_import("unsafe", _ "runtime/cgo")
|
||||||
|
|
||||||
import _ "runtime/cgo"
|
|
||||||
import "unsafe"
|
|
||||||
|
|
||||||
type _ unsafe.Pointer
|
|
||||||
|
|
||||||
%}
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
%go_import("syscall", "unsafe")
|
||||||
|
|
||||||
%insert(go_header) %{
|
%insert(go_header) %{
|
||||||
|
|
||||||
import "syscall"
|
|
||||||
import "unsafe"
|
|
||||||
|
|
||||||
type _ syscall.Sockaddr
|
type _ syscall.Sockaddr
|
||||||
|
|
||||||
type _ unsafe.Pointer
|
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
%insert(go_header) %{
|
||||||
|
|
||||||
|
type _ unsafe.Pointer
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
||||||
/* Function pointers are translated by the code in go.cxx into
|
/* Function pointers are translated by the code in go.cxx into
|
||||||
_swig_fnptr. Member pointers are translated to _swig_memberptr. */
|
_swig_fnptr. Member pointers are translated to _swig_memberptr. */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ class GO:public Language {
|
||||||
File *f_c_init;
|
File *f_c_init;
|
||||||
File *f_c_directors;
|
File *f_c_directors;
|
||||||
File *f_c_directors_h;
|
File *f_c_directors_h;
|
||||||
|
File *f_go_imports;
|
||||||
File *f_go_runtime;
|
File *f_go_runtime;
|
||||||
File *f_go_header;
|
File *f_go_header;
|
||||||
File *f_go_wrappers;
|
File *f_go_wrappers;
|
||||||
|
|
@ -84,6 +85,9 @@ class GO:public Language {
|
||||||
// A hash table of classes which were defined. The index is a Go
|
// A hash table of classes which were defined. The index is a Go
|
||||||
// type name.
|
// type name.
|
||||||
Hash *defined_types;
|
Hash *defined_types;
|
||||||
|
// A hash table of all the go_imports already imported. The index is a full
|
||||||
|
// import name e.g. '"runtime"' or '_ "runtime/cgo"' or 'sc "syscall"'.
|
||||||
|
Hash *go_imports;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GO():package(NULL),
|
GO():package(NULL),
|
||||||
|
|
@ -104,6 +108,7 @@ public:
|
||||||
f_c_init(NULL),
|
f_c_init(NULL),
|
||||||
f_c_directors(NULL),
|
f_c_directors(NULL),
|
||||||
f_c_directors_h(NULL),
|
f_c_directors_h(NULL),
|
||||||
|
f_go_imports(NULL),
|
||||||
f_go_runtime(NULL),
|
f_go_runtime(NULL),
|
||||||
f_go_header(NULL),
|
f_go_header(NULL),
|
||||||
f_go_wrappers(NULL),
|
f_go_wrappers(NULL),
|
||||||
|
|
@ -120,7 +125,8 @@ public:
|
||||||
making_variable_wrappers(false),
|
making_variable_wrappers(false),
|
||||||
is_static_member_function(false),
|
is_static_member_function(false),
|
||||||
undefined_types(NULL),
|
undefined_types(NULL),
|
||||||
defined_types(NULL) {
|
defined_types(NULL),
|
||||||
|
go_imports(NULL) {
|
||||||
director_multiple_inheritance = 1;
|
director_multiple_inheritance = 1;
|
||||||
director_language = 1;
|
director_language = 1;
|
||||||
director_prot_ctor_code = NewString("_swig_gopanic(\"accessing abstract class or protected constructor\");");
|
director_prot_ctor_code = NewString("_swig_gopanic(\"accessing abstract class or protected constructor\");");
|
||||||
|
|
@ -362,6 +368,7 @@ private:
|
||||||
f_c_wrappers = NewString("");
|
f_c_wrappers = NewString("");
|
||||||
f_c_init = NewString("");
|
f_c_init = NewString("");
|
||||||
f_c_directors = NewString("");
|
f_c_directors = NewString("");
|
||||||
|
f_go_imports = NewString("");
|
||||||
f_go_runtime = NewString("");
|
f_go_runtime = NewString("");
|
||||||
f_go_header = NewString("");
|
f_go_header = NewString("");
|
||||||
f_go_wrappers = NewString("");
|
f_go_wrappers = NewString("");
|
||||||
|
|
@ -379,6 +386,7 @@ private:
|
||||||
Swig_register_filebyname("director", f_c_directors);
|
Swig_register_filebyname("director", f_c_directors);
|
||||||
Swig_register_filebyname("director_h", f_c_directors_h);
|
Swig_register_filebyname("director_h", f_c_directors_h);
|
||||||
Swig_register_filebyname("go_begin", f_go_begin);
|
Swig_register_filebyname("go_begin", f_go_begin);
|
||||||
|
Swig_register_filebyname("go_imports", f_go_imports);
|
||||||
Swig_register_filebyname("go_runtime", f_go_runtime);
|
Swig_register_filebyname("go_runtime", f_go_runtime);
|
||||||
Swig_register_filebyname("go_header", f_go_header);
|
Swig_register_filebyname("go_header", f_go_header);
|
||||||
Swig_register_filebyname("go_wrapper", f_go_wrappers);
|
Swig_register_filebyname("go_wrapper", f_go_wrappers);
|
||||||
|
|
@ -445,11 +453,14 @@ private:
|
||||||
|
|
||||||
undefined_types = NewHash();
|
undefined_types = NewHash();
|
||||||
defined_types = NewHash();
|
defined_types = NewHash();
|
||||||
|
go_imports = NewHash();
|
||||||
|
|
||||||
// Emit code.
|
// Emit code.
|
||||||
|
|
||||||
Language::top(n);
|
Language::top(n);
|
||||||
|
|
||||||
|
Delete(go_imports);
|
||||||
|
|
||||||
// Write out definitions for the types not defined by SWIG.
|
// Write out definitions for the types not defined by SWIG.
|
||||||
|
|
||||||
Printv(f_go_wrappers, "\n", NULL);
|
Printv(f_go_wrappers, "\n", NULL);
|
||||||
|
|
@ -493,6 +504,7 @@ private:
|
||||||
Dump(f_c_runtime, f_c_begin);
|
Dump(f_c_runtime, f_c_begin);
|
||||||
Dump(f_c_wrappers, f_c_begin);
|
Dump(f_c_wrappers, f_c_begin);
|
||||||
Dump(f_c_init, f_c_begin);
|
Dump(f_c_init, f_c_begin);
|
||||||
|
Dump(f_go_imports, f_go_begin);
|
||||||
Dump(f_go_header, f_go_begin);
|
Dump(f_go_header, f_go_begin);
|
||||||
Dump(f_go_runtime, f_go_begin);
|
Dump(f_go_runtime, f_go_begin);
|
||||||
Dump(f_go_wrappers, f_go_begin);
|
Dump(f_go_wrappers, f_go_begin);
|
||||||
|
|
@ -506,6 +518,7 @@ private:
|
||||||
Delete(f_c_header);
|
Delete(f_c_header);
|
||||||
Delete(f_c_wrappers);
|
Delete(f_c_wrappers);
|
||||||
Delete(f_c_init);
|
Delete(f_c_init);
|
||||||
|
Delete(f_go_imports);
|
||||||
Delete(f_go_runtime);
|
Delete(f_go_runtime);
|
||||||
Delete(f_go_header);
|
Delete(f_go_header);
|
||||||
Delete(f_go_wrappers);
|
Delete(f_go_wrappers);
|
||||||
|
|
@ -535,7 +548,10 @@ private:
|
||||||
String *hold_import = imported_package;
|
String *hold_import = imported_package;
|
||||||
String *modname = Getattr(n, "module");
|
String *modname = Getattr(n, "module");
|
||||||
if (modname) {
|
if (modname) {
|
||||||
Printv(f_go_begin, "import \"", modname, "\"\n", NULL);
|
if (!Getattr(go_imports, modname)) {
|
||||||
|
Setattr(go_imports, modname, modname);
|
||||||
|
Printv(f_go_imports, "import \"", modname, "\"\n", NULL);
|
||||||
|
}
|
||||||
imported_package = modname;
|
imported_package = modname;
|
||||||
saw_import = true;
|
saw_import = true;
|
||||||
}
|
}
|
||||||
|
|
@ -544,6 +560,31 @@ private:
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Language::insertDirective()
|
||||||
|
*
|
||||||
|
* If the section is go_imports, store them for later.
|
||||||
|
* ---------------------------------------------------------------------- */
|
||||||
|
virtual int insertDirective(Node *n) {
|
||||||
|
char *section = Char(Getattr(n, "section"));
|
||||||
|
if ((ImportMode && !Getattr(n, "generated")) ||
|
||||||
|
!section || (strcmp(section, "go_imports") != 0)) {
|
||||||
|
return Language::insertDirective(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *code = Char(Getattr(n, "code"));
|
||||||
|
char *pch = strtok(code, ",");
|
||||||
|
while (pch != NULL) {
|
||||||
|
// Do not import same thing more than once.
|
||||||
|
if (!Getattr(go_imports, pch)) {
|
||||||
|
Setattr(go_imports, pch, pch);
|
||||||
|
Printv(f_go_imports, "import ", pch, "\n", NULL);
|
||||||
|
}
|
||||||
|
pch = strtok(NULL, ",");
|
||||||
|
}
|
||||||
|
return SWIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
* functionWrapper()
|
* functionWrapper()
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue