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
}
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) {
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);
}
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;
}
// 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);
}
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);
}
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);
+ }
+ }
+ }
}