[vala/wip/transform: 80/81] Make gdbus work, temp commit
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/wip/transform: 80/81] Make gdbus work, temp commit
- Date: Thu, 30 Jan 2014 22:23:46 +0000 (UTC)
commit 98a1b5a7c762b1dbf65b1209b128ee9f3240e146
Author: Luca Bruno <lucabru src gnome org>
Date: Tue May 21 21:08:05 2013 +0200
Make gdbus work, temp commit
codegen/valagdbusclientmodule.vala | 5 +++-
codegen/valagdbusclienttransformer.vala | 33 +++++++++++++++++++++++++-----
vala/valacodebuilder.vala | 4 +-
vala/valacodetransformer.vala | 18 ++++++++++++++++
vala/valasemanticanalyzer.vala | 8 +++++++
5 files changed, 59 insertions(+), 9 deletions(-)
---
diff --git a/codegen/valagdbusclientmodule.vala b/codegen/valagdbusclientmodule.vala
index 9899130..eef2f4f 100644
--- a/codegen/valagdbusclientmodule.vala
+++ b/codegen/valagdbusclientmodule.vala
@@ -72,7 +72,10 @@ public class Vala.GDBusClientModule : GDBusModule {
return;
}
- proxy_type = new CCodeIdentifier ("%s_PROXY".printf (get_ccode_type_id (iface)));
+ var proxy_class = (Class) CodeBuilder.symbol_from_string (iface.name + "Proxy",
iface.parent_symbol);
+ generate_class_declaration (proxy_class, cfile);
+
+ proxy_type = new CCodeIdentifier (get_ccode_type_id (proxy_class));
dbus_iface_name = new CCodeConstant ("\"%s\"".printf (get_dbus_name (iface)));
} else {
// use runtime type information for generic methods
diff --git a/codegen/valagdbusclienttransformer.vala b/codegen/valagdbusclienttransformer.vala
index 53960b3..8908488 100644
--- a/codegen/valagdbusclienttransformer.vala
+++ b/codegen/valagdbusclienttransformer.vala
@@ -310,7 +310,9 @@ public class Vala.GDBusClientTransformer : GVariantTransformer {
}
public override void visit_interface (Interface iface) {
- base.visit_interface (iface);
+ if (is_visited (iface)) {
+ base.visit_interface (iface);
+ }
string dbus_iface_name = get_dbus_name (iface);
if (dbus_iface_name == null) {
@@ -333,7 +335,7 @@ public class Vala.GDBusClientTransformer : GVariantTransformer {
var proxy = new Class (iface.name + "Proxy", iface.source_reference, null);
proxy.add_base_type (data_type ("GLib.DBusProxy"));
proxy.add_base_type (SemanticAnalyzer.get_data_type_for_symbol (iface));
- proxy.access = iface.access;
+ proxy.access = SymbolAccessibility.PRIVATE;
iface.parent_symbol.add_class (proxy);
generate_dbus_proxy_methods (proxy, iface);
@@ -344,13 +346,32 @@ public class Vala.GDBusClientTransformer : GVariantTransformer {
}
public override void visit_method_call (MethodCall expr) {
- var m = expr.call.symbol_reference as DynamicMethod;
- if (m == null || m.dynamic_type.data_type != symbol_from_string ("GLib.DBusProxy")) {
- // not a dynamic dbus call
+ var m = expr.call.symbol_reference as Method;
+ if (m is DynamicMethod && ((DynamicMethod) m).dynamic_type.data_type == symbol_from_string
("GLib.DBusProxy")) {
+ generate_dynamic_dbus_call (expr);
+ } else if (m != null && m == symbol_from_string ("GLib.Bus.get_proxy")) {
+ generate_get_proxy_call (expr);
+ } else {
base.visit_method_call (expr);
- return;
}
+ }
+
+ private void generate_get_proxy_call (MethodCall expr) {
+ var ma = (MemberAccess) expr.call;
+ var type_arg = ma.get_type_arguments ().get (0);
+ var object_type = type_arg as ObjectType;
+ if (object_type != null && object_type.type_symbol is Interface) {
+ var iface = (Interface) object_type.type_symbol;
+ if (get_dbus_name (iface) != null) {
+ current_namespace = context.analyzer.get_current_namespace (expr);
+ accept_external (iface);
+ }
+ }
+ base.visit_method_call (expr);
+ }
+ private void generate_dynamic_dbus_call (MethodCall expr) {
+ var m = (DynamicMethod) expr.call.symbol_reference;
push_builder (new CodeBuilder (context, expr.parent_statement, expr.source_reference));
Method wrapper;
diff --git a/vala/valacodebuilder.vala b/vala/valacodebuilder.vala
index ff43017..8d3fec4 100644
--- a/vala/valacodebuilder.vala
+++ b/vala/valacodebuilder.vala
@@ -265,8 +265,8 @@ public class Vala.CodeBuilder {
}
// only qualified types, will slightly simplify the work of SymbolResolver
- public static Symbol symbol_from_string (string symbol_string) {
- Symbol sym = CodeContext.get().root;
+ public static Symbol symbol_from_string (string symbol_string, Symbol? parent_symbol = null) {
+ Symbol sym = parent_symbol != null ? parent_symbol : CodeContext.get().root;
foreach (unowned string s in symbol_string.split (".")) {
sym = sym.scope.lookup (s);
}
diff --git a/vala/valacodetransformer.vala b/vala/valacodetransformer.vala
index 94bba1f..1c559a6 100644
--- a/vala/valacodetransformer.vala
+++ b/vala/valacodetransformer.vala
@@ -29,6 +29,10 @@ public class Vala.CodeTransformer : CodeVisitor {
public CodeBuilder b;
public ArrayList<CodeBuilder> builder_stack = new ArrayList<CodeBuilder> ();
public HashMap<string, CodeNode> wrapper_cache;
+ /* Keep tracks of generated stuff to avoid cycles */
+ public HashSet<CodeNode> unit_generated = new HashSet<CodeNode> ();
+
+ public Namespace current_namespace = null;
public void push_builder (CodeBuilder builder) {
builder_stack.add (b);
@@ -115,4 +119,18 @@ public class Vala.CodeTransformer : CodeVisitor {
}
node.accept (this);
}
+
+ public bool is_visited (CodeNode node) {
+ var file = node.source_reference.file;
+ return file.file_type == SourceFileType.SOURCE || (context.header_filename != null &&
file.file_type == SourceFileType.FAST);
+ }
+
+ public void accept_external (CodeNode node) {
+ if (node.source_reference != null) {
+ if (!is_visited (node) && !unit_generated.contains (node)) {
+ unit_generated.add (node);
+ check (node);
+ }
+ }
+ }
}
diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala
index 50b0b82..1f6e751 100644
--- a/vala/valasemanticanalyzer.vala
+++ b/vala/valasemanticanalyzer.vala
@@ -157,6 +157,14 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
return (TypeSymbol) sym;
}
+ public unowned Namespace? get_current_namespace (CodeNode node) {
+ unowned Symbol sym = get_current_symbol (node);
+ while (sym != null && !(sym is Namespace)) {
+ sym = sym.parent_symbol;
+ }
+ return (Namespace) sym;
+ }
+
public unowned Class? get_current_class (CodeNode node) {
return get_current_type_symbol (node) as Class;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]