@Nullable @Override public SReference create(@NotNull TemplateGenerator generator) { if (myInputTargetNode != null) { // output target node might has been copied (reduced) from the input target node // here accept only one-to-one copying SNode ultimateTarget = generator.findCopiedOutputNodeForInputNode_unique(myInputTargetNode); if (ultimateTarget != null) { return createStaticReference(ultimateTarget); } String resolveInfo = jetbrains.mps.util.SNodeOperations.getResolveInfo(myInputTargetNode); if (resolveInfo != null) { return createDynamicReference(resolveInfo, getTargetModelReference(generator), null); } // if input was copied - return one of its copies // this can easy produce incorrect references SNode ambiguousTarget = generator.findCopiedOutputNodeForInputNode(myInputTargetNode); if (ambiguousTarget != null) { // RI_CIN is the only case doResolve_Tricky was implemented and hence checkResolveTarget // check moved here. if (checkResolvedTarget(generator, ambiguousTarget)) { return createStaticReference(ambiguousTarget); } else { return jetbrains.mps.smodel.SReference.create( getReferenceRole(), getOutputSourceNode(), generator.getOutputModel().getReference(), null, null); } } } return createInvalidReference(generator, null); }