| package org.eclipse.dltk.ruby.internal.parser.mixin; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.dltk.core.IMethod; |
| import org.eclipse.dltk.core.ModelException; |
| import org.eclipse.dltk.core.mixin.IMixinElement; |
| import org.eclipse.dltk.internal.core.ModelElement; |
| import org.eclipse.dltk.ruby.ast.RubyAliasExpression; |
| import org.eclipse.dltk.ruby.core.model.FakeMethod; |
| |
| public class AliasedRubyMixinMethod extends RubyMixinMethod { |
| |
| private final RubyMixinAlias alias; |
| |
| public AliasedRubyMixinMethod(RubyMixinModel model, RubyMixinAlias alias) { |
| super(model, alias.getKey()); |
| this.alias = alias; |
| final RubyAliasExpression node = alias.getAlias(); |
| final int length = node.sourceEnd() - node.sourceStart(); |
| final IMethod sourceMethod = findSourceMethod(model, alias); |
| final ModelElement fakeMethodParent; |
| if (sourceMethod != null |
| && sourceMethod.getParent() instanceof ModelElement) { |
| fakeMethodParent = (ModelElement) sourceMethod.getParent(); |
| } else { |
| fakeMethodParent = (ModelElement) alias.getSourceModule(); |
| } |
| FakeMethod fakeMethod = new FakeMethod(fakeMethodParent, node |
| .getNewValue(), node.sourceStart(), length, node.sourceStart(), |
| length); |
| if (sourceMethod != null) { |
| try { |
| fakeMethod.setFlags(sourceMethod.getFlags()); |
| fakeMethod.setParameters(sourceMethod.getParameters()); |
| } catch (ModelException e) { |
| } |
| } |
| this.setSourceMethods(new IMethod[] { fakeMethod }); |
| } |
| |
| private static IMethod findSourceMethod(RubyMixinModel model, |
| RubyMixinAlias alias) { |
| final IMethod[] sourceMethods = RubyMixinMethod.getSourceMethods(model, |
| alias.getOldKey()); |
| if (sourceMethods.length == 1 && sourceMethods[0] != null) { |
| return sourceMethods[0]; |
| } else { |
| return null; |
| } |
| } |
| |
| @Override |
| public String getName() { |
| return alias.getNewName(); |
| } |
| |
| @Override |
| public RubyMixinVariable[] getVariables() { |
| List result = new ArrayList(); |
| IMixinElement mixinElement = model.getRawModel().get(alias.getOldKey()); |
| IMixinElement[] children = mixinElement.getChildren(); |
| for (int i = 0; i < children.length; i++) { |
| IRubyMixinElement element = model.createRubyElement(children[i]); |
| if (element instanceof RubyMixinVariable) |
| result.add(element); |
| } |
| return (RubyMixinVariable[]) result |
| .toArray(new RubyMixinVariable[result.size()]); |
| } |
| |
| } |