X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fexpressions%2FEBlock.java;h=2c70bd90742ef6562d8c9f141bd705838264dc82;hp=ebe88b499aab482e79bef9baac25a544898abaa1;hb=862c09c9608329f326404342d12da61792eece2c;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07 diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EBlock.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EBlock.java index ebe88b499..2c70bd907 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EBlock.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EBlock.java @@ -1,16 +1,15 @@ package org.simantics.scl.compiler.elaboration.expressions; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; -import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.elaboration.chr.CHRRuleset; import org.simantics.scl.compiler.elaboration.chr.translation.CHRTranslation; import org.simantics.scl.compiler.elaboration.contexts.TranslationContext; import org.simantics.scl.compiler.elaboration.expressions.block.CHRStatement; import org.simantics.scl.compiler.elaboration.expressions.block.ConstraintStatement; import org.simantics.scl.compiler.elaboration.expressions.block.GuardStatement; +import org.simantics.scl.compiler.elaboration.expressions.block.IncludeStatement; import org.simantics.scl.compiler.elaboration.expressions.block.LetStatement; import org.simantics.scl.compiler.elaboration.expressions.block.RuleStatement; import org.simantics.scl.compiler.elaboration.expressions.block.Statement; @@ -19,7 +18,7 @@ import org.simantics.scl.compiler.errors.Locations; public class EBlock extends ASTExpression { - LinkedList statements = new LinkedList(); + ArrayList statements = new ArrayList(); boolean monadic; public EBlock() { @@ -33,14 +32,24 @@ public class EBlock extends ASTExpression { this.monadic = monadic; } - public LinkedList getStatements() { + public ArrayList getStatements() { return statements; } + + public Statement getFirst() { + return statements.get(0); + } + + public Statement getLast() { + return statements.get(statements.size()-1); + } @Override public Expression resolve(TranslationContext context) { - if(statements.isEmpty()) - throw new InternalCompilerError(); + if(statements.isEmpty()) { + context.getErrorLog().log(location, "Block should not be empty."); + return new EError(location); + } int i = statements.size()-1; Statement last = statements.get(i); if(!(last instanceof GuardStatement)) { @@ -66,7 +75,7 @@ public class EBlock extends ASTExpression { in = extractRules(i, endId, in); break; case CHR: - in = extractCHRRules(context, i, endId, in); + in = new ECHRRuleset(extractCHRRules(context, i, endId), in); break; } } @@ -78,21 +87,27 @@ public class EBlock extends ASTExpression { return new EPreRuleset(statements.subList(begin, end).toArray(new RuleStatement[end-begin]), in); } - private Expression extractCHRRules(TranslationContext context, int begin, int end, Expression in) { + private CHRRuleset extractCHRRules(TranslationContext context, int begin, int end) { CHRRuleset ruleset = new CHRRuleset(); ruleset.location = Locations.combine(statements.get(begin).location, statements.get(end-1).location); for(int i=begin;i)(List)statements.subList(begin, end), in); @@ -123,9 +138,14 @@ public class EBlock extends ASTExpression { public int getSyntacticFunctionArity() { if(monadic) return 0; - Statement lastStatement = statements.getLast(); + Statement lastStatement = statements.get(statements.size()-1); if(!(lastStatement instanceof GuardStatement)) return 0; return ((GuardStatement)lastStatement).value.getSyntacticFunctionArity(); } + + @Override + public void accept(ExpressionVisitor visitor) { + visitor.visit(this); + } }