package org.jetbrains.plugins.ruby.motion.symbols; import com.intellij.openapi.module.Module; import com.jetbrains.cidr.CocoaDocumentationManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.ruby.motion.bridgesupport.Function; import org.jetbrains.plugins.ruby.ruby.codeInsight.symbols.Type; import org.jetbrains.plugins.ruby.ruby.codeInsight.symbols.structure.RTypedSyntheticSymbol; import org.jetbrains.plugins.ruby.ruby.codeInsight.symbols.structure.Symbol; import org.jetbrains.plugins.ruby.ruby.codeInsight.types.RType; /** * @author Dennis.Ushakov */ public class FunctionSymbol extends RTypedSyntheticSymbol implements MotionSymbol { @NotNull private final Module myModule; @NotNull private final Function myFunction; public FunctionSymbol(@NotNull Module module, @Nullable String name, @Nullable Symbol parent, @NotNull RType returnType, @NotNull Function function) { super(module.getProject(), name, function.isClassMethod() ? Type.CLASS_METHOD : Type.INSTANCE_METHOD, parent, returnType, getMinParameterCount(function), getMaxParameterCount(function)); myModule = module; myFunction = function; } @NotNull @Override public Module getModule() { return myModule; } @NotNull public Function getFunction() { return myFunction; } public static int getMinParameterCount(final Function function) { return function.getArguments().size(); } public static int getMaxParameterCount(final Function function) { return function.isVariadic() ? -1 : function.getArguments().size(); } @Override public CocoaDocumentationManager.DocTokenType getInfoType() { return getParentSymbol() != null ? myFunction.isClassMethod() ? CocoaDocumentationManager.DocTokenType.CLASS_METHOD : CocoaDocumentationManager.DocTokenType.INSTANCE_METHOD : CocoaDocumentationManager.DocTokenType.FUNCTION; } @Override public String getInfoName() { return myFunction.getName(); } }