private void ResolveExpr(ref int segment, sema.Code.Lvalue destination, syn.Node node) { var nodeParen = node as syn.Node.Parenthesized; var nodeBlock = node as syn.Node.Block; var nodeLet = node as syn.Node.Let; var nodeIf = node as syn.Node.If; var nodeWhile = node as syn.Node.While; var nodeLoop = node as syn.Node.Loop; var nodeBreak = node as syn.Node.Break; var nodeContinue = node as syn.Node.Continue; var nodeReturn = node as syn.Node.Return; var nodeIdentifier = node as syn.Node.Identifier; var nodeNumber = node as syn.Node.Number; var nodeBool = node as syn.Node.LiteralBool; var nodeTuple = node as syn.Node.LiteralTuple; var nodeBinaryOp = node as syn.Node.BinaryOperation; if (nodeParen != null) { this.ResolveExpr(ref segment, destination, nodeParen.inner); } else if (nodeBlock != null) { this.ResolveExprBlock(ref segment, destination, nodeBlock); } else if (nodeLet != null) { this.ResolveExprLet(ref segment, destination, nodeLet); } else if (nodeIf != null) { this.ResolveExprIf(ref segment, destination, nodeIf); } else if (nodeWhile != null) { this.ResolveExprWhile(ref segment, destination, nodeWhile); } else if (nodeLoop != null) { this.ResolveExprLoop(ref segment, destination, nodeLoop); } else if (nodeBreak != null) { this.ResolveExprBreak(ref segment, destination, nodeBreak); } else if (nodeContinue != null) { this.ResolveExprContinue(ref segment, destination, nodeContinue); } else if (nodeReturn != null) { this.ResolveExprReturn(ref segment, destination, nodeReturn); } else if (nodeIdentifier != null) { this.ResolveExprName(ref segment, destination, nodeIdentifier); } else if (nodeNumber != null) { this.ResolveExprNumber(ref segment, destination, nodeNumber); } else if (nodeBool != null) { this.ResolveExprBool(ref segment, destination, nodeBool); } else if (nodeTuple != null) { this.ResolveExprTuple(ref segment, destination, nodeTuple); } else if (nodeBinaryOp != null) { this.ResolveExprBinaryOp(ref segment, destination, nodeBinaryOp); } else { this.reporter.InternalError("unimplemented", new diagn.Caret(node.span)); } }