DevBoost / EMFText

EMFText is an Eclipse plug-in that allows you to define text syntax for languages described by an Ecore metamodel. EMFText enables developers to define textual Domain Specific Languages quickly and without the need to learn new technologies and concepts.
14 stars 12 forks source link

Need to Implement OCL Check #76

Open ghost opened 7 years ago

ghost commented 7 years ago

Hello,

I have a metamodel and OCL constraints are defined inside this metamodel using OCLinECore. An example entity from this metamodel is as follows:

/*
 * OCL Constraint: NoNullName
 * The name attribute can't be null.
 * 
 */
abstract class Nameable { interface }
{
    attribute name : String[1];
    attribute description : String[?];
    invariant NoNullName: 
        self.name <> null and self.name.size() > 0;
}
/**
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    public boolean validateNameable(Nameable nameable, DiagnosticChain diagnostics, Map<Object, Object> context) {
        if (!validate_NoCircularContainment(nameable, diagnostics, context)) return false;
        boolean result = validate_EveryMultiplicityConforms(nameable, diagnostics, context);
        if (result || diagnostics != null) result &= validate_EveryDataValueConforms(nameable, diagnostics, context);
        if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(nameable, diagnostics, context);
        if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(nameable, diagnostics, context);
        if (result || diagnostics != null) result &= validate_EveryProxyResolves(nameable, diagnostics, context);
        if (result || diagnostics != null) result &= validate_UniqueID(nameable, diagnostics, context);
        if (result || diagnostics != null) result &= validate_EveryKeyUnique(nameable, diagnostics, context);
        if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(nameable, diagnostics, context);
        if (result || diagnostics != null) result &= validateNameable_NoNullName(nameable, diagnostics, context);
        return result;
    } 

Now, I have two tasks that I want to achieve:

(1) I want to have OCL constraints applied in the editor of the parser. If there are any violations of the OCL constraints, I want them to be reported in the same way that the grammar parsing problems raise error in the editor.

(2) I want to use the parser's generated code in another Java application I wrote (I won't use the generated editor). What I have in my mind is, writing a Java application which gives a String (which is an instance of the grammar) to the parser and printing the errors (parsing errors, OCL violations, etc) in the console with the same messages that are shown in the visual editor of the language.

I looked at the generated code and try to understand, but it was not so trivial to me how to achieve these two tasks. I need some help, some suggestions from you.

Thanks a lot.

Note 1: I have looked at all the example grammars in the zoo and also looked at the mailing list archieve, but could not really find a solution for my case. Only one example uses OCL checker and it does not integrate with the parser. Note 2: General suggestion is NOT to use validation as a post processing step. So, that is why I want to integrate OCL-based validation with the parsing.