@Override public SNode resolve(String referenceInfo, @Nullable SModelReference targetModelReference) { SNode classifier_ = super.resolve(referenceInfo, targetModelReference); if (classifier_ == null) { return null; } SNode classifier = SNodeOperations.cast(classifier_, "jetbrains.mps.baseLanguage.structure.Classifier"); if (SNodeOperations.isInstanceOf( classifier, "jetbrains.mps.baseLanguage.structure.ClassConcept")) { List<SNode> constructors = Sequence.fromIterable( BehaviorReflection.invokeNonVirtual( (Class<Iterable<SNode>>) ((Class) Object.class), (SNodeOperations.cast( classifier, "jetbrains.mps.baseLanguage.structure.ClassConcept")), "jetbrains.mps.baseLanguage.structure.ClassConcept", "call_constructors_5292274854859503373", new Object[] {})) .toListSequence(); if ((int) ListSequence.fromList(constructors).count() == 1) { return ListSequence.fromList(constructors).first(); } else if (ListSequence.fromList(constructors).count() > 1) { constructors = (List<SNode>) MethodResolveUtil.selectByParmCount(constructors, myActualArgs); if ((int) ListSequence.fromList(constructors).count() == 1) { return ListSequence.fromList(constructors).first(); } else { Iterator<SNode> typeParms = (Iterator<SNode>) myTypeParms.iterator(); Iterator<SNode> typeVars = (Iterator<SNode>) SLinkOperations.getTargets(classifier, "typeVariableDeclaration", true) .iterator(); Map<SNode, SNode> typeByTypeVar = new HashMap<SNode, SNode>(); while (typeParms.hasNext() && typeVars.hasNext()) { typeByTypeVar.put(typeVars.next(), typeParms.next()); } return MethodResolveUtil.chooseByParameterType( constructors, myActualArgs, typeByTypeVar); } } } return null; }
@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); } }