@Nullable @Override public SNode resolveMethod( SNode contextNode, @NotNull String refText, List<SNode> actualArguments, List<SNode> methods) { // two variants: if (SNodeOperations.isInstanceOf( contextNode, "jetbrains.mps.baseLanguage.structure.InstanceMethodCallOperation")) { // as part of DotExpression SNode instanceType = SNodeOperations.cast( ((SNode) BehaviorManager.getInstance() .invoke( Object.class, ((SNode) BehaviorManager.getInstance() .invoke( Object.class, SNodeOperations.cast( contextNode, "jetbrains.mps.baseLanguage.structure.InstanceMethodCallOperation"), "call_getDotExpression_1224687669172", new Class[] {SNode.class})), "call_getOperandType_8871623299328377715", new Class[] {SNode.class})), "jetbrains.mps.baseLanguage.structure.ClassifierType"); Map<SNode, SNode> typeByTypeVar = ((SLinkOperations.getTarget(instanceType, "classifier", false) != null) ? MethodResolveUtil.getTypesByTypeVars( SLinkOperations.getTarget(instanceType, "classifier", false), SLinkOperations.getTargets(instanceType, "parameter", true)) : Collections.<SNode, SNode>emptyMap()); return MethodResolveUtil.chooseByParameterType(methods, actualArguments, typeByTypeVar); } else { // as local Map<SNode, SNode> typeByTypeVar = ClassifierScopeUtils.resolveClassifierTypeVars(classifier); return MethodResolveUtil.chooseByParameterType(methods, actualArguments, typeByTypeVar); } }