scope.add (m.name, m);
}
+ /**
+ * Adds the specified method as a hidden member to this class,
+ * primarily used for default signal handlers.
+ *
+ * The hidden methods are not part of the `methods` collection.
+ *
+ * There may also be other use cases, eg, convert array.resize() to
+ * this type of method?
+ *
+ * @param m a method
+ */
+ public void add_hidden_method (Method m) {
+ if (m.binding == MemberBinding.INSTANCE) {
+ if (m.this_parameter != null) {
+ m.scope.remove (m.this_parameter.name);
+ }
+ m.this_parameter = new FormalParameter ("this", get_this_type ());
+ m.scope.add (m.this_parameter.name, m.this_parameter);
+ }
+ if (!(m.return_type is VoidType) && m.get_postconditions ().size > 0) {
+ if (m.result_var != null) {
+ m.scope.remove (m.result_var.name);
+ }
+ m.result_var = new LocalVariable (m.return_type.copy (), "result");
+ m.result_var.is_result = true;
+ }
+
+ scope.add (null, m);
+ }
+
/**
* Returns a copy of the list of methods.
*
if (is_virtual) {
default_handler = new Method (name, return_type, source_reference);
+
+ default_handler.owner = owner;
default_handler.access = access;
default_handler.external = external;
default_handler.is_virtual = true;
default_handler.signal_reference = this;
default_handler.body = body;
+
foreach (FormalParameter param in parameters) {
default_handler.add_parameter (param);
}
- parent_symbol.scope.add (null, default_handler);
+ var cl = parent_symbol as Class;
+
+ cl.add_hidden_method (default_handler);
default_handler.check (analyzer);
}
return !error;