add fragment warning and fixes

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8645 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Marcelo Matus 2006-01-30 22:22:13 +00:00
commit ba1e3f9ee3
6 changed files with 43 additions and 16 deletions

View file

@ -5,4 +5,6 @@ namespace std
%callback(1) wflush;
}
%include <std_basic_string.i>
%include <std_wstring.i>
%include <std/std_wiostream.i>

View file

@ -62,7 +62,7 @@ namespace std {
%fragment(SWIG_Traits_frag(std::multimap<_Key, _Tp, _Compare, _Alloc >), "header",
fragment=SWIG_Traits_frag(std::pair<_Key, _Tp >),
fragment="StdMultiapTraits") {
fragment="StdMultimapTraits") {
namespace swig {
template <> struct traits<std::multimap<_Key, _Tp, _Compare, _Alloc > > {
typedef pointer_category category;

View file

@ -158,6 +158,9 @@
#define WARN_TYPEMAP_TYPECHECK_UNDEF 472
#define WARN_TYPEMAP_DIRECTOROUT_PTR 473
/* -- Fragments -- */
#define WARN_FRAGMENT_NOT_FOUND 490
/* -- General code generation -- */
#define WARN_LANG_OVERLOAD_DECL 501

View file

@ -374,7 +374,11 @@ void emit_action(Node *n, Wrapper *f) {
c = Char(t);
tok = strtok(c,",");
while (tok) {
Swig_fragment_emit(tok);
String *fname = NewString(tok);
Setfile(fname, Getfile(n));
Setline(fname, Getline(n));
Swig_fragment_emit(fname);
Delete(fname);
tok = strtok(NULL,",");
}
Delete(t);

View file

@ -18,6 +18,7 @@ char cvsroot_fragment_c[] = "$Header$";
#include "swig.h"
#include "swigkeys.h"
#include "swigwarn.h"
static Hash *fragments = 0;
static Hash *looking_fragments = 0;
@ -89,7 +90,11 @@ Swig_fragment_emit(Node *n) {
String *name = 0;
String *type = 0;
if (!fragments) return;
if (!fragments) {
Swig_warning(WARN_FRAGMENT_NOT_FOUND, Getfile(n), Getline(n), "Fragment '%s' not found.\n", name);
return;
}
name = Getattr(n,k_value);
if (!name) {
@ -139,19 +144,24 @@ Swig_fragment_emit(Node *n) {
Delattr(looking_fragments,name);
}
}
} else {
if (code && type) {
SwigType *rtype = SwigType_typedef_resolve_all(type);
if (!Equal(type,rtype)) {
String *name = Copy(Getattr(n,k_value));
Append(name,rtype);
Swig_fragment_emit(name);
Delete(name);
}
Delete(rtype);
}
} else if (!code && type) {
SwigType *rtype = SwigType_typedef_resolve_all(type);
if (!Equal(type,rtype)) {
String *name = Copy(Getattr(n,k_value));
String *mangle = Swig_string_mangle(type);
Append(name,mangle);
Setfile(name, Getfile(n));
Setline(name, Getline(n));
Swig_fragment_emit(name);
Delete(mangle);
Delete(name);
}
Delete(rtype);
}
if (!code) {
Swig_warning(WARN_FRAGMENT_NOT_FOUND, Getfile(n), Getline(n), "Fragment '%s' not found.\n", name);
}
tok = pc ? pc + 1 : 0;
if (tok) {
pc = char_index(tok,',');

View file

@ -1358,7 +1358,11 @@ Printf(stdout, "Swig_typemap_lookup %s [%s %s]\n", op, type, pname ? pname : "NO
sprintf(temp,"%s:fragment", cop);
f = Getattr(node,tmop_name(temp));
if (f) {
Swig_fragment_emit(f);
String *fname = Copy(f);
Setfile(fname, Getfile(node));
Setline(fname, Getline(node));
Swig_fragment_emit(fname);
Delete(fname);
}
}
@ -1433,7 +1437,11 @@ Swig_typemap_emit_code_fragments(const String_or_char *op, Parm *p) {
String *temp = NewStringf("%s:fragment",op);
String *f = Getattr(p,tmop_name(temp));
if (f) {
Swig_fragment_emit(f);
String *fname = Copy(f);
Setfile(fname, Getfile(p));
Setline(fname, Getline(p));
Swig_fragment_emit(fname);
Delete(fname);
}
Delete(temp);
}