From 967dbd5f9655fe954865f6cbf026130a23a7eec8 Mon Sep 17 00:00:00 2001 From: Daniel Plagge <plagge@cs.uni-duesseldorf.de> Date: Tue, 8 Jan 2013 07:29:27 +0100 Subject: [PATCH] Getting Type Environment now from the model or context, not using the default. Introduced two distinct constructors for ContextTranslator to handle ISCContextRoot and ISCInternalContext properly. --- .../eventb/translator/ContextTranslator.java | 124 ++++++++++++------ .../internal/EventBMachineTranslator.java | 18 ++- 2 files changed, 94 insertions(+), 48 deletions(-) diff --git a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java index e65b7464..87595710 100644 --- a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java @@ -15,6 +15,7 @@ import java.util.Map; import org.eclipse.core.runtime.Assert; import org.eventb.core.IContextRoot; +import org.eventb.core.IEventBRoot; import org.eventb.core.IExtendsContext; import org.eventb.core.ILabeledElement; import org.eventb.core.IPOSequent; @@ -28,11 +29,11 @@ import org.eventb.core.ISCContext; import org.eventb.core.ISCContextRoot; import org.eventb.core.ISCExtendsContext; import org.eventb.core.ISCInternalContext; -import org.eventb.core.ISCMachineRoot; import org.eventb.core.ast.FormulaFactory; import org.eventb.core.ast.ITypeEnvironment; import org.eventb.core.seqprover.IConfidence; import org.rodinp.core.IAttributeType; +import org.rodinp.core.IInternalElement; import org.rodinp.core.IRodinElement; import org.rodinp.core.IRodinFile; import org.rodinp.core.IRodinProject; @@ -71,17 +72,70 @@ public final class ContextTranslator extends AbstractComponentTranslator { private final List<ClassifiedPragma> proofspragmas = new ArrayList<ClassifiedPragma>(); private final List<IPragma> pragmas = new ArrayList<IPragma>(); - public static ContextTranslator create(final ISCContext context) + private final IEventBRoot root; + private final FormulaFactory ff; + private final ITypeEnvironment te; + + public static ContextTranslator create(final ISCContextRoot context) + throws TranslationFailedException { + try { + assertConsistentModel(context); + final FormulaFactory ff = context.getFormulaFactory(); + final ITypeEnvironment te = context.getTypeEnvironment(ff); + final ContextTranslator translator = new ContextTranslator(context, + ff, te, context); + translator.translate(); + return translator; + } catch (RodinDBException e) { + throw createTranslationFailedException(context, e); + } + } + + public static ContextTranslator create(final ISCInternalContext context, + final FormulaFactory ff, final ITypeEnvironment te) throws TranslationFailedException { - ContextTranslator contextTranslator = new ContextTranslator(context); + final IEventBRoot root = getRootContext(context); + final ContextTranslator translator = new ContextTranslator(context, ff, + te, root); try { - contextTranslator.translate(); + assertConsistentModel(context.getRoot()); + translator.translate(); } catch (RodinDBException e) { - final String message = "A Rodin exception occured during translation process. Possible cause: building aborted or still in progress. Please wait until building has finished before starting ProB. If this does not help, perform a clean and start ProB after building has finished. Original Exception: "; - throw new TranslationFailedException(context.getComponentName(), - message + e.getLocalizedMessage()); + throw createTranslationFailedException(context, e); } - return contextTranslator; + return translator; + } + + private static IEventBRoot getRootContext(ISCInternalContext context) { + try { + String elementName = context.getElementName(); + IRodinProject rodinProject = context.getRodinProject(); + IRodinFile rodinFile = rodinProject.getRodinFile(elementName + + ".bcc"); + if (rodinFile.exists()) { + final IInternalElement element = rodinFile.getRoot(); + if (element instanceof IEventBRoot) { + return (IEventBRoot) element; + } + } + } catch (Exception e) { + // We do not guarantee to include proof infos. If something goes + // wrong, we ignore the Proof info. + } + return null; + } + + private static TranslationFailedException createTranslationFailedException( + final ISCContext context, RodinDBException e) + throws TranslationFailedException { + final String message = "A Rodin exception occured during translation process. Possible cause: building aborted or still in progress. Please wait until building has finished before starting ProB. If this does not help, perform a clean and start ProB after building has finished. Original Exception: "; + return new TranslationFailedException(context.getComponentName(), + message + e.getLocalizedMessage()); + } + + private static boolean assertConsistentModel(IInternalElement machine_root) + throws RodinDBException { + return Assert.isTrue(machine_root.getRodinFile().isConsistent()); } /** @@ -91,41 +145,27 @@ public final class ContextTranslator extends AbstractComponentTranslator { * contains errors) * * @param context + * The context to translate + * @param ff + * The FormulaFactory needed to extract the predicates + * @param te + * The TypeEnvironment needed to extract the predicates + * @param root + * the root to access the proofs * @throws TranslationFailedException - * @throws RodinDBException */ - private ContextTranslator(final ISCContext context) - throws TranslationFailedException { + private ContextTranslator(final ISCContext context, + final FormulaFactory ff, final ITypeEnvironment te, + final IEventBRoot root) throws TranslationFailedException { this.context = context; + this.ff = ff; + this.te = te; + this.root = root; } private void translate() throws RodinDBException { - if (context instanceof ISCContextRoot) { - ISCContextRoot context_root = (ISCContextRoot) context; - Assert.isTrue(context_root.getRodinFile().isConsistent()); - } else if (context instanceof ISCInternalContext) { - ISCInternalContext context_internal = (ISCInternalContext) context; - - try { - - String elementName = context_internal.getElementName(); - IRodinProject rodinProject = context_internal.getRodinProject(); - IRodinFile rodinFile = rodinProject.getRodinFile(elementName - + ".bcc"); - if (rodinFile.exists()) { - ISCContextRoot root = (ISCContextRoot) rodinFile.getRoot(); - collectProofInfo(root); - } - } catch (Exception e) { - // We do not guarantee to include proof infos. If something goes - // wrong, we ignore the Proof info. - } - - ISCMachineRoot machine_root = (ISCMachineRoot) context_internal - .getRoot(); - Assert.isTrue(machine_root.getRodinFile().isConsistent()); - } translateContext(); + collectProofInfo(); collectPragmas(); } @@ -148,8 +188,13 @@ public final class ContextTranslator extends AbstractComponentTranslator { } } - private void collectProofInfo(ISCContextRoot origin) - throws RodinDBException { + private void collectProofInfo() throws RodinDBException { + if (root != null) { + collectProofInfo(root); + } + } + + private void collectProofInfo(IEventBRoot origin) throws RodinDBException { IPSRoot proofStatus = origin.getPSRoot(); IPSStatus[] statuses = proofStatus.getStatuses(); @@ -334,8 +379,6 @@ public final class ContextTranslator extends AbstractComponentTranslator { } final PredicateVisitor visitor = new PredicateVisitor( new LinkedList<String>()); - final FormulaFactory ff = FormulaFactory.getDefault(); - final ITypeEnvironment te = ff.makeTypeEnvironment(); element.getPredicate(ff, te).accept(visitor); final PPredicate predicate = visitor.getPredicate(); list.add(predicate); @@ -352,7 +395,6 @@ public final class ContextTranslator extends AbstractComponentTranslator { } public List<IPragma> getPragmas() { - // TODO Auto-generated method stub return pragmas; } diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java index 1b9e5fb6..845e660e 100644 --- a/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java @@ -11,6 +11,8 @@ import java.util.List; import org.eventb.core.ISCInternalContext; import org.eventb.core.ISCMachineRoot; +import org.eventb.core.ast.FormulaFactory; +import org.eventb.core.ast.ITypeEnvironment; import org.rodinp.core.IRodinFile; import org.rodinp.core.RodinDBException; @@ -103,12 +105,13 @@ public final class EventBMachineTranslator extends EventBTranslator { final List<ContextTranslator> translators = new ArrayList<ContextTranslator>(); final List<String> processed = new ArrayList<String>(); - for (ISCMachineRoot m : models) { - ISCInternalContext[] seenContexts; + for (final ISCMachineRoot m : models) { try { - seenContexts = m.getSCSeenContexts(); - for (ISCInternalContext seenContext : seenContexts) { - collectContexts(translators, processed, seenContext); + final FormulaFactory ff = m.getFormulaFactory(); + final ITypeEnvironment te = m.getTypeEnvironment(ff); + final ISCInternalContext[] seenContexts = m.getSCSeenContexts(); + for (final ISCInternalContext seenContext : seenContexts) { + collectContexts(translators, processed, seenContext, ff, te); } } catch (RodinDBException e) { throw new TranslationFailedException(e); @@ -118,12 +121,13 @@ public final class EventBMachineTranslator extends EventBTranslator { } private void collectContexts(final List<ContextTranslator> translatorMap, - final List<String> processed, final ISCInternalContext context) + final List<String> processed, final ISCInternalContext context, + final FormulaFactory ff, final ITypeEnvironment te) throws TranslationFailedException { String name = context.getElementName(); if (!processed.contains(name)) { processed.add(name); - translatorMap.add(ContextTranslator.create(context)); + translatorMap.add(ContextTranslator.create(context, ff, te)); } } -- GitLab