X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Felaboration%2Ftransformations%2FDecomposedRule.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Felaboration%2Ftransformations%2FDecomposedRule.java;h=bfffd2c6e74a6a1e40a902f7645a528256a6d14b;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/DecomposedRule.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/DecomposedRule.java new file mode 100644 index 000000000..bfffd2c6e --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/transformations/DecomposedRule.java @@ -0,0 +1,61 @@ +package org.simantics.scl.compiler.internal.elaboration.transformations; + +import gnu.trove.procedure.TObjectObjectProcedure; + +import java.util.ArrayList; + +import org.simantics.scl.compiler.elaboration.contexts.TypingContext; +import org.simantics.scl.compiler.elaboration.query.QMapping; +import org.simantics.scl.compiler.elaboration.query.Query; +import org.simantics.scl.compiler.elaboration.relations.LocalRelation; +import org.simantics.scl.compiler.elaboration.rules.SectionName; +import org.simantics.scl.compiler.elaboration.rules.TransformationRule; + +public class DecomposedRule { + final TransformationRule rule; + final ArrayList sourceQueries = new ArrayList(); + final ArrayList sourceMappings = new ArrayList(); + final ArrayList targetQueries = new ArrayList(); + final ArrayList targetMappings = new ArrayList(); + + LocalRelation ruleMatchingRelation; + + private DecomposedRule(TransformationRule rule) { + this.rule = rule; + } + + public static DecomposedRule decompose(final TypingContext context, TransformationRule rule, final boolean forwardDirection) { + final DecomposedRule result = new DecomposedRule(rule); + rule.forEachSection(new TObjectObjectProcedure() { + @Override + public boolean execute(SectionName sectionName, Query[] queries) { + switch(forwardDirection ? sectionName.forwardRole : sectionName.backwardRole) { + case MATCH: + for(Query query : queries) { + if(query instanceof QMapping) { + QMapping mapping = (QMapping)query; + result.sourceMappings.add(mapping); + } + else + result.sourceQueries.add(query.copy(context)); + } + break; + case ENFORCE: + case ENFORCE_FIRST_TIME: // Because this is one-shot, these two are equivalent + for(Query query : queries) { + if(query instanceof QMapping) { + QMapping mapping = (QMapping)query; + result.targetMappings.add(mapping); + } + else + result.targetQueries.add(query.copy(context)); + } + break; + case IGNORE: + } + return true; + } + }); + return result; + } +}