From: Hannu Niemistö Date: Tue, 27 Dec 2016 14:30:02 +0000 (+0200) Subject: Reverted if-without-else feature in SCL X-Git-Tag: v1.26.0~12 X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F27%2F227%2F1;p=simantics%2Fplatform.git Reverted if-without-else feature in SCL Removed possibility to have if-then -construct without else, because the implementation changed parsing rules and some existing code was broken. The feature might be added in future, if better implementation is found. refs #6894 related to change (refs #6888) Change-Id: I1c729c4176cfaf867ba3dbf13fd73fbc14f41e61 --- diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLPostLexer.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLPostLexer.java index 3d3b7b2f5..efc799322 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLPostLexer.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLPostLexer.java @@ -37,6 +37,7 @@ public class SCLPostLexer { NO_SEMICOLON_BEFORE.add(SCLTerminals.EOF); NO_SEMICOLON_BEFORE.add(SCLTerminals.SYMBOL); NO_SEMICOLON_BEFORE.add(SCLTerminals.THEN); + NO_SEMICOLON_BEFORE.add(SCLTerminals.ELSE); NO_SEMICOLON_BEFORE.add(SCLTerminals.IN); NO_SEMICOLON_BEFORE.add(SCLTerminals.RBRACE); NO_SEMICOLON_BEFORE.add(SCLTerminals.RBRACKET); @@ -145,7 +146,7 @@ public class SCLPostLexer { int loc = Locations.endOf(prevToken.location); push(new Token(SCLTerminals.RBRACE, loc, loc, "implicit }")); } - if(indentations.get(indentations.size()-1) == level && symbolId != SCLTerminals.ELSE) + if(indentations.get(indentations.size()-1) == level) push(new Token(SCLTerminals.SEMICOLON, symbolStart, symbolStart, "implicit ;")); } } @@ -175,7 +176,7 @@ public class SCLPostLexer { case SCLTerminals.RBRACE: case SCLTerminals.RPAREN: case SCLTerminals.RBRACKET: - //case SCLTerminals.ELSE: + case SCLTerminals.ELSE: case SCLTerminals.IN: int removedToken = SCLTerminals.EOF; while(!indentations.isEmpty()) { @@ -188,11 +189,15 @@ public class SCLPostLexer { } if(indentations.isEmpty()) throw error(symbolStart, symbolEnd, "No corresponding opening parenthesis for '" + symbol.text + "'."); - if(symbolId == SCLTerminals.THEN && removedToken == SCLTerminals.WHEN) - curToken = symbol = new Token(SCLTerminals.THEN_AFTER_WHEN, symbol.location, symbol.text); + if(symbolId == SCLTerminals.THEN) { + if(removedToken == SCLTerminals.WHEN) + curToken = symbol = new Token(SCLTerminals.THEN_AFTER_WHEN, symbol.location, symbol.text); + else { + indentations.add(-1); + indentationTokens.add(SCLTerminals.THEN); + } + } push(symbol); - //if(symbolId == SCLTerminals.THEN) - // indentations.add(-1); return; case SCLTerminals.EOF: while(indentations.size() > 1 && indentations.get(indentations.size()-1) >= 0) { diff --git a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/ModuleRegressionTests.java b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/ModuleRegressionTests.java index 527744c00..347191a3f 100644 --- a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/ModuleRegressionTests.java +++ b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/ModuleRegressionTests.java @@ -77,7 +77,7 @@ public class ModuleRegressionTests extends TestBase { @Test public void Guards1() { test(); } @Test public void Guards2() { test(); } @Test public void IdAsOperator() { test(); } - @Test public void IfWithoutElse() { test(); } + //@Test public void IfWithoutElse() { test(); } @Test public void IllegalChar() { test(); } @Test public void ImportJavaConstructor() { test(); } @Test public void ImportRef() { test(); }