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;
 }
 @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);
   }
 }