@Override protected void beforeEnsureIsLinked(EObject obj, EReference ref, IDiagnosticProducer producer) { if (XtextPackage.eINSTANCE.getTypeRef_Classifier() == ref) { final TypeRef typeRef = (TypeRef) obj; if (typeRef.getMetamodel() == null) setDefaultValue(obj, XtextPackage.eINSTANCE.getTypeRef_Metamodel(), producer); } else super.beforeEnsureIsLinked(obj, ref, producer); }
@Override protected String getUnconvertedLinkText(EObject object, EReference reference, EObject context) { if (reference == XtextPackage.eINSTANCE.getGrammar_UsedGrammars()) return ((Grammar) object).getName(); if (reference == XtextPackage.eINSTANCE.getTypeRef_Metamodel()) return aliasResolver.getValue(object); if (reference == XtextPackage.eINSTANCE.getAbstractMetamodelDeclaration_EPackage()) return ((EPackage) object).getNsURI(); if (object instanceof AbstractRule) return ((AbstractRule) object).getName(); return super.getUnconvertedLinkText(object, reference, context); } }
@Override public List<EObject> getLinkedObjects(EObject context, EReference ref, INode node) throws IllegalNodeException { if (ref == XtextPackage.eINSTANCE.getGrammar_UsedGrammars()) return getUsedGrammar((Grammar) context, node); if (ref == XtextPackage.eINSTANCE.getTypeRef_Metamodel()) return getLinkedMetaModel((TypeRef)context, ref, (ILeafNode) node); if (ref == XtextPackage.eINSTANCE.getAbstractMetamodelDeclaration_EPackage() && context instanceof GeneratedMetamodel) return createPackage((GeneratedMetamodel) context, (ILeafNode) node); if (ref == XtextPackage.eINSTANCE.getAbstractMetamodelDeclaration_EPackage() && context instanceof ReferencedMetamodel) return getPackage((ReferencedMetamodel)context, (ILeafNode) node); return super.getLinkedObjects(context, ref, node); }
@Override protected void setDefaultValueImpl(EObject obj, EReference ref, IDiagnosticProducer producer) { if (XtextPackage.eINSTANCE.getTypeRef_Metamodel() == ref) { final TypeRef typeRef = (TypeRef) obj; final String typeRefName = GrammarUtil.getTypeRefName(typeRef); final List<EObject> metamodels = XtextMetamodelReferenceHelper.findBestMetamodelForType(typeRef, "", typeRefName, scopeProvider.getScope(typeRef, ref)); if (metamodels.isEmpty() || metamodels.size() > 1) producer.addDiagnostic(new DiagnosticMessage("Cannot find meta model for type '" + typeRefName + "'", Severity.ERROR, null)); else typeRef.setMetamodel((AbstractMetamodelDeclaration) metamodels.get(0)); } else if (XtextPackage.eINSTANCE.getCrossReference_Terminal() == ref) { AbstractRule rule = GrammarUtil.findRuleForName(GrammarUtil.getGrammar(obj), "ID"); if (rule == null) producer.addDiagnostic(new DiagnosticMessage("Cannot resolve implicit reference to rule 'ID'", Severity.ERROR, null)); else { RuleCall call = XtextFactory.eINSTANCE.createRuleCall(); call.setRule(rule); ((CrossReference) obj).setTerminal(call); } } else { super.setDefaultValueImpl(obj, ref, producer); } }
@Override public boolean isTransient(EObject owner, EStructuralFeature feature, int index) { if (feature == XtextPackage.eINSTANCE.getTypeRef_Metamodel()) { final TypeRef typeRef = (TypeRef) owner; final AbstractMetamodelDeclaration m = typeRef.getMetamodel(); return true; else if (rule.getName().equals(returnType.getClassifier().getName())) { return isTransient(returnType, XtextPackage.eINSTANCE.getTypeRef_Metamodel(), -1); } else if (GrammarUtil.isDatatypeRule(rule)) { return NodeModelUtils.getNode(returnType) == null;
@Override public ValueTransient isValueTransient(EObject owner, EStructuralFeature feature) { if (feature == XtextPackage.eINSTANCE.getTypeRef_Metamodel()) { final TypeRef typeRef = (TypeRef) owner; final AbstractMetamodelDeclaration m = typeRef.getMetamodel(); return YES; else if (rule.getName().equals(returnType.getClassifier().getName())) { if (isValueTransient(returnType, XtextPackage.eINSTANCE.getTypeRef_Metamodel()) == YES) return PREFERABLY; else