diff --git a/.gitmodules b/.gitmodules index 0d5519ead..e867f0164 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "core-lib"] path = core-lib - url = https://github.com/charig/SOM.git + url = https://github.com/gefarion/SOM.git [submodule "libs/truffle"] path = libs/truffle url = https://github.com/smarr/Truffle.git diff --git a/src/som/compiler/Parser.java b/src/som/compiler/Parser.java index dac9c60c9..b1c15f3fa 100644 --- a/src/som/compiler/Parser.java +++ b/src/som/compiler/Parser.java @@ -74,6 +74,7 @@ import som.interpreter.nodes.FieldNode.FieldReadNode; import som.interpreter.nodes.FieldNode.FieldWriteNode; import som.interpreter.nodes.MessageSendNode.AbstractMessageSendNode; +import som.interpreter.nodes.MessageSendNode; import som.interpreter.nodes.literals.ArrayLiteralNode; import som.interpreter.nodes.literals.BigIntegerLiteralNode; import som.interpreter.nodes.literals.BlockNode; @@ -541,6 +542,11 @@ private String assignment() throws ParseError { return v; } + private String makeTempVariableName() { + SourceCoordinate coord = getCoordinate(); + return "!" + coord.startLine + "!" + coord.startColumn; + } + private ExpressionNode evaluation(final MethodGenerationContext mgenc) throws ParseError { ExpressionNode exp = primary(mgenc); if (isIdentifier(sym) || sym == Keyword || sym == OperatorSequence @@ -548,19 +554,31 @@ private ExpressionNode evaluation(final MethodGenerationContext mgenc) throws Pa ExpressionNode receiver = exp; SourceCoordinate coord = getCoordinate(); + SourceSection section = getSource(coord); exp = messages(mgenc, receiver); + if (SemiColon == sym) { // Method Cascade + + String varname = makeTempVariableName(); + mgenc.addLocalIfAbsent(varname); + + exp.adoptChildren(); + receiver.replace(variableRead(mgenc, varname, section)); + List expressions = new ArrayList(); + + expressions.add(variableWrite(mgenc, varname, receiver, section)); expressions.add(exp); while (accept(SemiColon)) { - expressions.add(messages(mgenc, receiver)); + expressions.add(messages(mgenc, variableRead(mgenc, varname, section))); } return createSequenceNode(coord, expressions); } + } return exp; }