private static EModelElementRef findReferencedMetamodelElement(
      CSTNode syntaxElement, IRegion region) {
    Object astObj = syntaxElement.getAst();

    if (astObj instanceof EClassifier) {
      if (syntaxElement instanceof SimpleNameCS) {
        if (astObj instanceof EModelElement) {
          return new EModelElementRef(
              (EModelElement) astObj, HyperlinkUtil.createRegion(syntaxElement));
        }
      } else if (syntaxElement instanceof PathNameCS && !isConstructorCS(syntaxElement)) {
        if (astObj instanceof ENamedElement) {
          PathNameCS pathNameCS = (PathNameCS) syntaxElement;

          int[] selectedNamePos = new int[1];
          // IRegion resultRegion = refineRegion(pathNameCS, region, selectedNamePos);
          IRegion resultRegion = getPathRegion(pathNameCS, region, selectedNamePos);
          if (resultRegion != null) {
            ENamedElement ast = (ENamedElement) pathNameCS.getAst();
            int pos = selectedNamePos[0];
            final EList<SimpleNameCS> csNames = pathNameCS.getSimpleNames();

            if (pos >= 0 && pos < csNames.size() - 1) {
              QvtOperationalEnv env = getEnv(pathNameCS);

              List<SimpleNameCS> selectedNames = csNames.subList(0, pos + 1);
              List<String> stringNames = new ArrayList<String>(selectedNames.size());
              for (SimpleNameCS nameCS : selectedNames) {
                stringNames.add(nameCS.getValue());
              }

              ast = env.lookupClassifier(stringNames);
              if (ast == null) {
                ast = env.lookupPackage(stringNames);
              }
            }

            if (ast != null) {
              return new EModelElementRef(ast, resultRegion);
            }
          }
        }
      }
    } else if (astObj instanceof EEnumLiteral) {
      return new EModelElementRef((EEnumLiteral) astObj, HyperlinkUtil.createRegion(syntaxElement));
    }

    return null;
  }
  /**
   * Registers metamodel for use with this environment.
   *
   * @return the metamodel package denoted by the given <code>URI</code> or <code>null</code> if no
   *     package was resolved
   */
  static List<EPackage> registerMetamodel(
      QvtOperationalEnv qvtEnv, String metamodelUri, List<String> path) {
    EPackage.Registry registry = qvtEnv.getFactory().getEPackageRegistry();
    List<EPackage> metamodels = new ArrayList<EPackage>(1);

    try {
      List<EPackage> desc = Collections.emptyList();
      if (metamodelUri != null && path.isEmpty()) {
        EPackage ePackage = registry.getEPackage(metamodelUri);
        if (ePackage != null) {
          desc = Collections.singletonList(ePackage);
        } else {
          ePackage = MetamodelRegistry.tryLookupEmptyRootPackage(metamodelUri, registry);
          if (ePackage != null) {
            desc = Collections.singletonList(ePackage);
          }
        }
      } else {
        desc = MetamodelRegistry.resolveMetamodels(registry, path);
      }

      for (EPackage model : desc) {
        // register meta-model for EClassifier lookup
        if (model.getNsURI() == null) {
          while (true) {
            if (model.getESuperPackage() == null) {
              break;
            }
            model = model.getESuperPackage();
          }
        }

        metamodels.add(model);
        if (metamodelUri != null) {
          qvtEnv.getEPackageRegistry().put(metamodelUri, model);
        }

        // break;
      }
    } catch (EmfException e) {
      // It's legal situation of unresolved metamodels
    }
    return metamodels;
  }