Simplify printer whitespace and newline handling

Trying to handle all the whitespace and newline printing inside
printToken got overly complicated, and resulted in a few bugs in
the layout around comments and indentation that were hard to fix.
Rewrite the whitespace and newline handling to be handled directly
by the object printers, using requestSpace() to ensure whitespace
is inserted and requestNewline() to ensure a newline is inserted.

Also fixes unnecessarily left aligning all comments that contain
indentation, and fixes accidentally unindenting comments that are
the last token in their indented block.

Change-Id: I18707802726107cf0b6ec7de9b542d0ec1d2c0dd
4 files changed
tree: 0764030117096a66e322499a05825581e95e35bc
  1. bootstrap/
  2. bpfmt/
  3. bpmodify/
  4. deptools/
  5. parser/
  6. pathtools/
  7. proptools/
  8. Blueprints
  9. bootstrap.bash
  10. build.ninja.in
  11. context.go
  12. context_test.go
  13. CONTRIBUTING.md
  14. doc.go
  15. LICENSE
  16. live_tracker.go
  17. mangle.go
  18. module_ctx.go
  19. ninja_defs.go
  20. ninja_strings.go
  21. ninja_strings_test.go
  22. ninja_writer.go
  23. ninja_writer_test.go
  24. package_ctx.go
  25. README.md
  26. scope.go
  27. singleton_ctx.go
  28. splice_modules_test.go
  29. unpack.go
  30. unpack_test.go
README.md

Blueprint Build System

Blueprint is a meta-build system that reads in Blueprints files that describe modules that need to be built, and produces a Ninja (http://martine.github.io/ninja/) manifest describing the commands that need to be run and their dependencies. Where most build systems use built-in rules or a domain-specific language to describe the logic for converting module descriptions to build rules, Blueprint delegates this to per-project build logic written in Go. For large, heterogenous projects this allows the inherent complexity of the build logic to be maintained in a high-level language, while still allowing simple changes to individual modules by modifying easy to understand Blueprints files.