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