Index: lib/src/chunk_builder.dart |
diff --git a/lib/src/chunk_builder.dart b/lib/src/chunk_builder.dart |
index 83f62a48982f03ee9ef84d51c49dd3d881dcab07..c70b0e1eb628b438c75853b6bc07735e9cc289f1 100644 |
--- a/lib/src/chunk_builder.dart |
+++ b/lib/src/chunk_builder.dart |
@@ -361,15 +361,15 @@ class ChunkBuilder { |
var span = new Span(openSpan.cost); |
for (var i = openSpan.start; i < end; i++) { |
var chunk = _chunks[i]; |
- if (!chunk.isHardSplit) chunk.spans.add(span); |
+ if (!chunk.rule.isHardened) chunk.spans.add(span); |
} |
} |
/// Starts a new [Rule]. |
/// |
- /// If omitted, defaults to a new [SimpleRule]. |
+ /// If omitted, defaults to a new [Rule]. |
void startRule([Rule rule]) { |
- if (rule == null) rule = new SimpleRule(); |
+ if (rule == null) rule = new Rule(); |
// See if any of the rules that contain this one care if it splits. |
_rules.forEach((outer) => outer.contain(rule)); |
@@ -383,9 +383,9 @@ class ChunkBuilder { |
/// first operand but not get forced to split if a comment appears before the |
/// entire expression. |
/// |
- /// If [rule] is omitted, defaults to a new [SimpleRule]. |
+ /// If [rule] is omitted, defaults to a new [Rule]. |
void startLazyRule([Rule rule]) { |
- if (rule == null) rule = new SimpleRule(); |
+ if (rule == null) rule = new Rule(); |
_lazyRules.add(rule); |
} |
@@ -490,7 +490,7 @@ class ChunkBuilder { |
/// `true`, the block is considered to always split. |
/// |
/// Returns the previous writer for the surrounding block. |
- ChunkBuilder endBlock(HardSplitRule ignoredSplit, {bool forceSplit}) { |
+ ChunkBuilder endBlock(Rule ignoredSplit, {bool forceSplit}) { |
_divideChunks(); |
// If we don't already know if the block is going to split, see if it |
@@ -504,7 +504,9 @@ class ChunkBuilder { |
break; |
} |
- if (chunk.isHardSplit && chunk.rule != ignoredSplit) { |
+ if (chunk.rule != null && |
+ chunk.rule.isHardened && |
+ chunk.rule != ignoredSplit) { |
forceSplit = true; |
break; |
} |
@@ -682,7 +684,7 @@ class ChunkBuilder { |
void _writeHardSplit({bool isDouble, bool flushLeft, bool nest: false}) { |
// A hard split overrides any other whitespace. |
_pendingWhitespace = null; |
- _writeSplit(new HardSplitRule(), |
+ _writeSplit(new Rule.hard(), |
flushLeft: flushLeft, isDouble: isDouble, nest: nest); |
} |
@@ -711,11 +713,11 @@ class ChunkBuilder { |
Chunk _afterSplit() { |
var chunk = _chunks.last; |
- if (chunk.rule is! HardSplitRule) { |
+ if (_rules.isNotEmpty) { |
_ruleChunks.putIfAbsent(rule, () => []).add(_chunks.length - 1); |
} |
- if (chunk.isHardSplit) _handleHardSplit(); |
+ if (chunk.rule.isHardened) _handleHardSplit(); |
return chunk; |
} |
@@ -733,8 +735,11 @@ class ChunkBuilder { |
/// Returns true if we can divide the chunks at [index] and line split the |
/// ones before and after that separately. |
bool _canDivideAt(int i) { |
+ // Don't divide after the last chunk. |
+ if (i == _chunks.length - 1) return false; |
+ |
var chunk = _chunks[i]; |
- if (!chunk.isHardSplit) return false; |
+ if (!chunk.rule.isHardened) return false; |
if (chunk.nesting.isNested) return false; |
if (chunk.isBlock) return false; |
@@ -782,18 +787,16 @@ class ChunkBuilder { |
void _hardenRules() { |
if (_hardSplitRules.isEmpty) return; |
- // Harden all of the rules that are constrained by [rules] as well. |
- var hardenedRules = new Set(); |
walkConstraints(rule) { |
- if (hardenedRules.contains(rule)) return; |
- hardenedRules.add(rule); |
+ rule.harden(); |
// Follow this rule's constraints, recursively. |
for (var other in _ruleChunks.keys) { |
if (other == rule) continue; |
- if (rule.constrain(rule.fullySplitValue, other) == |
- other.fullySplitValue) { |
+ if (!other.isHardened && |
+ rule.constrain(rule.fullySplitValue, other) == |
+ other.fullySplitValue) { |
walkConstraints(other); |
} |
} |
@@ -803,10 +806,11 @@ class ChunkBuilder { |
walkConstraints(rule); |
} |
- // Harden every chunk that uses one of these rules. |
+ // Discard spans in hardened chunks since we know for certain they will |
+ // split anyway. |
for (var chunk in _chunks) { |
- if (hardenedRules.contains(chunk.rule)) { |
- chunk.harden(); |
+ if (chunk.rule != null && chunk.rule.isHardened) { |
+ chunk.spans.clear(); |
} |
} |
} |