Ejemplo n.º 1
0
 @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;
 }