From bb034210f7877770b6c6ff733a5993c3115abda9 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Tue, 21 Oct 2008 19:30:44 +0100 Subject: [PATCH] Automatically add stem to GObject method names For example, this: extern(GObject): interface GtkWidget: void show() GObject obj obj.show() becomes gtk_widget_show(obj) Name is lower-cased, and an _ inserted before each upper case letter that follows a lower case one. Might need to way to state the stem explicitly for some types. --- dmd2/mangle.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/dmd2/mangle.c b/dmd2/mangle.c index 7d070ed..9565958 100644 --- a/dmd2/mangle.c +++ b/dmd2/mangle.c @@ -127,11 +127,41 @@ char *Declaration::mangle() break; case LINKc: - case LINKgobject: case LINKwindows: case LINKpascal: return ident->toChars(); + case LINKgobject: + { ClassDeclaration *cd = parent->isClassDeclaration(); + if (cd) + { + OutBuffer buf; + char *cp = cd->ident->toChars(); + bool start = true; + while (char c = *cp) { + if (isupper(c)) + { + if (!start) + buf.writeByte('_'); + buf.writeByte(tolower(c)); + start = true; + } + else + { + buf.writeByte(c); + start = false; + } + cp++; + } + buf.writeByte('_'); + buf.writestring(ident->toChars()); + char *p = buf.toChars(); + buf.data = NULL; + return p; + } + else + return ident->toChars(); + } case LINKcpp: #if IN_GCC || TARGET_LINUX return cpp_mangle(this); -- 2.11.4.GIT