Browse Source

kernel: Make aliasing work.

Method must have its `.selector` properly set.
A bit tricky workaround by copying and amending existing method
to have new selector (not compatible with recompiling;
but aliased method should not be recompiled as they are not own).
Herbert Vojčík 7 years ago
parent
commit
44ea566f1e
1 changed files with 16 additions and 1 deletions
  1. 16 1
      support/kernel-fundamentals.js

+ 16 - 1
support/kernel-fundamentals.js

@@ -351,6 +351,21 @@ define(['./compatibility'], function () {
             // This is handled by #removeCompiledMethod
         }
 
+        function aliased (selector, method) {
+            if (method.selector === selector) return method;
+            var result = st.method({
+                selector: selector,
+                args: method.args,
+                protocol: method.protocol,
+                source: '"Aliased as ' + selector + '"\n' + method.source,
+                messageSends: method.messageSends,
+                referencesClasses: method.referencedClasses,
+                fn: method.fn
+            });
+            result.methodClass = method.methodClass;
+            return result;
+        }
+
         function applyTraitTransformation (traitTransformation, obj) {
             var traitMethods = traitTransformation.trait.methods;
             Object.keys(traitMethods).forEach(function (selector) {
@@ -359,7 +374,7 @@ define(['./compatibility'], function () {
             var traitAliases = traitTransformation.aliases || {};
             Object.keys(traitAliases).forEach(function (aliasSelector) {
                 var aliasedMethod = traitMethods[traitAliases[aliasSelector]];
-                if (aliasedMethod) obj[aliasSelector] = aliasedMethod;
+                if (aliasedMethod) obj[aliasSelector] = aliased(aliasSelector, aliasedMethod);
                 else delete obj[aliasSelector];
             });
             var traitExclusions = traitTransformation.exclusions || [];