private void createBlocks() { for (int i = 0; i < MapInfo.Blocks.Count; i++) { for (int j = 0; j < MapInfo.Blocks[i].Count; j++) { BlockBuilder blockBuilder = new BlockBuilder(); blocks.Add(blockBuilder.BuildBlock(MapInfo.Blocks[i][j])); } } }
private BoundBlock BuildBlock(BoundStatement node) { var block = node as BoundBlock; if (block != null) return block; var builder = new BlockBuilder(this); builder.Add(node); return builder.BuildBlock(node.Location); }
private BoundBlock BuildBlock(SyntaxNode syntax, SourceLocation location) { IEnumerable<SyntaxNode> items; var block = syntax as BlockSyntax; if (block != null) items = block.Statements; else items = new[] { syntax }; var builder = new BlockBuilder(this); foreach (var item in items) { var node = item.Accept(this); var statement = node as BoundStatement ?? new BoundExpressionStatement((BoundExpression)node, GetLocation(item)); builder.Add(statement); } return builder.BuildBlock(location ?? SourceLocation.Missing); }
private BoundStatement BuildSet(IIdentifier identifier, BoundExpression value) { switch (identifier.Type) { case IdentifierType.Parameter: return new BoundSetVariable( _scope.GetArgument(identifier), value, SourceLocation.Missing ); case IdentifierType.Scoped: var builder = new BlockBuilder(this); var valueTemporary = builder.CreateTemporary(); builder.Add(new BoundSetVariable( valueTemporary, value, SourceLocation.Missing )); builder.Add(BuildSetWithScope(builder, identifier.WithScope, identifier.Fallback, valueTemporary)); return builder.BuildBlock(SourceLocation.Missing); case IdentifierType.Local: case IdentifierType.Global: if (identifier.Type == IdentifierType.Global) _scope.IsGlobalScopeReferenced = true; if (identifier.Closure == null) return new BoundSetVariable(_scope.GetLocal(identifier), value, SourceLocation.Missing); return new BoundSetVariable( _scope.GetClosureField(identifier), value, SourceLocation.Missing ); /* // These are handled upstream. case IdentifierType.This: case IdentifierType.Null: case IdentifierType.Undefined: case IdentifierType.Arguments: */ default: throw new InvalidOperationException("Cannot find variable of argument"); } }
private BoundIf BuildGetWithScope(BlockBuilder builder, WithScope withScope, IIdentifier fallback, BoundTemporary result, BoundTemporary withTarget) { var withLocal = builder.CreateTemporary(); builder.Add(new BoundSetVariable( withLocal, new BoundGetVariable(_withIdentifiers[withScope.Identifier]), SourceLocation.Missing )); var getter = new BlockBuilder(this); if (withTarget != null) { getter.Add(new BoundSetVariable( withTarget, new BoundGetVariable(withLocal), SourceLocation.Missing )); } getter.Add(new BoundSetVariable( result, BuildGetMember( new BoundGetVariable(withLocal), BoundConstant.Create(fallback.Name) ), SourceLocation.Missing )); BoundBlock @else; if (withScope.Parent == null) { @else = BuildBlock(new BoundSetVariable( result, BuildGet( fallback, null ), SourceLocation.Missing )); } else { @else = BuildBlock(BuildGetWithScope( builder, withScope.Parent, fallback, result, withTarget )); } return new BoundIf( new BoundHasMember( new BoundGetVariable(withLocal), fallback.Name ), getter.BuildBlock(SourceLocation.Missing), @else, SourceLocation.Missing ); }